prjct-cli 1.47.0 → 1.47.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/bin/prjct-core.mjs +102 -102
- package/dist/cli/jira.mjs +7 -7
- package/dist/cli/linear.mjs +8 -8
- package/dist/daemon/entry.mjs +356 -356
- package/package.json +1 -1
package/dist/daemon/entry.mjs
CHANGED
|
@@ -5,11 +5,11 @@ import { dirname as __pathDirname } from 'path';
|
|
|
5
5
|
var require = __createRequire(import.meta.url);
|
|
6
6
|
var __filename = __fileURLToPath(import.meta.url);
|
|
7
7
|
var __dirname = __pathDirname(__filename);
|
|
8
|
-
var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Object.getOwnPropertyNames;var Nh=Object.prototype.hasOwnProperty;var l=(
|
|
9
|
-
`,"utf-8")}async function ty(
|
|
10
|
-
`)}async function ly(
|
|
11
|
-
`);await Ht(s,t)}function uy(s){return us.extname(s)}function dy(s){return us.basename(s,us.extname(s))}var We=b(()=>{"use strict";Au();U();l(Ut,"readJson");l(An,"writeJson");l(et,"readFile");l(Ht,"writeFile");l(Zh,"atomicWrite");l(ey,"appendToFile");l(Wi,"appendLine");l(ty,"prependToFile");l(D,"fileExists");l(Xr,"dirExists");l(jt,"ensureDir");l(ny,"deleteFile");l(sy,"deleteDir");l(Xt,"listFiles");l(ry,"getFileSize");l(oy,"getFileModifiedTime");l(iy,"copyFile");l(ay,"moveFile");l(cy,"readLines");l(ly,"writeLines");l(uy,"getFileExtension");l(dy,"getFileNameWithoutExtension")});import{z as Gt}from"zod";function Ru(s,e){let t=s.split(".").map(Number),n=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=n[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var kE,SE,bE,ds,vE,Yr=b(()=>{"use strict";kE=Gt.enum(["opus","sonnet","haiku"]),SE=Gt.enum(["2.5-pro","2.5-flash","2.0-flash"]),bE=Gt.string().min(1),ds=Gt.object({provider:Gt.string(),model:Gt.string(),cliVersion:Gt.string().optional(),recordedAt:Gt.string()}),vE=Gt.object({preferredModel:Gt.string().optional(),lastAnalysisModel:ds.optional()});l(Ru,"compareSemver")});import Bi from"node:fs/promises";import py from"node:os";import Du from"node:path";async function $u(){try{let s=await Bi.readFile(Iu,"utf-8"),e=JSON.parse(s);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Date.now()-new Date(e.timestamp).getTime()>my?null:e.detection}catch{return null}}async function Mu(s){let e={timestamp:new Date().toISOString(),detection:s};await Bi.mkdir(ju,{recursive:!0}),await Bi.writeFile(Iu,JSON.stringify(e,null,2))}var ju,Iu,my,Ou=b(()=>{"use strict";ju=Du.join(py.homedir(),".prjct-cli","cache"),Iu=Du.join(ju,"providers.json"),my=600*1e3;l($u,"readProviderCache");l(Mu,"writeProviderCache")});var ct={};un(ct,{AntigravityProvider:()=>Ji,ClaudeProvider:()=>Qr,CodexProvider:()=>qi,CursorProvider:()=>Fu,GeminiProvider:()=>zi,Providers:()=>at,WindsurfProvider:()=>Lu,detectAllProviders:()=>nr,detectAntigravity:()=>to,detectCodex:()=>Rn,detectCursorProject:()=>Gu,detectProvider:()=>Zr,detectWindsurfProject:()=>Vu,getActiveProvider:()=>ky,getCapabilities:()=>yy,getCommandsDir:()=>Ey,getGlobalContextPath:()=>Ty,getGlobalSettingsPath:()=>Py,getProjectCommandsPath:()=>xy,getProviderBranding:()=>eo,getSkillsPath:()=>Cy,hasProviderConfig:()=>Sy,needsCursorRouterRegeneration:()=>by,needsWindsurfRouterRegeneration:()=>vy,selectProvider:()=>Ki,validateCliVersion:()=>Hu});import{exec as gy}from"node:child_process";import pn from"node:os";import Ge from"node:path";import{promisify as fy}from"node:util";function yy(s,e){return{...hy[s],...e}}async function Uu(s){try{let{stdout:e}=await _u(`which ${s}`,{timeout:Nu});return e.trim()}catch{return null}}async function wy(s){try{let{stdout:e}=await _u(`${s} --version`,{timeout:Nu}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Zr(s){let e=at[s];if(!e.cliCommand)return{installed:!1};let t=await Uu(e.cliCommand);if(!t)return{installed:!1};let n=await wy(e.cliCommand),r=Hu(s,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:r||void 0}}function Hu(s,e){let t=at[s];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 nr(s=!1){if(!s){let i=await $u();if(i)return i}let[e,t,n]=await Promise.all([Zr("claude"),Zr("gemini"),Rn()]),r={installed:n.installed},o={claude:e,gemini:t,codex:r};return await Mu(o).catch(()=>{}),o}async function ky(s){if(s&&at[s])return at[s];let e=await nr();return e.claude.installed&&!e.gemini.installed?Qr:e.gemini.installed&&!e.claude.installed?zi:Qr}async function Sy(s){let e=at[s];return e.configDir?D(e.configDir):!1}function eo(s){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"}[s]||"\u26A1 prjct"}}async function Gu(s){let e=Ge.join(s,".cursor"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.mdc"),[r,o]=await Promise.all([D(e),D(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function by(s){let e=await Gu(s);return e.detected&&!e.routerInstalled}async function Vu(s){let e=Ge.join(s,".windsurf"),t=Ge.join(e,"rules"),n=Ge.join(t,"prjct.md"),[r,o]=await Promise.all([D(e),D(n)]);return{detected:r,routerInstalled:o,projectRoot:r?s:void 0}}async function vy(s){let e=await Vu(s);return e.detected&&!e.routerInstalled}async function to(){let s=Ji.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=Ge.join(s,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([D(s),D(e)]);return{installed:t,skillInstalled:n,configPath:t?s:void 0}}async function Rn(){let s=qi.configDir;if(!s)return{installed:!1,skillInstalled:!1};let e=await Uu("codex"),t=Ge.join(s,"skills","prjct","SKILL.md"),n=await D(t),r=!!e;return{installed:r,skillInstalled:n,configPath:r?s:void 0}}function Ty(s){let e=at[s];return e.configDir?Ge.join(e.configDir,e.contextFile):null}function Py(s){let e=at[s];return!e.configDir||!e.settingsFile?null:Ge.join(e.configDir,e.settingsFile)}function Cy(s){return at[s].skillsDir}function Ey(s){return at[s].commandsDir}function xy(s,e){let t=at[s];return Ge.join(e,t.commandsDir)}async function Ki(){let s=await nr(),e=s.claude.installed,t=s.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:s}:e&&!t?{provider:"claude",userSelected:!1,detection:s}:t&&!e?{provider:"gemini",userSelected:!1,detection:s}:{provider:"claude",userSelected:!0,detection:s}}var _u,Nu,hy,Qr,zi,Ji,Fu,Lu,qi,at,Be=b(()=>{"use strict";Yr();We();Ou();_u=fy(gy),Nu=2e3,hy={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(yy,"getCapabilities");Qr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ge.join(pn.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ge.join(pn.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"},zi={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ge.join(pn.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ge.join(pn.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},Ji={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ge.join(pn.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ge.join(pn.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"},Fu={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"},Lu={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"},qi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ge.join(pn.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ge.join(pn.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"},at={claude:Qr,gemini:zi,cursor:Fu,antigravity:Ji,windsurf:Lu,codex:qi};l(Uu,"whichCommand");l(wy,"getCliVersion");l(Zr,"detectProvider");l(Hu,"validateCliVersion");l(nr,"detectAllProviders");l(ky,"getActiveProvider");l(Sy,"hasProviderConfig");l(eo,"getProviderBranding");l(Gu,"detectCursorProject");l(by,"needsCursorRouterRegeneration");l(Vu,"detectWindsurfProject");l(vy,"needsWindsurfRouterRegeneration");l(to,"detectAntigravity");l(Rn,"detectCodex");l(Ty,"getGlobalContextPath");l(Py,"getGlobalSettingsPath");l(Cy,"getSkillsPath");l(Ey,"getCommandsDir");l(xy,"getProjectCommandsPath");l(Ki,"selectProvider")});import Ay from"node:crypto";import Vt from"node:fs/promises";import Xi from"node:os";import V from"node:path";import{globSync as Ry}from"glob";var Yi,Dy,A,Se=b(()=>{"use strict";fe();We();Yi=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(Xi.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 Ay.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 Xr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await D(t)}async ensureGlobalStructure(){await jt(this.globalBaseDir),await jt(this.globalProjectsDir),await jt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let r of n)await jt(V.join(t,r));return await jt(V.join(t,"planning","tasks")),await jt(V.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:r,day:o}=Vi(t);return V.join(this.getGlobalProjectPath(e),"sessions",n,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await jt(n),n}async listSessions(e,t=null,n=null){let r=V.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Vt.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=V.join(r,a.name),u=await Vt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=V.join(c,d.name),p=await Vt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path: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,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return V.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Vt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await Xr(t)}getDisplayPath(e){let t=Xi.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(Be(),lt(ct)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),lt(ct)).getActiveProvider();return(Be(),lt(ct)).getGlobalSettingsPath(e.name)}getClaudeDir(){return V.join(Xi.homedir(),".claude")}getClaudeSettingsPath(){return V.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?V.join(this.getGlobalProjectPath(e),"agents"):V.join(this.globalBaseDir,"agents")}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:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let r of n){let o=V.join(e,r.file);if(await D(o)){t.isMonorepo=!0,t.type=r.type;break}}if(!t.isMonorepo){let r=V.join(e,"package.json");if(await D(r))try{let o=await Vt.readFile(r,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],r=[];try{if(t==="pnpm"){let i=(await Vt.readFile(V.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(r=i[1].split(`
|
|
12
|
-
`).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 Vt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?r=a.workspaces:a.workspaces?.packages&&(r=a.workspaces.packages),t==="lerna"){let c=V.join(e,"lerna.json");if(await
|
|
8
|
+
var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Object.getOwnPropertyNames;var Nh=Object.prototype.hasOwnProperty;var l=(n,e)=>Kr(n,"name",{value:e,configurable:!0}),vt=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var b=(n,e)=>()=>(n&&(e=n(n=0)),e);var ls=(n,e)=>{for(var t in e)Kr(n,t,{get:e[t],enumerable:!0})},Fh=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of _h(e))!Nh.call(n,r)&&r!==t&&Kr(n,r,{get:()=>e[r],enumerable:!(s=Oh(e,r))||s.enumerable});return n};var lt=n=>Fh(Kr({},"__esModule",{value:!0}),n);var J={};ls(J,{calculateDuration:()=>zh,formatDate:()=>ln,formatDuration:()=>Kt,formatMonth:()=>Uh,getDateKey:()=>Hh,getDateRange:()=>Wh,getDaysAgo:()=>us,getDaysFromNow:()=>Vh,getEndOfDay:()=>Kh,getStartOfDay:()=>qh,getTimestamp:()=>v,getTodayKey:()=>Tu,getYearMonthDay:()=>Vi,isToday:()=>Bh,isWithinLastDays:()=>Jh,parseDate:()=>Gh,toRelative:()=>Xh});import{formatDistanceToNowStrict as Lh}from"date-fns";function ln(n){let e=n.getFullYear(),t=(n.getMonth()+1).toString().padStart(2,"0"),s=n.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function Uh(n){let e=n.getFullYear(),t=(n.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Tu(){return ln(new Date)}function Hh(n){return ln(n)}function Vi(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}function Gh(n){return new Date(n)}function v(){return new Date().toISOString()}function us(n){let e=new Date;return e.setDate(e.getDate()-n),e}function Vh(n){let e=new Date;return e.setDate(e.getDate()+n),e}function Wh(n,e){let t=[],s=new Date(n);for(;s<=e;)t.push(new Date(s)),s=new Date(s.getFullYear(),s.getMonth(),s.getDate()+1);return t}function Bh(n){return ln(n)===Tu()}function Jh(n,e){let t=us(e);return n>=t}function Kt(n){let e=Math.floor(n/1e3),t=Math.floor(e/60),s=Math.floor(t/60),r=Math.floor(s/24);return r>0?`${r}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function zh(n,e=new Date){let t=e.getTime()-n.getTime();return Kt(t)}function qh(n){let e=new Date(n);return e.setHours(0,0,0,0),e}function Kh(n){let e=new Date(n);return e.setHours(23,59,59,999),e}function Xh(n){let e=typeof n=="string"?new Date(n):n;return Lh(e,{addSuffix:!0})}var fe=b(()=>{"use strict";l(ln,"formatDate");l(Uh,"formatMonth");l(Tu,"getTodayKey");l(Hh,"getDateKey");l(Vi,"getYearMonthDay");l(Gh,"parseDate");l(v,"getTimestamp");l(us,"getDaysAgo");l(Vh,"getDaysFromNow");l(Wh,"getDateRange");l(Bh,"isToday");l(Jh,"isWithinLastDays");l(Kt,"formatDuration");l(zh,"calculateDuration");l(qh,"getStartOfDay");l(Kh,"getEndOfDay");l(Xh,"toRelative")});function Yh(n){return n instanceof Error&&"code"in n}function C(n){return Yh(n)&&n.code==="ENOENT"}function y(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var U=b(()=>{"use strict";l(Yh,"isNodeError");l(C,"isNotFoundError");l(y,"getErrorMessage")});import Eu from"node:fs/promises";async function xu(n,e){let t;try{t=await Eu.readFile(n,"utf-8")}catch(o){if(C(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Pu(n,t),Cu(n,"Malformed JSON"),null}let r=e.safeParse(s);return r.success?s:(await Pu(n,t),Cu(n,Qh(r.error)),null)}async function Pu(n,e){let t=`${n}.backup`;try{await Eu.writeFile(t,e,"utf-8")}catch{}}function Cu(n,e){console.error(`[prjct] Warning: Corrupted storage file: ${n}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function Qh(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Au=b(()=>{"use strict";U();l(xu,"safeRead");l(Pu,"createBackup");l(Cu,"logCorruption");l(Qh,"formatZodError")});var Ee={};ls(Ee,{appendLine:()=>Wi,appendToFile:()=>ey,atomicWrite:()=>Zh,copyFile:()=>iy,deleteDir:()=>ny,deleteFile:()=>sy,dirExists:()=>Xr,ensureDir:()=>Dt,fileExists:()=>j,getFileExtension:()=>uy,getFileModifiedTime:()=>oy,getFileNameWithoutExtension:()=>dy,getFileSize:()=>ry,listFiles:()=>Xt,moveFile:()=>ay,prependToFile:()=>ty,readFile:()=>et,readJson:()=>Ut,readLines:()=>cy,writeFile:()=>Ht,writeJson:()=>xs,writeLines:()=>ly});import ke from"node:fs/promises";import un from"node:path";async function Ut(n,e=null,t){if(t)return await xu(n,t)??e;try{let s=await ke.readFile(n,"utf-8");return JSON.parse(s)}catch(s){if(C(s))return e;throw s}}async function xs(n,e,t=2){let s=JSON.stringify(e,null,t);await ke.writeFile(n,s,"utf-8")}async function et(n,e=""){try{return await ke.readFile(n,"utf-8")}catch(t){if(C(t))return e;throw t}}async function Ht(n,e){let t=un.dirname(n);await ke.mkdir(t,{recursive:!0}),await ke.writeFile(n,e,"utf-8")}async function Zh(n,e){let t=un.dirname(n);await ke.mkdir(t,{recursive:!0});let s=`${n}.${Date.now()}.tmp`;await ke.writeFile(s,e,"utf-8"),await ke.rename(s,n)}async function ey(n,e){await ke.appendFile(n,e,"utf-8")}async function Wi(n,e){let t=un.dirname(n);await ke.mkdir(t,{recursive:!0}),await ke.appendFile(n,`${e}
|
|
9
|
+
`,"utf-8")}async function ty(n,e){try{let t=await ke.readFile(n,"utf-8");await ke.writeFile(n,e+t,"utf-8")}catch(t){if(C(t))await ke.writeFile(n,e,"utf-8");else throw t}}async function j(n){try{return await ke.access(n),!0}catch(e){if(C(e))return!1;throw e}}async function Xr(n){try{return(await ke.stat(n)).isDirectory()}catch(e){if(C(e))return!1;throw e}}async function Dt(n){await ke.mkdir(n,{recursive:!0})}async function sy(n){try{return await ke.unlink(n),!0}catch(e){if(C(e))return!1;throw e}}async function ny(n){try{return await ke.rm(n,{recursive:!0,force:!0}),!0}catch(e){if(C(e))return!1;throw e}}async function Xt(n,e={}){try{let s=await ke.readdir(n,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(r=>r.isFile())),e.dirsOnly&&(s=s.filter(r=>r.isDirectory())),e.extension&&(s=s.filter(r=>r.name.endsWith(e.extension))),s.map(r=>r.name)}catch(t){if(C(t))return[];throw t}}async function ry(n){return(await ke.stat(n)).size}async function oy(n){return(await ke.stat(n)).mtime}async function iy(n,e){await ke.copyFile(n,e)}async function ay(n,e){await ke.rename(n,e)}async function cy(n){return(await et(n,"")).split(`
|
|
10
|
+
`)}async function ly(n,e){let t=e.join(`
|
|
11
|
+
`);await Ht(n,t)}function uy(n){return un.extname(n)}function dy(n){return un.basename(n,un.extname(n))}var We=b(()=>{"use strict";Au();U();l(Ut,"readJson");l(xs,"writeJson");l(et,"readFile");l(Ht,"writeFile");l(Zh,"atomicWrite");l(ey,"appendToFile");l(Wi,"appendLine");l(ty,"prependToFile");l(j,"fileExists");l(Xr,"dirExists");l(Dt,"ensureDir");l(sy,"deleteFile");l(ny,"deleteDir");l(Xt,"listFiles");l(ry,"getFileSize");l(oy,"getFileModifiedTime");l(iy,"copyFile");l(ay,"moveFile");l(cy,"readLines");l(ly,"writeLines");l(uy,"getFileExtension");l(dy,"getFileNameWithoutExtension")});import{z as Gt}from"zod";function Ru(n,e){let t=n.split(".").map(Number),s=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=s[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var kE,SE,bE,dn,vE,Yr=b(()=>{"use strict";kE=Gt.enum(["opus","sonnet","haiku"]),SE=Gt.enum(["2.5-pro","2.5-flash","2.0-flash"]),bE=Gt.string().min(1),dn=Gt.object({provider:Gt.string(),model:Gt.string(),cliVersion:Gt.string().optional(),recordedAt:Gt.string()}),vE=Gt.object({preferredModel:Gt.string().optional(),lastAnalysisModel:dn.optional()});l(Ru,"compareSemver")});import Bi from"node:fs/promises";import py from"node:os";import ju from"node:path";async function $u(){try{let n=await Bi.readFile(Iu,"utf-8"),e=JSON.parse(n);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Date.now()-new Date(e.timestamp).getTime()>my?null:e.detection}catch{return null}}async function Mu(n){let e={timestamp:new Date().toISOString(),detection:n};await Bi.mkdir(Du,{recursive:!0}),await Bi.writeFile(Iu,JSON.stringify(e,null,2))}var Du,Iu,my,Ou=b(()=>{"use strict";Du=ju.join(py.homedir(),".prjct-cli","cache"),Iu=ju.join(Du,"providers.json"),my=600*1e3;l($u,"readProviderCache");l(Mu,"writeProviderCache")});var ct={};ls(ct,{AntigravityProvider:()=>zi,ClaudeProvider:()=>Qr,CodexProvider:()=>qi,CursorProvider:()=>Fu,GeminiProvider:()=>Ji,Providers:()=>at,WindsurfProvider:()=>Lu,detectAllProviders:()=>sr,detectAntigravity:()=>to,detectCodex:()=>As,detectCursorProject:()=>Gu,detectProvider:()=>Zr,detectWindsurfProject:()=>Vu,getActiveProvider:()=>ky,getCapabilities:()=>yy,getCommandsDir:()=>Ey,getGlobalContextPath:()=>Ty,getGlobalSettingsPath:()=>Py,getProjectCommandsPath:()=>xy,getProviderBranding:()=>eo,getSkillsPath:()=>Cy,hasProviderConfig:()=>Sy,needsCursorRouterRegeneration:()=>by,needsWindsurfRouterRegeneration:()=>vy,selectProvider:()=>Ki,validateCliVersion:()=>Hu});import{exec as gy}from"node:child_process";import ds from"node:os";import Ge from"node:path";import{promisify as fy}from"node:util";function yy(n,e){return{...hy[n],...e}}async function Uu(n){try{let{stdout:e}=await _u(`which ${n}`,{timeout:Nu});return e.trim()}catch{return null}}async function wy(n){try{let{stdout:e}=await _u(`${n} --version`,{timeout:Nu}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Zr(n){let e=at[n];if(!e.cliCommand)return{installed:!1};let t=await Uu(e.cliCommand);if(!t)return{installed:!1};let s=await wy(e.cliCommand),r=Hu(n,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:r||void 0}}function Hu(n,e){let t=at[n];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 sr(n=!1){if(!n){let i=await $u();if(i)return i}let[e,t,s]=await Promise.all([Zr("claude"),Zr("gemini"),As()]),r={installed:s.installed},o={claude:e,gemini:t,codex:r};return await Mu(o).catch(()=>{}),o}async function ky(n){if(n&&at[n])return at[n];let e=await sr();return e.claude.installed&&!e.gemini.installed?Qr:e.gemini.installed&&!e.claude.installed?Ji:Qr}async function Sy(n){let e=at[n];return e.configDir?j(e.configDir):!1}function eo(n){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"}[n]||"\u26A1 prjct"}}async function Gu(n){let e=Ge.join(n,".cursor"),t=Ge.join(e,"rules"),s=Ge.join(t,"prjct.mdc"),[r,o]=await Promise.all([j(e),j(s)]);return{detected:r,routerInstalled:o,projectRoot:r?n:void 0}}async function by(n){let e=await Gu(n);return e.detected&&!e.routerInstalled}async function Vu(n){let e=Ge.join(n,".windsurf"),t=Ge.join(e,"rules"),s=Ge.join(t,"prjct.md"),[r,o]=await Promise.all([j(e),j(s)]);return{detected:r,routerInstalled:o,projectRoot:r?n:void 0}}async function vy(n){let e=await Vu(n);return e.detected&&!e.routerInstalled}async function to(){let n=zi.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=Ge.join(n,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([j(n),j(e)]);return{installed:t,skillInstalled:s,configPath:t?n:void 0}}async function As(){let n=qi.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=await Uu("codex"),t=Ge.join(n,"skills","prjct","SKILL.md"),s=await j(t),r=!!e;return{installed:r,skillInstalled:s,configPath:r?n:void 0}}function Ty(n){let e=at[n];return e.configDir?Ge.join(e.configDir,e.contextFile):null}function Py(n){let e=at[n];return!e.configDir||!e.settingsFile?null:Ge.join(e.configDir,e.settingsFile)}function Cy(n){return at[n].skillsDir}function Ey(n){return at[n].commandsDir}function xy(n,e){let t=at[n];return Ge.join(e,t.commandsDir)}async function Ki(){let n=await sr(),e=n.claude.installed,t=n.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:n}:e&&!t?{provider:"claude",userSelected:!1,detection:n}:t&&!e?{provider:"gemini",userSelected:!1,detection:n}:{provider:"claude",userSelected:!0,detection:n}}var _u,Nu,hy,Qr,Ji,zi,Fu,Lu,qi,at,Be=b(()=>{"use strict";Yr();We();Ou();_u=fy(gy),Nu=2e3,hy={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(yy,"getCapabilities");Qr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ge.join(ds.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ge.join(ds.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"},Ji={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ge.join(ds.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ge.join(ds.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"},zi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ge.join(ds.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ge.join(ds.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"},Fu={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"},Lu={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"},qi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ge.join(ds.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ge.join(ds.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"},at={claude:Qr,gemini:Ji,cursor:Fu,antigravity:zi,windsurf:Lu,codex:qi};l(Uu,"whichCommand");l(wy,"getCliVersion");l(Zr,"detectProvider");l(Hu,"validateCliVersion");l(sr,"detectAllProviders");l(ky,"getActiveProvider");l(Sy,"hasProviderConfig");l(eo,"getProviderBranding");l(Gu,"detectCursorProject");l(by,"needsCursorRouterRegeneration");l(Vu,"detectWindsurfProject");l(vy,"needsWindsurfRouterRegeneration");l(to,"detectAntigravity");l(As,"detectCodex");l(Ty,"getGlobalContextPath");l(Py,"getGlobalSettingsPath");l(Cy,"getSkillsPath");l(Ey,"getCommandsDir");l(xy,"getProjectCommandsPath");l(Ki,"selectProvider")});import Ay from"node:crypto";import Vt from"node:fs/promises";import Xi from"node:os";import V from"node:path";import{globSync as Ry}from"glob";var Yi,jy,A,Se=b(()=>{"use strict";fe();We();Yi=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(Xi.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 Ay.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 Xr(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await j(t)}async ensureGlobalStructure(){await Dt(this.globalBaseDir),await Dt(this.globalProjectsDir),await Dt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory","agents"];for(let r of s)await Dt(V.join(t,r));return await Dt(V.join(t,"planning","tasks")),await Dt(V.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:r,day:o}=Vi(t);return V.join(this.getGlobalProjectPath(e),"sessions",s,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await Dt(s),s}async listSessions(e,t=null,s=null){let r=V.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Vt.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=V.join(r,a.name),u=await Vt.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 Vt.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 Vt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await Xr(t)}getDisplayPath(e){let t=Xi.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(Be(),lt(ct)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),lt(ct)).getActiveProvider();return(Be(),lt(ct)).getGlobalSettingsPath(e.name)}getClaudeDir(){return V.join(Xi.homedir(),".claude")}getClaudeSettingsPath(){return V.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?V.join(this.getGlobalProjectPath(e),"agents"):V.join(this.globalBaseDir,"agents")}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 r of s){let o=V.join(e,r.file);if(await j(o)){t.isMonorepo=!0,t.type=r.type;break}}if(!t.isMonorepo){let r=V.join(e,"package.json");if(await j(r))try{let o=await Vt.readFile(r,"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=[],r=[];try{if(t==="pnpm"){let i=(await Vt.readFile(V.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(r=i[1].split(`
|
|
12
|
+
`).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 Vt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?r=a.workspaces:a.workspaces?.packages&&(r=a.workspaces.packages),t==="lerna"){let c=V.join(e,"lerna.json");if(await j(c)){let u=await Vt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(r=d.packages)}}}else if(t==="nx")r=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=V.join(e,"package.json"),i=await Vt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(r=a.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let o of r){if(o.startsWith("!"))continue;let i=Ry(o,{cwd:e,absolute:!1});for(let a of i){let c=V.join(e,a),u=V.join(c,"package.json");if(await j(u))try{let d=await Vt.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 j(p)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=V.resolve(e);for(let r of t.packages){let o=V.resolve(r.path);if(s.startsWith(o))return r}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}},jy=new Yi,A=jy});function Wu(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Qi(){if(Wu()==="bun")return!0;try{let{execSync:n}=vt("node:child_process");return n("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function Rs(){return Wu()==="bun"}var nr=b(()=>{"use strict";l(Wu,"detectRuntime");l(Qi,"isBunAvailable");l(Rs,"isBun")});import Zi from"node:fs";import Bu from"node:path";function Dy(n){if(Rs()){let{Database:r}=vt("bun:sqlite");return new r(n,{create:!0})}let e=vt("better-sqlite3"),t=new e(n),s=t.exec.bind(t);return t.run=r=>s(r),t}var Iy,$y,ea,x,N,ne=b(()=>{"use strict";Se();nr();l(Dy,"openDatabase");Iy=[{version:1,name:"initial-schema",up:l(n=>{n.run(`
|
|
13
13
|
-- =======================================================================
|
|
14
14
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
15
15
|
-- =======================================================================
|
|
@@ -223,7 +223,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
|
|
|
223
223
|
started_at TEXT,
|
|
224
224
|
ended_at TEXT
|
|
225
225
|
);
|
|
226
|
-
`)},"up")},{version:2,name:"archives-table",up:l(
|
|
226
|
+
`)},"up")},{version:2,name:"archives-table",up:l(n=>{n.run(`
|
|
227
227
|
-- =======================================================================
|
|
228
228
|
-- Archives: Stale data moved out of active storage (PRJ-267)
|
|
229
229
|
-- =======================================================================
|
|
@@ -240,7 +240,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
|
|
|
240
240
|
CREATE INDEX idx_archives_entity_type ON archives(entity_type);
|
|
241
241
|
CREATE INDEX idx_archives_archived_at ON archives(archived_at);
|
|
242
242
|
CREATE INDEX idx_archives_entity_id ON archives(entity_id);
|
|
243
|
-
`)},"up")},{version:3,name:"workflow-rules-table",up:l(
|
|
243
|
+
`)},"up")},{version:3,name:"workflow-rules-table",up:l(n=>{n.run(`
|
|
244
244
|
-- =======================================================================
|
|
245
245
|
-- Workflow Rules: hooks, gates, and custom steps (Phase 2)
|
|
246
246
|
-- =======================================================================
|
|
@@ -258,7 +258,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
|
|
|
258
258
|
);
|
|
259
259
|
|
|
260
260
|
CREATE INDEX idx_workflow_rules_command ON workflow_rules(command);
|
|
261
|
-
`)},"up")},{version:4,name:"custom-workflows-table",up:l(
|
|
261
|
+
`)},"up")},{version:4,name:"custom-workflows-table",up:l(n=>{n.run(`
|
|
262
262
|
-- =======================================================================
|
|
263
263
|
-- Custom Workflows: User-defined workflows with agentic auto-config
|
|
264
264
|
-- =======================================================================
|
|
@@ -283,7 +283,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
|
|
|
283
283
|
('done', 'Complete current task/subtask', 1, 1, datetime('now'), datetime('now')),
|
|
284
284
|
('ship', 'Ship feature with version bump and PR', 1, 1, datetime('now'), datetime('now')),
|
|
285
285
|
('sync', 'Analyze project and regenerate context', 1, 1, datetime('now'), datetime('now'));
|
|
286
|
-
`)},"up")},{version:5,name:"llm-analysis-table",up:l(
|
|
286
|
+
`)},"up")},{version:5,name:"llm-analysis-table",up:l(n=>{n.run(`
|
|
287
287
|
-- =======================================================================
|
|
288
288
|
-- LLM Analysis: Structured findings from hybrid sync pipeline
|
|
289
289
|
-- Pipeline: CLI (collect) \u2192 LLM (analyze) \u2192 CLI (store)
|
|
@@ -299,7 +299,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
|
|
|
299
299
|
|
|
300
300
|
CREATE INDEX idx_llm_analysis_status ON llm_analysis(status);
|
|
301
301
|
CREATE INDEX idx_llm_analysis_commit ON llm_analysis(commit_hash);
|
|
302
|
-
`)},"up")},{version:6,name:"context-feedback-table",up:l(
|
|
302
|
+
`)},"up")},{version:6,name:"context-feedback-table",up:l(n=>{n.run(`
|
|
303
303
|
-- =======================================================================
|
|
304
304
|
-- Context Feedback: RL loop for file suggestion improvement
|
|
305
305
|
-- Records suggested vs actual files per task for scoring boosts
|
|
@@ -317,7 +317,7 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
|
|
|
317
317
|
);
|
|
318
318
|
|
|
319
319
|
CREATE INDEX idx_cf_task ON context_feedback(task_id);
|
|
320
|
-
`)},"up")},{version:7,name:"sessions-table",up:l(
|
|
320
|
+
`)},"up")},{version:7,name:"sessions-table",up:l(n=>{n.run(`
|
|
321
321
|
-- =======================================================================
|
|
322
322
|
-- Sessions: Task lifecycle tracking (replaces current.json + archive/)
|
|
323
323
|
-- =======================================================================
|
|
@@ -337,20 +337,20 @@ var Kr=Object.defineProperty;var Oh=Object.getOwnPropertyDescriptor;var _h=Objec
|
|
|
337
337
|
CREATE INDEX idx_sessions_project ON sessions(project_id);
|
|
338
338
|
CREATE INDEX idx_sessions_status ON sessions(status);
|
|
339
339
|
CREATE INDEX idx_sessions_completed ON sessions(completed_at);
|
|
340
|
-
`)},"up")}],$y=3,ea=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>=$y&&this.evictLru();let
|
|
340
|
+
`)},"up")}],$y=3,ea=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>=$y&&this.evictLru();let s=this.getDbPath(e),r=Bu.dirname(s);Zi.existsSync(r)||Zi.mkdirSync(r,{recursive:!0});let o=Dy(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 Zi.existsSync(this.getDbPath(e))}getDoc(e,t){let r=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,s){let r=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();r.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,r){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let r=this.getDb(e);return t?r.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):r.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(`
|
|
341
341
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
342
342
|
version INTEGER PRIMARY KEY,
|
|
343
343
|
name TEXT NOT NULL,
|
|
344
344
|
applied_at TEXT NOT NULL
|
|
345
345
|
)
|
|
346
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Iy)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},x=new ea,N=x});function no(s,e=!1){return e||s>=6?"high":s>=3?"medium":"low"}var M,zu,rr=b(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},zu=["frontend","backend","devops","docs","testing","database","general"];l(no,"calculateConfidence")});function na(s){if(zu.includes(s))return[s];let e=s.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,r]of Object.entries(so))if(n!=="general"){for(let o of r)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var ta,so,jn,or,ir,ar=b(()=>{"use strict";se();rr();fe();ta={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},so={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(na,"resolveCanonicalDomains");jn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=N.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),r=t(n);return this._data=r,await this.save(e),r}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},or=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},ir=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:v(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>JSON.parse(r.data))}}});var cr,sa=b(()=>{"use strict";se();rr();fe();ar();cr=class s extends jn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>s.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-s.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,n,r="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[r].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,r&&!c.contexts.includes(r)&&(c.contexts.push(r),c.contexts.length>s.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-s.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=no(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let r=(await this.load(e)).decisions[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let r=(await this.load(e)).decisions[t];return!r||r.confidence==="low"?null:{value:r.value,confidence:r.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let r=await this.load(e),o=v();if(!r.workflows[t])r.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=r.workflows[t];i.count++,i.lastSeen=o,i.confidence=no(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let r=(await this.load(e)).workflows[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let r=(await this.load(e)).workflows[t];return!r||r.count<3?null:r}async setPreference(e,t,n,r={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=r.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:v(),confidence:no(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let r=(await this.load(e)).preferences[t];return r?(r.userConfirmed=!0,r.confidence="high",r.updatedAt=v(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),r=s.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();n-u>r&&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 My from"node:crypto";import{homedir as Oy}from"node:os";import{join as _y}from"node:path";function he(){return My.randomUUID()}var fx,Tt=b(()=>{"use strict";l(he,"generateUUID");fx=_y(Oy(),".prjct-cli","projects")});var In,ra=b(()=>{"use strict";Tt();rr();fe();ar();In=class extends jn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:r=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(r),c=v(),u={id:he(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let r=await this.load(e),o=r.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=r.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)r.index[u]=r.index[u].filter(d=>d!==t);for(let u of c)r.index[u].push(t);i.tags=c}return i.updatedAt=v(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),r=n.memories.findIndex(i=>i.id===t);if(r===-1)return!1;let o=n.memories[r];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(r,1),await this.save(e),!0}async findByTags(e,t,n=!1){let r=await this.load(e),o=this._coerceTags(t);if(n)return r.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=r.index[a];for(let u of c)i.add(u)}return r.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),r=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(r)||o.content.toLowerCase().includes(r))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),r=n.memories.length;if(r===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let C=this._getCommandTags(t.commandName),T=(p.tags||[]).filter(O=>C.includes(O));g.tagMatch=Math.min(20,T.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let C=this._extractKeywordsFromText(t.taskDescription),T=0;for(let O of C)p.content.toLowerCase().includes(O)&&(T+=2),p.title.toLowerCase().includes(O)&&(T+=3);g.keywords=Math.min(15,T)}p.userTriggered&&(g.userTriggered=5);let w=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:w,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:r,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:r>0?d.length/r:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let r=new Set;for(let a of n){let c=ta[a];if(c)for(let u of c)r.add(u)}let o=new Set;for(let a of n){let c=so[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(r.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return na(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(r=>r.length>2&&!n.has(r))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(r=>r.length>2&&!n.includes(r))}async autoRemember(e,t,n,r=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${r?`
|
|
347
|
-
Context: ${r}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),
|
|
348
|
-
`).filter(Boolean).forEach(
|
|
349
|
-
`).filter(Boolean)}catch{return[]}}},Uy=new ia,
|
|
350
|
-
`).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:r.trim()}}async function Xu(
|
|
351
|
-
`)}async function Qy(){try{let
|
|
352
|
-
|
|
353
|
-
${i}`;return await ce.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r}}}else return await ce.writeFile(r,i,"utf-8"),{success:!0,action:"created",path:r}}catch(r){return{success:!1,error:y(r),action:"failed"}}}function Yu(){let
|
|
346
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Iy)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}},x=new ea,N=x});function so(n,e=!1){return e||n>=6?"high":n>=3?"medium":"low"}var M,Ju,rr=b(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Ju=["frontend","backend","devops","docs","testing","database","general"];l(so,"calculateConfidence")});function sa(n){if(Ju.includes(n))return[n];let e=n.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[s,r]of Object.entries(no))if(s!=="general"){for(let o of r)if(e.includes(o)||o.includes(e)){t.push(s);break}}return t.length>0?t:["general"]}var ta,no,js,or,ir,ar=b(()=>{"use strict";ne();rr();fe();ta={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},no={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(sa,"resolveCanonicalDomains");js=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),r=t(s);return this._data=r,await this.save(e),r}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},or=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},ir=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:v(),...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(r=>JSON.parse(r.data))}}});var cr,na=b(()=>{"use strict";ne();rr();fe();ar();cr=class n extends js{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>n.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-n.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,r="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[r].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,r&&!c.contexts.includes(r)&&(c.contexts.push(r),c.contexts.length>n.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-n.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 r=(await this.load(e)).decisions[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let r=(await this.load(e)).decisions[t];return!r||r.confidence==="low"?null:{value:r.value,confidence:r.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let r=await this.load(e),o=v();if(!r.workflows[t])r.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=r.workflows[t];i.count++,i.lastSeen=o,i.confidence=so(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let r=(await this.load(e)).workflows[t];return r?(r.userConfirmed=!0,r.confidence="high",r.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let r=(await this.load(e)).workflows[t];return!r||r.count<3?null:r}async setPreference(e,t,s,r={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=r.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:v(),confidence:so(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let r=(await this.load(e)).preferences[t];return r?(r.userConfirmed=!0,r.confidence="high",r.updatedAt=v(),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(),r=n.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>r&&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 My from"node:crypto";import{homedir as Oy}from"node:os";import{join as _y}from"node:path";function he(){return My.randomUUID()}var fx,Tt=b(()=>{"use strict";l(he,"generateUUID");fx=_y(Oy(),".prjct-cli","projects")});var Ds,ra=b(()=>{"use strict";Tt();rr();fe();ar();Ds=class extends js{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let s of e)t[s]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let s of t)e.index[s]||(e.index[s]=[])}_coerceTags(e){let t=new Set(Object.values(M));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:r=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(r),c=v(),u={id:he(),title:t,content:s,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,s){let r=await this.load(e),o=r.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=r.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)r.index[u]=r.index[u].filter(d=>d!==t);for(let u of c)r.index[u].push(t);i.tags=c}return i.updatedAt=v(),await this.save(e),!0}async deleteMemory(e,t){let s=await this.load(e),r=s.memories.findIndex(i=>i.id===t);if(r===-1)return!1;let o=s.memories[r];for(let i of o.tags||[])s.index[i]&&(s.index[i]=s.index[i].filter(a=>a!==t));return s.memories.splice(r,1),await this.save(e),!0}async findByTags(e,t,s=!1){let r=await this.load(e),o=this._coerceTags(t);if(s)return r.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=r.index[a];for(let u of c)i.add(u)}return r.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let s=await this.load(e),r=t.toLowerCase();return s.memories.filter(o=>o.title.toLowerCase().includes(r)||o.content.toLowerCase().includes(r))}async getRelevantMemories(e,t,s=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,s).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let s=await this.load(e),r=s.memories.length;if(r===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(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let E=this._getCommandTags(t.commandName),T=(p.tags||[]).filter(O=>E.includes(O));g.tagMatch=Math.min(20,T.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let E=this._extractKeywordsFromText(t.taskDescription),T=0;for(let O of E)p.content.toLowerCase().includes(O)&&(T+=2),p.title.toLowerCase().includes(O)&&(T+=3);g.keywords=Math.min(15,T)}p.userTriggered&&(g.userTriggered=5);let w=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:w,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:r,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:r>0?d.length/r:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let s=this._resolveCanonicalDomains(e);if(s.length===0)return 0;let r=new Set;for(let a of s){let c=ta[a];if(c)for(let u of c)r.add(u)}let o=new Set;for(let a of s){let c=no[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(r.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return sa(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),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(r=>r.length>2&&!s.has(r))}_extractContextTags(e){let t=[],s={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&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(r=>r.length>2&&!s.includes(r))}async autoRemember(e,t,s,r=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${s}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${r?`
|
|
347
|
+
Context: ${r}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),s={};for(let[r,o]of Object.entries(t.index))s[r]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(r=>r.userTriggered).length,tagCounts:s,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var oa,Ny,tt,lr=b(()=>{"use strict";ar();na();ra();ar();na();ra();oa=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Ds,this._patternStore=new cr,this._historyStore=new ir,this._sessionStore=new or}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,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,r){return this._semanticMemories.autoRemember(e,t,s,r)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,s,r){return this._patternStore.recordDecision(e,t,s,r)}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,r){return this._patternStore.setPreference(e,t,s,r)}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)}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 r=await this.getDecision(e,t);return r?r.value:null}async learnDecision(e,t,s,r=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,r),await this.appendHistory(e,{type:"decision",key:t,value:s,context:r})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Ny=new oa,tt=Ny});import{exec as Fy}from"node:child_process";import gt from"node:fs/promises";import It from"node:path";import{promisify as Ly}from"node:util";var Is,ia,Uy,Je,zu=b(()=>{"use strict";U();Is=Ly(Fy),ia=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=It.join(this.projectPath,"package.json"),t=await gt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=It.join(this.projectPath,"Cargo.toml");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readRequirements(){try{let e=It.join(this.projectPath,"requirements.txt");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGoMod(){try{let e=It.join(this.projectPath,"go.mod");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readGemfile(){try{let e=It.join(this.projectPath,"Gemfile");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readMixExs(){try{let e=It.join(this.projectPath,"mix.exs");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readPomXml(){try{let e=It.join(this.projectPath,"pom.xml");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async readComposerJson(){try{let e=It.join(this.projectPath,"composer.json"),t=await gt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=It.join(this.projectPath,"pyproject.toml");return await gt.readFile(e,"utf-8")}catch(e){if(C(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Is('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(`
|
|
348
|
+
`).filter(Boolean).forEach(s=>{let r=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);r&&(t[r[2]]=parseInt(r[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await gt.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(r=>r.test(s)))}catch(e){if(C(e))return[];throw e}}async listDirectories(){try{return(await gt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(C(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Is(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Is("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Is('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await Is('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 Is('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await gt.access(It.join(this.projectPath,e)),!0}catch(t){if(C(t))return!1;throw t}}async readFile(e){try{let t=It.join(this.projectPath,e);return await gt.readFile(t,"utf-8")}catch(t){if(C(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Is(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
349
|
+
`).filter(Boolean)}catch{return[]}}},Uy=new ia,Je=Uy});import{z as be}from"zod";function Hy(n){return n instanceof pn}function Z(n){return Hy(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var mn,Ux,Hx,Gx,Vx,Wx,Bx,pn,ro,oo,ur,Yt=b(()=>{"use strict";mn={create(n,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(r){let o=e.parse(r);super(`${n}: ${JSON.stringify(o)}`),this.name=n,this.errorName=n,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(r){throw new t(r)}static is(r){return r instanceof t&&r.errorName===n}static create(r){return new t(r)}}return t}},Ux=mn.create("FileError",be.object({path:be.string(),operation:be.enum(["read","write","delete","create","copy"]),reason:be.string().optional()})),Hx=mn.create("ValidationError",be.object({field:be.string(),expected:be.string(),received:be.string().optional(),message:be.string().optional()})),Gx=mn.create("PermissionError",be.object({action:be.string(),resource:be.string(),reason:be.string().optional()})),Vx=mn.create("TaskError",be.object({taskId:be.string().optional(),operation:be.enum(["create","update","complete","pause","resume","delete"]),reason:be.string()})),Wx=mn.create("SessionError",be.object({sessionId:be.string().optional(),reason:be.string()})),Bx=mn.create("SyncError",be.object({projectId:be.string().optional(),operation:be.enum(["push","pull","auth","connect"]),reason:be.string()})),pn=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)}},ro=class n extends pn{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},oo=class n extends pn{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new n(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new n(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},ur=class n extends pn{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(Hy,"isPrjctError");l(Z,"getErrorMessage")});import aa from"node:fs";import ao from"node:path";function qu(){if(dr)return dr;let n=__dirname;for(let e=0;e<5;e++){let t=ao.join(n,"package.json");if(aa.existsSync(t))try{if(JSON.parse(aa.readFileSync(t,"utf-8")).name==="prjct-cli")return dr=n,n}catch{}n=ao.dirname(n)}return dr=ao.join(__dirname,"..","..",".."),dr}function ca(){if(io)return io;try{let n=ao.join(qu(),"package.json"),e=JSON.parse(aa.readFileSync(n,"utf-8"));return io=e.version,Gy=e,io}catch(n){return console.error("Failed to read version from package.json:",y(n)),"0.0.0"}}var io,Gy,dr,xe,pe,Pt=b(()=>{"use strict";U();io=null,Gy=null,dr=null;l(qu,"getPackageRoot");l(ca,"getVersion");xe=ca(),pe=qu()});import ua from"node:fs";import Vy from"node:fs/promises";import co from"node:path";function da(){if(Ku)return la;Ku=!0;let n=co.join(pe,"dist","templates.json");try{let e=ua.readFileSync(n,"utf-8");return la=JSON.parse(e),la}catch{return null}}function By(n){let e=$s.indexOf(n);e>-1&&$s.splice(e,1),$s.push(n)}function Jy(){for(;gn.size>=Wy&&$s.length>0;){let n=$s.shift();n&&gn.delete(n)}}function lo(n){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=n.match(e);if(!t)return{frontmatter:{},content:n.trim()};let[,s,r]=t,o={};return s.split(`
|
|
350
|
+
`).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:r.trim()}}async function Xu(n){if(gn.has(n))return By(n),gn.get(n);let e,t=da();if(t){let r=`commands/${n}.md`;e=t[r]}if(!e){let r=co.join(pe,"templates","commands",`${n}.md`);try{e=await Vy.readFile(r,"utf-8")}catch{throw oo.notFound(n)}}let s=lo(e);return Jy(),gn.set(n,s),$s.push(n),s}async function zy(n){return(await Xu(n)).frontmatter["allowed-tools"]||[]}function qy(){gn.clear(),$s.length=0}function ye(n){let e=da();if(e?.[n])return e[n];let t=co.join(pe,"templates",n);try{return ua.readFileSync(t,"utf-8")}catch{return null}}function ps(n){let e=da();if(e)return Object.keys(e).filter(s=>s.startsWith(n));let t=co.join(pe,"templates",n);try{return ua.readdirSync(t).map(r=>`${n}${r}`)}catch{return[]}}var Wy,gn,$s,la,Ku,Ky,pa,Wt=b(()=>{"use strict";Yt();Pt();Wy=50,gn=new Map,$s=[],la=null,Ku=!1;l(da,"loadBundle");l(By,"updateLruOrder");l(Jy,"evictLru");l(lo,"parseFrontmatter");l(Xu,"load");l(zy,"getAllowedTools");l(qy,"clearCache");l(ye,"getTemplateContent");l(ps,"listTemplates");Ky={load:Xu,parseFrontmatter:lo,getAllowedTools:zy,clearCache:qy,getTemplateContent:ye,listTemplates:ps},pa=Ky});import ce from"node:fs/promises";import ma from"node:os";import oe from"node:path";async function Xy(){try{let n=ye("global/modules/module-config.json");if(n)return JSON.parse(n);let e=oe.join(pe,"templates/global/modules/module-config.json"),t=await ce.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function Yy(n){let e=await Xy();if(!e){let i=ye("global/CLAUDE.md");if(i)return i;let a=oe.join(pe,"templates/global/CLAUDE.md");return ce.readFile(a,"utf-8")}let t=n||e.default,s=e.profiles[t];if(!s&&!e.profiles[e.default]){let a=ye("global/CLAUDE.md");if(a)return a;let c=oe.join(pe,"templates/global/CLAUDE.md");return ce.readFile(c,"utf-8")}let r=(s||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of r){let a=ye(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=oe.join(pe,"templates/global/modules",i),u=await ce.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
|
|
351
|
+
`)}async function Qy(){try{let n=oe.join(ma.homedir(),".prjct-cli","docs");await ce.mkdir(n,{recursive:!0});let e=ps("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=ye(r);if(o){let i=oe.basename(r);await ce.writeFile(oe.join(n,i),o,"utf-8")}}return{success:!0}}let t=oe.join(pe,"templates/global/docs"),s=await ce.readdir(t);for(let r of s)if(r.endsWith(".md")){let o=oe.join(t,r),i=oe.join(n,r),a=await ce.readFile(o,"utf-8");await ce.writeFile(i,a,"utf-8")}return{success:!0}}catch(n){return{success:!1,error:y(n)}}}async function Zy(){let n=(Be(),lt(ct)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await ce.mkdir(e.configDir,{recursive:!0});let r=oe.join(e.configDir,e.contextFile),o=oe.join(pe,"templates","global",e.contextFile),i="";try{let u=ye(`global/${e.contextFile}`);u?i=u:i=await ce.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await Yy()}catch{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(pe,"templates/global/CLAUDE.md");i=await ce.readFile(m,"utf-8")}}else{let d=ye("global/CLAUDE.md");if(d)i=d;else{let m=oe.join(pe,"templates/global/CLAUDE.md");i=await ce.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await ce.readFile(r,"utf-8"),c=!0}catch(u){if(C(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await ce.writeFile(r,k,"utf-8"),{success:!0,action:"updated",path:r}}else{let p=`${a}
|
|
352
|
+
|
|
353
|
+
${i}`;return await ce.writeFile(r,p,"utf-8"),{success:!0,action:"appended",path:r}}}else return await ce.writeFile(r,i,"utf-8"),{success:!0,action:"created",path:r}}catch(r){return{success:!1,error:y(r),action:"failed"}}}function Yu(){let n=ma.homedir();return{claude:{commands:oe.join(n,".claude","commands"),config:oe.join(n,".claude"),router:oe.join(n,".claude","commands","p.md")},gemini:{commands:oe.join(n,".gemini","commands"),config:oe.join(n,".gemini"),router:oe.join(n,".gemini","commands","p.toml")}}}var ms,ew,Ae,Qt=b(()=>{"use strict";Wt();U();Pt();l(Xy,"loadModuleConfig");l(Yy,"composeGlobalTemplate");l(Qy,"installDocs");l(Zy,"installGlobalConfig");ms=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=ma.homedir(),this.templatesDir=oe.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Be(),lt(ct)).getActiveProvider();this.commandsPath=oe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await ce.access(this.configPath),!0}catch(e){if(C(e))return!1;throw e}}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=ps("commands/");return t.length>0?t.filter(r=>r.endsWith(".md")).map(r=>r.replace("commands/","")).filter(r=>!e.has(r)):(await ce.readdir(this.templatesDir)).filter(r=>r.endsWith(".md")&&!e.has(r))}async installCommands(){let e=await this.detectActiveProvider(),s=await(Be(),lt(ct)).getActiveProvider();if(!e)return{success:!1,error:`${s.displayName} not detected. Please install it first.`};try{return await this.installRouter(),{success:!0,installed:["p (router)"],path:this.commandsPath}}catch(r){return{success:!1,error:y(r)}}}async uninstallCommands(){try{let e=[],r=(await(Be(),lt(ct)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,r);try{await ce.unlink(o),e.push("p (router)")}catch(i){if(i.code!=="ENOENT")return{success:!1,error:y(i)}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){if(!await this.detectActiveProvider())return{installed:!1,providerDetected:!1};try{let r=(await(Be(),lt(ct)).getActiveProvider()).name==="gemini"?"p.toml":"p.md",o=oe.join(this.commandsPath,r);return await ce.access(o),{installed:!0,providerDetected:!0,commands:["p (router)"],path:this.commandsPath}}catch(t){if(C(t))return{installed:!1,providerDetected:!0,commands:[]};throw t}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async installRouter(){let t=await(Be(),lt(ct)).getActiveProvider();if(t.name==="gemini")return this.installStaticRouter("p.toml");try{let s=oe.join(t.configDir,"commands","p.md");await ce.mkdir(oe.dirname(s),{recursive:!0});let r=await this.generateRouterContent();return await ce.writeFile(s,r,"utf-8"),!0}catch(s){if(C(s))return!1;throw s}}async installStaticRouter(e){let s=await(Be(),lt(ct)).getActiveProvider();try{let r=oe.join(s.configDir,"commands",e);await ce.mkdir(oe.dirname(r),{recursive:!0});let o=ye(`commands/${e}`);if(o)return await ce.writeFile(r,o,"utf-8"),!0;let i=oe.join(this.templatesDir,e),a=await ce.readFile(i,"utf-8");return await ce.writeFile(r,a,"utf-8"),!0}catch(r){if(C(r))return!1;throw r}}async generateRouterContent(){let e=await this.getCommandFiles(),t={task:"Start a task",done:"Complete current subtask",ship:"Ship feature with PR + version bump",sync:"Analyze project, regenerate agents",pause:"Pause current task",resume:"Resume paused task",next:"Show priority queue",idea:"Quick idea capture",bug:"Report bug with auto-priority",dash:"Dashboard view",status:"Project status check",linear:"Linear integration (via MCP)",jira:"JIRA integration (via MCP)",init:"Initialize prjct in a project",analyze:"Deep repository analysis",plan:"Create implementation plan",design:"UI/UX design workflow",test:"Test workflow",cleanup:"Code cleanup",git:"Git operations",review:"Code review",history:"Task history & undo/redo",sessions:"Session management",workflow:"Workflow management",enrich:"Enrich task context",impact:"Impact analysis",learnings:"View learned patterns",merge:"Merge workflow",prd:"Product requirements doc",serve:"Start dev server",setup:"Setup prjct",spec:"Technical specification",update:"Update prjct",verify:"Verify analysis integrity",auth:"Authentication"},s=[];for(let r of e){let o=r.replace(".md",""),i=t[o]||`${o} command`;s.push(`| \`p. ${o}${["task","idea","bug","ship"].includes(o)?" <desc>":""}\` | ${i} |`)}return`---
|
|
354
354
|
description: 'prjct CLI - Context layer for AI agents'
|
|
355
355
|
allowed-tools: ["*"]
|
|
356
356
|
---
|
|
@@ -365,7 +365,7 @@ All commands use the \`p.\` prefix.
|
|
|
365
365
|
|
|
366
366
|
| Command | Description |
|
|
367
367
|
|---------|-------------|
|
|
368
|
-
${
|
|
368
|
+
${s.join(`
|
|
369
369
|
`)}
|
|
370
370
|
|
|
371
371
|
## Execution
|
|
@@ -432,47 +432,47 @@ Templates should use CLI commands for data operations \u2014 never read/write JS
|
|
|
432
432
|
2. Handle aliases (undo \u2192 history undo, redo \u2192 history redo)
|
|
433
433
|
3. If passthrough command \u2192 run CLI directly
|
|
434
434
|
4. Else \u2192 load and execute command template
|
|
435
|
-
`}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return await this.installRouter(),{success:!0,added:0,updated:1,removed:0}}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async cleanupLegacyCommands(){await this.ensureInit();let e=oe.join(this.commandsPath,"p");try{if((await ce.stat(e).catch(()=>null))?.isDirectory())return await ce.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Zy()}async installDocs(){return Qy()}};l(Yu,"getProviderPaths");ew=new
|
|
435
|
+
`}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return await this.installRouter(),{success:!0,added:0,updated:1,removed:0}}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async cleanupLegacyCommands(){await this.ensureInit();let e=oe.join(this.commandsPath,"p");try{if((await ce.stat(e).catch(()=>null))?.isDirectory())return await ce.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Zy()}async installDocs(){return Qy()}};l(Yu,"getProviderPaths");ew=new ms,Ae=ew});import{z as Me}from"zod";function td(n,e="default"){let t=Qu[e]||Qu.default;return n/1e3*t}function uo(n){return n<.01?`$${(n*100).toFixed(2)}\xA2`:`$${n.toFixed(2)}`}var tw,sw,Zu,ed,Qu,po=b(()=>{"use strict";tw=Me.object({date:Me.string(),tokensSaved:Me.number(),syncs:Me.number(),avgCompressionRate:Me.number(),totalDuration:Me.number()}),sw=Me.object({agentName:Me.string(),usageCount:Me.number(),tokensSaved:Me.number()}),Zu=Me.object({totalTokensSaved:Me.number(),avgCompressionRate:Me.number(),syncCount:Me.number(),watchTriggers:Me.number(),avgSyncDuration:Me.number(),totalSyncDuration:Me.number(),agentUsage:Me.array(sw),dailyStats:Me.array(tw),firstSync:Me.string(),lastUpdated:Me.string()}),ed={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Qu={"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(td,"estimateCostSaved");l(uo,"formatCost")});function sd(n,e){let t=[];pr("Languages",n.languages,e.languages,t),pr("Frameworks",n.frameworks,e.frameworks,t),(n.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:n.packageManager??"(none)",after:e.packageManager??"(none)"}),(n.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:n.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(n.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:n.testDir??"(none)",after:e.testDir??"(none)"}),pr("Config files",n.configFiles,e.configFiles,t),n.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(n.fileCount),after:String(e.fileCount)});let s=n.patterns.map(d=>d.name),r=e.patterns.map(d=>d.name);pr("Patterns",s,r,t);let o=n.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:n.commitHash??null,afterCommit:e.commitHash??null}}function ga(n){if(!n.hasChanges)return`## Analysis Diff
|
|
436
436
|
|
|
437
|
-
No changes between runs.`;let e=[];e.push("## Analysis Diff"),(
|
|
438
|
-
`)}function
|
|
439
|
-
`)}function pr(s,e,t,n){let r=new Set(e),o=new Set(t);for(let i of t)r.has(i)||n.push({field:s,type:"added",after:i});for(let i of e)o.has(i)||n.push({field:s,type:"removed",before:i})}var fa=b(()=>{"use strict";l(nd,"generateAnalysisDiff");l(ga,"formatAnalysisDiffMd");l(sd,"formatAnalysisDiffText");l(pr,"diffStringArray")});import id from"node:fs/promises";import mo from"node:path";function fs(s){return s.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 ow(s,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...fs(p));let r=[/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 r){let g;for(;(g=p.exec(s))!==null;)g[1]&&t.push(...fs(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(s))!==null;)g[1]&&t.push(...fs(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(s))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...fs(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...fs(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(s))!==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(s))!==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&&!ad.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function iw(s){return s.split(/\s+/).flatMap(e=>fs(e)).filter(e=>e.length>1&&!ad.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function cd(s,e){let t=[],n=await id.readdir(s,{withFileTypes:!0});for(let r of n){if(rw.has(r.name))continue;let o=mo.join(s,r.name);if(r.isDirectory())t.push(...await cd(o,e));else if(r.isFile()){let i=mo.extname(r.name).toLowerCase();sw.has(i)&&t.push(mo.relative(e,o))}}return t}async function aw(s){let e=await cd(s,s),t={},n={},r=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await id.readFile(mo.join(s,d),"utf-8"),p=ow(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},r+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function cw(s,e){return Math.log((e-s+.5)/(s+.5)+1)}function lw(s,e){let t=iw(s);if(t.length===0)return[];let n=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=cw(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(rd+1),m=c+rd*(1-od+od*(u.length/e.avgDocLength)),p=i*(d/m);n.set(a,(n.get(a)||0)+p)}}return Array.from(n.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function uw(s,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,r])=>[n,r.length]))};N.setDoc(s,ld,t)}function dw(s){let e=N.getDoc(s,ld);if(!e)return null;let t={};for(let[n,r]of Object.entries(e.docLengths))t[n]={tokens:[],length:r};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function ud(s,e){let t=await aw(s);return uw(e,t),t}function dd(s,e,t=15){let n=dw(s);return n?lw(e,n).slice(0,t):[]}var rd,od,sw,ad,rw,ld,ha=b(()=>{"use strict";se();rd=1.2,od=.75,sw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),ad=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"]),rw=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(fs,"splitIdentifier");l(ow,"tokenizeFile");l(iw,"tokenizeQuery");l(cd,"listFiles");l(aw,"buildIndex");l(cw,"idf");l(lw,"score");ld="bm25-index";l(uw,"saveIndex");l(dw,"loadIndex");l(ud,"indexProject");l(dd,"queryFiles")});import mr from"node:fs/promises";import fn from"node:path";import{z as q}from"zod";async function hw(s,e){let t=Date.now();if(s.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let n=fn.join(e,"package.json"),r=await mr.readFile(n,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of s.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(n){return P(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function yw(s,e){let t=Date.now();if(s.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let n=await bw(e),r=new Set(n),o=[],i=[];for(let a of s.languages){let c=fw[a];if(!c)continue;c.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ww(s,e){let t=Date.now(),n=s.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of n){let a=i.location,c=fn.join(e,a);try{await mr.access(c),o.push(a)}catch{r.push(`${i.name} (${a})`)}}return r.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: ${r.join(", ")}`,durationMs:Date.now()-t}}async function kw(s,e){let t=Date.now();try{let n=await vw(e),r=s.fileCount,o=.1,i=Math.abs(n-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Sw(s,e){let t=Date.now();if(s.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let n=[],r=[];for(let o of s.antiPatterns){let i=fn.join(e,o.file);try{await mr.access(i),r.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function pd(s,e){let t=Date.now(),n=await Promise.all([hw(s,e),yw(s,e),ww(s,e),kw(s,e),Sw(s,e)]),r=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:r===0,checks:n,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function bw(s){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await mr.readdir(r,{withFileTypes:!0});for(let i of o){let a=fn.join(r,i.name),c=fn.relative(s,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=fn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(s),Array.from(e)}async function vw(s){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(r){try{let o=await mr.readdir(r,{withFileTypes:!0});for(let i of o){let a=fn.join(r,i.name),c=fn.relative(s,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(s),e}var pw,mw,gw,ya,RA,fw,md=b(()=>{"use strict";U();Yr();pw=q.enum(["draft","verified","sealed"]),mw=q.object({name:q.string(),description:q.string(),location:q.string().optional(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),gw=q.object({issue:q.string(),file:q.string(),suggestion:q.string(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),ya=q.object({projectId:q.string(),languages:q.array(q.string()),frameworks:q.array(q.string()),packageManager:q.string().optional(),sourceDir:q.string().optional(),testDir:q.string().optional(),configFiles:q.array(q.string()),fileCount:q.number(),patterns:q.array(mw),antiPatterns:q.array(gw),analyzedAt:q.string(),modelMetadata:ds.optional(),status:pw.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),RA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},fw={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(hw,"verifyFrameworks");l(yw,"verifyLanguages");l(ww,"verifyPatternLocations");l(kw,"verifyFileCount");l(Sw,"verifyAntiPatternFiles");l(pd,"semanticVerify");l(bw,"getProjectExtensions");l(vw,"countProjectFiles")});var wa,gd,fd=b(()=>{"use strict";Se();fe();We();wa=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),n=await Ut(t,[])??[];n.push(e),await An(t,n)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ut(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await An(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),n={timestamp:v(),success:!0};await An(t,n)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ut(t,null)}},gd=new wa});var hs,ka=b(()=>{"use strict";hs=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,r)=>n[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Je,Zt=b(()=>{"use strict";fd();ka();fe();se();Je=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new hs({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=x.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){x.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),r=t(n);return await this.write(e,r),r}async publishEvent(e,t,n){let r={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:v(),projectId:e};await gd.publish(r)}async publishEntityEvent(e,t,n,r){let o=`${t}.${n}`,i={...r,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return x.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as Tw}from"node:crypto";var Sa,qe,ys=b(()=>{"use strict";md();fa();fe();Zt();Sa=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 n={...t,status:"draft"};ya.parse(n),await this.update(e,r=>({...r,draft:n,lastUpdated:v()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),r=v(),o={...t.draft,status:"sealed",signature:n,sealedAt:r};return ya.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let n=v();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:nd(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),r=n.sealed??n.draft;return r?await pd(r,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 Tw("sha256").update(JSON.stringify(t)).digest("hex")}},qe=new Sa});var ba,Pw,ws,va=b(()=>{"use strict";fe();se();ba=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let n=x.getDb(e),r=v();n.transaction(()=>{n.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),n.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=x.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?x.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return x.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},Pw=new ba,ws=Pw});import{z as E}from"zod";var Cw,go,Ew,xw,Aw,Ta,yd,wd,kd,Sd,hd,Rw,Dw,bd,vd,Td,jw,Iw,sR,Pa=b(()=>{"use strict";Yr();Cw=E.enum(["low","medium","high","critical"]),go=E.enum(["feature","bug","improvement","chore"]),Ew=E.enum(["active","backlog","previously_active"]),xw=E.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Aw=E.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ta=E.object({title:E.string(),description:E.string(),filesChanged:E.array(E.object({path:E.string(),action:E.enum(["created","modified","deleted"])})),whatWasDone:E.array(E.string()).min(1),outputForNextAgent:E.string().min(1),notes:E.string().optional()}),yd=E.object({output:E.string().min(1,"Subtask output is required"),summary:Ta}),wd=E.object({id:E.string(),description:E.string(),domain:E.string(),agent:E.string(),status:xw,dependsOn:E.array(E.string()),startedAt:E.string().optional(),completedAt:E.string().optional(),output:E.string().optional(),summary:Ta.optional(),skipReason:E.string().optional(),blockReason:E.string().optional(),estimatedPoints:E.number().optional(),estimatedMinutes:E.number().optional()}),kd=E.object({completed:E.number(),total:E.number(),percentage:E.number()}),Sd=E.object({id:E.string(),description:E.string(),type:go.optional(),startedAt:E.string(),sessionId:E.string(),featureId:E.string().optional(),subtasks:E.array(wd).optional(),currentSubtaskIndex:E.number().optional(),subtaskProgress:kd.optional(),linearId:E.string().optional(),linearUuid:E.string().optional(),estimatedPoints:E.number().optional(),estimatedMinutes:E.number().optional(),modelMetadata:ds.optional()}),hd=E.object({id:E.string(),description:E.string(),status:E.literal("paused"),startedAt:E.string(),pausedAt:E.string(),pauseReason:E.string().optional(),type:go.optional(),sessionId:E.string().optional(),featureId:E.string().optional(),subtasks:E.array(wd).optional(),currentSubtaskIndex:E.number().optional(),subtaskProgress:kd.optional(),linearId:E.string().optional(),linearUuid:E.string().optional(),estimatedPoints:E.number().optional(),estimatedMinutes:E.number().optional(),modelMetadata:ds.optional()}),Rw=E.object({stackConfirmed:E.array(E.string()).optional(),patternsDiscovered:E.array(E.string()).optional(),agentAccuracy:E.array(E.object({agent:E.string(),rating:E.enum(["helpful","neutral","inaccurate"]),note:E.string().optional()})).optional(),issuesEncountered:E.array(E.string()).optional()}),Dw=E.object({taskId:E.string(),title:E.string(),classification:go,startedAt:E.string(),completedAt:E.string(),subtaskCount:E.number(),subtaskSummaries:E.array(Ta),outcome:E.string(),branchName:E.string(),linearId:E.string().optional(),linearUuid:E.string().optional(),prUrl:E.string().optional(),feedback:Rw.optional()}),bd=E.object({currentTask:Sd.nullable(),previousTask:hd.nullable().optional(),pausedTasks:E.array(hd).optional(),taskHistory:E.array(Dw).optional(),lastUpdated:E.string()}),vd=E.object({id:E.string(),description:E.string(),priority:Cw,type:go,featureId:E.string().optional(),originFeature:E.string().optional(),completed:E.boolean(),completedAt:E.string().optional(),createdAt:E.string(),section:Ew,agent:E.string().optional(),groupName:E.string().optional(),groupId:E.string().optional()}),Td=E.object({tasks:E.array(vd),lastUpdated:E.string()}),jw=E.object({tasksToday:E.number(),tasksThisWeek:E.number(),streak:E.number(),velocity:E.string(),avgDuration:E.string()}),Iw=E.object({type:Aw,description:E.string(),timestamp:E.string(),duration:E.string().optional()}),sR=E.object({projectId:E.string(),currentTask:Sd.nullable(),queue:E.array(vd),stats:jw,recentActivity:E.array(Iw),lastSync:E.string()})});var gr,Ca,On,Ea=b(()=>{"use strict";gr={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},Ca=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=gr[e];if(n.transitions.includes(t))return{valid:!0};let r=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}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 gr[e]}getPrompt(e){return gr[e].prompt}getValidCommands(e){return gr[e].transitions}formatNextSteps(e){return gr[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},On=new Ca});var en,xa,Ct,_n=b(()=>{"use strict";Tt();fe();se();en={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},xa=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=he(),r=v();return x.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=v();return x.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(he(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?x.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):x.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=x.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in n&&(n[o]=r.count),n.total+=r.count}return n}restore(e,t){let n=x.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(x.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);x.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return x.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ct=new xa});var Aa,F,Et=b(()=>{"use strict";Tt();Pa();fe();Ea();_n();Zt();Aa=class extends Je{static{l(this,"StateStorage")}constructor(){super("state.json",bd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=On.getCurrentState(e),r=On.canTransition(n,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let r={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let r={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:v()})),r}async completeTask(e,t){let n=await this.read(e),r=n.currentTask;if(!r)return null;this.validateTransition(n,"done");let o=v(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(n),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:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,n){let r=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:r.parentDescription||e.description,classification:r.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:r.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:r.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let r={...n.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let n=await this.read(e),r=this.getPausedTasksFromState(n);if(r.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=r.findIndex(g=>g.id===t),o===-1))return null;let i=r[o],a=r.filter((g,f)=>f!==o),{status:c,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:v(),sessionId:i.sessionId??he()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:v()})),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),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<r),i=n.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];Ct.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:v()}));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:v()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&r.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(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=yd.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
437
|
+
No changes between runs.`;let e=[];e.push("## Analysis Diff"),(n.beforeCommit||n.afterCommit)&&e.push(`> \`${n.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${n.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of n.items){let r=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${r} | ${s.field} | ${o} |`)}e.push("");let t=[];return n.summary.added>0&&t.push(`${n.summary.added} added`),n.summary.removed>0&&t.push(`${n.summary.removed} removed`),n.summary.changed>0&&t.push(`${n.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
|
|
438
|
+
`)}function nd(n){if(!n.hasChanges)return"No changes between analysis runs.";let e=[];(n.beforeCommit||n.afterCommit)&&(e.push(` ${n.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${n.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of n.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(`
|
|
439
|
+
`)}function pr(n,e,t,s){let r=new Set(e),o=new Set(t);for(let i of t)r.has(i)||s.push({field:n,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:n,type:"removed",before:i})}var fa=b(()=>{"use strict";l(sd,"generateAnalysisDiff");l(ga,"formatAnalysisDiffMd");l(nd,"formatAnalysisDiffText");l(pr,"diffStringArray")});import id from"node:fs/promises";import mo from"node:path";function fn(n){return n.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 ow(n,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...fn(p));let r=[/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 r){let g;for(;(g=p.exec(n))!==null;)g[1]&&t.push(...fn(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(n))!==null;)g[1]&&t.push(...fn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(n))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...fn(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...fn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(n))!==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(n))!==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&&!ad.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function iw(n){return n.split(/\s+/).flatMap(e=>fn(e)).filter(e=>e.length>1&&!ad.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function cd(n,e){let t=[],s=await id.readdir(n,{withFileTypes:!0});for(let r of s){if(rw.has(r.name))continue;let o=mo.join(n,r.name);if(r.isDirectory())t.push(...await cd(o,e));else if(r.isFile()){let i=mo.extname(r.name).toLowerCase();nw.has(i)&&t.push(mo.relative(e,o))}}return t}async function aw(n){let e=await cd(n,n),t={},s={},r=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await id.readFile(mo.join(n,d),"utf-8"),p=ow(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},r+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)s[g]||(s[g]=[]),s[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function cw(n,e){return Math.log((e-n+.5)/(n+.5)+1)}function lw(n,e){let t=iw(n);if(t.length===0)return[];let s=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=cw(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(rd+1),m=c+rd*(1-od+od*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function uw(n,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,r])=>[s,r.length]))};N.setDoc(n,ld,t)}function dw(n){let e=N.getDoc(n,ld);if(!e)return null;let t={};for(let[s,r]of Object.entries(e.docLengths))t[s]={tokens:[],length:r};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function ud(n,e){let t=await aw(n);return uw(e,t),t}function dd(n,e,t=15){let s=dw(n);return s?lw(e,s).slice(0,t):[]}var rd,od,nw,ad,rw,ld,ha=b(()=>{"use strict";ne();rd=1.2,od=.75,nw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),ad=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"]),rw=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(fn,"splitIdentifier");l(ow,"tokenizeFile");l(iw,"tokenizeQuery");l(cd,"listFiles");l(aw,"buildIndex");l(cw,"idf");l(lw,"score");ld="bm25-index";l(uw,"saveIndex");l(dw,"loadIndex");l(ud,"indexProject");l(dd,"queryFiles")});import mr from"node:fs/promises";import gs from"node:path";import{z as q}from"zod";async function hw(n,e){let t=Date.now();if(n.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=gs.join(e,"package.json"),r=await mr.readFile(s,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of n.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 C(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 yw(n,e){let t=Date.now();if(n.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await bw(e),r=new Set(s),o=[],i=[];for(let a of n.languages){let c=fw[a];if(!c)continue;c.some(d=>r.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 ww(n,e){let t=Date.now(),s=n.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 r=[],o=[];for(let i of s){let a=i.location,c=gs.join(e,a);try{await mr.access(c),o.push(a)}catch{r.push(`${i.name} (${a})`)}}return r.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: ${r.join(", ")}`,durationMs:Date.now()-t}}async function kw(n,e){let t=Date.now();try{let s=await vw(e),r=n.fileCount,o=.1,i=Math.abs(s-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, 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 Sw(n,e){let t=Date.now();if(n.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],r=[];for(let o of n.antiPatterns){let i=gs.join(e,o.file);try{await mr.access(i),r.push(o.file)}catch{s.push(`${o.issue} (${o.file})`)}}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.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 pd(n,e){let t=Date.now(),s=await Promise.all([hw(n,e),yw(n,e),ww(n,e),kw(n,e),Sw(n,e)]),r=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:r===0,checks:s,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function bw(n){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(r){try{let o=await mr.readdir(r,{withFileTypes:!0});for(let i of o){let a=gs.join(r,i.name),c=gs.relative(n,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=gs.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(n),Array.from(e)}async function vw(n){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(r){try{let o=await mr.readdir(r,{withFileTypes:!0});for(let i of o){let a=gs.join(r,i.name),c=gs.relative(n,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(n),e}var pw,mw,gw,ya,RA,fw,md=b(()=>{"use strict";U();Yr();pw=q.enum(["draft","verified","sealed"]),mw=q.object({name:q.string(),description:q.string(),location:q.string().optional(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),gw=q.object({issue:q.string(),file:q.string(),suggestion:q.string(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),ya=q.object({projectId:q.string(),languages:q.array(q.string()),frameworks:q.array(q.string()),packageManager:q.string().optional(),sourceDir:q.string().optional(),testDir:q.string().optional(),configFiles:q.array(q.string()),fileCount:q.number(),patterns:q.array(mw),antiPatterns:q.array(gw),analyzedAt:q.string(),modelMetadata:dn.optional(),status:pw.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),RA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},fw={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(hw,"verifyFrameworks");l(yw,"verifyLanguages");l(ww,"verifyPatternLocations");l(kw,"verifyFileCount");l(Sw,"verifyAntiPatternFiles");l(pd,"semanticVerify");l(bw,"getProjectExtensions");l(vw,"countProjectFiles")});var wa,gd,fd=b(()=>{"use strict";Se();fe();We();wa=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Ut(t,[])??[];s.push(e),await xs(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ut(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await xs(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:v(),success:!0};await xs(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ut(t,null)}},gd=new wa});var hn,ka=b(()=>{"use strict";hn=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,r)=>s[1].timestamp-r[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}}});var ze,Zt=b(()=>{"use strict";fd();ka();fe();ne();ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new hn({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=x.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){x.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),r=t(s);return await this.write(e,r),r}async publishEvent(e,t,s){let r={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await gd.publish(r)}async publishEntityEvent(e,t,s,r){let o=`${t}.${s}`,i={...r,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return x.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});import{createHash as Tw}from"node:crypto";var Sa,qe,yn=b(()=>{"use strict";md();fa();fe();Zt();Sa=class extends ze{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"};ya.parse(s),await this.update(e,r=>({...r,draft:s,lastUpdated:v()})),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),r=v(),o={...t.draft,status:"sealed",signature:s,sealedAt:r};return ya.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),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=v();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:sd(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),r=s.sealed??s.draft;return r?await pd(r,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 Tw("sha256").update(JSON.stringify(t)).digest("hex")}},qe=new Sa});var ba,Pw,wn,va=b(()=>{"use strict";fe();ne();ba=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=x.getDb(e),r=v();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),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=x.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?x.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return x.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},Pw=new ba,wn=Pw});import{z as P}from"zod";var Cw,go,Ew,xw,Aw,Ta,yd,wd,kd,Sd,hd,Rw,jw,bd,vd,Td,Dw,Iw,nR,Pa=b(()=>{"use strict";Yr();Cw=P.enum(["low","medium","high","critical"]),go=P.enum(["feature","bug","improvement","chore"]),Ew=P.enum(["active","backlog","previously_active"]),xw=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Aw=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ta=P.object({title:P.string(),description:P.string(),filesChanged:P.array(P.object({path:P.string(),action:P.enum(["created","modified","deleted"])})),whatWasDone:P.array(P.string()).min(1),outputForNextAgent:P.string().min(1),notes:P.string().optional()}),yd=P.object({output:P.string().min(1,"Subtask output is required"),summary:Ta}),wd=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:xw,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:Ta.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),kd=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),Sd=P.object({id:P.string(),description:P.string(),type:go.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(wd).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:kd.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:dn.optional(),parentDescription:P.string().optional(),branch:P.string().optional(),prUrl:P.string().optional()}),hd=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:go.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(wd).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:kd.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:dn.optional()}),Rw=P.object({stackConfirmed:P.array(P.string()).optional(),patternsDiscovered:P.array(P.string()).optional(),agentAccuracy:P.array(P.object({agent:P.string(),rating:P.enum(["helpful","neutral","inaccurate"]),note:P.string().optional()})).optional(),issuesEncountered:P.array(P.string()).optional()}),jw=P.object({taskId:P.string(),title:P.string(),classification:go,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(Ta),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:Rw.optional()}),bd=P.object({currentTask:Sd.nullable(),previousTask:hd.nullable().optional(),pausedTasks:P.array(hd).optional(),taskHistory:P.array(jw).optional(),lastUpdated:P.string()}),vd=P.object({id:P.string(),description:P.string(),priority:Cw,type:go,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:Ew,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Td=P.object({tasks:P.array(vd),lastUpdated:P.string()}),Dw=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),Iw=P.object({type:Aw,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),nR=P.object({projectId:P.string(),currentTask:Sd.nullable(),queue:P.array(vd),stats:Dw,recentActivity:P.array(Iw),lastSync:P.string()})});var gr,Ca,Ms,Ea=b(()=>{"use strict";gr={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},Ca=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let s=gr[e];if(s.transitions.includes(t))return{valid:!0};let r=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${r}`}}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 gr[e]}getPrompt(e){return gr[e].prompt}getValidCommands(e){return gr[e].transitions}formatNextSteps(e){return gr[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}`}})}},Ms=new Ca});var es,xa,Ct,Os=b(()=>{"use strict";Tt();fe();ne();es={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},xa=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=he(),r=v();return x.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,r,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return x.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(he(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?x.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):x.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=x.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 r of t){let o=r.entity_type;o in s&&(s[o]=r.count),s.total+=r.count}return s}restore(e,t){let s=x.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(x.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(),r=this.getTotalCount(e);x.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return x.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ct=new xa});var Aa,F,Et=b(()=>{"use strict";Tt();Pa();fe();Ea();Os();Zt();Aa=class extends ze{static{l(this,"StateStorage")}constructor(){super("state.json",bd)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Ms.getCurrentState(e),r=Ms.canTransition(s,t);if(!r.valid)throw new Error(`${r.error}. ${r.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 r={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let r={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:v()})),r}async completeTask(e,t){let s=await this.read(e),r=s.currentTask;if(!r)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(r,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:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,s){let r=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=r.length>0?r.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:r,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),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 r={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let s=await this.read(e),r=this.getPausedTasksFromState(s);if(r.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=r.findIndex(g=>g.id===t),o===-1))return null;let i=r[o],a=r.filter((g,f)=>f!==o),{status:c,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:v(),sessionId:i.sessionId??he()};return await this.update(e,g=>({...g,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:v()})),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),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<r),i=s.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];Ct.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:v()}));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:v()}))}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),r=[],o=[],i=[],a=[];for(let p of s){let g=p.feedback;g.stackConfirmed&&r.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(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let r=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=yd.safeParse(t);if(!s.success){let f=s.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
440
440
|
${f.join(`
|
|
441
|
-
`)}`)}let{output:r,summary:o}=
|
|
442
|
-
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):
|
|
443
|
-
`),t=[],
|
|
444
|
-
${o}`)}return
|
|
445
|
-
`).length});for(let a of
|
|
441
|
+
`)}`)}let{output:r,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:v(),output:r,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:r,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 r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});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:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),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 r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});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:r,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),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 r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:r},lastUpdated:v()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},F=new Aa});function Mw(){let n=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!n)return{level:-1,name:"disabled"};if($w.has(n)||n.includes("prjct"))return{level:kn.debug,name:"debug"};let e=kn[n]??-1,t=e>=0?n:"disabled";return{level:e,name:t}}function fo(n,e,t){return Pd>=n?(...s)=>console[t](e,...s):_w}var kn,$w,Pd,Ow,_w,Nw,H,fs=b(()=>{"use strict";kn={error:0,warn:1,info:2,debug:3},$w=new Set(["1","true","*"]);l(Mw,"getLogLevel");({level:Pd,name:Ow}=Mw()),_w=l(()=>{},"noop");l(fo,"createLogMethod");Nw={error:fo(kn.error,"[prjct:error]","error"),warn:fo(kn.warn,"[prjct:warn]","warn"),info:fo(kn.info,"[prjct:info]","log"),debug:fo(kn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Pd>=0,"isEnabled"),level:l(()=>Ow,"level")},H=Nw});import Cd from"node:fs/promises";import Ed from"node:path";async function xd(n,e,t,s){let[r,o,i,a]=await Promise.all([Uw(n,e,s),Hw(n),Gw(n),Vw(n)]);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,Fw).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:r,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function Uw(n,e,t){let s=[],r=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=dd(n,r,Ra*2);for(let a of o){if(s.length>=Ra)break;try{let c=Ed.join(e,a.path),u=await Cd.readFile(c,"utf-8");u.length>ho*3?s.push({path:a.path,content:`${u.slice(0,ho)}
|
|
442
|
+
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,ho),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>=Ra)break;if(!s.some(c=>c.path===a))try{let c=Ed.join(e,a),u=await Cd.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,ho),reason:"entry point"})}catch{}}return s}async function Hw(n){try{let e=await qe.getActive(n);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 Gw(n){try{return(await F.getTaskHistory(n)).slice(0,Lw).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Vw(n){try{let e=wn.getActiveSummary(n);return Promise.resolve(e)}catch(e){return H.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var ho,Ra,Fw,Lw,Ad=b(()=>{"use strict";ha();yn();va();Et();fs();ho=3e3,Ra=15,Fw=15,Lw=10;l(xd,"buildAnalysisPayload");l(Uw,"selectCodeSamples");l(Hw,"getExistingPatterns");l(Gw,"getTaskHistory");l(Vw,"getPreviousAnalysisSummary")});import ts from"chalk";function Rd(n){return Math.ceil(n.length/Ww)}function jd(n){let e=n.split(`
|
|
443
|
+
`),t=[],s=null;for(let r=0;r<e.length;r++){let o=e[r],i=o.match(/^(#{1,3})\s+(.+)$/);i?(s&&(s.endLine=r-1,t.push(s)),s={name:i[2].trim(),content:o,startLine:r,endLine:r}):s&&(s.content+=`
|
|
444
|
+
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function ja(n){return n.includes("<!-- prjct:preserve")}function Dd(n,e){let t=jd(n),s=jd(e),r={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Rd(n),tokensAfter:Rd(e),tokenDelta:0};r.tokenDelta=r.tokensAfter-r.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)ja(a.content)&&r.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
445
|
+
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(ja(u.content)||(r.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
446
446
|
`).length}),r.hasChanges=!0)):(r.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
447
|
-
`).length}),r.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
448
|
-
`).length}),r.hasChanges=!0)}return r}function Id(
|
|
449
|
-
`);if(
|
|
450
|
-
`)}function $d(
|
|
451
|
-
`))
|
|
452
|
-
`).slice(0,5))
|
|
453
|
-
`).length>5&&
|
|
447
|
+
`).length}),r.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!ja(a.content)&&(r.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
448
|
+
`).length}),r.hasChanges=!0)}return r}function Id(n,e={}){let{colorize:t=!0}=e,s=[],r=t?ts.green:p=>p,o=t?ts.red:p=>p,i=t?ts.yellow:p=>p,a=t?ts.dim:p=>p,c=t?ts.bold:p=>p;if(!n.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
|
|
449
|
+
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),n.added.length>0)for(let p of n.added)s.push(r(`+ \u2502 + ${p.name} (new)`));if(n.modified.length>0)for(let p of n.modified)s.push(i(`~ \u2502 ${p.name} (modified)`));if(n.removed.length>0)for(let p of n.removed)s.push(o(`- \u2502 - ${p.name} (removed)`));if(n.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let p of n.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=[];n.added.length>0&&u.push(r(`+${n.added.length} added`)),n.modified.length>0&&u.push(i(`~${n.modified.length} modified`)),n.removed.length>0&&u.push(o(`-${n.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=n.tokenDelta>=0?"+":"",m=n.tokenDelta>=0?r:o;return s.push(`Tokens: ${n.tokensBefore.toLocaleString()} \u2192 ${n.tokensAfter.toLocaleString()} (${m(d+n.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
|
|
450
|
+
`)}function $d(n,e={}){let{colorize:t=!0}=e,s=[],r=t?ts.green:c=>c,o=t?ts.red:c=>c,i=t?ts.cyan:c=>c,a=t?ts.dim:c=>c;for(let c of n.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
451
|
+
`))s.push(r(`+ ${u}`));s.push("")}for(let c of n.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
452
|
+
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
453
|
+
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
454
454
|
`).length-5} more lines`))}if(c.after){for(let u of c.after.split(`
|
|
455
|
-
`).slice(0,5))
|
|
456
|
-
`).length>5&&
|
|
457
|
-
`).length-5} more lines`))}
|
|
458
|
-
`).slice(0,5))
|
|
459
|
-
`).length>5&&
|
|
460
|
-
`).length-5} more lines`))}
|
|
461
|
-
`)}var Ww,Md=b(()=>{"use strict";Ww=4;l(Rd,"estimateTokens");l(
|
|
462
|
-
`).filter(Boolean):[],r){let c=new Date(r),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(
|
|
455
|
+
`).slice(0,5))s.push(r(`+ ${u}`));c.after.split(`
|
|
456
|
+
`).length>5&&s.push(a(` ... ${c.after.split(`
|
|
457
|
+
`).length-5} more lines`))}s.push("")}for(let c of n.removed){if(s.push(i(`@@ -${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
458
|
+
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
459
|
+
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
460
|
+
`).length-5} more lines`))}s.push("")}return s.join(`
|
|
461
|
+
`)}var Ww,Md=b(()=>{"use strict";Ww=4;l(Rd,"estimateTokens");l(jd,"parseMarkdownSections");l(ja,"isPreservedSection");l(Dd,"generateSyncDiff");l(Id,"formatDiffPreview");l($d,"formatFullDiff")});var Bw,Od,_d,Da,Nd,Fd=b(()=>{"use strict";ne();fe();Bw=1800*1e3,Od=50,_d=200,Da=class{static{l(this,"SessionTracker")}async read(e){try{return x.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){x.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Bw}}}isExpired(e,t){let s=new Date(e.lastActivity).getTime();return Date.now()-s>t}async touch(e){let t=await this.read(e),s=v();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let r={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=r,await this.write(e,t),r}async trackCommand(e,t,s){let r=await this.read(e);if(!r.current)return;let o=v();r.current.lastActivity=o,r.current.commands.push({command:t,timestamp:o,durationMs:s}),r.current.commands.length>Od&&(r.current.commands=r.current.commands.slice(-Od)),await this.write(e,r)}async trackFile(e,t,s){let r=await this.read(e);if(!r.current)return;let o=v();r.current.lastActivity=o,r.current.files.push({path:t,operation:s,timestamp:o}),r.current.files.length>_d&&(r.current.files=r.current.files.slice(-_d)),await this.write(e,r)}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,r=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=r-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:Kt(r-o),idleSince:s.lastActivity,idleMs:a,expiresIn:Kt(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}},Nd=new Da});import{exec as Jw}from"node:child_process";import{promisify as zw}from"node:util";var Ia,qw,$a,yo,Ma=b(()=>{"use strict";ne();U();Fd();Ia=zw(Jw),qw={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},$a=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...qw,...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=x.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 r=s.lastSync;try{let{stdout:c}=await Ia("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([Ia(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),Ia(`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(`
|
|
462
|
+
`).filter(Boolean):[],r){let c=new Date(r),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 r=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let r of e.significantChanges.slice(0,5))t.push(` \u2022 ${r}`);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(`
|
|
463
463
|
`)}async getSessionInfo(e){return Nd.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
464
|
-
`);t.push(`Session: \u25B6 Active (${e.duration})`);let
|
|
465
|
-
`)}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}},yo=l((
|
|
466
|
-
`)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=Xd&&
|
|
467
|
-
`,"utf-8")}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),
|
|
468
|
-
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let
|
|
464
|
+
`);t.push(`Session: \u25B6 Active (${e.duration})`);let s=[];if(e.commandCount>0){let r=new Set,o=[];for(let i of e.commands)r.has(i)||(r.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 r=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(r+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(r)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
|
|
465
|
+
`)}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}},yo=l((n,e)=>new $a(n,e),"createStalenessChecker")});import Oa from"node:fs/promises";import ss from"node:path";function Zw(n){let e=[],t,s=new RegExp(Qw.source,"g");for(;(t=s.exec(n))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function ek(n,e,t){let s;if(n.startsWith("@/"))s=ss.join(t,"src",n.slice(2));else{let r=ss.dirname(ss.join(t,e));s=ss.resolve(r,n)}for(let r of Yw){let o=s+r;try{if((await Oa.stat(o)).isFile())return ss.relative(t,o)}catch{}}return null}async function Ld(n,e){let t=[],s=await Oa.readdir(n,{withFileTypes:!0});for(let r of s){if(Xw.has(r.name))continue;let o=ss.join(n,r.name);if(r.isDirectory())t.push(...await Ld(o,e));else if(r.isFile()){let i=ss.extname(r.name).toLowerCase();Kw.has(i)&&t.push(ss.relative(e,o))}}return t}async function tk(n){let e=await Ld(n,n),t={},s={},r=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await Oa.readFile(ss.join(n,u),"utf-8"),m=Zw(d),p=[];for(let g of m){let f=await ek(g,u,n);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,r+=d.length;for(let m of d)s[m]||(s[m]=[]),s[m].push(u)}}return{forward:t,reverse:s,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function sk(n,e){N.setDoc(n,Ud,e)}function Hd(n){return N.getDoc(n,Ud)}async function Gd(n,e){let t=await tk(n);return sk(e,t),t}var Kw,Xw,Yw,Qw,Ud,_a=b(()=>{"use strict";ne();Kw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),Xw=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),Yw=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Qw=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(Zw,"extractImportSources");l(ek,"resolveImport");l(Ld,"listFiles");l(tk,"buildGraph");Ud="import-graph";l(sk,"saveGraph");l(Hd,"loadGraph");l(Gd,"indexImports")});function Vd(n,e){let t=[...n.added,...n.modified],s=new Set(t),r=new Set,o=Hd(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:n.deleted,allAffected:a}}function Wd(n){let e=new Set;for(let t of n){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 Bd=b(()=>{"use strict";_a();l(Vd,"propagateChanges");l(Wd,"affectedDomains")});import Na from"node:fs/promises";import wo from"node:path";async function Jd(n,e){let t=[],s=await Na.readdir(n,{withFileTypes:!0}).catch(()=>[]);for(let r of s){let o=String(r.name);if(rk.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=wo.join(n,o);if(r.isDirectory())t.push(...await Jd(i,e));else if(r.isFile()){let a=wo.extname(o).toLowerCase();nk.has(a)&&t.push(wo.relative(e,i))}}return t}function ok(n){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(n).toString(36)}`;let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function ik(n){let e=await Jd(n,n),t=new Map,s=100;for(let r=0;r<e.length;r+=s){let o=e.slice(r,r+s),i=await Promise.all(o.map(async a=>{try{let c=wo.join(n,a),[u,d]=await Promise.all([Na.readFile(c,"utf-8"),Na.stat(c)]);return{path:a,hash:ok(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function ak(n,e){let t=[],s=[],r=[];for(let[i,a]of n){let c=e.get(i);c?c.hash!==a.hash?s.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())n.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:r}}function Fa(n,e){let t=N.getDb(n);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)s.run(r.path,r.hash,r.size,r.mtime)})(),N.setDoc(n,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function ck(n){let e=new Map;try{let t=N.query(n,"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 La(n,e){let[t,s]=await Promise.all([ik(n),Promise.resolve(ck(e))]);return{diff:ak(t,s),currentHashes:t}}function zd(n){return N.hasDoc(n,"file-hashes-meta")}var nk,rk,qd=b(()=>{"use strict";ne();nk=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),rk=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(Jd,"listProjectFiles");l(ok,"hashContent");l(ik,"computeHashes");l(ak,"diffHashes");l(Fa,"saveHashes");l(ck,"loadHashes");l(La,"detectChanges");l(zd,"hasHashRegistry")});import{exec as lk}from"node:child_process";import{promisify as uk}from"node:util";async function mk(n,e=100){try{let{stdout:t}=await dk(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:n,maxBuffer:10485760}),s=[],r=null;for(let o of t.split(`
|
|
466
|
+
`)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=Xd&&s.push(r),r=new Set):i&&r&&gk(i)&&r.add(i)}return r&&r.size>0&&r.size<=Xd&&s.push(r),s}catch{return[]}}function gk(n){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(n)&&!n.includes("node_modules/")}async function fk(n,e=100){let t=await mk(n,e),s=new Map,r=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=hk(a[c],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[c,u]=i.split("\0"),d=s.get(c)||0,m=s.get(u)||0;if(d<Kd||m<Kd)continue;let p=d+m-a,g=p>0?a/p:0;g<pk||(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 hk(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function wk(n,e){N.setDoc(n,yk,e)}async function Yd(n,e,t=100){let s=await fk(n,t);return wk(e,s),s}var dk,pk,Kd,Xd,yk,Qd=b(()=>{"use strict";ne();dk=uk(lk),pk=.1,Kd=2,Xd=30;l(mk,"parseGitLog");l(gk,"isSourceFile");l(fk,"buildMatrix");l(hk,"pairKey");yk="cochange-index";l(wk,"saveMatrix");l(Yd,"indexCoChanges")});import{exec as kk}from"node:child_process";import{promisify as Sk}from"node:util";async function ko(n){try{let{stdout:e}=await bk(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function vk(){let n=await ko("gh api user --jq .login");return n.success&&n.output||(n=await ko("git config --global github.user"),n.success&&n.output)?n.output:null}async function Tk(){let n=await ko("git config user.name");return n.success&&n.output?n.output:null}async function Pk(){let n=await ko("git config user.email");return n.success&&n.output?n.output:null}async function Sn(){let[n,e,t]=await Promise.all([vk(),Tk(),Pk()]);return{github:n,email:t,name:e||n||"Unknown"}}var bk,So=b(()=>{"use strict";bk=Sk(kk);l(ko,"execCommand");l(vk,"detectGitHubUsername");l(Tk,"detectGitName");l(Pk,"detectGitEmail");l(Sn,"detect")});import _s from"node:fs/promises";import Ck from"node:path";import*as bo from"jsonc-parser";function Zd(n){let e=[],t=bo.parse(n,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 Ha,Ek,$,ft=b(()=>{"use strict";Yt();U();fe();Pt();So();Se();l(Zd,"parseJsonc");Ha=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await _s.readFile(t,"utf-8");return Zd(s)}catch(t){return C(t)||console.warn(`Warning: Could not read config at ${e}: ${Z(t)}`),null}}async writeConfig(e,t){let s=A.getLocalConfigPath(e),r=A.getLegacyPrjctPath(e);await _s.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await _s.writeFile(s,`${o}
|
|
467
|
+
`,"utf-8")}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),s=await _s.readFile(t,"utf-8");return Zd(s)}catch(t){return C(t)||console.warn(`Warning: Could not read global config for ${e}: ${Z(t)}`),null}}async writeGlobalConfig(e,t){let s=A.getGlobalProjectConfigPath(e),r=A.getGlobalProjectPath(e);await _s.mkdir(r,{recursive:!0});let o=JSON.stringify(t,null,2);await _s.writeFile(s,`${o}
|
|
468
|
+
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=v();t={projectId:e,authors:[],version:xe,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=A.generateProjectId(e),r=A.getGlobalProjectPath(s),o=A.getDisplayPath(r),i=v(),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:xe,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=v(),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 r=await this.readConfig(e);if(!r||!r.projectId)return!0;let o=A.getGlobalProjectPath(r.projectId);try{return(await _s.readdir(Ck.join(o,"core"))).length===0}catch(i){return C(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(r=>r.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=v();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 r=s.authors.find(o=>o.github===t);r&&(r.lastActivity=v(),s.lastSync=r.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Sn(),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))}}},Ek=new Ha,$=Ek});import{execFile as xk}from"node:child_process";import Ga from"node:fs/promises";import ep from"node:os";import Va from"node:path";import{promisify as Ak}from"node:util";function Dk(){let n=ye("mcp-config.json");if(!n)return{mcpServers:{context7:Wa}};try{return JSON.parse(n)}catch{return{mcpServers:{context7:Wa}}}}function np(){return Dk().mcpServers?.context7||Wa}function tp(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Va.join(ep.tmpdir(),"prjct-context7-test","mcp.json"):Va.join(ep.homedir(),".claude","mcp.json")}async function sp(n){try{let e=await Ga.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(C(e))return{};throw e}}async function Ik(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let n=np(),e=[...n.args||[],"--help"];await Rk(n.command||"npx",e,{timeout:15e3})}var Rk,Wa,jk,bn,Ba,$k,ns,fr=b(()=>{"use strict";Wt();U();Rk=Ak(xk),Wa={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},jk=300*1e3,bn=null;l(Dk,"parseTemplateConfig");l(np,"getContext7Config");l(tp,"getConfigPath");l(sp,"readConfig");l(Ik,"runSmokeCheck");Ba=class{static{l(this,"Context7Service")}async install(){let e=tp(),t=Va.dirname(e);await Ga.mkdir(t,{recursive:!0});let s=await sp(e),r=s.mcpServers||{};return r.context7=np(),s.mcpServers=r,await Ga.writeFile(e,JSON.stringify(s,null,2),"utf-8"),bn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(bn&&Date.now()-bn.at<jk)return bn.status;let e=tp(),r=((await sp(e)).mcpServers||{}).context7;if(!r?.command||!Array.isArray(r.args)||r.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await Ik();let o={installed:!0,verified:!0,configPath:e};return bn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return bn={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}},$k=new Ba,ns=$k});var vo,Ja=b(()=>{"use strict";vo={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 za(n,e){return{...vo[n],...e}}function To(n,e,t){return{message:n,hint:e,...t}}var Po=b(()=>{"use strict";Ja();Ja();l(za,"getError");l(To,"createError")});import{execSync as qa}from"node:child_process";var Co,Ka,Eo,hr,Xa=b(()=>{"use strict";Po();Co={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"}},Ka=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=Co[e];if(!s)return this.checkUnknownTool(e);let r=this.executeCheck(s);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=Co[e],r=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Eo(r)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(r=>{let o=Co[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
|
|
469
469
|
`);throw new Eo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
470
|
-
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Co),n=new Map;for(let r of t)n.set(r,this.checkTool(r));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=qa(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let r=t.match(e.versionRegex);n=r?r[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:To(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return qa(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qa(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:To(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},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}},hr=new Ka});import{execSync as Mk}from"node:child_process";import Ok from"node:fs/promises";import xo from"node:path";function _k(s){return s.trim().toLowerCase()}async function Nk(s){try{return await Ok.access(s),!0}catch{return!1}}function Fk(){let s=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(s)return s;try{let e=vt.resolve("prjct-cli/package.json");return xo.dirname(e)}catch{return null}}function Lk(){let s=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(s)return s;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return Mk("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"],timeout:5e3}).trim().replace(/\r?\n/g,"")}catch{return null}}function Uk(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||pe}function Hk(){let s=[],e=Fk();e&&s.push({source:"package-resolve",root:e});let t=Lk();return t&&s.push({source:"npm-root-g",root:xo.join(t,"prjct-cli")}),s.push({source:"local-dev",root:Uk()}),s}function Gk(){let e=mn("commands/").filter(t=>t.endsWith(".md")).map(t=>xo.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function rp(s){return s instanceof Error&&typeof s.code=="string"&&typeof s.message=="string"}var yr,Ya,op,ip=b(()=>{"use strict";Wt();Pt();yr=class extends Error{static{l(this,"PCommandResolverError")}code;fix;constructor(e,t,n){super(t),this.name="PCommandResolverError",this.code=e,this.fix=n}};l(_k,"normalizeCommand");l(Nk,"fileExists");l(Fk,"getPackageResolveRoot");l(Lk,"getNpmGlobalRoot");l(Uk,"getLocalDevRoot");l(Hk,"getCandidateRoots");l(Gk,"getCatalogFromTemplates");Ya=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return Gk()}validatePCommand(e){let t=_k(e);return/^[a-z][a-z0-9-]*$/.test(t)?this.getPCommandCatalog().includes(t)?{valid:!0,command:t}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Unknown command: p. ${t}`}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Invalid p. command "${e}"`}}async resolvePCommandTemplate(e){if(this.getPCommandCatalog().length===0)throw new yr("ROUTER_NOT_READY","p. router command catalog is empty",["Run `prjct setup` to reinstall command templates"]);let t=this.validatePCommand(e);if(!t.valid)throw new yr(t.code||"UNKNOWN_COMMAND",t.message||`Unknown command: p. ${t.command}`,[`Use one of: ${this.getPCommandCatalog().join(", ")}`,"Run `prjct setup` to refresh command templates"]);if(!process.env.PRJCT_P_RESOLVER_DISABLE_BUNDLE){let n=`commands/${t.command}.md`;if(ye(n))return{command:t.command,templatePath:n,source:"bundle"}}for(let n of Hk()){let r=xo.join(n.root,"templates","commands",`${t.command}.md`);if(await Nk(r))return{command:t.command,templatePath:r,source:n.source}}throw new yr("TEMPLATE_NOT_FOUND",`Template not found for p. ${t.command}`,["Run `prjct start` to repair Codex skill and command templates","Run `prjct setup` to refresh installation"])}};l(rp,"isPCommandResolveError");op=new Ya});function wr(s){let e=`PRJCT_TIMEOUT_${s}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return Vk[s]}var re,Qa,Za,Ao,Vk,$t,ap,Fn=b(()=>{"use strict";re={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Qa=["feature","spec","design","refactor","migrate"],Za=["ship","cleanup","git","migrate"],Ao=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Vk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(wr,"getTimeout");$t={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},ap={HISTORY_MAX:100}});import vs from"node:fs/promises";import Wk from"node:os";import cp from"node:path";var ec,Bk,Ro,tc=b(()=>{"use strict";U();ec=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Wk.homedir(),this.configDir=cp.join(this.homeDir,".prjct-cli","config"),this.configFile=cp.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await vs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await vs.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let r={version:e,provider:n,lastInstall:new Date().toISOString(),path:t};return await vs.writeFile(this.configFile,JSON.stringify(r,null,2),"utf-8"),!0}catch(r){return console.error("[editors-config] Error saving config:",y(r)),!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 vs.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){try{return await vs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await vs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},Bk=new ec,Ro=Bk});var sc={};un(sc,{installAntigravitySkill:()=>mp,installCodexSkill:()=>nc,needsAntigravityInstallation:()=>Yk,run:()=>pp,verifyCodexPRouterReady:()=>jo});import{execSync as zk}from"node:child_process";import{createHash as Jk}from"node:crypto";import J from"node:fs/promises";import Ln from"node:os";import ee from"node:path";import me from"chalk";async function qk(s){let e=s.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!hr.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${s.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${s.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} ${s.displayName} not found. Installing...`)),console.log(""),zk(`npm install -g ${e}`,{stdio:"inherit",timeout:wr("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${s.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${s.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 ${s.displayName}: ${n.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 ${s.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function pp(){let s=await nr(),e=await Ki(),t=at[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let c=at[a],u=s[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await qk(c))d.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ae.detectActiveProvider()){let p=await Ae.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,n.commandsAdded+=p.added,n.commandsUpdated+=p.updated);let g=await Ae.installGlobalConfig();g.success&&(d.configAction=g.action,n.configAction||(n.configAction=g.action)),await Ae.installDocs(),await tS(),await sn.ensureReady()}}else if(a==="gemini"){await Kk()&&(d.commandsAdded=1,n.commandsAdded+=1);let p=await Xk();p.success&&(d.configAction=p.action)}n.providers.push(d)}if((await to()).installed&&(await mp()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),(await Rn()).installed){if(!(await nc()).success)throw new Error("Codex skill installation failed");let c=await jo({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 Ro.saveConfig(xe,await Ae.getInstallPath(),e.provider),await eS();for(let a of n.providers)nS(a,at[a.provider]);return n}async function Kk(){try{let s=ee.join(Ln.homedir(),".gemini","commands"),e=ee.join(s,"p.toml");await J.mkdir(s,{recursive:!0});let t=ye("commands/p.toml");if(t)return await J.writeFile(e,t,"utf-8"),!0;let n=ee.join(pe,"templates","commands","p.toml");return await D(n)?(await J.copyFile(n,e),!0):!1}catch(s){return H.warn(`Gemini router warning: ${y(s)}`),!1}}async function Xk(){try{let s=ee.join(Ln.homedir(),".gemini"),e=ee.join(s,"GEMINI.md");await J.mkdir(s,{recursive:!0});let t=ye("global/GEMINI.md");if(!t){let p=ee.join(pe,"templates","global","GEMINI.md");t=await J.readFile(p,"utf-8")}let n="",r=!1;try{n=await J.readFile(e,"utf-8"),r=!0}catch(p){if(P(p))r=!1;else throw p}if(!r)return await J.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
|
|
470
|
+
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Co),s=new Map;for(let r of t)s.set(r,this.checkTool(r));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=qa(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let r=t.match(e.versionRegex);s=r?r[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:To(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return qa(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qa(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:To(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},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}},hr=new Ka});import{execSync as Mk}from"node:child_process";import Ok from"node:fs/promises";import xo from"node:path";function _k(n){return n.trim().toLowerCase()}async function Nk(n){try{return await Ok.access(n),!0}catch{return!1}}function Fk(){let n=process.env.PRJCT_P_RESOLVER_PACKAGE_ROOT;if(n)return n;try{let e=vt.resolve("prjct-cli/package.json");return xo.dirname(e)}catch{return null}}function Lk(){let n=process.env.PRJCT_P_RESOLVER_NPM_ROOT;if(n)return n;if(process.env.PRJCT_P_RESOLVER_DISABLE_NPM_ROOT==="1")return null;try{return Mk("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","ignore"],timeout:5e3}).trim().replace(/\r?\n/g,"")}catch{return null}}function Uk(){return process.env.PRJCT_P_RESOLVER_LOCAL_ROOT||pe}function Hk(){let n=[],e=Fk();e&&n.push({source:"package-resolve",root:e});let t=Lk();return t&&n.push({source:"npm-root-g",root:xo.join(t,"prjct-cli")}),n.push({source:"local-dev",root:Uk()}),n}function Gk(){let e=ps("commands/").filter(t=>t.endsWith(".md")).map(t=>xo.basename(t,".md")).filter(t=>t!=="p");return Array.from(new Set(e)).sort()}function rp(n){return n instanceof Error&&typeof n.code=="string"&&typeof n.message=="string"}var yr,Ya,op,ip=b(()=>{"use strict";Wt();Pt();yr=class extends Error{static{l(this,"PCommandResolverError")}code;fix;constructor(e,t,s){super(t),this.name="PCommandResolverError",this.code=e,this.fix=s}};l(_k,"normalizeCommand");l(Nk,"fileExists");l(Fk,"getPackageResolveRoot");l(Lk,"getNpmGlobalRoot");l(Uk,"getLocalDevRoot");l(Hk,"getCandidateRoots");l(Gk,"getCatalogFromTemplates");Ya=class{static{l(this,"PCommandResolver")}getPCommandCatalog(){return Gk()}validatePCommand(e){let t=_k(e);return/^[a-z][a-z0-9-]*$/.test(t)?this.getPCommandCatalog().includes(t)?{valid:!0,command:t}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Unknown command: p. ${t}`}:{valid:!1,command:t,code:"UNKNOWN_COMMAND",message:`Invalid p. command "${e}"`}}async resolvePCommandTemplate(e){if(this.getPCommandCatalog().length===0)throw new yr("ROUTER_NOT_READY","p. router command catalog is empty",["Run `prjct setup` to reinstall command templates"]);let t=this.validatePCommand(e);if(!t.valid)throw new yr(t.code||"UNKNOWN_COMMAND",t.message||`Unknown command: p. ${t.command}`,[`Use one of: ${this.getPCommandCatalog().join(", ")}`,"Run `prjct setup` to refresh command templates"]);if(!process.env.PRJCT_P_RESOLVER_DISABLE_BUNDLE){let s=`commands/${t.command}.md`;if(ye(s))return{command:t.command,templatePath:s,source:"bundle"}}for(let s of Hk()){let r=xo.join(s.root,"templates","commands",`${t.command}.md`);if(await Nk(r))return{command:t.command,templatePath:r,source:s.source}}throw new yr("TEMPLATE_NOT_FOUND",`Template not found for p. ${t.command}`,["Run `prjct start` to repair Codex skill and command templates","Run `prjct setup` to refresh installation"])}};l(rp,"isPCommandResolveError");op=new Ya});function wr(n){let e=`PRJCT_TIMEOUT_${n}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return Vk[n]}var re,Qa,Za,Ao,Vk,$t,ap,Ns=b(()=>{"use strict";re={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Qa=["feature","spec","design","refactor","migrate"],Za=["ship","cleanup","git","migrate"],Ao=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Vk={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(wr,"getTimeout");$t={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},ap={HISTORY_MAX:100}});import vn from"node:fs/promises";import Wk from"node:os";import cp from"node:path";var ec,Bk,Ro,tc=b(()=>{"use strict";U();ec=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Wk.homedir(),this.configDir=cp.join(this.homeDir,".prjct-cli","config"),this.configFile=cp.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await vn.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await vn.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 r={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await vn.writeFile(this.configFile,JSON.stringify(r,null,2),"utf-8"),!0}catch(r){return console.error("[editors-config] Error saving config:",y(r)),!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 vn.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){try{return await vn.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await vn.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},Bk=new ec,Ro=Bk});var nc={};ls(nc,{installAntigravitySkill:()=>mp,installCodexSkill:()=>sc,needsAntigravityInstallation:()=>Yk,run:()=>pp,verifyCodexPRouterReady:()=>Do});import{execSync as Jk}from"node:child_process";import{createHash as zk}from"node:crypto";import z from"node:fs/promises";import Fs from"node:os";import ee from"node:path";import me from"chalk";async function qk(n){let e=n.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!hr.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${n.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${n.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} ${n.displayName} not found. Installing...`)),console.log(""),Jk(`npm install -g ${e}`,{stdio:"inherit",timeout:wr("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${n.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 ${n.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 ${n.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 ${n.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function pp(){let n=await sr(),e=await Ki(),t=at[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let c=at[a],u=n[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await qk(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ae.detectActiveProvider()){let p=await Ae.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,s.commandsAdded+=p.added,s.commandsUpdated+=p.updated);let g=await Ae.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Ae.installDocs(),await tS(),await ns.ensureReady()}}else if(a==="gemini"){await Kk()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await Xk();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await to()).installed&&(await mp()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),(await As()).installed){if(!(await sc()).success)throw new Error("Codex skill installation failed");let c=await Do({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 Ro.saveConfig(xe,await Ae.getInstallPath(),e.provider),await eS();for(let a of s.providers)sS(a,at[a.provider]);return s}async function Kk(){try{let n=ee.join(Fs.homedir(),".gemini","commands"),e=ee.join(n,"p.toml");await z.mkdir(n,{recursive:!0});let t=ye("commands/p.toml");if(t)return await z.writeFile(e,t,"utf-8"),!0;let s=ee.join(pe,"templates","commands","p.toml");return await j(s)?(await z.copyFile(s,e),!0):!1}catch(n){return H.warn(`Gemini router warning: ${y(n)}`),!1}}async function Xk(){try{let n=ee.join(Fs.homedir(),".gemini"),e=ee.join(n,"GEMINI.md");await z.mkdir(n,{recursive:!0});let t=ye("global/GEMINI.md");if(!t){let p=ee.join(pe,"templates","global","GEMINI.md");t=await z.readFile(p,"utf-8")}let s="",r=!1;try{s=await z.readFile(e,"utf-8"),r=!0}catch(p){if(C(p))r=!1;else throw p}if(!r)return await z.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(s.includes(o)&&s.includes(i))){let p=`${s}
|
|
471
471
|
|
|
472
|
-
${t}`;return await
|
|
472
|
+
${t}`;return await z.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=s.substring(0,s.indexOf(o)),u=s.substring(s.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await z.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(n){return H.warn(`Gemini config warning: ${y(n)}`),{success:!1,action:null}}}async function mp(){try{let n=ee.join(Fs.homedir(),".gemini","antigravity","skills"),e=ee.join(n,"prjct"),t=ee.join(e,"SKILL.md");await z.mkdir(e,{recursive:!0});let s=await j(t),r=ye("antigravity/SKILL.md");if(!r){let o=ee.join(pe,"templates","antigravity","SKILL.md");if(!await j(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await z.readFile(o,"utf-8")}return await z.writeFile(t,r,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(n){return H.warn(`Antigravity skill warning: ${y(n)}`),{success:!1,action:null}}}async function Yk(){let n=await to();return n.installed&&!n.skillInstalled}function fp(){return ee.join(Fs.homedir(),".codex","skills","prjct","SKILL.md")}function Qk(n){return`<!-- ${gp}: ${JSON.stringify({version:xe,templateHash:n})} -->`}function lp(n){let e=n.match(new RegExp(`<!--\\s*${gp}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Zk(n){return zk("sha256").update(n).digest("hex")}async function hp(){let n=ye("codex/SKILL.md");if(n)return n;let e=ee.join(pe,"templates","codex","SKILL.md");return await j(e)?z.readFile(e,"utf-8"):null}function yp(n){let e=n.trimEnd(),t=Zk(e),s=Qk(t);return{content:`${e}
|
|
473
473
|
|
|
474
|
-
${
|
|
475
|
-
`,templateHash:t}}async function
|
|
474
|
+
${s}
|
|
475
|
+
`,templateHash:t}}async function sc(){try{let n=fp(),e=ee.dirname(n);await z.mkdir(e,{recursive:!0});let t=await j(n),s=await hp();if(!s)return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=yp(s);return t&&await z.readFile(n,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await z.writeFile(n,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(n){return H.warn(`Codex skill warning: ${y(n)}`),{success:!1,action:null}}}async function Do(n={}){let e=fp();if(!(await As()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await hp();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 r=yp(s),o=l(async()=>n.autoRepair?(await sc()).success:!1,"maybeRepair"),i="";if(!await j(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await z.readFile(e,"utf-8").catch(()=>"");let a=lp(i);if(!(a?.version===xe&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await z.readFile(e,"utf-8").catch(()=>""),a=lp(i),!(a?.version===xe&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}try{let u=await op.resolvePCommandTemplate("sync");return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,command:u.command,templatePath:u.templatePath,templateSource:u.source,message:"Codex p. router ready"}}catch(u){let d=rp(u)?u.fix:["Run `prjct setup` to repair command template routing"];return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:u instanceof Error?u.message:"Failed to resolve p. sync template",fix:d}}}async function eS(){try{let n=ee.join(Fs.homedir(),".prjct-cli","projects");if(!await j(n))return;let e=(await z.readdir(n,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let r=x.getDoc(s,"project");if(!r)continue;r.cliVersion!==xe&&(r.cliVersion=xe,x.setDoc(s,"project",r),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${xe}`)}catch(n){C(n)||H.warn(`Migration warning: ${y(n)}`)}}async function up(n,e){let t={};if(await j(n))try{t=JSON.parse(await z.readFile(n,"utf8"))}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await z.writeFile(n,JSON.stringify(t,null,2))}async function tS(){try{let n=ee.join(Fs.homedir(),".claude"),e=ee.join(n,"settings.json"),t=ee.join(n,"prjct-statusline.sh"),s=ee.join(Fs.homedir(),".prjct-cli","statusline"),r=ee.join(s,"statusline.sh"),o=ee.join(s,"themes"),i=ee.join(s,"lib"),a=ee.join(s,"components"),c=ee.join(s,"config.json"),u=ee.join(pe,"assets","statusline"),d=ee.join(u,"statusline.sh"),m=ee.join(u,"themes"),p=ee.join(u,"lib"),g=ee.join(u,"components"),f=ee.join(u,"default-config.json");if(await j(n)||await z.mkdir(n,{recursive:!0}),await j(s)||await z.mkdir(s,{recursive:!0}),await j(o)||await z.mkdir(o,{recursive:!0}),await j(i)||await z.mkdir(i,{recursive:!0}),await j(a)||await z.mkdir(a,{recursive:!0}),await j(r)){let k=await z.readFile(r,"utf8");if(k.includes("CLI_VERSION=")){let w=k.match(/CLI_VERSION="([^"]*)"/);if(w&&w[1]!==xe){let E=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${xe}"`);await z.writeFile(r,E,{mode:493})}await jo(p,i),await jo(g,a),await dp(t,r),await up(e,t);return}}if(await j(d)){let k=await z.readFile(d,"utf8");if(k=k.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${xe}"`),await z.writeFile(r,k,{mode:493}),await jo(p,i),await jo(g,a),await j(m)){let w=await z.readdir(m);for(let E of w){let T=ee.join(m,E),O=ee.join(o,E);await z.copyFile(T,O)}}!await j(c)&&await j(f)&&await z.copyFile(f,c)}else{let k=`#!/bin/bash
|
|
476
476
|
# prjct Status Line for Claude Code
|
|
477
477
|
CLI_VERSION="${xe}"
|
|
478
478
|
input=$(cat)
|
|
@@ -503,7 +503,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
503
503
|
fi
|
|
504
504
|
fi
|
|
505
505
|
echo "prjct"
|
|
506
|
-
`;await J.writeFile(r,k,{mode:493})}await dp(t,r),await up(e,t)}catch(s){P(s)||H.warn(`Status line warning: ${y(s)}`)}}async function Do(s,e){if(!await D(s))return;let t=await J.readdir(s);for(let n of t)if(n.endsWith(".sh")){let r=ee.join(s,n),o=ee.join(e,n);await J.copyFile(r,o),await J.chmod(o,493)}}async function dp(s,e){try{if(await D(s)){if((await J.lstat(s)).isSymbolicLink()&&await J.readlink(s)===e)return;await J.unlink(s)}await J.symlink(e,s)}catch{try{await D(e)&&(await J.copyFile(e,s),await J.chmod(s,493))}catch(n){P(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function nS(s,e){if(console.log(""),s.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),s.commandsAdded+s.commandsUpdated>0){let n=[];s.commandsAdded>0&&n.push(`${s.commandsAdded} new`),s.commandsUpdated>0&&n.push(`${s.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var gp,sS,Io=b(()=>{"use strict";Wt();fr();Xa();ip();se();U();Fn();We();hn();Pt();Be();Qt();tc();l(qk,"installAICLI");l(pp,"run");l(Kk,"installGeminiRouter");l(Xk,"installGeminiGlobalConfig");l(mp,"installAntigravitySkill");l(Yk,"needsAntigravityInstallation");gp="prjct-codex-router";l(fp,"getCodexSkillPath");l(Qk,"getCodexSkillMetadata");l(lp,"parseCodexSkillMetadata");l(Zk,"hashContent");l(hp,"loadCodexSkillTemplate");l(yp,"buildCodexSkillContent");l(nc,"installCodexSkill");l(jo,"verifyCodexPRouterReady");l(eS,"migrateProjectsCliVersion");l(up,"ensureStatusLineSettings");l(tS,"installStatusLine");l(Do,"installStatusLineModules");l(dp,"ensureStatusLineSymlink");l(nS,"showResults");sS=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");sS&&pp().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});import{z as W}from"zod";var rS,oS,wp,iS,aS,cS,lS,uS,kp,vj,Sp=b(()=>{"use strict";rS=W.enum(["low","medium","high"]),oS=W.enum(["pending","converted","completed","archived","dormant"]),wp=W.enum(["high","medium","low"]),iS=W.object({impact:wp,effort:wp}),aS=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),cS=W.object({name:W.string(),description:W.string()}),lS=W.object({name:W.string(),description:W.string().optional()}),uS=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:rS,status:oS,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:iS.optional(),implementationNotes:W.string().optional(),stack:aS.optional(),modules:W.array(cS).optional(),roles:W.array(lS).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),kp=W.object({ideas:W.array(uS),lastUpdated:W.string()}),vj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var rc,nt,Un=b(()=>{"use strict";Sp();Tt();fe();_n();Zt();rc=class extends Je{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",kp)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let r={id:he(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:v()}))}async addTags(e,t,n){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(r=>r.id!==t),lastUpdated:v()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let r=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.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:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=dn(en.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(r.length===0)return 0;Ct.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},nt=new rc});var oc,Ts,ic=b(()=>{"use strict";po();fe();Zt();oc=class extends Je{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Zu)}getDefault(){return{...ed}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,m=[...i.dailyStats],p=m.findIndex(C=>C.date===o);if(p>=0){let C=m[p];m[p]={...C,tokensSaved:C.tokensSaved+n,syncs:C.syncs+1,avgCompressionRate:(C.avgCompressionRate*C.syncs+r)/(C.syncs+1),totalDuration:C.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(C=>C.date>=f),w=[...i.agentUsage];if(t.agents)for(let C of t.agents){let T=w.findIndex(O=>O.agentName===C);T>=0?w[T]={...w[T],usageCount:w[T].usageCount+1,tokensSaved:w[T].tokensSaved+Math.floor(n/t.agents.length)}:w.push({agentName:C,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:w,dailyStats:k,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=r.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:td(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let n=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(r=>r.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let r=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},Ts=new oc});import X from"node:fs/promises";import K from"node:path";async function $o(s){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(x.exists(s)&&x.hasDoc(s,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=A.getGlobalProjectPath(s),r=K.join(n,"storage"),o=K.join(n,"index"),i=K.join(n,"memory");t.backupDir=await dS(r,o,i),x.getDb(s);for(let{filename:c,key:u}of lc){let d=K.join(r,c),m=await Mt(d);if(m===null){t.skippedFiles.push(c);continue}try{x.setDoc(s,u,m),bp(s,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of cc){let d=K.join(o,c),m=await Mt(d);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{x.run(s,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),vp(s,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await kS(s,o,t),await SS(s,o,t),await bS(s,i,t),await vS(s,i,t);let a=K.join(n,"sessions");return await TS(s,a,t),t.errors.length===0&&await PS(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function dS(s,e,t){let n=K.join(s,"backup");return await X.mkdir(n,{recursive:!0}),await X.mkdir(K.join(n,"index"),{recursive:!0}),await X.mkdir(K.join(n,"memory"),{recursive:!0}),await ac(s,n,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await ac(e,K.join(n,"index")),await ac(t,K.join(n,"memory")),n}async function ac(s,e,t){try{let n=await X.readdir(s,{withFileTypes:!0});for(let r of n){if(!r.isFile()||t&&!t(r.name))continue;let o=K.join(s,r.name),i=K.join(e,r.name);await X.copyFile(o,i)}}catch(n){if(!P(n))throw n}}function bp(s,e,t){switch(e){case"state":pS(s,t);break;case"queue":mS(s,t);break;case"ideas":gS(s,t);break;case"shipped":fS(s,t);break;case"metrics":hS(s,t);break;case"analysis":yS(s,t);break}}function pS(s,e){let t=x.getDb(s),n=t.prepare(`
|
|
506
|
+
`;await z.writeFile(r,k,{mode:493})}await dp(t,r),await up(e,t)}catch(n){C(n)||H.warn(`Status line warning: ${y(n)}`)}}async function jo(n,e){if(!await j(n))return;let t=await z.readdir(n);for(let s of t)if(s.endsWith(".sh")){let r=ee.join(n,s),o=ee.join(e,s);await z.copyFile(r,o),await z.chmod(o,493)}}async function dp(n,e){try{if(await j(n)){if((await z.lstat(n)).isSymbolicLink()&&await z.readlink(n)===e)return;await z.unlink(n)}await z.symlink(e,n)}catch{try{await j(e)&&(await z.copyFile(e,n),await z.chmod(n,493))}catch(s){C(s)||H.warn(`Symlink fallback warning: ${s.message}`)}}}function sS(n,e){if(console.log(""),n.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),n.commandsAdded+n.commandsUpdated>0){let s=[];n.commandsAdded>0&&s.push(`${n.commandsAdded} new`),n.commandsUpdated>0&&s.push(`${n.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);n.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):n.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):n.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var gp,nS,Io=b(()=>{"use strict";Wt();fr();Xa();ip();ne();U();Ns();We();fs();Pt();Be();Qt();tc();l(qk,"installAICLI");l(pp,"run");l(Kk,"installGeminiRouter");l(Xk,"installGeminiGlobalConfig");l(mp,"installAntigravitySkill");l(Yk,"needsAntigravityInstallation");gp="prjct-codex-router";l(fp,"getCodexSkillPath");l(Qk,"getCodexSkillMetadata");l(lp,"parseCodexSkillMetadata");l(Zk,"hashContent");l(hp,"loadCodexSkillTemplate");l(yp,"buildCodexSkillContent");l(sc,"installCodexSkill");l(Do,"verifyCodexPRouterReady");l(eS,"migrateProjectsCliVersion");l(up,"ensureStatusLineSettings");l(tS,"installStatusLine");l(jo,"installStatusLineModules");l(dp,"ensureStatusLineSymlink");l(sS,"showResults");nS=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");nS&&pp().catch(n=>{console.error("Setup error:",n.message),process.exit(1)})});import{z as W}from"zod";var rS,oS,wp,iS,aS,cS,lS,uS,kp,vD,Sp=b(()=>{"use strict";rS=W.enum(["low","medium","high"]),oS=W.enum(["pending","converted","completed","archived","dormant"]),wp=W.enum(["high","medium","low"]),iS=W.object({impact:wp,effort:wp}),aS=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),cS=W.object({name:W.string(),description:W.string()}),lS=W.object({name:W.string(),description:W.string().optional()}),uS=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:rS,status:oS,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:iS.optional(),implementationNotes:W.string().optional(),stack:aS.optional(),modules:W.array(cS).optional(),roles:W.array(lS).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),kp=W.object({ideas:W.array(uS),lastUpdated:W.string()}),vD={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var rc,st,Ls=b(()=>{"use strict";Sp();Tt();fe();Os();Zt();rc=class extends ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",kp)}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 r={id:he(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(r=>r.id!==t),lastUpdated:v()}))}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 r=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.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:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=us(es.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(r.length===0)return 0;Ct.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},st=new rc});var oc,Tn,ic=b(()=>{"use strict";po();fe();Zt();oc=class extends ze{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Zu)}getDefault(){return{...ed}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),r=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?r:(i.avgCompressionRate*i.syncCount+r)/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+r)/(E.syncs+1),totalDuration:E.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],k=m.filter(E=>E.date>=f),w=[...i.agentUsage];if(t.agents)for(let E of t.agents){let T=w.findIndex(O=>O.agentName===E);T>=0?w[T]={...w[T],usageCount:w[T].usageCount+1,tokensSaved:w[T].tokensSaved+Math.floor(s/t.agents.length)}:w.push({agentName:E,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:w,dailyStats:k,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=r.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:td(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),r=new Date;r.setDate(r.getDate()-t);let o=r.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(r=>r.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let r=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},Tn=new oc});import X from"node:fs/promises";import K from"node:path";async function $o(n){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(x.exists(n)&&x.hasDoc(n,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(n),r=K.join(s,"storage"),o=K.join(s,"index"),i=K.join(s,"memory");t.backupDir=await dS(r,o,i),x.getDb(n);for(let{filename:c,key:u}of lc){let d=K.join(r,c),m=await Mt(d);if(m===null){t.skippedFiles.push(c);continue}try{x.setDoc(n,u,m),bp(n,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of cc){let d=K.join(o,c),m=await Mt(d);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{x.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),vp(n,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await kS(n,o,t),await SS(n,o,t),await bS(n,i,t),await vS(n,i,t);let a=K.join(s,"sessions");return await TS(n,a,t),t.errors.length===0&&await PS(r,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 dS(n,e,t){let s=K.join(n,"backup");return await X.mkdir(s,{recursive:!0}),await X.mkdir(K.join(s,"index"),{recursive:!0}),await X.mkdir(K.join(s,"memory"),{recursive:!0}),await ac(n,s,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await ac(e,K.join(s,"index")),await ac(t,K.join(s,"memory")),s}async function ac(n,e,t){try{let s=await X.readdir(n,{withFileTypes:!0});for(let r of s){if(!r.isFile()||t&&!t(r.name))continue;let o=K.join(n,r.name),i=K.join(e,r.name);await X.copyFile(o,i)}}catch(s){if(!C(s))throw s}}function bp(n,e,t){switch(e){case"state":pS(n,t);break;case"queue":mS(n,t);break;case"ideas":gS(n,t);break;case"shipped":fS(n,t);break;case"metrics":hS(n,t);break;case"analysis":yS(n,t);break}}function pS(n,e){let t=x.getDb(n),s=t.prepare(`
|
|
507
507
|
INSERT OR REPLACE INTO tasks
|
|
508
508
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
509
509
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -514,115 +514,115 @@ echo "prjct"
|
|
|
514
514
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
515
515
|
depends_on, started_at, completed_at, output, summary)
|
|
516
516
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
517
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;
|
|
517
|
+
`),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];r.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 mS(n,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
|
|
518
518
|
INSERT OR REPLACE INTO queue_tasks
|
|
519
519
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
520
520
|
feature_id, feature_name)
|
|
521
521
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
522
|
-
`);for(let o of t)r.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 gS(
|
|
522
|
+
`);for(let o of t)r.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 gS(n,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
|
|
523
523
|
INSERT OR REPLACE INTO ideas
|
|
524
524
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
525
525
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
526
|
-
`);for(let o of t)r.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 fS(
|
|
526
|
+
`);for(let o of t)r.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 fS(n,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
|
|
527
527
|
INSERT OR REPLACE INTO shipped_features
|
|
528
528
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
529
529
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
530
|
-
`);for(let o of t)r.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 hS(
|
|
530
|
+
`);for(let o of t)r.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 hS(n,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
|
|
531
531
|
INSERT OR REPLACE INTO metrics_daily
|
|
532
532
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
533
533
|
VALUES (?, ?, ?, ?, ?)
|
|
534
|
-
`);for(let o of t)r.run(I(o.date)??new Date().toISOString().slice(0,10),
|
|
534
|
+
`);for(let o of t)r.run(I(o.date)??new Date().toISOString().slice(0,10),hs(o.tokensSaved)??0,hs(o.syncs)??0,hs(o.avgCompressionRate)??0,hs(o.totalDuration)??0)}function yS(n,e){let s=x.getDb(n).prepare(`
|
|
535
535
|
INSERT OR REPLACE INTO analysis
|
|
536
536
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
537
537
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
538
|
-
`),r=l((o,i)=>{o&&
|
|
538
|
+
`),r=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&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function vp(n,e,t){e==="categories-cache"&&wS(n,t)}function wS(n,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=x.getDb(n).prepare(`
|
|
539
539
|
INSERT OR REPLACE INTO index_files
|
|
540
540
|
(path, categories, domain, score, size, mtime, language)
|
|
541
541
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
542
|
-
`);for(let o of t){let i=I(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,I(o.primaryDomain),i)}}async function kS(
|
|
542
|
+
`);for(let o of t){let i=I(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,I(o.primaryDomain),i)}}async function kS(n,e,t){let s=K.join(e,"checksums.json"),r=await Mt(s);if(r===null){t.skippedFiles.push("index/checksums.json");return}try{let o=r.checksums;if(!o)return;let i=x.getDb(n),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 SS(n,e,t){let s=K.join(e,"file-scores.json"),r=await Mt(s);if(r===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=r.scores;if(!o||!Array.isArray(o))return;let i=x.getDb(n),a=i.prepare(`
|
|
543
543
|
INSERT OR REPLACE INTO index_files
|
|
544
544
|
(path, score, size, mtime, language, categories, domain)
|
|
545
545
|
VALUES (?, ?, ?, ?, NULL,
|
|
546
546
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
547
547
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
548
|
-
`);i.transaction(()=>{for(let c of o){let u=I(c.path);u&&a.run(u,
|
|
549
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=x.getDb(
|
|
550
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=x.getDb(
|
|
548
|
+
`);i.transaction(()=>{for(let c of o){let u=I(c.path);u&&a.run(u,hs(c.score)??0,hs(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 bS(n,e,t){let s=K.join(e,"events.jsonl");try{let o=(await X.readFile(s,"utf-8")).split(`
|
|
549
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=x.getDb(n),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(r){C(r)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(r)})}}async function vS(n,e,t){let s=K.join(e,"learnings.jsonl");try{let o=(await X.readFile(s,"utf-8")).split(`
|
|
550
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=x.getDb(n),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(r){C(r)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(r)})}}async function TS(n,e,t){let r=x.getDb(n).prepare(`
|
|
551
551
|
INSERT OR IGNORE INTO sessions
|
|
552
552
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
553
553
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
554
|
-
`),o=l(u=>{!u||!u.id||r.run(I(u.id),I(u.projectId)??
|
|
555
|
-
`).filter(O=>O.trim());if(
|
|
554
|
+
`),o=l(u=>{!u||!u.id||r.run(I(u.id),I(u.projectId)??n,I(u.task)??"",I(u.status)??"completed",I(u.startedAt)??new Date().toISOString(),I(u.pausedAt),I(u.completedAt),hs(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=K.join(e,"current.json"),a=await Mt(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await X.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=K.join(e,"archive");try{let u=await X.readdir(c);for(let m of u){let p=K.join(c,m);try{if(!(await X.stat(p)).isDirectory())continue;let f=await X.readdir(p);for(let w of f){if(!w.endsWith(".json"))continue;let E=K.join(p,w),T=await Mt(E);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${m}/${w}`),await X.unlink(E).catch(()=>{})}catch(O){t.errors.push({file:`sessions/archive/${m}/${w}`,error:String(O)})}}(await X.readdir(p)).length===0&&await X.rmdir(p).catch(()=>{})}catch{}}(await X.readdir(c).catch(()=>[])).length===0&&await X.rmdir(c).catch(()=>{})}catch{}try{(await X.readdir(e)).length===0&&await X.rmdir(e).catch(()=>{})}catch{}}async function PS(n,e,t,s){let r=l(async(i,a)=>{try{await X.unlink(i)}catch(c){C(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of lc)await r(K.join(n,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(K.join(e,i),`cleanup:index/${i}`);await r(K.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(K.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function I(n){return n==null?null:typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):JSON.stringify(n)}function hs(n){if(n==null)return null;if(typeof n=="number")return n;if(typeof n=="string"){let e=Number(n);return Number.isNaN(e)?null:e}return null}async function Mt(n){try{let e=await X.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(C(e)||e instanceof SyntaxError)return null;throw e}}async function Mo(n){let e=A.getGlobalProjectPath(n),t=K.join(e,"storage"),s=0;x.getDb(n);for(let{filename:f,key:k}of lc){let w=K.join(t,f),E=await Mt(w);if(E!==null){x.setDoc(n,k,E),bp(n,k,E);try{await X.unlink(w)}catch{}s++}}let r=K.join(e,"project.json"),o=await Mt(r);if(o!==null){x.setDoc(n,"project",o);try{await X.unlink(r)}catch{}s++}let i=K.join(e,"memory");for(let f of["events.jsonl","learnings.jsonl"]){let k=K.join(i,f);try{let E=(await X.readFile(k,"utf-8")).split(`
|
|
555
|
+
`).filter(O=>O.trim());if(E.length===0){await X.unlink(k),s++;continue}let T=x.getDb(n);if(f==="events.jsonl"){let O=T.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");T.transaction(()=>{for(let G of E)try{let Q=JSON.parse(G);O.run(I(Q.type??Q.action)??"unknown",I(Q.taskId??Q.task_id),G,I(Q.timestamp??Q.ts)??new Date().toISOString())}catch{}})()}else{let O=T.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");T.transaction(()=>{for(let G of E)try{let Q=JSON.parse(G),se=`learning:${I(Q.taskId??Q.timestamp)??Date.now()}`,S=Q.tags;O.run(se,I(S?.[0]),G,1,I(Q.timestamp)??new Date().toISOString())}catch{}})()}await X.unlink(k),s++}catch{}}let a=K.join(e,"sessions"),c=l(f=>{if(!f||!f.id)return;x.getDb(n).prepare(`
|
|
556
556
|
INSERT OR IGNORE INTO sessions
|
|
557
557
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
558
558
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
559
|
-
`).run(I(f.id),I(f.projectId)??
|
|
559
|
+
`).run(I(f.id),I(f.projectId)??n,I(f.task)??"",I(f.status)??"completed",I(f.startedAt)??new Date().toISOString(),I(f.pausedAt),I(f.completedAt),hs(f.duration)??0,f.metrics?JSON.stringify(f.metrics):"{}",f.timeline?JSON.stringify(f.timeline):"[]")},"sessionInsert"),u=K.join(a,"current.json"),d=await Mt(u);d!==null&&(c(d),await X.unlink(u).catch(()=>{}),s++);let m=K.join(a,"archive");try{let f=await X.readdir(m);for(let w of f){let E=K.join(m,w);try{if(!(await X.stat(E)).isDirectory())continue;let O=await X.readdir(E);for(let Q of O){if(!Q.endsWith(".json"))continue;let se=await Mt(K.join(E,Q));se!==null&&(c(se),await X.unlink(K.join(E,Q)).catch(()=>{}),s++)}(await X.readdir(E)).length===0&&await X.rmdir(E).catch(()=>{})}catch{}}(await X.readdir(m).catch(()=>[])).length===0&&await X.rmdir(m).catch(()=>{})}catch{}try{(await X.readdir(a)).length===0&&await X.rmdir(a).catch(()=>{})}catch{}let p=K.join(e,"index"),g=[...cc.map(f=>f.filename),"checksums.json","file-scores.json"];for(let f of g){let k=K.join(p,f),w=await Mt(k);if(w===null)continue;let E=cc.find(T=>T.filename===f);E&&(x.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(w),new Date().toISOString()),vp(n,E.key,w));try{await X.unlink(k)}catch{}s++}return s}var lc,cc,uc=b(()=>{"use strict";Se();U();ne();lc=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],cc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l($o,"migrateJsonToSqlite");l(dS,"createBackup");l(ac,"copyFiles");l(bp,"populateNormalized");l(pS,"populateTasksFromState");l(mS,"populateQueueTasks");l(gS,"populateIdeas");l(fS,"populateShippedFeatures");l(hS,"populateMetricsDaily");l(yS,"populateAnalysis");l(vp,"populateIndexTables");l(wS,"populateCategoriesIndex");l(kS,"migrateChecksums");l(SS,"migrateFileScores");l(bS,"migrateEventsJsonl");l(vS,"migrateLearningsJsonl");l(TS,"migrateSessionFiles");l(PS,"cleanupJsonFiles");l(I,"toStr");l(hs,"toNum");l(Mt,"readJsonSafe");l(Mo,"sweepLegacyJson")});function Cp(n){return[...n].sort((e,t)=>{let s=Pp[e.section]-Pp[t.section];return s!==0?s:Tp[e.priority]-Tp[t.priority]})}var Tp,Pp,Ep=b(()=>{"use strict";Tp={critical:0,high:1,medium:2,low:3},Pp={active:0,previously_active:1,backlog:2};l(Cp,"sortBySectionAndPriority")});var dc,Oe,rs=b(()=>{"use strict";Tt();Pa();Ep();fe();Os();Zt();dc=class extends ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",Td)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(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 Cp(t)[0]||null}async addTask(e,t){let s={...t,id:he(),createdAt:v(),completed:!1};return await this.update(e,r=>({tasks:[...r.tasks,s],lastUpdated:v()})),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=v(),r=t.map(o=>({...o,id:he(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(r=>r.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let r=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=us(es.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(r.length===0)return 0;Ct.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},Oe=new dc});import{z as Y}from"zod";var CS,xp,ES,xS,AS,RS,jS,DS,IS,Ap,Rp=b(()=>{"use strict";CS=Y.enum(["feature","fix","improvement","refactor"]),xp=Y.enum(["pass","warning","fail","skipped"]),ES=Y.enum(["added","changed","fixed","removed"]),xS=Y.object({hours:Y.number(),minutes:Y.number(),totalMinutes:Y.number()}),AS=Y.object({filesChanged:Y.number().nullable().optional(),linesAdded:Y.number().nullable().optional(),linesRemoved:Y.number().nullable().optional(),commits:Y.number().nullable().optional()}),RS=Y.object({description:Y.string(),type:ES.optional()}),jS=Y.object({lintStatus:xp.nullable().optional(),lintDetails:Y.string().optional(),testStatus:xp.nullable().optional(),testDetails:Y.string().optional()}),DS=Y.object({hash:Y.string().optional(),message:Y.string().optional(),branch:Y.string().optional()}),IS=Y.object({id:Y.string(),name:Y.string(),version:Y.string().nullable().optional(),type:CS,agent:Y.string().optional(),description:Y.string().optional(),changes:Y.array(RS).optional(),codeSnippets:Y.array(Y.string()).optional(),commit:DS.optional(),codeMetrics:AS.optional(),qualityMetrics:jS.optional(),quantitativeImpact:Y.string().optional(),duration:xS.optional(),tasksCompleted:Y.number().nullable().optional(),shippedAt:Y.string(),featureId:Y.string().optional()}),Ap=Y.object({shipped:Y.array(IS),lastUpdated:Y.string()})});var pc,ht,Pn=b(()=>{"use strict";Tt();Rp();fe();Os();Zt();pc=class extends ze{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((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:he(),shippedAt:v()};return await this.update(e,r=>({shipped:[s,...r.shipped],lastUpdated:v()})),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(r=>r.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,r;switch(t){case"week":r=new Date(s.getTime()-10080*60*1e3);break;case"month":r=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":r=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=us(es.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(r.length===0)return 0;Ct.archiveMany(e,r.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:v()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},ht=new pc});function $S(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function MS(n){let e=[],t=$S(),s,r=0;for(;(s=t.exec(n))!==null;){let o=s.index,i=s[0],a=s[1]||`section-${r++}`,c=n.indexOf(mc,o+i.length);if(c===-1)continue;let u=c+mc.length,d=n.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function jp(n,e){let t=MS(e);if(t.length===0)return n;let s=n.trimEnd();s+=`
|
|
560
560
|
|
|
561
561
|
---
|
|
562
562
|
|
|
563
|
-
`,
|
|
563
|
+
`,s+=`## Your Customizations
|
|
564
564
|
|
|
565
|
-
`,
|
|
565
|
+
`,s+=`_The sections below are preserved during sync. Edit freely._
|
|
566
566
|
|
|
567
|
-
`;for(let r of t)
|
|
567
|
+
`;for(let r of t)s+=r.content,s+=`
|
|
568
568
|
|
|
569
|
-
`;return`${
|
|
570
|
-
`}function
|
|
571
|
-
`);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(r++,o=Math.max(o,r)),c.includes(mc)&&r--,r>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),r<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var mc,Ip=b(()=>{"use strict";mc="<!-- /prjct:preserve -->";l($S,"createPreserveStartRegex");l(MS,"extractPreservedSections");l(
|
|
572
|
-
`)),t.push("")),
|
|
573
|
-
`)),t.push("")),
|
|
569
|
+
`;return`${s.trimEnd()}
|
|
570
|
+
`}function Dp(n){let e=[],t=n.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],s=n.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==s.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${s.length} closing`);let r=0,o=0,i=n.split(`
|
|
571
|
+
`);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(r++,o=Math.max(o,r)),c.includes(mc)&&r--,r>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),r<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var mc,Ip=b(()=>{"use strict";mc="<!-- /prjct:preserve -->";l($S,"createPreserveStartRegex");l(MS,"extractPreservedSections");l(jp,"mergePreservedSections");l(Dp,"validatePreserveBlocks")});function xt(n){return`<!-- source: ${n.file}, ${n.type} -->`}function Us(){let n={file:"unknown",type:"detected"};return{name:{...n},version:{...n},ecosystem:{...n},languages:{...n},frameworks:{...n},commands:{...n},projectType:{...n},git:{file:"git",type:"detected"}}}var gc=b(()=>{"use strict";l(xt,"cite");l(Us,"defaultSources")});function Oo(n,e){let t=[];return e==="full"?(t.push("## prjct Rules"),t.push(""),t.push("### Path Resolution"),t.push(`**ALL prjct writes go to**: \`~/.prjct-cli/projects/${n.projectId}/\``),t.push("- NEVER write to `.prjct/`"),t.push("- NEVER write to `./` for prjct data"),t.push(""),t.push("### Workflow"),t.push("```"),t.push('p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship'),t.push("```"),t.push(""),t.push("| Command | Action |"),t.push("|---------|--------|"),t.push("| `p. sync` | Re-analyze project |"),t.push("| `p. task X` | Start task |"),t.push("| `p. done` | Complete subtask |"),t.push("| `p. ship X` | Ship feature |"),t.push("")):(t.push("## prjct Rules"),t.push(""),t.push(`Path: \`~/.prjct-cli/projects/${n.projectId}/\``),t.push('Workflow: `p. sync` \u2192 `p. task "desc"` \u2192 work \u2192 `p. done` \u2192 `p. ship`'),t.push("")),t.push("## Project State"),t.push(""),t.push("| Field | Value |"),t.push("|-------|-------|"),t.push(`| Name | ${n.name} |`),t.push(`| Version | ${n.version} |`),t.push(`| Ecosystem | ${n.ecosystem} |`),t.push(`| Branch | ${n.branch} |`),t.push(`| Files | ~${n.fileCount} |`),t.push(`| Commits | ${n.commits} |`),t.push(""),(n.agents.workflow.length>0||n.agents.domain.length>0)&&(t.push("## Agents"),t.push(""),t.push(`Load from \`~/.prjct-cli/projects/${n.projectId}/agents/\`:`),t.push(""),t.push(`**Workflow**: ${n.agents.workflow.join(", ")}`),t.push(`**Domain**: ${n.agents.domain.join(", ")||"none"}`),t.push("")),n.learnings&&(n.learnings.completedTasks.length>0||n.learnings.resolvedBugs.length>0||n.learnings.shippedFeatures.length>0)&&(t.push("## Recent Learnings"),t.push(""),n.learnings.completedTasks.length>0&&(t.push("### Completed Tasks"),t.push(n.learnings.completedTasks.map(s=>`- ${s.description}${s.branch?` (${s.branch})`:""}`).join(`
|
|
572
|
+
`)),t.push("")),n.learnings.resolvedBugs.length>0&&(t.push("### Resolved Bugs"),t.push(n.learnings.resolvedBugs.map(s=>`- ${s.description}`).join(`
|
|
573
|
+
`)),t.push("")),n.learnings.shippedFeatures.length>0&&(t.push("### Shipped Features"),t.push(n.learnings.shippedFeatures.map(s=>`- **${s.name}** (v${s.version})${s.description?`: ${s.description}`:""}`).join(`
|
|
574
574
|
`)),t.push(""))),t.join(`
|
|
575
|
-
`)}function kr(
|
|
576
|
-
`)}function Sr(
|
|
577
|
-
`)}function fc(
|
|
575
|
+
`)}function kr(n,e){return(e?n.slice(0,e):n).map(s=>`- **${s.name}**: ${s.description}${s.location?` (${s.location})`:""}`).join(`
|
|
576
|
+
`)}function Sr(n,e){return(e?n.slice(0,e):n).map(s=>`- **${s.issue}** in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
|
|
577
|
+
`)}function fc(n){let e=[];return n.packageManager&&e.push(`- Package Manager: \`${n.packageManager}\``),n.sourceDir&&e.push(`- Source: \`${n.sourceDir}/\``),n.testDir&&e.push(`- Tests: \`${n.testDir}/\``),e.length>0?`
|
|
578
578
|
### Project Structure
|
|
579
579
|
|
|
580
580
|
${e.join(`
|
|
581
581
|
`)}
|
|
582
|
-
`:""}function OS(
|
|
582
|
+
`:""}function OS(n){let e=[];return n.patterns?.length>0&&e.push(`
|
|
583
583
|
### Code Patterns (Follow These)
|
|
584
584
|
|
|
585
|
-
${kr(
|
|
585
|
+
${kr(n.patterns)}`),n.antiPatterns?.length>0&&e.push(`
|
|
586
586
|
### Anti-Patterns (Avoid These)
|
|
587
587
|
|
|
588
|
-
${Sr(
|
|
589
|
-
`)}function _S(
|
|
590
|
-
# ${
|
|
591
|
-
<!-- projectId: ${
|
|
588
|
+
${Sr(n.antiPatterns)}`),e.push(fc(n)),e.join(`
|
|
589
|
+
`)}function _S(n,e){let t=n.sources||Us();return`<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->
|
|
590
|
+
# ${n.name} - Project Rules
|
|
591
|
+
<!-- projectId: ${n.projectId} -->
|
|
592
592
|
<!-- Generated: ${new Date().toISOString()} -->
|
|
593
|
-
<!-- Ecosystem: ${
|
|
593
|
+
<!-- Ecosystem: ${n.ecosystem} | Type: ${n.projectType} -->
|
|
594
594
|
|
|
595
|
-
## THIS PROJECT (${
|
|
595
|
+
## THIS PROJECT (${n.ecosystem})
|
|
596
596
|
|
|
597
597
|
${xt(t.ecosystem)}
|
|
598
|
-
**Type:** ${
|
|
599
|
-
**Path:** ${
|
|
598
|
+
**Type:** ${n.projectType}
|
|
599
|
+
**Path:** ${n.repoPath}
|
|
600
600
|
|
|
601
601
|
### Commands (USE THESE, NOT OTHERS)
|
|
602
602
|
|
|
603
603
|
${xt(t.commands)}
|
|
604
604
|
| Action | Command |
|
|
605
605
|
|--------|---------|
|
|
606
|
-
| Install dependencies | \`${
|
|
607
|
-
| Run dev server | \`${
|
|
608
|
-
| Run tests | \`${
|
|
609
|
-
| Build | \`${
|
|
610
|
-
| Lint | \`${
|
|
611
|
-
| Format | \`${
|
|
606
|
+
| Install dependencies | \`${n.commands.install}\` |
|
|
607
|
+
| Run dev server | \`${n.commands.dev}\` |
|
|
608
|
+
| Run tests | \`${n.commands.test}\` |
|
|
609
|
+
| Build | \`${n.commands.build}\` |
|
|
610
|
+
| Lint | \`${n.commands.lint}\` |
|
|
611
|
+
| Format | \`${n.commands.format}\` |
|
|
612
612
|
|
|
613
613
|
### Code Conventions
|
|
614
614
|
|
|
615
615
|
${xt(t.languages)}
|
|
616
|
-
- **Languages**: ${
|
|
616
|
+
- **Languages**: ${n.languages.join(", ")||"Not detected"}
|
|
617
617
|
${xt(t.frameworks)}
|
|
618
|
-
- **Frameworks**: ${
|
|
619
|
-
${
|
|
618
|
+
- **Frameworks**: ${n.frameworks.join(", ")||"Not detected"}
|
|
619
|
+
${n.analysis?OS(n.analysis):"\n> Run `p. sync` to populate project intelligence\n"}
|
|
620
620
|
---
|
|
621
621
|
|
|
622
622
|
## PRJCT RULES
|
|
623
623
|
|
|
624
624
|
### Path Resolution
|
|
625
|
-
**ALL prjct writes go to**: \`~/.prjct-cli/projects/${
|
|
625
|
+
**ALL prjct writes go to**: \`~/.prjct-cli/projects/${n.projectId}/\`
|
|
626
626
|
- NEVER write to \`.prjct/\`
|
|
627
627
|
- NEVER write to \`./\` for prjct data
|
|
628
628
|
|
|
@@ -645,54 +645,54 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
|
645
645
|
${xt(t.name)}
|
|
646
646
|
| Field | Value |
|
|
647
647
|
|-------|-------|
|
|
648
|
-
| Name | ${
|
|
649
|
-
| Version | ${
|
|
650
|
-
| Ecosystem | ${
|
|
651
|
-
| Branch | ${
|
|
652
|
-
| Files | ~${
|
|
653
|
-
| Commits | ${
|
|
648
|
+
| Name | ${n.name} |
|
|
649
|
+
| Version | ${n.version} |
|
|
650
|
+
| Ecosystem | ${n.ecosystem} |
|
|
651
|
+
| Branch | ${n.branch} |
|
|
652
|
+
| Files | ~${n.fileCount} |
|
|
653
|
+
| Commits | ${n.commits} |
|
|
654
654
|
|
|
655
655
|
---
|
|
656
656
|
|
|
657
657
|
## AGENTS
|
|
658
658
|
|
|
659
|
-
Load from \`~/.prjct-cli/projects/${
|
|
659
|
+
Load from \`~/.prjct-cli/projects/${n.projectId}/agents/\`:
|
|
660
660
|
|
|
661
|
-
**Workflow**: ${
|
|
662
|
-
**Domain**: ${
|
|
661
|
+
**Workflow**: ${n.agents.workflow.join(", ")}
|
|
662
|
+
**Domain**: ${n.agents.domain.join(", ")||"none"}
|
|
663
663
|
|
|
664
664
|
---
|
|
665
665
|
|
|
666
666
|
## RECENT LEARNINGS
|
|
667
667
|
|
|
668
|
-
${
|
|
668
|
+
${n.learnings&&(n.learnings.completedTasks.length>0||n.learnings.resolvedBugs.length>0||n.learnings.shippedFeatures.length>0)?`
|
|
669
669
|
### Completed Tasks
|
|
670
|
-
${
|
|
670
|
+
${n.learnings.completedTasks.length>0?n.learnings.completedTasks.map(s=>`- ${s.description}${s.branch?` (${s.branch})`:""}`).join(`
|
|
671
671
|
`):"_(No completed tasks yet)_"}
|
|
672
672
|
|
|
673
673
|
### Resolved Bugs
|
|
674
|
-
${
|
|
674
|
+
${n.learnings.resolvedBugs.length>0?n.learnings.resolvedBugs.map(s=>`- ${s.description}`).join(`
|
|
675
675
|
`):"_(No resolved bugs yet)_"}
|
|
676
676
|
|
|
677
677
|
### Shipped Features
|
|
678
|
-
${
|
|
678
|
+
${n.learnings.shippedFeatures.length>0?n.learnings.shippedFeatures.map(s=>`- **${s.name}** (v${s.version})${s.description?`: ${s.description}`:""}`).join(`
|
|
679
679
|
`):"_(No shipped features yet)_"}
|
|
680
680
|
`:"> Run `p. sync` to populate learnings from task history"}
|
|
681
681
|
<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->
|
|
682
|
-
`}function NS(
|
|
683
|
-
`)}function FS(
|
|
684
|
-
`)}function LS(
|
|
685
|
-
`)}function US(
|
|
686
|
-
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${
|
|
687
|
-
`)}function $p(
|
|
688
|
-
|
|
689
|
-
`),i+=t,await Lp(
|
|
682
|
+
`}function NS(n,e){let t=n.sources||Us(),s=[];if(s.push("---"),s.push(`description: prjct context for ${n.name}`),s.push("globs:"),s.push("alwaysApply: true"),s.push("---"),s.push(""),s.push(`You are working on ${n.name}, a ${n.projectType} ${n.ecosystem} project.`),s.push(""),s.push(xt(t.languages)),s.push("## Tech Stack"),n.languages.length>0&&s.push(`- Languages: ${n.languages.join(", ")}`),n.frameworks.length>0&&s.push(`- Frameworks: ${n.frameworks.join(", ")}`),s.push(""),s.push(xt(t.commands)),s.push("## Commands"),s.push(`- Install: \`${n.commands.install}\``),s.push(`- Dev: \`${n.commands.dev}\``),s.push(`- Test: \`${n.commands.test}\``),s.push(`- Build: \`${n.commands.build}\``),s.push(""),n.analysis){n.analysis.patterns?.length>0&&(s.push("## Code Patterns"),s.push(kr(n.analysis.patterns)),s.push("")),n.analysis.antiPatterns?.length>0&&(s.push("## Anti-Patterns (Avoid)"),s.push(Sr(n.analysis.antiPatterns)),s.push(""));let r=fc(n.analysis);r&&(s.push(r.trim()),s.push(""))}else s.push("> Run `p. sync` to populate project intelligence");return s.push(""),s.push(Oo(n,"concise")),s.join(`
|
|
683
|
+
`)}function FS(n,e){let t=n.sources||Us(),s=[];return s.push("# Copilot Instructions"),s.push(""),s.push(`This is ${n.name}, a ${n.ecosystem} project.`),s.push(""),s.push(xt(t.ecosystem)),s.push("## Project Info"),s.push(`- Type: ${n.projectType}`),s.push(`- Stack: ${n.frameworks.join(", ")||n.ecosystem}`),s.push(""),n.analysis?(n.analysis.patterns?.length>0&&(s.push("## Code Patterns"),s.push(kr(n.analysis.patterns,5)),s.push("")),n.analysis.antiPatterns?.length>0&&(s.push("## Anti-Patterns"),s.push(Sr(n.analysis.antiPatterns,3)),s.push(""))):(s.push("> Run `p. sync` to populate project intelligence"),s.push("")),s.push(xt(t.commands)),s.push("## Commands"),s.push(`- Test: \`${n.commands.test}\``),s.push(`- Build: \`${n.commands.build}\``),s.push(""),s.push(Oo(n,"concise")),s.join(`
|
|
684
|
+
`)}function LS(n,e){let t=n.sources||Us(),s=[];return s.push("---"),s.push(`description: prjct context for ${n.name}`),s.push("trigger: always_on"),s.push("---"),s.push(""),s.push(`# ${n.name}`),s.push(""),s.push(`${n.projectType} project using ${n.ecosystem}.`),s.push(""),s.push(xt(t.languages)),s.push("## Stack"),s.push(`- ${n.languages.join(", ")}`),n.frameworks.length>0&&s.push(`- ${n.frameworks.join(", ")}`),s.push(""),s.push(xt(t.commands)),s.push("## Commands"),s.push("```bash"),s.push("# Install"),s.push(n.commands.install),s.push("# Dev"),s.push(n.commands.dev),s.push("# Test"),s.push(n.commands.test),s.push("# Build"),s.push(n.commands.build),s.push("```"),s.push(""),n.analysis?(n.analysis.patterns?.length>0&&(s.push("## Code Patterns"),s.push(kr(n.analysis.patterns)),s.push("")),n.analysis.antiPatterns?.length>0&&(s.push("## Anti-Patterns (Avoid)"),s.push(Sr(n.analysis.antiPatterns)))):s.push("> Run `p. sync` to populate project intelligence"),s.push(""),s.push(Oo(n,"concise")),s.join(`
|
|
685
|
+
`)}function US(n,e){let t=[`You are working on ${n.name}, a ${n.projectType} ${n.ecosystem} project.`,"",`Stack: ${n.languages.join(", ")}${n.frameworks.length>0?` with ${n.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${n.commands.install}`,`- Dev: ${n.commands.dev}`,`- Test: ${n.commands.test}`,`- Build: ${n.commands.build}`];if(n.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of n.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(n.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of n.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}n.analysis||t.push("","Run `p. sync` to populate project intelligence."),t.push(""),t.push("prjct Rules:"),t.push(`- All prjct data: ~/.prjct-cli/projects/${n.projectId}/`),t.push('- Workflow: p. sync \u2192 p. task "desc" \u2192 work \u2192 p. done \u2192 p. ship'),t.push(""),t.push(`Project: ${n.name} v${n.version} | ${n.ecosystem} | Branch: ${n.branch} | Files: ~${n.fileCount}`),n.agents.workflow.length>0&&t.push(`Agents: ${[...n.agents.workflow,...n.agents.domain].join(", ")}`);let r={systemMessage:t.join(`
|
|
686
|
+
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${n.commands.test}`}]};return JSON.stringify(r,null,2)}function HS(n,e){let t=[];return t.push("<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->"),t.push(`# ${n.name} - Project Rules`),t.push(`<!-- projectId: ${n.projectId} -->`),t.push(`<!-- Generated: ${new Date().toISOString()} -->`),t.push(`<!-- Ecosystem: ${n.ecosystem} | Type: ${n.projectType} -->`),t.push(""),t.push(`## THIS PROJECT (${n.ecosystem})`),t.push(""),t.push(`**Type:** ${n.projectType}`),t.push(`**Path:** ${n.repoPath}`),t.push(""),t.push("### Commands (USE THESE, NOT OTHERS)"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install dependencies | \`${n.commands.install}\` |`),t.push(`| Run dev server | \`${n.commands.dev}\` |`),t.push(`| Run tests | \`${n.commands.test}\` |`),t.push(`| Build | \`${n.commands.build}\` |`),t.push(`| Lint | \`${n.commands.lint}\` |`),t.push(`| Format | \`${n.commands.format}\` |`),t.push(""),t.push("### Code Conventions"),t.push(""),t.push(`- **Languages**: ${n.languages.join(", ")||"Not detected"}`),t.push(`- **Frameworks**: ${n.frameworks.join(", ")||"Not detected"}`),n.analysis?(n.analysis.patterns?.length>0&&(t.push(""),t.push("### Code Patterns (Follow These)"),t.push(""),t.push(kr(n.analysis.patterns))),n.analysis.antiPatterns?.length>0&&(t.push(""),t.push("### Anti-Patterns (Avoid These)"),t.push(""),t.push(Sr(n.analysis.antiPatterns))),t.push(fc(n.analysis))):(t.push(""),t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("---"),t.push(""),t.push(Oo(n,"full")),t.push("<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->"),t.join(`
|
|
687
|
+
`)}function $p(n){return{claude:_S,cursor:NS,copilot:FS,windsurf:LS,continue:US,codex:HS}[n]||null}var Mp=b(()=>{"use strict";gc();l(Oo,"formatOperationalContext");l(kr,"formatPatterns");l(Sr,"formatAntiPatterns");l(fc,"formatStructure");l(OS,"formatAnalysisForClaude");l(_S,"formatForClaude");l(NS,"formatForCursor");l(FS,"formatForCopilot");l(LS,"formatForWindsurf");l(US,"formatForContinue");l(HS,"formatForCodex");l($p,"getFormatter")});import{exec as GS}from"node:child_process";import Op from"node:os";import Bt from"node:path";import{promisify as VS}from"node:util";function _p(n){return No[n]||null}function Np(n){let e=Op.homedir();switch(n){case"claude":return Bt.join(e,".claude","CLAUDE.md");case"gemini":return Bt.join(e,".gemini","GEMINI.md");case"codex":return Bt.join(e,".codex","CODEX.md");case"aider":return Bt.join(e,".aider","AIDER.md");default:return""}}async function _o(n){try{return await WS(`which ${n}`),!0}catch{return!1}}async function Fo(n=process.cwd()){let e=[];return await _o("claude")&&e.push("claude"),(await _o("cursor")||await j(Bt.join(n,".cursor")))&&e.push("cursor"),await j(Bt.join(n,".github"))&&e.push("copilot"),(await _o("windsurf")||await j(Bt.join(n,".windsurf")))&&e.push("windsurf"),(await j(Bt.join(n,".continue"))||await j(Bt.join(Op.homedir(),".continue")))&&e.push("continue"),(await _o("codex")||await j(Bt.join(n,".agents")))&&e.push("codex"),e}async function Fp(n,e=process.cwd()){if(n==="auto"){let t=await Fo(e);return t.length>0?t:["claude"]}return n==="all"?BS:n.filter(t=>No[t])}var WS,No,Cn,BS,hc=b(()=>{"use strict";We();WS=VS(GS),No={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},Cn=["claude"],BS=Object.keys(No);l(_p,"getAIToolConfig");l(Np,"getGlobalConfigPath");l(_o,"commandExists");l(Fo,"detectInstalledTools");l(Fp,"resolveToolIds")});import br from"node:fs/promises";import JS from"node:path";function zS(n){let e=n.match(/<!-- projectId: ([a-f0-9-]+) -->/);return e?e[1]:null}function qS(n){let e="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",t="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",s=n.indexOf(e),r=n.indexOf(t);return s!==-1&&r!==-1&&r>s?n.substring(s,r+t.length):null}async function Up(n,e,t){if(!t.includes("<!-- prjct-project:start"))throw new Error("New content must include project section markers");let s=zS(t);if(s!==e)throw new Error(`ProjectId mismatch: expected ${e}, got ${s||"none"}`);await br.mkdir(JS.dirname(n),{recursive:!0});let r="";try{r=await br.readFile(n,"utf-8")}catch(a){if(a.code!=="ENOENT")throw a}if(!r.trim()){await Lp(n,t);return}let o=qS(r),i="";o&&(i+=`${o}
|
|
688
|
+
|
|
689
|
+
`),i+=t,await Lp(n,i)}async function Lp(n,e){let t=`${n}.tmp.${Date.now()}`;try{await br.writeFile(t,e,"utf-8"),await br.rename(t,n)}catch(s){try{await br.unlink(t)}catch{}throw s}}var Hp=b(()=>{"use strict";l(zS,"extractProjectId");l(qS,"extractGlobalSection");l(Up,"updateProjectSection");l(Lp,"writeFileAtomic")});import yc from"node:fs/promises";import wc from"node:path";async function Gp(n,e,t,s=Cn){let r=[];for(let o of s){let i=_p(o);if(!i){r.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await KS(n,i,e,t);r.push(a)}return r}async function KS(n,e,t,s){let r=$p(e.id);if(!r)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=r(n,e),i;if(e.outputPath==="repo")i=wc.join(s,e.outputFile);else{let a=Np(e.id);a?i=a:i=wc.join(t,"context",e.outputFile)}if(await yc.mkdir(wc.dirname(i),{recursive:!0}),e.outputPath==="global")await Up(i,n.projectId,o);else{try{let a=await yc.readFile(i,"utf-8"),c=Dp(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=jp(o,a)}catch{}await yc.writeFile(i,o,"utf-8")}return{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:y(o)}}}var Vp=b(()=>{"use strict";U();Ip();Mp();hc();Hp();l(Gp,"generateAIToolContexts");l(KS,"generateForTool")});async function Wp(n){try{let e=x.getDb(n),t=e.prepare(`
|
|
690
690
|
SELECT description, completed_at, branch
|
|
691
691
|
FROM tasks
|
|
692
692
|
WHERE status = 'done' OR status = 'shipped'
|
|
693
693
|
ORDER BY completed_at DESC
|
|
694
694
|
LIMIT 10
|
|
695
|
-
`).all(),
|
|
695
|
+
`).all(),s=e.prepare(`
|
|
696
696
|
SELECT description, completed_at as resolution
|
|
697
697
|
FROM tasks
|
|
698
698
|
WHERE (type = 'bug' OR description LIKE '%fix%' OR description LIKE '%bug%')
|
|
@@ -704,27 +704,27 @@ ${s.learnings.shippedFeatures.length>0?s.learnings.shippedFeatures.map(n=>`- **$
|
|
|
704
704
|
FROM shipped_features
|
|
705
705
|
ORDER BY shipped_at DESC
|
|
706
706
|
LIMIT 5
|
|
707
|
-
`).all();return{completedTasks:t.map(o=>({description:o.description,completedAt:o.completed_at||"unknown",branch:o.branch})),resolvedBugs:
|
|
708
|
-
`)}},Sc=new kc});import{z as R}from"zod";var
|
|
709
|
-
`)}},sm=new Tc});var Pc,yt,Gn=b(()=>{"use strict";ft();_n();se();Pc=class{static{l(this,"MemoryService")}async log(e,t,n,r){try{let o=await $.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...n,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await $.getProjectId(e);return n?N.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let r=await $.getProjectId(e);return r?N.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;N.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return N.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=en.MEMORY_MAX_ENTRIES)return 0;let r=n-en.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);Ct.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&N.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},yt=new Pc});import{createHash as cb}from"node:crypto";import im from"node:fs/promises";import Ec from"node:path";function Vn(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"")}function ub(s){let e=Ec.resolve(s);return cb("sha256").update(e).digest("hex").slice(0,16)}function Go(s){let e=ye(s);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function db(s){let e=[],t=[s];for(;t.length>0&&e.length<om;){let n=t.pop();if(!n)break;let r=await im.readdir(n,{withFileTypes:!0});for(let o of r){if(e.length>=om)break;let i=Ec.join(n,o.name);if(o.isDirectory()){lb.has(o.name)||t.push(i);continue}o.isFile()&&/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java)$/.test(o.name)&&e.push(i)}}return e}async function pb(s,e){let t=[],n=[],r=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=Ec.relative(s,d),p=await im.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(r=!0),(/from\s+['"]@?heroui\//.test(p)||/from\s+['"]@nextui-org\//.test(p))&&(o=!0),/<UiButton\b|from\s+['"][^'"]*UiButton[^'"]*['"]/.test(p)&&(i=!0);let g=p.match(/:\s*any\b|<\s*any\s*>/g);g&&(a+=g.length,n.push({issue:"Unbounded any usage",file:m,suggestion:"Replace with specific types or justified unknown + narrowing.",severity:"high",language:"TypeScript",source:"repo",confidence:.92}));let f=p.match(/@ts-ignore/g);f&&(c+=f.length,n.push({issue:"Unchecked @ts-ignore usage",file:m,suggestion:"Use @ts-expect-error with reason or refactor typings.",severity:"medium",language:"TypeScript",source:"repo",confidence:.88})),/\.(tsx|jsx)$/.test(d)&&/<img\s+/.test(p)&&!/next\/image/.test(p)&&(u+=1,n.push({issue:"Raw <img> in React/Next component",file:m,suggestion:"Prefer framework image component or documented exception.",severity:"medium",framework:"Next.js",source:"repo",confidence:.8}))}return r&&t.push({name:"Image rendering via next/image",description:"Project uses next/image for optimized image delivery.",location:"app/** or src/**",framework:"Next.js",source:"repo",confidence:.9}),o&&t.push({name:"HeroUI as component system",description:"UI components are sourced from HeroUI/NextUI packages.",location:"components/**",source:"repo",confidence:.87}),i&&t.push({name:"Use UiButton abstraction",description:"Buttons are wrapped in UiButton instead of native button in app UI.",location:"components/**",source:"repo",confidence:.84}),(a>0||c>0||u>0)&&t.push({name:"Strict type/lint hygiene",description:`Detected ${a} any, ${c} ts-ignore, ${u} raw img potential violations.`,source:"repo",confidence:.76}),{patterns:t,antiPatterns:n}}function mb(s){let e=new Set,t=[];for(let n of s){let r=`${Vn(n.name)}::${Vn(n.source)}`;e.has(r)||(e.add(r),t.push(n))}return t}function gb(s){let e=new Set,t=[];for(let n of s){let r=`${Vn(n.issue)}::${Vn(n.file)}::${Vn(n.source)}`;e.has(r)||(e.add(r),t.push(n))}return t}var lb,om,Cc,fb,am,cm=b(()=>{"use strict";Wt();se();lb=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),om=400;l(Vn,"normalizeKey");l(ub,"repoHash");l(Go,"parseBaselineFile");l(db,"listSourceFiles");l(pb,"detectRepoRules");l(mb,"dedupePatterns");l(gb,"dedupeAntiPatterns");Cc=class{static{l(this,"PatternExtractor")}async extract(e){let t=ub(e.projectPath),n=await db(e.projectPath),r=[],o=[];for(let p of e.languages){let g=Vn(p),f=Go(`baseline/patterns/${g}.json`),k=Go(`baseline/anti-patterns/${g}.json`);r.push(...f.map(w=>({...w,language:p,source:"baseline",confidence:w.confidence??.8}))),o.push(...k.map(w=>({...w,file:w.file||"multiple",language:p,source:"baseline",confidence:w.confidence??.8})))}for(let p of e.frameworks){let g=Vn(p),f=Go(`baseline/patterns/${g}.json`),k=Go(`baseline/anti-patterns/${g}.json`);r.push(...f.map(w=>({...w,framework:p,source:"baseline",confidence:w.confidence??.82}))),o.push(...k.map(w=>({...w,file:w.file||"multiple",framework:p,source:"baseline",confidence:w.confidence??.82}))),e.context7Verified&&r.push({name:`${p} API validation via Context7`,description:`Validate ${p} APIs against current documentation through Context7 before implementation.`,framework:p,source:"context7",confidence:.7})}let i=await pb(e.projectPath,n),a=(e.feedback?.patternsDiscovered||[]).map(p=>({name:p,description:`Confirmed during completed tasks: ${p}`,source:"feedback",confidence:.75})),c=(e.feedback?.knownGotchas||[]).map(p=>({issue:p,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${p}`,source:"feedback",severity:"medium",confidence:.7})),u=mb([...r,...i.patterns,...a]),d=gb([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return x.setDoc(e.projectId,m,{projectId:e.projectId,repoPathHash:t,patterns:u,antiPatterns:d,updatedAt:new Date().toISOString(),version:1}),{patterns:u,antiPatterns:d,repoPathHash:t}}},fb=new Cc,am=fb});import xc from"node:fs/promises";import hb from"node:os";import lm from"node:path";function Ac(){return lm.join(hb.homedir(),".prjct-cli","skills",yb)}function wb(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Tr(){try{let s=await xc.readFile(Ac(),"utf-8");return JSON.parse(s)}catch{return wb()}}async function Rc(s){let e=Ac();await xc.mkdir(lm.dirname(e),{recursive:!0}),s.generatedAt=new Date().toISOString(),await xc.writeFile(e,JSON.stringify(s,null,2),"utf-8")}async function kb(s){let e=await Tr();e.skills[s.name]=s,await Rc(e)}async function Sb(s){let e=await Tr();return s in e.skills?(delete e.skills[s],await Rc(e),!0):!1}async function bb(s){return(await Tr()).skills[s]||null}async function vb(){return(await Tr()).skills}function Tb(){return Ac()}var yb,Pr,um=b(()=>{"use strict";yb=".skill-lock.json";l(Ac,"getLockFilePath");l(wb,"createEmptyLockFile");l(Tr,"read");l(Rc,"write");l(kb,"addEntry");l(Sb,"removeEntry");l(bb,"getEntry");l(vb,"getAll");l(Tb,"getPath");Pr={read:Tr,write:Rc,addEntry:kb,removeEntry:Sb,getEntry:bb,getAll:vb,getPath:Tb}});import{exec as Pb}from"node:child_process";import on from"node:fs/promises";import jc from"node:os";import st from"node:path";import{promisify as Cb}from"node:util";import{glob as dm}from"glob";function mm(s){if(s.startsWith("./")||s.startsWith("/")||s.startsWith("~")){let n=s.startsWith("~")?st.join(jc.homedir(),s.slice(1)):st.resolve(s);return{type:"local",localPath:n,url:n}}let e=s.indexOf("@");if(e>0){let n=s.slice(0,e),r=s.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:r,url:`https://github.com/${o}/${i}`}}let t=s.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${s}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function gm(s){let e=[];try{let r=st.join(s,"SKILL.md");await on.access(r);let o=st.basename(s);e.push({name:o,filePath:r})}catch{}let t=await dm("*/SKILL.md",{cwd:s,absolute:!0});for(let r of t){let o=st.basename(st.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}let n=await dm("skills/*/SKILL.md",{cwd:s,absolute:!0});for(let r of n){let o=st.basename(st.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}return e}function Eb(s,e,t){let n=new Date().toISOString(),r=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&r.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=s.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
|
|
707
|
+
`).all();return{completedTasks:t.map(o=>({description:o.description,completedAt:o.completed_at||"unknown",branch:o.branch})),resolvedBugs:s.map(o=>({description:o.description,resolution:o.resolution||"completed"})),shippedFeatures:r.map(o=>({name:o.name,description:o.description||"",version:o.version})),patterns:[]}}catch{return{completedTasks:[],resolvedBugs:[],shippedFeatures:[],patterns:[]}}}var Bp=b(()=>{"use strict";ne();l(Wp,"extractLearningsFromDB")});var vr,kc,Sc,Jp=b(()=>{"use strict";rr();fe();vr=3,kc=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=vr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${vr} occurrences needed`});return r}async learnFromOutcomes(e,t,s){let r={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return r;let o=this.extractOutcomePatterns(t);r.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=vr){r.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(r.memoriesInjected++,r.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else r.patternsSkipped++,r.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${vr} occurrences needed`});return r}extractFileCochangePatterns(e){let t=new Map;for(let r of e){if(!r.subtaskSummaries)continue;let o=new Set;for(let a of r.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(r.taskId),t.set(u,d)}}let s=[];for(let[r,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=r.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((r,o)=>o.occurrences-r.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let r of s.feedback.stackConfirmed){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(r,o)}return Array.from(t.entries()).map(([s,{count:r,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:r,confidence:this.calculateConfidence(r),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let r of s.feedback.patternsDiscovered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(r,o)}return Array.from(t.entries()).map(([s,{count:r,tasks:o}])=>({pattern:s,occurrences:r,confidence:this.calculateConfidence(r),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let r of s.feedback.issuesEncountered){let o=t.get(r)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(r,o)}return Array.from(t.entries()).filter(([s,{count:r}])=>r>=2).map(([s,{count:r,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:r,confidence:this.calculateConfidence(r),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,r=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=r.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),r.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 r)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>=vr&&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,r)=>r.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let r=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:r}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:r,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${v()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
708
|
+
`)}},Sc=new kc});import{z as R}from"zod";var zp,XS,YS,qp,QS,ZS,eb,tb,sb,nb,rb,Kp,ob,ib,B0,Xp,Yp,Qp,Zp,ab,Lo,em=b(()=>{"use strict";zp=R.number().min(1).max(5),XS=R.enum(["exceeded","met","partial","failed"]),YS=R.enum(["definitely","probably","maybe","no"]),qp=R.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),QS=R.object({estimated:R.object({hours:R.number(),confidence:R.enum(["low","medium","high"]).optional(),source:R.enum(["prd","manual","historical"]).optional()}),actual:R.object({hours:R.number(),commits:R.number().optional(),linesAdded:R.number().optional(),linesRemoved:R.number().optional(),sessions:R.number().optional()}),variance:R.object({hours:R.number(),percentage:R.number(),reason:qp.optional(),explanation:R.string().optional()})}),ZS=R.object({name:R.string(),baseline:R.number().nullable(),target:R.number(),actual:R.number(),unit:R.string(),achieved:R.boolean(),percentOfTarget:R.number()}),eb=R.object({criteria:R.string(),met:R.boolean(),notes:R.string().optional()}),tb=R.object({metrics:R.array(ZS),acceptanceCriteria:R.array(eb),overallSuccess:XS,successScore:R.number().min(0).max(100)}),sb=R.object({category:R.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:R.string(),actionable:R.boolean(),action:R.string().optional()}),nb=R.object({whatWorked:R.array(R.string()),whatDidnt:R.array(R.string()),surprises:R.array(R.string()),recommendations:R.array(sb)}),rb=R.object({valueDelivered:R.number().min(1).max(10),userImpact:R.enum(["none","low","medium","high","critical"]),businessImpact:R.enum(["none","low","medium","high","critical"]),roiScore:R.number(),worthIt:YS,worthItReason:R.string().optional(),alternativeConsidered:R.string().optional(),betterAlternativeExists:R.boolean().optional()}),Kp=R.object({id:R.string(),taskId:R.string(),description:R.string(),estimatedMinutes:R.number().optional(),actualMinutes:R.number(),completedAsPlanned:R.boolean(),qualityScore:zp,blockers:R.array(R.string()),agentUsed:R.string().optional(),skillsUsed:R.array(R.string()).optional(),startedAt:R.string(),completedAt:R.string()}),ob=R.object({id:R.string(),featureId:R.string(),featureName:R.string(),prdId:R.string().nullable(),version:R.string().optional(),branch:R.string().optional(),prUrl:R.string().optional(),effort:QS,success:tb.optional(),learnings:nb,roi:rb,rating:zp,taskOutcomes:R.array(Kp).optional(),startedAt:R.string(),shippedAt:R.string(),reviewedAt:R.string().optional(),reviewedBy:R.string().optional(),legacy:R.boolean().optional()}),ib=R.object({totalFeatures:R.number(),averageEstimationAccuracy:R.number(),averageSuccessRate:R.number(),averageROI:R.number(),bySuccessLevel:R.object({exceeded:R.number(),met:R.number(),partial:R.number(),failed:R.number()}),variancePatterns:R.array(R.object({reason:qp,count:R.number(),averageVariance:R.number()})),topLearnings:R.array(R.object({insight:R.string(),frequency:R.number()}))}),B0=R.object({outcomes:R.array(ob),taskOutcomes:R.array(Kp).optional(),aggregates:ib.optional(),lastUpdated:R.string(),lastAggregated:R.string().optional()}),Xp={outcomes:[],taskOutcomes:[],lastUpdated:""},Yp=l((n,e)=>{let t=e-n,s=n>0?(e-n)/n*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),Qp=l((n,e)=>e<=0?n*10:Math.round(n*10/e*100)/100,"calculateROIScore"),Zp=l(n=>n>=100?"exceeded":n>=80?"met":n>=50?"partial":"failed","determineSuccessLevel"),ab=l(n=>Math.max(0,100-Math.abs(n)),"calculateEstimationAccuracy"),Lo=l(n=>{if(n.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=n.map(d=>ab(d.effort.variance.percentage)),t=n.filter(d=>d.success).map(d=>d.success.successScore),s=n.map(d=>d.roi.roiScore),r={exceeded:n.filter(d=>d.success?.overallSuccess==="exceeded").length,met:n.filter(d=>d.success?.overallSuccess==="met").length,partial:n.filter(d=>d.success?.overallSuccess==="partial").length,failed:n.filter(d=>d.success?.overallSuccess==="failed").length},o=n.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=n.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:n.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:r,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var bc,tm,sm=b(()=>{"use strict";em();Zt();fe();bc=class extends ze{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Xp,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Lo([t,...s.outcomes]),lastUpdated:v()})),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:v()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),r=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:r}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Lo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Lo(t.outcomes),lastAggregated:v(),lastUpdated:v()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,s=t/60,r=t/60,o=Yp(s,r),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Qp(5,r);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:r,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Zp(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,s=e.match(/(\d+)h/);s&&(t+=parseInt(s[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t||60}},tm=new bc});import Uo from"node:fs/promises";import Ho from"node:path";var vc,Tc,nm,rm=b(()=>{"use strict";U();vc=".prjct/.prjct-state.md",Tc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Ho.join(e,vc);await Uo.mkdir(Ho.dirname(s),{recursive:!0});let r=this.toMarkdown(t);await Uo.writeFile(s,r,"utf-8")}async remove(e){try{await Uo.unlink(Ho.join(e,vc))}catch(t){if(!C(t))throw t}}async exists(e){let t=Ho.join(e,vc);try{return await Uo.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let 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 r=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${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(`
|
|
709
|
+
`)}},nm=new Tc});var Pc,yt,Hs=b(()=>{"use strict";ft();Os();ne();Pc=class{static{l(this,"MemoryService")}async log(e,t,s,r){try{let o=await $.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...s,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await $.getProjectId(e);return s?N.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 r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.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 r=await $.getProjectId(e);return r?N.query(r,"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(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;N.run(t,"DELETE FROM events WHERE type LIKE 'memory.%'")}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return N.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.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=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=es.MEMORY_MAX_ENTRIES)return 0;let r=s-es.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);Ct.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&N.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},yt=new Pc});import{createHash as cb}from"node:crypto";import im from"node:fs/promises";import Ec from"node:path";function Gs(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"")}function ub(n){let e=Ec.resolve(n);return cb("sha256").update(e).digest("hex").slice(0,16)}function Go(n){let e=ye(n);if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t.items)?t.items:[]}catch{return[]}}async function db(n){let e=[],t=[n];for(;t.length>0&&e.length<om;){let s=t.pop();if(!s)break;let r=await im.readdir(s,{withFileTypes:!0});for(let o of r){if(e.length>=om)break;let i=Ec.join(s,o.name);if(o.isDirectory()){lb.has(o.name)||t.push(i);continue}o.isFile()&&/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java)$/.test(o.name)&&e.push(i)}}return e}async function pb(n,e){let t=[],s=[],r=!1,o=!1,i=!1,a=0,c=0,u=0;for(let d of e){let m=Ec.relative(n,d),p=await im.readFile(d,"utf-8");/from\s+['"]next\/image['"]/.test(p)&&(r=!0),(/from\s+['"]@?heroui\//.test(p)||/from\s+['"]@nextui-org\//.test(p))&&(o=!0),/<UiButton\b|from\s+['"][^'"]*UiButton[^'"]*['"]/.test(p)&&(i=!0);let g=p.match(/:\s*any\b|<\s*any\s*>/g);g&&(a+=g.length,s.push({issue:"Unbounded any usage",file:m,suggestion:"Replace with specific types or justified unknown + narrowing.",severity:"high",language:"TypeScript",source:"repo",confidence:.92}));let f=p.match(/@ts-ignore/g);f&&(c+=f.length,s.push({issue:"Unchecked @ts-ignore usage",file:m,suggestion:"Use @ts-expect-error with reason or refactor typings.",severity:"medium",language:"TypeScript",source:"repo",confidence:.88})),/\.(tsx|jsx)$/.test(d)&&/<img\s+/.test(p)&&!/next\/image/.test(p)&&(u+=1,s.push({issue:"Raw <img> in React/Next component",file:m,suggestion:"Prefer framework image component or documented exception.",severity:"medium",framework:"Next.js",source:"repo",confidence:.8}))}return r&&t.push({name:"Image rendering via next/image",description:"Project uses next/image for optimized image delivery.",location:"app/** or src/**",framework:"Next.js",source:"repo",confidence:.9}),o&&t.push({name:"HeroUI as component system",description:"UI components are sourced from HeroUI/NextUI packages.",location:"components/**",source:"repo",confidence:.87}),i&&t.push({name:"Use UiButton abstraction",description:"Buttons are wrapped in UiButton instead of native button in app UI.",location:"components/**",source:"repo",confidence:.84}),(a>0||c>0||u>0)&&t.push({name:"Strict type/lint hygiene",description:`Detected ${a} any, ${c} ts-ignore, ${u} raw img potential violations.`,source:"repo",confidence:.76}),{patterns:t,antiPatterns:s}}function mb(n){let e=new Set,t=[];for(let s of n){let r=`${Gs(s.name)}::${Gs(s.source)}`;e.has(r)||(e.add(r),t.push(s))}return t}function gb(n){let e=new Set,t=[];for(let s of n){let r=`${Gs(s.issue)}::${Gs(s.file)}::${Gs(s.source)}`;e.has(r)||(e.add(r),t.push(s))}return t}var lb,om,Cc,fb,am,cm=b(()=>{"use strict";Wt();ne();lb=new Set([".git","node_modules",".next","dist","build","coverage",".turbo",".cache"]),om=400;l(Gs,"normalizeKey");l(ub,"repoHash");l(Go,"parseBaselineFile");l(db,"listSourceFiles");l(pb,"detectRepoRules");l(mb,"dedupePatterns");l(gb,"dedupeAntiPatterns");Cc=class{static{l(this,"PatternExtractor")}async extract(e){let t=ub(e.projectPath),s=await db(e.projectPath),r=[],o=[];for(let p of e.languages){let g=Gs(p),f=Go(`baseline/patterns/${g}.json`),k=Go(`baseline/anti-patterns/${g}.json`);r.push(...f.map(w=>({...w,language:p,source:"baseline",confidence:w.confidence??.8}))),o.push(...k.map(w=>({...w,file:w.file||"multiple",language:p,source:"baseline",confidence:w.confidence??.8})))}for(let p of e.frameworks){let g=Gs(p),f=Go(`baseline/patterns/${g}.json`),k=Go(`baseline/anti-patterns/${g}.json`);r.push(...f.map(w=>({...w,framework:p,source:"baseline",confidence:w.confidence??.82}))),o.push(...k.map(w=>({...w,file:w.file||"multiple",framework:p,source:"baseline",confidence:w.confidence??.82}))),e.context7Verified&&r.push({name:`${p} API validation via Context7`,description:`Validate ${p} APIs against current documentation through Context7 before implementation.`,framework:p,source:"context7",confidence:.7})}let i=await pb(e.projectPath,s),a=(e.feedback?.patternsDiscovered||[]).map(p=>({name:p,description:`Confirmed during completed tasks: ${p}`,source:"feedback",confidence:.75})),c=(e.feedback?.knownGotchas||[]).map(p=>({issue:p,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${p}`,source:"feedback",severity:"medium",confidence:.7})),u=mb([...r,...i.patterns,...a]),d=gb([...o,...i.antiPatterns,...c]),m=`analysis:derived-rules:${t}`;return x.setDoc(e.projectId,m,{projectId:e.projectId,repoPathHash:t,patterns:u,antiPatterns:d,updatedAt:new Date().toISOString(),version:1}),{patterns:u,antiPatterns:d,repoPathHash:t}}},fb=new Cc,am=fb});import xc from"node:fs/promises";import hb from"node:os";import lm from"node:path";function Ac(){return lm.join(hb.homedir(),".prjct-cli","skills",yb)}function wb(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function Tr(){try{let n=await xc.readFile(Ac(),"utf-8");return JSON.parse(n)}catch{return wb()}}async function Rc(n){let e=Ac();await xc.mkdir(lm.dirname(e),{recursive:!0}),n.generatedAt=new Date().toISOString(),await xc.writeFile(e,JSON.stringify(n,null,2),"utf-8")}async function kb(n){let e=await Tr();e.skills[n.name]=n,await Rc(e)}async function Sb(n){let e=await Tr();return n in e.skills?(delete e.skills[n],await Rc(e),!0):!1}async function bb(n){return(await Tr()).skills[n]||null}async function vb(){return(await Tr()).skills}function Tb(){return Ac()}var yb,Pr,um=b(()=>{"use strict";yb=".skill-lock.json";l(Ac,"getLockFilePath");l(wb,"createEmptyLockFile");l(Tr,"read");l(Rc,"write");l(kb,"addEntry");l(Sb,"removeEntry");l(bb,"getEntry");l(vb,"getAll");l(Tb,"getPath");Pr={read:Tr,write:Rc,addEntry:kb,removeEntry:Sb,getEntry:bb,getAll:vb,getPath:Tb}});import{exec as Pb}from"node:child_process";import os from"node:fs/promises";import Dc from"node:os";import nt from"node:path";import{promisify as Cb}from"node:util";import{glob as dm}from"glob";function mm(n){if(n.startsWith("./")||n.startsWith("/")||n.startsWith("~")){let s=n.startsWith("~")?nt.join(Dc.homedir(),n.slice(1)):nt.resolve(n);return{type:"local",localPath:s,url:s}}let e=n.indexOf("@");if(e>0){let s=n.slice(0,e),r=n.slice(e+1),[o,i]=s.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:r,url:`https://github.com/${o}/${i}`}}let t=n.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${n}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function gm(n){let e=[];try{let r=nt.join(n,"SKILL.md");await os.access(r);let o=nt.basename(n);e.push({name:o,filePath:r})}catch{}let t=await dm("*/SKILL.md",{cwd:n,absolute:!0});for(let r of t){let o=nt.basename(nt.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}let s=await dm("skills/*/SKILL.md",{cwd:n,absolute:!0});for(let r of s){let o=nt.basename(nt.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}return e}function Eb(n,e,t){let s=new Date().toISOString(),r=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${s}`];t&&r.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=n.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
|
|
710
710
|
${r.join(`
|
|
711
|
-
`)}`;return
|
|
711
|
+
`)}`;return n.replace(o,`---
|
|
712
712
|
${c}
|
|
713
713
|
---`)}return`---
|
|
714
714
|
${r.join(`
|
|
715
715
|
`)}
|
|
716
716
|
---
|
|
717
717
|
|
|
718
|
-
${
|
|
718
|
+
${n}`}function Ic(){return nt.join(Dc.homedir(),".claude","skills")}async function jc(n,e,t,s){let r=Ic(),o=nt.join(r,e),i=nt.join(o,"SKILL.md"),a=await os.readFile(n,"utf-8"),c=Eb(a,t,s);return await os.mkdir(o,{recursive:!0}),await os.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:s}}async function xb(n){let e={installed:[],skipped:[],errors:[]};if(!hr.isAvailable("git")){let s=hr.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${s.error?.hint||"Install git and try again."}`),e}let t=nt.join(Dc.tmpdir(),`prjct-skill-${Date.now()}`);try{let s=`https://github.com/${n.owner}/${n.repo}.git`;await pm(`git clone --depth 1 ${s} ${t}`,{timeout:wr("GIT_CLONE")});let r;try{let{stdout:a}=await pm("git rev-parse HEAD",{cwd:t,timeout:wr("TOOL_CHECK")});r=a.trim()}catch{}let o=await gm(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${n.owner}/${n.repo}`),e;let i=n.skillName?o.filter(a=>a.name===n.skillName):o;if(n.skillName&&i.length===0)return e.errors.push(`Skill "${n.skillName}" not found in ${n.owner}/${n.repo}`),e;for(let a of i)try{let c=await jc(a.filePath,a.name,n,r),u={name:a.name,source:{type:"github",url:`${n.owner}/${n.repo}`,sha:r},installedAt:new Date().toISOString(),filePath:c.filePath};await Pr.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${y(c)}`)}}finally{try{await os.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function Ab(n){let e={installed:[],skipped:[],errors:[]},t=n.localPath;try{await os.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await os.stat(t)).isFile()){let r=nt.basename(nt.dirname(t));try{let o=await jc(t,r,n),i={name:r,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await Pr.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${y(o)}`)}}else{let r=await gm(t);if(r.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of r)try{let i=await jc(o.filePath,o.name,n),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await Pr.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${y(i)}`)}}return e}async function Rb(n){let e=Ic(),t=nt.join(e,n);try{await os.rm(t,{recursive:!0,force:!0})}catch{}let s=nt.join(e,`${n}.md`);try{await os.rm(s,{force:!0})}catch{}return Pr.removeEntry(n)}async function jb(n){let e=mm(n);switch(e.type){case"github":return xb(e);case"local":return Ab(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var pm,fm,hm=b(()=>{"use strict";U();Ns();Xa();um();pm=Cb(Pb);l(mm,"parseSource");l(gm,"discoverSkills");l(Eb,"injectSourceMetadata");l(Ic,"getInstallDir");l(jc,"installSkillFile");l(xb,"installFromGitHub");l(Ab,"installFromLocal");l(Rb,"remove");l(jb,"install");fm={install:jb,remove:Rb,parseSource:mm,getInstallDir:Ic}});import At from"node:fs/promises";import Db from"node:os";import wt from"node:path";async function ym(n,e,t,s){let r=[],o=wt.join(n,"agents");try{let c=await At.readdir(o);for(let u of c)u.endsWith(".md")&&await At.unlink(wt.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:Z(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>Ib(c,o)));for(let c of i)r.push({name:c,type:"workflow"});let a=[];e.hasFrontend&&(a.push({name:"frontend",skill:"javascript-typescript"}),a.push({name:"uxui",skill:"frontend-design"})),e.hasBackend&&a.push({name:"backend",skill:"javascript-typescript"}),e.hasDatabase&&a.push({name:"database"}),e.hasTesting&&a.push({name:"testing",skill:"developer-kit"}),e.hasDocker&&a.push({name:"devops",skill:"developer-kit"}),await Promise.all(a.map(c=>$b(c.name,o,t,e,s)));for(let c of a)r.push({name:c.name,type:"domain",skill:c.skill});return r}async function wm(n){let e=wt.join(n,"agents"),t=[];try{let s=await At.readdir(e),r=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of s){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=r.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function km(n){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...n.matchAll(e)];if(t.length===0)return n;let s=n;for(let r of t){let o=r[1],i=ye(`subagents/${o}.md`);if(!i){let a=wt.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await At.readFile(a,"utf-8")}catch{s=s.replace(r[0],`<!-- partial "${o}" not found -->`);continue}}s=s.replace(r[0],i.trim())}return s}async function Ib(n,e){let t="";try{let s=wt.join(__dirname,"..","..","templates","subagents","workflow",`${n}.md`);t=await At.readFile(s,"utf-8"),t=await km(t)}catch(s){H.debug("Workflow agent template not found, generating minimal",{name:n,error:Z(s)}),t=Ob(n)}await At.writeFile(wt.join(e,`${n}.md`),t,"utf-8")}async function $b(n,e,t,s,r){let o="";try{let i=wt.join(__dirname,"..","..","templates","subagents","domain",`${n}.md`);o=await At.readFile(i,"utf-8"),o=await km(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",s.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:n,error:Z(i)}),o=_b(n,t,s)}o=Mb(o,n,r),await At.writeFile(wt.join(e,`${n}.md`),o,"utf-8")}function Mb(n,e,t){if(!t)return n;let{patternsDiscovered:s,knownGotchas:r,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(s.length>0||r.length>0||i.length>0))return n;let c=[`
|
|
719
719
|
## Recent Learnings (from completed tasks)
|
|
720
|
-
`];if(
|
|
721
|
-
`)}function Ob(
|
|
722
|
-
name: ${
|
|
723
|
-
description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[
|
|
720
|
+
`];if(s.length>0){c.push("### Discovered Patterns");for(let u of s)c.push(`- ${u}`);c.push("")}if(r.length>0){c.push("### Known Gotchas");for(let u of r)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return n+c.join(`
|
|
721
|
+
`)}function Ob(n){return`---
|
|
722
|
+
name: ${n}
|
|
723
|
+
description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[n]||"Workflow agent"}
|
|
724
724
|
tools: Read, Write, Glob
|
|
725
725
|
---
|
|
726
726
|
|
|
727
|
-
# ${
|
|
727
|
+
# ${n.toUpperCase()}
|
|
728
728
|
|
|
729
729
|
Workflow agent for prjct operations.
|
|
730
730
|
|
|
@@ -734,16 +734,16 @@ When invoked:
|
|
|
734
734
|
1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
|
|
735
735
|
2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
|
|
736
736
|
3. Execute requested operation
|
|
737
|
-
`}function _b(
|
|
738
|
-
name: ${
|
|
739
|
-
description: ${
|
|
737
|
+
`}function _b(n,e,t){return`---
|
|
738
|
+
name: ${n}
|
|
739
|
+
description: ${n.charAt(0).toUpperCase()+n.slice(1)} specialist for ${e.name}
|
|
740
740
|
tools: Read, Write, Glob, Grep
|
|
741
741
|
skills: []
|
|
742
742
|
---
|
|
743
743
|
|
|
744
|
-
# ${
|
|
744
|
+
# ${n.toUpperCase()} AGENT
|
|
745
745
|
|
|
746
|
-
Domain specialist for ${
|
|
746
|
+
Domain specialist for ${n} tasks.
|
|
747
747
|
|
|
748
748
|
## Project Context
|
|
749
749
|
|
|
@@ -753,49 +753,49 @@ Domain specialist for ${s} tasks.
|
|
|
753
753
|
|
|
754
754
|
## Your Role
|
|
755
755
|
|
|
756
|
-
You are the ${
|
|
757
|
-
`}function Sm(
|
|
758
|
-
`).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
|
|
759
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Wn('git log --oneline --since="1 week ago" | wc -l',{cwd:s});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:Z(t)})}return e}async function zt(s,e){try{return await Em.access($c.join(s,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:Z(t)}),!1}}async function Am(s){let e={fileCount:0,version:"0.0.0",name:$c.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Wn('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:s});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:s,error:Z(t)}),e.fileCount=0}try{let t=$c.join(s,"package.json"),n=JSON.parse(await Em.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let r={...n.dependencies,...n.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await zt(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:s,error:Z(t)})}return await zt(s,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await zt(s,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await zt(s,"requirements.txt")||await zt(s,"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 Rm(s){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 zt(s,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await zt(s,"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 zt(s,"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 zt(s,"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 zt(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Dm(s,e){let t=Hn(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[s.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function jm(s){return new Vo(s).detect()}var Wn,Im=b(()=>{"use strict";Yt();gc();hn();Cm();Wn=Fb(Nb);l(xm,"analyzeGit");l(zt,"fileExists");l(Am,"gatherStats");l(Rm,"detectCommands");l(Dm,"buildSources");l(jm,"detectStack")});import{exec as Lb}from"node:child_process";import Mc from"node:fs/promises";import Wo from"node:path";import{promisify as Ub}from"node:util";var Hb,Oc,_c,$m,Mm=b(()=>{"use strict";Et();U();Hb=Ub(Lb),Oc={async contextFilesExist(s){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let r of t){let o=Wo.join(s,r);try{await Mc.access(o)}catch{n.push(r)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(s){let e=Date.now(),t=[],n=Wo.basename(s);try{await F.read(n)}catch(r){P(r)||t.push(`state: ${y(r)}`)}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(s){let e=Date.now(),t=Wo.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await Mc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Mc.readFile(Wo.join(t,i),"utf-8");for(let c of n)if(c.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},_c=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Oc.contextFilesExist(t),Oc.jsonFilesValid(t),Oc.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Hb(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},$m=new _c});import Bo from"node:fs/promises";import zo from"node:path";var Nc,Bn,Fc=b(()=>{"use strict";lr();ha();Bd();qd();Qd();_a();Yt();Be();Qt();ft();Se();Io();ys();_n();se();Un();ic();uc();rn();Ps();Et();Vp();Bp();hc();fe();hn();zp();nm();fr();rm();Gn();cm();vm();Im();Mm();Nc=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r;if(!t.aiTools||t.aiTools.length===0){let i=await Fo(e),a=i.filter(u=>Cs.includes(u)||u==="codex"),c=i.filter(u=>!Cs.includes(u)&&u!=="codex");r=[...a.length>0?a:Cs,...c],r=Array.from(new Set(r))}else t.aiTools[0]==="auto"?(r=await Fo(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Fp("all",e):r=t.aiTools;let o={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(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],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 Rn()).installed){let _=await jo({autoRepair:!0});_.verified||H.warn(`Codex p. router not ready: ${_.message||"verification failed"}`)}try{o=await sn.ensureReady()}catch(_){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:!1,message:Z(_)},error:`Context7 MCP is required but not ready: ${Z(_)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await $o(this.projectId);try{let _=await Mo(this.projectId);_>0&&H.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){H.debug("Legacy JSON sweep failed (non-critical)",{error:Z(_)})}let[c,u,d,m]=await Promise.all([xm(this.projectPath),Am(this.projectPath),Rm(this.projectPath),jm(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,w=new Set;if(!p&&Jd(this.projectId))try{let{diff:_,currentHashes:Gi}=await La(this.projectPath,this.projectId),Jr=_.added.length+_.modified.length+_.deleted.length;if(Jr===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let tr=Vd(_,this.projectId);w=Wd(tr.allAffected);let Le=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=tr.allAffected.some(xn=>{let Mh=xn.substring(xn.lastIndexOf("."));return Le.has(Mh)}),k=tr.directlyChanged.some(xn=>xn==="package.json"||xn==="tsconfig.json"||xn.includes("Dockerfile")||xn.includes("docker-compose")),g={isIncremental:!0,filesChanged:Jr,filesUnchanged:_.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(w)}}Fa(this.projectId,Gi)}catch(_){H.debug("Incremental detection failed, falling back to full sync",{error:Z(_)})}else try{let{currentHashes:_}=await La(this.projectPath,this.projectId);Fa(this.projectId,_)}catch(_){H.debug("Hash computation failed (non-critical)",{error:Z(_)})}if(f)try{await Promise.all([ud(this.projectPath,this.projectId),Gd(this.projectPath,this.projectId),Yd(this.projectPath,this.projectId)])}catch(_){H.debug("File ranking index build failed (non-critical)",{error:Z(_)})}let C;if(k)try{let _=await F.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(C=_)}catch{}let T=k?await ym(this.globalPath,m,u,C):await wm(this.globalPath),O=Sm(T,this.projectId,this.globalPath),G=k?await bm(T):[],Q=Dm(u,d),ne=[],S;try{let _=await qe.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(S={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let j;try{j=await Wp(this.projectId)}catch{}let Ce={projectId:this.projectId,name:u.name,version:u.version,ecosystem:u.ecosystem,projectType:u.projectType,languages:u.languages,frameworks:u.frameworks,repoPath:this.projectPath,branch:c.branch,fileCount:u.fileCount,commits:c.commits,hasChanges:c.hasChanges,commands:d,agents:{workflow:T.filter(_=>_.type==="workflow").map(_=>_.name),domain:T.filter(_=>_.type==="domain").map(_=>_.name)},sources:Q,analysis:S,learnings:j},En=await Gp(Ce,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let cs=await qe.getActive(this.projectId),Br={patterns:cs?.patterns?.length||0,antiPatterns:cs?.antiPatterns?.length||0,criticalAntiPatterns:cs?.antiPatterns?.filter(_=>_.severity==="high").length||0},Ui=Date.now()-n,Hi=await this.recordSyncMetrics(u,ne,T,Ui);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ae.installGlobalConfig(),await Ae.syncCommands();let zr;try{let _=await $.readConfig(this.projectPath);zr=await $m.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){H.debug("Verification failed (non-critical)",{error:Z(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:T,skills:O,skillsInstalled:G,contextFiles:ne,aiTools:En.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Br,syncMetrics:Hi,verification:zr,incremental:g}}catch(i){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:o.verified,message:o.message},error:Z(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Bo.mkdir(zo.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=x.getDoc(this.projectId,"project")||{},r={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};x.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await F.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=v(),r.lastUpdated=v(),r.context={...r.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,r);try{await sm.generate(this.projectPath,r)}catch(o){H.debug("Local state generation failed (optional)",{error:Z(o)})}}async logToMemory(e,t){x.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,r){let i=0;for(let m of t)try{let p=zo.join(this.globalPath,m),g=await Bo.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:Z(p)})}for(let m of n)try{let p=zo.join(this.globalPath,"agents",`${m.name}.md`),g=await Bo.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:Z(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Ts.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:Z(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n,r){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await F.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 am.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...n.frameworks])),feedback:c,context7Verified:r});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:v(),status:"draft",commitHash:o??void 0})}catch(o){H.debug("Failed to save draft analysis (non-critical)",{error:Z(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,r,o]=await Promise.all([ht.archiveOldShipped(this.projectId).catch(()=>0),nt.markDormantIdeas(this.projectId).catch(()=>0),Oe.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),yt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=Ct.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:Z(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new In,n=await Sc.learnFromTaskHistory(this.projectId,e,t);try{let r=await tm.getFeatureOutcomes(this.projectId);r.length>0&&await Sc.learnFromOutcomes(this.projectId,r,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:Z(e)})}}async getCliVersion(){try{let e=zo.join(__dirname,"..","..","package.json");return JSON.parse(await Bo.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:Z(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:[]}}},Bn=new Nc});function Gb(){return`\u26A1 prjct
|
|
756
|
+
You are the ${n} expert for this project. Apply best practices for the detected stack.
|
|
757
|
+
`}function Sm(n,e,t){let s=[];for(let o of n)o.skill&&s.push({agent:o.name,skill:o.skill});let r={projectId:e,syncedAt:v(),skills:s.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(s.map(o=>[o.agent,o.skill]))};return At.writeFile(wt.join(t,"config","skills.json"),JSON.stringify(r,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:Z(o)})}),s}async function bm(n){let e=[];try{let t=wt.join(__dirname,"..","..","templates","config","skill-mappings.json"),s=await At.readFile(t,"utf-8"),o=JSON.parse(s).agentToSkillMap||{},i=[];for(let c of n){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=wt.join(Db.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=wt.join(a,d,"SKILL.md"),p=wt.join(a,`${d}.md`),g=!1;try{await At.access(m),g=!0}catch{try{await At.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let w=await fm.install(k);w.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):w.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:w.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:Z(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:Z(t)})}return e}var vm=b(()=>{"use strict";Wt();Yt();fe();fs();hm();l(ym,"generateAgents");l(wm,"loadExistingAgents");l(km,"resolveTemplateIncludes");l(Ib,"generateWorkflowAgent");l($b,"generateDomainAgent");l(Mb,"injectFeedbackSection");l(Ob,"generateMinimalWorkflowAgent");l(_b,"generateMinimalDomainAgent");l(Sm,"configureSkills");l(bm,"autoInstallSkills")});import Tm from"node:fs/promises";import Pm from"node:path";var Vo,Cm=b(()=>{"use strict";Vo=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(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(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.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Pm.join(this.projectPath,"package.json"),t=await Tm.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Tm.access(Pm.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as Nb}from"node:child_process";import Em from"node:fs/promises";import $c from"node:path";import{promisify as Fb}from"node:util";async function xm(n){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Vs("git branch --show-current",{cwd:n});e.branch=t.trim()||"main";let{stdout:s}=await Vs("git rev-list --count HEAD",{cwd:n});e.commits=parseInt(s.trim(),10)||0;let{stdout:r}=await Vs("git shortlog -sn --all | wc -l",{cwd:n});e.contributors=parseInt(r.trim(),10)||0;let{stdout:o}=await Vs("git status --porcelain",{cwd:n}),i=o.trim().split(`
|
|
758
|
+
`).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 Vs('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:n});e.recentCommits=a.split(`
|
|
759
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Vs('git log --oneline --since="1 week ago" | wc -l',{cwd:n});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:Z(t)})}return e}async function Jt(n,e){try{return await Em.access($c.join(n,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:Z(t)}),!1}}async function Am(n){let e={fileCount:0,version:"0.0.0",name:$c.basename(n),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Vs('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:n});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:n,error:Z(t)}),e.fileCount=0}try{let t=$c.join(n,"package.json"),s=JSON.parse(await Em.readFile(t,"utf-8"));e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript";let r={...s.dependencies,...s.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),s.devDependencies?.typescript||await Jt(n,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:n,error:Z(t)})}return await Jt(n,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Jt(n,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Jt(n,"requirements.txt")||await Jt(n,"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 Rm(n){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Jt(n,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Jt(n,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Jt(n,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Jt(n,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Jt(n,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function jm(n,e){let t=Us(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[n.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Dm(n){return new Vo(n).detect()}var Vs,Im=b(()=>{"use strict";Yt();gc();fs();Cm();Vs=Fb(Nb);l(xm,"analyzeGit");l(Jt,"fileExists");l(Am,"gatherStats");l(Rm,"detectCommands");l(jm,"buildSources");l(Dm,"detectStack")});import{exec as Lb}from"node:child_process";import Mc from"node:fs/promises";import Wo from"node:path";import{promisify as Ub}from"node:util";var Hb,Oc,_c,$m,Mm=b(()=>{"use strict";Et();U();Hb=Ub(Lb),Oc={async contextFilesExist(n){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let r of t){let o=Wo.join(n,r);try{await Mc.access(o)}catch{s.push(r)}}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(n){let e=Date.now(),t=[],s=Wo.basename(n);try{await F.read(s)}catch(r){C(r)||t.push(`state: ${y(r)}`)}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(n){let e=Date.now(),t=Wo.join(n,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await Mc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Mc.readFile(Wo.join(t,i),"utf-8");for(let c of s)if(c.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!C(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},_c=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let r=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[Oc.contextFilesExist(t),Oc.jsonFilesValid(t),Oc.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(f=>f.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 f=s.checks.slice(s.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await Hb(r,{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}}}},$m=new _c});import Bo from"node:fs/promises";import Jo from"node:path";var Nc,Ws,Fc=b(()=>{"use strict";lr();ha();Bd();qd();Qd();_a();Yt();Be();Qt();ft();Se();Io();yn();Os();ne();Ls();ic();uc();rs();Pn();Et();Vp();Bp();hc();fe();fs();Jp();sm();fr();rm();Hs();cm();vm();Im();Mm();Nc=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(),r;if(!t.aiTools||t.aiTools.length===0){let i=await Fo(e),a=i.filter(u=>Cn.includes(u)||u==="codex"),c=i.filter(u=>!Cn.includes(u)&&u!=="codex");r=[...a.length>0?a:Cn,...c],r=Array.from(new Set(r))}else t.aiTools[0]==="auto"?(r=await Fo(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Fp("all",e):r=t.aiTools;let o={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(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],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 As()).installed){let _=await Do({autoRepair:!0});_.verified||H.warn(`Codex p. router not ready: ${_.message||"verification failed"}`)}try{o=await ns.ensureReady()}catch(_){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:!1,message:Z(_)},error:`Context7 MCP is required but not ready: ${Z(_)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await $o(this.projectId);try{let _=await Mo(this.projectId);_>0&&H.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){H.debug("Legacy JSON sweep failed (non-critical)",{error:Z(_)})}let[c,u,d,m]=await Promise.all([xm(this.projectPath),Am(this.projectPath),Rm(this.projectPath),Dm(this.projectPath)]),p=t.full===!0,g,f=!0,k=!0,w=new Set;if(!p&&zd(this.projectId))try{let{diff:_,currentHashes:Gi}=await La(this.projectPath,this.projectId),zr=_.added.length+_.modified.length+_.deleted.length;if(zr===0&&!t.changedFiles?.length)f=!1,k=!1,g={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let tr=Vd(_,this.projectId);w=Wd(tr.allAffected);let Le=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=tr.allAffected.some(Es=>{let Mh=Es.substring(Es.lastIndexOf("."));return Le.has(Mh)}),k=tr.directlyChanged.some(Es=>Es==="package.json"||Es==="tsconfig.json"||Es.includes("Dockerfile")||Es.includes("docker-compose")),g={isIncremental:!0,filesChanged:zr,filesUnchanged:_.unchanged.length,indexesRebuilt:f,agentsRegenerated:k,affectedDomains:Array.from(w)}}Fa(this.projectId,Gi)}catch(_){H.debug("Incremental detection failed, falling back to full sync",{error:Z(_)})}else try{let{currentHashes:_}=await La(this.projectPath,this.projectId);Fa(this.projectId,_)}catch(_){H.debug("Hash computation failed (non-critical)",{error:Z(_)})}if(f)try{await Promise.all([ud(this.projectPath,this.projectId),Gd(this.projectPath,this.projectId),Yd(this.projectPath,this.projectId)])}catch(_){H.debug("File ranking index build failed (non-critical)",{error:Z(_)})}let E;if(k)try{let _=await F.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(E=_)}catch{}let T=k?await ym(this.globalPath,m,u,E):await wm(this.globalPath),O=Sm(T,this.projectId,this.globalPath),G=k?await bm(T):[],Q=jm(u,d),se=[],S;try{let _=await qe.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(S={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let D;try{D=await Wp(this.projectId)}catch{}let Ce={projectId:this.projectId,name:u.name,version:u.version,ecosystem:u.ecosystem,projectType:u.projectType,languages:u.languages,frameworks:u.frameworks,repoPath:this.projectPath,branch:c.branch,fileCount:u.fileCount,commits:c.commits,hasChanges:c.hasChanges,commands:d,agents:{workflow:T.filter(_=>_.type==="workflow").map(_=>_.name),domain:T.filter(_=>_.type==="domain").map(_=>_.name)},sources:Q,analysis:S,learnings:D},Cs=await Gp(Ce,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(c,u),this.updateStateJson(u,m),this.logToMemory(c,u),this.saveDraftAnalysis(c,u,m,o.verified)]);let cn=await qe.getActive(this.projectId),Br={patterns:cn?.patterns?.length||0,antiPatterns:cn?.antiPatterns?.length||0,criticalAntiPatterns:cn?.antiPatterns?.filter(_=>_.severity==="high").length||0},Ui=Date.now()-s,Hi=await this.recordSyncMetrics(u,se,T,Ui);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ae.installGlobalConfig(),await Ae.syncCommands();let Jr;try{let _=await $.readConfig(this.projectPath);Jr=await $m.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){H.debug("Verification failed (non-critical)",{error:Z(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:c,stats:u,commands:d,stack:m,agents:T,skills:O,skillsInstalled:G,contextFiles:se,aiTools:Cs.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),context7:{installed:o.installed,verified:o.verified,message:o.message},analysisSummary:Br,syncMetrics:Hi,verification:Jr,incremental:g}}catch(i){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],context7:{installed:o.installed,verified:o.verified,message:o.message},error:Z(i)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Bo.mkdir(Jo.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=x.getDoc(this.projectId,"project")||{},r={...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||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};x.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await F.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=v(),r.lastUpdated=v(),r.context={...r.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,r);try{await nm.generate(this.projectPath,r)}catch(o){H.debug("Local state generation failed (optional)",{error:Z(o)})}}async logToMemory(e,t){x.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,s,r){let i=0;for(let m of t)try{let p=Jo.join(this.globalPath,m),g=await Bo.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:Z(p)})}for(let m of s)try{let p=Jo.join(this.globalPath,"agents",`${m.name}.md`),g=await Bo.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:Z(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await Tn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:s.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:Z(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,s,r){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await F.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 am.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:r});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:v(),status:"draft",commitHash:o??void 0})}catch(o){H.debug("Failed to save draft analysis (non-critical)",{error:Z(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,r,o]=await Promise.all([ht.archiveOldShipped(this.projectId).catch(()=>0),st.markDormantIdeas(this.projectId).catch(()=>0),Oe.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),yt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+r.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:r.length,memoryCapped:o,total:i});let a=Ct.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:Z(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Ds,s=await Sc.learnFromTaskHistory(this.projectId,e,t);try{let r=await tm.getFeatureOutcomes(this.projectId);r.length>0&&await Sc.learnFromOutcomes(this.projectId,r,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:Z(e)})}}async getCliVersion(){try{let e=Jo.join(__dirname,"..","..","package.json");return JSON.parse(await Bo.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:Z(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:[]}}},Ws=new Nc});function Gb(){return`\u26A1 prjct
|
|
760
760
|
|
|
761
761
|
---`}function Vb(){return`---
|
|
762
|
-
\u26A1 prjct \xB7 v${ca()}`}function L(...
|
|
763
|
-
`)}function Om(
|
|
764
|
-
${
|
|
765
|
-
\`\`\``}function Uc(
|
|
766
|
-
${e}`}function Re(
|
|
767
|
-
`)}function Hc(
|
|
768
|
-
> ${e.join(" | ")}`:"";return`## \u26A1 ${
|
|
769
|
-
${Lc(t,
|
|
770
|
-
${
|
|
771
|
-
`)}`}function le(
|
|
772
|
-
${Lc(e,t)}`}function ut(
|
|
773
|
-
> ${e}`:`## \u2705 ${
|
|
774
|
-
|
|
775
|
-
`)}function Rt(
|
|
776
|
-
Next:`));for(let o of r){let i=Cr.cyan(o.cmd.padEnd(12));console.log(Cr.dim(` ${i} \u2192 ${o.desc}`))}}function
|
|
777
|
-
`),this))},done(
|
|
778
|
-
`),
|
|
779
|
-
${ie.bold(
|
|
780
|
-
`),this)},progress(
|
|
781
|
-
`),this)}},h=Yb});import
|
|
762
|
+
\u26A1 prjct \xB7 v${ca()}`}function L(...n){return Wb(Gb(),...n.filter(Boolean),Vb())}function Lc(n,e){let t=`| ${n.join(" | ")} |`,s=`|${n.map(()=>"---").join("|")}|`,r=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...r].join(`
|
|
763
|
+
`)}function Om(n,e=""){return`\`\`\`${e}
|
|
764
|
+
${n}
|
|
765
|
+
\`\`\``}function Uc(n,e){return`> ${{success:"\u2705",warn:"\u26A0\uFE0F",error:"\u274C",info:"\u2139\uFE0F"}[n]} **${e}**`}function te(n,e,t=3){return`### ${n}
|
|
766
|
+
${e}`}function Re(n,e=!1){return n.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
|
|
767
|
+
`)}function Hc(n){let e=[];n.branch&&e.push(`Branch: \`${n.branch}\``),n.linearId&&e.push(`Linear: \`${n.linearId}\``),n.type&&e.push(`Type: ${n.type}`),n.estimatedPoints&&e.push(`~${n.estimatedPoints}pts`),n.estimatedMinutes&&e.push(`~${n.estimatedMinutes}min`),n.domains&&n.domains.length>0&&e.push(`Domains: ${n.domains.join(", ")}`),n.duration&&e.push(`Duration: ${n.duration}`),n.status&&e.push(`Status: ${n.status}`);let t=e.length>0?`
|
|
768
|
+
> ${e.join(" | ")}`:"";return`## \u26A1 ${n.description}${t}`}function _m(n,e){let t=["#","Status","Description"],s=n.map((r,o)=>{let i=String(o+1),a;r.status==="completed"?a="\u2705":o===e?a="\u{1F504}":a="\u2B1C";let c=o===e?" **\u2190 current**":"";return[i,a,`${r.description}${c}`]});return`### Subtasks
|
|
769
|
+
${Lc(t,s)}`}function Nm(n){return n.length===0?"":`### Relevant Files
|
|
770
|
+
${n.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",r=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${r}`}).join(`
|
|
771
|
+
`)}`}function le(n){let e=["Command","Action"],t=n.map(s=>[`\`${s.command}\``,s.label]);return`### Next
|
|
772
|
+
${Lc(e,t)}`}function ut(n){let e=Object.entries(n).filter(([,r])=>r!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([r,o])=>[r,String(o)]);return Lc(t,s)}function we(n,e){return e?`## \u2705 ${n}
|
|
773
|
+
> ${e}`:`## \u2705 ${n}`}function Fm(n){return`> \u26A0\uFE0F **${n}**`}function Wb(...n){return n.filter(Boolean).join(`
|
|
774
|
+
|
|
775
|
+
`)}function Rt(n,e,t,s){console.log(JSON.stringify({status:n,reason:e,...s,options:t}))}var En=b(()=>{"use strict";Pt();l(Gb,"mdHeader");l(Vb,"mdFooter");l(L,"mdOutput");l(Lc,"mdTable");l(Om,"mdCodeBlock");l(Uc,"mdCallout");l(te,"mdSection");l(Re,"mdList");l(Hc,"mdTaskHeader");l(_m,"mdSubtasks");l(Nm,"mdRelevantFiles");l(le,"mdNextSteps");l(ut,"mdStats");l(we,"mdDone");l(Fm,"mdWarn");l(Wb,"mdJoin");l(Rt,"mdActionRequired")});import Cr from"chalk";function kt(n,e={}){if(e.quiet)return;let t=Um[n]||"idle",s=Ms.getValidCommands(t);if(s.length===0)return;let r=s.map(o=>({cmd:`p. ${o}`,desc:Lm[o]||o}));console.log(Cr.dim(`
|
|
776
|
+
Next:`));for(let o of r){let i=Cr.cyan(o.cmd.padEnd(12));console.log(Cr.dim(` ${i} \u2192 ${o.desc}`))}}function zo(n){let e=Um[n]||"idle";return Ms.getValidCommands(e).map(s=>({cmd:`p. ${s}`,desc:Lm[s]||s}))}function Er(n){let e=Ms.getStateInfo(n);console.log(Cr.dim(`\u{1F4CD} State: ${Cr.white(n.toUpperCase())} - ${e.description}`))}var Lm,Um,xn=b(()=>{"use strict";Ea();Lm={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(kt,"showNextSteps");l(zo,"getNextSteps");l(Er,"showStateInfo")});import Bs from"chalk";var Hm,Bb,Jb,Ot,Gm=b(()=>{"use strict";Be();Hm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Bb=80,Jb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Hm,speed:Bb},cli:{header:l(()=>`${Bs.cyan.bold("\u26A1")} ${Bs.cyan("prjct")}`,"header"),footer:l(()=>Bs.dim("\u26A1 prjct"),"footer"),spin:l((n,e)=>`${Bs.cyan("\u26A1")} ${Bs.cyan("prjct")} ${Bs.cyan(Hm[n%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((n="claude")=>eo(n).commitFooter,"getCommitFooter"),getSignature:l((n="claude")=>eo(n).signature,"getSignature")},Ot=Jb});import ie from"chalk";function Kb(){return zb[qb]}var lM,Gc,zb,qb,Js,An,Vc,St,ys,Xb,Yb,h,zs=b(()=>{"use strict";Gm();Ns();Po();Po();lM=Ot.spinner.frames,Gc=Ot.spinner.speed,zb={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}},qb="compact";l(Kb,"getTierConfig");Js={success:ie.green("\u2713"),fail:ie.red("\u2717"),warn:ie.yellow("\u26A0"),info:ie.blue("\u2139"),debug:ie.dim("\u{1F527}"),bullet:ie.dim("\u2022"),arrow:ie.dim("\u2192"),check:ie.green("\u2713"),cross:ie.red("\u2717"),spinner:ie.cyan("\u25D0")},An=null,Vc=0,St=!1,ys=l((n,e)=>{let t=e??(Kb().maxCharsPerLine||$t.FALLBACK_TRUNCATE);return n&&n.length>t?`${n.slice(0,t-1)}\u2026`:n||""},"truncate"),Xb=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat($t.CLEAR_WIDTH)}\r`):!0,"clear"),Yb={start(){return St||console.log(Ot.cli.header()),this},end(){return St||console.log(Ot.cli.footer()),this},spin(n){return St?this:(this.stop(),process.stdout.isTTY?(An=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,ys(n,$t.SPINNER_MSG))}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,ys(n,$t.SPINNER_MSG))}
|
|
777
|
+
`),this))},done(n,e){if(this.stop(),!St){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=ie.dim(` [${s.join(" | ")}]`))}console.log(`${Js.success} ${ys(n,$t.DONE_MSG)}${t}`)}return this},fail(n){return this.stop(),console.error(`${Js.fail} ${ys(n,$t.FAIL_MSG)}`),this},failWithHint(n){this.stop();let e=typeof n=="string"?za(n):n;return console.error(),console.error(`${Js.fail} ${e.message}`),e.file&&console.error(ie.dim(` File: ${e.file}`)),e.hint&&console.error(ie.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ie.dim(` Docs: ${e.docs}`)),console.error(),this},warn(n){return this.stop(),St||console.log(`${Js.warn} ${ys(n,$t.WARN_MSG)}`),this},info(n){return this.stop(),St||console.log(`${Js.info} ${n}`),this},debug(n){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!St&&e&&console.log(`${Js.debug} ${ie.dim(n)}`),this},success(n,e){return this.done(n,e)},list(n,e={}){if(this.stop(),St)return this;let t=e.bullet||Js.bullet,s=" ".repeat(e.indent||0);for(let r of n)console.log(`${s}${t} ${r}`);return this},table(n,e={}){if(this.stop(),St||n.length===0)return this;let t=Object.keys(n[0]),s={};for(let r of t){s[r]=r.length;for(let o of n){let i=String(o[r]??"");i.length>s[r]&&(s[r]=i.length)}}if(e.header!==!1){let r=t.map(o=>o.padEnd(s[o])).join(" ");console.log(ie.dim(r)),console.log(ie.dim("\u2500".repeat(r.length)))}for(let r of n){let o=t.map(i=>String(r[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(n,e){if(this.stop(),St)return this;let t=e.split(`
|
|
778
|
+
`),s=Math.max(n.length,...t.map(o=>o.length)),r="\u2500".repeat(s+2);console.log(ie.dim(`\u250C${r}\u2510`)),console.log(`${ie.dim("\u2502")} ${ie.bold(n.padEnd(s))} ${ie.dim("\u2502")}`),console.log(ie.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${ie.dim("\u2502")} ${o.padEnd(s)} ${ie.dim("\u2502")}`);return console.log(ie.dim(`\u2514${r}\u2518`)),this},section(n){return this.stop(),St?this:(console.log(`
|
|
779
|
+
${ie.bold(n)}`),console.log(ie.dim("\u2500".repeat(n.length))),this)},stop(){return An&&(clearInterval(An),An=null,Xb()),this},step(n,e,t){if(St)return this;this.stop();let s=ie.dim(`[${n}/${e}]`);return process.stdout.isTTY?(An=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,`${s} ${ys(t,$t.STEP_MSG)}`)}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,`${s} ${ys(t,$t.STEP_MSG)}`)}
|
|
780
|
+
`),this)},progress(n,e,t){if(St)return this;this.stop();let s=Math.round(n/e*100),r=Math.round(s/10),o=10-r,i=ie.cyan("\u2588".repeat(r))+ie.dim("\u2591".repeat(o)),a=t?` ${ys(t,$t.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(An=setInterval(()=>{process.stdout.write(`\r${Ot.cli.spin(Vc++,`[${i}] ${s}%${a}`)}`)},Gc),this):(process.stdout.write(`${Ot.cli.spin(0,`[${i}] ${s}%${a}`)}
|
|
781
|
+
`),this)}},h=Yb});import zt from"chalk";function Qb(n){return Vm[n.toLowerCase()]||Vm.default}var Vm,Wc,qo,Wm=b(()=>{"use strict";Vm={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(Qb,"getIcon");Wc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(zt.cyan(`
|
|
782
782
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
783
|
-
`))}startAgent(e,t,
|
|
784
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let
|
|
785
|
-
`)}function
|
|
786
|
-
`)}var qm,ov,Ko,Km=b(()=>{"use strict";qm=["ship","feature","spec","cleanup","migrate"];l(
|
|
787
|
-
`;return
|
|
788
|
-
`}),
|
|
783
|
+
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let r=Qb(t);console.log(zt.cyan(`\u250C\u2500 ${r} ${e} (${t})`)),s&&console.log(zt.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(zt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(zt.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),r=e?zt.green("\u2713"):zt.red("\u2717");console.log(`\u2514\u2500 ${r} ${e?"Complete":"Failed"} ${zt.dim(`(${s})`)}
|
|
784
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${zt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(zt.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},qo=new Wc});import Ye from"chalk";function Zb(n){let e=0;for(let s of n)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Bm.length;return Bm[t]}function ev(n,e,t="\u25B6"){let s=Ye.dim(String(n+1).padStart(2)),o=Zb(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=Ye.green("\u2713 Complete");break;case"in_progress":a=Ye.yellow(`${t} Working...`);break;case"pending":a=Ye.gray("\u25CB Pending");break;case"failed":a=Ye.red("\u2717 Failed");break;case"blocked":a=Ye.gray("\u2298 Blocked");break;default:a=Ye.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function tv(n){if(n.length===0)return"";let e=[];e.push(""),e.push(` ${Ye.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ye.dim("\u2500".repeat(58))}`);for(let t=0;t<n.length;t++)e.push(ev(t,n[t]));return e.push(""),e.join(`
|
|
785
|
+
`)}function Jm(n){console.log(tv(n))}var Bm,zm=b(()=>{"use strict";Bm=[Ye.cyan,Ye.magenta,Ye.yellow,Ye.blue,Ye.green,Ye.redBright,Ye.magentaBright,Ye.cyanBright];l(Zb,"getDomainColor");l(ev,"formatSubtaskLine");l(tv,"renderSubtaskProgress");l(Jm,"printSubtaskProgress")});function sv(n){return qm.includes(n)}async function nv(n,e,t){let s=[],r=[],o=[];switch(n){case"ship":t.now&&!t.now.includes("No current task")?s.push({step:"Has active task",passed:!0}):(s.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?s.push({step:"Shipped log accessible",passed:!0}):s.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),r.push("Read current task from now.md"),r.push("Calculate duration"),r.push("Append to shipped.md"),r.push("Clear now.md"),r.push("Update metrics");break;case"feature":e.params.description||e.params.feature?s.push({step:"Has feature description",passed:!0}):(s.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?s.push({step:"Project analyzed",passed:!0}):s.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),r.push("Parse feature description"),r.push("Generate tasks breakdown"),r.push("Add to roadmap.md"),r.push("Add tasks to next.md"),r.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?s.push({step:"Has spec name",passed:!0}):(s.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),r.push("Generate spec template"),r.push("Analyze requirements"),r.push("Create spec file"),r.push("Link to roadmap");break;case"cleanup":t.analysis?s.push({step:"Has code analysis",passed:!0}):s.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),r.push("Scan for unused code"),r.push("Identify dead imports"),r.push("List files to clean"),r.push("Show preview"),r.push("Wait for approval"),r.push("Execute cleanup");break;case"migrate":s.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),r.push("Analyze current state"),r.push("Generate migration plan"),r.push("Show affected files"),r.push("Request approval"),r.push("Execute migration"),r.push("Verify results");break;default:r.push("Execute command");break}let i=s.filter(u=>u.passed).length,a=s.length,c=a>0?i/a:1;return{commandName:n,reasoning:s.length>0?{steps:s,allPassed:o.length===0,criticalIssues:o}:null,plan:r,confidence:c}}function rv(n){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${n.commandName}`),e.push(""),n.reasoning&&(e.push("Steps:"),n.reasoning.steps.forEach(t=>{let s=t.passed?"\u2705":"\u274C";e.push(` ${s} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),n.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),n.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),n.plan.length>0&&(e.push("Plan:"),n.plan.forEach((t,s)=>{e.push(` ${s+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(n.confidence*100)}%`),e.join(`
|
|
786
|
+
`)}var qm,ov,Ko,Km=b(()=>{"use strict";qm=["ship","feature","spec","cleanup","migrate"];l(sv,"requiresReasoning");l(nv,"reason");l(rv,"formatPlan");ov={requiresReasoning:sv,reason:nv,formatPlan:rv,REASONING_REQUIRED_COMMANDS:qm},Ko=ov});import xr from"node:fs/promises";var Bc,iv,dt,Jc=b(()=>{"use strict";ft();Se();U();ka();Bc=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new hn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await $.getProjectId(e),r=A.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:r,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={},r=Object.entries(e.paths),o=t?r.filter(([a])=>t.includes(a)):r;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await xr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(C(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([xr.readFile(d,"utf-8"),xr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(C(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"]},r=s[t]||s.default;return this.loadState(e,r)}async batchRead(e){let t=new Map,s=[];for(let r of e){let o=this._cache.get(r);o!==null?t.set(r,o.content):s.push(r)}if(s.length>0){let r=s.map(async i=>{try{let a=await xr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(C(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(r);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await xr.access(e),!0}catch(t){if(C(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},iv=new Bc,dt=iv});import{exec as av}from"node:child_process";import je from"node:fs/promises";import Xm from"node:os";import ws from"node:path";import{promisify as cv}from"node:util";function Ym(n){let e=Math.floor(n/36e5),t=Math.floor(n%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function zc(n){return n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function uv(n){if(n.verified||n.warnings.length===0)return null;let e=` Ground Truth Warnings:
|
|
787
|
+
`;return n.warnings.forEach(t=>{e+=` - ${t}
|
|
788
|
+
`}),n.recommendations.length>0&&(e+=`
|
|
789
789
|
Recommendations:
|
|
790
|
-
`,
|
|
791
|
-
`})),e}async function Qm(
|
|
792
|
-
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let r=kn.join(s.projectPath,"package.json");try{let i=await De.readFile(r,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(P(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=s.paths.shipped;try{let i=await De.readFile(o,"utf-8");n.shippedExists=!0;let a=s.params.feature||s.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${Jc(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(P(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await De.readFile(r,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(P(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function eg(s){let e=[],t=[],n={},r=s.paths.next;try{let a=await De.readFile(r,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(P(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=s.paths.roadmap;try{let a=await De.readFile(o,"utf-8");n.roadmapExists=!0;let c=s.params.description||s.params.feature;c&&new RegExp(Jc(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(P(a))n.roadmapExists=!1;else throw a}let i=s.paths.now;try{let a=await De.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(P(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function tg(s){let e=[],t=[],n={},r=s.paths.now;try{let i=await De.readFile(r,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&s.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(P(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=s.paths.next;try{let a=((await De.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!s.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(P(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ng(s){let e=[],t=[],n={},r=kn.join(s.projectPath,".prjct/prjct.config.json");try{let i=await De.readFile(r,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(P(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=kn.join(Xm.homedir(),".prjct-cli");try{await De.access(o,De.constants.W_OK),n.globalPathWritable=!0}catch(i){if(P(i))try{await De.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function sg(s){let e=[],t=[],n={},r=kn.join(s.projectPath,".prjct/prjct.config.json");try{let a=await De.readFile(r,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(P(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=kn.join(Xm.homedir(),".prjct-cli/projects",o||"");try{await De.access(i),n.globalStorageExists=!0}catch(a){if(P(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function rg(s){let e=[],t=[],n={},r=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of r)try{await De.access(kn.join(s.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!P(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await De.stat(kn.join(s.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!P(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function og(s){let e=[],t=[],n={},r=s.paths.specs;try{await De.access(r),n.specsExists=!0;let i=await De.readdir(r);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(P(i))n.specsExists=!1,n.specCount=0;else throw i}let o=s.params.feature||s.params.name||s.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ag(s,e,t){let n=ig[s];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(r){return{verified:!1,actual:{},warnings:[`Verification error: ${y(r)}`],recommendations:["Check file permissions and project configuration"]}}}async function dv(s,e,t){let n=await ag(s,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:s}}}function pv(s){return["done","ship","feature","spec","now","init","sync","analyze"].includes(s)}var lv,ig,mv,Xo,cg=b(()=>{"use strict";U();lv=cv(av);l(Ym,"formatDuration");l(Jc,"escapeRegex");l(uv,"formatWarnings");l(Qm,"verifyDone");l(Zm,"verifyShip");l(eg,"verifyFeature");l(tg,"verifyNow");l(ng,"verifyInit");l(sg,"verifySync");l(rg,"verifyAnalyze");l(og,"verifySpec");ig={done:Qm,ship:Zm,feature:eg,now:tg,init:ng,sync:sg,analyze:rg,spec:og};l(ag,"verify");l(dv,"prepareCommand");l(pv,"requiresVerification");mv={verify:ag,prepareCommand:dv,requiresVerification:pv,verifiers:ig,formatWarnings:uv,formatDuration:Ym,escapeRegex:Jc,verifyDone:Qm,verifyShip:Zm,verifyFeature:eg,verifyNow:tg,verifyInit:ng,verifySync:sg,verifyAnalyze:rg,verifySpec:og},Xo=mv});function fv(s){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."}[s]||"Verify actual state before proceeding."}function hv(s){if(!s||typeof s!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of gv)if(e.test(s))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:fv(t)};return{detected:!1}}function yv(s,e){if(!s||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(s)===t(e)}function wv(s){if(!s||s.length===0)return{type:"unknown",description:"No error information"};let e=s[s.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 kv(s,e,t){let n={permission:`I've tried ${s} ${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 ${s}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${s} from completing.`,validation:`Validation keeps failing for ${s}.`,config:`There seems to be a configuration issue affecting ${s}.`,unknown:`I've tried ${s} ${t} times without success.`};return n[e.type]||n.unknown}function Sv(s){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[s.type]||e.unknown}var gv,qc,bv,Rs,lg=b(()=>{"use strict";gv=[{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(fv,"getHallucinationSuggestion");l(hv,"detectHallucination");l(yv,"isSimilarError");l(wv,"analyzeErrorPattern");l(kv,"generateEscalationMessage");l(Sv,"generateSuggestion");qc=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let r=this._getKey(e,t),o=Date.now(),i=this._attempts.get(r);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(r,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return!1;if(r.attempts>=2&&!r.success){let o=r.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>yv(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);return r?r.attempts>=this.maxAttempts&&!r.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);if(!r)return null;let o=wv(r.errors);return{status:"BLOCKED",command:e,context:t,attempts:r.attempts,duration:r.lastAttempt-r.firstAttempt,errorPattern:o,message:kv(e,o,this.maxAttempts),suggestion:Sv(o),lastError:r.errors[r.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),r=this._attempts.get(n);r&&(r.success=!0,r.attempts=0,r.errors=[],this._attempts.set(n,r))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return hv(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},bv=new qc,Rs=bv});import{z as ue}from"zod";var vv,Tv,ug,LM,UM,HM,Sn,dg,Ar=b(()=>{"use strict";vv=ue.enum(["improving","stable","declining"]),Tv=ue.object({sprintNumber:ue.number(),startDate:ue.string(),endDate:ue.string(),pointsCompleted:ue.number(),tasksCompleted:ue.number(),avgVariance:ue.number(),estimationAccuracy:ue.number()}),ug=ue.object({category:ue.string(),avgVariance:ue.number(),taskCount:ue.number()}),LM=ue.object({totalPoints:ue.number(),sprints:ue.number(),estimatedDate:ue.string()}),UM=ue.object({sprints:ue.array(Tv),averageVelocity:ue.number(),velocityTrend:vv,estimationAccuracy:ue.number(),overEstimated:ue.array(ug),underEstimated:ue.array(ug),lastUpdated:ue.string()}),HM=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)}),Sn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},dg={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});function Kc(s,e){let t=Rr(e),n=Pv[t.startDay],r=new Date(s);r.setHours(0,0,0,0);let i=(r.getDay()-n+7)%7;return r.setDate(r.getDate()-i),r}function Cv(s,e){let t=Rr(e),n=new Date(s);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function Ev(s,e,t){let n=Rr(t),r=Kc(s,t),o=Kc(e,t),i=r.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Yo(s,e=Sn){let t=Rr(e);if(s.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=xv(s,e),r=Av(n,t.accuracyTolerance),o=r.slice(-t.windowSize),i=jv(o),a=Rv(o),c=Dv(s,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Iv(s);return{sprints:r,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function mg(s,e,t=Sn){let n=Rr(t);if(e<=0)return{totalPoints:s,sprints:0,estimatedDate:""};let r=Math.ceil(s/e),o=r*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:s,sprints:r,estimatedDate:i.toISOString()}}function xv(s,e){let t=new Map,n=s.map(o=>new Date(o.completedAt)),r=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of s){let i=new Date(o.completedAt),a=Ev(i,r,e);if(!t.has(a)){let c=Kc(i,e),u=Cv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Av(s,e){let t=[];for(let[,n]of s){let r=n.outcomes.reduce((u,d)=>u+$v(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Yc(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:r,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,r)=>n.sprintNumber-r.sprintNumber)}function Rv(s){if(s.length<3)return"stable";let e=s.map(d=>d.pointsCompleted),t=e.length,n=0,r=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,r+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*r)/(t*i-n*n),c=r/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function Dv(s,e){let t=s.filter(r=>r.variance);if(t.length===0)return 0;let n=t.filter(r=>{let o=Yc(r);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function jv(s){if(s.length===0)return 0;let e=s.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/s.length*10)/10}function Iv(s){let e=new Map;for(let r of s){if(!r.variance)continue;let o=Yc(r),i=r.tags&&r.tags.length>0?r.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[r,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:r,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:r,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((r,o)=>o.avgVariance-r.avgVariance),n.sort((r,o)=>o.avgVariance-r.avgVariance),{overEstimated:t,underEstimated:n}}function Yc(s){if(!s.variance)return 0;let e=Xc(s.estimatedDuration),t=Xc(s.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Xc(s){let e=0,t=s.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=s.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),s.match(/(\d+)s/)&&e===0&&(e=1),e}function gg(s){if(s.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${s.averageVelocity} pts/sprint (trend: ${s.velocityTrend})`),e.push(`Estimation accuracy: ${s.estimationAccuracy}%`);for(let t of s.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of s.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
|
|
793
|
-
`)}function $v(
|
|
790
|
+
`,n.recommendations.forEach(t=>{e+=` -> ${t}
|
|
791
|
+
`})),e}async function Qm(n){let e=[],t=[],s={},r=n.paths.now;try{let a=await je.readFile(r,"utf-8");s.nowExists=!0,s.nowContent=a.trim(),s.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){s.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(s.durationMs=Date.now()-u.getTime(),s.durationFormatted=Ym(s.durationMs))}}catch(a){if(C(a))s.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=n.paths.next;try{let a=await je.readFile(o,"utf-8");s.nextExists=!0;let c=a.match(/- \[ \]/g)||[];s.pendingTasks=c.length}catch(a){if(C(a))s.nextExists=!1,s.pendingTasks=0;else throw a}let i=n.paths.metrics;try{await je.access(ws.dirname(i),je.constants.W_OK),s.metricsWritable=!0}catch(a){if(C(a))s.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function Zm(n){let e=[],t=[],s={};try{let{stdout:i}=await lv("git status --porcelain",{cwd:n.projectPath});s.hasUncommittedChanges=i.trim().length>0,s.uncommittedFiles=i.trim().split(`
|
|
792
|
+
`).filter(Boolean).length,s.hasUncommittedChanges&&(e.push(`${s.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{s.gitAvailable=!1}let r=ws.join(n.projectPath,"package.json");try{let i=await je.readFile(r,"utf-8"),a=JSON.parse(i);s.currentVersion=a.version,s.hasPackageJson=!0}catch(i){if(C(i))s.hasPackageJson=!1;else if(i instanceof SyntaxError)s.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=n.paths.shipped;try{let i=await je.readFile(o,"utf-8");s.shippedExists=!0;let a=n.params.feature||n.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${zc(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(C(i))s.shippedExists=!1;else throw i}if(s.hasPackageJson)try{let i=await je.readFile(r,"utf-8"),a=JSON.parse(i);s.hasTestScript=!!a.scripts?.test}catch(i){if(C(i)||i instanceof SyntaxError)s.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function eg(n){let e=[],t=[],s={},r=n.paths.next;try{let a=await je.readFile(r,"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(C(a))s.nextExists=!1,s.taskCount=0;else throw a}let o=n.paths.roadmap;try{let a=await je.readFile(o,"utf-8");s.roadmapExists=!0;let c=n.params.description||n.params.feature;c&&new RegExp(zc(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(C(a))s.roadmapExists=!1;else throw a}let i=n.paths.now;try{let a=await je.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(C(a))s.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function tg(n){let e=[],t=[],s={},r=n.paths.now;try{let i=await je.readFile(r,"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&&n.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(C(i))s.nowExists=!1,s.hasActiveTask=!1;else throw i}let o=n.paths.next;try{let a=((await je.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;s.pendingTasks=a,!n.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(C(i))s.pendingTasks=0;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function sg(n){let e=[],t=[],s={},r=ws.join(n.projectPath,".prjct/prjct.config.json");try{let i=await je.readFile(r,"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(C(i))s.alreadyInitialized=!1;else if(i instanceof SyntaxError)s.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=ws.join(Xm.homedir(),".prjct-cli");try{await je.access(o,je.constants.W_OK),s.globalPathWritable=!0}catch(i){if(C(i))try{await je.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 ng(n){let e=[],t=[],s={},r=ws.join(n.projectPath,".prjct/prjct.config.json");try{let a=await je.readFile(r,"utf-8");s.hasConfig=!0,s.config=JSON.parse(a)}catch(a){if(C(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=ws.join(Xm.homedir(),".prjct-cli/projects",o||"");try{await je.access(i),s.globalStorageExists=!0}catch(a){if(C(a))s.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function rg(n){let e=[],t=[],s={},r=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];s.detectedFiles=[];for(let i of r)try{await je.access(ws.join(n.projectPath,i)),s.detectedFiles.push(i)}catch(a){if(!C(a))throw a}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 je.stat(ws.join(n.projectPath,i))).isDirectory()&&s.detectedSrcDirs.push(i)}catch(a){if(!C(a))throw a}return{verified:!0,actual:s,warnings:e,recommendations:t}}async function og(n){let e=[],t=[],s={},r=n.paths.specs;try{await je.access(r),s.specsExists=!0;let i=await je.readdir(r);s.existingSpecs=i.filter(a=>a.endsWith(".md")),s.specCount=s.existingSpecs.length}catch(i){if(C(i))s.specsExists=!1,s.specCount=0;else throw i}let o=n.params.feature||n.params.name||n.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 ag(n,e,t){let s=ig[n];if(!s)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await s(e,t)}catch(r){return{verified:!1,actual:{},warnings:[`Verification error: ${y(r)}`],recommendations:["Check file permissions and project configuration"]}}}async function dv(n,e,t){let s=await ag(n,e,t);return{...e,groundTruth:{...s,verifiedAt:new Date().toISOString(),command:n}}}function pv(n){return["done","ship","feature","spec","now","init","sync","analyze"].includes(n)}var lv,ig,mv,Xo,cg=b(()=>{"use strict";U();lv=cv(av);l(Ym,"formatDuration");l(zc,"escapeRegex");l(uv,"formatWarnings");l(Qm,"verifyDone");l(Zm,"verifyShip");l(eg,"verifyFeature");l(tg,"verifyNow");l(sg,"verifyInit");l(ng,"verifySync");l(rg,"verifyAnalyze");l(og,"verifySpec");ig={done:Qm,ship:Zm,feature:eg,now:tg,init:sg,sync:ng,analyze:rg,spec:og};l(ag,"verify");l(dv,"prepareCommand");l(pv,"requiresVerification");mv={verify:ag,prepareCommand:dv,requiresVerification:pv,verifiers:ig,formatWarnings:uv,formatDuration:Ym,escapeRegex:zc,verifyDone:Qm,verifyShip:Zm,verifyFeature:eg,verifyNow:tg,verifyInit:sg,verifySync:ng,verifyAnalyze:rg,verifySpec:og},Xo=mv});function fv(n){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."}[n]||"Verify actual state before proceeding."}function hv(n){if(!n||typeof n!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of gv)if(e.test(n))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:fv(t)};return{detected:!1}}function yv(n,e){if(!n||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(n)===t(e)}function wv(n){if(!n||n.length===0)return{type:"unknown",description:"No error information"};let e=n[n.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 kv(n,e,t){let s={permission:`I've tried ${n} ${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 ${n}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${n} from completing.`,validation:`Validation keeps failing for ${n}.`,config:`There seems to be a configuration issue affecting ${n}.`,unknown:`I've tried ${n} ${t} times without success.`};return s[e.type]||s.unknown}function Sv(n){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[n.type]||e.unknown}var gv,qc,bv,Rn,lg=b(()=>{"use strict";gv=[{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(fv,"getHallucinationSuggestion");l(hv,"detectHallucination");l(yv,"isSimilarError");l(wv,"analyzeErrorPattern");l(kv,"generateEscalationMessage");l(Sv,"generateSuggestion");qc=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 r=this._getKey(e,t),o=Date.now(),i=this._attempts.get(r);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(r,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),r=this._attempts.get(s);if(!r)return!1;if(r.attempts>=2&&!r.success){let o=r.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>yv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),r=this._attempts.get(s);return r?r.attempts>=this.maxAttempts&&!r.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),r=this._attempts.get(s);if(!r)return null;let o=wv(r.errors);return{status:"BLOCKED",command:e,context:t,attempts:r.attempts,duration:r.lastAttempt-r.firstAttempt,errorPattern:o,message:kv(e,o,this.maxAttempts),suggestion:Sv(o),lastError:r.errors[r.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),r=this._attempts.get(s);r&&(r.success=!0,r.attempts=0,r.errors=[],this._attempts.set(s,r))}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 hv(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}}},bv=new qc,Rn=bv});import{z as ue}from"zod";var vv,Tv,ug,LM,UM,HM,ks,dg,Ar=b(()=>{"use strict";vv=ue.enum(["improving","stable","declining"]),Tv=ue.object({sprintNumber:ue.number(),startDate:ue.string(),endDate:ue.string(),pointsCompleted:ue.number(),tasksCompleted:ue.number(),avgVariance:ue.number(),estimationAccuracy:ue.number()}),ug=ue.object({category:ue.string(),avgVariance:ue.number(),taskCount:ue.number()}),LM=ue.object({totalPoints:ue.number(),sprints:ue.number(),estimatedDate:ue.string()}),UM=ue.object({sprints:ue.array(Tv),averageVelocity:ue.number(),velocityTrend:vv,estimationAccuracy:ue.number(),overEstimated:ue.array(ug),underEstimated:ue.array(ug),lastUpdated:ue.string()}),HM=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)}),ks={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},dg={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});function Kc(n,e){let t=Rr(e),s=Pv[t.startDay],r=new Date(n);r.setHours(0,0,0,0);let i=(r.getDay()-s+7)%7;return r.setDate(r.getDate()-i),r}function Cv(n,e){let t=Rr(e),s=new Date(n);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Ev(n,e,t){let s=Rr(t),r=Kc(n,t),o=Kc(e,t),i=r.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Yo(n,e=ks){let t=Rr(e);if(n.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=xv(n,e),r=Av(s,t.accuracyTolerance),o=r.slice(-t.windowSize),i=Dv(o),a=Rv(o),c=jv(n,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Iv(n);return{sprints:r,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function mg(n,e,t=ks){let s=Rr(t);if(e<=0)return{totalPoints:n,sprints:0,estimatedDate:""};let r=Math.ceil(n/e),o=r*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:n,sprints:r,estimatedDate:i.toISOString()}}function xv(n,e){let t=new Map,s=n.map(o=>new Date(o.completedAt)),r=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of n){let i=new Date(o.completedAt),a=Ev(i,r,e);if(!t.has(a)){let c=Kc(i,e),u=Cv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Av(n,e){let t=[];for(let[,s]of n){let r=s.outcomes.reduce((u,d)=>u+$v(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Yc(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:r,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,r)=>s.sprintNumber-r.sprintNumber)}function Rv(n){if(n.length<3)return"stable";let e=n.map(d=>d.pointsCompleted),t=e.length,s=0,r=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,r+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*r)/(t*i-s*s),c=r/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function jv(n,e){let t=n.filter(r=>r.variance);if(t.length===0)return 0;let s=t.filter(r=>{let o=Yc(r);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function Dv(n){if(n.length===0)return 0;let e=n.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/n.length*10)/10}function Iv(n){let e=new Map;for(let r of n){if(!r.variance)continue;let o=Yc(r),i=r.tags&&r.tags.length>0?r.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[r,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:r,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:r,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((r,o)=>o.avgVariance-r.avgVariance),s.sort((r,o)=>o.avgVariance-r.avgVariance),{overEstimated:t,underEstimated:s}}function Yc(n){if(!n.variance)return 0;let e=Xc(n.estimatedDuration),t=Xc(n.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Xc(n){let e=0,t=n.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=n.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),n.match(/(\d+)s/)&&e===0&&(e=1),e}function gg(n){if(n.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${n.averageVelocity} pts/sprint (trend: ${n.velocityTrend})`),e.push(`Estimation accuracy: ${n.estimationAccuracy}%`);for(let t of n.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of n.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
|
|
793
|
+
`)}function $v(n){if(!n.estimatedDuration)return 0;let e=Xc(n.estimatedDuration);if(e<=0)return 0;let t=pg[0],s=Number.POSITIVE_INFINITY;for(let r of pg){let o=Math.abs(r.typical-e);o<s&&(s=o,t=r)}return t.points}function Rr(n){return{sprintLengthDays:n.sprintLengthDays??7,startDay:n.startDay??"monday",windowSize:n.windowSize??6,accuracyTolerance:n.accuracyTolerance??20}}var Pv,pg,Qc=b(()=>{"use strict";Ar();Pv={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Kc,"getSprintStart");l(Cv,"getSprintEnd");l(Ev,"getSprintNumber");l(Yo,"calculateVelocity");l(mg,"projectCompletion");l(xv,"bucketBySprint");l(Av,"buildSprintVelocities");l(Rv,"detectTrend");l(jv,"calculateOverallAccuracy");l(Dv,"calculateAverageVelocity");l(Iv,"detectEstimationPatterns");l(Yc,"parseVariancePercent");l(Xc,"parseDurationMinutes");l(gg,"formatVelocityContext");pg=[{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($v,"derivePoints");l(Rr,"resolveConfig")});import{exec as Mv}from"node:child_process";import Ov from"node:fs/promises";import Qo from"node:path";import{promisify as _v}from"node:util";async function jn(n,e,t={}){let s=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Zc(n),c=await Hv(e),u=await Gv(e),d=[];for(let p of c){if(!i&&Wv(p))continue;let g=Vv(p,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,r);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-s}}}function Zc(n){let e=n.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 Hv(n){let e=[];async function t(s,r=""){try{let o=await Ov.readdir(s,{withFileTypes:!0});for(let i of o){let a=Qo.join(s,i.name),c=Qo.join(r,i.name);if(i.isDirectory()){if(Uv.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Qo.extname(i.name).toLowerCase();Lv.has(u)&&e.push(c)}}}catch(o){C(o)}}return l(t,"walk"),await t(n),e}async function Gv(n){let e=new Map;try{let{stdout:t}=await Nv(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
794
794
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
795
795
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
796
796
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
797
|
-
'`,{cwd:
|
|
798
|
-
`).filter(Boolean);for(let o of r){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((
|
|
797
|
+
'`,{cwd:n,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),r=t.trim().split(`
|
|
798
|
+
`).filter(Boolean);for(let o of r){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 Vv(n,e,t,s){let r=[],o=0,i=0,a=0,c=0,u=0,d=n.toLowerCase(),m=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let w of e){d.includes(w)&&(o+=.3,r.push(`keyword:${w}`));for(let E of m)if(E.includes(w)||w.includes(E)){o+=.15;break}}o=Math.min(1,o);for(let[w,E]of Object.entries(Fv))for(let T of E)if(d.includes(T)&&e.some(G=>E.includes(G)||G.includes(w)||w.includes(G))){i+=.4,r.push(`domain:${w}`);break}i=Math.min(1,i);let p=t.get(n);p&&(p.daysAgo<=1?(a=1,r.push("recent:1d")):p.daysAgo<=3?(a=.8,r.push("recent:3d")):p.daysAgo<=7?(a=.6,r.push("recent:1w")):p.daysAgo<=30&&(a=.3,r.push("recent:1m")),p.commits>=5&&(a=Math.min(1,a+.2)));let g=Qo.basename(n).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,r.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),r.some(w=>w.startsWith("import:"))||r.push("import:1")),s){let w=s.get(n);w!==void 0&&(u=(w+1)/2,w>0?r.push("history:boosted"):w<0&&r.push("history:penalized"))}let k=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:n,score:Math.min(1,k),reasons:[...new Set(r)]}}function Wv(n){let e=n.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 Nv,Fv,Lv,Uv,Zo=b(()=>{"use strict";U();Nv=_v(Mv),Fv={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"]},Lv=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Uv=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(jn,"findRelevantFiles");l(Zc,"extractKeywords");l(Hv,"getAllCodeFiles");l(Gv,"getGitRecency");l(Vv,"scoreFile");l(Wv,"isTestFile")});import{exec as Bv}from"node:child_process";import{promisify as Jv}from"node:util";async function fg(n=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,r=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(r){let c=await Kv(n);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await qv(n,t);return o=o.filter(c=>!Xv(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 qv(n,e){let{stdout:t}=await jr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
799
799
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
800
800
|
NF {
|
|
801
801
|
count[$0]++
|
|
@@ -804,9 +804,9 @@ Recommendations:
|
|
|
804
804
|
END {
|
|
805
805
|
for (f in count) print count[f], lastmod[f], f
|
|
806
806
|
}
|
|
807
|
-
' | sort -rn`,{cwd:
|
|
808
|
-
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),w=u/i,
|
|
809
|
-
`).filter(Boolean),{stdout:i}=await
|
|
807
|
+
' | sort -rn`,{cwd:n,maxBuffer:10485760}),s=[],r=t.trim().split(`
|
|
808
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of r){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),k=Math.max(0,1-g/30),w=u/i,E=k*.6+w*.4,T;f<1?T="just now":f<24?T=`${f}h ago`:g<7?T=`${g}d ago`:g<30?T=`${Math.floor(g/7)}w ago`:T=`${Math.floor(g/30)}mo ago`,s.push({path:m,changes:u,heatScore:Math.round(E*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function Kv(n){let{stdout:e}=await jr("git branch --show-current",{cwd:n}),t=e.trim(),s="main";try{await jr("git rev-parse --verify main",{cwd:n})}catch{s="master"}let{stdout:r}=await jr(`git diff --name-only ${s}...HEAD`,{cwd:n}),o=r.trim().split(`
|
|
809
|
+
`).filter(Boolean),{stdout:i}=await jr(`git log ${s}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
810
810
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
811
811
|
NF {
|
|
812
812
|
count[$0]++
|
|
@@ -815,12 +815,12 @@ Recommendations:
|
|
|
815
815
|
END {
|
|
816
816
|
for (f in count) print count[f], lastmod[f], f
|
|
817
817
|
}
|
|
818
|
-
'`,{cwd:
|
|
819
|
-
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],w=u-f,
|
|
820
|
-
`);return{file:
|
|
821
|
-
`),r=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(
|
|
822
|
-
`).length,m=i[0].trim(),p;if(d>1){let g=
|
|
823
|
-
`).filter(r=>r.trim()).map(r=>JSON.parse(r)):[]}async filter(e,t){return(await this.getAll(e)).filter(r=>{if(t.sessionId&&r.sessionId!==t.sessionId||t.command&&r.command!==t.command||t.agent&&r.agentUsed!==t.agent||t.fromDate&&r.startedAt<t.fromDate||t.toDate&&r.completedAt>t.toDate||t.minQuality&&r.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=r.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
|
|
818
|
+
'`,{cwd:n,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
|
|
819
|
+
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),k=p[3],w=u-f,E=Math.floor(w/86400),T=Math.floor(w/3600),O=Math.max(0,1-E/14),G=g/d,Q=O*.5+G*.5,se;T<1?se="just now":T<24?se=`${T}h ago`:se=`${E}d ago`,a.push({path:k,changes:g,heatScore:Math.round(Q*100)/100,lastChanged:se,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${s}..HEAD`}}function Xv(n){let e=n.split("/").pop()||"";for(let t of zv)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var jr,zv,hg=b(()=>{"use strict";jr=Jv(Bv),zv=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(fg,"getRecentFiles");l(qv,"getHotFilesFromCommits");l(Kv,"getBranchOnlyFiles");l(Xv,"shouldIgnore")});function el(n){return!n||n.length===0?0:Math.ceil(n.length/4)}function yg(n,e){let t=Yv[e],s=n/1e3*t.input,r=n/1e3*t.output*.3;return{inputSaved:s,outputPotential:r,total:s+r}}function Zv(n){return n<.001?"<$0.01":n<.01?`$${n.toFixed(3)}`:`$${n.toFixed(2)}`}function kg(n,e){let t=el(n),s=el(e),r=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=yg(r,Qv),a=wg.map(c=>({model:c,...yg(r,c)}));return{tokens:{original:t,filtered:s,saved:r},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Zv(i.total),byModel:a}}}function tl(n){let e=el(n);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:wg.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var Yv,Qv,wg,Sg=b(()=>{"use strict";Yv={"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}},Qv="claude-sonnet-4.5";l(el,"countTokens");wg=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(yg,"calculateModelCost");l(Zv,"formatCostSaved");l(kg,"measureCompression");l(tl,"noCompression")});import eT from"node:fs/promises";import sl from"node:path";async function Tg(n,e=process.cwd()){let t=sl.isAbsolute(n)?n:sl.join(e,n),s;try{s=await eT.readFile(t,"utf-8")}catch(u){if(C(u))return{file:n,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:tl("")};throw u}let r=sl.extname(n).toLowerCase(),o=tT[r]||"unknown",i=oT[o];if(!i||i.length===0)return{file:n,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:tl(s)};let a=iT(s,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
|
|
820
|
+
`);return{file:n,language:o,signatures:a,fallback:!1,metrics:kg(s,c)}}function iT(n,e){let t=[],s=n.split(`
|
|
821
|
+
`),r=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(n))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(r.has(c))continue;r.add(c);let u=i.index,d=n.substring(0,u).split(`
|
|
822
|
+
`).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:aT(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function aT(n){return n.replace(/\{$/,"").replace(/\s+/g," ").trim()}var tT,bg,sT,nT,rT,vg,oT,Pg=b(()=>{"use strict";U();Sg();tT={".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"},bg=[{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}],sT=[{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}],nT=[{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}],rT=[{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}],vg=[{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}],oT={typescript:bg,javascript:bg,python:sT,go:nT,rust:rT,java:vg,csharp:vg,php:[],ruby:[],unknown:[]};l(Tg,"extractSignatures");l(iT,"extractFromContent");l(aT,"cleanSignature")});import nl from"node:path";var cT,lT,rl,uT,pt,Dn=b(()=>{"use strict";Se();Tt();We();cT="outcomes",lT="outcomes.jsonl",rl=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return nl.join(t,cT)}getOutcomesPath(e){return nl.join(this.getOutcomesDir(e),lT)}async record(e,t){let s={...t,id:he()},r=this.getOutcomesPath(e);return await Dt(nl.dirname(r)),await Wi(r,JSON.stringify(s)),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await j(t))return[];let s=await et(t);return s.trim()?s.trim().split(`
|
|
823
|
+
`).filter(r=>r.trim()).map(r=>JSON.parse(r)):[]}async filter(e,t){return(await this.getAll(e)).filter(r=>{if(t.sessionId&&r.sessionId!==t.sessionId||t.command&&r.command!==t.command||t.agent&&r.agentUsed!==t.agent||t.fromDate&&r.startedAt<t.fromDate||t.toDate&&r.completedAt>t.toDate||t.minQuality&&r.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=r.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(r=>{if(!r.variance)return!1;let o=this.parseVariance(r.variance),i=this.parseDuration(r.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let s=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return s*(o==="h"?r*60:r)}parseDuration(e){let t=0,s=e.match(/(\d+)h/);s&&(t+=parseInt(s[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},uT=new rl,pt=uT});import{z as _e}from"zod";var ei,Ss,dT,wO,ol,Cg,ti=b(()=>{"use strict";ei=_e.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Ss=_e.object({primaryDomain:ei,secondaryDomains:_e.array(ei),confidence:_e.number().min(0).max(1),filePatterns:_e.array(_e.string()),relevantAgents:_e.array(_e.string())}),dT=_e.object({classification:Ss,classifiedAt:_e.string(),source:_e.enum(["cache","history","llm","heuristic"]),descriptionHash:_e.string(),projectId:_e.string()}),wO=_e.object({entries:_e.record(_e.string(),dT),confirmedPatterns:_e.array(_e.object({descriptionHash:_e.string(),classification:Ss,confirmedAt:_e.string(),taskDescription:_e.string()}))}),ol={entries:{},confirmedPatterns:[]},Cg={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});var jg={};ls(jg,{AgentAssignmentSchema:()=>Eg,OUTPUT_SCHEMAS:()=>Ag,SubtaskBreakdownSchema:()=>xg,TaskClassificationSchema:()=>Ss,renderSchemaForPrompt:()=>il});import{z as Ke}from"zod";function il(n){let e=Ag[n];return e?`## OUTPUT FORMAT
|
|
824
824
|
|
|
825
825
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
826
826
|
|
|
@@ -829,28 +829,28 @@ ${e.example}
|
|
|
829
829
|
\`\`\`
|
|
830
830
|
|
|
831
831
|
Fields:
|
|
832
|
-
${pT(e.schema)}`:null}function pT(
|
|
833
|
-
`)}return"(see example above)"}function Rg(
|
|
832
|
+
${pT(e.schema)}`:null}function pT(n){if(n instanceof Ke.ZodObject){let e=n.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${Rg(s)}`).join(`
|
|
833
|
+
`)}return"(see example above)"}function Rg(n){return n instanceof Ke.ZodString?"string":n instanceof Ke.ZodNumber?"number":n instanceof Ke.ZodEnum?`one of: ${n.options.join(", ")}`:n instanceof Ke.ZodArray?`array of ${Rg(n.element)}`:n instanceof Ke.ZodObject?"object":"any"}var Eg,xg,Ag,al=b(()=>{"use strict";ti();ti();Eg=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),xg=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:ei,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),Ag={classification:{schema:Ss,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Eg,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:xg,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(il,"renderSchemaForPrompt");l(pT,"describeSchema");l(Rg,"describeField")});import{createHash as mT}from"node:crypto";import $g from"node:fs/promises";import Mg from"node:path";function Dg(n){return mT("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}async function Ig(n){try{let e=Mg.join(n,"storage","classification-cache.json"),t=await $g.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e)?ol:(console.warn("[classifier] Failed to load cache:",y(e)),ol)}}async function cl(n,e){try{let t=Mg.join(n,"storage","classification-cache.json");await $g.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function fT(n,e,t){let s=n.entries[e];return!s||s.projectId!==t||Date.now()-new Date(s.classifiedAt).getTime()>gT?null:s.classification}function hT(n,e){return n.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}async function yT(n,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let s=Og(e),r=il("classification")||"",o=`Classify this software engineering task into a domain.
|
|
834
834
|
|
|
835
|
-
Task: "${
|
|
835
|
+
Task: "${n}"
|
|
836
836
|
|
|
837
|
-
Available domains in this project: ${
|
|
837
|
+
Available domains in this project: ${s.join(", ")}
|
|
838
838
|
Available agents: ${e.agents.join(", ")||"none"}
|
|
839
839
|
Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
840
840
|
|
|
841
|
-
${r}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=
|
|
842
|
-
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:
|
|
843
|
-
`).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:r,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(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 pt.getAll(e);if(t.length===0)return null;let
|
|
844
|
-
`)}_calculateDuration(e,t){if(!e||!t)return null;let
|
|
845
|
-
`);let t=[];
|
|
846
|
-
Context: ${
|
|
847
|
-
`)}var d_,
|
|
848
|
-
`,"utf-8"),Ir=null}function GT(
|
|
849
|
-
${[["project",
|
|
841
|
+
${r}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Ss.safeParse(u);return d.success?d.data:{primaryDomain:s.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>s.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function kT(n,e){let t=Og(e),s=new Map;for(let[p,g]of Object.entries(wT)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)n.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&s.set(p,f)}if(s.size===0)return Cg;let r=Array.from(s.entries()).sort((p,g)=>g[1]-p[1]),o=r[0][0],i=r[0][1],a=r.slice(1,3).map(([p])=>p),c=r.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=ST(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function Og(n){let e=[];return n.domains.hasFrontend&&e.push("frontend"),n.domains.hasBackend&&e.push("backend"),n.domains.hasDatabase&&e.push("database"),n.domains.hasTesting&&e.push("testing"),n.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function ST(n){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[n]||e.general}var gT,wT,ll,bT,_g,Ng=b(()=>{"use strict";ti();al();U();gT=3600*1e3;l(Dg,"hashDescription");l(Ig,"loadCache");l(cl,"saveCache");l(fT,"lookupCache");l(hT,"lookupPatterns");l(yT,"classifyWithLLM");wT={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(kT,"classifyWithHeuristic");l(Og,"buildAvailableDomains");l(ST,"getFilePatterns");ll=class{static{l(this,"DomainClassifier")}async classify(e,t,s,r){let o=Dg(e),i=await Ig(s),a=fT(i,o,t);if(a)return{classification:a,source:"cache"};let c=hT(i,o);if(c)return{classification:c,source:"history"};let u=await yT(e,r);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await cl(s,i),{classification:u,source:"llm"};let d=kT(e,r);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await cl(s,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,s){let r=Dg(e),o=await Ig(s);o.confirmedPatterns.some(i=>i.descriptionHash===r)||(o.confirmedPatterns.push({descriptionHash:r,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await cl(s,o))}},bT=new ll,_g=bT});import{exec as vT}from"node:child_process";import Dr from"node:fs/promises";import TT from"node:os";import qs from"node:path";import{promisify as PT}from"node:util";var Fg,Lg,ul,CT,si,dl=b(()=>{"use strict";Qc();ft();Se();Ar();yn();Et();Zo();hg();Pg();U();Dn();Ng();Wt();Fg=PT(vT),Lg=["database","backend","frontend","testing","devops"],ul=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let r=await $.getProjectId(s),o=A.getGlobalProjectPath(r),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,r,i),u=await this.loadAgents(a,r),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(r),this.loadVelocityContext(r)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((Q,se)=>{if(Q.status==="fulfilled")return Q.value;g.push(p[se]),console.warn(`Context tool "${p[se]}" failed: ${y(Q.reason)}`)}),[k,w,E]=f,T={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},O=this.shouldFragment(a,t),G=null;return O&&e==="task"&&(G=await this.createSubtasks(t,a,u,r)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:O,subtasks:G,project:{id:r,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:w??null,velocityContext:E??null,contextDegradation:T}}async gatherRealContext(e,t){try{let[s,r,o]=await Promise.all([this.getGitState(t),jn(e,t,{maxFiles:10,minScore:.15}),fg(t,{commits:10,maxFiles:10})]),i=r.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await Tg(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(`
|
|
842
|
+
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:r.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([Fg("git branch --show-current",{cwd:e}),Fg("git status --porcelain",{cwd:e})]),r=t.stdout.trim()||"main",o=s.stdout.trim().split(`
|
|
843
|
+
`).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:r,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(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 pt.getAll(e);if(t.length===0)return null;let s=Yo(t,ks);return s.sprints.length===0?null:gg(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=qs.join(e,"analysis","repo-analysis.json"),s=await Dr.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return C(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,s){let r=A.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(r),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await F.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:s?{language:s.ecosystem}:void 0},{classification:c}=await _g.classify(e,t,r,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=qs.join(e,"agents");return(await Dr.readdir(t)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let s=A.getGlobalProjectPath(t),r=qs.join(s,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=qs.join(r,u);try{let m=await Dr.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=lo(e),s={...t.frontmatter};return typeof s.skills=="string"&&(s.skills=s.skills.split(",").map(r=>r.trim())),{frontmatter:s,body:t.content}}async loadSkills(e){let t=qs.join(TT.homedir(),".claude","skills"),s=new Map;for(let i of e)for(let a of i.skills){let c=s.get(a)||[];c.push(i.name),s.set(a,c)}let r=Array.from(s.keys()).map(async i=>{let a=qs.join(t,`${i}.md`),c=qs.join(t,i,"SKILL.md");try{let u=await Dr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await Dr.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=s.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(r)).filter(i=>i!==null)}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"],r=t.toLowerCase();for(let i of s)if(r.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,r){let o=[...t].sort((a,c)=>{let u=Lg.indexOf(a),d=Lg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=s.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await F.createSubtasks(r,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let r={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${r} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},CT=new ul,si=CT});function ET(n,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"}]}}[n]||{title:"Confirmation Required",message:`Execute ${n}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var pl,xT,Ue,Ug=b(()=>{"use strict";Tt();fe();Ns();Ns();l(ET,"generateApprovalPrompt");pl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Qa.includes(e)}isDestructive(e){return Za.includes(e)}isToolAllowedInPlanning(e){return Ao.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>Ao.includes(s)):t}startPlanning(e,t,s){let r={id:he(),projectId:e,command:t,params:s,status:re.GATHERING,startedAt:v(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,r),r}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:v()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===re.APPROVED?s.approvedAt=v():t===re.EXECUTING?s.executionStartedAt=v():(t===re.COMPLETED||t===re.ABORTED)&&(s.completedAt=v()))}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=v(),s.steps=(s.proposedPlan?.steps||[]).map((r,o)=>({index:o,description:typeof r=="string"?r:r.description||"",status:"pending",tool:typeof r=="string"?void 0:r.tool,args:typeof r=="string"?void 0:r.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=v(),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=v(),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=v(),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=v();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(r=>r.status==="completed").length,failedSteps:t.steps.filter(r=>r.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=v(),s.abortReason=t;let r={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),r}generateApprovalPrompt(e,t){return ET(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let r=[`${{[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);r.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return r.join(`
|
|
844
|
+
`)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),r=Math.floor(s/1e3),o=Math.floor(r/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${r%60}s`:`${r}s`}},xT=new pl,Ue=xT});var ml,AT,Hg,Gg=b(()=>{"use strict";Dn();ml=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await pt.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,r=await pt.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:r,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await pt.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 r=[];for(let[o,i]of s){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,w)=>k+w.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let w=this.parseVariance(k.variance),E=this.parseDuration(k.estimatedDuration);return E===0?!1:Math.abs(w)/E<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(w=>w.completedAsPlanned))for(let w of k.tags||[])g.set(w,(g.get(w)||0)+1);let f=[...g.entries()].sort((k,w)=>w[1]-k[1]).slice(0,3).map(([k])=>k);r.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return r}async detectPatterns(e){let t=await pt.getAll(e),s=[];if(t.length<3)return s;let r=t.filter(c=>this.parseVariance(c.variance)>0);r.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:r.length/t.length,occurrences:r.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(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 r=(await pt.getAll(e)).filter(a=>a.tags?.includes(t));if(r.length<2)return null;let o=r.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/r.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 r=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return r.length===0?null:r.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let s=t[1]==="-"?-1:1,r=parseInt(t[2],10),o=t[3];return s*(o==="h"?r*60:r)}parseDuration(e){let t=0,s=e.match(/(\d+)h/);s&&(t+=parseInt(s[1],10)*60);let r=e.match(/(\d+)m/);return r&&(t+=parseInt(r[1],10)),t}},AT=new ml,Hg=AT});function RT(n){let e=n.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return ni[t]?ni[t]:ni[e]?ni[e]:e}function ri(n){let e=new Set,t=[];for(let s of n){let r=RT(s);e.has(r)||(e.add(r),t.push(s))}return t}var ni,gl=b(()=>{"use strict";ni={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(RT,"normalizeFrameworkName");l(ri,"deduplicateTechStack")});import{z as He}from"zod";function Vg(n){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
845
|
+
`);let t=[];n.language&&t.push(n.language),n.framework&&t.push(n.framework);let s=n.techStack??[];t.push(...s);let r=n.analysisLanguages??[],o=n.analysisFrameworks??[];t.push(...r,...o);let i=ri(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),n.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${n.analysisPackageManager}`),n.domains){let c=Object.entries(n.domains).filter(([,u])=>!u).map(([u])=>jT[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=n.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${n.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),n.fileCount&&e.push(`
|
|
846
|
+
Context: ${n.fileCount} files in project.`),e.join(`
|
|
847
|
+
`)}var d_,jT,Wg=b(()=>{"use strict";gl();d_=He.object({projectPath:He.string(),language:He.string().optional(),framework:He.string().optional(),techStack:He.array(He.string()).default([]),domains:He.object({hasFrontend:He.boolean().default(!1),hasBackend:He.boolean().default(!1),hasDatabase:He.boolean().default(!1),hasTesting:He.boolean().default(!1),hasDocker:He.boolean().default(!1)}).optional(),fileCount:He.number().optional(),availableAgents:He.array(He.string()).default([]),analysisLanguages:He.array(He.string()).default([]),analysisFrameworks:He.array(He.string()).default([]),analysisPackageManager:He.string().optional()}),jT={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(Vg,"buildAntiHallucinationBlock")});import{z as _t}from"zod";var DT,Bg,Jg=b(()=>{"use strict";DT=_t.object({agents:_t.boolean(),patterns:_t.boolean(),checklist:_t.boolean(),modules:_t.array(_t.string())}),Bg=_t.object({version:_t.string(),description:_t.string().optional(),commands:_t.record(_t.string(),DT).refine(n=>"*"in n,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function fl(n,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(n)).length}function zg(n,e){let t=(e.frontmatter?.description||"").toLowerCase(),s=e.content.toLowerCase(),r=e.frontmatter?.["allowed-tools"]||[],o=`${n} ${t} ${s}`,i=fl(o,IT),a=fl(o,$T),c=fl(o,MT);return r.some(d=>OT.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var IT,$T,MT,OT,qg=b(()=>{"use strict";IT=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],$T=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],MT=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],OT=["Write","Edit","Bash"];l(fl,"countMatches");l(zg,"classifyCommand")});import hl from"node:fs/promises";import _T from"node:path";async function Xg(){if(Ir)return Ir;let n=await hl.readFile(yl,"utf-8"),e=JSON.parse(n);return Ir=Bg.parse(e),Ir}function NT(n){return Yg.get(n)}function FT(n,e){Yg.set(n,e)}function UT(n,e){let t=n,s=Kg.get(t);return s&>(s.entry,e)?(s.count++,s.count>=LT):(Kg.set(t,{entry:e,count:1}),!1)}async function HT(n,e){let t=await hl.readFile(yl,"utf-8"),s=JSON.parse(t);s.commands[n]=e,await hl.writeFile(yl,`${JSON.stringify(s,null,2)}
|
|
848
|
+
`,"utf-8"),Ir=null}function GT(n,e){return n.agents===e.agents&&n.patterns===e.patterns&&n.checklist===e.checklist&&n.modules.length===e.modules.length&&n.modules.every((t,s)=>t===e.modules[s])}function Qg(n,e,t){if(e in n.commands&&e!=="*")return{entry:n.commands[e],source:"config"};let s=NT(e);if(s)return{entry:s,source:"cache"};if(t){let r=zg(e,t);return FT(e,r),UT(e,r)&&HT(e,r).catch(()=>{}),{entry:r,source:"classified"}}return{entry:n.commands["*"],source:"wildcard"}}var yl,Ir,Yg,Kg,LT,Zg=b(()=>{"use strict";Jg();Pt();qg();yl=_T.join(pe,"core/config/command-context.config.json"),Ir=null;l(Xg,"loadCommandContextConfig");Yg=new Map;l(NT,"getCachedClassification");l(FT,"cacheClassification");Kg=new Map,LT=3;l(UT,"trackClassification");l(HT,"persistClassification");l(GT,"isSameEntry");l(Qg,"resolveCommandContextFull")});import VT from"node:os";import{z as qt}from"zod";function WT(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function BT(n){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[n]??n}function ef(n){let e=n.platform??VT.platform(),t=n.runtime??WT(),s=n.date??new Date().toISOString().split("T")[0];return`<env>
|
|
849
|
+
${[["project",n.projectName],["path",n.projectPath],["git",n.isGitRepo?"true":"false"],["branch",n.gitBranch],["platform",BT(e)],["runtime",t],["date",s],["model",n.model],["provider",n.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
850
850
|
`)}
|
|
851
|
-
</env>`}var x_,tf=b(()=>{"use strict";x_=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(WT,"detectRuntime");l(BT,"normalizePlatform");l(ef,"buildEnvironmentBlock")});function
|
|
852
|
-
... (truncated to ~${e} tokens)`}function
|
|
853
|
-
`);return
|
|
851
|
+
</env>`}var x_,tf=b(()=>{"use strict";x_=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(WT,"detectRuntime");l(BT,"normalizePlatform");l(ef,"buildEnvironmentBlock")});function nf(n){let e=n.getAllocationFor("injection");return{...ii,totalPrompt:e}}function Ks(n,e){let t=e*rf;return n.length<=t?n:`${n.substring(0,t)}
|
|
852
|
+
... (truncated to ~${e} tokens)`}function sf(n){return Math.ceil(n.length/rf)}function of(n,e){if(e.length===0||n.length===0)return n;let t=new Set;for(let s of e){let r=JT[s.toLowerCase()];if(r)for(let o of r)t.add(o);t.add(s.toLowerCase())}return n.filter(s=>{let r=`${s.name} ${s.content}`.toLowerCase();for(let o of t)if(r.includes(o))return!0;return!1})}var ii,rf,JT,oi,af=b(()=>{"use strict";ii={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(nf,"budgetsFromCoordinator");rf=4;l(Ks,"truncateToTokenBudget");l(sf,"estimateTokens");JT={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l(of,"filterSkillsByDomains");oi=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...ii,...e}}addSection(e,t){let s=Ks(e,t),r=sf(s);if(this.used+r>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Ks(s,o);return this.used+=sf(i),i}return this.used+=r,s}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import cf from"node:fs/promises";import Xs from"node:path";var wl,zT,lf,uf=b(()=>{"use strict";rs();Et();U();We();Pt();Gg();Wg();Zg();tf();af();gl();Wt();wl=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await j(e)){let r=await cf.readFile(e,"utf-8");return this._templateCache.set(e,{content:r,loadedAt:s}),r}}catch(r){C(r)||console.error(`Template loading warning: ${y(r)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?nf(this._coordinator):ii}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ye(`global/modules/${e}`);if(t)return t;let s=Xs.join(pe,"templates/global/modules",e);return this.getTemplate(s)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let s=ps("checklists/");if(s.length>0){for(let r of s)if(r.endsWith(".md")){let o=ye(r);if(o){let i=Xs.basename(r,".md");t[i]=o}}}else{let r=Xs.join(pe,"templates","checklists");if(await j(r)){let o=(await cf.readdir(r)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Xs.join(r,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){C(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,r]=await Promise.all([F.read(e),Oe.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:r.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(C(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 Hg.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){!C(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}s.push("---"),s.push("");let r=s.join(`
|
|
853
|
+
`);return Ks(r,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),r=Date.now()-t,o=Math.floor(r/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=Xs.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,r=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,r,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,r=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let S=await Xg();p=Qg(S,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;r&&g&&(d.push(`# AGENT: ${r.name}
|
|
854
854
|
`),r.role&&d.push(`Role: ${r.role}
|
|
855
855
|
`),r.skills?.length&&d.push(`Skills: ${r.skills.join(", ")}
|
|
856
856
|
`),d.push(`
|
|
@@ -859,8 +859,8 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
859
859
|
`)),d.push(`TASK: ${e.frontmatter.description}
|
|
860
860
|
`),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
861
861
|
`);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
|
|
862
|
-
`);let k=t.projectPath;if(k){let S=u?.project?.id?
|
|
863
|
-
${
|
|
862
|
+
`);let k=t.projectPath;if(k){let S=u?.project?.id?Xs.basename(k):Xs.basename(k),D=ef({projectName:S,projectPath:k,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
|
|
863
|
+
${D}
|
|
864
864
|
`)}if(u){let S=u.sealedAnalysis;if(d.push(`
|
|
865
865
|
## PROJECT ANALYSIS (Sealed)
|
|
866
866
|
`),d.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
@@ -875,45 +875,45 @@ ${j}
|
|
|
875
875
|
`),d.push(`**Analysis Status**: ${S.status}${S.commitHash?` (commit: ${S.commitHash.slice(0,8)})`:""}
|
|
876
876
|
`),S.patterns?.length>0){d.push(`
|
|
877
877
|
### Code Patterns (Follow These)
|
|
878
|
-
`);for(let
|
|
878
|
+
`);for(let D of S.patterns)d.push(`- **${D.name}**: ${D.description}${D.location?` (${D.location})`:""}
|
|
879
879
|
`)}if(S.antiPatterns?.length>0){d.push(`
|
|
880
880
|
### Anti-Patterns (Avoid These)
|
|
881
|
-
`);for(let
|
|
881
|
+
`);for(let D of S.antiPatterns)d.push(`- **${D.issue}** in \`${D.file}\` \u2014 ${D.suggestion}
|
|
882
882
|
`)}}d.push(`
|
|
883
|
-
`)}let w=p.patterns,
|
|
883
|
+
`)}let w=p.patterns,E=s?.codePatterns||"";if(w&&E&&E.trim()){let S=this.extractPatternSummary(E);S&&(d.push(`## CODE PATTERNS
|
|
884
884
|
`),d.push(S),d.push(`
|
|
885
885
|
Full patterns: Read analysis/patterns.md
|
|
886
|
-
`))}let T=
|
|
886
|
+
`))}let T=s?.analysis||"";if(w&&T&&T.trim()){let S=T.match(/Stack[:\s]+([^\n]+)/i)||T.match(/Technology[:\s]+([^\n]+)/i),D=S?S[1].trim():"detected";d.push(`
|
|
887
887
|
## STACK
|
|
888
|
-
Stack: ${
|
|
889
|
-
`),
|
|
888
|
+
Stack: ${D}
|
|
889
|
+
`),E||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
890
890
|
`)}if(u){if(u.agents.length>0){d.push(`
|
|
891
891
|
### LOADED AGENTS (Project-Specific Specialists)
|
|
892
892
|
|
|
893
|
-
`);for(let
|
|
894
|
-
`),
|
|
895
|
-
`),
|
|
896
|
-
`),
|
|
897
|
-
`);let Ce=
|
|
893
|
+
`);for(let D of u.agents){d.push(`#### Agent: ${D.name} (${D.domain})
|
|
894
|
+
`),D.effort&&d.push(`Effort: ${D.effort}
|
|
895
|
+
`),D.model&&d.push(`Model: ${D.model}
|
|
896
|
+
`),D.skills.length>0&&d.push(`Skills: ${D.skills.join(", ")}
|
|
897
|
+
`);let Ce=Ks(D.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
|
|
898
898
|
${Ce}
|
|
899
899
|
\`\`\`
|
|
900
900
|
|
|
901
901
|
`)}}let S=of(u.skills,u.detectedDomains);if(S.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
|
|
902
902
|
|
|
903
|
-
`);for(let
|
|
904
|
-
`);let Ce=
|
|
903
|
+
`);for(let D of S){d.push(`#### Skill: ${D.name}
|
|
904
|
+
`);let Ce=Ks(D.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
|
|
905
905
|
${Ce}
|
|
906
906
|
\`\`\`
|
|
907
907
|
|
|
908
|
-
`)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let S of O){let
|
|
909
|
-
`),d.push(
|
|
908
|
+
`)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let S of O){let D=await this.loadModule(S);D&&(d.push(`
|
|
909
|
+
`),d.push(D))}if(c?.isPlanning&&(d.push(`
|
|
910
910
|
## PLAN MODE
|
|
911
911
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
912
912
|
`),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
|
|
913
913
|
`)),c?.requiresApproval&&d.push(`
|
|
914
914
|
## APPROVAL REQUIRED
|
|
915
915
|
Show changes, list affected files, ask for confirmation.
|
|
916
|
-
`),k){let S=u?.sealedAnalysis,
|
|
916
|
+
`),k){let S=u?.sealedAnalysis,D=[...S?.frameworks||[],...Array.isArray(u?.project?.conventions)?u.project.conventions:[]],Ce={projectPath:k,language:u?.project?.ecosystem,framework:S?.frameworks?.[0],techStack:ri(D),domains:this.extractDomains(s),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(Cs=>Cs.name)||[],analysisLanguages:S?.languages||[],analysisFrameworks:S?.frameworks||[],analysisPackageManager:S?.packageManager};d.push(`
|
|
917
917
|
${Vg(Ce)}
|
|
918
918
|
`)}else d.push(this.buildCriticalRules());if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let S=u.contextDegradation;d.push(`
|
|
919
919
|
### CONTEXT DEGRADATION NOTICE
|
|
@@ -930,15 +930,15 @@ ${Vg(Ce)}
|
|
|
930
930
|
`),S.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
|
|
931
931
|
`),d.push(`| Score | File | Why |
|
|
932
932
|
`),d.push(`|-------|------|-----|
|
|
933
|
-
`);for(let
|
|
933
|
+
`);for(let D of S.relevantFiles.slice(0,8))d.push(`| ${D.score} | ${D.path} | ${D.reason} |
|
|
934
934
|
`);d.push(`
|
|
935
935
|
`)}if(S.signatures.length>0){d.push(`**Code Signatures** (top files):
|
|
936
|
-
`);for(let
|
|
937
|
-
// ${
|
|
938
|
-
${
|
|
936
|
+
`);for(let D of S.signatures)d.push(`\`\`\`typescript
|
|
937
|
+
// ${D.path}
|
|
938
|
+
${D.content}
|
|
939
939
|
\`\`\`
|
|
940
940
|
`);d.push(`
|
|
941
|
-
`)}if(S.recentFiles.length>0){d.push("**Recently Changed**: ");let
|
|
941
|
+
`)}if(S.recentFiles.length>0){d.push("**Recently Changed**: ");let D=S.recentFiles.slice(0,5).map(Ce=>`${Ce.path} (${Ce.lastChanged})`).join(", ");d.push(`${D}
|
|
942
942
|
|
|
943
943
|
`)}}let G=t.files||[];if(G.length>0){let S=G.slice(0,5).join(", ");d.push(`
|
|
944
944
|
## FILES: ${G.length} available. Top: ${S}
|
|
@@ -948,7 +948,7 @@ ${j.content}
|
|
|
948
948
|
## PROJECT: ${k}
|
|
949
949
|
Read files before modifying.
|
|
950
950
|
|
|
951
|
-
`);let Q=this.filterRelevantState(
|
|
951
|
+
`);let Q=this.filterRelevantState(s);if(Q&&(d.push(`
|
|
952
952
|
## PRJCT STATE (Project Management Data)
|
|
953
953
|
`),d.push(Q),d.push(`
|
|
954
954
|
`)),u?.velocityContext&&(d.push(`
|
|
@@ -958,7 +958,7 @@ Read files before modifying.
|
|
|
958
958
|
|
|
959
959
|
`)),o&&Object.keys(o).some(S=>o[S])){d.push(`
|
|
960
960
|
## PROJECT DEFAULTS (apply automatically)
|
|
961
|
-
`);for(let[S,
|
|
961
|
+
`);for(let[S,D]of Object.entries(o))D&&d.push(`- ${S}: ${D}
|
|
962
962
|
`)}if(i?.plan&&i.plan.length>0){if(d.push(`
|
|
963
963
|
## THINK FIRST (reasoning from analysis)
|
|
964
964
|
`),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
|
|
@@ -977,51 +977,51 @@ Read files before modifying.
|
|
|
977
977
|
|
|
978
978
|
`),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
|
|
979
979
|
`),d.push(`|---|--------|-------------|--------|
|
|
980
|
-
`);for(let
|
|
981
|
-
`)}let S=u.subtasks.find(
|
|
980
|
+
`);for(let D of u.subtasks){let Ce=D.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":D.status==="completed"?"\u2705 Done":D.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${D.order} | ${D.domain} | ${D.description} | ${Ce} |
|
|
981
|
+
`)}let S=u.subtasks.find(D=>D.status==="in_progress");if(S&&(d.push(`
|
|
982
982
|
**FOCUS ON SUBTASK #${S.order}**: ${S.description}
|
|
983
983
|
`),d.push(`Agent: ${S.agent} | Domain: ${S.domain}
|
|
984
984
|
`),S.dependsOn.length>0&&d.push(`Dependencies: ${S.dependsOn.join(", ")}
|
|
985
|
-
`),S.handoff)){let
|
|
985
|
+
`),S.handoff)){let D=S.handoff;d.push(`
|
|
986
986
|
### Previous Subtask Handoff
|
|
987
987
|
|
|
988
|
-
`),d.push(`**From:** ${
|
|
988
|
+
`),d.push(`**From:** ${D.fromSubtask}
|
|
989
989
|
|
|
990
990
|
`),d.push(`**What was done:**
|
|
991
|
-
`);for(let Ce of
|
|
992
|
-
`);if(
|
|
991
|
+
`);for(let Ce of D.whatWasDone)d.push(`- ${Ce}
|
|
992
|
+
`);if(D.filesChanged.length>0){d.push(`
|
|
993
993
|
**Files changed:**
|
|
994
|
-
`);for(let Ce of
|
|
994
|
+
`);for(let Ce of D.filesChanged)d.push(`- \`${Ce.path}\` (${Ce.action})
|
|
995
995
|
`)}d.push(`
|
|
996
996
|
**Context for this subtask:**
|
|
997
|
-
${
|
|
997
|
+
${D.outputForNextAgent}
|
|
998
998
|
`)}d.push(`
|
|
999
|
-
`)}let
|
|
1000
|
-
${
|
|
1001
|
-
`)}if(p.checklist){let S=await this.loadChecklistRouting(),
|
|
999
|
+
`)}let se=this.getSchemaTypeForCommand(m);if(se){let{renderSchemaForPrompt:S}=await Promise.resolve().then(()=>(al(),jg)),D=S(se);D&&d.push(`
|
|
1000
|
+
${D}
|
|
1001
|
+
`)}if(p.checklist){let S=await this.loadChecklistRouting(),D=await this.loadChecklists();S&&Object.keys(D).length>0&&(d.push(`
|
|
1002
1002
|
## QUALITY CHECKLISTS
|
|
1003
1003
|
`),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
1004
|
-
`),d.push(`Available: ${Object.keys(
|
|
1004
|
+
`),d.push(`Available: ${Object.keys(D).join(", ")}
|
|
1005
1005
|
`),d.push(`Path: templates/checklists/{name}.md
|
|
1006
1006
|
`),d.push(`Use Read tool to load checklists you determine are relevant.
|
|
1007
|
-
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),
|
|
1007
|
+
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),s=new oi({totalPrompt:t.stateData}),r=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=r.includes(i)?500:250,u=s.addSection(`### ${i}
|
|
1008
1008
|
${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
1009
1009
|
|
|
1010
|
-
`):null}buildAnalysis(e,t){let
|
|
1010
|
+
`):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
|
|
1011
1011
|
|
|
1012
|
-
`),
|
|
1013
|
-
`),
|
|
1012
|
+
`),s.push(`Read the project context and provide your analysis.
|
|
1013
|
+
`),s.push(`No predetermined patterns - decide based on what you find.
|
|
1014
1014
|
|
|
1015
|
-
`),
|
|
1016
|
-
`),
|
|
1017
|
-
`),
|
|
1015
|
+
`),s.push(`## Project Context
|
|
1016
|
+
`),s.push(`- Path: ${t.projectPath}
|
|
1017
|
+
`),s.push(`- ID: ${t.projectId}
|
|
1018
1018
|
|
|
1019
|
-
`),
|
|
1019
|
+
`),s.join("")}extractPatternSummary(e){if(!e)return null;let t=[],s=e.match(/## Conventions[\s\S]*?(?=##|$)/i);if(s){let a=s[0].split(`
|
|
1020
1020
|
`).filter(c=>c.includes(":")||c.startsWith("-")).slice(0,6).join(`
|
|
1021
1021
|
`);a&&t.push(a)}let r=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(r){let a=r[0].substring(0,300);t.push(`
|
|
1022
1022
|
Avoid:
|
|
1023
1023
|
${a}`)}let o=t.join(`
|
|
1024
|
-
`);return
|
|
1024
|
+
`);return Ks(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
|
|
1025
1025
|
## RULES (CRITICAL)
|
|
1026
1026
|
1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
|
|
1027
1027
|
2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
|
|
@@ -1038,7 +1038,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
|
|
|
1038
1038
|
- Prefer structured output (JSON) over free text when applicable.
|
|
1039
1039
|
|
|
1040
1040
|
EXECUTE: Follow flow. Use tools. Decide.
|
|
1041
|
-
`}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let
|
|
1041
|
+
`}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}}}},zT=new wl,lf=zT});import df from"node:fs/promises";import jt from"node:path";var qT,KT,kl,Sl,ai,bl=b(()=>{"use strict";ft();Se();U();qT=["task","done","ship","resume","bug","enrich"],KT=["init","sync","pause","next","dash","history","undo","redo"],kl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return jt.dirname(vt.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,s){let r=await this.getProjectId(s),o=A.getGlobalProjectPath(r),a=await(Be(),lt(ct)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=jt.join(u,"templates")}catch{c=jt.join(__dirname,"..","..","templates")}return{projectPath:s,projectId:r,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:jt.join(c,"agentic","orchestrator.md"),agentRouting:jt.join(c,"agentic","agent-routing.md"),taskFragmentation:jt.join(c,"agentic","task-fragmentation.md"),commandTemplate:jt.join(c,"commands",`${e}.md`),repoAnalysis:jt.join(o,"analysis","repo-analysis.json"),agentsDir:jt.join(o,"agents"),skillsDir:a.skillsDir,stateJson:jt.join(o,"storage","state.json")}}}requiresOrchestration(e){return qT.includes(e)?!0:!KT.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),s=jt.join(A.getGlobalProjectPath(t),"agents");return(await df.readdir(s)).some(o=>o.endsWith(".md"))}catch(t){return C(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),s=jt.join(A.getGlobalProjectPath(t),"agents");return(await df.readdir(s)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
1042
1042
|
## Agentic Execution Mode
|
|
1043
1043
|
|
|
1044
1044
|
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
@@ -1121,15 +1121,15 @@ When fragmenting tasks:
|
|
|
1121
1121
|
2. Track progress: currentSubtaskIndex, subtaskProgress
|
|
1122
1122
|
3. Each completed subtask generates a summary
|
|
1123
1123
|
4. Pass summary to next agent for context handoff
|
|
1124
|
-
`,context:e,requiresOrchestration:t}}},Sl=new kl,ai=Sl});function $r(s){if(!s||typeof s!="object")return!1;let e=s;if(e.code&&XT.has(e.code))return!0;if(e.code&&mf.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 li(s){if(!s||typeof s!="object")return!1;let e=s;return!!(e.code&&mf.has(e.code))}function pf(s,e,t){let n=vn.get(s);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(vn.delete(s),!1):!0:!1}function vl(s,e){let t=vn.get(s)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),vn.set(s,t)}function YT(s){vn.delete(s)}var XT,mf,vn,ci,gf,ui,Tl=b(()=>{"use strict";XT=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),mf=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l($r,"isTransientError");l(li,"isPermanentError");vn=new Map;l(pf,"isCircuitOpen");l(vl,"recordFailure");l(YT,"recordSuccess");ci=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(pf(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return YT(t),o}catch(o){if(n=o,r++,li(o))throw vl(t,this.options.circuitBreakerThreshold),o;if(!($r(o)&&r<this.options.maxAttempts))throw vl(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw vl(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return $r(e)}isCircuitOpen(e){return pf(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return vn.get(e)}resetCircuit(e){vn.delete(e)}resetAllCircuits(){vn.clear()}},gf=new ci({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),ui=new ci({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});import{exec as QT}from"node:child_process";import ff from"node:fs/promises";import{promisify as ZT}from"node:util";var eP,Qn,Qe,Pl=b(()=>{"use strict";Tl();eP=ZT(QT),Qn={tools:new Map,register(s,e){this.tools.set(s,e)},get(s){return this.tools.get(s)},isAllowed(s,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?s.startsWith(t.slice(0,-1)):s===t)},list(){return Array.from(this.tools.keys())}};Qn.register("Read",async s=>{try{return await ui.execute(async()=>await ff.readFile(s,"utf-8"),`read-${s}`)}catch(e){return li(e)||$r(e),null}});Qn.register("Write",async(s,e)=>{try{return await ui.execute(async()=>await ff.writeFile(s,e,"utf-8"),`write-${s}`),!0}catch(t){return li(t)||$r(t),!1}});Qn.register("Bash",async s=>{try{return await ui.execute(async()=>await eP(s),`bash-${s}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Qn.register("GetTimestamp",async()=>new Date().toISOString());Qn.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Qn.register("GetDateTime",async()=>new Date().toISOString());Qe=Qn});import Cl from"node:fs/promises";import tP from"node:os";import El from"node:path";function hf(){let s=process.env.PRJCT_CLI_HOME?.trim()||El.join(tP.homedir(),".prjct-cli");return El.join(s,".running")}async function nP(s){try{let e=hf(),t=El.dirname(e);await D(t)||await Cl.mkdir(t,{recursive:!0}),await Cl.writeFile(e,`/p:${s}`)}catch{}}async function sP(){try{let s=hf();await D(s)&&await Cl.unlink(s)}catch{}}var xl,rP,di,Al=b(()=>{"use strict";U();Wm();We();Jm();Km();zc();cg();lg();lr();dl();Ug();uf();bl();Wt();Pl();l(hf,"getRunningFilePath");l(nP,"signalStart");l(sP,"signalEnd");xl=class{static{l(this,"CommandExecutor")}async signalStart(e){await nP(e)}async signalEnd(){await sP()}async execute(e,t,n){await this.signalStart(e);let r=t.task||t.description||"";if(Rs.shouldEscalate(e,r)){let o=Rs.getEscalationInfo(e,r);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await pa.load(e),i=await dt.build(n,t),a=Ue.requiresPlanning(e),c=Ue.isDestructive(e),u=Ue.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Ue.startPlanning(i.projectId,e,t):u&&(d=Ue.getActivePlan(i.projectId));let m=null;if(Xo.requiresVerification(e)){let S=await dt.loadStateForCommand(i,e);m=await Xo.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Xo.formatWarnings(m))}let p=null;if(Ko.requiresReasoning(e)){let S=await dt.loadStateForCommand(i,e);p=await Ko.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ko.formatPlan(p)))}let g=t.task||t.description||"",f=await ai.buildContext(e,g,n),k=ai.buildAgenticPrompt(f),w=null;if(ai.requiresOrchestration(e)&&g)try{w=await ni.execute(e,g,n),w.detectedDomains.length>0&&qo.orchestrate(w.detectedDomains);for(let S of w.agents){let j=S.domain||S.name.replace(".md","");qo.startAgent(S.name,j,`Loading ${j} specialist...`),qo.endAgent(!0)}if(w.requiresFragmentation&&w.subtasks){let S=w.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));zm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(S)}`)}let C={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},T=await dt.loadState(i),O=null,G=null;i.projectId&&(O={commit_footer:await tt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await tt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await tt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await tt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},G=await tt.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Q={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Ue.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},ne=await lf.build(o,C,T,null,O,null,G,Q,w);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Rs.recordSuccess(e,r),await this.signalEnd(),{success:!0,template:o,context:C,state:T,prompt:ne,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:C.agentsPath,agentRoutingPath:C.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:G,orchestratorContext:w,memory:{create:l(S=>tt.createMemory(i.projectId,S),"create"),autoRemember:l((S,j,Ce)=>tt.autoRemember(i.projectId,S,j,Ce),"autoRemember"),search:l(S=>tt.searchMemories(i.projectId,S),"search"),findByTags:l(S=>tt.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>tt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>Ue.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>Ue.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>Ue.proposePlan(i.projectId,S),"propose"),approve:l(S=>Ue.approvePlan(i.projectId,S),"approve"),reject:l(S=>Ue.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>Ue.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Ue.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Ue.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>Ue.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>Ue.failStep(i.projectId,S),"failStep"),abort:l(S=>Ue.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>Ue.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Ue.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rs.recordAttempt(e,r,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Rs.getEscalationInfo(e,r);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Qe.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let r=Qe.get(e);if(!r)throw new Error(`Tool ${e} not found`);return await r(...t)}async executeSimple(e,t,n){try{let o=(await pa.load(e)).frontmatter["allowed-tools"]||[],i=await dt.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(r){return{success:!1,error:y(r)}}}},rP=new xl,di=rP});import pi from"node:fs/promises";import oP from"node:https";import iP from"node:os";import Rl from"node:path";import Nt from"chalk";var Dl,mi,jl=b(()=>{"use strict";U();We();Dl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rl.join(iP.homedir(),".prjct-cli","config"),this.cacheFile=Rl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Rl.join(__dirname,"..","..","package.json");return JSON.parse(await pi.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",y(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},r=oP.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let n=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await D(this.cacheFile))return JSON.parse(await pi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await D(this.cacheDir)||await pi.mkdir(this.cacheDir,{recursive:!0}),await pi.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let r=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
1124
|
+
`,context:e,requiresOrchestration:t}}},Sl=new kl,ai=Sl});function $r(n){if(!n||typeof n!="object")return!1;let e=n;if(e.code&&XT.has(e.code))return!0;if(e.code&&mf.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 li(n){if(!n||typeof n!="object")return!1;let e=n;return!!(e.code&&mf.has(e.code))}function pf(n,e,t){let s=bs.get(n);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(bs.delete(n),!1):!0:!1}function vl(n,e){let t=bs.get(n)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),bs.set(n,t)}function YT(n){bs.delete(n)}var XT,mf,bs,ci,gf,ui,Tl=b(()=>{"use strict";XT=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),mf=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l($r,"isTransientError");l(li,"isPermanentError");bs=new Map;l(pf,"isCircuitOpen");l(vl,"recordFailure");l(YT,"recordSuccess");ci=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(pf(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return YT(t),o}catch(o){if(s=o,r++,li(o))throw vl(t,this.options.circuitBreakerThreshold),o;if(!($r(o)&&r<this.options.maxAttempts))throw vl(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw vl(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return $r(e)}isCircuitOpen(e){return pf(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return bs.get(e)}resetCircuit(e){bs.delete(e)}resetAllCircuits(){bs.clear()}},gf=new ci({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),ui=new ci({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});import{exec as QT}from"node:child_process";import ff from"node:fs/promises";import{promisify as ZT}from"node:util";var eP,Ys,Qe,Pl=b(()=>{"use strict";Tl();eP=ZT(QT),Ys={tools:new Map,register(n,e){this.tools.set(n,e)},get(n){return this.tools.get(n)},isAllowed(n,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?n.startsWith(t.slice(0,-1)):n===t)},list(){return Array.from(this.tools.keys())}};Ys.register("Read",async n=>{try{return await ui.execute(async()=>await ff.readFile(n,"utf-8"),`read-${n}`)}catch(e){return li(e)||$r(e),null}});Ys.register("Write",async(n,e)=>{try{return await ui.execute(async()=>await ff.writeFile(n,e,"utf-8"),`write-${n}`),!0}catch(t){return li(t)||$r(t),!1}});Ys.register("Bash",async n=>{try{return await ui.execute(async()=>await eP(n),`bash-${n}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Ys.register("GetTimestamp",async()=>new Date().toISOString());Ys.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Ys.register("GetDateTime",async()=>new Date().toISOString());Qe=Ys});import Cl from"node:fs/promises";import tP from"node:os";import El from"node:path";function hf(){let n=process.env.PRJCT_CLI_HOME?.trim()||El.join(tP.homedir(),".prjct-cli");return El.join(n,".running")}async function sP(n){try{let e=hf(),t=El.dirname(e);await j(t)||await Cl.mkdir(t,{recursive:!0}),await Cl.writeFile(e,`/p:${n}`)}catch{}}async function nP(){try{let n=hf();await j(n)&&await Cl.unlink(n)}catch{}}var xl,rP,di,Al=b(()=>{"use strict";U();Wm();We();zm();Km();Jc();cg();lg();lr();dl();Ug();uf();bl();Wt();Pl();l(hf,"getRunningFilePath");l(sP,"signalStart");l(nP,"signalEnd");xl=class{static{l(this,"CommandExecutor")}async signalStart(e){await sP(e)}async signalEnd(){await nP()}async execute(e,t,s){await this.signalStart(e);let r=t.task||t.description||"";if(Rn.shouldEscalate(e,r)){let o=Rn.getEscalationInfo(e,r);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await pa.load(e),i=await dt.build(s,t),a=Ue.requiresPlanning(e),c=Ue.isDestructive(e),u=Ue.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Ue.startPlanning(i.projectId,e,t):u&&(d=Ue.getActivePlan(i.projectId));let m=null;if(Xo.requiresVerification(e)){let S=await dt.loadStateForCommand(i,e);m=await Xo.verify(e,i,S),!m.verified&&m.warnings.length>0&&console.log(Xo.formatWarnings(m))}let p=null;if(Ko.requiresReasoning(e)){let S=await dt.loadStateForCommand(i,e);p=await Ko.reason(e,i,S),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ko.formatPlan(p)))}let g=t.task||t.description||"",f=await ai.buildContext(e,g,s),k=ai.buildAgenticPrompt(f),w=null;if(ai.requiresOrchestration(e)&&g)try{w=await si.execute(e,g,s),w.detectedDomains.length>0&&qo.orchestrate(w.detectedDomains);for(let S of w.agents){let D=S.domain||S.name.replace(".md","");qo.startAgent(S.name,D,`Loading ${D} specialist...`),qo.endAgent(!0)}if(w.requiresFragmentation&&w.subtasks){let S=w.subtasks.map(D=>({id:D.id,domain:D.domain,description:D.description,status:D.status}));Jm(S)}}catch(S){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(S)}`)}let E={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},T=await dt.loadState(i),O=null,G=null;i.projectId&&(O={commit_footer:await tt.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await tt.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await tt.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await tt.getSmartDecision(i.projectId,`preferred_agent_${e}`)},G=await tt.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let Q={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Ue.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},se=await lf.build(o,E,T,null,O,null,G,Q,w);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Rn.recordSuccess(e,r),await this.signalEnd(),{success:!0,template:o,context:E,state:T,prompt:se,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,agentsPath:E.agentsPath,agentRoutingPath:E.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:G,orchestratorContext:w,memory:{create:l(S=>tt.createMemory(i.projectId,S),"create"),autoRemember:l((S,D,Ce)=>tt.autoRemember(i.projectId,S,D,Ce),"autoRemember"),search:l(S=>tt.searchMemories(i.projectId,S),"search"),findByTags:l(S=>tt.findByTags(i.projectId,S),"findByTags"),getStats:l(()=>tt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(S=>Ue.recordGatheredInfo(i.projectId,S),"recordInfo"),setAnalysis:l(S=>Ue.setAnalysis(i.projectId,S),"setAnalysis"),propose:l(S=>Ue.proposePlan(i.projectId,S),"propose"),approve:l(S=>Ue.approvePlan(i.projectId,S),"approve"),reject:l(S=>Ue.rejectPlan(i.projectId,S),"reject"),getApprovalPrompt:l(()=>Ue.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Ue.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Ue.getNextStep(i.projectId),"getNextStep"),completeStep:l(S=>Ue.completeStep(i.projectId,S),"completeStep"),failStep:l(S=>Ue.failStep(i.projectId,S),"failStep"),abort:l(S=>Ue.abortPlan(i.projectId,S),"abort"),getStatus:l(()=>Ue.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Ue.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rn.recordAttempt(e,r,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Rn.getEscalationInfo(e,r);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,s){if(!Qe.isAllowed(e,s))throw new Error(`Tool ${e} not allowed for this command`);let r=Qe.get(e);if(!r)throw new Error(`Tool ${e} not found`);return await r(...t)}async executeSimple(e,t,s){try{let o=(await pa.load(e)).frontmatter["allowed-tools"]||[],i=await dt.build(s);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(r){return{success:!1,error:y(r)}}}},rP=new xl,di=rP});import pi from"node:fs/promises";import oP from"node:https";import iP from"node:os";import Rl from"node:path";import Nt from"chalk";var jl,mi,Dl=b(()=>{"use strict";U();We();jl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Rl.join(iP.homedir(),".prjct-cli","config"),this.cacheFile=Rl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Rl.join(__dirname,"..","..","package.json");return JSON.parse(await pi.readFile(e,"utf8")).version}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"}},r=oP.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)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let s=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await j(this.cacheFile))return JSON.parse(await pi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await j(this.cacheDir)||await pi.mkdir(this.cacheDir,{recursive:!0}),await pi.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),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 r=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
1125
1125
|
`+Nt.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
|
|
1126
1126
|
`+Nt.yellow("\u2502")+" "+Nt.bold("Update available!")+" "+Nt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Nt.yellow("\u2502")+`
|
|
1127
1127
|
`+Nt.yellow("\u2502")+" "+Nt.yellow("\u2502")+`
|
|
1128
1128
|
`+Nt.yellow("\u2502")+" Run: "+Nt.cyan("npm update -g prjct-cli")+" "+Nt.yellow("\u2502")+`
|
|
1129
1129
|
`+Nt.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
|
|
1130
|
-
`}},mi=
|
|
1131
|
-
`;await gi.appendFile(r,o)}catch(r){
|
|
1132
|
-
${e.map((t,
|
|
1130
|
+
`}},mi=jl});import gi from"node:fs/promises";import Il from"node:path";var $l,yf,wf=b(()=>{"use strict";ft();Se();U();$l=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await $.getProjectId(e),this.projectPath=e,this.agentsPath=A.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await gi.readdir(this.agentsPath),t=[];for(let s of e)if(s.endsWith(".md")){let r=s.replace(".md",""),o=await gi.readFile(Il.join(this.agentsPath,s),"utf-8");t.push({name:r,content:o})}return t}catch(e){return C(e)||console.error(`Agent loading error: ${y(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Il.join(this.agentsPath,`${e}.md`),s=await gi.readFile(t,"utf-8");return{name:e,content:s}}catch(t){return C(t)||console.error(`Agent load error: ${y(t)}`),null}}async buildAssignmentContext(e,t){let s=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:s,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,s){try{let r=Il.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
|
|
1131
|
+
`;await gi.appendFile(r,o)}catch(r){C(r)||console.error(`Agent usage log error: ${y(r)}`)}}},yf=$l});import kf from"node:path";async function lP(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let n=process.cwd();if(await j(kf.join(n,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await j(kf.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function uP(){return{...aP}}function dP(){return{...cP}}async function Sf(){return fi||(fi=await lP()?uP():dP(),fi)}var fi,aP,cP,bf=b(()=>{"use strict";We();fi=null,aP={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},cP={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(lP,"isClaudeEnvironment");l(uP,"getClaudeAgent");l(dP,"getTerminalAgent");l(Sf,"detect")});import Mr from"node:fs/promises";var Ml,vf,Tf=b(()=>{"use strict";U();Ml=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 Mr.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 Mr.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 Mr.readdir(e)}async fileExists(e){try{return await Mr.access(e),!0}catch(t){if(C(t))return!1;throw t}}async createDirectory(e){await Mr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
1132
|
+
${e.map((t,s)=>`${s+1}. ${t}`).join(`
|
|
1133
1133
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
1134
1134
|
|
|
1135
1135
|
\u{1F3AF} Current: ${e.currentTask||"None"}
|
|
@@ -1149,7 +1149,7 @@ ${e.recentFeatures||""}`}getHelpContent(e){let t={debugging:`\u{1F50D} 1. Isolat
|
|
|
1149
1149
|
2. Optimize slowest parts
|
|
1150
1150
|
3. Cache expensive operations`,default:`\u{1F4A1} 1. Break into smaller tasks
|
|
1151
1151
|
2. Start with simplest part
|
|
1152
|
-
3. Ship it`},
|
|
1152
|
+
3. Ship it`},s=Object.keys(t).find(r=>e.toLowerCase().includes(r))||"default";return t[s]}suggestNextAction(e){return{taskCompleted:`What's next?
|
|
1153
1153
|
\u2022 "start [task]" \u2192 Begin working
|
|
1154
1154
|
\u2022 "ship feature" \u2192 Track & celebrate
|
|
1155
1155
|
\u2022 "add idea" \u2192 Brainstorm
|
|
@@ -1173,7 +1173,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
1173
1173
|
|
|
1174
1174
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
1175
1175
|
|
|
1176
|
-
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}}},vf=Ml});var mP,Ol,Or,Pf=b(()=>{"use strict";wf();Yt();bf();Tf();Tl();mP=["claude"],Ol=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new yf}async initialize(){return this.agent?this.agent:await gf.execute(async()=>{if(this.agentInfo=await Sf(),!this.agentInfo?.isSupported)throw ur.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!mP.includes(e))throw ur.notSupported(this.agentInfo?.type??"unknown");return this.agent=new vf,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,
|
|
1176
|
+
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}}},vf=Ml});var mP,Ol,Or,Pf=b(()=>{"use strict";wf();Yt();bf();Tf();Tl();mP=["claude"],Ol=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new yf}async initialize(){return this.agent?this.agent:await gf.execute(async()=>{if(this.agentInfo=await Sf(),!this.agentInfo?.isSupported)throw ur.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!mP.includes(e))throw ur.notSupported(this.agentInfo?.type??"unknown");return this.agent=new vf,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,s){try{await this.agentRouter.initialize(t);let r=await this.agentRouter.getAgentNames();return r.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:r},_agenticNote:`
|
|
1177
1177
|
AGENTIC EXECUTION:
|
|
1178
1178
|
- Read: templates/agentic/orchestrator.md
|
|
1179
1179
|
- Analyze task: "${e}"
|
|
@@ -1181,10 +1181,10 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
|
|
|
1181
1181
|
- Claude decides which agent(s) to use
|
|
1182
1182
|
- Always prefer specialists over generalist
|
|
1183
1183
|
- Fragment complex tasks into subtasks
|
|
1184
|
-
`}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Or=new Ol});var _l,
|
|
1185
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,
|
|
1186
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r),x.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return x.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(x.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,
|
|
1187
|
-
`);ae.note(e,"Configuration Summary");let t=await ae.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ae.isCancel(t)||!t?(ae.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let
|
|
1184
|
+
`}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Or=new Ol});var _l,In,Nl=b(()=>{"use strict";_l=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},In=new _l});var Fl,Ze,Ll=b(()=>{"use strict";ne();Fl=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();N.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
1185
|
+
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let r=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return r.id}getWorkflow(e,t){let s=N.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 N.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),N.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 N.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],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}}},Ze=new Fl});function Ul(n){return{id:n.id,type:n.type,command:n.command,position:n.position,action:n.action,description:n.description,enabled:n.enabled===1,timeoutMs:n.timeout_ms,createdAt:n.created_at,sortOrder:n.sort_order}}var Hl,De,hi=b(()=>{"use strict";Ll();ne();l(Ul,"rowToRule");Hl=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=x.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),r=t.sortOrder||(s?.m??-1)+1;return x.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|
|
1186
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r),x.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return x.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(x.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!x.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),x.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=x.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Ul(s):null}getRulesForCommand(e,t){let s=Ze.getWorkflow(e,t);return!s||!s.enabled?[]:x.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Ul)}getAllRules(e){return x.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Ul)}resetRules(e){let t=x.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return x.run(e,"DELETE FROM workflow_rules"),t?.c??0}},De=new Hl});import rt from"node:path";async function gP(n,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 j(rt.join(n,"pnpm-lock.yaml"))?"pnpm":await j(rt.join(n,"yarn.lock"))?"yarn":await j(rt.join(n,"bun.lockb"))||await j(rt.join(n,"bun.lock"))?"bun":(await j(rt.join(n,"package-lock.json")),"npm")}function Cf(n,e){return n==="yarn"?`yarn ${e}`:n==="pnpm"?`pnpm run ${e}`:n==="bun"?`bun run ${e}`:`npm run ${e}`}function fP(n){return n==="yarn"?"yarn test":n==="pnpm"?"pnpm test":n==="bun"?"bun test":"npm test"}async function $n(n,e){for(let r of hP)if(await j(rt.join(n,r)))return r;let s=(e??await Xt(n)).find(r=>r.endsWith(yP));if(s)return s}async function is(n){for(let e of wP)if(await j(rt.join(n,e)))return e}async function yi(n){let e=rt.join(n,"package.json"),t=await Ut(e,null);if(t){let a=await gP(n,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Cf(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Cf(a,"typecheck")}),c.test&&(u.test={tool:a,command:fP(a)}),u.versionFile=await $n(n),u.changelogFile=await is(n),u}if(await j(rt.join(n,"pytest.ini"))){let a=await $n(n),c=await is(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await et(rt.join(n,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await $n(n),c=await is(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await j(rt.join(n,"Cargo.toml"))){let a=await is(n);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await j(rt.join(n,"go.mod"))){let a=await $n(n),c=await is(n);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let r=await Xt(n);if(r.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await $n(n,r),c=await is(n);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await j(rt.join(n,"pom.xml"))){let a=await is(n);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await j(rt.join(n,"gradlew"))&&(await j(rt.join(n,"build.gradle"))||await j(rt.join(n,"build.gradle.kts")))){let a=await is(n);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await $n(n),i=await is(n);return{stack:"unknown",versionFile:o,changelogFile:i}}var hP,yP,wP,Gl=b(()=>{"use strict";We();l(gP,"detectPackageManager");l(Cf,"pmRun");l(fP,"pmTest");hP=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],yP=".csproj",wP=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l($n,"detectVersionFile");l(is,"detectChangelogFile");l(yi,"detectProjectCommands")});import*as ae from"@clack/prompts";import Qs from"chalk";var wi,Ef,_r,xf=b(()=>{"use strict";zs();wi=[{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."}],Ef=[{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"}],_r=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(){ae.intro(Qs.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 ae.outro(Qs.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=wi.findIndex(s=>s.value===this.detectedType),t=await ae.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:wi.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?wi[e].value:void 0});return ae.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ae.multiselect({message:"Which AI agents do you use?",options:Ef.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ae.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);ae.note(e,"Detected stack");let t=await ae.confirm({message:"Is this stack correct?",initialValue:!0});if(ae.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ae.group({language:l(()=>ae.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ae.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 ae.group({verbosity:l(()=>ae.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(()=>ae.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=[`${Qs.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Qs.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${Qs.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Qs.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Qs.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1187
|
+
`);ae.note(e,"Configuration Summary");let t=await ae.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ae.isCancel(t)||!t?(ae.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 r=t.join(this.projectPath,"package.json"),o=await e.readFile(r,"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:fs/promises"),t=await import("node:path"),s=await import("node:os"),r=[];try{await e.access(t.join(s.homedir(),".claude")),r.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),r.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),r.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),r.push("copilot")}catch{}try{await e.access(t.join(s.homedir(),".gemini")),r.push("gemini")}catch{}try{let{exec:o}=await import("node:child_process"),{promisify:i}=await import("node:util");await i(o)("which codex"),r.push("codex")}catch{try{await e.access(t.join(s.homedir(),".codex")),r.push("codex")}catch{}}return r.length>0?r:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let r=await e.readdir(this.projectPath);if(r.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",r.includes("bun.lockb")?s.packageManager="Bun":r.includes("pnpm-lock.yaml")?s.packageManager="pnpm":r.includes("yarn.lock")?s.packageManager="Yarn":r.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 r.includes("pyproject.toml")||r.includes("requirements.txt")?s.language="Python":r.includes("go.mod")?s.language="Go":r.includes("Cargo.toml")?s.language="Rust":(r.includes("pom.xml")||r.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,ae.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return wi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Ef.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 Af={};ls(Af,{PlanningCommands:()=>en});import Zs from"node:path";async function kP(){if(!Vl){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(Si(),Rf));Vl=new n}return Vl}var Vl,en,ki=b(()=>{"use strict";So();Qt();Tt();Ls();rs();hi();U();En();xn();Gl();xf();ot();Vl=null;l(kP,"getAnalysisCommands");en=class extends ve{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 $.isConfigured(t))return h.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 _r(t).runNonInteractive());else if(a=await new _r(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await Sn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;h.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
|
|
1188
1188
|
|
|
1189
1189
|
No current task. Use \`/p:now\` to set focus.
|
|
1190
1190
|
`,"core/next.md":`# NEXT
|
|
@@ -1204,7 +1204,7 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
1204
1204
|
`,"planning/roadmap.md":`# ROADMAP
|
|
1205
1205
|
|
|
1206
1206
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
1207
|
-
`,"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[
|
|
1207
|
+
`,"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,T]of Object.entries(g))await Qe.get("Write")(Zs.join(p,E),T);let f=await this._detectEmptyDirectory(t),k=await this._detectExistingCode(t);if(k||!f){h.step(3,4,"Analyzing project...");let E=await kP();if((await E.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await E.sync(t,{aiTools:a.agents}):await E.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let w=s.idea;if(f&&!k){if(!w)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let E=Zs.join(p,"planning","architect-session.md"),T=`# Architect Session
|
|
1208
1208
|
|
|
1209
1209
|
## Idea
|
|
1210
1210
|
${w}
|
|
@@ -1213,8 +1213,8 @@ ${w}
|
|
|
1213
1213
|
Initialized - awaiting stack recommendation
|
|
1214
1214
|
|
|
1215
1215
|
Generated: ${new Date().toLocaleString()}
|
|
1216
|
-
`;return await Qe.get("Write")(
|
|
1217
|
-
`);let r=await this.getGlobalProjectPath(t),o=
|
|
1216
|
+
`;return await Qe.get("Write")(E,T),await Ae.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:w,wizard:a}}return await Ae.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(s){return h.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 h.fail("description required"),{success:!1,error:"Description required"};let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await dt.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=he(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Oe.addTasks(r,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:J.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async bug(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return s.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return s.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||h.spin("tracking bug...");let i=await dt.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await Oe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:J.getTimestamp()}),s.md?console.log(L(te("Bug Reported",e),ut({Severity:a,Priority:m,Agent:u}),le([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),kt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(r){return s.md||h.fail(y(r)),{success:!1,error:y(r)}}}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
|
|
1217
|
+
`);let r=await this.getGlobalProjectPath(t),o=Zs.join(r,"planning","architect-session.md"),i;try{i=await Ee.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
1218
1218
|
|
|
1219
1219
|
Create a plan first:
|
|
1220
1220
|
1. Run /p:init in an empty directory
|
|
@@ -1235,7 +1235,7 @@ The architect plan is ready. Claude will now:
|
|
|
1235
1235
|
4. Create starter files with boilerplate
|
|
1236
1236
|
`),console.log(`
|
|
1237
1237
|
\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.
|
|
1238
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
1238
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:J.getTimestamp(),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 r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return s.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return s.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||h.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=Zs.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
1239
1239
|
|
|
1240
1240
|
## Idea
|
|
1241
1241
|
${e}
|
|
@@ -1250,14 +1250,14 @@ Initialized - awaiting architecture design
|
|
|
1250
1250
|
4. Generate roadmap
|
|
1251
1251
|
|
|
1252
1252
|
Generated: ${new Date().toLocaleString()}
|
|
1253
|
-
`;return await Qe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:
|
|
1253
|
+
`;return await Qe.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:J.getTimestamp()}),s.md?console.log(L(te("Idea Captured",e),ut({Mode:"architecture"}),le([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
|
|
1254
1254
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
1255
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return
|
|
1255
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||h.spin("capturing idea..."),await st.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:J.getTimestamp()}),s.md?console.log(L(te("Idea Captured",e),ut({Mode:"capture"}),le([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),kt("idea")),{success:!0,mode:"capture",idea:e}}catch(r){return s.md||h.fail(y(r)),{success:!1,error:y(r)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=A.getGlobalProjectPath(r),m=Zs.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(k=>k.endsWith(".md")&&k!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
|
|
1256
1256
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
1257
1257
|
`),{success:!0,specs:[]}):(console.log(`
|
|
1258
1258
|
\u{1F4CB} SPECIFICATIONS
|
|
1259
|
-
`),console.log("\u2550".repeat(50)),f.forEach((k,w)=>{let
|
|
1260
|
-
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=A.getGlobalProjectPath(r),i=
|
|
1259
|
+
`),console.log("\u2550".repeat(50)),f.forEach((k,w)=>{let E=k.replace(".md","").replace(/-/g," ");console.log(` ${w+1}. ${E}`)}),console.log(`${"\u2550".repeat(50)}
|
|
1260
|
+
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=A.getGlobalProjectPath(r),i=Zs.join(o,"planning","specs");await Ee.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Zs.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
1261
1261
|
|
|
1262
1262
|
## Overview
|
|
1263
1263
|
[Brief description of the feature]
|
|
@@ -1287,33 +1287,33 @@ Generated: ${new Date().toLocaleString()}
|
|
|
1287
1287
|
---
|
|
1288
1288
|
Created: ${new Date().toLocaleString()}
|
|
1289
1289
|
Status: Draft
|
|
1290
|
-
`;return await Qe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:
|
|
1290
|
+
`;return await Qe.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:J.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
|
|
1291
1291
|
\u{1F4DD} Edit: ~/.prjct-cli/projects/${r}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
|
|
1292
|
-
`),{success:!0,feature:e,specPath:c}}catch(
|
|
1293
|
-
`));let u=[];
|
|
1294
|
-
`)}function Mf(
|
|
1292
|
+
`),{success:!0,feature:e,specPath:c}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async _seedShipWorkflow(e,t){let s=await yi(t),r=0;De.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:r++,createdAt:new Date().toISOString()}),s.lint&&De.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:r++,createdAt:new Date().toISOString()}),s.test&&De.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:r++,createdAt:new Date().toISOString()})}}});var Wl,tn,jf=b(()=>{"use strict";Yt();So();ft();Se();U();We();zs();Wl=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ki(),Af)),r=await new t().init(null,e);return r.success?{success:!0}:r}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw ro.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 Sn();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 Xt(e)).filter(r=>!r.startsWith(".")&&r!=="node_modules"&&r!=="package.json"&&r!=="package-lock.json"&&r!=="README.md").length===0}catch(t){return C(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 Xt(e)).some(r=>t.includes(r))}catch(t){return C(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},tn=new Wl});var ve,ot=b(()=>{"use strict";Al();Jc();Pl();ft();Se();Dl();Pf();Nl();Hs();jf();fe();We();zs();ve=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new mi,this.updateNotificationShown=!1,this.commandExecutor=di}get agent(){return Or.getAgent()}get agentInfo(){return Or.getInfo()}get currentAuthor(){return tn.getCurrentAuthor()}async initializeAgent(){return Or.initialize()}async ensureProjectInit(e){return tn.ensureInit(e)}async ensureAuthor(){return tn.ensureAuthor()}async getGlobalProjectPath(e){return tn.getGlobalPath(e)}async logToMemory(e,t,s){let r=await this.ensureAuthor();return yt.log(e,t,s,r.name)}async _detectEmptyDirectory(e){return tn.isEmptyDirectory(e)}async _detectExistingCode(e){return tn.hasExistingCode(e)}_breakdownFeatureTasks(e){return In.breakdownFeature(e)}_detectBugSeverity(e){return In.detectBugSeverity(e)}async _assignAgentForTask(e,t,s){return Or.assignForTask(e,t,s)}}});import SP from"node:path";async function Bl(n,e){let t=Date.now()-e,s=n.contextFiles.length+(n.aiTools?.filter(p=>p.success).length||0),r=n.agents.length,o=n.agents.filter(p=>p.type==="domain").length;await Ae.installGlobalConfig(),h.done(`Synced ${n.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=n.syncMetrics?.compressionRate?Math.round(n.syncMetrics.compressionRate*100):0,a=n.stats.frameworks.length>0?` (${n.stats.frameworks[0]})`:"",c=[`${n.stats.fileCount} files \u2192 ${s} context | ${r} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${n.stats.ecosystem}${a} | Branch: ${n.git.branch}`];h.box("Sync Summary",c.join(`
|
|
1293
|
+
`));let u=[];n.contextFiles.length>0&&u.push(`${n.contextFiles.length} context files`);let d=n.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),r>0){let p=o>0?`${r} agents (${o} domain)`:`${r} agents`;u.push(p)}if(n.skills.length>0){let p=n.skills.length===1?"skill":"skills";u.push(`${n.skills.length} ${p}`)}let m=n.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(n.context7&&u.push(`Context7: ${n.context7.verified?"verified":`not ready${n.context7.message?` (${n.context7.message})`:""}`}`),n.analysisSummary&&u.push(`Analysis: ${n.analysisSummary.patterns} patterns | ${n.analysisSummary.antiPatterns} anti-patterns (${n.analysisSummary.criticalAntiPatterns} critical)`),h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),n.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),n.verification){let p=n.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return kt("sync"),{success:!0,data:n,metrics:{elapsed:t,contextFilesCount:s,agentCount:r,fileCount:n.stats.fileCount}}}async function Df(n){try{let e=await yt.getRecentEvents(n,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),r=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];r=J.formatDuration(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:r,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Nr(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:n.toLocaleString()}function Jl(n){return n<1e3?`${Math.round(n)}ms`:`${(n/1e3).toFixed(1)}s`}function If(n){if(n.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=n.map(r=>r.tokensSaved),s=Math.max(...t,1);return t.map(r=>{let o=Math.min(Math.floor(r/s*(e.length-1)),e.length-1);return e[o]}).join("")}function $f(n,e,t,s,r,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),r){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),r.sessionDuration&&i.push(`| Duration | ${r.sessionDuration} |`),i.push(`| Tasks completed | ${r.tasksCompleted} |`),i.push(`| Features shipped | ${r.featuresShipped} |`),r.agentsUsed.length>0){let a=r.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${Nr(n.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(n.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${uo(n.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${n.syncCount} |`),i.push(`| Avg time | ${Jl(n.avgSyncDuration)} |`),i.push(""),n.topAgents.length>0){i.push("## \u{1F916} Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=n.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of n.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${Nr(n.last30DaysTokens)}`),n.trend!==0){let a=n.trend>0?"+":"";i.push(`- Trend: ${a}${n.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
|
|
1294
|
+
`)}function Mf(n,e){let t=[];t.push(`# Repository Analysis
|
|
1295
1295
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
1296
|
-
`);let
|
|
1296
|
+
`);let s=SP.basename(e);if(t.push(`## Project: ${s}
|
|
1297
1297
|
`),t.push(`## Stack Detected
|
|
1298
|
-
`),
|
|
1299
|
-
`),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)`:""}`)}
|
|
1298
|
+
`),n.packageJson){let i=n.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
1299
|
+
`),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)`:""}`)}n.hasNextConfig&&t.push("- **Framework**: Next.js detected"),n.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),n.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}n.cargoToml&&(t.push(`### Rust
|
|
1300
1300
|
`),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
|
|
1301
|
-
`)),
|
|
1301
|
+
`)),n.goMod&&(t.push(`### Go
|
|
1302
1302
|
`),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
|
|
1303
|
-
`)),
|
|
1303
|
+
`)),n.requirements&&(t.push(`### Python
|
|
1304
1304
|
`),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
|
|
1305
|
-
`));let r=
|
|
1306
|
-
`),t.push(`- **Total Files**: ${
|
|
1307
|
-
`),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),
|
|
1308
|
-
`),
|
|
1305
|
+
`));let r=n.directories;t.push(`## Structure
|
|
1306
|
+
`),t.push(`- **Total Files**: ${n.fileCount}`),t.push(`- **Directories**: ${r?.slice(0,15).join(", ")||"none"}${(r?.length||0)>15?` (+${(r?.length||0)-15} more)`:""}`),n.hasDockerfile&&t.push("- **Docker**: Detected"),n.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),n.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=n.gitStats;return t.push(`## Git Statistics
|
|
1307
|
+
`),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),n.gitLog&&(t.push(`## Recent Activity
|
|
1308
|
+
`),n.gitLog.split(`
|
|
1309
1309
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1310
1310
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1311
1311
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1312
|
-
`)}var Of=b(()=>{"use strict";Qt();po();
|
|
1313
|
-
`),
|
|
1312
|
+
`)}var Of=b(()=>{"use strict";Qt();po();Hs();xn();zs();ot();l(Bl,"showSyncResult");l(Df,"getSessionActivity");l(Nr,"formatTokens");l(Jl,"formatDuration");l(If,"generateSparkline");l($f,"generateStatsMarkdown");l(Mf,"generateAnalysisSummary")});var Rf={};ls(Rf,{AnalysisCommands:()=>nn});import zl from"node:fs/promises";import _f from"node:path";import*as sn from"@clack/prompts";var nn,Si=b(()=>{"use strict";lr();zu();Qt();po();fa();Ad();Md();Ma();Fc();yn();ne();va();ic();U();En();xn();zs();Of();ot();nn=class extends ve{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1313
|
+
`),Je.init(t);let s=await dt.build(t,e),r={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=Mf(r,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await Qe.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:J.getTimestamp(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits});let u=await(Be(),lt(ct)).getActiveProvider(),d=await Ae.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1314
1314
|
`),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1315
|
-
`),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:r}}catch(
|
|
1316
|
-
${$d(g)}`);let w=await
|
|
1315
|
+
`),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:r}}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 r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(r),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(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await Ws.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(L(we(`Synced package: ${p.name}`))):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=_f.join(o,"context","CLAUDE.md"),c=null;try{c=await zl.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||h.spin("Analyzing changes...");let m=await Ws.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(L("## \u274C Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await zl.readFile(a,"utf-8")}catch{p=""}let g=Dd(c,p);if(u||h.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"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await zl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let w=[];for(let T of g.added)w.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)w.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)w.push(`Removed: ${T.name} (${T.lineCount} lines)`);let E=L("## \u26A1 Sync Preview",w.length>0?te("Changes",Re(w)):"No section changes.",ut({"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 f();let w={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:w,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(Id(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await sn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(sn.isCancel(k)||k==="cancel")return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
|
|
1316
|
+
${$d(g)}`);let w=await sn.confirm({message:"Apply these changes?",initialValue:!0});if(sn.isCancel(w)||!w)return await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return h.done("Changes applied"),Bl(m,i)}t.md||h.spin("Syncing project...");let d=await Ws.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(L("## \u274C Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(T=>T.success).length||0),g=d.agents.length,f=null;try{let T=await qe.diff(r);T?.hasChanges&&(f=ga(T))}catch{}let k=`## LLM Analysis (hybrid pipeline)
|
|
1317
1317
|
|
|
1318
1318
|
After sync, run the analysis payload builder:
|
|
1319
1319
|
\`\`\`bash
|
|
@@ -1347,9 +1347,9 @@ Otherwise, analyze the JSON payload and produce a structured \`LLMAnalysis\` JSO
|
|
|
1347
1347
|
Save the analysis:
|
|
1348
1348
|
\`\`\`bash
|
|
1349
1349
|
prjct analysis-save-llm '<your JSON here>' --md
|
|
1350
|
-
\`\`\``,w=Jo("sync"),C=L(we("Sync Complete"),ut({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Fm("Uncommitted changes detected"):null,k,le(w.map(T=>({label:T.desc,command:T.cmd}))));return console.log(C),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Bl(d,i)}catch(n){return t.md?console.log(L("## \u274C Sync Failed",`> ${y(n)}`)):h.fail(y(n)),{success:!1,error:y(n)}}}async analysisPayload(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Bn.sync(e,{aiTools:[]});if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&ws.isCurrent(r,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 xd(r,e,o.git,o.stats);return t.md?console.log(L("## \u{1F50D} Analysis Payload","> Analyze this project data and produce structured findings.","","```json",JSON.stringify(a,null,2),"```","","> After analyzing, call: `prjct analysis save-llm --json '{...}'`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(n){return{success:!1,error:y(n)}}}async saveLlmAnalysis(e,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;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."}:(ws.save(o,i),n.md?console.log(L(we("LLM Analysis Saved"),ut({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(r){return{success:!1,error:y(r)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=ws.getActive(r);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(te("Architecture Insights",Re(o.architecture.insights))),o.patterns.length>0&&i.push(te("Patterns",Re(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(te("Anti-Patterns",Re(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(te("Tech Debt",Re(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(te("Conventions",Re(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(n){return{success:!1,error:y(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Ts.getSummary(r),i=await Ts.getDailyStats(r,30),a=await jf(r),c=await tt.getPatternsSummary(r);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=x.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await Ts.read(r),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: ${Nr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${uo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${zl(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=If(i);if(console.log(` ${p} ${Nr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=$f(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",y(n)),{success:!1,error:y(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=yo(e),i=await o.check(r),a=await o.getSessionInfo(r),c=await qe.getStatus(r);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=_f.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(`## \u26A1 Status: ${u}`,ut({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?te("Analysis",Re(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async diff(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)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(r);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}`)):h.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(L(ga(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(sd(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),h.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(n){let r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(L("## \u274C Diff Failed",`> ${r}`)):h.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)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(r);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async rollback(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)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(r);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"),ut({"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("## \u274C Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(h.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(h.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(n){let r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(L("## \u274C Rollback Failed",`> ${r}`)):h.fail(r),{success:!1,error:r}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await qe.verify(r);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let r=y(n);return h.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=x.getDoc(r,"project")?.repoPath||e}catch{}let i=await qe.semanticVerify(r,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let r=y(n);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}}});function Gs(s){return Buffer.from(`${JSON.stringify(s)}
|
|
1351
|
-
`)}var Ne,Yf,Qf,du=b(()=>{"use strict";Ne={runDir:l(()=>`${process.env.HOME||vt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ne.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ne.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ne.runDir()}/daemon.log`,"log")},Yf=1800*1e3,Qf=1024*1024;l(
|
|
1352
|
-
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function WP(
|
|
1350
|
+
\`\`\``,w=zo("sync"),E=L(we("Sync Complete"),ut({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p}),f,d.git.hasChanges?Fm("Uncommitted changes detected"):null,k,le(w.map(T=>({label:T.desc,command:T.cmd}))));return console.log(E),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Bl(d,i)}catch(s){return t.md?console.log(L("## \u274C Sync Failed",`> ${y(s)}`)):h.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 r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Ws.sync(e,{aiTools:[]});if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&wn.isCurrent(r,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 xd(r,e,o.git,o.stats);return t.md?console.log(L("## \u{1F50D} Analysis Payload","> Analyze this project data and produce structured findings.","","```json",JSON.stringify(a,null,2),"```","","> After analyzing, call: `prjct analysis save-llm --json '{...}'`")):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 r=await this.ensureProjectInit(t);if(!r.success)return r;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."}:(wn.save(o,i),s.md?console.log(L(we("LLM Analysis Saved"),ut({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(r){return{success:!1,error:y(r)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=wn.getActive(r);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(te("Architecture Insights",Re(o.architecture.insights))),o.patterns.length>0&&i.push(te("Patterns",Re(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(te("Anti-Patterns",Re(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(te("Tech Debt",Re(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(te("Conventions",Re(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 r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Tn.getSummary(r),i=await Tn.getDailyStats(r,30),a=await Df(r),c=await tt.getPatternsSummary(r);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=x.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await Tn.read(r),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: ${Nr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${uo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Jl(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=If(i);if(console.log(` ${p} ${Nr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=$f(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 r=await $.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=yo(e),i=await o.check(r),a=await o.getSessionInfo(r),c=await qe.getStatus(r);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=_f.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(`## \u26A1 Status: ${u}`,ut({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?te("Analysis",Re(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 r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)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(r);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}`)):h.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(L(ga(o))),{success:!0,data:o};if(!o.hasChanges)h.done("No changes between draft and sealed analysis");else{h.section("Analysis Diff"),console.log(nd(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),h.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(L("## \u274C Diff Failed",`> ${r}`)):h.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)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(r);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)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(r);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"),ut({"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("## \u274C Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(h.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(h.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(L("## \u274C Rollback Failed",`> ${r}`)):h.fail(r),{success:!1,error:r}}}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 r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await qe.verify(r);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let r=y(s);return h.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=x.getDoc(r,"project")?.repoPath||e}catch{}let i=await qe.semanticVerify(r,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):h.fail(r),{success:!1,error:r}}}}});function Gn(n){return Buffer.from(`${JSON.stringify(n)}
|
|
1351
|
+
`)}var Ne,Yf,Qf,du=b(()=>{"use strict";Ne={runDir:l(()=>`${process.env.HOME||vt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ne.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ne.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ne.runDir()}/daemon.log`,"log")},Yf=1800*1e3,Qf=1024*1024;l(Gn,"encodeMessage")});var th={};ls(th,{executeViaDaemon:()=>WP,forceKillDaemon:()=>JP,getDaemonStatus:()=>VP,isDaemonRunning:()=>Zf,sendRequest:()=>Ur,spawnDaemon:()=>eh,stopDaemon:()=>BP});import ji from"node:crypto";import Xe from"node:fs";import{connect as GP}from"node:net";async function Zf(){let n=Ne.socket();if(!Xe.existsSync(n))return!1;try{return(await Ur({id:ji.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Xe.unlinkSync(n)}catch{}return!1}}async function VP(){let n=Ne.socket(),e=Ne.pid();if(!Xe.existsSync(n))return{running:!1};try{let t=await Ur({id:ji.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Xe.existsSync(e)?{running:!1,pid:parseInt(Xe.readFileSync(e,"utf-8").trim(),10),socketPath:n}:{running:!1}}function Ur(n){return new Promise((e,t)=>{let s=Ne.socket(),r=GP(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(Gn(n))}),r.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
1352
|
+
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function WP(n,e,t,s,r,o=!0){let i=Ne.socket();if(!Xe.existsSync(i))return o&&eh().catch(()=>{}),null;try{return await Ur({id:ji.randomUUID(),command:n,args:e,options:t,cwd:s,perfStartNs:r})}catch{return null}}async function BP(){try{return(await Ur({id:ji.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function JP(){let n=Ne.pid(),e=Ne.socket(),t=!1;if(Xe.existsSync(n)){let s=parseInt(Xe.readFileSync(n,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Xe.existsSync(n)&&Xe.unlinkSync(n)}catch{}try{Xe.existsSync(e)&&Xe.unlinkSync(e)}catch{}return t}async function eh(){let{spawn:n}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Xe.existsSync(t))o=t,i="bun";else if(Xe.existsSync(s))o=s,i=Qi()?"bun":"node";else if(Xe.existsSync(r))o=r,i=Qi()?"bun":"node";else return!1;let a=Ne.runDir();Xe.mkdirSync(a,{recursive:!0});let c=Ne.log(),u=Xe.openSync(c,"a");n(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Xe.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await Zf())return!0;return!1}var sh=b(()=>{"use strict";nr();du();l(Zf,"isDaemonRunning");l(VP,"getDaemonStatus");l(Ur,"sendRequest");l(WP,"executeViaDaemon");l(BP,"stopDaemon");l(JP,"forceKillDaemon");l(eh,"spawnDaemon")});import Fe from"node:fs";import{createServer as BC}from"node:net";Si();Ma();ne();Ls();rs();Pn();Et();U();En();ot();import bP from"node:path";ft();Se();U();fe();var ql=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,r){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,r)}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(r=>r.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),r=s.filter((a,c)=>s.indexOf(a)!==c);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:A.getGlobalProjectPath(t),timestamp:v()}}async execute(e,t,s=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:v()};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 r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};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()}},B=new ql;var Mn=class extends ve{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=bP.basename(t),a=await F.getCurrentTask(o),c=await Oe.getActiveTasks(o),u=await ht.getRecent(o,5),d=await st.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=J.getDaysAgo(m),g=[];try{let w=p.toISOString();g=x.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",w).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(w=>w.action==="task_completed").length,featuresShipped:g.filter(w=>w.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1353
1353
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1354
1354
|
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let k=this._generateSparkline(g,m);return console.log(`
|
|
1355
1355
|
Activity: ${k}
|
|
@@ -1358,32 +1358,32 @@ prjct analysis-save-llm '<your JSON here>' --md
|
|
|
1358
1358
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1359
1359
|
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,k)=>{let w=f.split(`
|
|
1360
1360
|
`)[0].trim();console.log(` ${k+1}. ${w}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1361
|
-
`),{success:!0,view:"roadmap"}}if(
|
|
1361
|
+
`),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${J.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(k=>{let w=k.priority?` [${k.priority}]`:"";return`${k.description}${w}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(k=>{let w=k.shippedAt?new Date(k.shippedAt).toLocaleDateString():"";return`${k.name}${w?` (${w})`:""}`}):["Nothing shipped yet"],f=L(`## \u26A1 Dashboard: ${i}`,te("Current Focus",m),te(`Queue (${c.length})`,Re(p,!0)),te("Recent Ships",Re(g)),te("Ideas",`${d.length} pending`),le([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
|
|
1362
1362
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1363
1363
|
`),console.log("\u2550".repeat(50));let m=yo(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1364
1364
|
${g}`),console.log(`
|
|
1365
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=
|
|
1365
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=J.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1366
1366
|
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,k)=>{let w=f.priority?`[${f.priority}]`:"";console.log(` ${k+1}. ${f.description.slice(0,40)} ${w}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1367
1367
|
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let k=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${k?`(${k})`:""}`)}),console.log(`
|
|
1368
1368
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1369
1369
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1370
|
-
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:
|
|
1370
|
+
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:J.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
1371
1371
|
PRJCT COMMANDS
|
|
1372
1372
|
`),console.log("=".repeat(50));let i=B.getAllCategories(),a=B.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(`
|
|
1373
1373
|
${m?.title||u}:`),d.forEach(p=>{let g=p.params?` ${p.params}`:"";console.log(` ${p.name}${g}`),console.log(` ${p.description}`)})}),console.log(`
|
|
1374
1374
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1375
|
-
`),{success:!0,topic:"overview"}}let
|
|
1376
|
-
\u{1F4DA} HELP: /p:${
|
|
1377
|
-
`),console.log("\u2550".repeat(50)),console.log(`Description: ${
|
|
1378
|
-
Usage:`),
|
|
1379
|
-
Features:`);for(let i of
|
|
1375
|
+
`),{success:!0,topic:"overview"}}let s=B.getByName(e);if(s){if(console.log(`
|
|
1376
|
+
\u{1F4DA} HELP: /p:${s.name}
|
|
1377
|
+
`),console.log("\u2550".repeat(50)),console.log(`Description: ${s.description}`),s.params&&console.log(`Parameters: ${s.params}`),s.usage&&(console.log(`
|
|
1378
|
+
Usage:`),s.usage.claude&&console.log(` Claude: ${s.usage.claude}`),s.usage.terminal&&console.log(` Terminal: ${s.usage.terminal}`)),s.features){console.log(`
|
|
1379
|
+
Features:`);for(let i of s.features)console.log(` \u2022 ${i}`)}return console.log(`
|
|
1380
1380
|
${"\u2550".repeat(50)}
|
|
1381
|
-
`),{success:!0,topic:e,command:
|
|
1381
|
+
`),{success:!0,topic:e,command:s}}let r={start:{command:"work",hint:"Start working on a task"},begin:{command:"work",hint:"Start working on a task"},finish:{command:"done",hint:"Mark current task complete"},complete:{command:"done",hint:"Mark current task complete"},deploy:{command:"ship",hint:"Ship a feature"},release:{command:"ship",hint:"Ship a feature"},status:{command:"dash",hint:"View project dashboard"},overview:{command:"dash",hint:"View project dashboard"},queue:{command:"next",hint:"View task queue"},tasks:{command:"next",hint:"View task queue"},add:{command:"feature",hint:"Add a new feature"},new:{command:"feature",hint:"Add a new feature"},break:{command:"pause",hint:"Pause current task"},stop:{command:"pause",hint:"Pause current task"},continue:{command:"resume",hint:"Resume paused task"},back:{command:"resume",hint:"Resume paused task"}},o=e.toLowerCase();for(let[i,a]of Object.entries(r))if(o.includes(i))return console.log(`
|
|
1382
1382
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1383
1383
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1384
1384
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1385
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(
|
|
1386
|
-
`)}}return{success:!0,message:`Cleaned ${r.length} stale project(s), kept ${o.length}`,removed:r,kept:o.length}}l(Ff,"cleanupProjects");
|
|
1385
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],r=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(r);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("")}};dl();ft();Se();Et();U();import vP from"node:fs/promises";import TP from"node:path";var rn=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let s=(e||"").trim().split(/\s+/),r=s[0]||"task",o=s.slice(1).join(" "),i=await $.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=A.getGlobalProjectPath(a),u=await F.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await si.execute(r,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${y(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(s){return{success:!1,message:`Context error: ${y(s)}`}}}async loadRepoAnalysis(e){try{let t=TP.join(e,"analysis","repo-analysis.json"),s=await vP.readFile(t,"utf-8"),r=JSON.parse(s);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return C(t),null}}},t1=new rn;Zo();ot();Se();Hs();ne();Ls();rs();U();ot();import Kl from"node:fs";import Nf from"node:path";async function bi(n){let e=await $.getProjectId(n),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let r=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(r>500){let o=r-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(bi,"cleanupMemory");async function vi(n){let e=await $.getProjectId(n);if(!e)return;let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let r=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",r)}}l(vi,"cleanupMemoryInternal");async function Xl(n={},e=process.cwd()){try{if(n.memory===!0||n.type==="memory"){h.spin("cleaning memory...");let a=await bi(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let s=await $.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let r=[],i=N.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;N.run(s,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),r.push(`Memory: ${a} old entries removed`)}else r.push("Memory: No cleanup needed");try{let a=await st.cleanup(s);a.removed>0?r.push(`Ideas: ${a.removed} old archived ideas removed`):r.push("Ideas: No cleanup needed")}catch(a){r.push(`Ideas: Error - ${y(a)}`)}try{let c=(await Oe.getActiveTasks(s)).filter(u=>u.completed).length;c>0?r.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):r.push("Queue: No completed tasks")}catch(a){r.push(`Queue: Error - ${y(a)}`)}return await vi(e),await yt.log(e,"cleanup_performed",{items:r.length,timestamp:J.getTimestamp()}),h.done(`${r.length} items cleaned`),{success:!0,cleaned:r}}catch(t){return h.fail(y(t)),{success:!1,error:y(t)}}}l(Xl,"cleanup");var PP=[/^qa-/,/^nonexistent-/,/^test-/];async function Ff(n){let e=A.getGlobalBasePath(),t=Nf.join(e,"projects");if(!Kl.existsSync(t))return{success:!0,message:"No projects directory found"};let s=Kl.readdirSync(t,{withFileTypes:!0}),r=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=Nf.join(t,a);if(!PP.some(d=>d.test(a))){o.push(a);continue}if(n.dryRun){r.push(a);continue}try{N.close(a),Kl.rmSync(c,{recursive:!0,force:!0}),r.push(a)}catch{o.push(a)}}if(n.md){let i=[`## ${n.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${r.length} |`,`| Kept | ${o.length} |`];return r.length>0&&i.push("","### Removed",...r.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
|
|
1386
|
+
`)}}return{success:!0,message:`Cleaned ${r.length} stale project(s), kept ${o.length}`,removed:r,kept:o.length}}l(Ff,"cleanupProjects");Hs();U();ot();import Lf from"node:path";async function Yl(n=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return h.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=n||"system";h.spin(`designing ${s}...`);let i=await $.getProjectId(t),a=Lf.join(A.getGlobalProjectPath(i),"planning","designs");await Ee.ensureDir(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
|
|
1387
1387
|
|
|
1388
1388
|
*Use templates/design/architecture.md for full design*
|
|
1389
1389
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1398,14 +1398,14 @@ ${"\u2550".repeat(50)}
|
|
|
1398
1398
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1399
1399
|
|
|
1400
1400
|
*Use templates/design/flow.md for full design*
|
|
1401
|
-
`;break}let u=`${
|
|
1402
|
-
`),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(
|
|
1403
|
-
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(),x.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Vf)}async logEvent(e,t){try{x.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Hf(e)}};U();ot();async function Zl(
|
|
1401
|
+
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Lf.join(a,u);return await Ee.writeFile(d,c),await yt.log(t,"design_created",{type:s,target:o,timestamp:J.getTimestamp()}),h.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}l(Yl,"design");Hs();import On from"node:path";import{exec as CP}from"node:child_process";import{promisify as EP}from"node:util";Yt();ne();var Ve={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:"*"};Ns();fs();var Ql=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=ap.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(),r={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(r),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(r);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,r)))).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,r);this.onceListeners.delete(e)}let c=this.onceListeners.get(Ve.ALL);if(c)for(let u of c)await this.executeCallback(u,r)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let r=this.listeners.get(Ve.ALL);r&&t.push(...r);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{x.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",Z(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(r=>r.type===t||r.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 Ql,Fr={sessionStarted:l(n=>it.emit(Ve.SESSION_STARTED,n),"sessionStarted"),sessionPaused:l(n=>it.emit(Ve.SESSION_PAUSED,n),"sessionPaused"),sessionResumed:l(n=>it.emit(Ve.SESSION_RESUMED,n),"sessionResumed"),sessionCompleted:l(n=>it.emit(Ve.SESSION_COMPLETED,n),"sessionCompleted"),taskCreated:l(n=>it.emit(Ve.TASK_CREATED,n),"taskCreated"),taskCompleted:l(n=>it.emit(Ve.TASK_COMPLETED,n),"taskCompleted"),featureAdded:l(n=>it.emit(Ve.FEATURE_ADDED,n),"featureAdded"),featureShipped:l(n=>it.emit(Ve.FEATURE_SHIPPED,n),"featureShipped"),ideaCaptured:l(n=>it.emit(Ve.IDEA_CAPTURED,n),"ideaCaptured"),snapshotCreated:l(n=>it.emit(Ve.SNAPSHOT_CREATED,n),"snapshotCreated"),snapshotRestored:l(n=>it.emit(Ve.SNAPSHOT_RESTORED,n),"snapshotRestored"),commitCreated:l(n=>it.emit(Ve.COMMIT_CREATED,n),"commitCreated"),pushCompleted:l(n=>it.emit(Ve.PUSH_COMPLETED,n),"pushCompleted"),projectInitialized:l(n=>it.emit(Ve.PROJECT_INITIALIZED,n),"projectInitialized"),projectSynced:l(n=>it.emit(Ve.PROJECT_SYNCED,n),"projectSynced"),analysisCompleted:l(n=>it.emit(Ve.ANALYSIS_COMPLETED,n),"analysisCompleted")};ft();ne();U();Tt();var Uf=he;function Ti(n){let e=0,t=null;for(let s of n.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&&n.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}l(Ti,"calculateDuration");function Hf(n){if(n<60)return`${n}s`;if(n<3600)return`${Math.round(n/60)}m`;let e=Math.floor(n/3600),t=Math.round(n%3600/60);return t===0?`${e}h`:`${e}h ${t}m`}l(Hf,"formatDuration");var Gf=EP(CP);function Vf(n){return{id:n.id,projectId:n.project_id,task:n.task,status:n.status,startedAt:n.started_at,pausedAt:n.paused_at,completedAt:n.completed_at,duration:n.duration,metrics:JSON.parse(n.metrics),timeline:JSON.parse(n.timeline)}}l(Vf,"rowToSession");var Pi=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 $.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");x.getDb(this.projectId),this.initialized=!0}generateId(){return Uf()}async getCurrent(){this.initialized||await this.initialize();let e=x.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?Vf(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(),r={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(r),await this.logEvent("session_started",{sessionId:r.id,task:e}),await Fr.sessionStarted({sessionId:r.id,task:e,projectId:this.projectId}),r}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 Fr.sessionResumed({sessionId:t.id,task:t.task,projectId:this.projectId}),t}async pause(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to pause.");if(e.status==="paused")return e;let t=new Date().toISOString();return e.status="paused",e.pausedAt=t,e.duration=Ti(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Fr.sessionPaused({sessionId:e.id,task:e.task,duration:e.duration,projectId:this.projectId}),e}async complete(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to complete.");let t=new Date().toISOString();return e.status="completed",e.completedAt=t,e.duration=Ti(e),e.metrics=await this.calculateMetrics(e),e.timeline.push({type:"complete",at:t}),this.saveSession(e),await this.logEvent("session_completed",{sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics}),await Fr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return Ti(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:r}=await Gf(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(r.trim(),10)||0;let{stdout:o}=await Gf(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
|
|
1402
|
+
`),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){C(s)||console.error(`Metrics calculation warning: ${y(s)}`)}return t}saveSession(e){x.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
1403
|
+
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(),x.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Vf)}async logEvent(e,t){try{x.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Hf(e)}};U();ot();async function Zl(n=process.cwd()){try{if(!await $.getProjectId(n))return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let s=await new Pi(n).getCurrent(),r=s?{task:s.task,startedAt:s.startedAt}:null;if(!r||!r.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1404
1404
|
Found abandoned session:
|
|
1405
|
-
`),console.log(` Task: ${r.task}`),r.startedAt){let o=
|
|
1405
|
+
`),console.log(` Task: ${r.task}`),r.startedAt){let o=J.calculateDuration(new Date(r.startedAt));console.log(` Started: ${o} ago`)}return r.context&&console.log(` Context: ${r.context.slice(0,100)}...`),console.log(`
|
|
1406
1406
|
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
|
|
1407
|
-
`),{success:!0,session:r}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Zl,"recover");async function eu(
|
|
1408
|
-
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:
|
|
1407
|
+
`),{success:!0,session:r}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(Zl,"recover");async function eu(n=process.cwd()){try{h.spin("creating undo point...");let e=await $.getProjectId(n);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=On.join(A.getGlobalProjectPath(e),"snapshots");await Ee.ensureDir(t);let{execSync:s}=await import("node:child_process");try{if(!s("git status --porcelain",{cwd:n,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s(`git stash push -m "${i}"`,{cwd:n,encoding:"utf-8"});let a=On.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await Ee.readFile(a);c=JSON.parse(u)}catch(u){if(!C(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await Ee.writeFile(a,JSON.stringify(c,null,2)),await yt.log(n,"undo_performed",{snapshotId:i,timestamp:J.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(r){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(r)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(eu,"undo");async function tu(n=process.cwd()){try{h.spin("restoring changes...");let e=await $.getProjectId(n);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=On.join(A.getGlobalProjectPath(e),"snapshots"),s=On.join(t,"history.json"),r;try{let i=await Ee.readFile(s);r=JSON.parse(i)}catch(i){if(C(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(r.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:n,encoding:"utf-8"}).trim();return i?i.split(`
|
|
1408
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:n,encoding:"utf-8"}),r.snapshots.pop(),r.current=Math.max(0,r.current-1),await Ee.writeFile(s,JSON.stringify(r,null,2)),await yt.log(n,"redo_performed",{timestamp:J.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(i)}}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(tu,"redo");async function su(n=process.cwd()){try{let e=await $.getProjectId(n);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=On.join(A.getGlobalProjectPath(e),"snapshots"),s=On.join(t,"history.json"),r;try{let o=await Ee.readFile(s);r=JSON.parse(o)}catch(o){if(C(o)||o instanceof SyntaxError)return console.log(`
|
|
1409
1409
|
SNAPSHOT HISTORY
|
|
1410
1410
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1411
1411
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1413,18 +1413,18 @@ ${"\u2550".repeat(50)}
|
|
|
1413
1413
|
`),console.log("=".repeat(50)),r.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1414
1414
|
`)):(r.snapshots.forEach((o,i)=>{let a=i===r.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${r.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
|
|
1415
1415
|
`)),console.log(`${"=".repeat(50)}
|
|
1416
|
-
`),{success:!0,snapshots:r.snapshots,current:r.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(
|
|
1417
|
-
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};import Ie from"chalk";
|
|
1416
|
+
`),{success:!0,snapshots:r.snapshots,current:r.current}}catch(e){return h.fail(y(e)),{success:!1,error:y(e)}}}l(su,"history");var _n=class extends ve{static{l(this,"MaintenanceCommands")}_cleanupMemory=bi;_cleanupMemoryInternal=vi;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?Xl(e,t):s}async cleanupProjects(e={}){return Ff(e)}async design(e=null,t={},s=process.cwd()){let r=await this.ensureProjectInit(s);return r.success?Yl(e,t,s):r}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Zl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?eu(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?tu(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?su(e):t}async enrich(e=null,t=process.cwd(),s={}){let r=await this.ensureProjectInit(t);if(!r.success)return r;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 jn(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(`
|
|
1417
|
+
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};import Ie from"chalk";ne();var xP=BigInt(300*1e9),nu=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>xP&&this.marks.delete(t)}recordTiming(e,t,s,r){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:r})}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(),r=[{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 r)N.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){N.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){N.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return N.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 r=this.getMetrics(e,s),o={period:`${t}d`},i=r.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=r.filter(p=>"metric"in p&&p.metric==="heap_used"),c=r.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,w)=>k+w,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,w)=>k+w,0)/f.length):0}}let u=r.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=r.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=r.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,w)=>k+w,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},AP=new nu,Wf=AP;U();ot();var vs={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function Ci(n,e,t){return t==="below"?n<=e?Ie.green("\u2713"):Ie.yellow("\u26A0"):n>=e?Ie.green("\u2713"):Ie.yellow("\u26A0")}l(Ci,"statusIcon");var Nn=class extends ve{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Wf.getReport(r,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1418
1418
|
${Ie.dim("No performance data yet.")}`),console.log(`${Ie.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1419
1419
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1420
|
-
${Ie.cyan("Performance Report")} ${Ie.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Ci(i.startup.avg,
|
|
1421
|
-
${Ie.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ie.bold(`${u.avg}ms`)} ${Ie.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(
|
|
1420
|
+
${Ie.cyan("Performance Report")} ${Ie.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Ci(i.startup.avg,vs.startup.max,"below");console.log(` Startup: avg ${Ie.bold(`${i.startup.avg}ms`)} ${Ie.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${Ie.dim(`target: <${vs.startup.max}ms`)}`)}if(i.memory){let c=Ci(i.memory.peakHeapMB,vs.heapMB.max,"below");console.log(` Memory: avg ${Ie.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${Ie.dim(`target: <${vs.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Ci(i.contextCorrectness.rate,vs.contextRate.min,"above");console.log(` Context: ${Ie.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${Ie.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${Ie.dim(`target: ${vs.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Ci(i.subtaskHandoff.rate,vs.handoffRate.min,"above");console.log(` Handoff: ${Ie.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${Ie.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${Ie.dim(`target: ${vs.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1421
|
+
${Ie.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${Ie.bold(`${u.avg}ms`)} ${Ie.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}};ki();Qt();Se();fr();U();We();import lu from"node:fs/promises";import IP from"node:path";import de from"chalk";import ou from"node:fs/promises";import Jf from"node:os";import iu from"node:path";nr();import Bf from"node:fs";import Ei from"node:path";function RP(n){if(Rs()){let{Database:r}=vt("bun:sqlite");return new r(n,{create:!0})}let e=vt("better-sqlite3"),t=new e(n),s=t.exec.bind(t);return t.run=r=>s(r),t}l(RP,"openDatabase");var ru=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Ei.resolve(e):Ei.join(vt("node:os").homedir(),".prjct-cli");this.dbPath=Ei.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Ei.dirname(this.dbPath);Bf.existsSync(e)||Bf.mkdirSync(e,{recursive:!0});let t=RP(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(`
|
|
1422
1422
|
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
1423
1423
|
version INTEGER PRIMARY KEY,
|
|
1424
1424
|
name TEXT NOT NULL,
|
|
1425
1425
|
applied_at TEXT NOT NULL
|
|
1426
1426
|
)
|
|
1427
|
-
`);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(r=>r.version)),
|
|
1427
|
+
`);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(r=>r.version)),s=[{version:1,name:"mcp-health-table",up:l(r=>{r.run(`
|
|
1428
1428
|
CREATE TABLE mcp_health (
|
|
1429
1429
|
provider TEXT PRIMARY KEY,
|
|
1430
1430
|
status TEXT NOT NULL,
|
|
@@ -1435,12 +1435,12 @@ ${Ie.cyan("Performance Report")} ${Ie.dim(`(last ${o} days)`)}`),console.log("\u
|
|
|
1435
1435
|
oauth_valid INTEGER NOT NULL DEFAULT 0,
|
|
1436
1436
|
updated_at TEXT NOT NULL
|
|
1437
1437
|
)
|
|
1438
|
-
`)},"up")}];for(let r of
|
|
1438
|
+
`)},"up")}];for(let r of s)t.has(r.version)||(r.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(r.version,r.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(),r=new Date().toISOString();s.prepare(`
|
|
1439
1439
|
INSERT OR REPLACE INTO mcp_health
|
|
1440
1440
|
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
1441
1441
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
1442
|
-
`).run(e,t.status,r,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,r)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},
|
|
1443
|
-
`),!r&&!
|
|
1442
|
+
`).run(e,t.status,r,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,r)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},jP=new ru;U();var xi="mcp-remote@0.1.38",au={linear:{command:"npx",args:["-y",xi,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",xi,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},TU={linear:`npx -y ${xi} https://mcp.linear.app/mcp`,jira:`npx -y ${xi} https://mcp.atlassian.com/v1/mcp`};function as(){return process.env.PRJCT_TEST_MODE==="1"?iu.join(Jf.tmpdir(),"prjct-context7-test","mcp.json"):iu.join(Jf.homedir(),".claude","mcp.json")}l(as,"getClaudeMcpConfigPath");async function zf(n=as()){try{let e=await ou.readFile(n,"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 ${n}: ${y(e)}`)}}l(zf,"readMcpConfig");async function DP(n,e=as()){await ou.mkdir(iu.dirname(e),{recursive:!0}),await ou.writeFile(e,JSON.stringify(n,null,2),"utf-8")}l(DP,"writeMcpConfig");async function cu(n,e,t=as()){let s=await zf(t),r={...s.mcpServers||{}},o=r[n];r[n]=e,s.mcpServers=r;let i=JSON.stringify(o)!==JSON.stringify(e);return await DP(s,t),{path:t,changed:i}}l(cu,"upsertMcpServer");async function Lr(n,e=as()){return!!(await zf(e)).mcpServers?.[n]}l(Lr,"hasMcpServer");Pt();ot();var Fn=class extends ve{static{l(this,"SetupCommands")}async start(){let e=await Ae.checkInstallation(),t=(Be(),lt(ct)),s=await t.detectCodex(),r=e.providerDetected,o=r?await t.getActiveProvider():null,i=r?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
|
|
1443
|
+
`),!r&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1444
1444
|
|
|
1445
1445
|
Please install one first:
|
|
1446
1446
|
- Claude Code: https://docs.anthropic.com/claude-code
|
|
@@ -1448,17 +1448,17 @@ Please install one first:
|
|
|
1448
1448
|
- OpenAI Codex: https://github.com/openai/codex`};if(r){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Ae.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
|
|
1449
1449
|
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1450
1450
|
${A.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
1451
|
-
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(
|
|
1451
|
+
\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(()=>(Io(),nc));await a();let u=await c({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(a)}`)}return await this.setupMcpServers(),console.log(`
|
|
1452
1452
|
\u{1F389} Setup complete!`),console.log(`
|
|
1453
1453
|
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...
|
|
1454
1454
|
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ae.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ae.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1455
1455
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1456
1456
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
|
|
1457
|
-
\u{1F4DD} Installing global configuration...`);let
|
|
1458
|
-
\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(()=>(Io(),
|
|
1457
|
+
\u{1F4DD} Installing global configuration...`);let s=await Ae.installGlobalConfig(),r=s.path?A.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${r}`):s.action==="updated"?console.log(`\u2705 Updated ${r}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${r}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(Be(),lt(ct)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
|
|
1458
|
+
\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(()=>(Io(),nc));await c();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(c){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(c)}`)}return await this.setupMcpServers(),console.log(`
|
|
1459
1459
|
\u{1F389} Setup complete!
|
|
1460
1460
|
`),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
|
|
1461
|
-
\u{1F50C} Configuring MCP servers...`);try{await
|
|
1461
|
+
\u{1F50C} Configuring MCP servers...`);try{await ns.install();let e=await ns.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 Lr("linear",e)?console.log("\u2705 Linear MCP already configured"):(await cu("linear",au.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 Lr("jira",e)?console.log("\u2705 Jira MCP already configured"):(await cu("jira",au.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=IP.join(e,"prjct-statusline.sh"),r=`#!/bin/bash
|
|
1462
1462
|
# prjct Status Line for Claude Code
|
|
1463
1463
|
# Shows version update notifications and current task
|
|
1464
1464
|
|
|
@@ -1514,45 +1514,45 @@ fi
|
|
|
1514
1514
|
|
|
1515
1515
|
# Default: show prjct branding
|
|
1516
1516
|
echo "\u26A1 prjct"
|
|
1517
|
-
`;await lu.writeFile(
|
|
1517
|
+
`;await lu.writeFile(s,r,{mode:493});let o={};if(await j(t))try{o=JSON.parse(await lu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:s},await lu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(de.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(de.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(de.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(de.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(de.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(de.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(de.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(` ${de.bold.cyan("prjct")}${de.magenta("/")}${de.green("cli")} ${de.dim.white(`v${xe} installed`)}`),console.log(""),console.log(` ${de.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${de.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${de.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(de.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(de.bold.cyan("\u{1F680} Quick Start")),console.log(de.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(` ${de.bold("1.")} Initialize your project:`),console.log(` ${de.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${de.bold("2.")} Start your first task:`),console.log(` ${de.green('prjct task "build auth"')}`),console.log(""),console.log(` ${de.bold("3.")} Ship & celebrate:`),console.log(` ${de.green('prjct ship "user login"')}`),console.log(""),console.log(de.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(` ${de.dim("Documentation:")} ${de.cyan("https://prjct.app")}`),console.log(` ${de.dim("Report issues:")} ${de.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(de.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};lr();fe();We();import qf from"node:path";var $P=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],MP=`# Changelog
|
|
1518
1518
|
|
|
1519
1519
|
All notable changes to this project will be documented in this file.
|
|
1520
1520
|
|
|
1521
1521
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
1522
1522
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
1523
|
-
`,Ai=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let
|
|
1524
|
-
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),
|
|
1523
|
+
`,Ai=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of $P){let r=qf.join(this.projectPath,s);if(await j(r)){let o=await et(r),i=this.detectFormat(o);return{filePath:r,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=qf.join(this.projectPath,e);return await Ht(t,`${MP}
|
|
1524
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await et(t.filePath),r=e.date||ln(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,r):o=this.insertMarkdownEntry(s,e,r),await Ht(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 r=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+r}
|
|
1525
1525
|
${a}`}return`${e.trimEnd()}
|
|
1526
1526
|
|
|
1527
|
-
${r}`}insertMarkdownEntry(e,t,
|
|
1527
|
+
${r}`}insertMarkdownEntry(e,t,s){let r=this.formatMarkdownEntry(t,s),o=e.indexOf(`
|
|
1528
1528
|
`);if(o!==-1){let i=e.slice(0,o+1),a=e.slice(o+1);return`${i}
|
|
1529
1529
|
${r}
|
|
1530
1530
|
${a}`}return`${r}
|
|
1531
1531
|
|
|
1532
|
-
${e}`}formatKeepAChangelogEntry(e,t){let
|
|
1533
|
-
`)}formatMarkdownEntry(e,t){let
|
|
1534
|
-
`)}};Fc();We();import{exec as OP}from"node:child_process";import
|
|
1535
|
-
`);for(let
|
|
1532
|
+
${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){s.push(`### ${r}`);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(`
|
|
1533
|
+
`)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){s.push(`### ${r}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1534
|
+
`)}};Fc();We();import{exec as OP}from"node:child_process";import Ln from"node:path";import{promisify as _P}from"node:util";var Kf=_P(OP),Ri=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=Ln.join(this.projectPath,"package.json"),t=await Ut(e,null);return t?.version?{current:t.version,next:Un(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Ln.join(this.projectPath,"Cargo.toml"),t=await et(e,"");if(!t)return null;let s=NP(t);return s?{current:s,next:Un(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Ln.join(this.projectPath,"pyproject.toml"),t=await et(e,"");if(!t)return null;let s=FP(t);return s?{current:s,next:Un(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Xt(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Ln.join(this.projectPath,e[0]),s=await et(t,"");if(!s)return null;let r=LP(s);return r?{current:r,next:Un(r),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Ln.join(this.projectPath,e),s=await et(t,"");if(!s)return null;let r=s.trim();return Xf(r)?{current:r,next:Un(r),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await Kf("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
1535
|
+
`);for(let s of t){let r=s.trim().replace(/^v/,"");if(Xf(r))return{current:r,next:Un(r),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Ln.join(this.projectPath,"VERSION");return await Ht(e,`0.1.0
|
|
1536
1536
|
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Kf(`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 Ht(e.file,`${e.next}
|
|
1537
|
-
`);break}}async writeJsonVersion(e,t){let
|
|
1538
|
-
${bt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:
|
|
1537
|
+
`);break}}async writeJsonVersion(e,t){let s=await Ut(e,{});s&&(s.version=t,await xs(e,s))}async writeTomlVersion(e,t){let s=await et(e,"");if(!s)return;let r=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Ht(e,r)}async writeXmlVersion(e,t){let s=await et(e,"");if(!s)return;let r=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Ht(e,r)}};function Xf(n){return/^\d+\.\d+\.\d+/.test(n)}l(Xf,"isSemver");function Un(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return n;let[,t,s,r]=e;return`${t}.${s}.${Number(r)+1}`}l(Un,"bumpPatch");function NP(n){let e=n.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(NP,"parseTomlVersion");function FP(n){let e=n.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=n.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(FP,"parsePyprojectVersion");function LP(n){return n.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(LP,"parseCsprojVersion");Pn();Et();U();En();xn();hi();U();import{exec as UP}from"node:child_process";import{promisify as HP}from"node:util";import bt from"chalk";var uu=HP(UP);async function Ft(n,e,t,s={}){let r={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return r;let i=De.getRulesForCommand(n,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(`
|
|
1538
|
+
${bt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let f=Date.now()-g,k=f>1e3?`${(f/1e3).toFixed(1)}s`:`${f}ms`;console.log(`${bt.green("\u2713")} ${bt.dim(`gate passed (${k})`)}`)}catch(g){return console.log(`${bt.red("\u2717")} gate failed: ${p}`),r.gatesFailed.push(p),r.success=!1,r.output+=`Gate failed: ${p}
|
|
1539
1539
|
${y(g)}
|
|
1540
1540
|
`,r}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
|
|
1541
1541
|
${bt.dim(`[instruction] ${t}-${e}: ${p}`)}`),r.instructions.push(m.action)}let u=i.filter(m=>m.type==="hook");for(let m of u){console.log(`
|
|
1542
|
-
${bt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:
|
|
1542
|
+
${bt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${bt.green("\u2713")} ${bt.dim(`(${f})`)}`)}catch(p){console.log(`${bt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),r.hooksFailed.push(m.description||m.action),r.output+=`Hook failed: ${m.action}
|
|
1543
1543
|
${y(p)}
|
|
1544
1544
|
`}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
|
|
1545
|
-
${bt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:
|
|
1545
|
+
${bt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await uu(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,f=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${bt.green("\u2713")} ${bt.dim(`step passed (${f})`)}`),r.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${bt.red("\u2717")} step failed: ${m.action}`),r.gatesFailed.push(m.description||m.action),r.success=!1,r.output+=`Step failed: ${m.action}
|
|
1546
1546
|
${y(p)}
|
|
1547
|
-
`,r}}return r}l(Ft,"executeWorkflowRules");ot();var
|
|
1547
|
+
`,r}}return r}l(Ft,"executeWorkflowRules");ot();var Hn=class extends ve{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await F.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await F.completeTask(o)),i||(i="current work");let c=await Ft(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||h.step(1,4,"Bumping version...");let d=await new Ri(t).bump();s.md||h.step(2,4,"Updating changelog..."),await new Ai(t).addFeature(d,i),s.md||h.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.success){let w=await this._gitPush(t);g=w.success?"pushed":w.message}await ht.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:J.getTimestamp()}),await tt.learnDecision(o,"commit_footer","prjct","ship"),await tt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let f=await Ft(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),k=[...c.instructions,...f.instructions];try{s.md||h.step(4,4,"Updating AI context..."),await Ws.sync(t),s.md||h.done("\u2713 AI context updated")}catch(w){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(w))}if(s.md){let w=zo("ship"),E=L(we(`Shipped: ${i}`,`Version: ${d}`),te("Results",Re([`Version: ${d}`,`Commit: ${p.success?"created":p.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),k.length>0?te("Agent Instructions",Re(k)):null,le(w.map(T=>({label:T.desc,command:T.cmd}))));console.log(E)}else h.done(`v${d} shipped`),kt("ship");return{success:!0,feature:i,version:d}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async _createShipCommit(e,t){try{await Qe.get("Bash")("git add .");let s=`feat: ${e}
|
|
1548
1548
|
|
|
1549
|
-
Generated with [p/](https://www.prjct.app/)`;return await Qe.get("Bash")(`git commit -m "${
|
|
1550
|
-
`)),{success:
|
|
1549
|
+
Generated with [p/](https://www.prjct.app/)`;return await Qe.get("Bash")(`git commit -m "${s.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(s){return C(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Qe.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return C(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};Qt();tc();Se();Dl();uc();U();zs();Pt();ot();import{execSync as Hr}from"node:child_process";import zP from"node:fs/promises";import qP from"node:path";import Vn from"chalk";function nh(){try{return!!Hr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(nh,"isHomebrewInstall");function rh(){try{let e=Hr("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(rh,"getCurrentVersion");var Wn=class extends ve{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,r=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(r||h.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),r||h.stop(),r||h.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),r||h.stop(),r||h.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),r||h.stop(),!s){try{await Ro.updateVersion(xe)}catch{}try{await new mi().writeCache({lastCheck:0,latestVersion:""})}catch{}}return r?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return r||h.stop(),h.fail(y(i)),{success:!1,error:y(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=rh();if(e)return nh()?(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(nh()){try{Hr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Hr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Hr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=rh();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(r){t.success=!1,t.errors.push(y(r))}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 r=0,o=0;for(let i of s)if(!e)try{let a=await $o(i),c=await Mo(i);if(r+=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`];r>0&&i.push(`${r} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config");else{try{let r=new ms,o=await r.installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`),await r.cleanupLegacyCommands()&&t.details.push("Removed legacy p/ subdirectory")}catch(r){t.errors.push(`Commands: ${y(r)}`)}try{await new ms().installGlobalConfig(),t.details.push("Global config reinstalled")}catch(r){t.errors.push(`Global config: ${y(r)}`)}}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:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(sh(),th));await s()?(await r()||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,r=[...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?Vn.green("\u2713"):c?Vn.red("\u2717"):Vn.yellow("\u26A0");console.log(` ${u} ${Vn.bold(i)}`);for(let d of a.details)console.log(` ${Vn.dim(d)}`);for(let d of a.errors)console.log(` ${Vn.yellow("\u26A0")} ${d}`)}return console.log(""),t?h.done("Dry run complete \u2014 no changes made"):s?h.done("System updated"):h.warn(`Updated with ${r.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,r=[];r.push(t?"# Update (Dry Run)":"# System Update"),r.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?"\u2705":c?"\u274C":"\u26A0\uFE0F";r.push(`## ${u} ${i}`);for(let d of a.details)r.push(`- ${d}`);for(let d of a.errors)r.push(`- \u26A0\uFE0F ${d}`);r.push("")}return t||r.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(r.join(`
|
|
1550
|
+
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=qP.join(A.getGlobalBasePath(),"projects");try{return(await zP.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};Qc();Ar();import $e from"chalk";Ar();Zt();var pu=class extends ze{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:dg,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}},oh=new pu;U();Dn();ot();var Bn=class extends ve{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let r=await $.getProjectId(t);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await pt.getAll(r);if(i.length===0)return console.log(`
|
|
1551
1551
|
${$e.dim("No velocity data yet.")}`),console.log(`${$e.dim("Complete tasks with estimates to build velocity history.")}
|
|
1552
1552
|
`),{success:!0,message:"No data"};let a=Yo(i,o);await oh.saveMetrics(r,a),console.log(`
|
|
1553
1553
|
${$e.cyan("Sprint Velocity")} ${$e.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?$e.green:m.estimationAccuracy>=60?$e.yellow:$e.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${$e.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?$e.green("\u2191"):a.velocityTrend==="declining"?$e.red("\u2193"):$e.dim("\u2192");if(console.log(` Average: ${$e.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${$e.bold(`${a.estimationAccuracy}%`)} ${$e.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1554
1554
|
${$e.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${$e.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${$e.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${$e.green("\u2713")} ${m.category} tasks estimated within ${$e.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=mg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1555
|
-
${$e.dim("Projection:")}`),console.log(` Backlog: ${$e.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${$e.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(
|
|
1555
|
+
${$e.dim("Projection:")}`),console.log(` Backlog: ${$e.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${$e.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async loadVelocityConfig(e){try{let s=await $.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...ks,...s.velocity}}catch{}return ks}};Al();bl();import oC from"node:fs/promises";import iC from"node:path";Dn();var ah=[1,2,3,5,8,13,21],ch={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}},lh=l(n=>ah.includes(n),"isValidPoint"),on=l(n=>ch[n],"pointsToMinutes"),ih=l(n=>{if(n<60)return`${n}m`;let e=Math.floor(n/60),t=n%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),uh=l(n=>{let e=on(n);return`${ih(e.min)}\u2013${ih(e.max)}`},"pointsToTimeRange"),dh=l(async(n,e)=>{let s=(await pt.getAll(n)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+XP(c.actualDuration),0)/s.length;return{points:KP(o),basedOn:s.length}},"suggestFromHistory"),KP=l(n=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of ah){let r=Math.abs(ch[s].typical-n);r<t&&(t=r,e=s)}return e},"findClosestPoint"),XP=l(n=>{let e=0,t=n.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=n.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),e},"parseDuration");Se();U();import Di from"node:fs/promises";import YP from"node:os";import Ii from"node:path";var mu=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ii.join(YP.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Di.mkdir(this.commandsPath,{recursive:!0});let s=Ii.join(this.commandsPath,`${e}.md`),r=this.buildTemplateContent(e,t);return await Di.writeFile(s,r,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:y(s)}}}async deleteWorkflowTemplate(e){try{let t=Ii.join(this.commandsPath,`${e}.md`);return await Di.unlink(t),{success:!0}}catch(t){return C(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){try{let t=Ii.join(this.commandsPath,`${e}.md`);return await Di.access(t),!0}catch{return!1}}buildTemplateContent(e,t){return`---
|
|
1556
1556
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1557
1557
|
---
|
|
1558
1558
|
|
|
@@ -1588,47 +1588,47 @@ Suggest relevant actions based on the workflow results:
|
|
|
1588
1588
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1589
1589
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1590
1590
|
- Run again: \`p. ${e}\`
|
|
1591
|
-
`}},gu=new mu;Tt();fr();Nl();function QP(
|
|
1592
|
-
`)}generateResumeHint(e,t){let
|
|
1593
|
-
`).filter(
|
|
1594
|
-
VALUES (?, ?, ?, ?)`,t,JSON.stringify(
|
|
1591
|
+
`}},gu=new mu;Tt();fr();Nl();function QP(n){switch(n){case"low":return 2;case"medium":return 5;case"high":return 8}}l(QP,"complexityToPoints");async function ZP(n,e){let t=In.detectTaskType(e),s=await dh(n,t);if(s){let a=on(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let r=In.estimateComplexity(e),o=QP(r.level),i=on(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(ZP,"estimateTaskForStart");var fu=ZP;Se();ne();fe();import{exec as eC}from"node:child_process";import{promisify as tC}from"node:util";var ph=tC(eC),Jn="session-snapshot",sC=30,hu=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let r=await this.getGitBranch(t),o=await this.getModifiedFiles(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:r,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:v(),resumeHint:c};return x.setDoc(e,Jn,u),u}getSnapshot(e){try{return x.getDoc(e,Jn)}catch{return null}}clearSnapshot(e){try{x.deleteDoc(e,Jn)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let s of e)try{if(!x.exists(s))continue;let r=x.getDoc(s,Jn);r&&t.push(r)}catch{}return t.sort((s,r)=>new Date(r.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=sC){let t=await A.listProjects(),s=Date.now()-e*24*60*60*1e3,r=0;for(let o of t)try{if(!x.exists(o))continue;let i=x.getDoc(o,Jn);i&&new Date(i.timestamp).getTime()<s&&(x.deleteDoc(o,Jn),r++)}catch{}return r}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${Kt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&s.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let r=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${r}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${Kt(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
|
|
1592
|
+
`)}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 ${Kt(t*1e3)} of work`),s.join(" ")}async getGitBranch(e){try{let{stdout:t}=await ph("git branch --show-current",{cwd:e});return t.trim()||void 0}catch{return}}async getModifiedFiles(e){try{let{stdout:t}=await ph("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:e});return t.trim().split(`
|
|
1593
|
+
`).filter(s=>s.length>0).slice(0,20)}catch{return[]}}},Ts=new hu;yn();ne();var yu=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,r){x.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
|
|
1594
|
+
VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(r),new Date().toISOString())}completeFeedback(e,t,s){let r=x.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!r)return;let o=new Set(JSON.parse(r.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;x.run(e,`UPDATE context_feedback
|
|
1595
1595
|
SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
|
|
1596
|
-
WHERE id = ?`,JSON.stringify(
|
|
1596
|
+
WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),r.id)}getFeedback(e,t){let s=x.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 r=x.query(e,`SELECT * FROM context_feedback
|
|
1597
1597
|
WHERE actual_files IS NOT NULL
|
|
1598
|
-
ORDER BY id DESC LIMIT 50`);if(r.length===0)return
|
|
1598
|
+
ORDER BY id DESC LIMIT 50`);if(r.length===0)return s;let o=new Set(t),i=new Map;for(let c of r){let u=JSON.parse(c.keywords),d=new Set(u),m=[...o].filter(w=>d.has(w)).length,p=new Set([...o,...d]).size,g=p>0?m/p:0;if(g===0)continue;let f=new Set(JSON.parse(c.suggested_files)),k=new Set(JSON.parse(c.actual_files));for(let w of k){let E=i.get(w)??0;i.set(w,E+g)}for(let w of f)if(!k.has(w)){let E=i.get(w)??0;i.set(w,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}},Gr=new yu;Ll();rs();Et();hi();Zo();U();En();xn();Gl();Dn();ot();Se();U();fe();ne();import nC from"node:crypto";import $i from"node:fs/promises";import mh from"node:path";var zn="1.0.0";function rC(){return{version:zn,lastUpdated:"",checksums:{}}}l(rC,"getDefaultChecksums");var wu=class{static{l(this,"IndexStorage")}getIndexPath(e){return mh.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await $i.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==zn?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 rC()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await $i.readFile(e);return nC.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let r=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in r?r[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(r))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:zn,lastUpdated:v(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{x.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await $i.readdir(t);await Promise.all(s.map(r=>$i.unlink(mh.join(t,r))))}catch(s){if(!C(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!==zn?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===zn)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!==zn?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),r=new Map;if(!s)return r;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&r.set(i.path,i.categories);return r}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let r=x.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setIndexMeta(e,t,s){let r=x.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},gh=new wu;function Mi(n,e,t,s){if(n.length===0)return[];let r=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=n.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&&r.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(Mi,"rankPatterns");function fh(n){let e=new Set;return n.filter(t=>{let s=t.toLowerCase().replace(/[`*_()]/g,"").trim();return e.has(s)?!1:(e.add(s),!0)})}l(fh,"deduplicateDecisions");function hh(n,e){let t=n.toLowerCase(),s=new Set;if(e)try{let r=gh.readDomainsSync(e);if(r?.domains)for(let o of r.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(hh,"detectDomainsFromTask");function ku(n,e){if(!n)return null;let t=n.patterns,s=n.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let r=Mi(t,n,e,5),o=new Set;return`### Pattern Briefing (for this task)
|
|
1599
1599
|
|
|
1600
|
-
${r.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(f=>f.length>2),p;if(Array.isArray(
|
|
1600
|
+
${r.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(f=>f.length>2),p;if(Array.isArray(s))for(let f=0;f<s.length;f++){if(o.has(f))continue;let k=`${s[f].issue} ${s[f].suggestion}`.toLowerCase();if(m.some(w=>k.includes(w))){p=s[f],o.add(f);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return p&&g.push(` - VIOLATION: ${p.issue} \u2014 ${p.suggestion}`),g.join(`
|
|
1601
1601
|
`)}).join(`
|
|
1602
1602
|
|
|
1603
|
-
`)}`}l(ku,"buildPatternBriefing");function Su(
|
|
1604
|
-
`)}l(Su,"buildContextContract");var aC=[{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}],
|
|
1605
|
-
${Le.map(([qr])=>`\`${qr}\``).join(", ")}`)}let Br=hh(c,o),Ui=Hc({description:c,branch:Q,linearId:a,type:f.taskType,estimatedPoints:f.estimatedPoints,estimatedMinutes:f.estimatedMinutes,estimateSource:f.source,domains:Br}),Hi=uC(
|
|
1606
|
-
${S.join(", ")}`}let
|
|
1603
|
+
`)}`}l(ku,"buildPatternBriefing");function Su(n,e,t,s,r,o){let i=e.map(T=>T.path),a=e.slice(0,6).map(T=>`\`${T.path}\``),c=["### Context Contract",`- **Goal**: ${n}`];s&&c.push(`- **Scope**: ${s.taskType} \xB7 ~${s.estimatedPoints}pts \xB7 ~${s.estimatedMinutes}min (${s.source})`),r&&r.length>0&&c.push(`- **Domains**: ${r.join(", ")}`),c.push(`- **Key files**: ${a.length>0?a.join(", "):"Run `prjct sync` to improve file targeting"}`);let d=["All commits include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"],m=o?.rules;if(Array.isArray(m))for(let T of m)typeof T=="string"&&d.push(T);let p=t?.antiPatterns||[];if(Array.isArray(p)){let T=p.filter(O=>O.severity==="high");for(let O of T.slice(0,3))d.push(O.suggestion)}let g=t?.patterns||[],f=new Set;if(Array.isArray(g)){let T=Mi(g.filter(O=>O.source==="repo"),t,i,3);for(let O of T){let G=O.location?` (\`${O.location}\`)`:"";d.push(`${O.description}${G}`),f.add(O.name)}}let k=fh(d);c.push(""),c.push("#### Locked Decisions (NON-NEGOTIABLE)");for(let T of k)c.push(`- ${T}`);let w=Array.isArray(g)?g.filter(T=>!f.has(T.name)):[],E=w.length>0?Mi(w,t,i||[],3):[];return E.length>0&&(c.push(""),c.push("#### Task Patterns (MUST follow)"),E.forEach((T,O)=>{let G=T.location?` (\`${T.location}\`)`:"";c.push(`${O+1}. **${T.name}** \u2014 ${T.description}${G}`)})),c.join(`
|
|
1604
|
+
`)}l(Su,"buildContextContract");var aC=[{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}],qn=class extends ve{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Ft(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 ns.ensureReady()}catch(Le){return Rt("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(Le)}),{success:!1,error:y(Le)}}let f=await fu(o,c),k=await F.getCurrentTask(o);if(k)return Rt("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:k.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:k};await F.startTask(o,{id:he(),description:c,sessionId:he(),linearId:a,type:f.taskType,estimatedPoints:f.estimatedPoints,estimatedMinutes:f.estimatedMinutes});let w=A.getGlobalProjectPath(o),E=Zc(c),T;try{T=Gr.getHistoricalBoosts(o,E),T.size===0&&(T=void 0)}catch{}let G=({bug:30,chore:40,improvement:80,feature:100}[f.taskType]??80)>=80?15:10,[Q,se,S,D]=await Promise.all([cC(),qe.getActive(o).catch(()=>null),lC(w),jn(c,t,{maxFiles:G,minScore:.15,historicalBoosts:T}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),Ce=null;try{let Le=Ts.getSnapshot(o);Le&&(Ce=Ts.formatContinuityContext(Le),Ts.clearSnapshot(o))}catch{}let Cs=null;if(se?.analyzedAt){let Le=new Date(se.analyzedAt),Lt=Math.floor((Date.now()-Le.getTime())/(1e3*60*60*24));Lt>7&&(Cs=Uc("warn",`Analysis is ${Lt} days old. Run \`p. sync\` to refresh patterns and file index.`))}else se||(Cs=Uc("info","No project analysis found. Run `p. sync` for better context targeting."));let cn=null;if(T&&T.size>0){let Le=[...T.entries()].filter(([,Lt])=>Lt>.3).sort((Lt,qr)=>qr[1]-Lt[1]).slice(0,5);Le.length>0&&(cn=`### Previously Useful Files
|
|
1605
|
+
${Le.map(([qr])=>`\`${qr}\``).join(", ")}`)}let Br=hh(c,o),Ui=Hc({description:c,branch:Q,linearId:a,type:f.taskType,estimatedPoints:f.estimatedPoints,estimatedMinutes:f.estimatedMinutes,estimateSource:f.source,domains:Br}),Hi=uC(se,S),Jr=Nm(D.files.map(Le=>({path:Le.path,description:Le.reasons.join(", ")}))),_=D.files.map(Le=>Le.path),Gi=ku(se,_),zr=Su(c,D.files,se,f,Br,S),tr=le([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(Ce,Cs,Ui,zr,Hi,Jr,cn,Gi,tr));try{let Le=await F.getCurrentTask(o);Le&&Gr.recordSuggestions(o,Le.id,E,D.files.map(Lt=>Lt.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:J.getTimestamp()}),await Ft(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await di.execute("task",{task:e},t);if(!d.success)return h.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let m=await fu(o,c);await F.startTask(o,{id:he(),description:c,sessionId:he(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let p=await Sl.getAvailableAgents(t),g=d.orchestratorContext?.agents?.length||p.length;return h.done(`${e}`,{agents:g>0?g:void 0}),Er("working"),kt("task"),await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:p,orchestratorContext:d.orchestratorContext,timestamp:J.getTimestamp()}),await Ft(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,agenticMode:!0,availableAgents:p,fibonacci:{isValidPoint:lh,pointsToMinutes:on,pointsToTimeRange:uh,storeEstimate:l(async f=>{let k=on(f);return await F.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await F.getCurrentTask(o);if(!i)return s.md?Rt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?J.calculateDuration(new Date(i.startedAt)):void 0,c=Hc({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?_m(u,d):"",p=le([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(r){let o=y(r);return s.md?o.includes("Cannot run")||o.includes("working state")?Rt("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):h.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await F.getCurrentTask(r);if(!o)return t.md?Rt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await Ft(r,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let G=new Date(o.startedAt);c=J.calculateDuration(G),u=Math.round((Date.now()-G.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints,p=o.type||"feature",g=o.linearId;try{await pt.record(r,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:J.getTimestamp(),estimatedDuration:d?yh(d):"0m",actualDuration:c||"0m",variance:d?mC(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[p,g].filter(Boolean)})}catch{}let f="";if(m&&d){let G=u-d,Q=d>0?Math.round((u-d)/d*100):0,se=G>=0?"+":"";f=` | est: ${m}pt (${yh(d)}) \u2192 ${se}${Q}%`}let k=[],w=null,E=null;try{if(k=await pC(e,o.startedAt),k.length>0){Gr.completeFeedback(r,o.id,k);let G=Gr.getFeedback(r,o.id);G&&(w=G.precision,E=G.recall)}}catch{}await F.completeTask(r,t.feedback);try{Ts.clearSnapshot(r)}catch{}let T=o.linearId,O=T!=null?await Lr("linear",as()).catch(()=>!1):!1;if(t.md){let G=c?` (${c})`:"",Q=null;if(k.length>0){let S=k.slice(0,20).map(D=>`\`${D}\``);Q=`### Files Modified (${k.length})
|
|
1606
|
+
${S.join(", ")}`}let se=null;if(w!==null&&E!==null){let S=Math.round(w*100),D=Math.round(E*100);se=`### Context Accuracy
|
|
1607
1607
|
| Metric | Value |
|
|
1608
1608
|
|--------|-------|
|
|
1609
1609
|
| Precision | ${S}% of suggested files were used |
|
|
1610
|
-
| Recall | ${j}% of modified files were suggested |`}console.log(L(we("Completed",`${a}${G}`),ut({Duration:c||"unknown",...f?{Variance:f.replace(" | ","")}:{}}),Q,ne,le([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let G=c?` (${c}${f})`:"";T&&O?h.done(`${a}${G} \u2192 Linear linked (update via MCP)`):h.done(`${a}${G}`),Er("completed"),kt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:z.getTimestamp()}),await Ft(r,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Oe.getActiveTasks(r);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'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(L(te("Queue",`${o.length} task${o.length!==1?"s":""}`),Re(i,!0),le([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),kt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(y(n)),{success:!1,error:y(n)}}}async pause(e="",t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return n.md?Rt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=z.calculateDuration(new Date(i.startedAt))),await F.pauseTask(o,e);try{await Pn.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(n.md)console.log(L(we("Task Paused",`**Paused:** ${i.description}`),ut({Reason:e||void 0,"Duration worked":a||void 0}),le([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Er("paused"),kt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:z.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async resume(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(i)return n.md?Rt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await F.resumeTask(o);return a?(n.md?console.log(L(we("Task Resumed",`**Resumed:** ${a.description}`),le([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Er("working"),kt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:z.getTimestamp()}),{success:!0,task:a.description}):(n.md?Rt("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async workflow(e=null,t=process.cwd(),n={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,n);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,n);case"gate":return this._workflowGate(a.args,o,n);case"instruction":return this._workflowInstruction(a.args,o,n);case"remove":return this._workflowRm(a.args,o,n);case"disable":return this._workflowDisable(a.args,o,n);case"reset":return this._workflowReset(o,n);case"init":return this._workflowInit(o,t,n);case"help":return this._workflowHelp(n);case"create":return this._workflowCreate(a.args,o,t,n);case"list":return this._workflowList(o,n);case"delete":return this._workflowDelete(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return this._workflowShow(a.args||null,o,n);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(r){return n.md?console.log(`> Error: ${y(r)}`):h.fail(y(r)),{success:!1,error:y(r)}}}_detectIntent(e){let t=e.trim();for(let{type:n,patterns:r}of aC){let o=t.match(r);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:n,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let n=t.toLowerCase();return e.filter(r=>r.action.toLowerCase().includes(n)||(r.description?.toLowerCase().includes(n)??!1)||r.command.toLowerCase().includes(n)||String(r.id)===n)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let r=t.indexOf('"',1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}if(t.startsWith("'")){let r=t.indexOf("'",1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}let n=t.match(/^(.+?)\s+(before|after)\s+/i);return n?[n[1].trim(),t.slice(n[1].length).trim()]:[t,""]}async _workflowAdd(e,t,n){let[r,o]=this._parseAction(e);if(!r||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return n.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let u=Ze.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=Ze.getAllWorkflows(t).map(f=>f.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let d=je.addRule(t,{type:"hook",command:c,position:a,action:r,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(L(we("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${r}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):h.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${r}`),{success:!0,ruleId:d}}async _workflowGate(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ze.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=Ze.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return n.md?console.log(`> ${p}`):h.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return n.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=je.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(L(we("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):h.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,n){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ze.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let f=Ze.getAllWorkflows(t).map(w=>w.name).join(", "),k=`Workflow '${o}' not found. Available: ${f}`;return n.md?console.log(`> ${k}`):h.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 n.md?console.log(`> ${g}`):h.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 n.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let p=je.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return n.md?console.log(L(we("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):h.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,n){let r=parseInt(e.trim(),10);if(Number.isNaN(r)){let i="Usage: prjct workflow rm <rule-id>";return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!je.removeRule(t,r)){let i=`Rule #${r} not found`;return n.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return n.md?console.log(L(we("Rule Removed",`Removed rule #${r}`))):h.done(`removed rule #${r}`),{success:!0}}async _workflowReset(e,t){let n=je.resetRules(e);return t.md?console.log(L(we("Rules Reset",`Removed ${n} rule${n!==1?"s":""}`))):h.done(`reset: removed ${n} rule${n!==1?"s":""}`),{success:!0,count:n}}async _workflowDisable(e,t,n){let r=e.trim(),o=parseInt(r,10);if(!Number.isNaN(o)){let c=je.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return n.md?console.log(`> ${u}`):h.warn(u),{success:!0,message:u}}return je.updateRule(t,o,{enabled:!1}),n.md?console.log(L(we("Rule Disabled",`#${o} [${c.type}] ${c.action}`),le([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):h.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=je.getAllRules(t),a=this._searchRules(i,r);if(a.length===0){let c=`No rules matching "${r}"`;return n.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return je.updateRule(t,c.id,{enabled:!1}),n.md?console.log(L(we("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):h.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(n.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(L(te("Multiple matches",`${a.length} rules match "${r}"`),Re(c),le(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${r}" \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(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",Re(["`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"])),te("Natural Language (EN/ES)",Re(['`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,n){let r=["task","done","ship","sync"],o;if(e&&r.includes(e)?o=je.getRulesForCommand(t,e):o=je.getAllRules(t),o.length===0)return n.md?console.log(L(te("Workflow Rules","No rules configured"),le([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(n.md){let i=e?[e]:r,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(dC(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(te(c,u),a.length>0?Om(a.join(`
|
|
1610
|
+
| Recall | ${D}% of modified files were suggested |`}console.log(L(we("Completed",`${a}${G}`),ut({Duration:c||"unknown",...f?{Variance:f.replace(" | ","")}:{}}),Q,se,le([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let G=c?` (${c}${f})`:"";T&&O?h.done(`${a}${G} \u2192 Linear linked (update via MCP)`):h.done(`${a}${G}`),Er("completed"),kt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:J.getTimestamp()}),await Ft(r,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return h.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 r=await $.getProjectId(e);if(!r)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Oe.getActiveTasks(r);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'}]):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(L(te("Queue",`${o.length} task${o.length!==1?"s":""}`),Re(i,!0),le([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),kt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}async pause(e="",t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(!i)return s.md?Rt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=J.calculateDuration(new Date(i.startedAt))),await F.pauseTask(o,e);try{await Ts.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}`),ut({Reason:e||void 0,"Duration worked":a||void 0}),le([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Er("paused"),kt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:J.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async resume(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await F.getCurrentTask(o);if(i)return 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}):h.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await F.resumeTask(o);return a?(s.md?console.log(L(we("Task Resumed",`**Resumed:** ${a.description}`),le([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Er("working"),kt("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'}]):h.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(r){return h.fail(y(r)),{success:!1,error:y(r)}}}async workflow(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,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(r){return s.md?console.log(`> Error: ${y(r)}`):h.fail(y(r)),{success:!1,error:y(r)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:r}of aC){let o=t.match(r);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(r=>r.action.toLowerCase().includes(s)||(r.description?.toLowerCase().includes(s)??!1)||r.command.toLowerCase().includes(s)||String(r.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let r=t.indexOf('"',1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}if(t.startsWith("'")){let r=t.indexOf("'",1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+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[r,o]=this._parseAction(e);if(!r||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return s.md?console.log(`> ${m}`):h.warn(m),{success:!1,error:m}}let u=Ze.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=Ze.getAllWorkflows(t).map(f=>f.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return s.md?console.log(`> ${g}`):h.warn(g),{success:!1,error:g}}let d=De.addRule(t,{type:"hook",command:c,position:a,action:r,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 \`${r}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):h.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${r}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ze.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=Ze.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${p}`):h.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):h.warn(d),{success:!1,error:d}}let u=De.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(we("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):h.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ze.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let f=Ze.getAllWorkflows(t).map(w=>w.name).join(", "),k=`Workflow '${o}' not found. Available: ${f}`;return s.md?console.log(`> ${k}`):h.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}`):h.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}`):h.warn(g),{success:!1,error:g}}let p=De.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(we("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):h.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,s){let r=parseInt(e.trim(),10);if(Number.isNaN(r)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}if(!De.removeRule(t,r)){let i=`Rule #${r} not found`;return s.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return s.md?console.log(L(we("Rule Removed",`Removed rule #${r}`))):h.done(`removed rule #${r}`),{success:!0}}async _workflowReset(e,t){let s=De.resetRules(e);return t.md?console.log(L(we("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):h.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let r=e.trim(),o=parseInt(r,10);if(!Number.isNaN(o)){let c=De.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!0,message:u}}return De.updateRule(t,o,{enabled:!1}),s.md?console.log(L(we("Rule Disabled",`#${o} [${c.type}] ${c.action}`),le([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):h.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=De.getAllRules(t),a=this._searchRules(i,r);if(a.length===0){let c=`No rules matching "${r}"`;return s.md?console.log(`> ${c}`):h.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return De.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(we("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):h.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(te("Multiple matches",`${a.length} rules match "${r}"`),Re(c),le(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{h.warn(`${a.length} rules match "${r}" \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(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",Re(["`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"])),te("Natural Language (EN/ES)",Re(['`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 r=["task","done","ship","sync"],o;if(e&&r.includes(e)?o=De.getRulesForCommand(t,e):o=De.getAllRules(t),o.length===0)return s.md?console.log(L(te("Workflow Rules","No rules configured"),le([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(h.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:r,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(dC(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(te(c,u),a.length>0?Om(a.join(`
|
|
1611
1611
|
|
|
1612
|
-
`),""):null,le([{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,
|
|
1613
|
-
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return r.md?console.log(`> Error: ${d}`):h.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let
|
|
1612
|
+
`),""):null,le([{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 r=De.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(r.length>0){let u=`Ship workflow already has ${r.length} rule${r.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let o=await yi(t),i=0,a=[],c=De.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=De.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=De.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(s.md)console.log(L(we("Workflow Initialized",`Added ${a.length} default ship rules`),Re(a),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{h.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,r){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!Ze.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ze.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}if(Ze.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return r.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}try{let u=Ze.createWorkflow(t,{name:i,description:a}),d=await gu.generateWorkflowTemplate(i,a);if(!d.success){Ze.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return r.md?console.log(`> Error: ${m}`):h.fail(m),{success:!1,error:m}}return r.md?console.log(L(we("Workflow Created",`Created workflow: ${i}`),te("Description",a),te("Template",`Installed at ${d.path}`),le([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(h.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
|
|
1613
|
+
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return r.md?console.log(`> Error: ${d}`):h.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=Ze.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):h.warn(i),{success:!0,workflows:[]}}let r=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(r.length>0){let a=r.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Built-in Workflows",a.join(`
|
|
1614
1614
|
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Custom Workflows",a.join(`
|
|
1615
|
-
`)))}console.log(L(...i,le([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(h.done(`${
|
|
1615
|
+
`)))}console.log(L(...i,le([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(h.done(`${s.length} workflow${s.length!==1?"s":""}`),r.length>0){console.log(`
|
|
1616
1616
|
Built-in:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1617
|
-
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:
|
|
1617
|
+
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let r=e.trim();if(!r){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):h.warn(o),{success:!1,error:o}}try{if(!Ze.deleteWorkflow(t,r)){let i=`Workflow '${r}' not found`;return s.md?console.log(`> ${i}`):h.warn(i),{success:!1,error:i}}return await gu.deleteWorkflowTemplate(r),s.md?console.log(L(we("Workflow Deleted",`Deleted workflow: ${r}`))):h.done(`deleted workflow: ${r}`),{success:!0}}catch(o){let i=y(o);return s.md?console.log(`> Error: ${i}`):h.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let a=Ze.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):h.warn(u),{success:!1,error:u}}let c=await Ft(o,i,"before",{projectPath:t});if(!c.success){if(s.md)Rt("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(h.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Ft(o,i,"after",{projectPath:t}),s.md?console.log(L(we(`Workflow: ${i}`,a.description||""),le([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):h.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(r){let o=y(r);return s.md?console.log(`> Error: ${o}`):h.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let r=await Ts.cleanup();return t.md?console.log(we("Cleanup",`Removed ${r} stale snapshot${r!==1?"s":""}`)):h.done(`cleaned ${r} stale snapshot${r!==1?"s":""}`),{success:!0,cleaned:r}}let s=await Ts.listAllSnapshots();if(s.length===0)return t.md?Rt("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):h.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let r=s.map(o=>{let i=J.formatDuration(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(L(te("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),Re(r),le([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{h.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let r of s){let o=J.formatDuration(Date.now()-new Date(r.timestamp).getTime()),i=r.projectName||r.projectId.slice(0,8);console.log(` [${r.taskStatus}] ${i} \u2014 ${r.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return h.fail(y(s)),{success:!1,error:y(s)}}}};function yh(n){if(n<60)return`${n}m`;let e=Math.floor(n/60),t=n%60;return t>0?`${e}h ${t}m`:`${e}h`}l(yh,"formatMinutesToDuration");async function cC(){try{let{execSync:n}=await import("node:child_process");return n("git branch --show-current",{encoding:"utf-8"}).trim()||void 0}catch{return}}l(cC,"getGitBranch");async function lC(n){try{let e=iC.join(n,"analysis","repo-analysis.json"),t=await oC.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return C(e),null}}l(lC,"loadRepoAnalysis");function uC(n,e){if(!n&&!e)return null;let t=e?.ecosystem||null,s=n?.languages?.join(", ")||null,r=n?.frameworks?.join(", ")||null,o=n?.packageManager||null,i=n?.sourceDir||e?.structure?.srcDir||null,a=n?.testDir||e?.structure?.testDir||null,c={};if(t&&(c.Ecosystem=t),s&&(c.Languages=s),r&&(c.Frameworks=r),o&&(c["Package manager"]=o),i||a){let g=[];i&&g.push(`${i}`),a&&g.push(`Tests: ${a}`),c.Source=g.join(" | ")}let u=ut(c),d=e?.commands,m=null;if(d&&Object.keys(d).length>0){let g=Object.entries(d).map(([f,k])=>`${f.charAt(0).toUpperCase()+f.slice(1)}: \`${k}\``);m=`### Commands
|
|
1618
1618
|
${Re(g)}`}return[u?`### Project
|
|
1619
1619
|
${u}`:null,m].filter(Boolean).join(`
|
|
1620
1620
|
|
|
1621
|
-
`)||null}l(uC,"buildProjectContext");function dC(
|
|
1622
|
-
`)}l(dC,"buildFlowDiagram");async function pC(
|
|
1623
|
-
`)){let a=i.trim();a&&
|
|
1624
|
-
`)){let a=i.trim();a&&
|
|
1625
|
-
`)){let a=i.trim();a&&n.add(a)}}catch{}return[...n]}l(pC,"getFilesModifiedSinceTaskStart");function mC(s){let e=s>=0?"+":"-",t=Math.abs(s);if(t>=60){let n=Math.floor(t/60),r=t%60;return r>0?`${e}${n}h ${r}m`:`${e}${n}h`}return`${e}${t}m`}l(mC,"formatVariance");var Ks=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new qs,this.planning=new ts,this.shipping=new Hs,this.analytics=new Ms,this.performanceCmds=new Ns,this.maintenance=new _s,this.analysis=new rs,this.setupCmds=new Fs,this.updateCmds=new Ws,this.velocityCmds=new Bs,this.contextCmds=new os,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return this.workflow.workflow(e,t,n)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),n={}){return this.maintenance.enrich(e,t,n)}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(),n={}){return this.analysis.saveLlmAnalysis(e,t,n)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},yV=new Ks;Si();var wh={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}},kh=[{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:"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:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0},{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"]}];ki();Qt();Se();U();We();ot();import{execSync as Oi}from"node:child_process";import mt from"node:fs/promises";import gC from"node:os";import ln from"node:path";import fC from"node:readline";import Te from"chalk";var _i="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Vr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function bh(s){let e=0;try{let t=await mt.readdir(s,{withFileTypes:!0});for(let n of t){let r=ln.join(s,n.name);if(n.isDirectory())e+=await bh(r);else try{let o=await mt.stat(r);e+=o.size}catch{}}}catch{}return e}l(bh,"getDirectorySize");function Sh(s){if(s===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(s)/Math.log(1024));return`${(s/1024**t).toFixed(1)} ${e[t]}`}l(Sh,"formatSize");async function hC(s){try{return(await mt.readdir(s,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(hC,"countDirectoryItems");function yC(){let s={homebrew:!1,npm:!1};try{Oi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(s.homebrew=!0,s.homebrewFormula="prjct-cli")}catch{}try{Oi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(s.npm=!0)}catch{}return s}l(yC,"detectInstallation");async function wC(){let s=[],e=Yu(),t=A.getGlobalBasePath(),n=await D(t),r=n?await hC(ln.join(t,"projects")):0,o=n?await bh(t):0;s.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:n});let i=ln.join(e.claude.config,"CLAUDE.md"),a=await D(i),c=!1;if(a)try{let T=await mt.readFile(i,"utf-8");c=T.includes(_i)&&T.includes(Vr)}catch{}s.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await D(u);s.push({path:u,type:"file",description:"Claude router",exists:d});let m=ln.join(e.claude.config,"prjct-statusline.sh"),p=await D(m);s.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,f=await D(g);s.push({path:g,type:"file",description:"Gemini router",exists:f});let k=ln.join(e.gemini.config,"GEMINI.md"),w=await D(k),C=!1;if(w)try{let T=await mt.readFile(k,"utf-8");C=T.includes(_i)&&T.includes(Vr)}catch{}return w&&C&&s.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),s}l(wC,"gatherUninstallItems");async function kC(s){try{let e=await mt.readFile(s,"utf-8");if(!e.includes(_i)||!e.includes(Vr))return!1;let t=e.indexOf(_i),n=e.indexOf(Vr)+Vr.length,r=e.substring(0,t)+e.substring(n);return r=r.replace(/\n{3,}/g,`
|
|
1626
|
-
|
|
1627
|
-
`).trim(),!r||r.trim().length===0?await mt.unlink(
|
|
1628
|
-
`,"utf-8"),!0}catch{return!1}}l(kC,"removePrjctSection");async function SC(){let
|
|
1629
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.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 r){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Te.dim("(section only)"):c.size&&(d=Te.dim(`(${Sh(c.size)})`)),console.log(` ${Te.cyan(u.padEnd(35))} ${d}`),console.log(` ${Te.dim(c.description)}`),console.log("")}if(
|
|
1630
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Te.blue("Removing prjct..."));let{deleted:i,errors:a}=await bC(t,n
|
|
1631
|
-
${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(TC,"uninstall");var Ni=class extends ve{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return TC(e,t)}};var as=new qs,Fi=new ts,PC=new Hs,Th=new Ms,CC=new Ns,Cn=new _s,Xs=new rs,Ph=new Fs,EC=new os,xC=new Bs,AC=new Ni,RC=new Ws;function DC(){for(let[s,e]of Object.entries(wh))B.registerCategory(s,e)}l(DC,"registerCategories");function jC(){if(B.has("work"))return;DC();let s=l(e=>kh.find(t=>t.name===e),"getMeta");B.registerMethod("task",as,"now",s("task")),B.registerMethod("done",as,"done",s("done")),B.registerMethod("next",as,"next",s("next")),B.registerMethod("pause",as,"pause",s("pause")),B.registerMethod("resume",as,"resume",s("resume")),B.registerMethod("workflow",as,"workflow",s("workflow")),B.registerMethod("sessions",as,"sessions",s("sessions")),B.registerMethod("init",Fi,"init",s("init")),B.registerMethod("bug",Fi,"bug",s("bug")),B.registerMethod("idea",Fi,"idea",s("idea")),B.registerMethod("spec",Fi,"spec",s("spec")),B.registerMethod("ship",PC,"ship",s("ship")),B.registerMethod("dash",Th,"dash",s("dash")),B.registerMethod("help",Th,"help",s("help")),B.registerMethod("perf",CC,"perf",s("perf")),B.registerMethod("velocity",xC,"velocity",s("velocity")),B.registerMethod("cleanup",Cn,"cleanup",s("cleanup")),B.registerMethod("cleanup-projects",Cn,"cleanupProjects",s("cleanup-projects")),B.registerMethod("design",Cn,"design",s("design")),B.registerMethod("recover",Cn,"recover",s("recover")),B.registerMethod("undo",Cn,"undo",s("undo")),B.registerMethod("redo",Cn,"redo",s("redo")),B.registerMethod("history",Cn,"history",s("history")),B.registerMethod("enrich",Cn,"enrich",s("enrich")),B.registerMethod("analyze",Xs,"analyze",s("analyze")),B.registerMethod("sync",Xs,"sync",s("sync")),B.registerMethod("stats",Xs,"stats",s("stats")),B.registerMethod("status",Xs,"status",s("status")),B.registerMethod("seal",Xs,"seal",s("seal")),B.registerMethod("verify",Xs,"verify",s("verify")),B.registerMethod("start",Ph,"start",s("start")),B.registerMethod("setup",Ph,"setup",s("setup")),B.registerMethod("uninstall",AC,"uninstall",s("uninstall")),B.registerMethod("update",RC,"update",s("update")),B.registerMethod("context",EC,"context",s("context"))}l(jC,"registerAllCommands");jC();ft();sr();Pt();import{Hono as GC}from"hono";import{cors as VC}from"hono/cors";import{logger as WC}from"hono/logger";Se();se();Un();rn();Ps();Et();U();hn();import IC from"node:fs/promises";import $C from"node:path";import{Hono as MC}from"hono";function OC(s){return A.getGlobalProjectPath(s)}l(OC,"getProjectDataPath");function Ch(s,e){let t=new MC,n=OC(s);return t.get("/state",async r=>{let o=await F.read(s);return r.json(o)}),t.get("/queue",async r=>{let o=await Oe.read(s);return r.json(o)}),t.get("/ideas",async r=>{let o=await nt.read(s);return r.json(o)}),t.get("/roadmap",async r=>{let o=x.getDoc(s,"roadmap");return o?r.json(o):r.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async r=>{let o=await ht.read(s);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([F.read(s),Oe.read(s),nt.read(s),ht.read(s)]),u=x.getDoc(s,"roadmap");return r.json({projectId:s,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async r=>{try{let o=await r.req.json();return await F.write(s,o),r.json({success:!0})}catch(o){return r.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async r=>{let o=r.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return r.json({error:"Invalid context file"},400);try{let a=$C.join(n,"context",`${o}.md`),c=await IC.readFile(a,"utf-8");return r.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return P(a)||H.error(`Context read error: ${y(a)}`),r.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Ch,"createRoutes");Se();se();Un();rn();Ps();Et();import Ys from"node:fs/promises";import _C from"node:path";import{Hono as NC}from"hono";var FC=A.getGlobalBasePath(),Qs=_C.join(FC,"projects");function Li(s){return x.getDoc(s,"project")}l(Li,"getProjectConfig");async function bu(s){if(!s)return"";let e=new Date(s),n=new Date().getTime()-e.getTime(),r=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return r>0?`${r}h ${o}m`:`${o}m`}l(bu,"calculateDuration");function Eh(){let s=new NC;return s.get("/projects",async e=>{try{await Ys.mkdir(Qs,{recursive:!0});let n=(await Ys.readdir(Qs,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(n.map(async o=>{let i=Li(o),a=await F.read(o),c=await Oe.read(o),u=await nt.read(o),d=await ht.read(o),m=a?.currentTask,p=await bu(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 r.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:r})}catch(t){return e.json({projects:[],error:String(t)},500)}}),s.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,r,o,i,a]=await Promise.all([Promise.resolve(Li(t)),F.read(t),Oe.read(t),nt.read(t),ht.read(t)]),c=x.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await bu(r.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:r||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),s.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await F.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let r=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,completedTask:r,message:`Completed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let r=(await e.req.json().catch(()=>({}))).reason,o=await F.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:r},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await F.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await F.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let r={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:r,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,resumedTask:r,message:`Resumed: ${r.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:r}=n;if(!r)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([F.read(t),Oe.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===r);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:r,priority:o="medium",tags:i=[]}=n;if(!r)return e.json({success:!1,error:"text required"},400);let a=await nt.addIdea(t,r,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${r.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),s.get("/stats/global",async e=>{try{await Ys.mkdir(Qs,{recursive:!0});let n=(await Ys.readdir(Qs,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),r=0,o=0,i=0,a=0;for(let c of n){let u=await F.read(c),d=await Oe.read(c),m=await nt.read(c),p=await ht.read(c);u?.currentTask&&a++,r+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:r,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Ys.mkdir(Qs,{recursive:!0});let r=(await Ys.readdir(Qs,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=Li(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:r;for(let d of u){let m=await F.read(d),p=Li(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await bu(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:r.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),s}l(Eh,"createExtendedRoutes");import{streamSSE as LC}from"hono/streaming";var xh=3600*1e3,UC=300*1e3,HC=3e4;function Ah(){let s=new Map,e=null;function t(o){let i=s.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),s.delete(o))}l(t,"removeClient");function n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of s)o-new Date(a.client.connectedAt).getTime()>xh&&t(i)},UC),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function r(){e&&(clearInterval(e),e=null)}return l(r,"stopReaper"),n(),{handleConnection(o){return LC(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},HC),p=setTimeout(()=>{t(a)},xh);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),s.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 s)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return s.size},shutdown(){r();for(let o of[...s.keys()])t(o)}}}l(Ah,"createSSEManager");function Rh(s){let e=new GC,t=Ah();s.enableCors!==!1&&e.use("*",VC({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),s.enableLogging!==!1&&e.use("*",WC()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:xe,projectId:s.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let n=Ch(s.projectId,s.projectPath);e.route("/api",n);let r=Eh();e.route("/api",r),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=s.port,a=s.host||"0.0.0.0";if(Dn())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: ${s.projectId}`),console.log(` Runtime: ${Dn()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(Rh,"createServer");var Dh=3478;se();du();var zC=50,Zs=null,Wr=null,ge=null,Pe=null;async function jh(s){let e=Ne.socket(),t=Ne.pid(),n=Ne.runDir();if(Fe.mkdirSync(n,{recursive:!0}),Fe.existsSync(t)){let i=parseInt(Fe.readFileSync(t,"utf-8").trim(),10);YC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Fe.unlinkSync(t)}Fe.existsSync(e)&&Fe.unlinkSync(e),eE();let r=QC(),o=null;if(r)try{o=Fe.statSync(r).mtimeMs}catch{}if(Pe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Yf,idleTimer:null,entryPath:r,entryMtime:o},ge=new Ks,Zs=BC(i=>JC(i)),Zs.listen(e,()=>{Fe.chmodSync(e,384),Fe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),r&&console.log(` Watching: ${r}`),Ih()}),Zs.on("error",i=>{console.error("Daemon socket error:",i.message),er(1)}),!s.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=s.port||Dh;Wr=Rh({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Wr.start()}}catch{}if(process.on("SIGTERM",()=>er(0)),process.on("SIGINT",()=>er(0)),process.on("SIGHUP",()=>{ge=new Ks,console.log("Daemon reloaded (SIGHUP)")}),!s.foreground)try{process.stdin?.unref?.()}catch{}}l(jh,"startDaemon");function JC(s){let e="";s.on("data",async t=>{if(e+=t.toString(),e.length>Qf){let r={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};s.write(Gs(r)),s.destroy(),e="";return}let n;for(;(n=e.indexOf(`
|
|
1632
|
-
`))!==-1;){let r=e.slice(0,
|
|
1621
|
+
`)||null}l(uC,"buildProjectContext");function dC(n,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),s=e.filter(p=>p.type==="instruction"&&p.position==="before"),r=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,f)=>{let k=g.map(O=>` ${O.enabled?f:"o"} #${O.id} ${O.action}`),w=[p,...k],T=Math.max(...w.map(O=>O.length))+2;u.push(`+${"-".repeat(T)}+`);for(let O of w)u.push(`| ${O.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"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)),r.length>0&&(d("HOOKS (before)",r,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${n.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(`
|
|
1622
|
+
`)}l(dC,"buildFlowDiagram");async function pC(n,e){let{execSync:t}=await import("node:child_process"),s=new Set,r={cwd:n,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,r);for(let i of o.split(`
|
|
1623
|
+
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --cached --name-only",r);for(let i of o.split(`
|
|
1624
|
+
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",r);for(let i of o.split(`
|
|
1625
|
+
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(pC,"getFilesModifiedSinceTaskStart");function mC(n){let e=n>=0?"+":"-",t=Math.abs(n);if(t>=60){let s=Math.floor(t/60),r=t%60;return r>0?`${e}${s}h ${r}m`:`${e}${s}h`}return`${e}${t}m`}l(mC,"formatVariance");var Kn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new qn,this.planning=new en,this.shipping=new Hn,this.analytics=new Mn,this.performanceCmds=new Nn,this.maintenance=new _n,this.analysis=new nn,this.setupCmds=new Fn,this.updateCmds=new Wn,this.velocityCmds=new Bn,this.contextCmds=new rn,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()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},yV=new Kn;Si();var wh={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}},kh=[{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:"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:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0},{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"]}];ki();Qt();Se();U();We();ot();import{execSync as Oi}from"node:child_process";import mt from"node:fs/promises";import gC from"node:os";import cs from"node:path";import fC from"node:readline";import Te from"chalk";var _i="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Vr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function bh(n){let e=0;try{let t=await mt.readdir(n,{withFileTypes:!0});for(let s of t){let r=cs.join(n,s.name);if(s.isDirectory())e+=await bh(r);else try{let o=await mt.stat(r);e+=o.size}catch{}}}catch{}return e}l(bh,"getDirectorySize");function Sh(n){if(n===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(n)/Math.log(1024));return`${(n/1024**t).toFixed(1)} ${e[t]}`}l(Sh,"formatSize");async function hC(n){try{return(await mt.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(hC,"countDirectoryItems");function yC(){let n={homebrew:!1,npm:!1};try{Oi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(n.homebrew=!0,n.homebrewFormula="prjct-cli")}catch{}try{Oi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(n.npm=!0)}catch{}return n}l(yC,"detectInstallation");async function wC(){let n=[],e=Yu(),t=A.getGlobalBasePath(),s=await j(t),r=s?await hC(cs.join(t,"projects")):0,o=s?await bh(t):0;n.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:s});let i=cs.join(e.claude.config,"CLAUDE.md"),a=await j(i),c=!1;if(a)try{let T=await mt.readFile(i,"utf-8");c=T.includes(_i)&&T.includes(Vr)}catch{}n.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await j(u);n.push({path:u,type:"file",description:"Claude router",exists:d});let m=cs.join(e.claude.config,"prjct-statusline.sh"),p=await j(m);n.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,f=await j(g);n.push({path:g,type:"file",description:"Gemini router",exists:f});let k=cs.join(e.gemini.config,"GEMINI.md"),w=await j(k),E=!1;if(w)try{let T=await mt.readFile(k,"utf-8");E=T.includes(_i)&&T.includes(Vr)}catch{}return w&&E&&n.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),n}l(wC,"gatherUninstallItems");async function kC(n){try{let e=await mt.readFile(n,"utf-8");if(!e.includes(_i)||!e.includes(Vr))return!1;let t=e.indexOf(_i),s=e.indexOf(Vr)+Vr.length,r=e.substring(0,t)+e.substring(s);return r=r.replace(/\n{3,}/g,`
|
|
1626
|
+
|
|
1627
|
+
`).trim(),!r||r.trim().length===0?await mt.unlink(n):await mt.writeFile(n,`${r}
|
|
1628
|
+
`,"utf-8"),!0}catch{return!1}}l(kC,"removePrjctSection");async function SC(){let n=gC.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=cs.join(n,`.prjct-backup-${e}`);try{await mt.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await j(s)&&await vh(s,cs.join(t,".prjct-cli")),t}catch{return null}}l(SC,"createBackup");async function vh(n,e){await mt.mkdir(e,{recursive:!0});let t=await mt.readdir(n,{withFileTypes:!0});for(let s of t){let r=cs.join(n,s.name),o=cs.join(e,s.name);s.isDirectory()?await vh(r,o):await mt.copyFile(r,o)}}l(vh,"copyDirectory");async function bC(n,e,t){let s=[],r=[];for(let o of n)if(o.exists)try{o.type==="section"?await kC(o.path)&&s.push(o.path):o.type==="directory"?(await mt.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await mt.unlink(o.path),s.push(o.path))}catch(i){r.push(`${o.path}: ${y(i)}`)}try{await new ms().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||Oi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||Oi("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){r.push(`npm: ${y(o)}`)}}return{deleted:s,errors:r}}l(bC,"performUninstall");async function vC(n){let e=fC.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(n,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}l(vC,"promptConfirmation");async function TC(n={},e=process.cwd()){let t=await wC(),s=yC(),r=t.filter(c=>c.exists);if(r.length===0&&!s.homebrew&&!s.npm)return console.log(Te.yellow(`
|
|
1629
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.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 r){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Te.dim("(section only)"):c.size&&(d=Te.dim(`(${Sh(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: ${Sh(o)}`)),console.log("")),n.dryRun)return console.log(Te.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(n.backup){console.log(Te.blue("Creating backup..."));let c=await SC();c?(console.log(Te.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Te.yellow("Failed to create backup, continuing..."))}if(!n.force&&(console.log(Te.yellow('Type "uninstall" to confirm:')),!await vC("> ")))return console.log(Te.yellow(`
|
|
1630
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Te.blue("Removing prjct..."));let{deleted:i,errors:a}=await bC(t,s,n);if(console.log(""),i.length>0&&console.log(Te.green(`Removed ${i.length} items`)),a.length>0){console.log(Te.yellow(`
|
|
1631
|
+
${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(TC,"uninstall");var Ni=class extends ve{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return TC(e,t)}};var an=new qn,Fi=new en,PC=new Hn,Th=new Mn,CC=new Nn,Ps=new _n,Xn=new nn,Ph=new Fn,EC=new rn,xC=new Bn,AC=new Ni,RC=new Wn;function jC(){for(let[n,e]of Object.entries(wh))B.registerCategory(n,e)}l(jC,"registerCategories");function DC(){if(B.has("work"))return;jC();let n=l(e=>kh.find(t=>t.name===e),"getMeta");B.registerMethod("task",an,"now",n("task")),B.registerMethod("done",an,"done",n("done")),B.registerMethod("next",an,"next",n("next")),B.registerMethod("pause",an,"pause",n("pause")),B.registerMethod("resume",an,"resume",n("resume")),B.registerMethod("workflow",an,"workflow",n("workflow")),B.registerMethod("sessions",an,"sessions",n("sessions")),B.registerMethod("init",Fi,"init",n("init")),B.registerMethod("bug",Fi,"bug",n("bug")),B.registerMethod("idea",Fi,"idea",n("idea")),B.registerMethod("spec",Fi,"spec",n("spec")),B.registerMethod("ship",PC,"ship",n("ship")),B.registerMethod("dash",Th,"dash",n("dash")),B.registerMethod("help",Th,"help",n("help")),B.registerMethod("perf",CC,"perf",n("perf")),B.registerMethod("velocity",xC,"velocity",n("velocity")),B.registerMethod("cleanup",Ps,"cleanup",n("cleanup")),B.registerMethod("cleanup-projects",Ps,"cleanupProjects",n("cleanup-projects")),B.registerMethod("design",Ps,"design",n("design")),B.registerMethod("recover",Ps,"recover",n("recover")),B.registerMethod("undo",Ps,"undo",n("undo")),B.registerMethod("redo",Ps,"redo",n("redo")),B.registerMethod("history",Ps,"history",n("history")),B.registerMethod("enrich",Ps,"enrich",n("enrich")),B.registerMethod("analyze",Xn,"analyze",n("analyze")),B.registerMethod("sync",Xn,"sync",n("sync")),B.registerMethod("stats",Xn,"stats",n("stats")),B.registerMethod("status",Xn,"status",n("status")),B.registerMethod("seal",Xn,"seal",n("seal")),B.registerMethod("verify",Xn,"verify",n("verify")),B.registerMethod("start",Ph,"start",n("start")),B.registerMethod("setup",Ph,"setup",n("setup")),B.registerMethod("uninstall",AC,"uninstall",n("uninstall")),B.registerMethod("update",RC,"update",n("update")),B.registerMethod("context",EC,"context",n("context"))}l(DC,"registerAllCommands");DC();ft();nr();Pt();import{Hono as GC}from"hono";import{cors as VC}from"hono/cors";import{logger as WC}from"hono/logger";Se();ne();Ls();rs();Pn();Et();U();fs();import IC from"node:fs/promises";import $C from"node:path";import{Hono as MC}from"hono";function OC(n){return A.getGlobalProjectPath(n)}l(OC,"getProjectDataPath");function Ch(n,e){let t=new MC,s=OC(n);return t.get("/state",async r=>{let o=await F.read(n);return r.json(o)}),t.get("/queue",async r=>{let o=await Oe.read(n);return r.json(o)}),t.get("/ideas",async r=>{let o=await st.read(n);return r.json(o)}),t.get("/roadmap",async r=>{let o=x.getDoc(n,"roadmap");return o?r.json(o):r.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async r=>{let o=await ht.read(n);return r.json(o)}),t.get("/dashboard",async r=>{let[o,i,a,c]=await Promise.all([F.read(n),Oe.read(n),st.read(n),ht.read(n)]),u=x.getDoc(n,"roadmap");return r.json({projectId:n,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async r=>{try{let o=await r.req.json();return await F.write(n,o),r.json({success:!0})}catch(o){return r.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async r=>{let o=r.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return r.json({error:"Invalid context file"},400);try{let a=$C.join(s,"context",`${o}.md`),c=await IC.readFile(a,"utf-8");return r.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return C(a)||H.error(`Context read error: ${y(a)}`),r.text("",200,{"Content-Type":"text/markdown"})}}),t}l(Ch,"createRoutes");Se();ne();Ls();rs();Pn();Et();import Yn from"node:fs/promises";import _C from"node:path";import{Hono as NC}from"hono";var FC=A.getGlobalBasePath(),Qn=_C.join(FC,"projects");function Li(n){return x.getDoc(n,"project")}l(Li,"getProjectConfig");async function bu(n){if(!n)return"";let e=new Date(n),s=new Date().getTime()-e.getTime(),r=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return r>0?`${r}h ${o}m`:`${o}m`}l(bu,"calculateDuration");function Eh(){let n=new NC;return n.get("/projects",async e=>{try{await Yn.mkdir(Qn,{recursive:!0});let s=(await Yn.readdir(Qn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),r=await Promise.all(s.map(async o=>{let i=Li(o),a=await F.read(o),c=await Oe.read(o),u=await st.read(o),d=await ht.read(o),m=a?.currentTask,p=await bu(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 r.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:r})}catch(t){return e.json({projects:[],error:String(t)},500)}}),n.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,r,o,i,a]=await Promise.all([Promise.resolve(Li(t)),F.read(t),Oe.read(t),st.read(t),ht.read(t)]),c=x.getDoc(t,"roadmap");r?.currentTask?.startedAt&&(r.currentTask.duration=await bu(r.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:r||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(s){return e.json({error:String(s)},500)}}),n.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await F.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let r=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,completedTask:r,message:`Completed: ${r.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let r=(await e.req.json().catch(()=>({}))).reason,o=await F.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:r},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await F.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await F.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let r={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:r,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,o),e.json({success:!0,resumedTask:r,message:`Resumed: ${r.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:r}=s;if(!r)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([F.read(t),Oe.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===r);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await F.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:r,priority:o="medium",tags:i=[]}=s;if(!r)return e.json({success:!1,error:"text required"},400);let a=await st.addIdea(t,r,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${r.slice(0,50)}...`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),n.get("/stats/global",async e=>{try{await Yn.mkdir(Qn,{recursive:!0});let s=(await Yn.readdir(Qn,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),r=0,o=0,i=0,a=0;for(let c of s){let u=await F.read(c),d=await Oe.read(c),m=await st.read(c),p=await ht.read(c);u?.currentTask&&a++,r+=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:r,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),n.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Yn.mkdir(Qn,{recursive:!0});let r=(await Yn.readdir(Qn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of r){let m=Li(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:r;for(let d of u){let m=await F.read(d),p=Li(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await bu(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:r.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),n}l(Eh,"createExtendedRoutes");import{streamSSE as LC}from"hono/streaming";var xh=3600*1e3,UC=300*1e3,HC=3e4;function Ah(){let n=new Map,e=null;function t(o){let i=n.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),n.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of n)o-new Date(a.client.connectedAt).getTime()>xh&&t(i)},UC),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function r(){e&&(clearInterval(e),e=null)}return l(r,"stopReaper"),s(),{handleConnection(o){return LC(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},HC),p=setTimeout(()=>{t(a)},xh);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),n.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 n)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return n.size},shutdown(){r();for(let o of[...n.keys()])t(o)}}}l(Ah,"createSSEManager");function Rh(n){let e=new GC,t=Ah();n.enableCors!==!1&&e.use("*",VC({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),n.enableLogging!==!1&&e.use("*",WC()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:xe,projectId:n.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=Ch(n.projectId,n.projectPath);e.route("/api",s);let r=Eh();e.route("/api",r),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=n.port,a=n.host||"0.0.0.0";if(Rs())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${n.projectId}`),console.log(` Runtime: ${Rs()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(Rh,"createServer");var jh=3478;ne();du();var JC=50,Zn=null,Wr=null,ge=null,Pe=null;async function Dh(n){let e=Ne.socket(),t=Ne.pid(),s=Ne.runDir();if(Fe.mkdirSync(s,{recursive:!0}),Fe.existsSync(t)){let i=parseInt(Fe.readFileSync(t,"utf-8").trim(),10);YC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Fe.unlinkSync(t)}Fe.existsSync(e)&&Fe.unlinkSync(e),eE();let r=QC(),o=null;if(r)try{o=Fe.statSync(r).mtimeMs}catch{}if(Pe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Yf,idleTimer:null,entryPath:r,entryMtime:o},ge=new Kn,Zn=BC(i=>zC(i)),Zn.listen(e,()=>{Fe.chmodSync(e,384),Fe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),r&&console.log(` Watching: ${r}`),Ih()}),Zn.on("error",i=>{console.error("Daemon socket error:",i.message),er(1)}),!n.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=n.port||jh;Wr=Rh({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Wr.start()}}catch{}if(process.on("SIGTERM",()=>er(0)),process.on("SIGINT",()=>er(0)),process.on("SIGHUP",()=>{ge=new Kn,console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}l(Dh,"startDaemon");function zC(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>Qf){let r={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(Gn(r)),n.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1632
|
+
`))!==-1;){let r=e.slice(0,s);if(e=e.slice(s+1),!!r.trim())try{let o=JSON.parse(r),i=await qC(o);n.write(Gn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(Gn(i))}}}),n.on("error",()=>{})}l(zC,"handleConnection");async function qC(n){if(!Pe||!ge)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Ih(),Pe.commandsServed++,Pe.lastActivity=Date.now(),Pe.commandsServed%JC===0&&N.checkpointAll(),$h()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),er(0)},200)),n.command==="daemon")return XC(n);if(n.command==="__ping")return{id:n.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await KC(n);return{id:n.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1633
1633
|
`)||o.message||void 0,stderr:t.join(`
|
|
1634
|
-
`)||o.error||void 0,result:o}}finally{console.log=
|
|
1634
|
+
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=r}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}l(qC,"handleRequest");async function KC(n){let e=n.args.join(" ")||null,t=n.options,s=t.md===!0;switch(n.command){case"sync":return ge.sync(n.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:s,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return ge.status(n.cwd,{json:t.json===!0,md:s});case"stats":return ge.stats(n.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return ge.diff(n.cwd,{json:t.json===!0,md:s});case"seal":return ge.seal(n.cwd,{json:t.json===!0});case"rollback":return ge.rollback(n.cwd,{json:t.json===!0,md:s});case"verify":return ge.verify(n.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return ge.task(e,n.cwd,{md:s});case"done":return ge.done(n.cwd,{md:s});case"next":return ge.next(n.cwd,{md:s});case"pause":return ge.pause(e||"",n.cwd,{md:s});case"resume":return ge.resume(e,n.cwd,{md:s});case"bug":return ge.bug(e||"",n.cwd,{md:s});case"idea":return ge.idea(e||"",n.cwd,{md:s});case"ship":return ge.ship(e,n.cwd,{md:s});case"dash":return ge.dash(e||"default",n.cwd,{md:s});case"workflow":return ge.workflowPrefs(e,n.cwd,{md:s});case"sessions":return ge.sessions(n.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return ge.design(e||"",t,n.cwd);case"analysis-payload":return ge.analysisPayload(n.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return ge.saveLlmAnalysis(e||"",n.cwd,{md:s});case"analysis-llm":return ge.getLlmAnalysis(n.cwd,{json:t.json===!0,md:s});case"analyze":return ge.analyze(t,n.cwd);case"cleanup":return ge.cleanup(t,n.cwd);case"cleanup-projects":return ge.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return B.execute(n.command,e,n.cwd)}}l(KC,"executeCommand");function XC(n){let e=n.args[0];if(e==="status")return{id:n.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ne.socket(),uptime:Pe?Date.now()-Pe.startedAt:0,commandsServed:Pe?.commandsServed??0,lastActivity:Pe?new Date(Pe.lastActivity).toISOString():null,registeredCommands:B.list().length,stale:$h()}};if(e==="stop"){let t={id:n.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>er(0),100),t}return{id:n.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l(XC,"handleDaemonCommand");function Ih(){Pe&&(Pe.idleTimer&&clearTimeout(Pe.idleTimer),Pe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Pe.idleTimeoutMs/1e3/60} minutes, shutting down`),er(0)},Pe.idleTimeoutMs),Pe.idleTimer.unref&&Pe.idleTimer.unref())}l(Ih,"resetIdleTimer");function er(n){console.log("Daemon shutting down..."),Pe?.idleTimer&&clearTimeout(Pe.idleTimer),Wr&&(Wr.stop(),Wr=null),Zn&&(Zn.close(),Zn=null),N.close();let e=Ne.socket(),t=Ne.pid();try{Fe.existsSync(e)&&Fe.unlinkSync(e)}catch{}try{Fe.existsSync(t)&&Fe.unlinkSync(t)}catch{}process.exit(n)}l(er,"shutdown");function YC(n){try{return process.kill(n,0),!0}catch{return!1}}l(YC,"isProcessRunning");function QC(){let n=vt("node:path"),e=__dirname;for(let r=0;r<5;r++){if(Fe.existsSync(n.join(e,"package.json"))){let o=n.join(e,"dist","daemon","entry.mjs");if(Fe.existsSync(o))return o;break}e=n.dirname(e)}let t=[n.join(__dirname,"..","daemon","entry.mjs"),n.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of t)if(Fe.existsSync(r))return r;let s=process.argv[1];return s&&Fe.existsSync(s)?s:null}l(QC,"resolveEntryPath");var ZC=1024*1024;function eE(){let n=Ne.log();try{if(Fe.statSync(n).size>ZC){let t=`${n}.1`;try{Fe.unlinkSync(t)}catch{}Fe.renameSync(n,t)}}catch{}}l(eE,"rotateLog");function $h(){if(!Pe?.entryPath||Pe.entryMtime===null)return!1;try{return Fe.statSync(Pe.entryPath).mtimeMs!==Pe.entryMtime}catch{return!1}}l($h,"isCodeStale");var vu=process.argv.slice(2),tE=parseInt(vu.find(n=>n.startsWith("--port="))?.split("=")[1]||"",10)||void 0,sE=vu.includes("--no-http"),nE=vu.includes("--foreground");Dh({port:tE,noHttp:sE,foreground:nE}).catch(n=>{console.error("Failed to start daemon:",n.message),process.exit(1)});
|