prjct-cli 1.56.2 → 1.56.10
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 +83 -0
- package/bin/prjct +13 -5
- package/dist/bin/prjct-core.mjs +306 -306
- package/dist/cli/jira.mjs +9 -9
- package/dist/cli/linear.mjs +6 -6
- package/dist/daemon/entry.mjs +255 -255
- package/dist/mcp/server.mjs +45 -45
- package/dist/templates.json +1 -1
- package/package.json +21 -19
- package/templates/tools/task.txt +1 -1
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -4,17 +4,17 @@ import { dirname as __pathDirname } from 'path';
|
|
|
4
4
|
var require = __createRequire(import.meta.url);
|
|
5
5
|
var __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
var __dirname = __pathDirname(__filename);
|
|
7
|
-
var
|
|
8
|
-
`)}function
|
|
9
|
-
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let
|
|
10
|
-
`,"utf-8")}async function
|
|
11
|
-
`)}async function
|
|
12
|
-
`);await Pt(r,t)}function Aw(r){return Ts.extname(r)}function Iw(r){return Ts.basename(r,Ts.extname(r))}var B=S(()=>{"use strict";nc();cp();W();l(yn,"walkDir");l(wn,"batchProcess");l(Ae,"readJson");l(de,"writeJson");l(_e,"readFile");l(Pt,"writeFile");l(kw,"atomicWrite");l(Sw,"appendToFile");l(oc,"appendLine");l(bw,"prependToFile");l(C,"fileExists");l(Xt,"dirExists");l(rt,"ensureDir");l(vw,"deleteFile");l(Tw,"deleteDir");l(Es,"listFiles");l(Ew,"getFileSize");l(Cw,"getFileModifiedTime");l(Pw,"copyFile");l(xw,"moveFile");l(jw,"readLines");l(Rw,"writeLines");l(Aw,"getFileExtension");l(Iw,"getFileNameWithoutExtension")});function Hs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var Bn,kn=S(()=>{"use strict";l(Hs,"isExpired");Bn=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var dp={};Se(dp,{invalidateProviderCache:()=>Ow,readProviderCache:()=>ac,writeProviderCache:()=>cc});import lp from"node:fs/promises";import Dw from"node:os";import up from"node:path";async function ac(){try{let r=await lp.readFile(ic,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Hs(e.timestamp,Mw)?null:e.detection}catch{return null}}async function cc(r){let e={timestamp:new Date().toISOString(),detection:r};await de(ic,e)}async function Ow(){try{await lp.unlink(ic)}catch{}}var $w,ic,Mw,lc=S(()=>{"use strict";kn();B();$w=up.join(Dw.homedir(),".prjct-cli","cache"),ic=up.join($w,"providers.json"),Mw=600*1e3;l(ac,"readProviderCache");l(cc,"writeProviderCache");l(Ow,"invalidateProviderCache")});var Lt={};Se(Lt,{AntigravityProvider:()=>dc,ClaudeProvider:()=>Ko,CodexProvider:()=>pc,CursorProvider:()=>mp,GeminiProvider:()=>uc,Providers:()=>ze,WindsurfProvider:()=>gp,detectAllProviders:()=>Cs,detectAntigravity:()=>Vn,detectCodex:()=>Sn,detectCursorProject:()=>yp,detectProvider:()=>Xo,detectWindsurfProject:()=>wp,getActiveProvider:()=>Fw,getCapabilities:()=>Nw,getCommandsDir:()=>Vw,getGlobalContextPath:()=>Gw,getGlobalSettingsPath:()=>qw,getProjectCommandsPath:()=>Jw,getProviderBranding:()=>Yo,getSkillsPath:()=>Bw,hasProviderConfig:()=>Uw,needsCursorRouterRegeneration:()=>Hw,needsWindsurfRouterRegeneration:()=>Ww,selectProvider:()=>mc,validateCliVersion:()=>hp});import Ws from"node:os";import ot from"node:path";function Nw(r,e){return{..._w[r],...e}}async function fp(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Lw(r){try{let{stdout:e}=await F(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Xo(r){let e=ze[r];if(!e.cliCommand)return{installed:!1};let t=await fp(e.cliCommand);if(!t)return{installed:!1};let s=await Lw(e.cliCommand),n=hp(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function hp(r,e){let t=ze[r];return!t.minCliVersion||!e?null:Qd(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 Cs(r=!1){if(!r){let i=await ac();if(i)return i}let[e,t,s]=await Promise.all([Xo("claude"),Xo("gemini"),Sn()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await cc(o).catch(()=>{}),o}async function Fw(r){if(r&&ze[r])return ze[r];let e=await Cs();return e.claude.installed&&!e.gemini.installed?Ko:e.gemini.installed&&!e.claude.installed?uc:Ko}async function Uw(r){let e=ze[r];return e.configDir?C(e.configDir):!1}function Yo(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function yp(r){let e=ot.join(r,".cursor"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Hw(r){let e=await yp(r);return e.detected&&!e.routerInstalled}async function wp(r){let e=ot.join(r,".windsurf"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Ww(r){let e=await wp(r);return e.detected&&!e.routerInstalled}async function Vn(){let r=dc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=ot.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Sn(){let r=pc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await fp("codex"),t=ot.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Gw(r){let e=ze[r];return e.configDir?ot.join(e.configDir,e.contextFile):null}function qw(r){let e=ze[r];return!e.configDir||!e.settingsFile?null:ot.join(e.configDir,e.settingsFile)}function Bw(r){return ze[r].skillsDir}function Vw(r){return ze[r].commandsDir}function Jw(r,e){let t=ze[r];return ot.join(e,t.commandsDir)}async function mc(){let r=await Cs(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var _w,Ko,uc,dc,mp,gp,pc,ze,lt=S(()=>{"use strict";ro();zo();Je();B();lc();_w={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(Nw,"getCapabilities");Ko={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ot.join(Ws.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ot.join(Ws.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"},uc={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ot.join(Ws.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ot.join(Ws.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"},dc={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ot.join(Ws.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ot.join(Ws.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"},mp={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"},gp={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"},pc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ot.join(Ws.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ot.join(Ws.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"},ze={claude:Ko,gemini:uc,cursor:mp,antigravity:dc,windsurf:gp,codex:pc};l(fp,"whichCommand");l(Lw,"getCliVersion");l(Xo,"detectProvider");l(hp,"validateCliVersion");l(Cs,"detectAllProviders");l(Fw,"getActiveProvider");l(Uw,"hasProviderConfig");l(Yo,"getProviderBranding");l(yp,"detectCursorProject");l(Hw,"needsCursorRouterRegeneration");l(wp,"detectWindsurfProject");l(Ww,"needsWindsurfRouterRegeneration");l(Vn,"detectAntigravity");l(Sn,"detectCodex");l(Gw,"getGlobalContextPath");l(qw,"getGlobalSettingsPath");l(Bw,"getSkillsPath");l(Vw,"getCommandsDir");l(Jw,"getProjectCommandsPath");l(mc,"selectProvider")});import{z as De}from"zod";function zw(r){return r instanceof Jn}function ye(r){return zw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var zn,vx,Tx,Ex,Cx,Px,xx,Jn,Qo,Zo,oo,Ps=S(()=>{"use strict";zn={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},vx=zn.create("FileError",De.object({path:De.string(),operation:De.enum(["read","write","delete","create","copy"]),reason:De.string().optional()})),Tx=zn.create("ValidationError",De.object({field:De.string(),expected:De.string(),received:De.string().optional(),message:De.string().optional()})),Ex=zn.create("PermissionError",De.object({action:De.string(),resource:De.string(),reason:De.string().optional()})),Cx=zn.create("TaskError",De.object({taskId:De.string().optional(),operation:De.enum(["create","update","complete","pause","resume","delete"]),reason:De.string()})),Px=zn.create("SessionError",De.object({sessionId:De.string().optional(),reason:De.string()})),xx=zn.create("SyncError",De.object({projectId:De.string().optional(),operation:De.enum(["push","pull","auth","connect"]),reason:De.string()})),Jn=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)}},Qo=class r extends Jn{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Zo=class r extends Jn{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},oo=class r extends Jn{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(zw,"isPrjctError");l(ye,"getErrorMessage")});import{formatDistanceToNowStrict as Ix}from"date-fns";function kp(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function Sp(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function v(){return new Date().toISOString()}function Gs(r){let e=new Date;return e.setDate(e.getDate()-r),e}function xt(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function xs(r,e=new Date){let t=e.getTime()-r.getTime();return xt(t)}function Kn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function Ft(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var X=S(()=>{"use strict";l(kp,"formatDate");l(Sp,"getYearMonthDay");l(v,"getTimestamp");l(Gs,"getDaysAgo");l(xt,"formatDuration");l(xs,"calculateDuration");l(Kn,"parseVarianceMinutes");l(Ft,"parseDurationMinutes")});var Xn={};Se(Xn,{PACKAGE_ROOT:()=>jt,VERSION:()=>we,compareVersions:()=>bp,getPackageInfo:()=>Kw,getPackageRoot:()=>hc,getVersion:()=>bn,isCompatible:()=>Xw,needsMigration:()=>Yw});import gc from"node:fs";import ti from"node:path";function hc(){if(io)return io;let r=__dirname;for(let e=0;e<5;e++){let t=ti.join(r,"package.json");if(gc.existsSync(t))try{if(JSON.parse(gc.readFileSync(t,"utf-8")).name==="prjct-cli")return io=r,r}catch{}r=ti.dirname(r)}return io=ti.join(__dirname,"..","..",".."),io}function bn(){if(ei)return ei;try{let r=ti.join(hc(),"package.json"),e=JSON.parse(gc.readFileSync(r,"utf-8"));return ei=e.version,fc=e,ei}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Kw(){return fc||bn(),fc}function bp(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Xw(r){let e=bn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function Yw(r,e=null){let t=e||bn();return bp(r,t)<0}var ei,fc,io,we,jt,ut=S(()=>{"use strict";W();ei=null,fc=null,io=null;l(hc,"getPackageRoot");l(bn,"getVersion");l(Kw,"getPackageInfo");l(bp,"compareVersions");l(Xw,"isCompatible");l(Yw,"needsMigration");we=bn(),jt=hc()});async function si(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Qw(){let r=await si("gh api user --jq .login");return r.success&&r.output||(r=await si("git config --global github.user"),r.success&&r.output)?r.output:null}async function Zw(){let r=await si("git config user.name");return r.success&&r.output?r.output:null}async function ek(){let r=await si("git config user.email");return r.success&&r.output?r.output:null}async function Yn(){let[r,e,t]=await Promise.all([Qw(),Zw(),ek()]);return{github:r,email:t,name:e||r||"Unknown"}}var ni=S(()=>{"use strict";Je();l(si,"execCommand");l(Qw,"detectGitHubUsername");l(Zw,"detectGitName");l(ek,"detectGitEmail");l(Yn,"detect")});import tk from"node:crypto";import ps from"node:fs/promises";import wc from"node:os";import z from"node:path";import{globSync as sk}from"glob";var kc,nk,A,ve=S(()=>{"use strict";X();B();kc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(wc.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return tk.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Xt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await rt(this.globalBaseDir),await rt(this.globalProjectsDir),await rt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await rt(z.join(t,n));return await rt(z.join(t,"planning","tasks")),await rt(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Sp(t);return z.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await rt(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await ps.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await ps.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let m=z.join(c,d.name),p=await ps.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:z.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 z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await ps.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 Xt(t)}getDisplayPath(e){let t=wc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(lt(),Ct(Lt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),Ct(Lt)).getActiveProvider();return(lt(),Ct(Lt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(wc.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=z.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await C(n))try{let o=await ps.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await ps.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
13
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=z.join(e,"package.json"),i=await
|
|
14
|
-
`)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await F("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=
|
|
7
|
+
var Zy=Object.create;var Zr=Object.defineProperty;var ew=Object.getOwnPropertyDescriptor;var tw=Object.getOwnPropertyNames;var sw=Object.getPrototypeOf,nw=Object.prototype.hasOwnProperty;var l=(r,e)=>Zr(r,"name",{value:e,configurable:!0}),Bt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var S=(r,e)=>()=>(r&&(e=r(r=0)),e);var rw=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ye=(r,e)=>{for(var t in e)Zr(r,t,{get:e[t],enumerable:!0})},Ld=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of tw(e))!nw.call(r,n)&&n!==t&&Zr(r,n,{get:()=>e[n],enumerable:!(s=ew(e,n))||s.enumerable});return r};var ow=(r,e,t)=>(t=r!=null?Zy(sw(r)):{},Ld(e||!r||!r.__esModule?Zr(t,"default",{value:r,enumerable:!0}):t,r)),bt=r=>Ld(Zr({},"__esModule",{value:!0}),r);var Fd={};ye(Fd,{DAEMON_PATHS:()=>Le,IDLE_TIMEOUT_MS:()=>Ka,MAX_BUFFER_SIZE:()=>Ya,decodeMessage:()=>iw,encodeMessage:()=>pn});function pn(r){return Buffer.from(`${JSON.stringify(r)}
|
|
8
|
+
`)}function iw(r){return JSON.parse(r.trim())}var Le,Ka,Ya,Wo=S(()=>{"use strict";Le={runDir:l(()=>`${process.env.HOME||Bt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Le.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Le.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Le.runDir()}/daemon.log`,"log")},Ka=30*60*1e3,Ya=1024*1024;l(pn,"encodeMessage");l(iw,"decodeMessage")});function Ud(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function gn(){return Ud()==="bun"}function Qa(){if(Ud()==="bun")return!0;try{let{execSync:r}=Bt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var eo=S(()=>{"use strict";l(Ud,"detectRuntime");l(gn,"isBun");l(Qa,"isBunAvailable")});var vs={};ye(vs,{executeViaDaemon:()=>lw,forceKillDaemon:()=>dw,getDaemonStatus:()=>cw,isDaemonRunning:()=>Hd,sendRequest:()=>to,spawnDaemon:()=>Wd,stopDaemon:()=>uw});import Go from"node:crypto";import ct from"node:fs";import{connect as aw}from"node:net";async function Hd(){let r=Le.socket();if(!ct.existsSync(r))return!1;try{return(await to({id:Go.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{ct.unlinkSync(r)}catch{}return!1}}async function cw(){let r=Le.socket(),e=Le.pid();if(!ct.existsSync(r))return{running:!1};try{let t=await to({id:Go.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return ct.existsSync(e)?{running:!1,pid:parseInt(ct.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function to(r){return new Promise((e,t)=>{let s=Le.socket(),n=aw(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(pn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
9
|
+
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function lw(r,e,t,s,n,o=!0){let i=Le.socket();if(!ct.existsSync(i))return o&&Wd().catch(()=>{}),null;try{return await to({id:Go.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function uw(){try{return(await to({id:Go.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function dw(){let r=Le.pid(),e=Le.socket(),t=!1;if(ct.existsSync(r)){let s=parseInt(ct.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{ct.existsSync(r)&&ct.unlinkSync(r)}catch{}try{ct.existsSync(e)&&ct.unlinkSync(e)}catch{}return t}async function Wd(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(ct.existsSync(t))o=t,i="bun";else if(ct.existsSync(s))o=s,i=Qa()?"bun":"node";else if(ct.existsSync(n))o=n,i=Qa()?"bun":"node";else return!1;let a=Le.runDir();ct.mkdirSync(a,{recursive:!0});let c=Le.log(),u=ct.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),ct.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await Hd())return!0;return!1}var Ts=S(()=>{"use strict";eo();Wo();l(Hd,"isDaemonRunning");l(cw,"getDaemonStatus");l(to,"sendRequest");l(lw,"executeViaDaemon");l(uw,"stopDaemon");l(dw,"forceKillDaemon");l(Wd,"spawnDaemon")});var so=S(()=>{"use strict"});import{z as ds}from"zod";function Gd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var UP,HP,WP,Gn,GP,qo=S(()=>{"use strict";UP=ds.enum(["opus","sonnet","haiku"]),HP=ds.enum(["2.5-pro","2.5-flash","2.0-flash"]),WP=ds.string().min(1),Gn=ds.object({provider:ds.string(),model:ds.string(),cliVersion:ds.string().optional(),recordedAt:ds.string()}),GP=ds.object({preferredModel:ds.string().optional(),lastAnalysisModel:Gn.optional()});l(Gd,"compareSemver")});var Bd={};ye(Bd,{execAsync:()=>F,execFileAsync:()=>fn});import{exec as mw,execFile as pw}from"node:child_process";import{promisify as qd}from"node:util";var F,fn,Je=S(()=>{"use strict";F=qd(mw),fn=qd(pw)});var Vd,Jd,zd,Za=S(()=>{"use strict";Vd=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),Jd=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],zd=/(?:import|from)\s+['"]([^'"]+)['"]/g});function gw(r){return r instanceof Error&&"code"in r}function O(r){return gw(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function ec(r){if(r instanceof Error)return r.stack}var W=S(()=>{"use strict";l(gw,"isNodeError");l(O,"isNotFoundError");l(k,"getErrorMessage");l(ec,"getErrorStack")});import Yd from"node:fs/promises";async function Qd(r,e){let t;try{t=await Yd.readFile(r,"utf-8")}catch(o){if(O(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Xd(r,t),Kd(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await Xd(r,t),Kd(r,fw(n.error)),null)}async function Xd(r,e){let t=`${r}.backup`;try{await Yd.writeFile(t,e,"utf-8")}catch{}}function Kd(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function fw(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Zd=S(()=>{"use strict";W();l(Qd,"safeRead");l(Xd,"createBackup");l(Kd,"logCorruption");l(fw,"formatZodError")});var _t={};ye(_t,{appendLine:()=>tc,appendToFile:()=>yw,atomicWrite:()=>hw,batchProcess:()=>yn,copyFile:()=>Tw,deleteDir:()=>Sw,deleteFile:()=>kw,dirExists:()=>Kt,ensureDir:()=>rt,fileExists:()=>C,getFileExtension:()=>xw,getFileModifiedTime:()=>vw,getFileNameWithoutExtension:()=>jw,getFileSize:()=>bw,listFiles:()=>Cs,moveFile:()=>Ew,prependToFile:()=>ww,readFile:()=>_e,readJson:()=>Ae,readLines:()=>Cw,walkDir:()=>hn,writeFile:()=>Pt,writeJson:()=>de,writeLines:()=>Pw});import Re from"node:fs/promises";import Es from"node:path";async function hn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Re.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(Vd.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=Es.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(Es.relative(r,d))}}return l(o,"walk"),await o(r),t}async function yn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function Ae(r,e=null,t){if(t)return await Qd(r,t)??e;try{let s=await Re.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(O(s))return e;throw s}}async function de(r,e,t=2){let s=Es.dirname(r);await Re.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Re.writeFile(r,n,"utf-8")}async function _e(r,e=""){try{return await Re.readFile(r,"utf-8")}catch(t){if(O(t))return e;throw t}}async function Pt(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.writeFile(r,e,"utf-8")}async function hw(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await Re.writeFile(s,e,"utf-8"),await Re.rename(s,r)}async function yw(r,e){await Re.appendFile(r,e,"utf-8")}async function tc(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.appendFile(r,`${e}
|
|
10
|
+
`,"utf-8")}async function ww(r,e){try{let t=await Re.readFile(r,"utf-8");await Re.writeFile(r,e+t,"utf-8")}catch(t){if(O(t))await Re.writeFile(r,e,"utf-8");else throw t}}async function C(r){try{return await Re.access(r),!0}catch(e){if(O(e))return!1;throw e}}async function Kt(r){try{return(await Re.stat(r)).isDirectory()}catch(e){if(O(e))return!1;throw e}}async function rt(r){await Re.mkdir(r,{recursive:!0})}async function kw(r){try{return await Re.unlink(r),!0}catch(e){if(O(e))return!1;throw e}}async function Sw(r){try{return await Re.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(O(e))return!1;throw e}}async function Cs(r,e={}){try{let s=await Re.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(O(t))return[];throw t}}async function bw(r){return(await Re.stat(r)).size}async function vw(r){return(await Re.stat(r)).mtime}async function Tw(r,e){await Re.copyFile(r,e)}async function Ew(r,e){await Re.rename(r,e)}async function Cw(r){return(await _e(r,"")).split(`
|
|
11
|
+
`)}async function Pw(r,e){let t=e.join(`
|
|
12
|
+
`);await Pt(r,t)}function xw(r){return Es.extname(r)}function jw(r){return Es.basename(r,Es.extname(r))}var B=S(()=>{"use strict";Za();Zd();W();l(hn,"walkDir");l(yn,"batchProcess");l(Ae,"readJson");l(de,"writeJson");l(_e,"readFile");l(Pt,"writeFile");l(hw,"atomicWrite");l(yw,"appendToFile");l(tc,"appendLine");l(ww,"prependToFile");l(C,"fileExists");l(Kt,"dirExists");l(rt,"ensureDir");l(kw,"deleteFile");l(Sw,"deleteDir");l(Cs,"listFiles");l(bw,"getFileSize");l(vw,"getFileModifiedTime");l(Tw,"copyFile");l(Ew,"moveFile");l(Cw,"readLines");l(Pw,"writeLines");l(xw,"getFileExtension");l(jw,"getFileNameWithoutExtension")});function Ws(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var qn,wn=S(()=>{"use strict";l(Ws,"isExpired");qn=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var sm={};ye(sm,{invalidateProviderCache:()=>Dw,readProviderCache:()=>nc,writeProviderCache:()=>rc});import em from"node:fs/promises";import Rw from"node:os";import tm from"node:path";async function nc(){try{let r=await em.readFile(sc,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ws(e.timestamp,Iw)?null:e.detection}catch{return null}}async function rc(r){let e={timestamp:new Date().toISOString(),detection:r};await de(sc,e)}async function Dw(){try{await em.unlink(sc)}catch{}}var Aw,sc,Iw,oc=S(()=>{"use strict";wn();B();Aw=tm.join(Rw.homedir(),".prjct-cli","cache"),sc=tm.join(Aw,"providers.json"),Iw=10*60*1e3;l(nc,"readProviderCache");l(rc,"writeProviderCache");l(Dw,"invalidateProviderCache")});var Nt={};ye(Nt,{AntigravityProvider:()=>ac,ClaudeProvider:()=>Bo,CodexProvider:()=>cc,CursorProvider:()=>rm,GeminiProvider:()=>ic,Providers:()=>ze,WindsurfProvider:()=>om,detectAllProviders:()=>Ps,detectAntigravity:()=>Bn,detectCodex:()=>kn,detectCursorProject:()=>cm,detectProvider:()=>Vo,detectWindsurfProject:()=>lm,getActiveProvider:()=>_w,getCapabilities:()=>Mw,getCommandsDir:()=>Gw,getGlobalContextPath:()=>Uw,getGlobalSettingsPath:()=>Hw,getProjectCommandsPath:()=>qw,getProviderBranding:()=>Jo,getSkillsPath:()=>Ww,hasProviderConfig:()=>Nw,needsCursorRouterRegeneration:()=>Lw,needsWindsurfRouterRegeneration:()=>Fw,selectProvider:()=>lc,validateCliVersion:()=>am});import Gs from"node:os";import ot from"node:path";function Mw(r,e){return{...$w[r],...e}}async function im(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Ow(r){try{let{stdout:e}=await F(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Vo(r){let e=ze[r];if(!e.cliCommand)return{installed:!1};let t=await im(e.cliCommand);if(!t)return{installed:!1};let s=await Ow(e.cliCommand),n=am(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function am(r,e){let t=ze[r];return!t.minCliVersion||!e?null:Gd(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function Ps(r=!1){if(!r){let i=await nc();if(i)return i}let[e,t,s]=await Promise.all([Vo("claude"),Vo("gemini"),kn()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await rc(o).catch(()=>{}),o}async function _w(r){if(r&&ze[r])return ze[r];let e=await Ps();return e.claude.installed&&!e.gemini.installed?Bo:e.gemini.installed&&!e.claude.installed?ic:Bo}async function Nw(r){let e=ze[r];return e.configDir?C(e.configDir):!1}function Jo(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function cm(r){let e=ot.join(r,".cursor"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Lw(r){let e=await cm(r);return e.detected&&!e.routerInstalled}async function lm(r){let e=ot.join(r,".windsurf"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Fw(r){let e=await lm(r);return e.detected&&!e.routerInstalled}async function Bn(){let r=ac.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=ot.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function kn(){let r=cc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await im("codex"),t=ot.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Uw(r){let e=ze[r];return e.configDir?ot.join(e.configDir,e.contextFile):null}function Hw(r){let e=ze[r];return!e.configDir||!e.settingsFile?null:ot.join(e.configDir,e.settingsFile)}function Ww(r){return ze[r].skillsDir}function Gw(r){return ze[r].commandsDir}function qw(r,e){let t=ze[r];return ot.join(e,t.commandsDir)}async function lc(){let r=await Ps(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var $w,Bo,ic,ac,rm,om,cc,ze,lt=S(()=>{"use strict";so();qo();Je();B();oc();$w={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(Mw,"getCapabilities");Bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ot.join(Gs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ot.join(Gs.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"},ic={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ot.join(Gs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ot.join(Gs.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"},ac={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ot.join(Gs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ot.join(Gs.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"},rm={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"},om={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"},cc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ot.join(Gs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ot.join(Gs.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"},ze={claude:Bo,gemini:ic,cursor:rm,antigravity:ac,windsurf:om,codex:cc};l(im,"whichCommand");l(Ow,"getCliVersion");l(Vo,"detectProvider");l(am,"validateCliVersion");l(Ps,"detectAllProviders");l(_w,"getActiveProvider");l(Nw,"hasProviderConfig");l(Jo,"getProviderBranding");l(cm,"detectCursorProject");l(Lw,"needsCursorRouterRegeneration");l(lm,"detectWindsurfProject");l(Fw,"needsWindsurfRouterRegeneration");l(Bn,"detectAntigravity");l(kn,"detectCodex");l(Uw,"getGlobalContextPath");l(Hw,"getGlobalSettingsPath");l(Ww,"getSkillsPath");l(Gw,"getCommandsDir");l(qw,"getProjectCommandsPath");l(lc,"selectProvider")});import{z as De}from"zod";function Bw(r){return r instanceof Vn}function we(r){return Bw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Jn,Ex,Cx,Px,xx,jx,Rx,Vn,zo,Xo,no,xs=S(()=>{"use strict";Jn={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},Ex=Jn.create("FileError",De.object({path:De.string(),operation:De.enum(["read","write","delete","create","copy"]),reason:De.string().optional()})),Cx=Jn.create("ValidationError",De.object({field:De.string(),expected:De.string(),received:De.string().optional(),message:De.string().optional()})),Px=Jn.create("PermissionError",De.object({action:De.string(),resource:De.string(),reason:De.string().optional()})),xx=Jn.create("TaskError",De.object({taskId:De.string().optional(),operation:De.enum(["create","update","complete","pause","resume","delete"]),reason:De.string()})),jx=Jn.create("SessionError",De.object({sessionId:De.string().optional(),reason:De.string()})),Rx=Jn.create("SyncError",De.object({projectId:De.string().optional(),operation:De.enum(["push","pull","auth","connect"]),reason:De.string()})),Vn=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)}},zo=class r extends Vn{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Xo=class r extends Vn{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},no=class r extends Vn{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(Bw,"isPrjctError");l(we,"getErrorMessage")});import{formatDistanceToNowStrict as $x}from"date-fns";function um(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function dm(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function v(){return new Date().toISOString()}function qs(r){let e=new Date;return e.setDate(e.getDate()-r),e}function xt(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function js(r,e=new Date){let t=e.getTime()-r.getTime();return xt(t)}function zn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function Lt(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=S(()=>{"use strict";l(um,"formatDate");l(dm,"getYearMonthDay");l(v,"getTimestamp");l(qs,"getDaysAgo");l(xt,"formatDuration");l(js,"calculateDuration");l(zn,"parseVarianceMinutes");l(Lt,"parseDurationMinutes")});var Kn={};ye(Kn,{PACKAGE_ROOT:()=>jt,VERSION:()=>ke,compareVersions:()=>mm,getPackageInfo:()=>Vw,getPackageRoot:()=>dc,getVersion:()=>Sn,isCompatible:()=>Jw,needsMigration:()=>zw,resetPackageRoot:()=>mc});import uc from"node:fs";import Ko from"node:path";function dc(){if(Xn)return Xn;let r=__dirname;for(let e=0;e<5;e++){let t=Ko.join(r,"package.json");if(uc.existsSync(t))try{if(JSON.parse(uc.readFileSync(t,"utf-8")).name==="prjct-cli")return Xn=r,r}catch{}r=Ko.dirname(r)}return Xn=Ko.join(__dirname,"..","..",".."),Xn}function Sn(){if(ro)return ro;try{let r=Ko.join(dc(),"package.json"),e=JSON.parse(uc.readFileSync(r,"utf-8"));return ro=e.version,Yo=e,ro}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Vw(){return Yo||Sn(),Yo}function mm(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Jw(r){let e=Sn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function zw(r,e=null){let t=e||Sn();return mm(r,t)<0}function mc(r){Xn=r,ro=null,Yo=null}var ro,Yo,Xn,ke,jt,ut=S(()=>{"use strict";W();ro=null,Yo=null,Xn=null;l(dc,"getPackageRoot");l(Sn,"getVersion");l(Vw,"getPackageInfo");l(mm,"compareVersions");l(Jw,"isCompatible");l(zw,"needsMigration");l(mc,"resetPackageRoot");ke=Sn(),jt=dc()});async function Qo(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Xw(){let r=await Qo("gh api user --jq .login");return r.success&&r.output||(r=await Qo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Kw(){let r=await Qo("git config user.name");return r.success&&r.output?r.output:null}async function Yw(){let r=await Qo("git config user.email");return r.success&&r.output?r.output:null}async function Yn(){let[r,e,t]=await Promise.all([Xw(),Kw(),Yw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Zo=S(()=>{"use strict";Je();l(Qo,"execCommand");l(Xw,"detectGitHubUsername");l(Kw,"detectGitName");l(Yw,"detectGitEmail");l(Yn,"detect")});import Qw from"node:crypto";import ms from"node:fs/promises";import gc from"node:os";import z from"node:path";import{globSync as Zw}from"glob";var fc,ek,A,ve=S(()=>{"use strict";K();B();fc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(gc.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return Qw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Kt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await rt(this.globalBaseDir),await rt(this.globalProjectsDir),await rt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await rt(z.join(t,n));return await rt(z.join(t,"planning","tasks")),await rt(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=dm(t);return z.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await rt(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await ms.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await ms.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=z.join(c,d.name),m=await ms.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:z.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await ms.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 Kt(t)}getDisplayPath(e){let t=gc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(lt(),bt(Nt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),bt(Nt)).getActiveProvider();return(lt(),bt(Nt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(gc.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=z.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await C(n))try{let o=await ms.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await ms.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
13
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=z.join(e,"package.json"),i=await ms.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=z.join(e,"lerna.json");if(await C(c)){let u=await ms.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=z.join(e,"package.json"),i=await ms.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=Zw(o,{cwd:e,absolute:!1});for(let a of i){let c=z.join(e,a),u=z.join(c,"package.json");if(await C(u))try{let d=await ms.readFile(u,"utf-8"),p=JSON.parse(d),m=z.join(c,"PRJCT.md");s.push({name:p.name||z.basename(a),path:c,relativePath:a,hasPrjctMd:await C(m)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=z.resolve(e);for(let n of t.packages){let o=z.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=z.resolve(e),s=z.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=z.dirname(t)}return null}},ek=new fc,A=ek});var ei={};ye(ei,{default:()=>Yt,worktreeService:()=>gm});import hc from"node:fs/promises";import ps from"node:path";var pm,yc,gm,Yt,oo=S(()=>{"use strict";Je();B();pm=".worktrees",yc=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=ps.join(n,pm,t),i=s.branch||`feat/${t}`;await hc.mkdir(ps.join(n,pm),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await F(`git worktree add "${o}" -b "${i}"${a}`,{cwd:n});let{stdout:c}=await F("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:c.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),n;if(t)try{let{stdout:o}=await F("git rev-parse --abbrev-ref HEAD",{cwd:e});n=o.trim()}catch{}if(await F(`git worktree remove "${e}" --force`,{cwd:s}),t&&n&&n!=="main"&&n!=="master")try{await F(`git branch -D "${n}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await F("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await F("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await F("git rev-parse --git-dir",{cwd:e}),n=ps.resolve(e,t.trim()),o=ps.resolve(e,s.trim());if(n!==o){let{stdout:i}=await F("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await F("git rev-parse HEAD",{cwd:e}),{stdout:c}=await F("git rev-parse --show-toplevel",{cwd:e}),u=c.trim(),d=ps.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await F("git worktree list --porcelain",{cwd:e}),n=s.split(`
|
|
14
|
+
`)[0];if(n?.startsWith("worktree "))return n.replace("worktree ","").trim()}catch{}let{stdout:t}=await F("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=ps.join(t,".env");await C(s)&&await hc.copyFile(s,ps.join(e,".env"));let n=ps.join(t,".prjct"),o=ps.join(e,".prjct");await C(n)&&!await C(o)&&await hc.symlink(n,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],n=await this.getMainWorktree(e);await F("git worktree prune",{cwd:n});for(let o of t)o.isMain||await C(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],n=e.trim().split(`
|
|
15
15
|
|
|
16
16
|
`);for(let o of n){if(!o.trim())continue;let i=o.trim().split(`
|
|
17
|
-
`),a="",c="",u="",d=!1;for(let
|
|
17
|
+
`),a="",c="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?c=p.replace("HEAD ","").trim():p.startsWith("branch ")?u=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(u="(detached)");if(a){let p=a===t||d;s.push({path:a,branch:u,commit:c,isMain:p,slug:p?"main":ps.basename(a)})}}return s}},gm=new yc,Yt=gm});var hm={};ye(hm,{default:()=>$});import wc from"node:fs/promises";import tk from"node:path";import*as ti from"jsonc-parser";function fm(r){let e=[],t=ti.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${ti.printParseErrorCode(s.error)}`)}return t}var kc,sk,$,Te=S(()=>{"use strict";xs();W();K();B();ut();Zo();ve();l(fm,"parseJsonc");kc=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await wc.readFile(t,"utf-8");return fm(s)}catch(t){return O(t)||console.warn(`Warning: Could not read config at ${e}: ${we(t)}`),null}}async writeConfig(e,t){let s=A.getLocalConfigPath(e);await de(s,t)}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),s=await wc.readFile(t,"utf-8");return fm(s)}catch(t){return O(t)||console.warn(`Warning: Could not read global config for ${e}: ${we(t)}`),null}}async writeGlobalConfig(e,t){let s=A.getGlobalProjectConfigPath(e);await de(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=v();t={projectId:e,authors:[],version:ke,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=A.generateProjectId(e),n=A.getGlobalProjectPath(s),o=A.getDisplayPath(n),i=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:ke,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 n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=A.getGlobalProjectPath(n.projectId);try{return(await wc.readdir(tk.join(o,"core"))).length===0}catch(i){return O(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(oo(),ei));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return A.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=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 n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=v(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Yn(),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))}}},sk=new kc,$=sk});var wm={};ye(wm,{default:()=>io});import Sc from"node:fs/promises";import nk from"node:os";import ym from"node:path";var bc,rk,io,si=S(()=>{"use strict";W();B();bc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=nk.homedir(),this.configDir=ym.join(this.homeDir,".prjct-cli","config"),this.configFile=ym.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Sc.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",k(e))}}async loadConfig(){try{let e=await Sc.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",k(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await de(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",k(n)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await de(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",k(t)),!1}}async configExists(){return C(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Sc.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",k(e)),!1}}},rk=new bc,io=rk});var ri={};ye(ri,{PrjctDatabase:()=>ni,default:()=>N,prjctDb:()=>E});import vc from"node:fs";import km from"node:path";function ok(r){if(gn()){let{Database:n}=Bt("bun:sqlite");return new n(r,{create:!0})}let e=Bt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var ik,ak,ni,E,N,ee=S(()=>{"use strict";ve();eo();l(ok,"openDatabase");ik=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
18
18
|
-- =======================================================================
|
|
19
19
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
20
20
|
-- =======================================================================
|
|
@@ -475,68 +475,68 @@ var sw=Object.create;var to=Object.defineProperty;var nw=Object.getOwnPropertyDe
|
|
|
475
475
|
);
|
|
476
476
|
|
|
477
477
|
CREATE INDEX IF NOT EXISTS idx_qtc_task_id ON queue_task_comments(task_id);
|
|
478
|
-
`)},"up")}],
|
|
478
|
+
`)},"up")}],ak=3,ni=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return km.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=ak&&this.evictLru();let s=this.getDbPath(e),n=km.dirname(s);vc.existsSync(n)||vc.mkdirSync(n,{recursive:!0});let o=ok(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 vc.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setDoc(e,t,s){let n=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,s,n){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,n??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let n=this.getDb(e);return t?n.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):n.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(s)}query(e,t,...s){return this.getDb(e).prepare(t).all(...s)}run(e,t,...s){this.getDb(e).prepare(t).run(...s)}get(e,t,...s){return this.getDb(e).prepare(t).get(...s)??null}transaction(e,t){let s=this.getDb(e);return s.transaction(t)(s)}runMigrations(e){e.run(`
|
|
479
479
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
480
480
|
version INTEGER PRIMARY KEY,
|
|
481
481
|
name TEXT NOT NULL,
|
|
482
482
|
applied_at TEXT NOT NULL
|
|
483
483
|
)
|
|
484
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of lk)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}},E=new ai,N=E});import{z as J}from"zod";var dk,pk,Rp,mk,gk,fk,hk,yk,Ap,wj,Ip=S(()=>{"use strict";dk=J.enum(["low","medium","high"]),pk=J.enum(["pending","converted","completed","archived","dormant"]),Rp=J.enum(["high","medium","low"]),mk=J.object({impact:Rp,effort:Rp}),gk=J.object({frontend:J.string().optional(),backend:J.string().optional(),payments:J.string().optional(),ai:J.string().optional(),deploy:J.string().optional(),other:J.array(J.string()).optional()}),fk=J.object({name:J.string(),description:J.string()}),hk=J.object({name:J.string(),description:J.string().optional()}),yk=J.object({id:J.string(),text:J.string(),details:J.string().optional(),priority:dk,status:pk,tags:J.array(J.string()),addedAt:J.string(),completedAt:J.string().optional(),convertedTo:J.string().optional(),source:J.string().optional(),sourceFiles:J.array(J.string()).optional(),painPoints:J.array(J.string()).optional(),solutions:J.array(J.string()).optional(),filesAffected:J.array(J.string()).optional(),impactEffort:mk.optional(),implementationNotes:J.string().optional(),stack:gk.optional(),modules:J.array(fk).optional(),roles:J.array(hk).optional(),risks:J.array(J.string()).optional(),risksCount:J.number().optional()}),Ap=J.object({ideas:J.array(yk),lastUpdated:J.string()}),wj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import wk from"node:crypto";import{homedir as kk}from"node:os";import{join as Sk}from"node:path";function Z(){return wk.randomUUID()}var Ej,Ht=S(()=>{"use strict";l(Z,"generateUUID");Ej=Sk(kk(),".prjct-cli","projects")});var js,xc,Rt,qs=S(()=>{"use strict";Ht();X();ee();js={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},xc=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Z(),n=v();return E.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return E.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Z(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?E.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):E.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=E.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=E.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(E.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);E.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return E.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Rt=new xc});var jc,Bs,Rc=S(()=>{"use strict";ve();X();B();jc=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Ae(t,[])??[];s.push(e),await de(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ae(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await de(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:v(),success:!0};await de(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ae(t,null)}},Bs=new jc});var dt,Rs=S(()=>{"use strict";Rc();kn();X();ee();dt=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Bn({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=E.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){E.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await Bs.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return E.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Ac,$e,Vs=S(()=>{"use strict";Ip();Ht();X();qs();Rs();Ac=class extends dt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Ap)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:Z(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.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 n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=Gs(js.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},$e=new Ac});import{z as P}from"zod";var bk,li,vk,Tk,Ek,Ic,$p,Mp,Op,Dc,Dp,Ck,Pk,xk,_p,Np,Lp,jk,Rk,Yj,$c=S(()=>{"use strict";zo();bk=P.enum(["low","medium","high","critical"]),li=P.enum(["feature","bug","improvement","chore"]),vk=P.enum(["active","backlog","previously_active"]),Tk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ek=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Ic=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()}),$p=P.object({output:P.string().min(1,"Subtask output is required"),summary:Ic}),Mp=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:Tk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:Ic.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),Op=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),Dc=P.object({id:P.string(),description:P.string(),type:li.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(Mp).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Op.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:qn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional(),parentDescription:P.string().optional(),branch:P.string().optional(),prUrl:P.string().optional()}),Dp=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:li.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(Mp).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Op.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:qn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),Ck=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()}),Pk=P.object({taskId:P.string(),title:P.string(),classification:li,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(Ic),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:Ck.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),xk=Dc.extend({workspaceId:P.string(),worktreePath:P.string().optional(),agentSessionId:P.string().optional(),jiraId:P.string().optional(),jiraUuid:P.string().optional(),dispatchedFrom:P.string().optional()}),_p=P.object({currentTask:Dc.nullable(),previousTask:Dp.nullable().optional(),pausedTasks:P.array(Dp).optional(),taskHistory:P.array(Pk).optional(),activeTasks:P.array(xk).optional(),lastUpdated:P.string()}),Np=P.object({id:P.string(),description:P.string(),body:P.string().optional(),priority:bk,type:li,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:vk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Lp=P.object({tasks:P.array(Np),lastUpdated:P.string()}),jk=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),Rk=P.object({type:Ek,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),Yj=P.object({projectId:P.string(),currentTask:Dc.nullable(),queue:P.array(Np),stats:jk,recentActivity:P.array(Rk),lastSync:P.string()})});function ui(r){return[...r].sort((e,t)=>{let s=Up[e.section]-Up[t.section];return s!==0?s:Fp[e.priority]-Fp[t.priority]})}function Mc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Fp,Up,di=S(()=>{"use strict";Fp={critical:0,high:1,medium:2,low:3},Up={active:0,previously_active:1,backlog:2};l(ui,"sortBySectionAndPriority");l(Mc,"uniqueBy")});var Oc,ce,Vt=S(()=>{"use strict";Ht();$c();di();X();qs();Rs();Oc=class extends dt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Lp)}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 ui(t)[0]||null}async addTask(e,t){let s={...t,id:Z(),createdAt:v(),completed:!1};return await this.update(e,n=>({tasks:[...n.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(),n=t.map(o=>({...o,id:Z(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async getTask(e,t){return(await this.read(e)).tasks.find(n=>n.id===t)||null}async updateTask(e,t,s){let n=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(n={...i,...s},n):i),lastUpdated:v()})),n&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),n}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=Gs(js.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},ce=new Oc});import{z as re}from"zod";var Ak,Hp,Ik,Dk,$k,Mk,Ok,_k,Nk,Wp,Gp=S(()=>{"use strict";Ak=re.enum(["feature","fix","improvement","refactor"]),Hp=re.enum(["pass","warning","fail","skipped"]),Ik=re.enum(["added","changed","fixed","removed"]),Dk=re.object({hours:re.number(),minutes:re.number(),totalMinutes:re.number()}),$k=re.object({filesChanged:re.number().nullable().optional(),linesAdded:re.number().nullable().optional(),linesRemoved:re.number().nullable().optional(),commits:re.number().nullable().optional()}),Mk=re.object({description:re.string(),type:Ik.optional()}),Ok=re.object({lintStatus:Hp.nullable().optional(),lintDetails:re.string().optional(),testStatus:Hp.nullable().optional(),testDetails:re.string().optional()}),_k=re.object({hash:re.string().optional(),message:re.string().optional(),branch:re.string().optional()}),Nk=re.object({id:re.string(),name:re.string(),version:re.string().nullable().optional(),type:Ak,agent:re.string().optional(),description:re.string().optional(),changes:re.array(Mk).optional(),codeSnippets:re.array(re.string()).optional(),commit:_k.optional(),codeMetrics:$k.optional(),qualityMetrics:Ok.optional(),quantitativeImpact:re.string().optional(),duration:Dk.optional(),tasksCompleted:re.number().nullable().optional(),shippedAt:re.string(),featureId:re.string().optional()}),Wp=re.object({shipped:re.array(Nk),lastUpdated:re.string()})});var _c,it,Js=S(()=>{"use strict";Ht();Gp();X();qs();Rs();_c=class extends dt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Wp)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Z(),shippedAt:v()};return await this.update(e,n=>({shipped:[s,...n.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(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=Gs(js.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},it=new _c});var lo,Nc,vn,Lc=S(()=>{"use strict";lo={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"}},Nc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=lo[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return lo[e]}getPrompt(e){return lo[e].prompt}getValidCommands(e){return lo[e].transitions}formatNextSteps(e){return lo[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}`}})}},vn=new Nc});var Fc,L,St=S(()=>{"use strict";Ht();$c();X();Lc();qs();Rs();Fc=class extends dt{static{l(this,"StateStorage")}constructor(){super("state.json",_p)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=vn.getCurrentState(e),n=vn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:v(),sessionId:i.sessionId??Z()};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),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Rt.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:[],activeTasks:[],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),n=[],o=[],i=[],a=[];for(let p of s){let g=p.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:v()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(m=>m.workspaceId===t);if(!i)return null;let a=v(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,m=>({...m,activeTasks:(m.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:v()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:v()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=$p.safeParse(t);if(!s.success){let w=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
484
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of ik)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}},E=new ni,N=E});import{z as J}from"zod";var ck,lk,Sm,uk,dk,mk,pk,gk,bm,Sj,vm=S(()=>{"use strict";ck=J.enum(["low","medium","high"]),lk=J.enum(["pending","converted","completed","archived","dormant"]),Sm=J.enum(["high","medium","low"]),uk=J.object({impact:Sm,effort:Sm}),dk=J.object({frontend:J.string().optional(),backend:J.string().optional(),payments:J.string().optional(),ai:J.string().optional(),deploy:J.string().optional(),other:J.array(J.string()).optional()}),mk=J.object({name:J.string(),description:J.string()}),pk=J.object({name:J.string(),description:J.string().optional()}),gk=J.object({id:J.string(),text:J.string(),details:J.string().optional(),priority:ck,status:lk,tags:J.array(J.string()),addedAt:J.string(),completedAt:J.string().optional(),convertedTo:J.string().optional(),source:J.string().optional(),sourceFiles:J.array(J.string()).optional(),painPoints:J.array(J.string()).optional(),solutions:J.array(J.string()).optional(),filesAffected:J.array(J.string()).optional(),impactEffort:uk.optional(),implementationNotes:J.string().optional(),stack:dk.optional(),modules:J.array(mk).optional(),roles:J.array(pk).optional(),risks:J.array(J.string()).optional(),risksCount:J.number().optional()}),bm=J.object({ideas:J.array(gk),lastUpdated:J.string()}),Sj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import fk from"node:crypto";import{homedir as hk}from"node:os";import{join as yk}from"node:path";function Z(){return fk.randomUUID()}var Pj,Ut=S(()=>{"use strict";l(Z,"generateUUID");Pj=yk(hk(),".prjct-cli","projects")});var Rs,Tc,Rt,Bs=S(()=>{"use strict";Ut();K();ee();Rs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Tc=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Z(),n=v();return E.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return E.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Z(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?E.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):E.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=E.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=E.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(E.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);E.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return E.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Rt=new Tc});var Ec,Vs,Cc=S(()=>{"use strict";ve();K();B();Ec=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Ae(t,[])??[];s.push(e),await de(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ae(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await de(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:v(),success:!0};await de(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ae(t,null)}},Vs=new Ec});var dt,As=S(()=>{"use strict";Cc();wn();K();ee();dt=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new qn({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=E.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){E.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await Vs.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return E.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Pc,$e,Js=S(()=>{"use strict";vm();Ut();K();Bs();As();Pc=class extends dt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",bm)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:Z(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.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 n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=qs(Rs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},$e=new Pc});import{z as P}from"zod";var wk,oi,kk,Sk,bk,xc,Em,Cm,Pm,jc,Tm,vk,Tk,Ek,xm,jm,Rm,Ck,Pk,Zj,Rc=S(()=>{"use strict";qo();wk=P.enum(["low","medium","high","critical"]),oi=P.enum(["feature","bug","improvement","chore"]),kk=P.enum(["active","backlog","previously_active"]),Sk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),bk=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),xc=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()}),Em=P.object({output:P.string().min(1,"Subtask output is required"),summary:xc}),Cm=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:Sk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:xc.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),Pm=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),jc=P.object({id:P.string(),description:P.string(),type:oi.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(Cm).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Pm.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:Gn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional(),parentDescription:P.string().optional(),branch:P.string().optional(),prUrl:P.string().optional()}),Tm=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:oi.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(Cm).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Pm.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:Gn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),vk=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()}),Tk=P.object({taskId:P.string(),title:P.string(),classification:oi,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(xc),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:vk.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),Ek=jc.extend({workspaceId:P.string(),worktreePath:P.string().optional(),agentSessionId:P.string().optional(),jiraId:P.string().optional(),jiraUuid:P.string().optional(),dispatchedFrom:P.string().optional()}),xm=P.object({currentTask:jc.nullable(),previousTask:Tm.nullable().optional(),pausedTasks:P.array(Tm).optional(),taskHistory:P.array(Tk).optional(),activeTasks:P.array(Ek).optional(),lastUpdated:P.string()}),jm=P.object({id:P.string(),description:P.string(),body:P.string().optional(),priority:wk,type:oi,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:kk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Rm=P.object({tasks:P.array(jm),lastUpdated:P.string()}),Ck=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),Pk=P.object({type:bk,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),Zj=P.object({projectId:P.string(),currentTask:jc.nullable(),queue:P.array(jm),stats:Ck,recentActivity:P.array(Pk),lastSync:P.string()})});function ii(r){return[...r].sort((e,t)=>{let s=Im[e.section]-Im[t.section];return s!==0?s:Am[e.priority]-Am[t.priority]})}function Ac(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Am,Im,ai=S(()=>{"use strict";Am={critical:0,high:1,medium:2,low:3},Im={active:0,previously_active:1,backlog:2};l(ii,"sortBySectionAndPriority");l(Ac,"uniqueBy")});var Ic,ce,Vt=S(()=>{"use strict";Ut();Rc();ai();K();Bs();As();Ic=class extends dt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Rm)}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 ii(t)[0]||null}async addTask(e,t){let s={...t,id:Z(),createdAt:v(),completed:!1};return await this.update(e,n=>({tasks:[...n.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(),n=t.map(o=>({...o,id:Z(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async getTask(e,t){return(await this.read(e)).tasks.find(n=>n.id===t)||null}async updateTask(e,t,s){let n=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(n={...i,...s},n):i),lastUpdated:v()})),n&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),n}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=qs(Rs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},ce=new Ic});import{z as re}from"zod";var xk,Dm,jk,Rk,Ak,Ik,Dk,$k,Mk,$m,Mm=S(()=>{"use strict";xk=re.enum(["feature","fix","improvement","refactor"]),Dm=re.enum(["pass","warning","fail","skipped"]),jk=re.enum(["added","changed","fixed","removed"]),Rk=re.object({hours:re.number(),minutes:re.number(),totalMinutes:re.number()}),Ak=re.object({filesChanged:re.number().nullable().optional(),linesAdded:re.number().nullable().optional(),linesRemoved:re.number().nullable().optional(),commits:re.number().nullable().optional()}),Ik=re.object({description:re.string(),type:jk.optional()}),Dk=re.object({lintStatus:Dm.nullable().optional(),lintDetails:re.string().optional(),testStatus:Dm.nullable().optional(),testDetails:re.string().optional()}),$k=re.object({hash:re.string().optional(),message:re.string().optional(),branch:re.string().optional()}),Mk=re.object({id:re.string(),name:re.string(),version:re.string().nullable().optional(),type:xk,agent:re.string().optional(),description:re.string().optional(),changes:re.array(Ik).optional(),codeSnippets:re.array(re.string()).optional(),commit:$k.optional(),codeMetrics:Ak.optional(),qualityMetrics:Dk.optional(),quantitativeImpact:re.string().optional(),duration:Rk.optional(),tasksCompleted:re.number().nullable().optional(),shippedAt:re.string(),featureId:re.string().optional()}),$m=re.object({shipped:re.array(Mk),lastUpdated:re.string()})});var Dc,it,zs=S(()=>{"use strict";Ut();Mm();K();Bs();As();Dc=class extends dt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",$m)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Z(),shippedAt:v()};return await this.update(e,n=>({shipped:[s,...n.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(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-7*24*60*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=qs(Rs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},it=new Dc});var ao,$c,bn,Mc=S(()=>{"use strict";ao={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"}},$c=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=ao[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return ao[e]}getPrompt(e){return ao[e].prompt}getValidCommands(e){return ao[e].transitions}formatNextSteps(e){return ao[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}`}})}},bn=new $c});var Oc,L,vt=S(()=>{"use strict";Ut();Rc();K();Mc();Bs();As();Oc=class extends dt{static{l(this,"StateStorage")}constructor(){super("state.json",xm)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=bn.getCurrentState(e),n=bn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:v(),sessionId:i.sessionId??Z()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Rt.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:[],activeTasks:[],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(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:v()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=v(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:v()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:v()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=Em.safeParse(t);if(!s.success){let w=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
485
485
|
${w.join(`
|
|
486
|
-
`)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:v(),output:n,summary:o};let d=u.filter(w=>w.status==="completed").length,
|
|
487
|
-
VALUES (?, ?, ?, ?, ?, ?)`,o,t,n,s,i,i),{id:o,taskId:t,author:n,content:s,createdAt:i,updatedAt:i}}getComments(e,t){return E.query(e,"SELECT * FROM queue_task_comments WHERE task_id = ? ORDER BY created_at ASC",t).map(
|
|
486
|
+
`)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:v(),output:n,summary:o};let d=u.filter(w=>w.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,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 n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,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 n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},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}},L=new Oc});function _k(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Ok.has(r)||r.includes("prjct"))return{level:Qn.debug,name:"debug"};let e=Qn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function ci(r,e,t){return Om>=r?(...s)=>console[t](e,...s):Lk}var Qn,Ok,Om,Nk,Lk,Fk,V,Is=S(()=>{"use strict";Qn={error:0,warn:1,info:2,debug:3},Ok=new Set(["1","true","*"]);l(_k,"getLogLevel");({level:Om,name:Nk}=_k()),Lk=l(()=>{},"noop");l(ci,"createLogMethod");Fk={error:ci(Qn.error,"[prjct:error]","error"),warn:ci(Qn.warn,"[prjct:warn]","warn"),info:ci(Qn.info,"[prjct:info]","log"),debug:ci(Qn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Om>=0,"isEnabled"),level:l(()=>Nk,"level")},V=Fk});import Uk from"node:fs/promises";import Hk from"node:path";import{Hono as Wk}from"hono";function Gk(r){return A.getGlobalProjectPath(r)}function _m(r,e){let t=new Wk,s=Gk(r);return t.get("/state",async n=>{let o=await L.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await ce.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await $e.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=E.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await it.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([L.read(r),ce.read(r),$e.read(r),it.read(r)]),u=E.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await L.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=Hk.join(s,"context",`${o}.md`),c=await Uk.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return O(a)||V.error(`Context read error: ${k(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}var Nm=S(()=>{"use strict";ve();ee();Js();Vt();zs();vt();W();Is();l(Gk,"getProjectDataPath");l(_m,"createRoutes")});function qk(r){return{id:r.id,taskId:r.task_id,author:r.author,content:r.content,createdAt:r.created_at,updatedAt:r.updated_at}}function Bk(){return`cmt_${Math.random().toString(36).slice(2,10)}${Date.now().toString(36)}`}var _c,co,Lm=S(()=>{"use strict";ee();l(qk,"rowToComment");l(Bk,"generateId");_c=class{static{l(this,"CommentStorage")}addComment(e,t,s,n="user"){let o=Bk(),i=new Date().toISOString();return E.run(e,`INSERT INTO queue_task_comments (id, task_id, author, content, created_at, updated_at)
|
|
487
|
+
VALUES (?, ?, ?, ?, ?, ?)`,o,t,n,s,i,i),{id:o,taskId:t,author:n,content:s,createdAt:i,updatedAt:i}}getComments(e,t){return E.query(e,"SELECT * FROM queue_task_comments WHERE task_id = ? ORDER BY created_at ASC",t).map(qk)}updateComment(e,t,s){return E.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(E.run(e,"UPDATE queue_task_comments SET content = ?, updated_at = ? WHERE id = ?",s,new Date().toISOString(),t),!0):!1}deleteComment(e,t){return E.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(E.run(e,"DELETE FROM queue_task_comments WHERE id = ?",t),!0):!1}},co=new _c});var Nc,lo,Lc=S(()=>{"use strict";ee();Nc=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){E.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
|
|
488
488
|
VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){E.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
|
|
489
489
|
VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return E.query(e,"SELECT * FROM context_zone_events WHERE project_id = ? ORDER BY id DESC LIMIT ?",e,t).map(n=>({from:n.zone_from,to:n.zone_to,usagePercent:n.usage_percent,timestamp:n.timestamp,action:n.action}))}getSummary(e,t=7){let s=new Date(Date.now()-t*864e5).toISOString(),n=E.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
|
|
490
490
|
WHERE project_id = ? AND timestamp >= ?
|
|
491
491
|
GROUP BY zone_to`,e,s),o={smart:0,warning:0,dumb:0},i=0;for(let u of n)o[u.zone_to]=u.cnt,i+=u.cnt;let c=E.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
|
|
492
|
-
WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},
|
|
493
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.id}getWorkflow(e,t){let s=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}}},Ke=new Gc});import{createHash as zp}from"node:crypto";function mo(r){return zp("sha256").update(r).digest("hex")}function Tn(r){return mo(r).slice(0,16)}function Kp(r){return zp("md5").update(r).digest("hex")}var En=S(()=>{"use strict";l(mo,"sha256");l(Tn,"sha256Short");l(Kp,"md5")});import gi from"node:fs/promises";import Xp from"node:path";function Kk(){return{version:Zn,lastUpdated:"",checksums:{}}}var Zn,qc,Cn,Bc=S(()=>{"use strict";ve();W();X();En();ee();Zn="1.0.0";l(Kk,"getDefaultChecksums");qc=class{static{l(this,"IndexStorage")}getIndexPath(e){return Xp.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await gi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==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 Kk()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return Kp(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let s={version:Zn,lastUpdated:v(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{E.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await gi.readdir(t);await Promise.all(s.map(n=>gi.unlink(Xp.join(t,n))))}catch(s){if(!O(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),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=E.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=E.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Cn=new qc});var Vc,fi,Qt,er=S(()=>{"use strict";X();ee();Vc=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=E.getDb(e),n=v();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=E.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?E.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return E.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},fi=new Vc,Qt=fi});import{z as Xe}from"zod";function em(r,e="default"){let t=Yp[e]||Yp.default;return r/1e3*t}function hi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Xk,Yk,Qp,Zp,Yp,yi=S(()=>{"use strict";Xk=Xe.object({date:Xe.string(),tokensSaved:Xe.number(),syncs:Xe.number(),avgCompressionRate:Xe.number(),totalDuration:Xe.number()}),Yk=Xe.object({agentName:Xe.string(),usageCount:Xe.number(),tokensSaved:Xe.number()}),Qp=Xe.object({totalTokensSaved:Xe.number(),avgCompressionRate:Xe.number(),syncCount:Xe.number(),watchTriggers:Xe.number(),avgSyncDuration:Xe.number(),totalSyncDuration:Xe.number(),agentUsage:Xe.array(Yk),dailyStats:Xe.array(Xk),firstSync:Xe.string(),lastUpdated:Xe.string()}),Zp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Yp={"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(em,"estimateCostSaved");l(hi,"formatCost")});var Jc,Zt,go=S(()=>{"use strict";yi();X();Rs();Jc=class extends dt{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Qp)}getDefault(){return{...Zp}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,m=[...i.dailyStats],p=m.findIndex(x=>x.date===o);if(p>=0){let x=m[p];m[p]={...x,tokensSaved:x.tokensSaved+s,syncs:x.syncs+1,avgCompressionRate:(x.avgCompressionRate*x.syncs+n)/(x.syncs+1),totalDuration:x.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],b=m.filter(x=>x.date>=w),h=[...i.agentUsage];if(t.agents)for(let x of t.agents){let T=h.findIndex(I=>I.agentName===x);T>=0?h[T]={...h[T],usageCount:h[T].usageCount+1,tokensSaved:h[T].tokensSaved+Math.floor(s/t.agents.length)}:h.push({agentName:x,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:h,dailyStats:b,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:em(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Zt=new Jc});import{z as be}from"zod";var Qk,Zk,tm,CA,PA,xA,zs,sm,fo=S(()=>{"use strict";Qk=be.enum(["improving","stable","declining"]),Zk=be.object({sprintNumber:be.number(),startDate:be.string(),endDate:be.string(),pointsCompleted:be.number(),tasksCompleted:be.number(),avgVariance:be.number(),estimationAccuracy:be.number()}),tm=be.object({category:be.string(),avgVariance:be.number(),taskCount:be.number()}),CA=be.object({totalPoints:be.number(),sprints:be.number(),estimatedDate:be.string()}),PA=be.object({sprints:be.array(Zk),averageVelocity:be.number(),velocityTrend:Qk,estimationAccuracy:be.number(),overEstimated:be.array(tm),underEstimated:be.array(tm),lastUpdated:be.string()}),xA=be.object({sprintLengthDays:be.number().min(1).max(90).default(7),startDay:be.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:be.number().min(1).max(52).default(6),accuracyTolerance:be.number().min(0).max(100).default(20)}),zs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},sm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var zc,tr,wi=S(()=>{"use strict";fo();Rs();zc=class extends dt{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:sm,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}},tr=new zc});function Kc(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Xc,je,ho=S(()=>{"use strict";mi();ee();l(Kc,"rowToRule");Xc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=E.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return E.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|
|
494
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),E.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return E.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(E.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!E.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),E.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=E.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Kc(s):null}getRulesForCommand(e,t){let s=Ke.getWorkflow(e,t);return!s||!s.enabled?[]:E.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Kc)}getAllRules(e){return E.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Kc)}resetRules(e){let t=E.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return E.run(e,"DELETE FROM workflow_rules"),t?.c??0}},je=new Xc});import gs from"node:fs/promises";import Qc from"node:path";import{Hono as eS}from"hono";function yo(r){return E.getDoc(r,"project")}async function Yc(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}function nm(){let r=new eS;return r.get("/projects",async e=>{try{await gs.mkdir(sr,{recursive:!0});let s=(await gs.readdir(sr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=yo(o),a=await L.read(o),c=await ce.read(o),u=await $e.read(o),d=await it.read(o),m=a?.currentTask,p=await Yc(m?.startedAt),g=i;return{id:o,name:g?.name||o.slice(0,8),path:g?.repoPath||g?.path||null,stack:g?.stack||null,branch:g?.currentBranch||null,fileCount:g?.fileCount||null,lastSync:g?.lastSync||null,version:g?.version||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(w=>!w.completed)?.length||0,ideasCount:u?.ideas?.filter(w=>w.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0,tasksToday:0,tasksThisWeek:0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:String(o.name||"").localeCompare(String(i.name||""))),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(yo(t)),L.read(t),ce.read(t),$e.read(t),it.read(t)]),c=E.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Yc(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=d)?.length||0,g=o?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=m)?.length||0,w=null;try{let b=E.get(t,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");if(b){let h=JSON.parse(b.analysis);w={architecture:h.architecture,patterns:(h.patterns||[]).slice(0,6),antiPatterns:(h.antiPatterns||[]).slice(0,4),techDebt:(h.techDebt||[]).slice(0,4),conventions:h.conventions,stack:h.stack,analyzedAt:h.analyzedAt,commitHash:h.commitHash}}}catch{}return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},analysis:w,stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(b=>!b.completed)?.length||0,ideasCount:i?.ideas?.filter(b=>b.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([L.read(t),ce.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(m=>typeof m=="string").slice(0,20):[],d=await $e.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await gs.mkdir(sr,{recursive:!0});let s=(await gs.readdir(sr,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await L.read(c),d=await ce.read(c),m=await $e.read(c),p=await it.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await gs.mkdir(sr,{recursive:!0});let n=(await gs.readdir(sr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let m=yo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let m=await L.read(d),p=yo(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Yc(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/queue",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{description:n,priority:o,type:i,section:a}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"description required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"description too long (max 5000 chars)"},400);let c=await ce.addTask(t,{description:n,priority:o||"medium",type:i||"feature",section:a||"active"});return e.json({success:!0,task:c})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await ce.getTask(t,s);if(!n)return e.json({error:"Task not found"},404);let o=uo.getComments(t,s);return e.json({task:n,comments:o})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json().catch(()=>({})),o={};if(n.priority&&typeof n.priority=="string"){if(!["low","medium","high","critical","normal","urgent"].includes(n.priority))return e.json({success:!1,error:"Invalid priority"},400);o.priority=n.priority}if(n.section&&typeof n.section=="string"){if(!["active","backlog","previously_active"].includes(n.section))return e.json({success:!1,error:"Invalid section"},400);o.section=n.section}return typeof n.description=="string"&&(o.description=n.description),typeof n.body=="string"&&(o.body=n.body),typeof n.type=="string"&&(o.type=n.type),Object.keys(o).length>0&&!await ce.updateTask(t,s,o)?e.json({success:!1,error:"Task not found"},404):e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{return await ce.removeTask(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/:taskId/comments",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json(),{content:o,author:i}=n;if(!o?.trim())return e.json({error:"Content required"},400);let a=uo.addComment(t,s,o.trim(),i);return e.json({comment:a})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId/comments/:commentId",async e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{let n=await e.req.json(),{content:o}=n;return o?.trim()?uo.updateComment(t,s,o.trim())?e.json({success:!0}):e.json({error:"Not found"},404):e.json({error:"Content required"},400)}catch(n){return e.json({error:String(n)},500)}}),r.delete("/projects/:id/queue/:taskId/comments/:commentId",e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{return uo.deleteComment(t,s),e.json({success:!0})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{let n=await e.req.json().catch(()=>({})),{priority:o,tags:i}=n;if(o){if(!["low","medium","high"].includes(o))return e.json({success:!1,error:"Invalid priority"},400);await $e.setPriority(t,s,o)}if(i&&Array.isArray(i)){let a=i.filter(c=>typeof c=="string").slice(0,20);a.length>0&&await $e.addTags(t,s,a)}return e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await $e.removeIdea(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas/:ideaId/archive",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await $e.archive(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id/task",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{description:n,type:o,branch:i}=s,a={};return n&&typeof n=="string"&&(a.description=n),o&&typeof o=="string"&&(a.type=o),i&&typeof i=="string"&&(a.branch=i),Object.keys(a).length===0?e.json({success:!1,error:"No valid fields to update"},400):await L.updateCurrentTask(t,a)?e.json({success:!0}):e.json({success:!1,error:"No active task"},400)}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{name:n,description:o,stack:i,techStack:a,repoPath:c}=s,u=A.getGlobalProjectPath(t),d=Qc.join(u,"project.json"),m={};try{let p=await gs.readFile(d,"utf-8");m=JSON.parse(p)}catch{m={projectId:t}}return n!==void 0&&(m.name=n),o!==void 0&&(m.description=o),i!==void 0&&(m.stack=i),a!==void 0&&(m.techStack=a),c!==void 0&&(m.repoPath=c),await gs.mkdir(Qc.dirname(d),{recursive:!0}),await gs.writeFile(d,JSON.stringify(m,null,2)),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id",async e=>{let t=e.req.param("id");try{E.close(t);let s=A.getGlobalProjectPath(t);return await gs.rm(s,{recursive:!0,force:!0}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflow-graph",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"workflow-graph");return e.json({edges:s?.edges||[]})}catch{return e.json({edges:[]})}}),r.put("/projects/:id/workflow-graph",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{edges:n}=s;return E.setDoc(t,"workflow-graph",{edges:n||[]}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflows",e=>{let t=e.req.param("id");try{let s=Ke.getAllWorkflows(t),n=je.getAllRules(t);return e.json({workflows:s,rules:n})}catch{return e.json({workflows:[],rules:[]})}}),r.patch("/projects/:id/workflows/:name",async e=>{let{id:t,name:s}=e.req.param();try{let n=await e.req.json().catch(()=>({})),{enabled:o}=n,i=Ke.getWorkflow(t,s);return i?(Ke.updateWorkflow(t,s,{enabled:o??!i.enabled}),e.json({success:!0})):e.json({success:!1,error:"Workflow not found"},404)}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/workflow-rules",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{type:n,command:o,position:i,action:a,description:c,enabled:u,timeoutMs:d}=s,m=je.addRule(t,{type:n,command:o,position:i,action:a,description:c||null,enabled:u??!0,timeoutMs:d??3e4,createdAt:new Date().toISOString(),sortOrder:0});return e.json({success:!0,id:m})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.patch("/projects/:id/workflow-rules/:ruleId",async e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{let n=await e.req.json();return je.updateRule(t,s,n),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.delete("/projects/:id/workflow-rules/:ruleId",e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{return je.removeRule(t,s),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/projects/:id/metrics",async e=>{let t=e.req.param("id");try{let s=await Zt.getSummary(t),n=await Zt.getDailyStats(t,90);return e.json({...s,dailyStats:n})}catch{return e.json({totalTokensSaved:0,avgCompressionRate:0,syncCount:0,dailyStats:[]})}}),r.get("/projects/:id/velocity",async e=>{let t=e.req.param("id");try{let s=await tr.getMetrics(t);return e.json(s)}catch{return e.json({averageVelocity:0,velocityTrend:"stable",sprints:[]})}}),r.get("/projects/:id/analysis/full",e=>{let t=e.req.param("id");try{let s=fi.getActive(t),n=fi.getHistory(t,10);return e.json({analysis:s,history:n})}catch{return e.json({analysis:null,history:[]})}}),r.get("/projects/:id/index",async e=>{let t=e.req.param("id");try{let s=await Cn.readIndex(t),n=await Cn.readDomains(t),o=await Cn.readScores(t),i=await Cn.readCategories(t);return e.json({index:s,domains:n,scores:o?.slice(0,100),categories:i})}catch{return e.json({index:null,domains:null,scores:[],categories:null})}}),r.get("/projects/:id/archives",e=>{let t=e.req.param("id"),s=e.req.query("type")||void 0,n=Number(e.req.query("limit"))||50;try{let o=Rt.getArchived(t,s,n),i=Rt.getStats(t);return e.json({items:o,stats:i})}catch{return e.json({items:[],stats:{total:0,byType:{}}})}}),r.get("/projects/:id/context-health",e=>{let t=e.req.param("id");try{let s=po.getSummary(t,30),n=po.getTransitions(t,50);return e.json({summary:s,transitions:n})}catch{return e.json({summary:null,transitions:[]})}}),r.get("/projects/:id/context-feedback",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM context_feedback ORDER BY created_at DESC LIMIT 50");return e.json({feedback:s})}catch{return e.json({feedback:[]})}}),r.get("/projects/:id/state/full",async e=>{let t=e.req.param("id");try{let s=await L.read(t);return e.json(s)}catch{return e.json({currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""})}}),r.get("/projects/:id/events",e=>{let t=e.req.param("id"),s=Number(e.req.query("limit"))||100,n=Number(e.req.query("offset"))||0,o=e.req.query("type")||void 0;try{let i=o?E.query(t,"SELECT * FROM events WHERE type = ? ORDER BY timestamp DESC LIMIT ? OFFSET ?",o,s,n):E.query(t,"SELECT * FROM events ORDER BY timestamp DESC LIMIT ? OFFSET ?",s,n),a=E.get(t,"SELECT COUNT(*) as c FROM events");return e.json({events:i,total:a?.c||0,limit:s,offset:n})}catch{return e.json({events:[],total:0})}}),r.get("/projects/:id/memory",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM memory ORDER BY updated_at DESC LIMIT 200");return e.json({items:s})}catch{return e.json({items:[]})}}),r.get("/projects/:id/sessions",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM sessions ORDER BY started_at DESC LIMIT 50"),n=E.query(t,"SELECT * FROM agent_sessions ORDER BY started_at DESC LIMIT 50");return e.json({sessions:s,agentSessions:n})}catch{return e.json({sessions:[],agentSessions:[]})}}),r.get("/projects/:id/tasks",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM tasks ORDER BY started_at DESC LIMIT 100"),n=E.query(t,"SELECT * FROM subtasks ORDER BY sort_order ASC");return e.json({tasks:s,subtasks:n})}catch{return e.json({tasks:[],subtasks:[]})}}),r.get("/projects/:id/kv",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT key, value FROM kv_store ORDER BY key"),n={};for(let o of s)try{n[o.key]=JSON.parse(o.value)}catch{n[o.key]=o.value}return e.json(n)}catch{return e.json({})}}),r.get("/projects/:id/issues",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"issues");return e.json({issues:s?.issues||[]})}catch{return e.json({issues:[]})}}),r.get("/projects/:id/roadmap",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"roadmap");return e.json(s||{features:[],backlog:[]})}catch{return e.json({features:[],backlog:[]})}}),r.get("/projects/:id/config",async e=>{let t=e.req.param("id");try{let s=yo(t);return e.json(s||{projectId:t})}catch{return e.json({projectId:t})}}),r}var tS,sr,rm=S(()=>{"use strict";ve();qs();Jp();Wc();mi();ee();Vs();Bc();er();go();Vt();Js();St();wi();ho();tS=A.getGlobalBasePath(),sr=Qc.join(tS,"projects");l(yo,"getProjectConfig");l(Yc,"calculateDuration");l(nm,"createExtendedRoutes")});var om=S(()=>{"use strict"});import{streamSSE as sS}from"hono/streaming";function am(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>im&&t(i)},nS),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return sS(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,w)=>{i.writeSSE({event:g,data:JSON.stringify(w)})},"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)}},rS),p=setTimeout(()=>{t(a)},im);typeof m=="object"&&"unref"in m&&m.unref(),typeof p=="object"&&"unref"in p&&p.unref(),r.set(a,{client:d,heartbeatInterval:m,ttlTimeout:p,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}var im,nS,rS,cm=S(()=>{"use strict";om();im=3600*1e3,nS=300*1e3,rS=3e4;l(am,"createSSEManager")});var lm={};Se(lm,{DEFAULT_PORT:()=>Si,createServer:()=>ki,startServer:()=>lS});import Zc from"node:fs";import Ks from"node:path";import{Hono as oS}from"hono";import{cors as iS}from"hono/cors";import{logger as aS}from"hono/logger";import{secureHeaders as cS}from"hono/secure-headers";function ki(r){let e=new oS,t=am();e.use("*",cS()),r.enableCors!==!1&&e.use("*",iS({origin:l(c=>{if(!c)return c;try{let u=new URL(c);return u.hostname==="localhost"||u.hostname==="127.0.0.1"?c:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",aS()),e.get("/health",c=>c.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/api",c=>c.json({name:"prjct-cli",version:we,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=Bp(r.projectId,r.projectPath);e.route("/api",s);let n=nm();e.route("/api",n),e.get("/api/events",c=>t.handleConnection(c));let i=[Ks.resolve(__dirname,"..","dist","web"),Ks.resolve(__dirname,"..","..","dist","web"),Ks.resolve(process.cwd(),"dist","web"),Ks.resolve(__dirname,"..","web")].find(c=>Zc.existsSync(Ks.join(c,"index.html")))||null;if(i){let c={".html":"text/html",".js":"application/javascript",".css":"text/css",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2"};e.get("/assets/*",async u=>{let d=Ks.join(i,u.req.path);try{let m=Zc.readFileSync(d),p=Ks.extname(d);return new Response(m,{headers:{"Content-Type":c[p]||"application/octet-stream","Cache-Control":"public, max-age=31536000, immutable"}})}catch{return u.notFound()}}),e.get("*",u=>{if(u.req.path.startsWith("/api"))return u.notFound();try{let d=Zc.readFileSync(Ks.join(i,"index.html"),"utf-8");return u.html(d)}catch{return u.json({error:"Dashboard not built. Run: cd web && bun run build"},404)}})}let a=null;return{app:e,async start(){let c=r.port,u=r.host||"0.0.0.0";if(fn())a=Bun.serve({port:c,hostname:u,fetch:e.fetch});else{let{serve:d}=await import("@hono/node-server"),m=d({fetch:e.fetch,port:c,hostname:u});a={stop:l(()=>m.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${u}:${c}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${fn()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${c}`)},stop(){t.shutdown(),a&&(a.stop(),a=null,console.log("Server stopped"))},broadcast(c,u){t.broadcast(c,u)}}}async function lS(r,e,t=Si){let s=ki({port:t,projectId:r,projectPath:e});return await s.start(),s}var Si,el=S(()=>{"use strict";so();ut();Vp();rm();cm();l(ki,"createServer");Si=3478;l(lS,"startServer")});import Pn from"chalk";var um,uS,dS,es,dm=S(()=>{"use strict";lt();um=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],uS=80,dS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:um,speed:uS},cli:{header:l(()=>`${Pn.cyan.bold("\u26A1")} ${Pn.cyan("prjct")}`,"header"),footer:l(()=>Pn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Pn.cyan("\u26A1")} ${Pn.cyan("prjct")} ${Pn.cyan(um[r%10])} ${Pn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>Yo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Yo(r).signature,"getSignature")},es=dS});function nr(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return pS[r]}var me,tl,sl,bi,pS,Jt,pm,xn=S(()=>{"use strict";me={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},tl=["feature","spec","design","refactor","migrate"],sl=["ship","cleanup","git","migrate"],bi=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],pS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(nr,"getTimeout");Jt={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},pm={HISTORY_MAX:100}});var wo,nl=S(()=>{"use strict";wo={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 jn(r,e){return{...wo[r],...e}}function rr(r,e,t){return{message:r,hint:e,...t}}var ko=S(()=>{"use strict";nl();nl();l(jn,"getError");l(rr,"createError")});var gm={};Se(gm,{ERRORS:()=>wo,ICONS:()=>Xs,OUTPUT_TIERS:()=>mm,createError:()=>rr,default:()=>f,formatForHuman:()=>yS,getError:()=>jn,getOutputTier:()=>gS,getTierConfig:()=>Ti,isQuietMode:()=>hS,limitLines:()=>vi,setOutputTier:()=>mS,setQuietMode:()=>fS});import pe from"chalk";function mS(r){ir=r}function gS(){return ir}function Ti(){return mm[ir]}function fS(r){At=r}function hS(){return At}function vi(r,e){let t=e??Ti().maxLines;if(t===1/0||t===0)return r;let s=r.split(`
|
|
492
|
+
WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},lo=new Nc});var Fc,Xe,li=S(()=>{"use strict";ee();Fc=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)
|
|
493
|
+
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=N.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.id}getWorkflow(e,t){let s=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}}},Xe=new Fc});import{createHash as Fm}from"node:crypto";function uo(r){return Fm("sha256").update(r).digest("hex")}function vn(r){return uo(r).slice(0,16)}function Um(r){return Fm("md5").update(r).digest("hex")}var Tn=S(()=>{"use strict";l(uo,"sha256");l(vn,"sha256Short");l(Um,"md5")});import ui from"node:fs/promises";import Hm from"node:path";function Vk(){return{version:Zn,lastUpdated:"",checksums:{}}}var Zn,Uc,En,Hc=S(()=>{"use strict";ve();W();K();Tn();ee();Zn="1.0.0";l(Vk,"getDefaultChecksums");Uc=class{static{l(this,"IndexStorage")}getIndexPath(e){return Hm.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await ui.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 Vk()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await ui.readFile(e);return Um(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let s={version:Zn,lastUpdated:v(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{E.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await ui.readdir(t);await Promise.all(s.map(n=>ui.unlink(Hm.join(t,n))))}catch(s){if(!O(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),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=E.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=E.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},En=new Uc});var Wc,di,Qt,er=S(()=>{"use strict";K();ee();Wc=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=E.getDb(e),n=v();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=E.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?E.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return E.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},di=new Wc,Qt=di});import{z as Ke}from"zod";function Bm(r,e="default"){let t=Wm[e]||Wm.default;return r/1e3*t}function mi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Jk,zk,Gm,qm,Wm,pi=S(()=>{"use strict";Jk=Ke.object({date:Ke.string(),tokensSaved:Ke.number(),syncs:Ke.number(),avgCompressionRate:Ke.number(),totalDuration:Ke.number()}),zk=Ke.object({agentName:Ke.string(),usageCount:Ke.number(),tokensSaved:Ke.number()}),Gm=Ke.object({totalTokensSaved:Ke.number(),avgCompressionRate:Ke.number(),syncCount:Ke.number(),watchTriggers:Ke.number(),avgSyncDuration:Ke.number(),totalSyncDuration:Ke.number(),agentUsage:Ke.array(zk),dailyStats:Ke.array(Jk),firstSync:Ke.string(),lastUpdated:Ke.string()}),qm={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Wm={"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(Bm,"estimateCostSaved");l(mi,"formatCost")});var Gc,Zt,mo=S(()=>{"use strict";pi();K();As();Gc=class extends dt{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Gm)}getDefault(){return{...qm}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,p=[...i.dailyStats],m=p.findIndex(x=>x.date===o);if(m>=0){let x=p[m];p[m]={...x,tokensSaved:x.tokensSaved+s,syncs:x.syncs+1,avgCompressionRate:(x.avgCompressionRate*x.syncs+n)/(x.syncs+1),totalDuration:x.totalDuration+t.duration}}else p.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let w=g.toISOString().split("T")[0],b=p.filter(x=>x.date>=w),h=[...i.agentUsage];if(t.agents)for(let x of t.agents){let T=h.findIndex(I=>I.agentName===x);T>=0?h[T]={...h[T],usageCount:h[T].usageCount+1,tokensSaved:h[T].tokensSaved+Math.floor(s/t.agents.length)}:h.push({agentName:x,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:h,dailyStats:b,firstSync:i.firstSync||v(),lastUpdated:v()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Bm(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Zt=new Gc});import{z as be}from"zod";var Xk,Kk,Vm,xA,jA,RA,Xs,Jm,po=S(()=>{"use strict";Xk=be.enum(["improving","stable","declining"]),Kk=be.object({sprintNumber:be.number(),startDate:be.string(),endDate:be.string(),pointsCompleted:be.number(),tasksCompleted:be.number(),avgVariance:be.number(),estimationAccuracy:be.number()}),Vm=be.object({category:be.string(),avgVariance:be.number(),taskCount:be.number()}),xA=be.object({totalPoints:be.number(),sprints:be.number(),estimatedDate:be.string()}),jA=be.object({sprints:be.array(Kk),averageVelocity:be.number(),velocityTrend:Xk,estimationAccuracy:be.number(),overEstimated:be.array(Vm),underEstimated:be.array(Vm),lastUpdated:be.string()}),RA=be.object({sprintLengthDays:be.number().min(1).max(90).default(7),startDay:be.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:be.number().min(1).max(52).default(6),accuracyTolerance:be.number().min(0).max(100).default(20)}),Xs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Jm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var qc,tr,gi=S(()=>{"use strict";po();As();qc=class extends dt{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Jm,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}},tr=new qc});function Bc(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Vc,je,go=S(()=>{"use strict";li();ee();l(Bc,"rowToRule");Vc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=E.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return E.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|
|
494
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),E.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return E.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(E.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!E.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 p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),E.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=E.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Bc(s):null}getRulesForCommand(e,t){let s=Xe.getWorkflow(e,t);return!s||!s.enabled?[]:E.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Bc)}getAllRules(e){return E.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Bc)}resetRules(e){let t=E.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return E.run(e,"DELETE FROM workflow_rules"),t?.c??0}},je=new Vc});import gs from"node:fs/promises";import zc from"node:path";import{Hono as Yk}from"hono";function fo(r){return E.getDoc(r,"project")}async function Jc(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}function zm(){let r=new Yk;return r.get("/projects",async e=>{try{await gs.mkdir(sr,{recursive:!0});let s=(await gs.readdir(sr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=fo(o),a=await L.read(o),c=await ce.read(o),u=await $e.read(o),d=await it.read(o),p=a?.currentTask,m=await Jc(p?.startedAt),g=i;return{id:o,name:g?.name||o.slice(0,8),path:g?.repoPath||g?.path||null,stack:g?.stack||null,branch:g?.currentBranch||null,fileCount:g?.fileCount||null,lastSync:g?.lastSync||null,version:g?.version||null,currentTask:p?{...p,duration:m}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(w=>!w.completed)?.length||0,ideasCount:u?.ideas?.filter(w=>w.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0,tasksToday:0,tasksThisWeek:0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:String(o.name||"").localeCompare(String(i.name||""))),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(fo(t)),L.read(t),ce.read(t),$e.read(t),it.read(t)]),c=E.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Jc(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=d)?.length||0,g=o?.tasks?.filter(b=>!b.completed||!b.completedAt?!1:new Date(b.completedAt)>=p)?.length||0,w=null;try{let b=E.get(t,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");if(b){let h=JSON.parse(b.analysis);w={architecture:h.architecture,patterns:(h.patterns||[]).slice(0,6),antiPatterns:(h.antiPatterns||[]).slice(0,4),techDebt:(h.techDebt||[]).slice(0,4),conventions:h.conventions,stack:h.stack,analyzedAt:h.analyzedAt,commitHash:h.commitHash}}}catch{}return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},analysis:w,stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(b=>!b.completed)?.length||0,ideasCount:i?.ideas?.filter(b=>b.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await L.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await L.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await L.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([L.read(t),ce.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await $e.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await gs.mkdir(sr,{recursive:!0});let s=(await gs.readdir(sr,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await L.read(c),d=await ce.read(c),p=await $e.read(c),m=await it.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await gs.mkdir(sr,{recursive:!0});let n=(await gs.readdir(sr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=fo(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await L.read(d),m=fo(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await Jc(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/queue",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{description:n,priority:o,type:i,section:a}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"description required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"description too long (max 5000 chars)"},400);let c=await ce.addTask(t,{description:n,priority:o||"medium",type:i||"feature",section:a||"active"});return e.json({success:!0,task:c})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await ce.getTask(t,s);if(!n)return e.json({error:"Task not found"},404);let o=co.getComments(t,s);return e.json({task:n,comments:o})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json().catch(()=>({})),o={};if(n.priority&&typeof n.priority=="string"){if(!["low","medium","high","critical","normal","urgent"].includes(n.priority))return e.json({success:!1,error:"Invalid priority"},400);o.priority=n.priority}if(n.section&&typeof n.section=="string"){if(!["active","backlog","previously_active"].includes(n.section))return e.json({success:!1,error:"Invalid section"},400);o.section=n.section}return typeof n.description=="string"&&(o.description=n.description),typeof n.body=="string"&&(o.body=n.body),typeof n.type=="string"&&(o.type=n.type),Object.keys(o).length>0&&!await ce.updateTask(t,s,o)?e.json({success:!1,error:"Task not found"},404):e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/queue/:taskId",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{return await ce.removeTask(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/:taskId/comments",async e=>{let t=e.req.param("id"),s=e.req.param("taskId");try{let n=await e.req.json(),{content:o,author:i}=n;if(!o?.trim())return e.json({error:"Content required"},400);let a=co.addComment(t,s,o.trim(),i);return e.json({comment:a})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/queue/:taskId/comments/:commentId",async e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{let n=await e.req.json(),{content:o}=n;return o?.trim()?co.updateComment(t,s,o.trim())?e.json({success:!0}):e.json({error:"Not found"},404):e.json({error:"Content required"},400)}catch(n){return e.json({error:String(n)},500)}}),r.delete("/projects/:id/queue/:taskId/comments/:commentId",e=>{let t=e.req.param("id"),s=e.req.param("commentId");try{return co.deleteComment(t,s),e.json({success:!0})}catch(n){return e.json({error:String(n)},500)}}),r.patch("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{let n=await e.req.json().catch(()=>({})),{priority:o,tags:i}=n;if(o){if(!["low","medium","high"].includes(o))return e.json({success:!1,error:"Invalid priority"},400);await $e.setPriority(t,s,o)}if(i&&Array.isArray(i)){let a=i.filter(c=>typeof c=="string").slice(0,20);a.length>0&&await $e.addTags(t,s,a)}return e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id/ideas/:ideaId",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await $e.removeIdea(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas/:ideaId/archive",async e=>{let t=e.req.param("id"),s=e.req.param("ideaId");try{return await $e.archive(t,s),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id/task",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{description:n,type:o,branch:i}=s,a={};return n&&typeof n=="string"&&(a.description=n),o&&typeof o=="string"&&(a.type=o),i&&typeof i=="string"&&(a.branch=i),Object.keys(a).length===0?e.json({success:!1,error:"No valid fields to update"},400):await L.updateCurrentTask(t,a)?e.json({success:!0}):e.json({success:!1,error:"No active task"},400)}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.patch("/projects/:id",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),{name:n,description:o,stack:i,techStack:a,repoPath:c}=s,u=A.getGlobalProjectPath(t),d=zc.join(u,"project.json"),p={};try{let m=await gs.readFile(d,"utf-8");p=JSON.parse(m)}catch{p={projectId:t}}return n!==void 0&&(p.name=n),o!==void 0&&(p.description=o),i!==void 0&&(p.stack=i),a!==void 0&&(p.techStack=a),c!==void 0&&(p.repoPath=c),await gs.mkdir(zc.dirname(d),{recursive:!0}),await gs.writeFile(d,JSON.stringify(p,null,2)),e.json({success:!0})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.delete("/projects/:id",async e=>{let t=e.req.param("id");try{E.close(t);let s=A.getGlobalProjectPath(t);return await gs.rm(s,{recursive:!0,force:!0}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflow-graph",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"workflow-graph");return e.json({edges:s?.edges||[]})}catch{return e.json({edges:[]})}}),r.put("/projects/:id/workflow-graph",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{edges:n}=s;return E.setDoc(t,"workflow-graph",{edges:n||[]}),e.json({success:!0})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/projects/:id/workflows",e=>{let t=e.req.param("id");try{let s=Xe.getAllWorkflows(t),n=je.getAllRules(t);return e.json({workflows:s,rules:n})}catch{return e.json({workflows:[],rules:[]})}}),r.patch("/projects/:id/workflows/:name",async e=>{let{id:t,name:s}=e.req.param();try{let n=await e.req.json().catch(()=>({})),{enabled:o}=n,i=Xe.getWorkflow(t,s);return i?(Xe.updateWorkflow(t,s,{enabled:o??!i.enabled}),e.json({success:!0})):e.json({success:!1,error:"Workflow not found"},404)}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/workflow-rules",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{type:n,command:o,position:i,action:a,description:c,enabled:u,timeoutMs:d}=s,p=je.addRule(t,{type:n,command:o,position:i,action:a,description:c||null,enabled:u??!0,timeoutMs:d??3e4,createdAt:new Date().toISOString(),sortOrder:0});return e.json({success:!0,id:p})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.patch("/projects/:id/workflow-rules/:ruleId",async e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{let n=await e.req.json();return je.updateRule(t,s,n),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.delete("/projects/:id/workflow-rules/:ruleId",e=>{let t=e.req.param("id"),s=Number(e.req.param("ruleId"));try{return je.removeRule(t,s),e.json({success:!0})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/projects/:id/metrics",async e=>{let t=e.req.param("id");try{let s=await Zt.getSummary(t),n=await Zt.getDailyStats(t,90);return e.json({...s,dailyStats:n})}catch{return e.json({totalTokensSaved:0,avgCompressionRate:0,syncCount:0,dailyStats:[]})}}),r.get("/projects/:id/velocity",async e=>{let t=e.req.param("id");try{let s=await tr.getMetrics(t);return e.json(s)}catch{return e.json({averageVelocity:0,velocityTrend:"stable",sprints:[]})}}),r.get("/projects/:id/analysis/full",e=>{let t=e.req.param("id");try{let s=di.getActive(t),n=di.getHistory(t,10);return e.json({analysis:s,history:n})}catch{return e.json({analysis:null,history:[]})}}),r.get("/projects/:id/index",async e=>{let t=e.req.param("id");try{let s=await En.readIndex(t),n=await En.readDomains(t),o=await En.readScores(t),i=await En.readCategories(t);return e.json({index:s,domains:n,scores:o?.slice(0,100),categories:i})}catch{return e.json({index:null,domains:null,scores:[],categories:null})}}),r.get("/projects/:id/archives",e=>{let t=e.req.param("id"),s=e.req.query("type")||void 0,n=Number(e.req.query("limit"))||50;try{let o=Rt.getArchived(t,s,n),i=Rt.getStats(t);return e.json({items:o,stats:i})}catch{return e.json({items:[],stats:{total:0,byType:{}}})}}),r.get("/projects/:id/context-health",e=>{let t=e.req.param("id");try{let s=lo.getSummary(t,30),n=lo.getTransitions(t,50);return e.json({summary:s,transitions:n})}catch{return e.json({summary:null,transitions:[]})}}),r.get("/projects/:id/context-feedback",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM context_feedback ORDER BY created_at DESC LIMIT 50");return e.json({feedback:s})}catch{return e.json({feedback:[]})}}),r.get("/projects/:id/state/full",async e=>{let t=e.req.param("id");try{let s=await L.read(t);return e.json(s)}catch{return e.json({currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""})}}),r.get("/projects/:id/events",e=>{let t=e.req.param("id"),s=Number(e.req.query("limit"))||100,n=Number(e.req.query("offset"))||0,o=e.req.query("type")||void 0;try{let i=o?E.query(t,"SELECT * FROM events WHERE type = ? ORDER BY timestamp DESC LIMIT ? OFFSET ?",o,s,n):E.query(t,"SELECT * FROM events ORDER BY timestamp DESC LIMIT ? OFFSET ?",s,n),a=E.get(t,"SELECT COUNT(*) as c FROM events");return e.json({events:i,total:a?.c||0,limit:s,offset:n})}catch{return e.json({events:[],total:0})}}),r.get("/projects/:id/memory",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM memory ORDER BY updated_at DESC LIMIT 200");return e.json({items:s})}catch{return e.json({items:[]})}}),r.get("/projects/:id/sessions",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM sessions ORDER BY started_at DESC LIMIT 50"),n=E.query(t,"SELECT * FROM agent_sessions ORDER BY started_at DESC LIMIT 50");return e.json({sessions:s,agentSessions:n})}catch{return e.json({sessions:[],agentSessions:[]})}}),r.get("/projects/:id/tasks",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT * FROM tasks ORDER BY started_at DESC LIMIT 100"),n=E.query(t,"SELECT * FROM subtasks ORDER BY sort_order ASC");return e.json({tasks:s,subtasks:n})}catch{return e.json({tasks:[],subtasks:[]})}}),r.get("/projects/:id/kv",e=>{let t=e.req.param("id");try{let s=E.query(t,"SELECT key, value FROM kv_store ORDER BY key"),n={};for(let o of s)try{n[o.key]=JSON.parse(o.value)}catch{n[o.key]=o.value}return e.json(n)}catch{return e.json({})}}),r.get("/projects/:id/issues",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"issues");return e.json({issues:s?.issues||[]})}catch{return e.json({issues:[]})}}),r.get("/projects/:id/roadmap",e=>{let t=e.req.param("id");try{let s=E.getDoc(t,"roadmap");return e.json(s||{features:[],backlog:[]})}catch{return e.json({features:[],backlog:[]})}}),r.get("/projects/:id/config",async e=>{let t=e.req.param("id");try{let s=fo(t);return e.json(s||{projectId:t})}catch{return e.json({projectId:t})}}),r}var Qk,sr,Xm=S(()=>{"use strict";ve();Bs();Lm();Lc();li();ee();Js();Hc();er();mo();Vt();zs();vt();gi();go();Qk=A.getGlobalBasePath(),sr=zc.join(Qk,"projects");l(fo,"getProjectConfig");l(Jc,"calculateDuration");l(zm,"createExtendedRoutes")});import{streamSSE as Zk}from"hono/streaming";function Ym(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Km&&t(i)},eS),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return Zk(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,w)=>{i.writeSSE({event:g,data:JSON.stringify(w)})},"send"),close:l(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},tS),m=setTimeout(()=>{t(a)},Km);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}var Km,eS,tS,Qm=S(()=>{"use strict";Km=60*60*1e3,eS=5*60*1e3,tS=3e4;l(Ym,"createSSEManager")});var Zm={};ye(Zm,{DEFAULT_PORT:()=>hi,createServer:()=>fi,startServer:()=>iS});import Xc from"node:fs";import Ks from"node:path";import{Hono as sS}from"hono";import{cors as nS}from"hono/cors";import{logger as rS}from"hono/logger";import{secureHeaders as oS}from"hono/secure-headers";function fi(r){let e=new sS,t=Ym();e.use("*",oS()),r.enableCors!==!1&&e.use("*",nS({origin:l(c=>{if(!c)return c;try{let u=new URL(c);return u.hostname==="localhost"||u.hostname==="127.0.0.1"?c:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",rS()),e.get("/health",c=>c.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/api",c=>c.json({name:"prjct-cli",version:ke,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=_m(r.projectId,r.projectPath);e.route("/api",s);let n=zm();e.route("/api",n),e.get("/api/events",c=>t.handleConnection(c));let i=[Ks.resolve(__dirname,"..","dist","web"),Ks.resolve(__dirname,"..","..","dist","web"),Ks.resolve(process.cwd(),"dist","web"),Ks.resolve(__dirname,"..","web")].find(c=>Xc.existsSync(Ks.join(c,"index.html")))||null;if(i){let c={".html":"text/html",".js":"application/javascript",".css":"text/css",".json":"application/json",".svg":"image/svg+xml",".png":"image/png",".ico":"image/x-icon",".woff2":"font/woff2"};e.get("/assets/*",async u=>{let d=Ks.join(i,u.req.path);try{let p=Xc.readFileSync(d),m=Ks.extname(d);return new Response(p,{headers:{"Content-Type":c[m]||"application/octet-stream","Cache-Control":"public, max-age=31536000, immutable"}})}catch{return u.notFound()}}),e.get("*",u=>{if(u.req.path.startsWith("/api"))return u.notFound();try{let d=Xc.readFileSync(Ks.join(i,"index.html"),"utf-8");return u.html(d)}catch{return u.json({error:"Dashboard not built. Run: cd web && bun run build"},404)}})}let a=null;return{app:e,async start(){let c=r.port,u=r.host||"0.0.0.0";if(gn())a=Bun.serve({port:c,hostname:u,fetch:e.fetch});else{let{serve:d}=await import("@hono/node-server"),p=d({fetch:e.fetch,port:c,hostname:u});a={stop:l(()=>p.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${u}:${c}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${gn()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${c}`)},stop(){t.shutdown(),a&&(a.stop(),a=null,console.log("Server stopped"))},broadcast(c,u){t.broadcast(c,u)}}}async function iS(r,e,t=hi){let s=fi({port:t,projectId:r,projectPath:e});return await s.start(),s}var hi,Kc=S(()=>{"use strict";eo();ut();Nm();Xm();Qm();l(fi,"createServer");hi=3478;l(iS,"startServer")});import Cn from"chalk";var ep,aS,cS,es,tp=S(()=>{"use strict";lt();ep=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],aS=80,cS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:ep,speed:aS},cli:{header:l(()=>`${Cn.cyan.bold("\u26A1")} ${Cn.cyan("prjct")}`,"header"),footer:l(()=>Cn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Cn.cyan("\u26A1")} ${Cn.cyan("prjct")} ${Cn.cyan(ep[r%10])} ${Cn.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:l((r="claude")=>Jo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Jo(r).signature,"getSignature")},es=cS});function nr(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return lS[r]}var pe,Yc,Qc,yi,lS,Jt,sp,Pn=S(()=>{"use strict";pe={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},Yc=["feature","spec","design","refactor","migrate"],Qc=["ship","cleanup","git","migrate"],yi=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],lS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(nr,"getTimeout");Jt={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},sp={HISTORY_MAX:100}});var np,rp=S(()=>{"use strict";np={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 ho(r,e){return{...np[r],...e}}function wi(r,e,t){return{message:r,hint:e,...t}}var ki=S(()=>{"use strict";rp();l(ho,"getError");l(wi,"createError")});var ip={};ye(ip,{ICONS:()=>Ys,OUTPUT_TIERS:()=>op,default:()=>f,formatForHuman:()=>gS,getOutputTier:()=>dS,getTierConfig:()=>bi,isQuietMode:()=>pS,limitLines:()=>Si,setOutputTier:()=>uS,setQuietMode:()=>mS});import me from"chalk";function uS(r){or=r}function dS(){return or}function bi(){return op[or]}function mS(r){At=r}function pS(){return At}function Si(r,e){let t=e??bi().maxLines;if(t===1/0||t===0)return r;let s=r.split(`
|
|
495
495
|
`);if(s.length<=t)return r;let n=s.slice(0,t),o=s.length-t;return`${n.join(`
|
|
496
496
|
`)}
|
|
497
|
-
${
|
|
498
|
-
`),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${zt(String(a.title),Jt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(
|
|
499
|
-
`)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?
|
|
500
|
-
`),e.maxLines):
|
|
501
|
-
`),this))},done(r,e){if(this.stop(),!At){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=
|
|
502
|
-
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(
|
|
503
|
-
${
|
|
504
|
-
`),this)},progress(r,e,t){if(At)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=
|
|
505
|
-
`),this)}},f=kS});var ym={};Se(ym,{default:()=>bS,sessionTracker:()=>Ys});var fm,hm,il,Ys,bS,Ei=S(()=>{"use strict";ro();ee();kn();X();fm=50,hm=200,il=class{static{l(this,"SessionTracker")}async read(e){try{return E.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){E.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Hs(e.lastActivity,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 n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>fm&&(n.current.commands=n.current.commands.slice(-fm)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>hm&&(n.current.files=n.current.files.slice(-hm)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),m=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:xt(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:xt(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}},Ys=new il,bS=Ys});var km={};Se(km,{default:()=>Rn,performanceTracker:()=>wm});var vS,al,wm,Rn,Ci=S(()=>{"use strict";ee();vS=BigInt(300*1e9),al=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>vS&&this.marks.delete(t)}recordTiming(e,t,s,n){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),n=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of n)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 n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,w)=>g+w,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=n.filter(p=>"metric"in p&&p.metric==="heap_used"),c=n.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),w=c.map(b=>b.value);o.memory={avgHeapMB:p(g.reduce((b,h)=>b+h,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:w.length>0?p(w.reduce((b,h)=>b+h,0)/w.length):0}}let u=n.filter(p=>"metric"in p&&p.metric==="context_correctness");if(u.length>0){let p=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:p,rate:Math.round(p/u.length*100)}}let d=n.filter(p=>"metric"in p&&p.metric==="subtask_handoff");if(d.length>0){let p=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:p,rate:Math.round(p/d.length*100)}}let m=n.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let w=g.context?.command||"unknown";p[w]||(p[w]=[]),p[w].push(g.value)}o.commandDurations={};for(let[g,w]of Object.entries(p))o.commandDurations[g]={avg:Math.round(w.reduce((b,h)=>b+h,0)/w.length),min:Math.min(...w),max:Math.max(...w),count:w.length,unit:"ms"}}return o}},wm=new al,Rn=wm});import Pi from"node:fs/promises";var cl,TS,An,xi=S(()=>{"use strict";Te();ve();W();kn();B();cl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Bn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await $.getProjectId(e),n=A.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:A.getFilePath(s,"core","now.md"),next:A.getFilePath(s,"core","next.md"),context:A.getFilePath(s,"core","context.md"),shipped:A.getFilePath(s,"progress","shipped.md"),metrics:A.getFilePath(s,"progress","metrics.md"),ideas:A.getFilePath(s,"planning","ideas.md"),roadmap:A.getFilePath(s,"planning","roadmap.md"),specs:A.getFilePath(s,"planning","specs"),memory:A.getFilePath(s,"memory","context.jsonl"),patterns:A.getFilePath(s,"memory","patterns.json"),analysis:A.getFilePath(s,"analysis","repo-summary.md"),codePatterns:A.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Pi.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(O(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([Pi.readFile(d,"utf-8"),Pi.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(O(m))return{key:u,filePath:d,content:null,mtime:null};throw m}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:m,mtime:p}of c)s[u]=m,this._cache.set(d,{content:m,mtime:p})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await Pi.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(O(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return C(e)}getCacheStats(){return this._cache.stats()}},TS=new cl,An=TS});function ji(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var et,So=S(()=>{"use strict";et={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"};l(ji,"calculateConfidence")});var Ri,Ai,Ii,ll=S(()=>{"use strict";ee();So();X();Ri=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),s=N.getDoc(e,t);return s!==null?(this._data=s,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Ai=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()}},Ii=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(n=>JSON.parse(n.data))}}});var Di,Sm=S(()=>{"use strict";ee();So();X();ll();Di=class r extends Ri{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=ji(c.count,c.userConfirmed)):(c.value=s,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=v();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=ji(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:v(),confidence:ji(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=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 getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=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}}});function Is(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var ar,ul=S(()=>{"use strict";Ht();ee();So();X();En();l(Is,"rowToMemory");ar=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(et));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=v(),d=Tn(s),m=N.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(m)return m.id;if(i){let g=N.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
506
|
-
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let
|
|
497
|
+
${me.dim(`...${o} more lines`)}`}function gS(r){let e=bi();if(or==="silent")return"";if(or==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return zt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${zt(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&or==="compact"&&o.push(me.dim(String(t.url))),Si(o.join(`
|
|
498
|
+
`),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let o=t.issues,i=o.slice(0,e.maxLines).map(a=>{let c=a.priority&&a.priority!=="none"?` [${a.priority}]`:"";return`${a.identifier} ${zt(String(a.title),Jt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(me.dim(`...${o.length-e.maxLines} more`)),i.join(`
|
|
499
|
+
`)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?Si(n.map(o=>`${o}: ${zt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
|
|
500
|
+
`),e.maxLines):Si(JSON.stringify(r,null,2),e.maxLines)}var O0,Zc,op,or,Ys,rr,el,At,zt,fS,hS,f,Fe=S(()=>{"use strict";tp();Pn();ki();O0=es.spinner.frames,Zc=es.spinner.speed,op={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}},or="compact";l(uS,"setOutputTier");l(dS,"getOutputTier");l(bi,"getTierConfig");Ys={success:me.green("\u2713"),fail:me.red("\u2717"),warn:me.yellow("\u26A0"),info:me.blue("\u2139"),debug:me.dim("\u{1F527}"),bullet:me.dim("\u2022"),arrow:me.dim("\u2192"),check:me.green("\u2713"),cross:me.red("\u2717"),spinner:me.cyan("\u25D0")},rr=null,el=0,At=!1;l(mS,"setQuietMode");l(pS,"isQuietMode");zt=l((r,e)=>{let t=e??(bi().maxCharsPerLine||Jt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Si,"limitLines");l(gS,"formatForHuman");fS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Jt.CLEAR_WIDTH)}\r`):!0,"clear"),hS={start(){return At||console.log(es.cli.header()),this},end(){return At||console.log(es.cli.footer()),this},spin(r){return At?this:(this.stop(),process.stdout.isTTY?(rr=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(el++,zt(r,Jt.SPINNER_MSG))}`)},Zc),this):(process.stdout.write(`${es.cli.spin(0,zt(r,Jt.SPINNER_MSG))}
|
|
501
|
+
`),this))},done(r,e){if(this.stop(),!At){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=me.dim(` [${s.join(" | ")}]`))}console.log(`${Ys.success} ${zt(r,Jt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Ys.fail} ${zt(r,Jt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?ho(r):r;return console.error(),console.error(`${Ys.fail} ${e.message}`),e.file&&console.error(me.dim(` File: ${e.file}`)),e.hint&&console.error(me.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(me.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),At||console.log(`${Ys.warn} ${zt(r,Jt.WARN_MSG)}`),this},info(r){return this.stop(),At||console.log(`${Ys.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!At&&e&&console.log(`${Ys.debug} ${me.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),At)return this;let t=e.bullet||Ys.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),At||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(me.dim(n)),console.log(me.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),At)return this;let t=e.split(`
|
|
502
|
+
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(me.dim(`\u250C${n}\u2510`)),console.log(`${me.dim("\u2502")} ${me.bold(r.padEnd(s))} ${me.dim("\u2502")}`),console.log(me.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${me.dim("\u2502")} ${o.padEnd(s)} ${me.dim("\u2502")}`);return console.log(me.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),At?this:(console.log(`
|
|
503
|
+
${me.bold(r)}`),console.log(me.dim("\u2500".repeat(r.length))),this)},stop(){return rr&&(clearInterval(rr),rr=null,fS()),this},step(r,e,t){if(At)return this;this.stop();let s=me.dim(`[${r}/${e}]`);return process.stdout.isTTY?(rr=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(el++,`${s} ${zt(t,Jt.STEP_MSG)}`)}`)},Zc),this):(process.stdout.write(`${es.cli.spin(0,`${s} ${zt(t,Jt.STEP_MSG)}`)}
|
|
504
|
+
`),this)},progress(r,e,t){if(At)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=me.cyan("\u2588".repeat(n))+me.dim("\u2591".repeat(o)),a=t?` ${zt(t,Jt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(rr=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(el++,`[${i}] ${s}%${a}`)}`)},Zc),this):(process.stdout.write(`${es.cli.spin(0,`[${i}] ${s}%${a}`)}
|
|
505
|
+
`),this)}},f=hS});var lp={};ye(lp,{default:()=>wS,sessionTracker:()=>Qs});var ap,cp,tl,Qs,wS,vi=S(()=>{"use strict";so();ee();wn();K();ap=50,cp=200,tl=class{static{l(this,"SessionTracker")}async read(e){try{return E.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){E.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Ws(e.lastActivity,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 n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>ap&&(n.current.commands=n.current.commands.slice(-ap)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=v();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>cp&&(n.current.files=n.current.files.slice(-cp)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),p=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:xt(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:xt(u),commandCount:s.commands.length,commands:d,filesRead:p,filesWritten:m}}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}},Qs=new tl,wS=Qs});var dp={};ye(dp,{default:()=>xn,performanceTracker:()=>up});var kS,sl,up,xn,Ti=S(()=>{"use strict";ee();kS=BigInt(5*60*1e9),sl=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>kS&&this.marks.delete(t)}recordTiming(e,t,s,n){N.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),n=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of n)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 n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,w)=>g+w,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=n.filter(m=>"metric"in m&&m.metric==="heap_used"),c=n.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=l(b=>Math.round(b/1048576*10)/10,"toMB"),g=a.map(b=>b.value),w=c.map(b=>b.value);o.memory={avgHeapMB:m(g.reduce((b,h)=>b+h,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:w.length>0?m(w.reduce((b,h)=>b+h,0)/w.length):0}}let u=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=n.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=n.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let w=g.context?.command||"unknown";m[w]||(m[w]=[]),m[w].push(g.value)}o.commandDurations={};for(let[g,w]of Object.entries(m))o.commandDurations[g]={avg:Math.round(w.reduce((b,h)=>b+h,0)/w.length),min:Math.min(...w),max:Math.max(...w),count:w.length,unit:"ms"}}return o}},up=new sl,xn=up});import Ei from"node:fs/promises";var nl,SS,jn,Ci=S(()=>{"use strict";Te();ve();W();wn();B();nl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new qn({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await $.getProjectId(e),n=A.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:A.getFilePath(s,"core","now.md"),next:A.getFilePath(s,"core","next.md"),context:A.getFilePath(s,"core","context.md"),shipped:A.getFilePath(s,"progress","shipped.md"),metrics:A.getFilePath(s,"progress","metrics.md"),ideas:A.getFilePath(s,"planning","ideas.md"),roadmap:A.getFilePath(s,"planning","roadmap.md"),specs:A.getFilePath(s,"planning","specs"),memory:A.getFilePath(s,"memory","context.jsonl"),patterns:A.getFilePath(s,"memory","patterns.json"),analysis:A.getFilePath(s,"analysis","repo-summary.md"),codePatterns:A.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Ei.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(O(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[p,m]=await Promise.all([Ei.readFile(d,"utf-8"),Ei.stat(d)]);return{key:u,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(O(p))return{key:u,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:p,mtime:m}of c)s[u]=p,this._cache.set(d,{content:p,mtime:m})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await Ei.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(O(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return C(e)}getCacheStats(){return this._cache.stats()}},SS=new nl,jn=SS});function Pi(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var et,yo=S(()=>{"use strict";et={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"};l(Pi,"calculateConfidence")});var xi,ji,Ri,rl=S(()=>{"use strict";ee();yo();K();xi=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),s=N.getDoc(e,t);return s!==null?(this._data=s,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},ji=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()}},Ri=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(n=>JSON.parse(n.data))}}});var Ai,mp=S(()=>{"use strict";ee();yo();K();rl();Ai=class r extends xi{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=v();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Pi(c.count,c.userConfirmed)):(c.value=s,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=v();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=Pi(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=v(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:v(),confidence:Pi(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=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 getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=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}}});function Ds(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var ir,ol=S(()=>{"use strict";Ut();ee();yo();K();Tn();l(Ds,"rowToMemory");ir=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(et));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=v(),d=vn(s),p=N.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(p)return p.id;if(i){let g=N.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
506
|
+
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let m=Z();return N.run(e,`INSERT INTO memories
|
|
507
507
|
(id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
|
|
508
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
508
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,u,u),m}async updateMemory(e,t,s){let n=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?vn(i):n.content_hash;return N.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
509
509
|
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,v(),t),!0}async deleteMemory(e,t){return N.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",v(),t),!0):!1}async findByTags(e,t,s=!1){let n=this._coerceTags(t);if(n.length===0)return[];let o=n.map(()=>"(tags = ? OR tags LIKE ? OR tags LIKE ? OR tags LIKE ?)"),i=s?" AND ":" OR ",a=o.join(i),c=[e];for(let d of n)c.push(d,`${d},%`,`%,${d},%`,`%,${d}`);return N.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
|
|
510
|
-
AND (${a}) ORDER BY updated_at DESC`,...c).map(
|
|
510
|
+
AND (${a}) ORDER BY updated_at DESC`,...c).map(Ds)}async searchMemories(e,t,s=20,n=0){try{return N.query(e,`SELECT m.* FROM memories m
|
|
511
511
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
512
512
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
513
|
-
ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(
|
|
513
|
+
ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(Ds)}catch{let o=`%${t}%`;return N.query(e,`SELECT * FROM memories
|
|
514
514
|
WHERE project_id = ? AND deleted_at IS NULL
|
|
515
515
|
AND (title LIKE ? OR content LIKE ?)
|
|
516
|
-
ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(
|
|
516
|
+
ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(Ds)}}async getRelevantMemories(e,t,s=5){let n=[];if(t.commandName&&n.push(t.commandName),t.params?.description&&n.push(String(t.params.description)),t.params?.task&&n.push(String(t.params.task)),t.params?.feature&&n.push(String(t.params.feature)),n.length===0)return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Ds);let o=n.join(" ");try{return N.query(e,`SELECT m.* FROM memories m
|
|
517
517
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
518
518
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
519
|
-
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(
|
|
519
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(Ds)}catch{return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(Ds)}}async getRelevantMemoriesWithMetrics(e,t){let n=N.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,p)=>({...d,relevanceScore:Math.max(10,100-p*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-p*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,p)=>d+p.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[et.COMMIT_STYLE],branch_naming:[et.BRANCH_NAMING],test_before_ship:[et.TEST_BEHAVIOR,et.SHIP_WORKFLOW],preferred_agent:[et.AGENT_PREFERENCE],code_style:[et.CODE_STYLE],verbosity:[et.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
|
|
520
520
|
Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async findSimilar(e,t,s=5){let n=await this.getMemoryById(e,t);if(!n)return[];let o=n.title.split(/\s+/).filter(a=>a.length>2).slice(0,8);if(o.length===0)return[];let i=o.join(" OR ");try{return N.query(e,`SELECT m.* FROM memories m
|
|
521
521
|
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
522
522
|
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
|
|
523
|
-
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(
|
|
523
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(Ds)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=N.query(e,`SELECT title, COUNT(*) as cnt FROM memories
|
|
524
524
|
WHERE project_id = ? AND deleted_at IS NULL
|
|
525
525
|
GROUP BY title HAVING cnt > 1`,e),n=v();for(let o of s){let i=N.query(e,`SELECT * FROM memories
|
|
526
526
|
WHERE project_id = ? AND title = ? AND deleted_at IS NULL
|
|
527
|
-
ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(
|
|
527
|
+
ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(m=>m.content!==a.content).map(m=>m.content)].filter((m,g,w)=>w.indexOf(m)===g).join(`
|
|
528
528
|
|
|
529
529
|
---
|
|
530
530
|
|
|
531
|
-
`),d=new Set;for(let
|
|
532
|
-
`).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await
|
|
533
|
-
`).filter(Boolean)}catch{return[]}}},
|
|
534
|
-
`).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function
|
|
531
|
+
`),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&N.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,m.id),p.push(m.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:p})}return t}async getMemoryById(e,t){let s=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?Ds(s):null}async getAllMemories(e){return N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(Ds)}async getMemoryStats(e){let t=N.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL",e),s={};for(let n of t){let o=n.tags?n.tags.split(",").filter(Boolean):[];for(let i of o)s[i]=(s[i]||0)+1}return{totalMemories:t.length,userTriggered:t.filter(n=>n.user_triggered===1).length,tagCounts:s,oldestMemory:t[t.length-1]?.created_at,newestMemory:t[0]?.created_at}}async loadMemories(e){return{version:1,memories:await this.getAllMemories(e),index:{}}}async saveMemories(e){}reset(){}}});var il,bS,Tt,Ii=S(()=>{"use strict";rl();mp();ol();il=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new ir,this._patternStore=new Ai,this._historyStore=new Ri,this._sessionStore=new ji}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,s){return this._semanticMemories.updateMemory(e,t,s)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,s){return this._semanticMemories.findByTags(e,t,s)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,s){return this._semanticMemories.getRelevantMemories(e,t,s)}autoRemember(e,t,s,n){return this._semanticMemories.autoRemember(e,t,s,n)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}findSimilar(e,t,s){return this._semanticMemories.findSimilar(e,t,s)}consolidateMemories(e){return this._semanticMemories.consolidateMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,s,n){return this._patternStore.recordDecision(e,t,s,n)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,s){return this._patternStore.recordWorkflow(e,t,s)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,s,n){return this._patternStore.setPreference(e,t,s,n)}getPreference(e,t,s){return this._patternStore.getPreference(e,t,s)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}getPatternsSummaryDetailed(e){return this._patternStore.getPatternsSummaryDetailed(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let s=this.getSession(`decision:${t}`);if(s!==void 0)return s;let n=await this.getDecision(e,t);return n?n.value:null}async learnDecision(e,t,s,n=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,n),await this.appendHistory(e,{type:"decision",key:t,value:s,context:n})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},bS=new il,Tt=bS});import Xt from"node:fs/promises";import ts from"node:path";var al,vS,mt,pp=S(()=>{"use strict";W();Je();B();al=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=ts.join(this.projectPath,"package.json"),t=await Xt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=ts.join(this.projectPath,"Cargo.toml");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readRequirements(){try{let e=ts.join(this.projectPath,"requirements.txt");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readGoMod(){try{let e=ts.join(this.projectPath,"go.mod");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readGemfile(){try{let e=ts.join(this.projectPath,"Gemfile");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readMixExs(){try{let e=ts.join(this.projectPath,"mix.exs");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readPomXml(){try{let e=ts.join(this.projectPath,"pom.xml");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async readComposerJson(){try{let e=ts.join(this.projectPath,"composer.json"),t=await Xt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=ts.join(this.projectPath,"pyproject.toml");return await Xt.readFile(e,"utf-8")}catch(e){if(O(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await F('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(`
|
|
532
|
+
`).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Xt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(s=>t.some(n=>n.test(s)))}catch(e){if(O(e))return[];throw e}}async listDirectories(){try{return(await Xt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(O(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await F(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await F("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await F('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await F('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 F('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return C(ts.join(this.projectPath,e))}async readFile(e){try{let t=ts.join(this.projectPath,e);return await Xt.readFile(t,"utf-8")}catch(t){if(O(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await F(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
533
|
+
`).filter(Boolean)}catch{return[]}}},vS=new al,mt=vS});var ml={};ye(ml,{default:()=>dl,getTemplateContent:()=>ht,listTemplates:()=>$s,resetBundle:()=>jS});import ll from"node:fs";import TS from"node:fs/promises";import $i from"node:path";function ul(){if(cl)return Di;cl=!0;let r=$i.join(jt,"dist","templates.json");try{let e=ll.readFileSync(r,"utf-8");return Di=JSON.parse(e),Di}catch{return null}}function CS(r){let e=Rn.indexOf(r);e>-1&&Rn.splice(e,1),Rn.push(r)}function PS(){for(;ar.size>=ES&&Rn.length>0;){let r=Rn.shift();r&&ar.delete(r)}}function gp(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,s,n]=t,o={};return s.split(`
|
|
534
|
+
`).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function fp(r){if(ar.has(r))return CS(r),ar.get(r);let e,t=ul();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=$i.join(jt,"templates","commands",`${r}.md`);try{e=await TS.readFile(n,"utf-8")}catch{throw Xo.notFound(r)}}let s=gp(e);return PS(),ar.set(r,s),Rn.push(r),s}async function xS(r){return(await fp(r)).frontmatter["allowed-tools"]||[]}function hp(){ar.clear(),Rn.length=0}function jS(){Di=null,cl=!1,hp()}function ht(r){let e=ul();if(e?.[r])return e[r];let t=$i.join(jt,"templates",r);try{return ll.readFileSync(t,"utf-8")}catch{return null}}function $s(r){let e=ul();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=$i.join(jt,"templates",r);try{return ll.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var ES,ar,Rn,Di,cl,RS,dl,fs=S(()=>{"use strict";xs();ut();ES=50,ar=new Map,Rn=[],Di=null,cl=!1;l(ul,"loadBundle");l(CS,"updateLruOrder");l(PS,"evictLru");l(gp,"parseFrontmatter");l(fp,"load");l(xS,"getAllowedTools");l(hp,"clearCache");l(jS,"resetBundle");l(ht,"getTemplateContent");l($s,"listTemplates");RS={load:fp,parseFrontmatter:gp,getAllowedTools:xS,clearCache:hp,getTemplateContent:ht,listTemplates:$s},dl=RS});function Mi(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
|
|
535
535
|
|
|
536
|
-
${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var
|
|
536
|
+
${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var pl=S(()=>{"use strict";fs();W();B();Is();ut();l(Mi,"mergeWithMarkers")});import yt from"node:fs/promises";import Oi from"node:os";import Ie from"node:path";async function AS(){try{let r=Ie.join(Oi.homedir(),".prjct-cli","docs");await yt.mkdir(r,{recursive:!0});let e=$s("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=ht(n);if(o){let i=Ie.basename(n);await yt.writeFile(Ie.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(ut(),bt(Kn)),s=Ie.join(t,"templates/global/docs");try{let n=await yt.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=Ie.join(s,o),a=Ie.join(r,o),c=await yt.readFile(i,"utf-8");await yt.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:k(r)}}}async function IS(){let r=(lt(),bt(Nt)),e=await r.getActiveProvider(),t=e.name;if(!(await r.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await yt.mkdir(e.configDir,{recursive:!0});let n=Ie.join(e.configDir,e.contextFile),o=yp;if(t!=="claude"){let g=ht(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(ut(),bt(Kn)),b=Ie.join(w,"templates","global",e.contextFile);try{o=await yt.readFile(b,"utf-8")}catch{t==="gemini"&&(o=yp.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await yt.readFile(n,"utf-8"),a=!0}catch(g){if(O(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(u)){let g=i.substring(0,i.indexOf(c)),w=i.substring(i.indexOf(u)+u.length);i=`${(g+w).replace(/\n{3,}/g,`
|
|
537
537
|
|
|
538
538
|
`).trim()}
|
|
539
|
-
`}let
|
|
539
|
+
`}let m=Mi(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await yt.writeFile(n,m.content,"utf-8"),{success:!0,action:m.action,path:n}}catch(n){return{success:!1,error:k(n),action:"failed"}}}function wp(){let r=Oi.homedir();return{claude:{commands:Ie.join(r,".claude","commands"),config:Ie.join(r,".claude"),router:Ie.join(r,".claude","commands","p.md")},gemini:{commands:Ie.join(r,".gemini","commands"),config:Ie.join(r,".gemini"),router:Ie.join(r,".gemini","commands","p.toml")}}}var yp,Ms,DS,Ue,Os=S(()=>{"use strict";fs();W();B();pl();yp=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
|
|
540
540
|
# p/ \u2014 Context layer for AI agents
|
|
541
541
|
|
|
542
542
|
Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
|
|
@@ -552,20 +552,20 @@ Data:
|
|
|
552
552
|
|
|
553
553
|
**Auto-managed by prjct-cli** | https://prjct.app
|
|
554
554
|
<!-- prjct:end - DO NOT REMOVE THIS MARKER -->
|
|
555
|
-
`;l(
|
|
555
|
+
`;l(AS,"installDocs");l(IS,"installGlobalConfig");Ms=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=Oi.homedir()}async ensureInit(){if(this._initialized)return;let t=await(lt(),bt(Nt)).getActiveProvider();this.commandsPath=Ie.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),C(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(lt(),bt(Nt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=Ie.join(this.commandsPath,t);try{await yt.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:k(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:k(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:k(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=Ie.join(this.commandsPath,t);try{await yt.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Ie.join(this.commandsPath,"p");try{if((await yt.stat(e).catch(()=>null))?.isDirectory())return await yt.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return IS()}async cleanupAllLegacy(){let e=Oi.homedir(),t=[],s=[Ie.join(e,".claude","commands","p.md"),Ie.join(e,".claude","commands","p.toml"),Ie.join(e,".gemini","commands","p.md"),Ie.join(e,".gemini","commands","p.toml")];for(let i of s)try{await yt.unlink(i),t.push(i)}catch{}let n=[Ie.join(e,".claude","commands","p"),Ie.join(e,".gemini","commands","p")];for(let i of n)try{(await yt.stat(i).catch(()=>null))?.isDirectory()&&(await yt.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Ie.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await yt.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return AS()}};l(wp,"getProviderPaths");DS=new Ms,Ue=DS});function kp(r,e){let t=[];wo("Languages",r.languages,e.languages,t),wo("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),wo("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(d=>d.name),n=e.patterns.map(d=>d.name);wo("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);wo("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function gl(r){if(!r.hasChanges)return`## Analysis Diff
|
|
556
556
|
|
|
557
557
|
No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of r.items){let n=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${n} | ${s.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
|
|
558
|
-
`)}function
|
|
559
|
-
`)}function bo(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var wl=S(()=>{"use strict";l(jm,"generateAnalysisDiff");l(yl,"formatAnalysisDiffMd");l(Rm,"formatAnalysisDiffText");l(bo,"diffStringArray")});var kl,Sl,Am,vo=S(()=>{"use strict";kl=[1,2,3,5,8,13,21],Sl={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}},Am={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import _S from"node:fs/promises";import NS from"node:path";function lr(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function LS(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...lr(p));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of n){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lr(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...lr(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...lr(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...lr(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(r))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...p)}return t.filter(p=>p.length>1&&!$m.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function FS(r){return r.split(/\s+/).flatMap(e=>lr(e)).filter(e=>e.length>1&&!$m.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function US(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async a=>{try{let c=await _S.readFile(NS.join(r,a),"utf-8"),u=LS(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,m]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:m})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function HS(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function WS(r,e){let t=FS(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=HS(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),m=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function GS(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,Mm,t)}function Ni(r){let e=N.getDoc(r,Mm);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Om(r,e){let t=await US(r);return GS(e,t),t}function _m(r,e,t=15){let s=Ni(r);return s?WS(e,s).slice(0,t):[]}var $m,Mm,bl=S(()=>{"use strict";vo();ee();B();$m=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);l(lr,"splitIdentifier");l(LS,"tokenizeFile");l(FS,"tokenizeQuery");l(US,"buildIndex");l(HS,"idf");l(WS,"score");Mm="bm25-index";l(GS,"saveIndex");l(Ni,"loadIndex");l(Om,"indexProject");l(_m,"queryFiles")});import vl from"node:fs/promises";import en from"node:path";import{z as se}from"zod";async function zS(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=en.join(e,"package.json"),n=await vl.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return O(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 KS(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await ZS(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=JS[a];if(!c)continue;c.some(d=>n.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function XS(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=en.join(e,a);await C(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function YS(r,e){let t=Date.now();try{let s=await eb(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function QS(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=en.join(e,o.file);await C(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Nm(r,e){let t=Date.now(),s=await Promise.all([zS(r,e),KS(r,e),XS(r,e),YS(r,e),QS(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function ZS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await vl.readdir(n,{withFileTypes:!0});for(let i of o){let a=en.join(n,i.name),c=en.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=en.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function eb(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await vl.readdir(n,{withFileTypes:!0});for(let i of o){let a=en.join(n,i.name),c=en.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var qS,BS,VS,Tl,kD,JS,Lm=S(()=>{"use strict";W();B();zo();qS=se.enum(["draft","verified","sealed"]),BS=se.object({name:se.string(),description:se.string(),location:se.string().optional(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),VS=se.object({issue:se.string(),file:se.string(),suggestion:se.string(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),Tl=se.object({projectId:se.string(),languages:se.array(se.string()),frameworks:se.array(se.string()),packageManager:se.string().optional(),sourceDir:se.string().optional(),testDir:se.string().optional(),configFiles:se.array(se.string()),fileCount:se.number(),patterns:se.array(BS),antiPatterns:se.array(VS),analyzedAt:se.string(),modelMetadata:qn.optional(),status:qS.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),kD={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},JS={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(zS,"verifyFrameworks");l(KS,"verifyLanguages");l(XS,"verifyPatternLocations");l(YS,"verifyFileCount");l(QS,"verifyAntiPatternFiles");l(Nm,"semanticVerify");l(ZS,"getProjectExtensions");l(eb,"countProjectFiles")});var El,mt,ur=S(()=>{"use strict";Lm();wl();X();En();Rs();El=class extends dt{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"};Tl.parse(s),await this.update(e,n=>({...n,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),n=v(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Tl.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=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:jm(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await Nm(n,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return mo(JSON.stringify(t))}},mt=new El});import Fm from"node:fs/promises";import Um from"node:path";async function Pl(r,e,t,s){let[n,o,i,a]=await Promise.all([nb(r,e,s),rb(r),ob(r),ib(r)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,tb).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function nb(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=_m(r,n,Cl*2);for(let a of o){if(s.length>=Cl)break;try{let c=Um.join(e,a.path),u=await Fm.readFile(c,"utf-8");u.length>Li*3?s.push({path:a.path,content:`${u.slice(0,Li)}
|
|
560
|
-
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,
|
|
558
|
+
`)}function Sp(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
|
|
559
|
+
`)}function wo(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var fl=S(()=>{"use strict";l(kp,"generateAnalysisDiff");l(gl,"formatAnalysisDiffMd");l(Sp,"formatAnalysisDiffText");l(wo,"diffStringArray")});var hl,yl,bp,ko=S(()=>{"use strict";hl=[1,2,3,5,8,13,21],yl={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}},bp={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import $S from"node:fs/promises";import MS from"node:path";function cr(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function OS(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...cr(m));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...cr(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...cr(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...cr(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...cr(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Ep.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function _S(r){return r.split(/\s+/).flatMap(e=>cr(e)).filter(e=>e.length>1&&!Ep.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function NS(r){let e=await hn(r),t={},s={},n=0,o=await yn(e,50,async a=>{try{let c=await $S.readFile(MS.join(r,a),"utf-8"),u=OS(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function LS(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function FS(r,e){let t=_S(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=LS(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function US(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,Cp,t)}function _i(r){let e=N.getDoc(r,Cp);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Pp(r,e){let t=await NS(r);return US(e,t),t}function xp(r,e,t=15){let s=_i(r);return s?FS(e,s).slice(0,t):[]}var Ep,Cp,wl=S(()=>{"use strict";ko();ee();B();Ep=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);l(cr,"splitIdentifier");l(OS,"tokenizeFile");l(_S,"tokenizeQuery");l(NS,"buildIndex");l(LS,"idf");l(FS,"score");Cp="bm25-index";l(US,"saveIndex");l(_i,"loadIndex");l(Pp,"indexProject");l(xp,"queryFiles")});import kl from"node:fs/promises";import Zs from"node:path";import{z as se}from"zod";async function BS(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=Zs.join(e,"package.json"),n=await kl.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return O(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 VS(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await KS(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=qS[a];if(!c)continue;c.some(d=>n.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function JS(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=Zs.join(e,a);await C(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function zS(r,e){let t=Date.now();try{let s=await YS(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function XS(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=Zs.join(e,o.file);await C(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function jp(r,e){let t=Date.now(),s=await Promise.all([BS(r,e),VS(r,e),JS(r,e),zS(r,e),XS(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function KS(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await kl.readdir(n,{withFileTypes:!0});for(let i of o){let a=Zs.join(n,i.name),c=Zs.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=Zs.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function YS(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await kl.readdir(n,{withFileTypes:!0});for(let i of o){let a=Zs.join(n,i.name),c=Zs.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var HS,WS,GS,Sl,fD,qS,Rp=S(()=>{"use strict";W();B();qo();HS=se.enum(["draft","verified","sealed"]),WS=se.object({name:se.string(),description:se.string(),location:se.string().optional(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),GS=se.object({issue:se.string(),file:se.string(),suggestion:se.string(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),Sl=se.object({projectId:se.string(),languages:se.array(se.string()),frameworks:se.array(se.string()),packageManager:se.string().optional(),sourceDir:se.string().optional(),testDir:se.string().optional(),configFiles:se.array(se.string()),fileCount:se.number(),patterns:se.array(WS),antiPatterns:se.array(GS),analyzedAt:se.string(),modelMetadata:Gn.optional(),status:HS.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),fD={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},qS={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(BS,"verifyFrameworks");l(VS,"verifyLanguages");l(JS,"verifyPatternLocations");l(zS,"verifyFileCount");l(XS,"verifyAntiPatternFiles");l(jp,"semanticVerify");l(KS,"getProjectExtensions");l(YS,"countProjectFiles")});var bl,pt,lr=S(()=>{"use strict";Rp();fl();K();Tn();As();bl=class extends dt{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"};Sl.parse(s),await this.update(e,n=>({...n,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),n=v(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return Sl.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=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:kp(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await jp(n,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return uo(JSON.stringify(t))}},pt=new bl});import Ap from"node:fs/promises";import Ip from"node:path";async function Tl(r,e,t,s){let[n,o,i,a]=await Promise.all([eb(r,e,s),tb(r),sb(r),nb(r)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,QS).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function eb(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=xp(r,n,vl*2);for(let a of o){if(s.length>=vl)break;try{let c=Ip.join(e,a.path),u=await Ap.readFile(c,"utf-8");u.length>Ni*3?s.push({path:a.path,content:`${u.slice(0,Ni)}
|
|
560
|
+
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Ni),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>=vl)break;if(!s.some(c=>c.path===a))try{let c=Ip.join(e,a),u=await Ap.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,Ni),reason:"entry point"})}catch{}}return s}async function tb(r){try{let e=await pt.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function sb(r){try{return(await L.getTaskHistory(r)).slice(0,ZS).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function nb(r){try{let e=Qt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return V.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Ni,vl,QS,ZS,Dp=S(()=>{"use strict";wl();lr();er();vt();Is();Ni=800,vl=6,QS=8,ZS=5;l(Tl,"buildAnalysisPayload");l(eb,"selectCodeSamples");l(tb,"getExistingPatterns");l(sb,"getTaskHistory");l(nb,"getPreviousAnalysisSummary")});var Li=S(()=>{"use strict"});import _s from"chalk";function $p(r){return Math.ceil(r.length/4)}function Mp(r){let e=r.split(`
|
|
561
561
|
`),t=[],s=null;for(let n=0;n<e.length;n++){let o=e[n],i=o.match(/^(#{1,3})\s+(.+)$/);i?(s&&(s.endLine=n-1,t.push(s)),s={name:i[2].trim(),content:o,startLine:n,endLine:n}):s&&(s.content+=`
|
|
562
|
-
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function
|
|
563
|
-
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
562
|
+
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function El(r){return r.includes("<!-- prjct:preserve")}function Op(r,e){let t=Mp(r),s=Mp(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:$p(r),tokensAfter:$p(e),tokenDelta:0};n.tokenDelta=n.tokensAfter-n.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(s.map(a=>[a.name.toLowerCase(),a]));for(let a of t)El(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
563
|
+
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(El(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
564
564
|
`).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
565
|
-
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
566
|
-
`).length}),n.hasChanges=!0)}return n}function
|
|
567
|
-
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let
|
|
568
|
-
`)}function
|
|
565
|
+
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!El(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
566
|
+
`).length}),n.hasChanges=!0)}return n}function _p(r,e={}){let{colorize:t=!0}=e,s=[],n=t?_s.green:m=>m,o=t?_s.red:m=>m,i=t?_s.yellow:m=>m,a=t?_s.dim:m=>m,c=t?_s.bold:m=>m;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
|
|
567
|
+
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let m of r.added)s.push(n(`+ \u2502 + ${m.name} (new)`));if(r.modified.length>0)for(let m of r.modified)s.push(i(`~ \u2502 ${m.name} (modified)`));if(r.removed.length>0)for(let m of r.removed)s.push(o(`- \u2502 - ${m.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let m of r.preserved)s.push(a(` \u2502 \u2713 ${m.name} (${m.lineCount} lines preserved)`))}s.push(""),s.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",p=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${p(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
|
|
568
|
+
`)}function Np(r,e={}){let{colorize:t=!0}=e,s=[],n=t?_s.green:c=>c,o=t?_s.red:c=>c,i=t?_s.cyan:c=>c,a=t?_s.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
569
569
|
`))s.push(n(`+ ${u}`));s.push("")}for(let c of r.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
570
570
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
571
571
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
@@ -576,19 +576,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function xl(r){return r.incl
|
|
|
576
576
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
577
577
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
578
578
|
`).length-5} more lines`))}s.push("")}return s.join(`
|
|
579
|
-
`)}var
|
|
579
|
+
`)}var Lp=S(()=>{"use strict";Li();l($p,"estimateTokens");l(Mp,"parseMarkdownSections");l(El,"isPreservedSection");l(Op,"generateSyncDiff");l(_p,"formatDiffPreview");l(Np,"formatFullDiff")});var rb,Cl,Fi,Pl=S(()=>{"use strict";ee();W();Je();vi();rb={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Cl=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...rb,...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=E.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;s=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let n=s.lastSync;try{let{stdout:c}=await F("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([F(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),F(`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(`
|
|
580
580
|
`).filter(Boolean):[],n){let c=new Date(n),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(s){return t.reason=`Error checking staleness: ${k(s)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let s=[];if(e.lastSyncCommit&&s.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&s.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&s.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&s.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&s.push(`Files changed: ${e.changedFiles.length}`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let n of e.significantChanges.slice(0,5))t.push(` \u2022 ${n}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
|
|
581
|
-
`)}async getSessionInfo(e){return
|
|
581
|
+
`)}async getSessionInfo(e){return Qs.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
582
582
|
`);t.push(`Session: \u25B6 Active (${e.duration})`);let s=[];if(e.commandCount>0){let n=new Set,o=[];for(let i of e.commands)n.has(i)||(n.add(i),o.push(i));s.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&s.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),s.push(`Idle: ${e.expiresIn} until timeout`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
|
|
583
|
-
`)}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}},
|
|
584
|
-
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&
|
|
585
|
-
`);throw new
|
|
586
|
-
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(
|
|
583
|
+
`)}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}},Fi=l((r,e)=>new Cl(r,e),"createStalenessChecker")});import Fp from"node:fs/promises";import dr from"node:path";function ob(r){let e=[],t,s=new RegExp(zd.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function ib(r,e,t){let s;if(r.startsWith("@/"))s=dr.join(t,"src",r.slice(2));else{let n=dr.dirname(dr.join(t,e));s=dr.resolve(n,r)}for(let n of Jd){let o=s+n;try{if((await Fp.stat(o)).isFile())return dr.relative(t,o)}catch{}}return null}async function ab(r){let e=await hn(r),t={},s={},n=0,o=await yn(e,50,async i=>{try{let a=await Fp.readFile(dr.join(r,i),"utf-8"),c=ob(a),u=[];for(let d of c){let p=await ib(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function cb(r,e){N.setDoc(r,Up,e)}function Ui(r){return N.getDoc(r,Up)}async function Hp(r,e){let t=await ab(r);return cb(e,t),t}var Up,xl=S(()=>{"use strict";Za();ee();B();l(ob,"extractImportSources");l(ib,"resolveImport");l(ab,"buildGraph");Up="import-graph";l(cb,"saveGraph");l(Ui,"loadGraph");l(Hp,"indexImports")});function Wp(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=Ui(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||n.add(d)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function Gp(r){let e=new Set;for(let t of r){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}var qp=S(()=>{"use strict";xl();l(Wp,"propagateChanges");l(Gp,"affectedDomains")});import Bp from"node:fs/promises";import lb from"node:path";function ub(r){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(r).toString(36)}`;let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function db(r){let e=await hn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await yn(e,100,async n=>{try{let o=lb.join(r,n),[i,a]=await Promise.all([Bp.readFile(o,"utf-8"),Bp.stat(o)]);return{path:n,hash:ub(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function mb(r,e){let t=[],s=[],n=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?s.push(i):n.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:n}}function jl(r,e){let t=N.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,n]of e)s.run(n.path,n.hash,n.size,n.mtime)})(),N.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function pb(r){let e=new Map;try{let t=N.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}async function Rl(r,e){let[t,s]=await Promise.all([db(r),Promise.resolve(pb(e))]);return{diff:mb(t,s),currentHashes:t}}function Vp(r){return N.hasDoc(r,"file-hashes-meta")}var Jp=S(()=>{"use strict";ee();B();l(ub,"hashContent");l(db,"computeHashes");l(mb,"diffHashes");l(jl,"saveHashes");l(pb,"loadHashes");l(Rl,"detectChanges");l(Vp,"hasHashRegistry")});async function fb(r,e=100){try{let{stdout:t}=await F(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
|
|
584
|
+
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&hb(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function hb(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function yb(r,e=100){let t=await fb(r,e),s=new Map,n=new Map;for(let i of t){let a=Array.from(i);for(let c of a)s.set(c,(s.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=wb(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,p=s.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function wb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function kb(r,e){N.setDoc(r,Kp,e)}function Yp(r){return N.getDoc(r,Kp)}async function Qp(r,e,t=100){let s=await yb(r,t);return kb(e,s),s}var Kp,Zp=S(()=>{"use strict";ko();ee();Je();l(fb,"parseGitLog");l(hb,"isSourceFile");l(yb,"buildMatrix");l(wb,"pairKey");Kp="cochange-index";l(kb,"saveMatrix");l(Yp,"loadMatrix");l(Qp,"indexCoChanges")});import ng from"node:fs/promises";import eg from"node:os";import Al from"node:path";function bb(){let r=ht("mcp-config.json");if(!r)return{mcpServers:{context7:Il}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Il}}}}function rg(){return bb().mcpServers?.context7||Il}function tg(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Al.join(eg.tmpdir(),"prjct-context7-test","mcp.json"):Al.join(eg.homedir(),".claude","mcp.json")}async function sg(r){try{let e=await ng.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(O(e))return{};throw e}}async function vb(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=rg(),e=[...r.args||[],"--help"];await fn(r.command||"npx",e,{timeout:15e3})}var Il,mr,Dl,Tb,ss,pr=S(()=>{"use strict";fs();so();W();Je();B();Il={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},mr=null;l(bb,"parseTemplateConfig");l(rg,"getContext7Config");l(tg,"getConfigPath");l(sg,"readConfig");l(vb,"runSmokeCheck");Dl=class{static{l(this,"Context7Service")}async install(){let e=tg(),t=Al.dirname(e);await ng.mkdir(t,{recursive:!0});let s=await sg(e),n=s.mcpServers||{};return n.context7=rg(),s.mcpServers=n,await de(e,s),mr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(mr&&Date.now()-mr.at<3e5)return mr.status;let e=tg(),n=((await sg(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await vb();let o={installed:!0,verified:!0,configPath:e};return mr={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${k(o)}`};return mr={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}},Tb=new Dl,ss=Tb});import{execFileSync as og,execSync as Eb}from"node:child_process";var Hi,$l,Wi,ig,ag=S(()=>{"use strict";wn();ki();Hi={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"}},$l=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=Hi[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=Hi[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Wi(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=Hi[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
|
|
585
|
+
`);throw new Wi({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
586
|
+
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Hi),s=new Map;for(let n of t)s.set(n,this.checkTool(n));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=Eb(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let n=t.match(e.versionRegex);s=n?n[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:wi(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:wi(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return og(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return og(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:wi(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Ws(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())}},Wi=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}},ig=new $l});var qi={};ye(qi,{installAntigravitySkill:()=>mg,installCodexSkill:()=>Ml,needsAntigravityInstallation:()=>Rb,run:()=>dg,verifyCodexPRouterReady:()=>gr});import{execFileSync as Cb}from"node:child_process";import oe from"node:fs/promises";import An from"node:os";import ge from"node:path";import Ee from"chalk";async function Pb(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!ig.isAvailable("npm"))return console.log(`${Ee.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${Ee.dim(`Install ${r.displayName} using one of:`)}`),console.log(Ee.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(Ee.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(Ee.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(Ee.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Cb("npm",["install","-g",e],{stdio:"inherit",timeout:nr("NPM_INSTALL")}),console.log(""),console.log(`${Ee.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(Ee.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(Ee.dim("The npm install took too long. Try:")),console.log(Ee.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(Ee.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(Ee.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(Ee.dim("Alternative installation methods:")),console.log(Ee.dim(` \u2022 npm: npm install -g ${e}`)),console.log(Ee.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(Ee.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(Ee.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function dg(){let r=await Ps(),e=await lc(),t=ze[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},n=["claude","gemini"];for(let a of n){let c=ze[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await Pb(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Ue.detectActiveProvider()){let m=await Ue.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,s.commandsAdded+=m.added,s.commandsUpdated+=m.updated);let g=await Ue.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Ue.installDocs(),await $b(),await ss.ensureReady()}}else if(a==="gemini"){await xb()&&(d.commandsAdded=1,s.commandsAdded+=1);let m=await jb();m.success&&(d.configAction=m.action)}s.providers.push(d)}if((await Bn()).installed&&(await mg()).success&&console.log(` ${Ee.green("\u2713")} Antigravity skill installed`),(await kn()).installed){if(!(await Ml()).success)throw new Error("Codex skill installation failed");let c=await gr({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${Ee.green("\u2713")} Codex skill installed`),console.log(` ${Ee.green("\u2713")} Codex p. router ready`)}await io.saveConfig(ke,await Ue.getInstallPath(),e.provider),await Db();for(let a of s.providers)Mb(a,ze[a.provider]);return s}async function xb(){try{let r=ge.join(An.homedir(),".gemini","commands"),e=ge.join(r,"p.toml");try{return await oe.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return V.warn(`Gemini router cleanup warning: ${k(r)}`),!1}}async function jb(){try{let r=ge.join(An.homedir(),".gemini"),e=ge.join(r,"GEMINI.md");await oe.mkdir(r,{recursive:!0});let t=ht("global/GEMINI.md");if(!t){let c=ge.join(jt,"templates","global","GEMINI.md");t=await oe.readFile(c,"utf-8")}let s="",n=!1;try{s=await oe.readFile(e,"utf-8"),n=!0}catch(c){if(O(c))n=!1;else throw c}let a=Mi(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await oe.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return V.warn(`Gemini config warning: ${k(r)}`),{success:!1,action:null}}}async function mg(){try{let r=ge.join(An.homedir(),".gemini","antigravity","skills"),e=ge.join(r,"prjct"),t=ge.join(e,"SKILL.md");await oe.mkdir(e,{recursive:!0});let s=await C(t),n=ht("antigravity/SKILL.md");if(!n){let o=ge.join(jt,"templates","antigravity","SKILL.md");if(!await C(o))return V.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await oe.readFile(o,"utf-8")}return await oe.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return V.warn(`Antigravity skill warning: ${k(r)}`),{success:!1,action:null}}}async function Rb(){let r=await Bn();return r.installed&&!r.skillInstalled}function gg(){return ge.join(An.homedir(),".codex","skills","prjct","SKILL.md")}function Ab(r){return`<!-- ${pg}: ${JSON.stringify({version:ke,templateHash:r})} -->`}function cg(r){let e=r.match(new RegExp(`<!--\\s*${pg}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function Ib(r){return uo(r)}async function fg(){let r=ht("codex/SKILL.md");if(r)return r;let e=ge.join(jt,"templates","codex","SKILL.md");return await C(e)?oe.readFile(e,"utf-8"):null}function hg(r){let e=r.trimEnd(),t=Ib(e),s=Ab(t);return{content:`${e}
|
|
587
587
|
|
|
588
588
|
${s}
|
|
589
|
-
`,templateHash:t}}async function
|
|
589
|
+
`,templateHash:t}}async function Ml(){try{let r=gg(),e=ge.dirname(r);await oe.mkdir(e,{recursive:!0});let t=await C(r),s=await fg();if(!s)return V.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=hg(s);return t&&await oe.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await oe.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return V.warn(`Codex skill warning: ${k(r)}`),{success:!1,action:null}}}async function gr(r={}){let e=gg();if(!(await kn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await fg();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let n=hg(s),o=l(async()=>r.autoRepair?(await Ml()).success:!1,"maybeRepair"),i="";if(!await C(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await oe.readFile(e,"utf-8").catch(()=>"");let a=cg(i);if(!(a?.version===ke&&a?.templateHash===n.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await oe.readFile(e,"utf-8").catch(()=>""),a=cg(i),!(a?.version===ke&&a?.templateHash===n.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:n.templateHash,message:"Codex p. router ready"}}async function Db(){try{let r=ge.join(An.homedir(),".prjct-cli","projects");if(!await C(r))return;let e=(await oe.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=E.getDoc(s,"project");if(!n)continue;n.cliVersion!==ke&&(n.cliVersion=ke,E.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${Ee.green("\u2713")} Updated ${t} project(s) to v${ke}`)}catch(r){O(r)||V.warn(`Migration warning: ${k(r)}`)}}async function lg(r,e){let t={};if(await C(r))try{t=await Ae(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await de(r,t)}async function $b(){try{let r=ge.join(An.homedir(),".claude"),e=ge.join(r,"settings.json"),t=ge.join(r,"prjct-statusline.sh"),s=ge.join(An.homedir(),".prjct-cli","statusline"),n=ge.join(s,"statusline.sh"),o=ge.join(s,"themes"),i=ge.join(s,"lib"),a=ge.join(s,"components"),c=ge.join(s,"config.json"),u=ge.join(jt,"assets","statusline"),d=ge.join(u,"statusline.sh"),p=ge.join(u,"themes"),m=ge.join(u,"lib"),g=ge.join(u,"components"),w=ge.join(u,"default-config.json");if(await C(r)||await oe.mkdir(r,{recursive:!0}),await C(s)||await oe.mkdir(s,{recursive:!0}),await C(o)||await oe.mkdir(o,{recursive:!0}),await C(i)||await oe.mkdir(i,{recursive:!0}),await C(a)||await oe.mkdir(a,{recursive:!0}),await C(n)){let b=await oe.readFile(n,"utf8");if(b.includes("CLI_VERSION=")){let h=b.match(/CLI_VERSION="([^"]*)"/);if(h&&h[1]!==ke){let x=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ke}"`);await oe.writeFile(n,x,{mode:493})}await Gi(m,i),await Gi(g,a),await ug(t,n),await lg(e,t);return}}if(await C(d)){let b=await oe.readFile(d,"utf8");if(b=b.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ke}"`),await oe.writeFile(n,b,{mode:493}),await Gi(m,i),await Gi(g,a),await C(p)){let h=await oe.readdir(p);for(let x of h){let T=ge.join(p,x),I=ge.join(o,x);await oe.copyFile(T,I)}}!await C(c)&&await C(w)&&await oe.copyFile(w,c)}else{let b=`#!/bin/bash
|
|
590
590
|
# prjct Status Line for Claude Code
|
|
591
|
-
CLI_VERSION="${
|
|
591
|
+
CLI_VERSION="${ke}"
|
|
592
592
|
input=$(cat)
|
|
593
593
|
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
594
594
|
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
@@ -617,7 +617,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
617
617
|
fi
|
|
618
618
|
fi
|
|
619
619
|
echo "prjct"
|
|
620
|
-
`;await oe.writeFile(n,b,{mode:493})}await
|
|
620
|
+
`;await oe.writeFile(n,b,{mode:493})}await ug(t,n),await lg(e,t)}catch(r){O(r)||V.warn(`Status line warning: ${k(r)}`)}}async function Gi(r,e){if(!await C(r))return;let t=await oe.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ge.join(r,s),o=ge.join(e,s);await oe.copyFile(n,o),await oe.chmod(o,493)}}async function ug(r,e){try{if(await C(r)){if((await oe.lstat(r)).isSymbolicLink()&&await oe.readlink(r)===e)return;await oe.unlink(r)}await oe.symlink(e,r)}catch{try{await C(e)&&(await oe.copyFile(e,r),await oe.chmod(r,493))}catch(s){O(s)||V.warn(`Symlink fallback warning: ${s.message}`)}}}function Mb(r,e){if(console.log(""),r.cliInstalled?console.log(` ${Ee.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${Ee.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${Ee.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${Ee.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${Ee.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${Ee.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${Ee.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var pg,Ob,fr=S(()=>{"use strict";fs();pr();ag();ee();W();Pn();B();Tn();Is();ut();lt();Os();si();pl();l(Pb,"installAICLI");l(dg,"run");l(xb,"installGeminiRouter");l(jb,"installGeminiGlobalConfig");l(mg,"installAntigravitySkill");l(Rb,"needsAntigravityInstallation");pg="prjct-codex-router";l(gg,"getCodexSkillPath");l(Ab,"getCodexSkillMetadata");l(cg,"parseCodexSkillMetadata");l(Ib,"hashContent");l(fg,"loadCodexSkillTemplate");l(hg,"buildCodexSkillContent");l(Ml,"installCodexSkill");l(gr,"verifyCodexPRouterReady");l(Db,"migrateProjectsCliVersion");l(lg,"ensureStatusLineSettings");l($b,"installStatusLine");l(Gi,"installStatusLineModules");l(ug,"ensureStatusLineSymlink");l(Mb,"showResults");Ob=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Ob&&dg().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import ie from"node:fs/promises";import ne from"node:path";async function Bi(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(E.exists(r)&&E.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(r),n=ne.join(s,"storage"),o=ne.join(s,"index"),i=ne.join(s,"memory");t.backupDir=await _b(n,o,i),E.getDb(r);for(let{filename:c,key:u}of Nl){let d=ne.join(n,c),p=await ns(d);if(p===null){t.skippedFiles.push(c);continue}try{E.setDoc(r,u,p),yg(r,u,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:u}of _l){let d=ne.join(o,c),p=await ns(d);if(p===null){t.skippedFiles.push(`index/${c}`);continue}try{E.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),wg(r,u,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await qb(r,o,t),await Bb(r,o,t),await Vb(r,i,t),await Jb(r,i,t);let a=ne.join(s,"sessions");return await zb(r,a,t),t.errors.length===0&&await Xb(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function _b(r,e,t){let s=ne.join(r,"backup");return await ie.mkdir(s,{recursive:!0}),await ie.mkdir(ne.join(s,"index"),{recursive:!0}),await ie.mkdir(ne.join(s,"memory"),{recursive:!0}),await Ol(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Ol(e,ne.join(s,"index")),await Ol(t,ne.join(s,"memory")),s}async function Ol(r,e,t){try{let s=await ie.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=ne.join(r,n.name),i=ne.join(e,n.name);await ie.copyFile(o,i)}}catch(s){if(!O(s))throw s}}function yg(r,e,t){switch(e){case"state":Nb(r,t);break;case"queue":Lb(r,t);break;case"ideas":Fb(r,t);break;case"shipped":Ub(r,t);break;case"metrics":Hb(r,t);break;case"analysis":Wb(r,t);break}}function Nb(r,e){let t=E.getDb(r),s=t.prepare(`
|
|
621
621
|
INSERT OR REPLACE INTO tasks
|
|
622
622
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
623
623
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -628,92 +628,92 @@ echo "prjct"
|
|
|
628
628
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
629
629
|
depends_on, started_at, completed_at, output, summary)
|
|
630
630
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
631
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(_(a.id)??`task-${Date.now()}`,_(a.description??a.parentDescription)??"",_(a.type),_(c??a.status)??"unknown",_(a.parentDescription),_(a.branch),_(a.linearId),_(a.linearUuid),_(a.sessionId),_(a.featureId),_(a.startedAt)??new Date().toISOString(),_(a.completedAt),_(a.shippedAt),_(a.pausedAt),_(a.pauseReason),_(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let
|
|
631
|
+
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(_(a.id)??`task-${Date.now()}`,_(a.description??a.parentDescription)??"",_(a.type),_(c??a.status)??"unknown",_(a.parentDescription),_(a.branch),_(a.linearId),_(a.linearUuid),_(a.sessionId),_(a.featureId),_(a.startedAt)??new Date().toISOString(),_(a.completedAt),_(a.shippedAt),_(a.pausedAt),_(a.pauseReason),_(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let p=u[d];n.run(_(p.id)??`subtask-${d}`,_(a.id),_(p.description)??"",_(p.status)??"pending",_(p.domain),_(p.agent),d,p.dependsOn?JSON.stringify(p.dependsOn):null,_(p.startedAt),_(p.completedAt),_(p.output),p.summary?JSON.stringify(p.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 Lb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
|
|
632
632
|
INSERT OR REPLACE INTO queue_tasks
|
|
633
633
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
634
634
|
feature_id, feature_name)
|
|
635
635
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
636
|
-
`);for(let o of t)n.run(_(o.id)??`queue-${Date.now()}`,_(o.description)??"",_(o.type),_(o.priority),_(o.section),_(o.createdAt)??new Date().toISOString(),o.completed?1:0,_(o.completedAt),_(o.featureId),_(o.featureName))}function
|
|
636
|
+
`);for(let o of t)n.run(_(o.id)??`queue-${Date.now()}`,_(o.description)??"",_(o.type),_(o.priority),_(o.section),_(o.createdAt)??new Date().toISOString(),o.completed?1:0,_(o.completedAt),_(o.featureId),_(o.featureName))}function Fb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
|
|
637
637
|
INSERT OR REPLACE INTO ideas
|
|
638
638
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
639
639
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
640
|
-
`);for(let o of t)n.run(_(o.id)??`idea-${Date.now()}`,_(o.text)??"",_(o.status)??"pending",_(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,_(o.addedAt)??new Date().toISOString(),_(o.convertedTo),_(o.details),JSON.stringify(o))}function
|
|
640
|
+
`);for(let o of t)n.run(_(o.id)??`idea-${Date.now()}`,_(o.text)??"",_(o.status)??"pending",_(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,_(o.addedAt)??new Date().toISOString(),_(o.convertedTo),_(o.details),JSON.stringify(o))}function Ub(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
|
|
641
641
|
INSERT OR REPLACE INTO shipped_features
|
|
642
642
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
643
643
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
644
|
-
`);for(let o of t)n.run(_(o.id)??`ship-${Date.now()}`,_(o.name)??"",_(o.shippedAt)??new Date().toISOString(),_(o.version)??"0.0.0",_(o.description),_(o.type),_(o.duration),JSON.stringify(o))}function
|
|
644
|
+
`);for(let o of t)n.run(_(o.id)??`ship-${Date.now()}`,_(o.name)??"",_(o.shippedAt)??new Date().toISOString(),_(o.version)??"0.0.0",_(o.description),_(o.type),_(o.duration),JSON.stringify(o))}function Hb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
|
|
645
645
|
INSERT OR REPLACE INTO metrics_daily
|
|
646
646
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
647
647
|
VALUES (?, ?, ?, ?, ?)
|
|
648
|
-
`);for(let o of t)n.run(_(o.date)??new Date().toISOString().slice(0,10),
|
|
648
|
+
`);for(let o of t)n.run(_(o.date)??new Date().toISOString().slice(0,10),en(o.tokensSaved)??0,en(o.syncs)??0,en(o.avgCompressionRate)??0,en(o.totalDuration)??0)}function Wb(r,e){let s=E.getDb(r).prepare(`
|
|
649
649
|
INSERT OR REPLACE INTO analysis
|
|
650
650
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
651
651
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
652
|
-
`),n=l((o,i)=>{o&&s.run(i,_(o.status)??"unknown",_(o.commitHash),_(o.signature),_(o.sealedAt),_(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function
|
|
652
|
+
`),n=l((o,i)=>{o&&s.run(i,_(o.status)??"unknown",_(o.commitHash),_(o.signature),_(o.sealedAt),_(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function wg(r,e,t){e==="categories-cache"&&Gb(r,t)}function Gb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=E.getDb(r).prepare(`
|
|
653
653
|
INSERT OR REPLACE INTO index_files
|
|
654
654
|
(path, categories, domain, score, size, mtime, language)
|
|
655
655
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
656
|
-
`);for(let o of t){let i=_(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,_(o.primaryDomain),i)}}async function
|
|
656
|
+
`);for(let o of t){let i=_(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,_(o.primaryDomain),i)}}async function qb(r,e,t){let s=ne.join(e,"checksums.json"),n=await ns(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=E.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Bb(r,e,t){let s=ne.join(e,"file-scores.json"),n=await ns(s);if(n===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=n.scores;if(!o||!Array.isArray(o))return;let i=E.getDb(r),a=i.prepare(`
|
|
657
657
|
INSERT OR REPLACE INTO index_files
|
|
658
658
|
(path, score, size, mtime, language, categories, domain)
|
|
659
659
|
VALUES (?, ?, ?, ?, NULL,
|
|
660
660
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
661
661
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
662
|
-
`);i.transaction(()=>{for(let c of o){let u=_(c.path);u&&a.run(u,
|
|
663
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=E.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=_(u.type??u.action)??"unknown",
|
|
664
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=E.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${_(u.taskId??u.timestamp)??Date.now()}`,
|
|
662
|
+
`);i.transaction(()=>{for(let c of o){let u=_(c.path);u&&a.run(u,en(c.score)??0,en(c.size),_(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Vb(r,e,t){let s=ne.join(e,"events.jsonl");try{let o=(await ie.readFile(s,"utf-8")).split(`
|
|
663
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=E.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=_(u.type??u.action)??"unknown",p=_(u.taskId??u.task_id),m=_(u.timestamp??u.ts)??new Date().toISOString();a.run(d,p,c,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Jb(r,e,t){let s=ne.join(e,"learnings.jsonl");try{let o=(await ie.readFile(s,"utf-8")).split(`
|
|
664
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=E.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${_(u.taskId??u.timestamp)??Date.now()}`,p=u.tags,m=p&&p.length>0?_(p[0]):null;a.run(d,m,c,1,_(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function zb(r,e,t){let n=E.getDb(r).prepare(`
|
|
665
665
|
INSERT OR IGNORE INTO sessions
|
|
666
666
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
667
667
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
668
|
-
`),o=l(u=>{!u||!u.id||n.run(_(u.id),_(u.projectId)??r,_(u.task)??"",_(u.status)??"completed",_(u.startedAt)??new Date().toISOString(),_(u.pausedAt),_(u.completedAt),
|
|
668
|
+
`),o=l(u=>{!u||!u.id||n.run(_(u.id),_(u.projectId)??r,_(u.task)??"",_(u.status)??"completed",_(u.startedAt)??new Date().toISOString(),_(u.pausedAt),_(u.completedAt),en(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=ne.join(e,"current.json"),a=await ns(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await ie.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=ne.join(e,"archive");try{let u=await ie.readdir(c);for(let p of u){let m=ne.join(c,p);try{if(!(await ie.stat(m)).isDirectory())continue;let w=await ie.readdir(m);for(let h of w){if(!h.endsWith(".json"))continue;let x=ne.join(m,h),T=await ns(x);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${p}/${h}`),await ie.unlink(x).catch(()=>{})}catch(I){t.errors.push({file:`sessions/archive/${p}/${h}`,error:String(I)})}}(await ie.readdir(m)).length===0&&await ie.rmdir(m).catch(()=>{})}catch{}}(await ie.readdir(c).catch(()=>[])).length===0&&await ie.rmdir(c).catch(()=>{})}catch{}try{(await ie.readdir(e)).length===0&&await ie.rmdir(e).catch(()=>{})}catch{}}async function Xb(r,e,t,s){let n=l(async(i,a)=>{try{await ie.unlink(i)}catch(c){O(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Nl)await n(ne.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await n(ne.join(e,i),`cleanup:index/${i}`);await n(ne.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(ne.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function _(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function en(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function ns(r){try{let e=await ie.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(O(e)||e instanceof SyntaxError)return null;throw e}}async function Vi(r){let e=A.getGlobalProjectPath(r),t=ne.join(e,"storage"),s=0;E.getDb(r);for(let{filename:w,key:b}of Nl){let h=ne.join(t,w),x=await ns(h);if(x!==null){E.setDoc(r,b,x),yg(r,b,x);try{await ie.unlink(h)}catch{}s++}}let n=ne.join(e,"project.json"),o=await ns(n);if(o!==null){E.setDoc(r,"project",o);try{await ie.unlink(n)}catch{}s++}let i=ne.join(e,"memory");for(let w of["events.jsonl","learnings.jsonl"]){let b=ne.join(i,w);try{let x=(await ie.readFile(b,"utf-8")).split(`
|
|
669
669
|
`).filter(I=>I.trim());if(x.length===0){await ie.unlink(b),s++;continue}let T=E.getDb(r);if(w==="events.jsonl"){let I=T.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");T.transaction(()=>{for(let M of x)try{let y=JSON.parse(M);I.run(_(y.type??y.action)??"unknown",_(y.taskId??y.task_id),M,_(y.timestamp??y.ts)??new Date().toISOString())}catch{}})()}else{let I=T.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");T.transaction(()=>{for(let M of x)try{let y=JSON.parse(M),j=`learning:${_(y.taskId??y.timestamp)??Date.now()}`,D=y.tags;I.run(j,_(D?.[0]),M,1,_(y.timestamp)??new Date().toISOString())}catch{}})()}await ie.unlink(b),s++}catch{}}let a=ne.join(e,"sessions"),c=l(w=>{if(!w||!w.id)return;E.getDb(r).prepare(`
|
|
670
670
|
INSERT OR IGNORE INTO sessions
|
|
671
671
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
672
672
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
673
|
-
`).run(_(w.id),_(w.projectId)??r,_(w.task)??"",_(w.status)??"completed",_(w.startedAt)??new Date().toISOString(),_(w.pausedAt),_(w.completedAt),
|
|
674
|
-
`)}},
|
|
675
|
-
`)}},
|
|
676
|
-
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function
|
|
673
|
+
`).run(_(w.id),_(w.projectId)??r,_(w.task)??"",_(w.status)??"completed",_(w.startedAt)??new Date().toISOString(),_(w.pausedAt),_(w.completedAt),en(w.duration)??0,w.metrics?JSON.stringify(w.metrics):"{}",w.timeline?JSON.stringify(w.timeline):"[]")},"sessionInsert"),u=ne.join(a,"current.json"),d=await ns(u);d!==null&&(c(d),await ie.unlink(u).catch(()=>{}),s++);let p=ne.join(a,"archive");try{let w=await ie.readdir(p);for(let h of w){let x=ne.join(p,h);try{if(!(await ie.stat(x)).isDirectory())continue;let I=await ie.readdir(x);for(let y of I){if(!y.endsWith(".json"))continue;let j=await ns(ne.join(x,y));j!==null&&(c(j),await ie.unlink(ne.join(x,y)).catch(()=>{}),s++)}(await ie.readdir(x)).length===0&&await ie.rmdir(x).catch(()=>{})}catch{}}(await ie.readdir(p).catch(()=>[])).length===0&&await ie.rmdir(p).catch(()=>{})}catch{}try{(await ie.readdir(a)).length===0&&await ie.rmdir(a).catch(()=>{})}catch{}let m=ne.join(e,"index"),g=[..._l.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let b=ne.join(m,w),h=await ns(b);if(h===null)continue;let x=_l.find(T=>T.filename===w);x&&(E.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",x.key,JSON.stringify(h),new Date().toISOString()),wg(r,x.key,h));try{await ie.unlink(b)}catch{}s++}return s}var Nl,_l,Ll=S(()=>{"use strict";ve();W();ee();Nl=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],_l=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Bi,"migrateJsonToSqlite");l(_b,"createBackup");l(Ol,"copyFiles");l(yg,"populateNormalized");l(Nb,"populateTasksFromState");l(Lb,"populateQueueTasks");l(Fb,"populateIdeas");l(Ub,"populateShippedFeatures");l(Hb,"populateMetricsDaily");l(Wb,"populateAnalysis");l(wg,"populateIndexTables");l(Gb,"populateCategoriesIndex");l(qb,"migrateChecksums");l(Bb,"migrateFileScores");l(Vb,"migrateEventsJsonl");l(Jb,"migrateLearningsJsonl");l(zb,"migrateSessionFiles");l(Xb,"cleanupJsonFiles");l(_,"toStr");l(en,"toNum");l(ns,"readJsonSafe");l(Vi,"sweepLegacyJson")});var So,Fl,Ul,kg=S(()=>{"use strict";yo();K();So=3,Fl=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=So){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${So} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=So){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${So} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of n)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=So&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((s,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[et.FILE_STRUCTURE,et.ARCHITECTURE],tech_stack:[et.TECH_STACK],architecture:[et.ARCHITECTURE,et.CODE_STYLE],estimation:[et.SHIP_WORKFLOW],workflow:[et.SHIP_WORKFLOW,et.CODE_STYLE],gotcha:[et.TEST_BEHAVIOR,et.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(`
|
|
674
|
+
`)}},Ul=new Fl});import{z as R}from"zod";var Sg,Kb,Yb,bg,Qb,Zb,ev,tv,sv,nv,rv,vg,ov,iv,oM,Tg,Eg,Cg,Pg,av,Ji,xg=S(()=>{"use strict";Sg=R.number().min(1).max(5),Kb=R.enum(["exceeded","met","partial","failed"]),Yb=R.enum(["definitely","probably","maybe","no"]),bg=R.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Qb=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:bg.optional(),explanation:R.string().optional()})}),Zb=R.object({name:R.string(),baseline:R.number().nullable(),target:R.number(),actual:R.number(),unit:R.string(),achieved:R.boolean(),percentOfTarget:R.number()}),ev=R.object({criteria:R.string(),met:R.boolean(),notes:R.string().optional()}),tv=R.object({metrics:R.array(Zb),acceptanceCriteria:R.array(ev),overallSuccess:Kb,successScore:R.number().min(0).max(100)}),sv=R.object({category:R.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:R.string(),actionable:R.boolean(),action:R.string().optional()}),nv=R.object({whatWorked:R.array(R.string()),whatDidnt:R.array(R.string()),surprises:R.array(R.string()),recommendations:R.array(sv)}),rv=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:Yb,worthItReason:R.string().optional(),alternativeConsidered:R.string().optional(),betterAlternativeExists:R.boolean().optional()}),vg=R.object({id:R.string(),taskId:R.string(),description:R.string(),estimatedMinutes:R.number().optional(),actualMinutes:R.number(),completedAsPlanned:R.boolean(),qualityScore:Sg,blockers:R.array(R.string()),agentUsed:R.string().optional(),skillsUsed:R.array(R.string()).optional(),startedAt:R.string(),completedAt:R.string()}),ov=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:Qb,success:tv.optional(),learnings:nv,roi:rv,rating:Sg,taskOutcomes:R.array(vg).optional(),startedAt:R.string(),shippedAt:R.string(),reviewedAt:R.string().optional(),reviewedBy:R.string().optional(),legacy:R.boolean().optional()}),iv=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:bg,count:R.number(),averageVariance:R.number()})),topLearnings:R.array(R.object({insight:R.string(),frequency:R.number()}))}),oM=R.object({outcomes:R.array(ov),taskOutcomes:R.array(vg).optional(),aggregates:iv.optional(),lastUpdated:R.string(),lastAggregated:R.string().optional()}),Tg={outcomes:[],taskOutcomes:[],lastUpdated:""},Eg=l((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),Cg=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Pg=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),av=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Ji=l(r=>{if(r.length===0)return{totalFeatures:0,averageEstimationAccuracy:0,averageSuccessRate:0,averageROI:0,bySuccessLevel:{exceeded:0,met:0,partial:0,failed:0},variancePatterns:[],topLearnings:[]};let e=r.map(d=>av(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,p)=>{let m=p.effort.variance.reason;return d[m]||(d[m]={count:0,totalVariance:0}),d[m].count++,d[m].totalVariance+=p.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,p])=>({reason:d,count:p.count,averageVariance:Math.round(p.totalVariance/p.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,p)=>(d[p]=(d[p]||0)+1,d),{}),u=Object.entries(c).sort((d,p)=>p[1]-d[1]).slice(0,10).map(([d,p])=>({insight:d,frequency:p}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,p)=>d+p,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,p)=>d+p,0)/t.length):0,averageROI:Math.round(s.reduce((d,p)=>d+p,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var Hl,jg,Rg=S(()=>{"use strict";xg();As();K();Hl=class extends dt{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...Tg,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Ji([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((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),n=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:n}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Ji(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Ji(t.outcomes),lastAggregated:v(),lastUpdated:v()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&Lt(e.duration)||60,s=t/60,n=t/60,o=Eg(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Cg(5,n);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:s,confidence:"low",source:"manual"},actual:{hours:n,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Pg(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}}},jg=new Hl});import Wl from"node:fs/promises";import zi from"node:path";var Gl,ql,Ag,Ig=S(()=>{"use strict";W();B();Gl=".prjct/.prjct-state.md",ql=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=zi.join(e,Gl);await Wl.mkdir(zi.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await Wl.writeFile(s,n,"utf-8")}async remove(e){try{await Wl.unlink(zi.join(e,Gl))}catch(t){if(!O(t))throw t}}async exists(e){let t=zi.join(e,Gl);return C(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
675
|
+
`)}},Ag=new ql});var Bl,Ht,In=S(()=>{"use strict";Te();Bs();ee();Bl=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await $.getProjectId(e);if(!o)return;N.appendEvent(o,`memory.${t}`,{...s,author:n})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await $.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 n=await this.getRecent(e,1e3),o=t.toLowerCase();return n.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-s)}async getByAction(e,t,s=50){try{let n=await $.getProjectId(e);return n?N.query(n,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,s).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async clear(e){try{let t=await $.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(n=>{let o=JSON.parse(n.data);return{timestamp:n.timestamp,action:n.type.replace("memory.",""),...o}})}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async capEntries(e){try{let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=Rs.MEMORY_MAX_ENTRIES)return 0;let n=s-Rs.MEMORY_MAX_ENTRIES,o=N.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);Rt.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),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Ht=new Bl});import cv from"node:path";function lv(r){return vn(cv.resolve(r))}function bo(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function uv(r){return Ac(r,e=>`${bo(e.name)}::${bo(e.source)}`)}function dv(r){return Ac(r,e=>`${bo(e.issue)}::${bo(e.file)}::${bo(e.source)}`)}var Vl,mv,Dg,$g=S(()=>{"use strict";ee();ai();Tn();l(lv,"repoHash");l(bo,"normalizeKey");l(uv,"dedupePatterns");l(dv,"dedupeAntiPatterns");Vl=class{static{l(this,"PatternExtractor")}async extract(e){let t=lv(e.projectPath),s=[];if(e.context7Verified)for(let u of e.frameworks)s.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=uv([...s,...n]),a=dv([...o]),c=`analysis:derived-rules:${t}`;return E.setDoc(e.projectId,c,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},mv=new Vl,Dg=mv});import vo from"node:fs/promises";import pv from"node:os";import To from"node:path";function gv(r){return`# ${r.projectName}
|
|
676
|
+
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function fv(r){return r.patterns.length===0?"":`
|
|
677
677
|
## Patterns
|
|
678
678
|
${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
|
|
679
679
|
`)}
|
|
680
|
-
`}function
|
|
680
|
+
`}function hv(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
|
|
681
681
|
## Anti-Patterns
|
|
682
682
|
${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
|
|
683
683
|
`)}
|
|
684
|
-
`}function
|
|
684
|
+
`}function yv(r){return r.knownGotchas.length===0?"":`
|
|
685
685
|
## Known Gotchas
|
|
686
686
|
${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
|
|
687
687
|
`)}
|
|
688
|
-
`}function
|
|
688
|
+
`}function wv(r){return r.recentShipped.length===0?"":`
|
|
689
689
|
## Recent Deliveries
|
|
690
690
|
${r.recentShipped.slice(0,5).map(t=>{let s=[`"${t.name}"`,t.type];return t.duration&&s.push(t.duration),t.filesChanged&&s.push(`${t.filesChanged} files`),`- ${s.join(" \u2014 ")}`}).join(`
|
|
691
691
|
`)}
|
|
692
|
-
`}function
|
|
692
|
+
`}function kv(r){if(!r.velocity)return"";let e=[];return r.velocity.avgPoints!=null&&e.push(`${r.velocity.avgPoints} pts/sprint`),r.velocity.trend&&e.push(r.velocity.trend),r.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${r.velocity.accuracy}%`),e.length===0?"":`
|
|
693
693
|
## Velocity
|
|
694
694
|
${e.join(" | ")}
|
|
695
|
-
`}function
|
|
695
|
+
`}function Sv(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
|
|
696
696
|
## Commands
|
|
697
697
|
| Action | Command |
|
|
698
698
|
|--------|---------|
|
|
699
699
|
${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
|
|
700
700
|
`)}
|
|
701
|
-
`}function
|
|
701
|
+
`}function bv(r){let e=[];if(r.hasActiveTask&&e.push(`Active task: **${r.activeTaskDescription}**`),r.pausedTasks.length>0)for(let s of r.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(r.backlogCount>0){let s=r.topBacklog.slice(0,3).map(n=>`${n.description} [${n.priority}]`).join(", ");e.push(`Backlog: ${r.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return r.ideasCount>0&&t.push(`Ideas: ${r.ideasCount} pending`),r.shippedCount>0&&t.push(`Shipped: ${r.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
|
|
702
702
|
## State
|
|
703
703
|
${e.join(`
|
|
704
704
|
`)}
|
|
705
|
-
`}function
|
|
705
|
+
`}function vv(r){return r.userPatterns.length===0?"":`
|
|
706
706
|
## User Patterns
|
|
707
707
|
${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
|
|
708
708
|
`)}
|
|
709
|
-
`}function
|
|
709
|
+
`}function Tv(r){return[fv(r),hv(r),yv(r),wv(r),kv(r),Sv(r.commands),bv(r),vv(r)].filter(Boolean).join("")}function Ev(r,e){let t=r.userInvocable!==!1;return`---
|
|
710
710
|
description: "${r.description} (${e.projectName}, ${e.stack})"
|
|
711
711
|
allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
|
|
712
712
|
user-invocable: ${t}
|
|
713
|
-
---`}function
|
|
713
|
+
---`}function Cv(r,e){return`${Ev(r,e)}
|
|
714
714
|
|
|
715
|
-
${r.body(e)}`}var
|
|
716
|
-
${
|
|
715
|
+
${r.body(e)}`}var Jl,zl,Mg,Og=S(()=>{"use strict";xs();Is();l(gv,"formatProjectHeader");l(fv,"formatPatterns");l(hv,"formatAntiPatterns");l(yv,"formatGotchas");l(wv,"formatRecentShipped");l(kv,"formatVelocity");l(Sv,"formatCommands");l(bv,"formatState");l(vv,"formatUserPatterns");l(Tv,"formatRichContext");Jl=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${gv(r)}
|
|
716
|
+
${Tv(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n### Register Task\n```bash\nprjct task "$ARGUMENTS" --md\n```\nRead the Context Contract from CLI output \u2014 it has file paths, subtasks, and scope.\nIf CLI output is JSON with `options`, present choices to user.\n\n### Execute\n- Create feature branch if on main: `git checkout -b {type}/{slug}`\n- Work through subtasks; mark each done: `prjct done --md`\n### Ship\nWhen complete: `p. ship` or `prjct ship --md`\n',"body")},{name:"prjct-done",description:'Marks the current task as complete and feeds the feedback loop. Use when the user says "done", "finished", "ship it", or wants to complete current work. Completion data flows to sync \u2192 skill regeneration.',allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
|
|
717
717
|
Active task: **${r.activeTaskDescription}**`),e.push('\n```bash\nprjct done "$ARGUMENTS" --md\n```\nRead CLI output for completion summary and next steps.\n'),e.join(`
|
|
718
718
|
`)},"body")},{name:"prjct-ship",description:"Ship feature: PR, version bump, changelog. Auto-completes active task if one exists before shipping.",allowedTools:["Bash","Read","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
|
|
719
719
|
|
|
@@ -817,32 +817,32 @@ prjct tokens <input_tokens> <output_tokens>
|
|
|
817
817
|
|
|
818
818
|
Tokens accumulate \u2014 call multiple times during a task and they add up.
|
|
819
819
|
Token totals are saved to task history on completion for cost comparison across tasks.
|
|
820
|
-
`,"body")}];l(
|
|
821
|
-
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),
|
|
822
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await F('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){V.debug("Git analysis failed (not a git repo?)",{error:ye(t)})}return e}async function rs(r,e){let t=await C(Ql.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Kg(r){let e={fileCount:0,version:"0.0.0",name:Ql.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await F('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){V.debug("File count failed",{path:r,error:ye(t)}),e.fileCount=0}try{let t=Ql.join(r,"package.json"),s=await Ae(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await rs(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:ye(t)})}return await rs(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await rs(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await rs(r,"requirements.txt")||await rs(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Xg(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await rs(r,"bun.lockb")||await rs(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rs(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await rs(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await rs(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await rs(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Yg(r){return new Xi(r).detect()}var Qg=S(()=>{"use strict";Ps();Bg();Je();B();As();Jg();l(zg,"analyzeGit");l(rs,"fileExistsInProject");l(Kg,"gatherStats");l(Xg,"detectCommands");l(Yg,"detectStack")});import Zg from"node:fs/promises";import Yi from"node:path";var Zl,eu,ef,tf=S(()=>{"use strict";St();W();Je();B();Zl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Yi.join(r,n);await C(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Yi.basename(r);try{await L.read(s)}catch(n){O(n)||t.push(`state: ${k(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Yi.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await Zg.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Zg.readFile(Yi.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!O(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},eu=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[Zl.contextFilesExist(t),Zl.jsonFilesValid(t),Zl.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(w=>w.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 w=s.checks.slice(s.checks.indexOf(p)+1);a+=w.filter(b=>b.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await F(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},ef=new eu});import sf from"node:fs/promises";import tu from"node:path";var su,Os,Qi=S(()=>{"use strict";ul();bl();Zm();sg();cg();Al();Ps();lt();$s();Te();ve();hr();ur();qs();ee();Vs();er();go();Hl();Vt();Js();St();wi();X();B();As();jg();Lg();gr();Ug();$n();Wg();qg();Qg();tf();su=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await sf.rm(tu.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Sn()).installed){let y=await fr({autoRepair:!0});y.verified||V.warn(`Codex p. router not ready: ${y.message||"verification failed"}`)}try{n=await ss.ensureReady()}catch(y){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:ye(y)},error:`Context7 MCP is required but not ready: ${ye(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Vi(this.projectId);try{let y=await Ji(this.projectId);y>0&&V.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){V.debug("Legacy JSON sweep failed (non-critical)",{error:ye(y)})}let[a,c,u,d]=await Promise.all([zg(this.projectPath),Kg(this.projectPath),Xg(this.projectPath),Yg(this.projectPath)]),m=t.full===!0,p,g=!0,w=new Set;if(!m&&tg(this.projectId))try{let{diff:y,currentHashes:j}=await Dl(this.projectPath,this.projectId),D=y.added.length+y.modified.length+y.deleted.length;if(D===0&&!t.changedFiles?.length)g=!1,p={isIncremental:!0,filesChanged:0,filesUnchanged:y.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let G=Ym(y,this.projectId);w=Qm(G.allAffected);let Q=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=G.allAffected.some(he=>{let Ne=he.substring(he.lastIndexOf("."));return Q.has(Ne)}),p={isIncremental:!0,filesChanged:D,filesUnchanged:y.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(w)}}Il(this.projectId,j)}catch(y){V.debug("Incremental detection failed, falling back to full sync",{error:ye(y)})}else try{let{currentHashes:y}=await Dl(this.projectPath,this.projectId);Il(this.projectId,y)}catch(y){V.debug("Hash computation failed (non-critical)",{error:ye(y)})}if(g)try{await Promise.all([Om(this.projectPath,this.projectId),Xm(this.projectPath,this.projectId),ag(this.projectPath,this.projectId)])}catch(y){V.debug("File ranking index build failed (non-critical)",{error:ye(y)})}let b;try{let[y,j,D,G,Q,Ve,he,Ne,us,Va,Ja]=await Promise.all([Promise.resolve(Qt.getActive(this.projectId)).catch(()=>null),mt.getActive(this.projectId).catch(()=>null),it.getRecent(this.projectId,3).catch(()=>[]),tr.getMetrics(this.projectId).catch(()=>null),ce.getBacklog(this.projectId).catch(()=>[]),L.getTaskHistory(this.projectId).catch(()=>[]),L.getAllPausedTasks(this.projectId).catch(()=>[]),L.getAggregatedFeedback(this.projectId).catch(()=>null),L.getCurrentTask(this.projectId).catch(()=>null),$e.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),it.getCount(this.projectId).catch(()=>0)]),za={backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,hasActiveTask:!!us},Ka=y?y.patterns.map(ue=>({name:ue.name,description:ue.description,location:ue.locations?.[0]})):(j?.patterns??[]).filter(ue=>ue.source!=="repo").map(ue=>({name:ue.name,description:ue.description,location:ue.location})),Xa=y?y.antiPatterns.map(ue=>({issue:ue.issue,file:ue.files?.[0]??"multiple",suggestion:ue.suggestion,severity:ue.severity??"medium"})):(j?.antiPatterns??[]).filter(ue=>ue.source!=="repo").map(ue=>({issue:ue.issue,file:ue.file,suggestion:ue.suggestion,severity:ue.severity??"medium"})),Ya=y?.commands?{install:y.commands.install??u.install,run:u.run,test:y.commands.test??u.test,build:y.commands.build??u.build,dev:y.commands.dev??u.dev,lint:y.commands.lint??u.lint,format:y.commands.format??u.format}:u,Qa={version:c.version,fileCount:c.fileCount,patterns:Ka,antiPatterns:Xa,recentShipped:D.map(ue=>({name:ue.name,type:ue.type??"feature",duration:ue.duration,filesChanged:ue.changes?.length})),velocity:G?{avgPoints:G.averageVelocity,trend:G.velocityTrend,accuracy:G.estimationAccuracy}:null,backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,knownGotchas:Ne?.knownGotchas??[],userPatterns:Ne?.patternsDiscovered??[],hasActiveTask:!!us,activeTaskDescription:us?.description??"",pausedTasks:he.map(ue=>({description:ue.description,pausedAt:ue.pausedAt??""})),topBacklog:Q.slice(0,3).map(ue=>({description:ue.description,priority:ue.priority??"medium"})),ideasCount:Va?.pending??0,shippedCount:Ja};b=await Gg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Ya,stack:d},za,Qa)}catch(y){V.debug("Native skill generation failed (non-critical)",{error:ye(y)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let h=await mt.getActive(this.projectId),x={patterns:h?.patterns?.length||0,antiPatterns:h?.antiPatterns?.length||0,criticalAntiPatterns:h?.antiPatterns?.filter(y=>y.severity==="high").length||0},T=Date.now()-s,I=await this.recordSyncMetrics(c,T);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ue.installGlobalConfig(),await Ue.syncCommands();let M;try{let y=await $.readConfig(this.projectPath);M=await ef.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){V.debug("Verification failed (non-critical)",{error:ye(y)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:x,syncMetrics:I,verification:M,incremental:p,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:ye(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>sf.mkdir(tu.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=E.getDoc(this.projectId,"project")||{},n={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};E.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await L.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=v(),n.lastUpdated=v(),n.context={...n.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,n);try{await Fg.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:ye(o)})}}async logToMemory(e,t){E.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=Ni(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){V.debug("Could not load BM25 index for metrics",{error:ye(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Zt.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:ye(a)})}let i={};try{let a=Ni(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Hi(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=ig(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:ye(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await L.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 Hg.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await mt.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){V.debug("Failed to save draft analysis (non-critical)",{error:ye(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([it.archiveOldShipped(this.projectId).catch(()=>0),$e.markDormantIdeas(this.projectId).catch(()=>0),ce.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),Wt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){V.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Rt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:ye(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new ar,s=await Gl.learnFromTaskHistory(this.projectId,e,t);try{let n=await Ng.getFeatureOutcomes(this.projectId);n.length>0&&await Gl.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&V.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){V.debug("Auto-learning failed (non-critical)",{error:ye(e)})}}async getCliVersion(){try{let e=tu.join(__dirname,"..","..","package.json");return(await Ae(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:ye(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:[]}}},Os=new su});var af={};Se(af,{mdActionRequired:()=>It,mdBadge:()=>Zi,mdCallout:()=>os,mdCodeBlock:()=>nu,mdDone:()=>fe,mdError:()=>Av,mdFooter:()=>rf,mdFrontmatter:()=>of,mdHeader:()=>nf,mdJoin:()=>ea,mdList:()=>He,mdNextSteps:()=>le,mdObsidianNote:()=>_s,mdOutput:()=>U,mdRelevantFiles:()=>ou,mdSection:()=>te,mdStats:()=>Ye,mdSubtasks:()=>ru,mdTable:()=>sn,mdTaskHeader:()=>yr,mdWarn:()=>iu});function nf(){return"---"}function rf(){return`---
|
|
823
|
-
prjct v${
|
|
824
|
-
`)}function
|
|
820
|
+
`,"body")}];l(Ev,"buildFrontmatter");l(Cv,"buildSkillContent");zl=class{static{l(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let n={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:s?.version??e.stats.version??"0.0.0",fileCount:s?.fileCount??e.stats.fileCount??0,patterns:s?.patterns??[],antiPatterns:s?.antiPatterns??[],recentShipped:s?.recentShipped??[],velocity:s?.velocity??null,backlogCount:s?.backlogCount??t.backlogCount,completedTaskCount:s?.completedTaskCount??t.completedTaskCount,pausedTaskCount:s?.pausedTaskCount??t.pausedTaskCount,knownGotchas:s?.knownGotchas??[],hasActiveTask:s?.hasActiveTask??t.hasActiveTask,activeTaskDescription:s?.activeTaskDescription??"",pausedTasks:s?.pausedTasks??[],topBacklog:s?.topBacklog??[],ideasCount:s?.ideasCount??0,shippedCount:s?.shippedCount??0,userPatterns:s?.userPatterns??[]},i=To.join(pv.homedir(),".claude","skills");for(let c of Jl){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await vo.rm(To.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=Cv(c,o),d=To.join(i,c.name),p=To.join(d,"SKILL.md");await vo.mkdir(d,{recursive:!0}),await vo.writeFile(p,u,"utf-8"),n.generated.push({name:c.name,path:p})}catch(u){V.debug(`Failed to generate skill ${c.name}`,{error:we(u)}),n.skipped.push({name:c.name,reason:we(u)})}}let a=new Set(Jl.map(c=>c.name));try{let c=await vo.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await vo.rm(To.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&V.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return Jl}},Mg=new zl});var _g=S(()=>{"use strict"});import Pv from"node:fs/promises";import Ng from"node:path";var Xi,Lg=S(()=>{"use strict";B();Xi=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let s={...t.dependencies,...t.devDependencies};this.detectFrontend(s,e),this.detectBackend(s,e),this.detectDatabase(s,e),this.detectTesting(s,t,e),this.collectFrameworks(s,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(n=>e[n])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(n=>e[n])&&(t.hasDatabase=!0)}detectTesting(e,t,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(s.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Ng.join(this.projectPath,"package.json"),t=await Pv.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Ng.join(this.projectPath,e))}}});import Xl from"node:path";async function Fg(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await F("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await F("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await F("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await F("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
821
|
+
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),p=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(p):d.includes("M")?e.modifiedFiles.push(p):d.startsWith("??")&&e.untrackedFiles.push(p)}let{stdout:a}=await F('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
822
|
+
`).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});let{stdout:c}=await F('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){V.debug("Git analysis failed (not a git repo?)",{error:we(t)})}return e}async function rs(r,e){let t=await C(Xl.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Ug(r){let e={fileCount:0,version:"0.0.0",name:Xl.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await F('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){V.debug("File count failed",{path:r,error:we(t)}),e.fileCount=0}try{let t=Xl.join(r,"package.json"),s=await Ae(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await rs(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:we(t)})}return await rs(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await rs(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await rs(r,"requirements.txt")||await rs(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Hg(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await rs(r,"bun.lockb")||await rs(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rs(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await rs(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await rs(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await rs(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Wg(r){return new Xi(r).detect()}var Gg=S(()=>{"use strict";xs();_g();Je();B();Is();Lg();l(Fg,"analyzeGit");l(rs,"fileExistsInProject");l(Ug,"gatherStats");l(Hg,"detectCommands");l(Wg,"detectStack")});import qg from"node:fs/promises";import Ki from"node:path";var Kl,Yl,Bg,Vg=S(()=>{"use strict";vt();W();Je();B();Kl={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Ki.join(r,n);await C(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Ki.basename(r);try{await L.read(s)}catch(n){O(n)||t.push(`state: ${k(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Ki.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await qg.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await qg.readFile(Ki.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!O(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${k(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},Yl=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[Kl.contextFilesExist(t),Kl.jsonFilesValid(t),Kl.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(w=>w.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let w=s.checks.slice(s.checks.indexOf(m)+1);a+=w.filter(b=>b.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await F(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},Bg=new Yl});import Jg from"node:fs/promises";import Ql from"node:path";var Zl,Ns,Yi=S(()=>{"use strict";ol();wl();qp();Jp();Zp();xl();xs();lt();Os();Te();ve();fr();lr();Bs();ee();Js();er();mo();Ll();Vt();zs();vt();gi();K();B();Is();kg();Rg();pr();Ig();In();$g();Og();Gg();Vg();Zl=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Jg.rm(Ql.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await kn()).installed){let y=await gr({autoRepair:!0});y.verified||V.warn(`Codex p. router not ready: ${y.message||"verification failed"}`)}try{n=await ss.ensureReady()}catch(y){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:we(y)},error:`Context7 MCP is required but not ready: ${we(y)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Bi(this.projectId);try{let y=await Vi(this.projectId);y>0&&V.info("Swept legacy JSON files into SQLite",{swept:y})}catch(y){V.debug("Legacy JSON sweep failed (non-critical)",{error:we(y)})}let[a,c,u,d]=await Promise.all([Fg(this.projectPath),Ug(this.projectPath),Hg(this.projectPath),Wg(this.projectPath)]),p=t.full===!0,m,g=!0,w=new Set;if(!p&&Vp(this.projectId))try{let{diff:y,currentHashes:j}=await Rl(this.projectPath,this.projectId),D=y.added.length+y.modified.length+y.deleted.length;if(D===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:y.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let G=Wp(y,this.projectId);w=Gp(G.allAffected);let Q=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=G.allAffected.some(he=>{let Ne=he.substring(he.lastIndexOf("."));return Q.has(Ne)}),m={isIncremental:!0,filesChanged:D,filesUnchanged:y.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(w)}}jl(this.projectId,j)}catch(y){V.debug("Incremental detection failed, falling back to full sync",{error:we(y)})}else try{let{currentHashes:y}=await Rl(this.projectPath,this.projectId);jl(this.projectId,y)}catch(y){V.debug("Hash computation failed (non-critical)",{error:we(y)})}if(g)try{await Promise.all([Pp(this.projectPath,this.projectId),Hp(this.projectPath,this.projectId),Qp(this.projectPath,this.projectId)])}catch(y){V.debug("File ranking index build failed (non-critical)",{error:we(y)})}let b;try{let[y,j,D,G,Q,Ve,he,Ne,us,Wa,Ga]=await Promise.all([Promise.resolve(Qt.getActive(this.projectId)).catch(()=>null),pt.getActive(this.projectId).catch(()=>null),it.getRecent(this.projectId,3).catch(()=>[]),tr.getMetrics(this.projectId).catch(()=>null),ce.getBacklog(this.projectId).catch(()=>[]),L.getTaskHistory(this.projectId).catch(()=>[]),L.getAllPausedTasks(this.projectId).catch(()=>[]),L.getAggregatedFeedback(this.projectId).catch(()=>null),L.getCurrentTask(this.projectId).catch(()=>null),$e.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),it.getCount(this.projectId).catch(()=>0)]),qa={backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,hasActiveTask:!!us},Ba=y?y.patterns.map(ue=>({name:ue.name,description:ue.description,location:ue.locations?.[0]})):(j?.patterns??[]).filter(ue=>ue.source!=="repo").map(ue=>({name:ue.name,description:ue.description,location:ue.location})),Va=y?y.antiPatterns.map(ue=>({issue:ue.issue,file:ue.files?.[0]??"multiple",suggestion:ue.suggestion,severity:ue.severity??"medium"})):(j?.antiPatterns??[]).filter(ue=>ue.source!=="repo").map(ue=>({issue:ue.issue,file:ue.file,suggestion:ue.suggestion,severity:ue.severity??"medium"})),Ja=y?.commands?{install:y.commands.install??u.install,run:u.run,test:y.commands.test??u.test,build:y.commands.build??u.build,dev:y.commands.dev??u.dev,lint:y.commands.lint??u.lint,format:y.commands.format??u.format}:u,za={version:c.version,fileCount:c.fileCount,patterns:Ba,antiPatterns:Va,recentShipped:D.map(ue=>({name:ue.name,type:ue.type??"feature",duration:ue.duration,filesChanged:ue.changes?.length})),velocity:G?{avgPoints:G.averageVelocity,trend:G.velocityTrend,accuracy:G.estimationAccuracy}:null,backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,knownGotchas:Ne?.knownGotchas??[],userPatterns:Ne?.patternsDiscovered??[],hasActiveTask:!!us,activeTaskDescription:us?.description??"",pausedTasks:he.map(ue=>({description:ue.description,pausedAt:ue.pausedAt??""})),topBacklog:Q.slice(0,3).map(ue=>({description:ue.description,priority:ue.priority??"medium"})),ideasCount:Wa?.pending??0,shippedCount:Ga};b=await Mg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Ja,stack:d},qa,za)}catch(y){V.debug("Native skill generation failed (non-critical)",{error:we(y)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let h=await pt.getActive(this.projectId),x={patterns:h?.patterns?.length||0,antiPatterns:h?.antiPatterns?.length||0,criticalAntiPatterns:h?.antiPatterns?.filter(y=>y.severity==="high").length||0},T=Date.now()-s,I=await this.recordSyncMetrics(c,T);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ue.installGlobalConfig(),await Ue.syncCommands();let M;try{let y=await $.readConfig(this.projectPath);M=await Bg.verify(this.projectPath,this.globalPath,y?.verification)}catch(y){V.debug("Verification failed (non-critical)",{error:we(y)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:x,syncMetrics:I,verification:M,incremental:m,generatedSkills:b}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:we(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Jg.mkdir(Ql.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=E.getDoc(this.projectId,"project")||{},n={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||v(),lastSync:v(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};E.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await L.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=v(),n.lastUpdated=v(),n.context={...n.context||{},lastSession:v(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,n);try{await Ag.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:we(o)})}}async logToMemory(e,t){E.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=_i(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){V.debug("Could not load BM25 index for metrics",{error:we(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Zt.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:we(a)})}let i={};try{let a=_i(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Ui(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Yp(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:we(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await L.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 Dg.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await pt.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){V.debug("Failed to save draft analysis (non-critical)",{error:we(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([it.archiveOldShipped(this.projectId).catch(()=>0),$e.markDormantIdeas(this.projectId).catch(()=>0),ce.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),Ht.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){V.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Rt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:we(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new ir,s=await Ul.learnFromTaskHistory(this.projectId,e,t);try{let n=await jg.getFeatureOutcomes(this.projectId);n.length>0&&await Ul.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&V.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){V.debug("Auto-learning failed (non-critical)",{error:we(e)})}}async getCliVersion(){try{let e=Ql.join(__dirname,"..","..","package.json");return(await Ae(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:we(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:[]}}},Ns=new Zl});var Yg={};ye(Yg,{mdActionRequired:()=>It,mdBadge:()=>Qi,mdCallout:()=>os,mdCodeBlock:()=>eu,mdDone:()=>fe,mdError:()=>xv,mdFooter:()=>Xg,mdFrontmatter:()=>Kg,mdHeader:()=>zg,mdJoin:()=>Zi,mdList:()=>He,mdNextSteps:()=>le,mdObsidianNote:()=>Ls,mdOutput:()=>U,mdRelevantFiles:()=>su,mdSection:()=>te,mdStats:()=>Ye,mdSubtasks:()=>tu,mdTable:()=>tn,mdTaskHeader:()=>hr,mdWarn:()=>nu});function zg(){return"---"}function Xg(){return`---
|
|
823
|
+
prjct v${Sn()}`}function U(...r){return Zi(zg(),...r.filter(Boolean),Xg())}function tn(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
|
|
824
|
+
`)}function eu(r,e=""){return`\`\`\`${e}
|
|
825
825
|
${r}
|
|
826
|
-
\`\`\``}function
|
|
826
|
+
\`\`\``}function Qi(r,e){return`**${r}**: \`${e}\``}function os(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function te(r,e,t=3){return`### ${r}
|
|
827
827
|
${e}`}function He(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
|
|
828
|
-
`)}function
|
|
829
|
-
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function
|
|
830
|
-
${
|
|
828
|
+
`)}function hr(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.estimatedPoints&&e.push(`~${r.estimatedPoints}pts`),r.estimatedMinutes&&e.push(`~${r.estimatedMinutes}min`),r.domains&&r.domains.length>0&&e.push(`Domains: ${r.domains.join(", ")}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
|
|
829
|
+
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function tu(r,e){let t=["#","Status","Description"],s=r.map((n,o)=>{let i=String(o+1),a;n.status==="completed"?a="done":o===e?a="current":a="pending";let c=o===e?" **<- current**":"";return[i,a,`${n.description}${c}`]});return`### Subtasks
|
|
830
|
+
${tn(t,s)}`}function su(r){return r.length===0?"":`### Relevant Files
|
|
831
831
|
${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
|
|
832
832
|
`)}`}function le(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
|
|
833
|
-
${
|
|
834
|
-
> ${e}`:`## ${r}`}function
|
|
835
|
-
`)}function
|
|
833
|
+
${tn(e,t)}`}function Ye(r){let e=Object.entries(r).filter(([,n])=>n!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([n,o])=>[n,String(o)]);return tn(t,s)}function fe(r,e){return e?`## ${r}
|
|
834
|
+
> ${e}`:`## ${r}`}function nu(r){return`> **WARNING:** ${r}`}function xv(r){return`> **ERROR:** ${r}`}function Kg(r){let e=["---"];for(let[t,s]of Object.entries(r))s!=null&&(Array.isArray(s)?e.push(`${t}: [${s.map(n=>String(n)).join(", ")}]`):typeof s=="object"||e.push(`${t}: ${String(s)}`));return e.push("---"),e.join(`
|
|
835
|
+
`)}function Ls(r,e,...t){return[Kg(r),`# ${e}`,...t.filter(Boolean)].join(`
|
|
836
836
|
|
|
837
|
-
`)}function
|
|
837
|
+
`)}function Zi(...r){return r.filter(Boolean).join(`
|
|
838
838
|
|
|
839
839
|
`)}function It(r,e,t,s){let n=e.replace(/_/g," "),o=[`> **${r}**: ${n}`];if(s)for(let[i,a]of Object.entries(s))o.push(`> ${i}: ${a}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
|
|
840
|
-
`))}var
|
|
841
|
-
Next:`));for(let o of n){let i=
|
|
842
|
-
`));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return
|
|
843
|
-
`)}function
|
|
840
|
+
`))}var hs=S(()=>{"use strict";ut();l(zg,"mdHeader");l(Xg,"mdFooter");l(U,"mdOutput");l(tn,"mdTable");l(eu,"mdCodeBlock");l(Qi,"mdBadge");l(os,"mdCallout");l(te,"mdSection");l(He,"mdList");l(hr,"mdTaskHeader");l(tu,"mdSubtasks");l(su,"mdRelevantFiles");l(le,"mdNextSteps");l(Ye,"mdStats");l(fe,"mdDone");l(nu,"mdWarn");l(xv,"mdError");l(Kg,"mdFrontmatter");l(Ls,"mdObsidianNote");l(Zi,"mdJoin");l(It,"mdActionRequired")});import Eo from"chalk";function Wt(r,e={}){if(e.quiet)return;let t=Zg[r]||"idle",s=bn.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:Qg[o]||o}));console.log(Eo.dim(`
|
|
841
|
+
Next:`));for(let o of n){let i=Eo.cyan(o.cmd.padEnd(12));console.log(Eo.dim(` ${i} \u2192 ${o.desc}`))}}function ea(r,e=!1){let t=Zg[r]||"idle";return bn.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:Qg[n]||n}))}function Co(r){let e=bn.getStateInfo(r);console.log(Eo.dim(`\u{1F4CD} State: ${Eo.white(r.toUpperCase())} - ${e.description}`))}var Qg,Zg,yr=S(()=>{"use strict";Mc();Qg={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"},Zg={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(Wt,"showNextSteps");l(ea,"getNextSteps");l(Co,"showStateInfo")});import jv from"node:path";async function ru(r,e){let t=Date.now()-e;await Ue.installGlobalConfig(),f.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",n=r.syncMetrics?.indexes,o=[`${r.stats.fileCount} files indexed`,`Stack: ${r.stats.ecosystem}${s} | Branch: ${r.git.branch}`];if(n?.bm25Files){let a=n.bm25Files*(n.bm25AvgTokens||0);o.push(`Index: ${wr(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
|
|
842
|
+
`));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Wt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function ef(r){try{let e=await Ht.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];n=xt(d)}}let o=s.filter(u=>u.action==="task_completed").length,i=s.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of s)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function wr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function ou(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function tf(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(n=>n.tokensSaved),s=Math.max(...t,1);return t.map(n=>{let o=Math.min(Math.floor(n/s*(e.length-1)),e.length-1);return e[o]}).join("")}function sf(r,e,t,s,n,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),n){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),n.sessionDuration&&i.push(`| Duration | ${n.sessionDuration} |`),i.push(`| Tasks completed | ${n.tasksCompleted} |`),i.push(`| Features shipped | ${n.featuresShipped} |`),n.agentsUsed.length>0){let a=n.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${wr(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${mi(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${ou(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${wr(r.last30DaysTokens)}`),r.trend!==0){let a=r.trend>0?"+":"";i.push(`- Trend: ${a}${r.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
|
|
843
|
+
`)}function nf(r,e){let t=[];t.push(`# Repository Analysis
|
|
844
844
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
845
|
-
`);let s=
|
|
845
|
+
`);let s=jv.basename(e);if(t.push(`## Project: ${s}
|
|
846
846
|
`),t.push(`## Stack Detected
|
|
847
847
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
848
848
|
`),t.push("- **Package Manager**: npm/yarn/pnpm"),i.dependencies){let a=Object.keys(i.dependencies);a.length>0&&t.push(`- **Dependencies**: ${a.slice(0,10).join(", ")}${a.length>10?` (+${a.length-10} more)`:""}`)}r.hasNextConfig&&t.push("- **Framework**: Next.js detected"),r.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),r.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}r.cargoToml&&(t.push(`### Rust
|
|
@@ -858,10 +858,10 @@ Next:`));for(let o of n){let i=xo.cyan(o.cmd.padEnd(12));console.log(xo.dim(` $
|
|
|
858
858
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
859
859
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
860
860
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
861
|
-
`)}var
|
|
861
|
+
`)}var rf=S(()=>{"use strict";Os();pi();In();K();yr();Fe();l(ru,"showSyncResult");l(ef,"getSessionActivity");l(wr,"formatTokens");l(ou,"formatDuration");l(tf,"generateSparkline");l(sf,"generateStatsMarkdown");l(nf,"generateAnalysisSummary")});var of,af,cf=S(()=>{"use strict";of=["task","done","ship","resume","bug","enrich"],af=["init","sync","pause","next","dash","history","undo","redo"]});import ys from"chalk";function Rv(r){return lf[r.toLowerCase()]||lf.default}var lf,iu,uf,df=S(()=>{"use strict";lf={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(Rv,"getIcon");iu=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(ys.cyan(`
|
|
862
862
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
863
|
-
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=
|
|
864
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${
|
|
863
|
+
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Rv(t);console.log(ys.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(ys.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(ys.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(ys.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,s=this.formatDuration(t),n=e?ys.green("\u2713"):ys.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${ys.dim(`(${s})`)}
|
|
864
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${ys.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(ys.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},uf=new iu});import mf from"node:fs";import ta from"node:path";function Av(r){if(gn()){let{Database:n}=Bt("bun:sqlite");return new n(r,{create:!0})}let e=Bt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var au,sa,pf=S(()=>{"use strict";eo();l(Av,"openDatabase");au=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?ta.resolve(e):ta.join(Bt("node:os").homedir(),".prjct-cli");this.dbPath=ta.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=ta.dirname(this.dbPath);mf.existsSync(e)||mf.mkdirSync(e,{recursive:!0});let t=Av(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(`
|
|
865
865
|
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
866
866
|
version INTEGER PRIMARY KEY,
|
|
867
867
|
name TEXT NOT NULL,
|
|
@@ -882,14 +882,14 @@ Next:`));for(let o of n){let i=xo.cyan(o.cmd.padEnd(12));console.log(xo.dim(` $
|
|
|
882
882
|
INSERT OR REPLACE INTO mcp_health
|
|
883
883
|
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
884
884
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
885
|
-
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},
|
|
886
|
-
`)}function Af(r){console.log(Fv(r))}var Rf,If=S(()=>{"use strict";Rf=[yt.cyan,yt.magenta,yt.yellow,yt.blue,yt.green,yt.redBright,yt.magentaBright,yt.cyanBright];l(Nv,"getDomainColor");l(Lv,"formatSubtaskLine");l(Fv,"renderSubtaskProgress");l(Af,"printSubtaskProgress")});function Hv(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function Wv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Uv)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:Hv(t)};return{detected:!1}}function Gv(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function qv(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function Bv(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function Vv(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var Uv,gu,Jv,Sr,Df=S(()=>{"use strict";Uv=[{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(Hv,"getHallucinationSuggestion");l(Wv,"detectHallucination");l(Gv,"isSimilarError");l(qv,"analyzeErrorPattern");l(Bv,"generateEscalationMessage");l(Vv,"generateSuggestion");gu=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>Gv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=qv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Bv(e,o,this.maxAttempts),suggestion:Vv(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return Wv(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}}},Jv=new gu,Sr=Jv});function fu(r,e){let t=Do(e),s=Am[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function zv(r,e){let t=Do(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Kv(r,e,t){let s=Do(t),n=fu(r,t),o=fu(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function ia(r,e=zs){let t=Do(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Xv(r,e),n=Yv(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=eT(o),a=Qv(o),c=Zv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=tT(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Mf(r,e,t=zs){let s=Do(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function Xv(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=Kv(i,n,e);if(!t.has(a)){let c=fu(i,e),u=zv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Yv(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+sT(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>hu(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function Qv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function Zv(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=hu(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function eT(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function tT(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=hu(n),i=n.tags&&n.tags.length>0?n.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],s=[];for(let[n,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function hu(r){if(!r.variance)return 0;let e=Ft(r.estimatedDuration),t=Ft(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Of(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
|
|
887
|
-
`)}function
|
|
885
|
+
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},sa=new au});import is from"node:fs/promises";import Po from"node:os";import gt from"node:path";function Iv(){try{let r=gt.dirname(Bt.resolve("prjct-cli/package.json"));return{command:"node",args:[gt.join(r,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}function gf(){return xo.split("@")[1]}function ws(){return process.env.PRJCT_TEST_MODE==="1"?gt.join(Po.tmpdir(),"prjct-context7-test","mcp.json"):gt.join(Po.homedir(),".claude","mcp.json")}async function ff(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:ws(),mergeIntoExisting:!1}];let r=Po.homedir(),e=[],t=gt.join(r,".claude");await Kt(t)&&e.push({provider:"claude",configPath:gt.join(t,"mcp.json"),mergeIntoExisting:!1});let s=gt.join(r,".gemini");return await Kt(s)&&e.push({provider:"gemini",configPath:gt.join(s,"settings.json"),mergeIntoExisting:!0}),e}async function hf(r){let e=await ff(),t=await Promise.all(e.map(async s=>({provider:s.provider,configured:await sn(r,s.configPath),path:s.configPath})));return{configured:t.some(s=>s.configured),providers:t}}async function na(r){let e;try{e=await is.readdir(r)}catch{return{valid:!1,reason:"directory not found"}}if(e.length===0)return{valid:!1,reason:"directory empty"};let t=e.filter(s=>s.endsWith("_tokens.json")||s.endsWith(".json"));if(t.length===0)return{valid:!1,reason:"no token files found"};for(let s of t){let n=gt.join(r,s);try{let o=await is.readFile(n,"utf-8"),i=JSON.parse(o);if(i.access_token||i.refresh_token)return{valid:!0}}catch{return{valid:!1,reason:`corrupt JSON in ${s}`}}}return{valid:!1,reason:"no valid tokens (missing access_token/refresh_token)"}}async function Dv(){let r=gf(),e=gt.join(Po.homedir(),".mcp-auth"),t=gt.join(e,`mcp-remote-${r}`);if((await na(t)).valid)return{migrated:!1,from:null,to:t};let n;try{n=await is.readdir(e)}catch{return{migrated:!1,from:null,to:t}}let o=n.filter(i=>i.startsWith("mcp-remote-")&&i!==`mcp-remote-${r}`).sort().reverse();for(let i of o){let a=gt.join(e,i);if((await na(a)).valid){await is.mkdir(t,{recursive:!0});let u=await is.readdir(a);for(let d of u)await is.copyFile(gt.join(a,d),gt.join(t,d));return{migrated:!0,from:a,to:t}}}return{migrated:!1,from:null,to:t}}async function $v(r){if((await na(r)).valid)return!1;try{let t=await is.readdir(r);for(let s of t)await is.unlink(gt.join(r,s));return await is.rmdir(r),!0}catch{return!1}}async function yf(r){let e=[],t=!1,s=await ff();for(let n of s){let o=await lu(n.configPath),i=o.mcpServers?.[r];if(!i){e.push(`${n.provider}: no ${r} entry in mcp.json`);continue}let a=ra[r];if(i.command!==a.command||JSON.stringify(i.args)!==JSON.stringify(a.args)){e.push(`${n.provider}: ${r} config doesn't match preset (stale version?)`);let c={...o.mcpServers||{}};c[r]=a,o.mcpServers=c,await kf(o,n.configPath),t=!0}}return{valid:e.length===0,issues:e,autoFixed:t}}async function wf(r){let e=gf(),t=gt.join(Po.homedir(),".mcp-auth"),s=gt.join(t,`mcp-remote-${e}`),n=!1,o=!1,i=await na(s);if(i.valid)return sa.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:"OAuth tokens verified \u2014 restart your AI client.",validated:!0,migrated:!1,cleaned:!1};i.reason&&i.reason!=="directory not found"&&i.reason!=="directory empty"&&(o=await $v(s));let a=await Dv();if(a.migrated)return n=!0,sa.setMcpHealth(r,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:s,hint:`Tokens migrated from ${gt.basename(a.from)} \u2014 restart your AI client.`,validated:!0,migrated:!0,cleaned:o};let c=[];try{c=(await is.readdir(t)).filter(p=>p.startsWith("mcp-remote-")&&p!==`mcp-remote-${e}`)}catch{}let u=o?`Previous tokens were invalid and cleaned. Run in a terminal: ${cu[r]}`:c.length>0?`Legacy tokens found (${c.join(", ")}) but invalid. Run: ${cu[r]}`:`OAuth not completed. Run in a terminal: ${cu[r]}`;return sa.setMcpHealth(r,{status:"unhealthy",lastError:u,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:u,validated:!1,migrated:!1,cleaned:o}}async function lu(r=ws()){try{let e=await is.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=k(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${k(e)}`)}}async function kf(r,e=ws()){await de(e,r)}async function uu(r,e,t=ws()){let s=await lu(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await kf(s,t),{path:t,changed:i}}async function sn(r,e=ws()){return!!(await lu(e)).mcpServers?.[r]}var xo,ra,cu,jo=S(()=>{"use strict";pf();W();B();xo="mcp-remote@0.1.38";l(Iv,"getPrjctMcpConfig");ra={prjct:Iv(),linear:{command:"npx",args:["-y",xo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",xo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},cu={linear:`npx -y ${xo} https://mcp.linear.app/mcp`,jira:`npx -y ${xo} https://mcp.atlassian.com/v1/mcp`};l(gf,"getMcpRemoteVersion");l(ws,"getClaudeMcpConfigPath");l(ff,"getActiveMcpConfigPaths");l(hf,"hasMcpServerAny");l(na,"validateTokenFiles");l(Dv,"migrateOAuthTokens");l($v,"cleanCorruptedTokens");l(yf,"validateMcpConfig");l(wf,"checkOAuthTokens");l(lu,"readMcpConfig");l(kf,"writeMcpConfig");l(uu,"upsertMcpServer");l(sn,"hasMcpServer")});import wt from"chalk";function Mv(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Sf.length;return Sf[t]}function Ov(r,e,t="\u25B6"){let s=wt.dim(String(r+1).padStart(2)),o=Mv(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=wt.green("\u2713 Complete");break;case"in_progress":a=wt.yellow(`${t} Working...`);break;case"pending":a=wt.gray("\u25CB Pending");break;case"failed":a=wt.red("\u2717 Failed");break;case"blocked":a=wt.gray("\u2298 Blocked");break;default:a=wt.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function _v(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${wt.bold.white("SUBTASK PROGRESS")}`),e.push(` ${wt.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Ov(t,r[t]));return e.push(""),e.join(`
|
|
886
|
+
`)}function bf(r){console.log(_v(r))}var Sf,vf=S(()=>{"use strict";Sf=[wt.cyan,wt.magenta,wt.yellow,wt.blue,wt.green,wt.redBright,wt.magentaBright,wt.cyanBright];l(Mv,"getDomainColor");l(Ov,"formatSubtaskLine");l(_v,"renderSubtaskProgress");l(bf,"printSubtaskProgress")});function Lv(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function Fv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Nv)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:Lv(t)};return{detected:!1}}function Uv(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function Hv(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function Wv(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function Gv(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var Nv,du,qv,kr,Tf=S(()=>{"use strict";Nv=[{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(Lv,"getHallucinationSuggestion");l(Fv,"detectHallucination");l(Uv,"isSimilarError");l(Hv,"analyzeErrorPattern");l(Wv,"generateEscalationMessage");l(Gv,"generateSuggestion");du=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=5*60*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>Uv(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=Hv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Wv(e,o,this.maxAttempts),suggestion:Gv(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return Fv(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}}},qv=new du,kr=qv});function mu(r,e){let t=Ro(e),s=bp[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function Bv(r,e){let t=Ro(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Vv(r,e,t){let s=Ro(t),n=mu(r,t),o=mu(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function oa(r,e=Xs){let t=Ro(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Jv(r,e),n=zv(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=Yv(o),a=Xv(o),c=Kv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Qv(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Cf(r,e,t=Xs){let s=Ro(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function Jv(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=Vv(i,n,e);if(!t.has(a)){let c=mu(i,e),u=Bv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function zv(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+Zv(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>pu(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function Xv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function Kv(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=pu(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function Yv(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function Qv(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=pu(n),i=n.tags&&n.tags.length>0?n.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],s=[];for(let[n,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function pu(r){if(!r.variance)return 0;let e=Lt(r.estimatedDuration),t=Lt(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function Pf(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
|
|
887
|
+
`)}function Zv(r){if(!r.estimatedDuration)return 0;let e=Lt(r.estimatedDuration);if(e<=0)return 0;let t=Ef[0],s=Number.POSITIVE_INFINITY;for(let n of Ef){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Ro(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Ef,gu=S(()=>{"use strict";ko();po();K();l(mu,"getSprintStart");l(Bv,"getSprintEnd");l(Vv,"getSprintNumber");l(oa,"calculateVelocity");l(Cf,"projectCompletion");l(Jv,"bucketBySprint");l(zv,"buildSprintVelocities");l(Xv,"detectTrend");l(Kv,"calculateOverallAccuracy");l(Yv,"calculateAverageVelocity");l(Qv,"detectEstimationPatterns");l(pu,"parseVariancePercent");l(Pf,"formatVelocityContext");Ef=[{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(Zv,"derivePoints");l(Ro,"resolveConfig")});import eT from"node:fs/promises";import ia from"node:path";async function nn(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=fu(r),c=await rT(e),u=await oT(e),d=[];for(let m of c){if(!i&&aT(m))continue;let g=iT(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,n);return{files:p,metrics:{filesScanned:c.length,filesReturned:p.length,scanDuration:Date.now()-s}}}function fu(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(s=>!t.has(s)&&s.length>2)}async function rT(r){let e=[];async function t(s,n=""){try{let o=await eT.readdir(s,{withFileTypes:!0});for(let i of o){let a=ia.join(s,i.name),c=ia.join(n,i.name);if(i.isDirectory()){if(nT.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=ia.extname(i.name).toLowerCase();sT.has(u)&&e.push(c)}}}catch(o){O(o)}}return l(t,"walk"),await t(r),e}async function oT(r){let e=new Map;try{let{stdout:t}=await F(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
888
888
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
889
889
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
890
890
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
891
891
|
'`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
|
|
892
|
-
`).filter(Boolean);for(let o of n){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function
|
|
892
|
+
`).filter(Boolean);for(let o of n){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function iT(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let h of e){d.includes(h)&&(o+=.3,n.push(`keyword:${h}`));for(let x of p)if(x.includes(h)||h.includes(x)){o+=.15;break}}o=Math.min(1,o);for(let[h,x]of Object.entries(tT))for(let T of x)if(d.includes(T)&&e.some(M=>x.includes(M)||M.includes(h)||h.includes(M))){i+=.4,n.push(`domain:${h}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,n.push("recent:1d")):m.daysAgo<=3?(a=.8,n.push("recent:3d")):m.daysAgo<=7?(a=.6,n.push("recent:1w")):m.daysAgo<=30&&(a=.3,n.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=ia.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),n.some(h=>h.startsWith("import:"))||n.push("import:1")),s){let h=s.get(r);h!==void 0&&(u=(h+1)/2,h>0?n.push("history:boosted"):h<0&&n.push("history:penalized"))}let b=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,b),reasons:[...new Set(n)]}}function aT(r){let e=r.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var tT,sT,nT,Ao=S(()=>{"use strict";W();Je();tT={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"]},sT=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),nT=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(nn,"findRelevantFiles");l(fu,"extractKeywords");l(rT,"getAllCodeFiles");l(oT,"getGitRecency");l(iT,"scoreFile");l(aT,"isTestFile")});async function aa(r=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,n=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(n){let c=await uT(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await lT(r,t);return o=o.filter(c=>!dT(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 lT(r,e){let{stdout:t}=await F(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
893
893
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
894
894
|
NF {
|
|
895
895
|
count[$0]++
|
|
@@ -899,7 +899,7 @@ Next:`));for(let o of n){let i=xo.cyan(o.cmd.padEnd(12));console.log(xo.dim(` $
|
|
|
899
899
|
for (f in count) print count[f], lastmod[f], f
|
|
900
900
|
}
|
|
901
901
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
|
|
902
|
-
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),
|
|
902
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),p=c[3],m=o-d,g=Math.floor(m/86400),w=Math.floor(m/3600),b=Math.max(0,1-g/30),h=u/i,x=b*.6+h*.4,T;w<1?T="just now":w<24?T=`${w}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:p,changes:u,heatScore:Math.round(x*100)/100,lastChanged:T,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function uT(r){let e="main";try{await F("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await F(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
|
|
903
903
|
`).filter(Boolean),{stdout:n}=await F(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
904
904
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
905
905
|
NF {
|
|
@@ -910,15 +910,15 @@ Next:`));for(let o of n){let i=xo.cyan(o.cmd.padEnd(12));console.log(xo.dim(` $
|
|
|
910
910
|
for (f in count) print count[f], lastmod[f], f
|
|
911
911
|
}
|
|
912
912
|
'`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
|
|
913
|
-
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let
|
|
914
|
-
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:ca(o,d)}}async function
|
|
913
|
+
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let p=parseInt(d[1],10),m=parseInt(d[2],10),g=d[3],w=a-m,b=Math.floor(w/86400),h=Math.floor(w/3600),x=Math.max(0,1-b/14),T=p/c,I=x*.5+T*.5,M;h<1?M="just now":h<24?M=`${h}h ago`:M=`${b}d ago`,o.push({path:g,changes:p,heatScore:Math.round(I*100)/100,lastChanged:M,lastChangedAt:new Date(m*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function dT(r){let e=r.split("/").pop()||"";for(let t of cT)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var cT,hu=S(()=>{"use strict";Je();cT=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(aa,"getRecentFiles");l(lT,"getHotFilesFromCommits");l(uT,"getBranchOnlyFiles");l(dT,"shouldIgnore")});function yu(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function xf(r,e){let t=mT[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function jf(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function ca(r,e){let t=yu(r),s=yu(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=xf(n,pT),a=wu.map(c=>({model:c,...xf(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:jf(i.total),byModel:a}}}function Dn(r){let e=yu(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:wu.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function ku(r){if(r.length===0)return Dn("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),s=r.reduce((a,c)=>a+c.tokens.saved,0),n=e>0?(e-t)/e:0,o=wu.map(a=>{let c=r.map(u=>u.cost.byModel.find(d=>d.model===a)||{inputSaved:0,outputPotential:0,total:0});return{model:a,inputSaved:c.reduce((u,d)=>u+d.inputSaved,0),outputPotential:c.reduce((u,d)=>u+d.outputPotential,0),total:c.reduce((u,d)=>u+d.total,0)}}),i=r.reduce((a,c)=>a+c.cost.saved,0);return{tokens:{original:e,filtered:t,saved:s},compression:n,cost:{saved:i,formatted:jf(i),byModel:o}}}var mT,pT,wu,la=S(()=>{"use strict";Li();mT={"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}},pT="claude-sonnet-4.5";l(yu,"countTokens");wu=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(xf,"calculateModelCost");l(jf,"formatCostSaved");l(ca,"measureCompression");l(Dn,"noCompression");l(ku,"combineMetrics")});import If from"node:fs/promises";import as from"node:path";async function $n(r,e=process.cwd()){let t=as.isAbsolute(r)?r:as.join(e,r),s=as.resolve(e),n=as.resolve(t);if(!n.startsWith(s+as.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:Dn("")};let o;try{o=await If.readFile(t,"utf-8")}catch(p){if(O(p))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Dn("")};throw p}let i=as.extname(r).toLowerCase(),a=Df[i]||"unknown",c=yT[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Dn(o)};let u=wT(o,c),d=u.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
|
|
914
|
+
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:ca(o,d)}}async function $f(r,e=process.cwd(),t={}){let s=as.isAbsolute(r)?r:as.join(e,r),n=[];async function o(i){let a=await If.readdir(i,{withFileTypes:!0});for(let c of a){let u=as.join(i,c.name),d=as.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=as.extname(c.name).toLowerCase();if(Df[p]){let m=await $n(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function wT(r,e){let t=[],s=r.split(`
|
|
915
915
|
`),n=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(n.has(c))continue;n.add(c);let u=i.index,d=r.substring(0,u).split(`
|
|
916
|
-
`).length,
|
|
916
|
+
`).length,p=i[0].trim(),m;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(m=g)}t.push({type:o.type,name:a,signature:kT(p),exported:o.exported||!1,line:d,docstring:m})}}return t.sort((o,i)=>o.line-i.line)}function kT(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Df,Rf,gT,fT,hT,Af,yT,ua=S(()=>{"use strict";W();la();Df={".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"},Rf=[{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}],gT=[{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}],fT=[{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}],hT=[{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}],Af=[{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}],yT={typescript:Rf,javascript:Rf,python:gT,go:fT,rust:hT,java:Af,csharp:Af,php:[],ruby:[],unknown:[]};l($n,"extractSignatures");l($f,"extractDirectorySignatures");l(wT,"extractFromContent");l(kT,"cleanSignature")});import Su from"node:path";var ST,bT,bu,vT,$t,Sr=S(()=>{"use strict";ve();Ut();K();B();ST="outcomes",bT="outcomes.jsonl",bu=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return Su.join(t,ST)}getOutcomesPath(e){return Su.join(this.getOutcomesDir(e),bT)}async record(e,t){let s={...t,id:Z()},n=this.getOutcomesPath(e);return await rt(Su.dirname(n)),await tc(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await C(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await _e(t);if(!a.trim())return[];let c=a.trim().split(`
|
|
917
917
|
`).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await _e(t);return s.trim()?s.trim().split(`
|
|
918
|
-
`).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let s=t.filter(n=>{if(!n.variance)return!1;let o=
|
|
918
|
+
`).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let s=t.filter(n=>{if(!n.variance)return!1;let o=zn(n.variance),i=Lt(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},vT=new bu,$t=vT});import{z as Qe}from"zod";var da,ma,TT,rN,vu,Mf,Tu=S(()=>{"use strict";da=Qe.string(),ma=Qe.object({primaryDomain:da,secondaryDomains:Qe.array(da),confidence:Qe.number().min(0).max(1),filePatterns:Qe.array(Qe.string()),relevantAgents:Qe.array(Qe.string())}),TT=Qe.object({classification:ma,classifiedAt:Qe.string(),source:Qe.enum(["cache","history","llm","heuristic"]),descriptionHash:Qe.string(),projectId:Qe.string()}),rN=Qe.object({entries:Qe.record(Qe.string(),TT),confirmedPatterns:Qe.array(Qe.object({descriptionHash:Qe.string(),classification:ma,confirmedAt:Qe.string(),taskDescription:Qe.string()}))}),vu={entries:{},confirmedPatterns:[]},Mf={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import CT from"node:fs/promises";import Nf from"node:path";function Of(r){return vn(r.toLowerCase().trim())}async function _f(r){try{let e=Nf.join(r,"storage","classification-cache.json"),t=await CT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e)?vu:(console.warn("[classifier] Failed to load cache:",k(e)),vu)}}async function PT(r,e){try{let t=Nf.join(r,"storage","classification-cache.json");await de(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",k(t))}}function xT(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||Ws(s.classifiedAt,36e5)?null:s.classification}function jT(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Eu,RT,Lf,Ff=S(()=>{"use strict";so();Tu();W();wn();B();Tn();l(Of,"hashDescription");l(_f,"loadCache");l(PT,"saveCache");l(xT,"lookupCache");l(jT,"lookupPatterns");Eu=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=Of(e),o=await _f(s),i=xT(o,n,t);if(i)return{classification:i,source:"cache"};let a=jT(o,n);return a?{classification:a,source:"history"}:{classification:Mf,source:"heuristic"}}async confirmClassification(e,t,s){let n=Of(e),o=await _f(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await PT(s,o))}},RT=new Eu,Lf=RT});import AT from"node:fs/promises";import IT from"node:path";var Cu,DT,pa,Pu=S(()=>{"use strict";gu();Te();ve();po();lr();er();vt();Ao();hu();ua();W();Je();Sr();Ff();Cu=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await $.getProjectId(s),o=A.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],p=[],m=u.map((M,y)=>{if(M.status==="fulfilled")return M.value;p.push(d[y]),console.warn(`Context tool "${d[y]}" failed: ${k(M.reason)}`)}),[g,w,b]=m,h={level:p.length===0?"full":p.length>=2?"minimal":"partial",failedTools:p},x=this.shouldFragment(a,t),T=null;x&&e==="task"&&(T=await this.createSubtasks(t,a,[],n));let I=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:x,subtasks:T,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:w??null,velocityContext:b??null,contextDegradation:h,rpiContext:I}}resolveRpiPhase(e){try{let{prjctDb:t}=(ee(),bt(ri)),s=t.getDoc(e,"rpi:current:research"),n=t.getDoc(e,"rpi:current:plan");if(!s)return{phase:"research"};if(!n)return{phase:"plan",researchDoc:s};let o=this.extractScopedFilesFromPlan(n);return{phase:"implement",researchDoc:s,planDoc:n,scopedFiles:o}}catch{return null}}extractScopedFilesFromPlan(e){let t=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,s=new Set;for(let n of e.matchAll(t))s.add(n[1]);return[...s].slice(0,20)}async gatherRealContext(e,t){try{let[s,n,o]=await Promise.all([this.getGitState(t),nn(e,t,{maxFiles:10,minScore:.15}),aa(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await $n(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
|
|
919
919
|
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,s]=await Promise.all([F("git branch --show-current",{cwd:e}),F("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
|
|
920
|
-
`).filter(Boolean),i=0,a=0,c=0;for(let
|
|
921
|
-
`)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},
|
|
920
|
+
`).filter(Boolean),i=0,a=0,c=0;for(let p of o){let m=p.substring(0,2);m.startsWith("??")?a++:m[0]!==" "&&m[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Qt.getActive(e);if(t){let s=t.conventions.find(o=>o.category==="file-structure"&&/source|src/i.test(o.rule)),n=t.conventions.find(o=>o.category==="file-structure"&&/test/i.test(o.rule));return{languages:t.stack?.languages??[],frameworks:t.stack?.frameworks??[],packageManager:t.stack?.packageManager,sourceDir:s?.example,testDir:n?.example,fileCount:0,patterns:t.patterns.map(o=>({name:o.name,description:o.description,location:o.locations?.[0]})),antiPatterns:t.antiPatterns.map(o=>({issue:o.issue,file:o.files?.[0]??"multiple",suggestion:o.suggestion})),status:"sealed",commitHash:t.commitHash??void 0}}return this.loadHeuristicAnalysis(e)}catch{return null}}async loadHeuristicAnalysis(e){try{let t=await pt.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 $t.getAll(e);if(t.length===0)return null;let s=oa(t,Xs);return s.sprints.length===0?null:Pf(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=IT.join(e,"analysis","repo-analysis.json"),s=await AT.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return O(t)||console.warn("Failed to load repo-analysis.json:",k(t)),null}}async detectDomains(e,t,s){let n=A.getGlobalProjectPath(t),{classification:o}=await Lf.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,p=i.get(c)||[],m=p.length===0&&u===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${u+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:m?"in_progress":"pending",dependsOn:p,order:u+1}});return await L.createSubtasks(n,a.map(c=>({id:c.id,description:c.description,domain:c.domain,agent:c.agent,dependsOn:c.dependsOn}))),a}buildDependencyGraph(e){let t=new Map,s=["database","backend","api","frontend","ui"],n=new Map;for(let o=0;o<e.length;o++)n.set(e[o],`subtask-${o+1}`);for(let o of e){let i=s.indexOf(o);if(i<=0){t.set(o,[]);continue}let a=[];for(let c=i-1;c>=0;c--){let u=s[c];if(e.includes(u)){let d=n.get(u);d&&a.push(d);break}}t.set(o,a)}return t}getParallelLanes(e){let t=e.filter(o=>o.dependsOn.length===0),s=[],n=new Set;for(let o of t){let i=[o];n.add(o.id);let a=o;for(;;){let c=e.find(u=>!n.has(u.id)&&u.dependsOn.includes(a.id));if(!c)break;i.push(c),n.add(c.id),a=c}s.push(i)}for(let o of e)n.has(o.id)||s.push([o]);return s}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},DT=new Cu,pa=DT});function $T(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var xu,MT,tt,Uf=S(()=>{"use strict";Ut();K();Pn();Pn();l($T,"generateApprovalPrompt");xu=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return Yc.includes(e)}isDestructive(e){return Qc.includes(e)}isToolAllowedInPlanning(e){return yi.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>yi.includes(s)):t}startPlanning(e,t,s){let n={id:Z(),projectId:e,command:t,params:s,status:pe.GATHERING,startedAt:v(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,n),n}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[pe.GATHERING,pe.ANALYZING,pe.PROPOSING,pe.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===pe.APPROVED?s.approvedAt=v():t===pe.EXECUTING?s.executionStartedAt=v():(t===pe.COMPLETED||t===pe.ABORTED)&&(s.completedAt=v()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=pe.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=pe.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!==pe.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=pe.APPROVED,s.approvedAt=v(),s.steps=(s.proposedPlan?.steps||[]).map((n,o)=>({index:o,description:typeof n=="string"?n:n.description||"",status:"pending",tool:typeof n=="string"?void 0:n.tool,args:typeof n=="string"?void 0:n.args})),{approved:!0,planId:s.id,steps:s.steps,message:`Plan approved. ${s.steps.length} steps to execute.`})}rejectPlan(e,t=null){let s=this.getActivePlan(e);return s?(s.status=pe.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!==pe.APPROVED?null:(t.status=pe.EXECUTING,t.executionStartedAt=v(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==pe.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!==pe.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=pe.COMPLETED,t.completedAt=v();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(n=>n.status==="completed").length,failedSteps:t.steps.filter(n=>n.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),s}abortPlan(e,t="User requested"){let s=this.getActivePlan(e);if(!s)return null;s.status=pe.ABORTED,s.completedAt=v(),s.abortReason=t;let n={aborted:!0,planId:s.id,reason:t,completedSteps:s.steps.filter(o=>o.status==="completed").length,totalSteps:s.steps.length};return this.activePlans.delete(e),n}generateApprovalPrompt(e,t){return $T(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[pe.GATHERING]:"\u{1F50D}",[pe.ANALYZING]:"\u{1F9E0}",[pe.PROPOSING]:"\u{1F4DD}",[pe.PENDING_APPROVAL]:"\u23F3",[pe.APPROVED]:"\u2705",[pe.EXECUTING]:"\u26A1",[pe.COMPLETED]:"\u{1F389}",[pe.REJECTED]:"\u274C",[pe.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===pe.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
|
|
921
|
+
`)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},MT=new xu,tt=MT});var ju,OT,Hf,Wf=S(()=>{"use strict";K();Sr();ju=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await $t.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((p,m)=>p+m.qualityScore,0)/t.length,n=await $t.getEstimateAccuracy(e),o=new Map;for(let p of t)for(let m of p.blockers||[])o.set(m,(o.get(m)||0)+1);let i=[...o.entries()].sort((p,m)=>m[1]-p[1]).slice(0,5).map(([p])=>p),c=(await this.getAgentMetrics(e)).sort((p,m)=>m.successRate-p.successRate).slice(0,3).map(p=>p.agent),d=(await this.detectPatterns(e)).map(p=>p.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await $t.getAll(e),s=new Map;for(let o of t){let i=o.agentUsed||"unknown";s.has(i)||s.set(i,[]),s.get(i).push(o)}let n=[];for(let[o,i]of s){let a=i.length,c=i.filter(b=>b.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((b,h)=>b+h.qualityScore,0)/a,p=i.filter(b=>{if(!b.variance)return!1;let h=zn(b.variance),x=Lt(b.estimatedDuration);return x===0?!1:Math.abs(h)/x<=.2}),m=Math.round(p.length/a*100),g=new Map;for(let b of i.filter(h=>h.completedAsPlanned))for(let h of b.tags||[])g.set(h,(g.get(h)||0)+1);let w=[...g.entries()].sort((b,h)=>h[1]-b[1]).slice(0,3).map(([b])=>b);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:m,bestFor:w})}return n}async detectPatterns(e){let t=await $t.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>zn(c.variance)>0);n.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:n.length/t.length,occurrences:n.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>zn(c.variance)<0);o.length/t.length>.6&&s.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&s.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&s.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return s.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let n=(await $t.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+Lt(c.actualDuration),0),i=Math.round(o/n.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let n=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return n.length===0?null:n.sort((o,i)=>i.successRate-o.successRate)[0].agent}},OT=new ju,Hf=OT});var Jf={};ye(Jf,{AgentAssignmentSchema:()=>Gf,OUTPUT_SCHEMAS:()=>Bf,SubtaskBreakdownSchema:()=>qf,renderSchemaForPrompt:()=>_T});import{z as ft}from"zod";function _T(r){let e=Bf[r];return e?`## OUTPUT FORMAT
|
|
922
922
|
|
|
923
923
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
924
924
|
|
|
@@ -927,10 +927,10 @@ ${e.example}
|
|
|
927
927
|
\`\`\`
|
|
928
928
|
|
|
929
929
|
Fields:
|
|
930
|
-
${
|
|
931
|
-
`)}return"(see example above)"}function
|
|
932
|
-
... (truncated to ~${e} tokens)`}function
|
|
933
|
-
`);return ga(n,
|
|
930
|
+
${NT(e.schema)}`:null}function NT(r){if(r instanceof ft.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${Vf(s)}`).join(`
|
|
931
|
+
`)}return"(see example above)"}function Vf(r){return r instanceof ft.ZodString?"string":r instanceof ft.ZodNumber?"number":r instanceof ft.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ft.ZodArray?`array of ${Vf(r.element)}`:r instanceof ft.ZodObject?"object":"any"}var Gf,qf,Bf,zf=S(()=>{"use strict";Tu();Gf=ft.object({agentName:ft.string(),reasoning:ft.string(),confidence:ft.number().min(0).max(1)}),qf=ft.object({subtasks:ft.array(ft.object({description:ft.string(),domain:da,agent:ft.string(),dependsOn:ft.array(ft.number())})),effort:ft.enum(["low","medium","high"])}),Bf={classification:{schema:ma,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Gf,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:qf,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(_T,"renderSchemaForPrompt");l(NT,"describeSchema");l(Vf,"describeField")});import Xf from"node:fs/promises";import br from"node:path";function ga(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
|
|
932
|
+
... (truncated to ~${e} tokens)`}function Kf(r){return Math.ceil(r.length/4)}var Ru,Au,Iu,LT,Yf,Qf=S(()=>{"use strict";Li();Vt();vt();W();B();ut();Wf();fs();Ru={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(ga,"truncateToTokenBudget");l(Kf,"estimateTokens");Au=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Ru,...e}}addSection(e,t){let s=ga(e,t),n=Kf(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ga(s,o);return this.used+=Kf(i),i}return this.used+=n,s}},Iu=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await C(e)){let n=await Xf.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){O(n)||console.error(`Template loading warning: ${k(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}resetContext(){}setContext(e){}async loadModule(e){let t=ht(`global/modules/${e}`);if(t)return t;let s=br.join(jt,"templates/global/modules",e);return this.getTemplate(s)}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let s=$s("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=ht(n);if(o){let i=br.basename(n,".md");t[i]=o}}}else{let n=br.join(jt,"templates","checklists");if(await C(n)){let o=(await Xf.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=br.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){O(s)||console.error(`Checklist loading warning: ${k(s)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[s,n]=await Promise.all([L.read(e),ce.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:n.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(O(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 Hf.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){!O(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${k(o)}`)}s.push("---"),s.push("");let n=s.join(`
|
|
933
|
+
`);return ga(n,Ru.autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),n=Date.now()-t,o=Math.floor(n/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=br.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let p=await this.buildInjectedContext(t.projectId);p&&u.push(p)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let p=d?.skipNativeContext??!1,m=d?.mcpActive??!1,g=[],w=e.frontmatter?.name?.replace("p:","")||"",b={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&b.agents&&(g.push(`# AGENT: ${n.name}
|
|
934
934
|
`),n.role&&g.push(`Role: ${n.role}
|
|
935
935
|
`),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
|
|
936
936
|
`),g.push(`
|
|
@@ -939,7 +939,7 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
939
939
|
`)),g.push(`TASK: ${e.frontmatter.description}
|
|
940
940
|
`),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
941
941
|
`);let h=t;(h.params?.task||h.params?.description)&&g.push(`INPUT: ${h.params.task||h.params.description}
|
|
942
|
-
`);let x=t.projectPath;if(x){let j=[`project: ${
|
|
942
|
+
`);let x=t.projectPath;if(x){let j=[`project: ${br.basename(x)}`,`path: ${x}`,"git: true"];u?.realContext?.gitBranch&&j.push(`branch: ${u.realContext.gitBranch}`),j.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
|
|
943
943
|
<env>
|
|
944
944
|
${j.join(`
|
|
945
945
|
`)}
|
|
@@ -956,14 +956,14 @@ ${j.join(`
|
|
|
956
956
|
`),y.testDir&&g.push(`**Test Dir**: ${y.testDir}
|
|
957
957
|
`),g.push(`**Files Analyzed**: ${y.fileCount}
|
|
958
958
|
`),g.push(`**Analysis Status**: ${y.status}${y.commitHash?` (commit: ${y.commitHash.slice(0,8)})`:""}
|
|
959
|
-
`),!
|
|
959
|
+
`),!p)){if(y.patterns?.length>0){g.push(`
|
|
960
960
|
### Code Patterns (Follow These)
|
|
961
961
|
`);for(let j of y.patterns)g.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
|
|
962
962
|
`)}if(y.antiPatterns?.length>0){g.push(`
|
|
963
963
|
### Anti-Patterns (Avoid These)
|
|
964
964
|
`);for(let j of y.antiPatterns)g.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
|
|
965
965
|
`)}}g.push(`
|
|
966
|
-
`)}if(!
|
|
966
|
+
`)}if(!p){let y=s?.codePatterns||"";if(b.patterns&&y&&y.trim()){let D=this.extractPatternSummary(y);D&&(g.push(`## CODE PATTERNS
|
|
967
967
|
`),g.push(D),g.push(`
|
|
968
968
|
Full patterns: Read analysis/patterns.md
|
|
969
969
|
`))}let j=s?.analysis||"";if(b.patterns&&j&&j.trim()){let D=j.match(/Stack[:\s]+([^\n]+)/i)||j.match(/Technology[:\s]+([^\n]+)/i),G=D?D[1].trim():"detected";g.push(`
|
|
@@ -1034,7 +1034,7 @@ Read files before modifying.
|
|
|
1034
1034
|
`)}g.push(`Plan:
|
|
1035
1035
|
`);for(let y=0;y<i.plan.length;y++)g.push(` ${y+1}. ${i.plan[y]}
|
|
1036
1036
|
`);g.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
|
|
1037
|
-
`)}if(!
|
|
1037
|
+
`)}if(!m&&a&&a.length>0){g.push(`
|
|
1038
1038
|
## CONTEXT (apply these)
|
|
1039
1039
|
`);for(let y of a)g.push(`- **${y.title}**: ${y.content}
|
|
1040
1040
|
`),y.tags&&y.tags.length>0&&g.push(` Tags: ${y.tags.join(", ")}
|
|
@@ -1081,7 +1081,7 @@ ${y.planDoc}
|
|
|
1081
1081
|
**Context for this subtask:**
|
|
1082
1082
|
${j.outputForNextAgent}
|
|
1083
1083
|
`)}g.push(`
|
|
1084
|
-
`)}let M=this.getSchemaTypeForCommand(w);if(M){let{renderSchemaForPrompt:y}=await Promise.resolve().then(()=>(
|
|
1084
|
+
`)}let M=this.getSchemaTypeForCommand(w);if(M){let{renderSchemaForPrompt:y}=await Promise.resolve().then(()=>(zf(),Jf)),j=y(M);j&&g.push(`
|
|
1085
1085
|
${j}
|
|
1086
1086
|
`)}if(b.checklist){let y=await this.loadChecklistRouting(),j=await this.loadChecklists();y&&Object.keys(j).length>0&&(g.push(`
|
|
1087
1087
|
## QUALITY CHECKLISTS
|
|
@@ -1094,7 +1094,7 @@ ${j}
|
|
|
1094
1094
|
`),g.push(`- Be concise. No preamble, no filler.
|
|
1095
1095
|
`),g.push(`- Use sub-agents for exploration that produces >5 file reads.
|
|
1096
1096
|
`),g.push(`- Prefer file:line references over dumping full file contents.
|
|
1097
|
-
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new
|
|
1097
|
+
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new Au({totalPrompt:Ru.stateData}),s=["now","next","context","analysis","codePatterns"],n=[];for(let[o,i]of Object.entries(e))if(i&&i.trim()){let a=s.includes(o)?500:250,c=t.addSection(`### ${o}
|
|
1098
1098
|
${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
1099
1099
|
|
|
1100
1100
|
`):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
|
|
@@ -1111,13 +1111,13 @@ ${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
|
1111
1111
|
`);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
|
|
1112
1112
|
Avoid:
|
|
1113
1113
|
${a}`)}let o=t.join(`
|
|
1114
|
-
`);return ga(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},
|
|
1114
|
+
`);return ga(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},LT=new Iu,Yf=LT});import Du from"node:fs/promises";import FT from"node:os";import $u from"node:path";function Zf(){let r=process.env.PRJCT_CLI_HOME?.trim()||$u.join(FT.homedir(),".prjct-cli");return $u.join(r,".running")}async function UT(r){try{let e=Zf(),t=$u.dirname(e);await C(t)||await Du.mkdir(t,{recursive:!0}),await Du.writeFile(e,`/p:${r}`)}catch{}}async function HT(){try{let r=Zf();await C(r)&&await Du.unlink(r)}catch{}}var Mu,WT,fa,Ou=S(()=>{"use strict";cf();W();df();B();jo();vf();Ci();Tf();Ii();Pu();Uf();Qf();fs();l(Zf,"getRunningFilePath");l(UT,"signalStart");l(HT,"signalEnd");Mu=class{static{l(this,"CommandExecutor")}async signalStart(e){await UT(e)}async signalEnd(){await HT()}requiresOrchestration(e){return of.includes(e)?!0:!af.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(kr.shouldEscalate(e,n)){let o=kr.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await dl.load(e),i=await jn.build(s,t),a=tt.requiresPlanning(e),c=tt.isDestructive(e),u=tt.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=tt.startPlanning(i.projectId,e,t):u&&(d=tt.getActivePlan(i.projectId));let p=t.task||t.description||"",m=null;if(this.requiresOrchestration(e)&&p)try{if(m=await pa.execute(e,p,s),m.detectedDomains.length>0&&uf.orchestrate(m.detectedDomains),m.requiresFragmentation&&m.subtasks){let D=m.subtasks.map(G=>({id:G.id,domain:G.domain,description:G.description,status:G.status}));bf(D)}}catch(D){console.warn(`\u26A0\uFE0F Orchestrator warning: ${k(D)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},w=await jn.loadState(i),b=await sn("prjct"),h=null,x=null;i.projectId&&(h={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}`)},b||(x=await Tt.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let T={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:tt.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},y=(await(lt(),bt(Nt)).getActiveProvider()).name==="claude",j=await Yf.build(o,g,w,null,h,null,x,T,m,{skipNativeContext:y,mcpActive:b});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),kr.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:w,prompt:j,agenticDelegation:!0,agenticMode:!0,learnedPatterns:h,relevantMemories:x,orchestratorContext:m,memory:{create:l(D=>Tt.createMemory(i.projectId,D),"create"),autoRemember:l((D,G,Q)=>Tt.autoRemember(i.projectId,D,G,Q),"autoRemember"),search:l(D=>Tt.searchMemories(i.projectId,D),"search"),findByTags:l(D=>Tt.findByTags(i.projectId,D),"findByTags"),getStats:l(()=>Tt.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(D=>tt.recordGatheredInfo(i.projectId,D),"recordInfo"),setAnalysis:l(D=>tt.setAnalysis(i.projectId,D),"setAnalysis"),propose:l(D=>tt.proposePlan(i.projectId,D),"propose"),approve:l(D=>tt.approvePlan(i.projectId,D),"approve"),reject:l(D=>tt.rejectPlan(i.projectId,D),"reject"),getApprovalPrompt:l(()=>tt.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>tt.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>tt.getNextStep(i.projectId),"getNextStep"),completeStep:l(D=>tt.completeStep(i.projectId,D),"completeStep"),failStep:l(D=>tt.failStep(i.projectId,D),"failStep"),abort:l(D=>tt.abortPlan(i.projectId,D),"abort"),getStatus:l(()=>tt.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>tt.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=kr.recordAttempt(e,n,{success:!1,error:k(o)});if(i.shouldEscalate){let a=kr.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:k(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},WT=new Mu,fa=WT});import GT from"node:https";import qT from"node:os";import _u from"node:path";import cs from"chalk";var Nu,ha,Lu=S(()=>{"use strict";W();B();Nu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=_u.join(qT.homedir(),".prjct-cli","config"),this.cacheFile=_u.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=_u.join(__dirname,"..","..","package.json");return(await Ae(e))?.version??null}catch(e){return console.error("Error reading package version:",k(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},n=GT.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await C(this.cacheFile))return await Ae(this.cacheFile)}catch{}return null}async writeCache(e){try{await de(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),s=Date.now();if(t?.lastCheck&&s-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
1115
1115
|
`+cs.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")+`
|
|
1116
1116
|
`+cs.yellow("\u2502")+" "+cs.bold("Update available!")+" "+cs.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+cs.yellow("\u2502")+`
|
|
1117
1117
|
`+cs.yellow("\u2502")+" "+cs.yellow("\u2502")+`
|
|
1118
1118
|
`+cs.yellow("\u2502")+" Run: "+cs.cyan("npm update -g prjct-cli")+" "+cs.yellow("\u2502")+`
|
|
1119
1119
|
`+cs.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")+`
|
|
1120
|
-
`}},ha=
|
|
1120
|
+
`}},ha=Nu});import eh from"node:path";async function JT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(eh.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(eh.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function zT(){return{...BT}}function XT(){return{...VT}}async function th(){return ya||(ya=await JT()?zT():XT(),ya)}var ya,BT,VT,sh=S(()=>{"use strict";B();ya=null,BT={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},VT={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(JT,"isClaudeEnvironment");l(zT,"getClaudeAgent");l(XT,"getTerminalAgent");l(th,"detect")});import wa from"node:fs/promises";var Fu,nh,rh=S(()=>{"use strict";W();B();Fu=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: ${k(t)}`)}return await wa.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: ${k(s)}`)}await wa.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: ${k(t)}`)}return await wa.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await wa.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
1121
1121
|
${e.map((t,s)=>`${s+1}. ${t}`).join(`
|
|
1122
1122
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
1123
1123
|
|
|
@@ -1162,8 +1162,8 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
1162
1162
|
|
|
1163
1163
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
1164
1164
|
|
|
1165
|
-
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}}},dh=Wu});function mh(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&eE.has(e.code))return!0;if(e.code&&fh.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 tE(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&fh.has(e.code))}function gh(r,e,t){let s=on.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(on.delete(r),!1):!0:!1}function Gu(r,e){let t=on.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),on.set(r,t)}function sE(r){on.delete(r)}var eE,fh,on,ka,hh,qL,yh=S(()=>{"use strict";eE=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),fh=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(mh,"isTransientError");l(tE,"isPermanentError");on=new Map;l(gh,"isCircuitOpen");l(Gu,"recordFailure");l(sE,"recordSuccess");ka=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(gh(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return sE(t),o}catch(o){if(s=o,n++,tE(o))throw Gu(t,this.options.circuitBreakerThreshold),o;if(!(mh(o)&&n<this.options.maxAttempts))throw Gu(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Gu(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return mh(e)}isCircuitOpen(e){return gh(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return on.get(e)}resetCircuit(e){on.delete(e)}resetAllCircuits(){on.clear()}},hh=new ka({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),qL=new ka({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var nE,qu,Sa,wh=S(()=>{"use strict";Ps();uh();ph();yh();nE=["claude"],qu=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await hh.execute(async()=>{if(this.agentInfo=await lh(),!this.agentInfo?.isSupported)throw oo.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!nE.includes(e))throw oo.notSupported(this.agentInfo?.type??"unknown");return this.agent=new dh,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Sa=new qu});var Bu,Er,Vu=S(()=>{"use strict";Bu=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Er=new Bu});import Tt from"node:path";async function rE(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await C(Tt.join(r,"pnpm-lock.yaml"))?"pnpm":await C(Tt.join(r,"yarn.lock"))?"yarn":await C(Tt.join(r,"bun.lockb"))||await C(Tt.join(r,"bun.lock"))?"bun":(await C(Tt.join(r,"package-lock.json")),"npm")}function kh(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function oE(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Cr(r,e){for(let n of iE)if(await C(Tt.join(r,n)))return n;let s=(e??await Es(r)).find(n=>n.endsWith(aE));if(s)return s}async function Ls(r){for(let e of cE)if(await C(Tt.join(r,e)))return e}async function ba(r){let e=Tt.join(r,"package.json"),t=await Ae(e,null);if(t){let a=await rE(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:kh(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:kh(a,"typecheck")}),c.test&&(u.test={tool:a,command:oE(a)}),u.versionFile=await Cr(r),u.changelogFile=await Ls(r),u}if(await C(Tt.join(r,"pytest.ini"))){let a=await Cr(r),c=await Ls(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await _e(Tt.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await Cr(r),c=await Ls(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(Tt.join(r,"Cargo.toml"))){let a=await Ls(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(Tt.join(r,"go.mod"))){let a=await Cr(r),c=await Ls(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await Es(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Cr(r,n),c=await Ls(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(Tt.join(r,"pom.xml"))){let a=await Ls(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(Tt.join(r,"gradlew"))&&(await C(Tt.join(r,"build.gradle"))||await C(Tt.join(r,"build.gradle.kts")))){let a=await Ls(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Cr(r),i=await Ls(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var iE,aE,cE,Ju=S(()=>{"use strict";B();l(rE,"detectPackageManager");l(kh,"pmRun");l(oE,"pmTest");iE=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],aE=".csproj",cE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Cr,"detectVersionFile");l(Ls,"detectChangelogFile");l(ba,"detectProjectCommands")});import*as ke from"@clack/prompts";import On from"chalk";var va,Sh,Oo,bh=S(()=>{"use strict";B();Fe();va=[{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."}],Sh=[{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"}],Oo=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(){ke.intro(On.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 ke.outro(On.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=va.findIndex(s=>s.value===this.detectedType),t=await ke.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:va.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?va[e].value:void 0});return ke.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ke.multiselect({message:"Which AI agents do you use?",options:Sh.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ke.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);ke.note(e,"Detected stack");let t=await ke.confirm({message:"Is this stack correct?",initialValue:!0});if(ke.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ke.group({language:l(()=>ke.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ke.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 ke.group({verbosity:l(()=>ke.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(()=>ke.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=[`${On.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${On.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${On.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${On.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${On.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1166
|
-
`);
|
|
1165
|
+
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}}},nh=Fu});function oh(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&YT.has(e.code))return!0;if(e.code&&ah.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 QT(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&ah.has(e.code))}function ih(r,e,t){let s=rn.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(rn.delete(r),!1):!0:!1}function Uu(r,e){let t=rn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),rn.set(r,t)}function ZT(r){rn.delete(r)}var YT,ah,rn,ka,ch,FL,lh=S(()=>{"use strict";YT=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),ah=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(oh,"isTransientError");l(QT,"isPermanentError");rn=new Map;l(ih,"isCircuitOpen");l(Uu,"recordFailure");l(ZT,"recordSuccess");ka=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(ih(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return ZT(t),o}catch(o){if(s=o,n++,QT(o))throw Uu(t,this.options.circuitBreakerThreshold),o;if(!(oh(o)&&n<this.options.maxAttempts))throw Uu(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Uu(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return oh(e)}isCircuitOpen(e){return ih(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return rn.get(e)}resetCircuit(e){rn.delete(e)}resetAllCircuits(){rn.clear()}},ch=new ka({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),FL=new ka({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var eE,Hu,Sa,uh=S(()=>{"use strict";xs();sh();rh();lh();eE=["claude"],Hu=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await ch.execute(async()=>{if(this.agentInfo=await th(),!this.agentInfo?.isSupported)throw no.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!eE.includes(e))throw no.notSupported(this.agentInfo?.type??"unknown");return this.agent=new nh,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Sa=new Hu});var Wu,vr,Gu=S(()=>{"use strict";Wu=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},vr=new Wu});import Et from"node:path";async function tE(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await C(Et.join(r,"pnpm-lock.yaml"))?"pnpm":await C(Et.join(r,"yarn.lock"))?"yarn":await C(Et.join(r,"bun.lockb"))||await C(Et.join(r,"bun.lock"))?"bun":(await C(Et.join(r,"package-lock.json")),"npm")}function dh(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function sE(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Tr(r,e){for(let n of nE)if(await C(Et.join(r,n)))return n;let s=(e??await Cs(r)).find(n=>n.endsWith(rE));if(s)return s}async function Fs(r){for(let e of oE)if(await C(Et.join(r,e)))return e}async function ba(r){let e=Et.join(r,"package.json"),t=await Ae(e,null);if(t){let a=await tE(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:dh(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:dh(a,"typecheck")}),c.test&&(u.test={tool:a,command:sE(a)}),u.versionFile=await Tr(r),u.changelogFile=await Fs(r),u}if(await C(Et.join(r,"pytest.ini"))){let a=await Tr(r),c=await Fs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await _e(Et.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await Tr(r),c=await Fs(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(Et.join(r,"Cargo.toml"))){let a=await Fs(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await C(Et.join(r,"go.mod"))){let a=await Tr(r),c=await Fs(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await Cs(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Tr(r,n),c=await Fs(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await C(Et.join(r,"pom.xml"))){let a=await Fs(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await C(Et.join(r,"gradlew"))&&(await C(Et.join(r,"build.gradle"))||await C(Et.join(r,"build.gradle.kts")))){let a=await Fs(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Tr(r),i=await Fs(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var nE,rE,oE,qu=S(()=>{"use strict";B();l(tE,"detectPackageManager");l(dh,"pmRun");l(sE,"pmTest");nE=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],rE=".csproj",oE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Tr,"detectVersionFile");l(Fs,"detectChangelogFile");l(ba,"detectProjectCommands")});import*as Se from"@clack/prompts";import Mn from"chalk";var va,mh,Io,ph=S(()=>{"use strict";B();Fe();va=[{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."}],mh=[{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"}],Io=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(){Se.intro(Mn.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 Se.outro(Mn.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=va.findIndex(s=>s.value===this.detectedType),t=await Se.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:va.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?va[e].value:void 0});return Se.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Se.multiselect({message:"Which AI agents do you use?",options:mh.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return Se.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);Se.note(e,"Detected stack");let t=await Se.confirm({message:"Is this stack correct?",initialValue:!0});if(Se.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await Se.group({language:l(()=>Se.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>Se.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 Se.group({verbosity:l(()=>Se.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(()=>Se.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=[`${Mn.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Mn.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${Mn.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Mn.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Mn.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1166
|
+
`);Se.note(e,"Configuration Summary");let t=await Se.confirm({message:"Generate configuration with these settings?",initialValue:!0});return Se.isCancel(t)||!t?(Se.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let n=t.join(this.projectPath,"package.json"),o=await e.readFile(n,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:path"),t=await import("node:os"),s=[];await Kt(e.join(t.homedir(),".claude"))&&s.push("claude"),await C(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await C(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await C(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await Kt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Je(),Bd));await n("which codex"),s.push("codex")}catch{await Kt(e.join(t.homedir(),".codex"))&&s.push("codex")}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let n=await e.readdir(this.projectPath);if(n.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};s.language=c.typescript?"TypeScript":"JavaScript",c.next?s.framework="Next.js":c.nuxt?s.framework="Nuxt":c.react?s.framework="React":c.vue?s.framework="Vue":c["@angular/core"]?s.framework="Angular":c.express?s.framework="Express":c.hono?s.framework="Hono":c.fastify?s.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(s.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",n.includes("bun.lockb")?s.packageManager="Bun":n.includes("pnpm-lock.yaml")?s.packageManager="pnpm":n.includes("yarn.lock")?s.packageManager="Yarn":n.includes("package-lock.json")&&(s.packageManager="npm"),(c.prisma||c["@prisma/client"])&&s.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&s.technologies.push("Drizzle"),c.tailwindcss&&s.technologies.push("Tailwind CSS"),c.zod&&s.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&s.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?s.language="Python":n.includes("go.mod")?s.language="Go":n.includes("Cargo.toml")?s.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,Se.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return va.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return mh.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 gh={};ye(gh,{PlanningCommands:()=>_n});import Ta from"node:fs/promises";import On from"node:path";async function iE(){if(!Bu){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(Ca(),fh));Bu=new r}return Bu}var Bu,_n,Ea=S(()=>{"use strict";Zo();Os();Te();ve();Ut();Js();Vt();go();W();K();B();hs();yr();Fe();qu();ph();Mt();Bu=null;l(iE,"getAnalysisCommands");_n=class extends Ce{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 f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=s.yes||!o||process.env.CI==="true",a=null;if(i)o&&s.yes&&(a=await new Io(t).runNonInteractive());else if(a=await new Io(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await Yn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},p=(await $.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await A.ensureProjectStructure(p);let m=A.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
|
|
1167
1167
|
|
|
1168
1168
|
No current task. Use \`/p:now\` to set focus.
|
|
1169
1169
|
`,"core/next.md":`# NEXT
|
|
@@ -1183,7 +1183,7 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
1183
1183
|
`,"planning/roadmap.md":`# ROADMAP
|
|
1184
1184
|
|
|
1185
1185
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
1186
|
-
`,"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[x,T]of Object.entries(g))await Ta.writeFile(
|
|
1186
|
+
`,"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[x,T]of Object.entries(g))await Ta.writeFile(On.join(m,x),T);let w=await this._detectEmptyDirectory(t),b=await this._detectExistingCode(t);if(b||!w){f.step(3,4,"Analyzing project...");let x=await iE();if((await x.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await x.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let h=s.idea;if(w&&!b){if(!h)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let x=On.join(m,"planning","architect-session.md"),T=`# Architect Session
|
|
1187
1187
|
|
|
1188
1188
|
## Idea
|
|
1189
1189
|
${h}
|
|
@@ -1192,8 +1192,8 @@ ${h}
|
|
|
1192
1192
|
Initialized - awaiting stack recommendation
|
|
1193
1193
|
|
|
1194
1194
|
Generated: ${new Date().toLocaleString()}
|
|
1195
|
-
`;return await Ta.writeFile(x,T),await Ue.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:
|
|
1196
|
-
`);let n=await this.getGlobalProjectPath(t),o=
|
|
1195
|
+
`;return await Ta.writeFile(x,T),await Ue.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:h,wizard:a}}return await Ue.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(s=>{switch(s){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return f.fail("description required"),{success:!1,error:"Description required"};let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=Z();return await ce.addTasks(n,o.map(a=>({description:a,priority:"medium",type:"feature",section:"active",featureId:i,originFeature:e}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:i,tasks:o.length,timestamp:v()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async bug(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("bug description required"),{success:!1,error:"Description required"};let o=await $.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||f.spin("tracking bug...");let i=this._detectBugSeverity(e),c={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await ce.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:v()}),s.md?console.log(U(te("Bug Reported",e),Ye({Severity:i,Priority:c}),le([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),Wt("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let s=await this.ensureProjectInit(t);if(!s.success)return s;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
|
|
1196
|
+
`);let n=await this.getGlobalProjectPath(t),o=On.join(n,"planning","architect-session.md"),i;try{i=await _e(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
1197
1197
|
|
|
1198
1198
|
Create a plan first:
|
|
1199
1199
|
1. Run /p:init in an empty directory
|
|
@@ -1201,11 +1201,11 @@ Create a plan first:
|
|
|
1201
1201
|
3. Plan will be auto-generated
|
|
1202
1202
|
4. Then run /p:architect execute`}}if(!i||i.trim()==="")return{success:!1,message:"\u274C Architect plan is empty"};console.log(`\u{1F4CB} Reading architect plan...
|
|
1203
1203
|
`);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),u=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),d=a?a[1].split(`
|
|
1204
|
-
`)[0].trim():"Unknown project",
|
|
1204
|
+
`)[0].trim():"Unknown project",p=c?c[1]:"Not specified",m=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${d}`),console.log(`
|
|
1205
1205
|
\u{1F527} Stack:
|
|
1206
|
-
${m}`),console.log(`
|
|
1207
|
-
\u{1F4CB} Implementation Steps:
|
|
1208
1206
|
${p}`),console.log(`
|
|
1207
|
+
\u{1F4CB} Implementation Steps:
|
|
1208
|
+
${m}`),console.log(`
|
|
1209
1209
|
${"=".repeat(60)}`),console.log("\u{1F916} READY TO GENERATE CODE"),console.log("=".repeat(60)),console.log(`
|
|
1210
1210
|
The architect plan is ready. Claude will now:
|
|
1211
1211
|
1. Read the architectural plan
|
|
@@ -1214,7 +1214,7 @@ The architect plan is ready. Claude will now:
|
|
|
1214
1214
|
4. Create starter files with boilerplate
|
|
1215
1215
|
`),console.log(`
|
|
1216
1216
|
\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.
|
|
1217
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:v(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=
|
|
1217
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:v(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await $.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=On.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
1218
1218
|
|
|
1219
1219
|
## Idea
|
|
1220
1220
|
${e}
|
|
@@ -1231,12 +1231,12 @@ Initialized - awaiting architecture design
|
|
|
1231
1231
|
Generated: ${new Date().toLocaleString()}
|
|
1232
1232
|
`;return await Ta.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:v()}),s.md?console.log(U(te("Idea Captured",e),Ye({Mode:"architecture"}),le([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
|
|
1233
1233
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
1234
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await $e.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:v()}),s.md?console.log(U(te("Idea Captured",e),Ye({Mode:"capture"}),le([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),
|
|
1234
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await $e.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:v()}),s.md?console.log(U(te("Idea Captured",e),Ye({Mode:"capture"}),le([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),Wt("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(k(n)),{success:!1,error:k(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=A.getGlobalProjectPath(n),p=On.join(d,"planning","specs");try{let w=(await(await import("node:fs/promises")).readdir(p)).filter(b=>b.endsWith(".md")&&b!==".gitkeep");return w.length===0?(f.warn("no specs yet"),console.log(`
|
|
1235
1235
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
1236
1236
|
`),{success:!0,specs:[]}):(console.log(`
|
|
1237
1237
|
\u{1F4CB} SPECIFICATIONS
|
|
1238
1238
|
`),console.log("\u2550".repeat(50)),w.forEach((b,h)=>{let x=b.replace(".md","").replace(/-/g," ");console.log(` ${h+1}. ${x}`)}),console.log(`${"\u2550".repeat(50)}
|
|
1239
|
-
`),{success:!0,specs:w})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=A.getGlobalProjectPath(n),i=
|
|
1239
|
+
`),{success:!0,specs:w})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=A.getGlobalProjectPath(n),i=On.join(o,"planning","specs");await rt(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=On.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
1240
1240
|
|
|
1241
1241
|
## Overview
|
|
1242
1242
|
[Brief description of the feature]
|
|
@@ -1268,43 +1268,43 @@ Created: ${new Date().toLocaleString()}
|
|
|
1268
1268
|
Status: Draft
|
|
1269
1269
|
`;return await Ta.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:v()}),f.done(`spec created: ${a}.md`),console.log(`
|
|
1270
1270
|
\u{1F4DD} Edit: ~/.prjct-cli/projects/${n}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
|
|
1271
|
-
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async _seedShipWorkflow(e,t){let s=await ba(t),n=0;je.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:n++,createdAt:new Date().toISOString()}),s.lint&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var
|
|
1271
|
+
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async _seedShipWorkflow(e,t){let s=await ba(t),n=0;je.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:n++,createdAt:new Date().toISOString()}),s.lint&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&je.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var Vu,Nn,hh=S(()=>{"use strict";xs();Zo();Te();ve();W();B();Fe();Vu=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Ea(),gh)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw zo.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 Yn();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 Cs(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return O(t)||console.error(`Directory check error: ${k(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Cs(e)).some(n=>t.includes(n))}catch(t){return O(t)||console.error(`Code check error: ${k(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},Nn=new Vu});var Ce,Mt=S(()=>{"use strict";Ou();Lu();uh();Gu();In();hh();Ce=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new ha,this.updateNotificationShown=!1,this.commandExecutor=fa}get agent(){return Sa.getAgent()}get agentInfo(){return Sa.getInfo()}get currentAuthor(){return Nn.getCurrentAuthor()}async initializeAgent(){return Sa.initialize()}async ensureProjectInit(e){return Nn.ensureInit(e)}async ensureAuthor(){return Nn.ensureAuthor()}async getGlobalProjectPath(e){return Nn.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Ht.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return Nn.isEmptyDirectory(e)}async _detectExistingCode(e){return Nn.hasExistingCode(e)}_breakdownFeatureTasks(e){return vr.breakdownFeature(e)}_detectBugSeverity(e){return vr.detectBugSeverity(e)}}});var fh={};ye(fh,{AnalysisCommands:()=>Fn});import Pa from"node:fs/promises";import yh from"node:path";import*as Ln from"@clack/prompts";var wh,Fn,Ca=S(()=>{"use strict";Ci();Ii();pp();Os();Te();ve();pi();fl();Dp();Lp();Pl();Yi();lr();ee();er();mo();W();K();hs();yr();Fe();rf();Mt();wh=`{version:1, commitHash, analyzedAt,
|
|
1272
1272
|
architecture:{style:"monolith|monorepo|microservices|modular-monolith", insights:[], domains:[]},
|
|
1273
1273
|
patterns:[{name, description, locations:[], confidence:0-1, category:"architecture|data-flow|error-handling|testing"}],
|
|
1274
1274
|
antiPatterns:[{issue, reasoning, files:[], suggestion, severity:"low|medium|high", confidence:0-1}],
|
|
1275
1275
|
techDebt:[{description, area, effort:"small|medium|large", impact, priority:"low|medium|high"}],
|
|
1276
1276
|
riskAreas:[{path, reason, risk, severity}], refactorSuggestions:[{description, files:[], benefit, effort}],
|
|
1277
1277
|
projectInsights:[], conventions:[{category, rule, example}],
|
|
1278
|
-
commands:{build, test, lint, dev, format, install}, stack:{languages:[], frameworks:[], packageManager}}`,
|
|
1279
|
-
`),
|
|
1278
|
+
commands:{build, test, lint, dev, format, install}, stack:{languages:[], frameworks:[], packageManager}}`,Fn=class extends Ce{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1279
|
+
`),mt.init(t);let s=await jn.build(t,e),n={packageJson:await mt.readPackageJson(),cargoToml:await mt.readCargoToml(),goMod:await mt.readGoMod(),requirements:await mt.readRequirements(),directories:await mt.listDirectories(),fileCount:await mt.countFiles(),gitStats:await mt.getGitStats(),gitLog:await mt.getGitLog(20),hasDockerfile:await mt.fileExists("Dockerfile"),hasDockerCompose:await mt.fileExists("docker-compose.yml"),hasReadme:await mt.fileExists("README.md"),hasTsconfig:await mt.fileExists("tsconfig.json"),hasViteConfig:await mt.fileExists("vite.config.ts")||await mt.fileExists("vite.config.js"),hasNextConfig:await mt.fileExists("next.config.js")||await mt.fileExists("next.config.mjs")},o=nf(n,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await Pa.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:v(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(lt(),bt(Nt)).getActiveProvider(),d=await Ue.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1280
1280
|
`),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1281
|
-
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:n}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(n),i=Date.now();if(t.package){let
|
|
1282
|
-
${
|
|
1283
|
-
`)}catch{h="### Next: Run `prjct analysis-payload --md` to update project analysis"}let x=
|
|
1281
|
+
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:n}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(n),i=Date.now();if(t.package){let p=await A.detectMonorepo(e);if(!p.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let m=p.packages.find(w=>w.name===t.package||w.relativePath===t.package);if(!m){let w=p.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${w}`}}let g=await Ns.sync(e,{packagePath:m.path,packageName:m.name});return t.json?console.log(JSON.stringify({success:g.success,package:m.name,path:m.relativePath})):t.md?console.log(U(fe(`Synced package: ${m.name}`))):f.done(`Synced package: ${m.name}`),{success:g.success}}let a=yh.join(o,"context","CLAUDE.md"),c=null;try{c=await Pa.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let p=await Ns.sync(e,{full:t.full});if(!p.success)return t.md?(console.log(U("## Sync Failed",`> ${p.error||"Unknown error"}`)),{success:!1,error:p.error}):u?(console.log(JSON.stringify({success:!1,error:p.error||"Sync failed"})),{success:!1,error:p.error}):(f.fail(p.error||"Sync failed"),{success:!1,error:p.error});let m;try{m=await Pa.readFile(a,"utf-8")}catch{m=""}let g=Op(c,m);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(U(fe("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let w=l(async()=>{c!=null&&await Pa.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await w();let h=[];for(let T of g.added)h.push(`Added: ${T.name} (${T.lineCount} lines)`);for(let T of g.modified)h.push(`Modified: ${T.name} (${T.lineCount} lines)`);for(let T of g.removed)h.push(`Removed: ${T.name} (${T.lineCount} lines)`);let x=U("## Sync Preview",h.length>0?te("Changes",He(h)):"No section changes.",Ye({"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(x),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await w();let h={added:g.added.map(x=>({name:x.name,lineCount:x.lineCount})),modified:g.modified.map(x=>({name:x.name,lineCount:x.lineCount})),removed:g.removed.map(x=>({name:x.name,lineCount:x.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:h,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(_p(g)),t.preview)return await w(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=await Ln.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Ln.isCancel(b)||b==="cancel")return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(b==="diff"){console.log(`
|
|
1282
|
+
${Np(g)}`);let h=await Ln.confirm({message:"Apply these changes?",initialValue:!0});if(Ln.isCancel(h)||!h)return await w(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),ru(p,i)}t.md||f.spin("Syncing project...");let d=await Ns.sync(e,{full:t.full});if(!d.success)return t.md?console.log(U("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let p=Date.now()-i,m=d.generatedSkills?.generated?.length??0,g=null;try{let j=await pt.diff(n);j?.hasChanges&&(g=gl(j))}catch{}let w=d.git.recentCommits[0]?.hash??null,b=w&&Qt.isCurrent(n,w),h=null;if(!b)try{let j=await Tl(n,e,d.git,d.stats);h=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",wh,"```","### Data","```json",JSON.stringify(j),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`"].join(`
|
|
1283
|
+
`)}catch{h="### Next: Run `prjct analysis-payload --md` to update project analysis"}let x=ea("sync",!0),T=d.syncMetrics?.indexes,I={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(T?.bm25Files){let j=T.bm25Files*(T.bm25AvgTokens||0);I["Tokens indexed"]=`${Math.round(j/1e3)}K`,I["Import edges"]=T.importEdges||0,I["Co-change commits"]=T.cochangeCommits||0}let M=null;try{let D=(await $.readGlobalConfig(n))?.integrations?.obsidian;D?.vaultPath&&(M=`### Obsidian
|
|
1284
1284
|
Configured: \`${D.vaultPath}\`
|
|
1285
|
-
Write \`_insights.md\` to vault after analysis.`)}catch{}let y=U(fe("Sync Complete"),Ye(I),g,d.git.hasChanges?iu("Uncommitted changes detected"):null,h,M,le(x.map(j=>({label:j.desc,command:j.cmd}))));return console.log(y),{success:!0,data:d,metrics:{elapsed:m,skillCount:p,fileCount:d.stats.fileCount}}}return au(d,i)}catch(s){return t.md?console.log(U("## Sync Failed",`> ${k(s)}`)):f.fail(k(s)),{success:!1,error:k(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Os.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Qt.isCurrent(n,i))return t.md?console.log(U(fe("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 Pl(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Ph,"```","### Data","```json",JSON.stringify(a),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:k(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Qt.save(o,i),s.md?console.log(U(fe("LLM Analysis Saved"),Ye({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:k(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Qt.getActive(n);if(!o)return t.md?console.log(U("## 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=[fe(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(te("Architecture Insights",He(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(te(`Patterns (${o.patterns.length})`,He(a.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(te(`Anti-Patterns (${o.antiPatterns.length})`,He(a.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(te(`Tech Debt (${o.techDebt.length})`,He(a.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}o.conventions.length>0&&i.push(te("Conventions",He(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(U(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(s){return{success:!1,error:k(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Zt.getSummary(n),i=await Zt.getDailyStats(n,30),a=await uf(n),c=await bt.getPatternsSummary(n);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let u="Unknown";try{u=E.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Zt.read(n),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${kr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${hi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${cu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,w)=>g+w.usageCount,0);for(let g of o.topAgents){let w=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${w}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=df(i);if(console.log(` ${p} ${kr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",w=o.trend>0?"+":"";console.log(` ${g} ${w}${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=pf(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:",k(s)),{success:!1,error:k(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Ui(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await mt.getStatus(n);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=Ch.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=U(`## Status: ${u}`,Ye({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?te("Analysis",He(p)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await mt.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(U("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(U(yl(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Rm(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await mt.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await mt.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(U(fe("Analysis Rolled Back"),Ye({"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(U("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await mt.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=k(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=E.getDoc(n,"project")?.repoPath||e}catch{}let i=await mt.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});var Xu,H,_o=S(()=>{"use strict";Te();ve();W();X();Xu=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,s,n){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,n)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let s of this.categories.keys())t[s]=e.filter(n=>n.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.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 n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:v()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:k(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return n.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()}},H=new Xu});import uE from"node:fs/promises";import dE from"node:path";var Pr,Yu=S(()=>{"use strict";xi();Te();Rl();Wc();ee();Vs();Vt();Js();St();W();X();fs();Fe();Mt();_o();Pr=class extends Ce{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=dE.basename(t),a=await L.getCurrentTask(o),c=await ce.getActiveTasks(o),u=await it.getRecent(o,5),d=await $e.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=Gs(m),g=[];try{let h=p.toISOString();g=E.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",h).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let w={tasksCompleted:g.filter(h=>h.action==="task_completed").length,featuresShipped:g.filter(h=>h.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1285
|
+
Write \`_insights.md\` to vault after analysis.`)}catch{}let y=U(fe("Sync Complete"),Ye(I),g,d.git.hasChanges?nu("Uncommitted changes detected"):null,h,M,le(x.map(j=>({label:j.desc,command:j.cmd}))));return console.log(y),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return ru(d,i)}catch(s){return t.md?console.log(U("## Sync Failed",`> ${k(s)}`)):f.fail(k(s)),{success:!1,error:k(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ns.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Qt.isCurrent(n,i))return t.md?console.log(U(fe("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 Tl(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",wh,"```","### Data","```json",JSON.stringify(a),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:k(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Qt.save(o,i),s.md?console.log(U(fe("LLM Analysis Saved"),Ye({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:k(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Qt.getActive(n);if(!o)return t.md?console.log(U("## 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=[fe(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(te("Architecture Insights",He(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(te(`Patterns (${o.patterns.length})`,He(a.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(te(`Anti-Patterns (${o.antiPatterns.length})`,He(a.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(te(`Tech Debt (${o.techDebt.length})`,He(a.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}o.conventions.length>0&&i.push(te("Conventions",He(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(U(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(s){return{success:!1,error:k(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Zt.getSummary(n),i=await Zt.getDailyStats(n,30),a=await ef(n),c=await Tt.getPatternsSummary(n);if(t.json){let m={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(m)),{success:!0,data:m}}let u="Unknown";try{u=E.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await Zt.read(n),p=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${p.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${wr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${mi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${ou(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((g,w)=>g+w.usageCount,0);for(let g of o.topAgents){let w=m>0?(g.usageCount/m*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${w}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=tf(i);if(console.log(` ${m} ${wr(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",w=o.trend>0?"+":"";console.log(` ${g} ${w}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let m=sf(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",k(s)),{success:!1,error:k(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=Fi(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await pt.getStatus(n);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=yh.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=U(`## Status: ${u}`,Ye({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?te("Analysis",He(m)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await pt.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(U("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(U(gl(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Sp(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await pt.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await pt.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(U(fe("Analysis Rolled Back"),Ye({"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(U("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(U("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await pt.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=k(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=E.getDoc(n,"project")?.repoPath||e}catch{}let i=await pt.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let n=k(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});var Ju,H,Do=S(()=>{"use strict";Te();ve();W();K();Ju=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,s,n){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,n)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let s of this.categories.keys())t[s]=e.filter(n=>n.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.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 n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:v()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:k(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:v()};return n.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()}},H=new Ju});import aE from"node:fs/promises";import cE from"node:path";var Er,zu=S(()=>{"use strict";Ci();Te();Pl();Lc();ee();Js();Vt();zs();vt();W();K();hs();Fe();Mt();Do();Er=class extends Ce{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=cE.basename(t),a=await L.getCurrentTask(o),c=await ce.getActiveTasks(o),u=await it.getRecent(o,5),d=await $e.getPending(o);if(e==="compact"){let p=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",m=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${p} | ${m} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let p=e==="week"?7:30,m=qs(p),g=[];try{let h=m.toISOString();g=E.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",h).map(T=>({...JSON.parse(T.data),timestamp:T.timestamp}))}catch{g=[]}let w={tasksCompleted:g.filter(h=>h.action==="task_completed").length,featuresShipped:g.filter(h=>h.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1286
1286
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1287
|
-
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${w.tasksCompleted}`),console.log(` Features shipped: ${w.featuresShipped}`),console.log(` Total actions: ${w.totalActions}`),console.log("\u2550".repeat(50));let b=this._generateSparkline(g,
|
|
1287
|
+
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${w.tasksCompleted}`),console.log(` Features shipped: ${w.featuresShipped}`),console.log(` Total actions: ${w.totalActions}`),console.log("\u2550".repeat(50));let b=this._generateSparkline(g,p);return console.log(`
|
|
1288
1288
|
Activity: ${b}
|
|
1289
|
-
`),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let
|
|
1289
|
+
`),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let p=await jn.build(t),m=null;try{m=await aE.readFile(p.paths.roadmap,"utf-8")}catch{m=null}if(console.log(`
|
|
1290
1290
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1291
|
-
`),console.log("\u2550".repeat(50)),!
|
|
1292
|
-
`);else{let g=
|
|
1291
|
+
`),console.log("\u2550".repeat(50)),!m||m.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1292
|
+
`);else{let g=m.split("##").filter(w=>w.trim()&&!w.includes("ROADMAP"));g.slice(0,5).forEach((w,b)=>{let h=w.split(`
|
|
1293
1293
|
`)[0].trim();console.log(` ${b+1}. ${h}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1294
|
-
`),{success:!0,view:"roadmap"}}if(s.md){let
|
|
1295
|
-
`+
|
|
1294
|
+
`),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${js(new Date(a.startedAt))} ago)`:""}`:"No active task",m=c.length>0?c.slice(0,5).map(h=>{let x=h.priority?` [${h.priority}]`:"";return`${h.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${x}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(h=>{let x=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";return`${h.name}${x?` (${x})`:""}`}):["Nothing shipped yet"],w=null;try{let h=lo.getSummary(o,7);(h.smartPercent<100||h.compactions>0)&&(w=`### Context Health (7d)
|
|
1295
|
+
`+tn(["Zone","%"],[["Smart",`${h.smartPercent}%`],["Warning",`${h.warningPercent}%`],["Dumb",`${h.dumbPercent}%`],["Compactions",`${h.compactions}`]]))}catch{}let b=U(`## Dashboard: ${i}`,te("Current Focus",p),te(`Queue (${c.length})`,He(m,!0)),te("Recent Ships",He(g)),te("Ideas",`${d.length} pending`),w,le([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(b)}else{console.log(`
|
|
1296
1296
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1297
|
-
`),console.log("\u2550".repeat(50));let
|
|
1297
|
+
`),console.log("\u2550".repeat(50));let p=Fi(t),m=await p.check(o),g=p.getWarning(m);if(g&&console.log(`
|
|
1298
1298
|
${g}`),console.log(`
|
|
1299
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let w=
|
|
1299
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let w=js(new Date(a.startedAt));console.log(` Started: ${w} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1300
1300
|
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((w,b)=>{let h=w.priority?`[${w.priority}]`:"";console.log(` ${b+1}. ${w.description.slice(0,40)} ${h}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1301
1301
|
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(w=>{let b=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${w.name} ${b?`(${b})`:""}`)}),console.log(`
|
|
1302
1302
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1303
1303
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1304
1304
|
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:v()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
1305
1305
|
PRJCT COMMANDS
|
|
1306
|
-
`),console.log("=".repeat(50));let i=H.getAllCategories(),a=H.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
|
|
1307
|
-
${
|
|
1306
|
+
`),console.log("=".repeat(50));let i=H.getAllCategories(),a=H.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 p=i.get(u);console.log(`
|
|
1307
|
+
${p?.title||u}:`),d.forEach(m=>{let g=m.params?` ${m.params}`:"";console.log(` ${m.name}${g}`),console.log(` ${m.description}`)})}),console.log(`
|
|
1308
1308
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1309
1309
|
`),{success:!0,topic:"overview"}}let s=H.getByName(e);if(s){if(console.log(`
|
|
1310
1310
|
\u{1F4DA} HELP: /p:${s.name}
|
|
@@ -1316,9 +1316,9 @@ ${"\u2550".repeat(50)}
|
|
|
1316
1316
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1317
1317
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1318
1318
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1319
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),
|
|
1320
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(te("Stack",Ye({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),U(...t)}async loadRepoAnalysis(e){try{let t=
|
|
1321
|
-
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}var
|
|
1319
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),p=e.filter(m=>{let g=new Date(m.timestamp);return g>=u&&g<=d}).length;o.push(p)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var Sh={};ye(Sh,{ContextCommands:()=>on,contextCommands:()=>kh,default:()=>dE});import lE from"node:fs/promises";import uE from"node:path";var on,kh,dE,xa=S(()=>{"use strict";Pu();Te();ve();vt();W();hs();on=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let n=(e||"").trim().split(/\s+/),o=n[0]||"task",i=n.slice(1).join(" "),a=await $.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=A.getGlobalProjectPath(c),d=await L.read(c),p=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(b=>({id:b.id,description:b.description,status:b.status,domain:b.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,m=null;if(i)try{m=await pa.execute(o,i,t)}catch(b){console.error(`Warning: Orchestrator failed: ${k(b)}`)}let g=await this.loadRepoAnalysis(u),w={projectId:c,globalPath:u,currentTask:p,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,subtasks:m?.subtasks?.map(b=>({id:b.id,description:b.description,domain:b.domain,agent:b.agent,status:b.status,order:b.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(w)):console.log(JSON.stringify(w)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${k(n)}`}}}formatContextMd(e){let t=[];if(t.push(te("Project",Zi(Qi("ID",e.projectId),Qi("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(hr({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let n=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(n.join(`
|
|
1320
|
+
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(te("Stack",Ye({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),U(...t)}async loadRepoAnalysis(e){try{let t=uE.join(e,"analysis","repo-analysis.json"),s=await lE.readFile(t,"utf-8"),n=JSON.parse(s);return{ecosystem:n.ecosystem||"unknown",frameworks:n.frameworks||[],hasTests:n.hasTests??!1,technologies:n.technologies||[]}}catch(t){return O(t),null}}},kh=new on,dE=kh});import Xu from"node:fs";import bh from"node:path";async function Ku(r){let e=await $.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-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}}async function Yu(r){let e=await $.getProjectId(r);if(!e)return;let s=N.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;N.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}async function vh(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await Ku(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await $.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],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),n.push(`Memory: ${a} old entries removed`)}else n.push("Memory: No cleanup needed");try{let a=await $e.cleanup(s);a.removed>0?n.push(`Ideas: ${a.removed} old archived ideas removed`):n.push("Ideas: No cleanup needed")}catch(a){n.push(`Ideas: Error - ${k(a)}`)}try{let c=(await ce.getActiveTasks(s)).filter(u=>u.completed).length;c>0?n.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):n.push("Queue: No completed tasks")}catch(a){n.push(`Queue: Error - ${k(a)}`)}return await Yu(e),await Ht.log(e,"cleanup_performed",{items:n.length,timestamp:v()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(k(t)),{success:!1,error:k(t)}}}async function Th(r){let e=A.getGlobalBasePath(),t=bh.join(e,"projects");if(!Xu.existsSync(t))return{success:!0,message:"No projects directory found"};let s=Xu.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=bh.join(t,a);if(!mE.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),Xu.rmSync(c,{recursive:!0,force:!0}),n.push(a)}catch{o.push(a)}}if(r.md){let i=[`## ${r.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${n.length} |`,`| Kept | ${o.length} |`];return n.length>0&&i.push("","### Removed",...n.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
|
|
1321
|
+
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}var mE,Eh=S(()=>{"use strict";Te();ve();In();ee();Js();Vt();W();K();Fe();l(Ku,"cleanupMemory");l(Yu,"cleanupMemoryInternal");l(vh,"cleanup");mE=[/^qa-/,/^nonexistent-/,/^test-/];l(Th,"cleanupProjects")});import Ch from"node:path";async function Ph(r=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return f.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=r||"system";f.spin(`designing ${s}...`);let i=await $.getProjectId(t),a=Ch.join(A.getGlobalProjectPath(i),"planning","designs");await rt(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
|
|
1322
1322
|
|
|
1323
1323
|
*Use templates/design/architecture.md for full design*
|
|
1324
1324
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1333,14 +1333,14 @@ ${"\u2550".repeat(50)}
|
|
|
1333
1333
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1334
1334
|
|
|
1335
1335
|
*Use templates/design/flow.md for full design*
|
|
1336
|
-
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1336
|
+
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Ch.join(a,u);return await Pt(d,c),await Ht.log(t,"design_created",{type:s,target:o,timestamp:v()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}var xh=S(()=>{"use strict";Te();ve();In();W();K();B();Fe();l(Ph,"design")});var at,jh=S(()=>{"use strict";at={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"}});var Qu,Ct,$o,Rh=S(()=>{"use strict";xs();ee();jh();Pn();Is();Qu=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=sp.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let s=this.onceListeners.get(e);s&&s.delete(t)}}off(e,t){let s=this.listeners.get(e);s&&s.delete(t)}async emit(e,t={}){let s=new Date().toISOString(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,n)))).forEach(u=>{u.status==="rejected"&&V.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(at.ALL);if(c)for(let u of c)await this.executeCallback(u,n)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let n=this.listeners.get(at.ALL);n&&t.push(...n);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let s=e(t);s instanceof Promise&&await s}catch(s){throw V.error("Event callback error:",s),s}}async logEvent(e){try{E.appendEvent(this.projectId,e.type,e)}catch(t){V.debug("Failed to log event:",we(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.type.startsWith(t))),s.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Ct=new Qu,$o={sessionStarted:l(r=>Ct.emit(at.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>Ct.emit(at.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>Ct.emit(at.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>Ct.emit(at.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>Ct.emit(at.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>Ct.emit(at.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>Ct.emit(at.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>Ct.emit(at.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>Ct.emit(at.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>Ct.emit(at.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>Ct.emit(at.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>Ct.emit(at.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>Ct.emit(at.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>Ct.emit(at.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>Ct.emit(at.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>Ct.emit(at.ANALYSIS_COMPLETED,r),"analysisCompleted")}});function ja(r){let e=0,t=null;for(let s of r.timeline)s.type==="start"||s.type==="resume"?t=new Date(s.at):(s.type==="pause"||s.type==="complete")&&t&&(e+=new Date(s.at).getTime()-t.getTime(),t=null);return t&&r.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}function Ih(r){return xt(r*1e3)}var Ah,Dh=S(()=>{"use strict";Ut();K();Ah=Z;l(ja,"calculateDuration");l(Ih,"formatDuration")});function $h(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}var Ra,Mh=S(()=>{"use strict";Rh();Te();ee();W();Je();Dh();l($h,"rowToSession");Ra=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.");E.getDb(this.projectId),this.initialized=!0}generateId(){return Ah()}async getCurrent(){this.initialized||await this.initialize();let e=E.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?$h(e):null}async create(e){this.initialized||await this.initialize();let t=await this.getCurrent();if(t&&t.status==="active")throw new Error(`Session already active: "${t.task}". Use /p:done or /p:pause first.`);let s=new Date().toISOString(),n={id:this.generateId(),projectId:this.projectId,task:e,status:"active",startedAt:s,pausedAt:null,completedAt:null,duration:0,metrics:{filesCreated:0,filesChanged:0,filesModified:0,linesAdded:0,linesRemoved:0,commits:0,snapshots:[]},timeline:[{type:"start",at:s}]};return this.saveSession(n),await this.logEvent("session_started",{sessionId:n.id,task:e}),await $o.sessionStarted({sessionId:n.id,task:e,projectId:this.projectId}),n}async resume(e=null){this.initialized||await this.initialize();let t=await this.getCurrent();if(e&&(!t||t.task!==e))return this.create(e);if(!t){if(!e)throw new Error("No active session. Provide a task to start one.");return this.create(e)}if(t.status==="active")return t;let s=new Date().toISOString();return t.status="active",t.timeline.push({type:"resume",at:s}),this.saveSession(t),await this.logEvent("session_resumed",{sessionId:t.id}),await $o.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=ja(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await $o.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=ja(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 $o.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return ja(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await F(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(n.trim(),10)||0;let{stdout:o}=await F(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
|
|
1337
1337
|
`),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){O(s)||console.error(`Metrics calculation warning: ${k(s)}`)}return t}saveSession(e){E.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
1338
|
-
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(),E.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(
|
|
1338
|
+
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(),E.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map($h)}async logEvent(e,t){try{E.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Ih(e)}}});import Cr from"node:path";async function Oh(r=process.cwd()){try{if(!await $.getProjectId(r))return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin("checking for abandoned sessions...");let s=await new Ra(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1339
1339
|
Found abandoned session:
|
|
1340
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let o=
|
|
1340
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let o=js(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1341
1341
|
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
|
|
1342
|
-
`),{success:!0,session:n}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function
|
|
1343
|
-
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await Pt(s,JSON.stringify(n,null,2)),await
|
|
1342
|
+
`),{success:!0,session:n}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function _h(r=process.cwd()){try{f.spin("creating undo point...");let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Cr.join(A.getGlobalProjectPath(e),"snapshots");await rt(t);let{execFileSync:s,execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return f.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let a=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s("git",["stash","push","-m",a],{cwd:r,encoding:"utf-8"});let c=Cr.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await _e(c);u=JSON.parse(d)}catch(d){if(!O(d)&&!(d instanceof SyntaxError))throw d}return u.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),u.current=u.snapshots.length-1,await Pt(c,JSON.stringify(u,null,2)),await Ht.log(r,"undo_performed",{snapshotId:a,timestamp:v()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(o)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Nh(r=process.cwd()){try{f.spin("restoring changes...");let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Cr.join(A.getGlobalProjectPath(e),"snapshots"),s=Cr.join(t,"history.json"),n;try{let i=await _e(s);n=JSON.parse(i)}catch(i){if(O(i)||i instanceof SyntaxError)return f.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(n.snapshots.length===0)return f.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
|
|
1343
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await Pt(s,JSON.stringify(n,null,2)),await Ht.log(r,"redo_performed",{timestamp:v()}),f.done("changes restored"),{success:!0}):(f.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(f.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:k(i)}}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}async function Lh(r=process.cwd()){try{let e=await $.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=Cr.join(A.getGlobalProjectPath(e),"snapshots"),s=Cr.join(t,"history.json"),n;try{let o=await _e(s);n=JSON.parse(o)}catch(o){if(O(o)||o instanceof SyntaxError)return console.log(`
|
|
1344
1344
|
SNAPSHOT HISTORY
|
|
1345
1345
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1346
1346
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1348,26 +1348,26 @@ ${"\u2550".repeat(50)}
|
|
|
1348
1348
|
`),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1349
1349
|
`)):(n.snapshots.forEach((o,i)=>{let a=i===n.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${n.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
|
|
1350
1350
|
`)),console.log(`${"=".repeat(50)}
|
|
1351
|
-
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var
|
|
1352
|
-
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}}});import st from"node:fs/promises";import q from"node:path";var
|
|
1353
|
-
`);await st.writeFile(q.join(e,".prjct-link.yml"),n,"utf-8")}async exportBoard(e,t){let s=await L.read(e),n=q.join(t,"board"),o=0;if(s.currentTask){let c=s.currentTask,u=c.subtasks||[],d=c.currentSubtaskIndex??0,
|
|
1354
|
-
${
|
|
1351
|
+
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var Fh=S(()=>{"use strict";Te();ve();In();Mh();W();K();B();Fe();l(Oh,"recover");l(_h,"undo");l(Nh,"redo");l(Lh,"history")});var Pr,Zu=S(()=>{"use strict";Ao();Mt();Eh();xh();Fh();Pr=class extends Ce{static{l(this,"MaintenanceCommands")}_cleanupMemory=Ku;_cleanupMemoryInternal=Yu;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?vh(e,t):s}async cleanupProjects(e={}){return Th(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?Ph(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Oh(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?_h(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Nh(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Lh(e):t}async enrich(e=null,t=process.cwd(),s={}){let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=e?.trim();if(!o)return{success:!1,error:"Missing issue ID or description",message:'Usage: prjct enrich "<issue-id-or-description>" --md'};let i=o.match(/\b[A-Z]+-\d+\b/)?.[0]||null,a=await nn(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)),{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(`
|
|
1352
|
+
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}}});import st from"node:fs/promises";import q from"node:path";var ed,xr,Uh=S(()=>{"use strict";ee();Vt();zs();vt();hs();ed=class r{static{l(this,"ObsidianExporter")}getProjectPath(e,t){let s=e.projectFolder||t;return q.join(e.vaultPath,"projects",s)}async exportAll(e,t,s){let n=this.getProjectPath(s,t),o=[],i={success:!0,projectFolder:n,exported:{board:0,queue:0,shipped:0,roadmap:0,daily:!1},errors:o};await this.ensureStructure(n);try{i.exported.board=await this.exportBoard(e,n)}catch(a){o.push(`board: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.queue=await this.exportQueue(e,n)}catch(a){o.push(`queue: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.shipped=await this.exportShipped(e,n)}catch(a){o.push(`shipped: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.roadmap=await this.exportRoadmap(e,n)}catch(a){o.push(`roadmap: ${a instanceof Error?a.message:String(a)}`)}try{i.exported.daily=await this.exportDaily(e,n)}catch(a){o.push(`daily: ${a instanceof Error?a.message:String(a)}`)}try{await this.exportIndex(t,n)}catch(a){o.push(`index: ${a instanceof Error?a.message:String(a)}`)}return i.success=o.length===0,i}async ensureStructure(e){let t=["board","queue","shipped","roadmap","architecture","design","research","meetings","notes","daily","retros"];for(let s of t)await st.mkdir(q.join(e,s),{recursive:!0})}async writeLink(e,t,s){let n=[`projectId: ${t}`,`projectPath: ${s}`,`linkedAt: ${new Date().toISOString()}`].join(`
|
|
1353
|
+
`);await st.writeFile(q.join(e,".prjct-link.yml"),n,"utf-8")}async exportBoard(e,t){let s=await L.read(e),n=q.join(t,"board"),o=0;if(s.currentTask){let c=s.currentTask,u=c.subtasks||[],d=c.currentSubtaskIndex??0,p={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,estimated_points:c.estimatedPoints,started_at:c.startedAt,updated_at:new Date().toISOString()},m=u.map((h,x)=>{let T=h.status==="completed"?"x":" ",I=x===d&&h.status!=="completed"?" <- current":"";return`- [${T}] ${h.description}${I}`}),g=u.filter(h=>h.status==="completed").length,w=u.length>0?`${g}/${u.length} (${Math.round(g/u.length*100)}%)`:"",b=Ls(p,c.description,m.length>0?`## Subtasks
|
|
1354
|
+
${m.join(`
|
|
1355
1355
|
`)}`:null,w?`## Progress
|
|
1356
|
-
${w}`:null);await st.writeFile(q.join(n,`${c.id}.md`),b,"utf-8"),o++}let i=s.pausedTasks||[];for(let c of i){let u=c.id||`paused_${Date.now()}`,d={prjct_id:u,prjct_type:"task",status:"paused",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,updated_at:new Date().toISOString()},
|
|
1357
|
-
`),"utf-8")}async exportQueue(e,t){let s=await ce.read(e),n=q.join(t,"queue"),o=0;for(let i of s.tasks){if(i.completed)continue;let a={prjct_id:i.id,prjct_type:"queue",priority:i.priority,type:i.type,section:i.section,created_at:i.createdAt,updated_at:new Date().toISOString()};i.agent&&(a.agent=i.agent),i.groupName&&(a.group=i.groupName),i.featureId&&(a.feature_id=i.featureId);let c=
|
|
1356
|
+
${w}`:null);await st.writeFile(q.join(n,`${c.id}.md`),b,"utf-8"),o++}let i=s.pausedTasks||[];for(let c of i){let u=c.id||`paused_${Date.now()}`,d={prjct_id:u,prjct_type:"task",status:"paused",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,updated_at:new Date().toISOString()},p=Ls(d,c.description,"Status: paused");await st.writeFile(q.join(n,`${u}.md`),p,"utf-8"),o++}let a=s.activeTasks||[];for(let c of a){let u={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,started_at:c.startedAt,worktree:c.worktreePath,updated_at:new Date().toISOString()},d=Ls(u,c.description);await st.writeFile(q.join(n,`${c.id}.md`),d,"utf-8"),o++}return await this.generateKanbanBoard(s,n),o}async generateKanbanBoard(e,t){let s=["---","kanban-plugin: board","---",""],n=[],o=[],i=[];e.currentTask&&n.push(`- [[${e.currentTask.id}]]`);for(let c of e.activeTasks||[])n.push(`- [[${c.id}]]`);for(let c of e.pausedTasks||[])c.id&&o.push(`- [[${c.id}]]`);let a=e.taskHistory||[];for(let c of a.slice(0,5))i.push(`- [[${c.taskId}]]`);s.push("## In Progress"),s.push(...n.length>0?n:[""]),s.push(""),s.push("## Paused"),s.push(...o.length>0?o:[""]),s.push(""),s.push("## Done"),s.push(...i.length>0?i:[""]),await st.writeFile(q.join(t,"_kanban.md"),s.join(`
|
|
1357
|
+
`),"utf-8")}async exportQueue(e,t){let s=await ce.read(e),n=q.join(t,"queue"),o=0;for(let i of s.tasks){if(i.completed)continue;let a={prjct_id:i.id,prjct_type:"queue",priority:i.priority,type:i.type,section:i.section,created_at:i.createdAt,updated_at:new Date().toISOString()};i.agent&&(a.agent=i.agent),i.groupName&&(a.group=i.groupName),i.featureId&&(a.feature_id=i.featureId);let c=Ls(a,i.description);await st.writeFile(q.join(n,`${i.id}.md`),c,"utf-8"),o++}return o}async exportShipped(e,t){let s=await it.read(e),n=q.join(t,"shipped"),o=0;for(let i of s.shipped){let a={prjct_id:i.id,prjct_type:"shipped",name:i.name,version:i.version,type:i.type,shipped_at:i.shippedAt};i.duration&&(a.duration=i.duration),i.codeMetrics?.filesChanged&&(a.files_changed=i.codeMetrics.filesChanged),i.codeMetrics?.linesAdded&&(a.lines_added=i.codeMetrics.linesAdded),i.codeMetrics?.linesRemoved&&(a.lines_removed=i.codeMetrics.linesRemoved);let c=[];if(i.changes&&i.changes.length>0){let d=i.changes.map(p=>`- ${p.type?`**${p.type}**: `:""}${p.description}`);c.push(`## Changes
|
|
1358
1358
|
${d.join(`
|
|
1359
|
-
`)}`)}if(i.codeMetrics){let d=i.codeMetrics,
|
|
1360
|
-
${
|
|
1361
|
-
`)}`)}let u=
|
|
1359
|
+
`)}`)}if(i.codeMetrics){let d=i.codeMetrics,p=[];d.filesChanged&&p.push(`- **Files**: ${d.filesChanged} changed`),(d.linesAdded||d.linesRemoved)&&p.push(`- **Lines**: +${d.linesAdded||0} / -${d.linesRemoved||0}`),i.duration&&p.push(`- **Duration**: ${i.duration}`),p.length>0&&c.push(`## Metrics
|
|
1360
|
+
${p.join(`
|
|
1361
|
+
`)}`)}let u=Ls(a,i.name,i.description||null,...c);await st.writeFile(q.join(n,`${i.id}.md`),u,"utf-8"),o++}return o}async exportRoadmap(e,t){let s=E.getDoc(e,"roadmap");if(!s)return 0;let n=q.join(t,"roadmap"),o=0,i=s.features||[];for(let a of i){let c={prjct_id:a.id,prjct_type:"feature",status:a.status,impact:a.impact,progress:a.progress,updated_at:new Date().toISOString()};a.phase&&(c.phase=a.phase),a.quarter&&(c.quarter=a.quarter),a.dependencies&&a.dependencies.length>0&&(c.dependencies=a.dependencies);let u=(a.tasks||[]).map(p=>`- [${p.completed?"x":" "}] ${p.description}`),d=Ls(c,a.name,a.description||null,u.length>0?`## Tasks
|
|
1362
1362
|
${u.join(`
|
|
1363
1363
|
`)}`:null);await st.writeFile(q.join(n,`${a.id}.md`),d,"utf-8"),o++}return await this.generateCanvas(i,n),o}async generateCanvas(e,t){let s={shipped:"4",completed:"4",active:"5",planned:"0"},n=e.map((a,c)=>({id:a.id,type:"text",text:`**${a.name}**
|
|
1364
1364
|
Status: ${a.status}${a.quarter?`
|
|
1365
|
-
Quarter: ${a.quarter}`:""}`,x:c%4*300,y:Math.floor(c/4)*200,width:260,height:120,color:s[a.status]||"0"})),o=[];for(let a of e)for(let c of a.dependencies||[])e.some(u=>u.id===c)&&o.push({id:`edge_${a.id}_${c}`,fromNode:c,toNode:a.id,label:"depends on"});let i=JSON.stringify({nodes:n,edges:o},null,2);await st.writeFile(q.join(t,"roadmap.canvas"),i,"utf-8")}async exportDaily(e,t){let s=await L.read(e),n=await ce.read(e),o=new Date().toISOString().split("T")[0],i=q.join(t,"daily"),a={prjct_type:"daily",date:o,has_active_task:!!s.currentTask,queue_depth:n.tasks.filter(
|
|
1366
|
-
**${
|
|
1367
|
-
`+(
|
|
1368
|
-
`:"")+(
|
|
1369
|
-
No active task.`);let u=n.tasks.filter(
|
|
1370
|
-
${
|
|
1365
|
+
Quarter: ${a.quarter}`:""}`,x:c%4*300,y:Math.floor(c/4)*200,width:260,height:120,color:s[a.status]||"0"})),o=[];for(let a of e)for(let c of a.dependencies||[])e.some(u=>u.id===c)&&o.push({id:`edge_${a.id}_${c}`,fromNode:c,toNode:a.id,label:"depends on"});let i=JSON.stringify({nodes:n,edges:o},null,2);await st.writeFile(q.join(t,"roadmap.canvas"),i,"utf-8")}async exportDaily(e,t){let s=await L.read(e),n=await ce.read(e),o=new Date().toISOString().split("T")[0],i=q.join(t,"daily"),a={prjct_type:"daily",date:o,has_active_task:!!s.currentTask,queue_depth:n.tasks.filter(p=>!p.completed).length},c=[];if(s.currentTask){let p=s.currentTask,m=p.subtasks||[],g=m.filter(w=>w.status==="completed").length;c.push(`## Active Task
|
|
1366
|
+
**${p.description}**
|
|
1367
|
+
`+(p.branch?`Branch: \`${p.branch}\`
|
|
1368
|
+
`:"")+(m.length>0?`Progress: ${g}/${m.length}`:""))}else c.push(`## Active Task
|
|
1369
|
+
No active task.`);let u=n.tasks.filter(p=>!p.completed).slice(0,5);if(u.length>0){let p=u.map(m=>[m.priority,m.type,m.description]);c.push(`## Queue (Top ${u.length})
|
|
1370
|
+
${tn(["Priority","Type","Description"],p)}`)}let d=Ls(a,`Daily: ${o}`,...c);return await st.writeFile(q.join(i,`${o}.md`),d,"utf-8"),!0}async exportIndex(e,t){let s=`# ${e}
|
|
1371
1371
|
|
|
1372
1372
|
## Board
|
|
1373
1373
|
\`\`\`dataview
|
|
@@ -1400,21 +1400,21 @@ FROM "${q.basename(q.dirname(t))}/${q.basename(t)}/architecture" OR "${q.basenam
|
|
|
1400
1400
|
SORT file.mtime DESC
|
|
1401
1401
|
LIMIT 10
|
|
1402
1402
|
\`\`\`
|
|
1403
|
-
`;await st.writeFile(q.join(t,"_index.md"),s,"utf-8")}static ALLOWED_EXTENSIONS=new Set([".md",".markdown",".txt",".canvas"]);static BLOCKED_DIRS=new Set([".obsidian",".git",".trash","node_modules"]);validatePath(e,t){let s=q.resolve(e,t);if(!s.startsWith(q.resolve(e)))throw new Error(`Path traversal blocked: ${t}`);let o=q.relative(e,s).split(q.sep);for(let i of o)if(r.BLOCKED_DIRS.has(i))throw new Error(`Blocked directory: ${i}`);return s}validateFileExtension(e){let t=q.extname(e).toLowerCase();if(t&&!r.ALLOWED_EXTENSIONS.has(t))throw new Error(`Blocked file extension: ${t}. Allowed: ${[...r.ALLOWED_EXTENSIONS].join(", ")}`)}async readNote(e,t,s){let n=this.getProjectPath(e,t),o=this.validatePath(n,s);this.validateFileExtension(o);let i=await st.readFile(o,"utf-8"),a=null,c=i,u=i.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);return u&&(a=this.parseYamlFrontmatter(u[1]),c=u[2]),{content:c,frontmatter:a}}async writeNote(e,t,s,n,o){let i=this.getProjectPath(e,t),a=this.validatePath(i,s);this.validateFileExtension(a),await st.mkdir(q.dirname(a),{recursive:!0});let c=n;if(o&&Object.keys(o).length>0){let{mdFrontmatter:u}=await Promise.resolve().then(()=>(
|
|
1403
|
+
`;await st.writeFile(q.join(t,"_index.md"),s,"utf-8")}static ALLOWED_EXTENSIONS=new Set([".md",".markdown",".txt",".canvas"]);static BLOCKED_DIRS=new Set([".obsidian",".git",".trash","node_modules"]);validatePath(e,t){let s=q.resolve(e,t);if(!s.startsWith(q.resolve(e)))throw new Error(`Path traversal blocked: ${t}`);let o=q.relative(e,s).split(q.sep);for(let i of o)if(r.BLOCKED_DIRS.has(i))throw new Error(`Blocked directory: ${i}`);return s}validateFileExtension(e){let t=q.extname(e).toLowerCase();if(t&&!r.ALLOWED_EXTENSIONS.has(t))throw new Error(`Blocked file extension: ${t}. Allowed: ${[...r.ALLOWED_EXTENSIONS].join(", ")}`)}async readNote(e,t,s){let n=this.getProjectPath(e,t),o=this.validatePath(n,s);this.validateFileExtension(o);let i=await st.readFile(o,"utf-8"),a=null,c=i,u=i.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);return u&&(a=this.parseYamlFrontmatter(u[1]),c=u[2]),{content:c,frontmatter:a}}async writeNote(e,t,s,n,o){let i=this.getProjectPath(e,t),a=this.validatePath(i,s);this.validateFileExtension(a),await st.mkdir(q.dirname(a),{recursive:!0});let c=n;if(o&&Object.keys(o).length>0){let{mdFrontmatter:u}=await Promise.resolve().then(()=>(hs(),Yg));c=`${u(o)}
|
|
1404
1404
|
|
|
1405
|
-
${n}`}await st.writeFile(a,c,"utf-8")}async searchNotes(e,t,s,n={}){let o=this.getProjectPath(e,t),i=n.folder?this.validatePath(o,n.folder):o,a=n.limit||20,c=[],u=s.toLowerCase(),d=u.split(/\s+/).filter(
|
|
1406
|
-
`)){let n=s.match(/^(\w[\w-]*)\s*:\s*(.*)$/);if(n){let[,o,i]=n;i.startsWith("[")&&i.endsWith("]")?t[o]=i.slice(1,-1).split(",").map(a=>a.trim()).filter(Boolean):i==="true"?t[o]=!0:i==="false"?t[o]=!1:!Number.isNaN(Number(i))&&i.trim()!==""?t[o]=Number(i):t[o]=i}}return t}async walkDir(e){let t=[];try{let s=await st.readdir(e,{withFileTypes:!0});for(let n of s){if(r.BLOCKED_DIRS.has(n.name)||n.name.startsWith("."))continue;let o=q.join(e,n.name);n.isDirectory()?t.push(...await this.walkDir(o)):t.push(o)}}catch{}return t}},
|
|
1405
|
+
${n}`}await st.writeFile(a,c,"utf-8")}async searchNotes(e,t,s,n={}){let o=this.getProjectPath(e,t),i=n.folder?this.validatePath(o,n.folder):o,a=n.limit||20,c=[],u=s.toLowerCase(),d=u.split(/\s+/).filter(m=>m.length>1),p=await this.walkDir(i);for(let m of p)if(r.ALLOWED_EXTENSIONS.has(q.extname(m).toLowerCase()))try{let g=await st.readFile(m,"utf-8"),w=g.toLowerCase(),b=q.relative(o,m),h=0;for(let x of d){let T=0,I=0;for(;(T=w.indexOf(x,T))!==-1;)I++,T+=x.length;I>0&&(h+=Math.log(1+I)),b.toLowerCase().includes(x)&&(h+=2)}if(h>0){let x=g.match(/^#\s+(.+)$/m),T=x?x[1]:q.basename(m,q.extname(m)),I=w.indexOf(u.split(/\s+/)[0]),M=Math.max(0,I-50),y=Math.min(g.length,I+150),j=(M>0?"...":"")+g.slice(M,y).replace(/\n/g," ").trim()+(y<g.length?"...":"");c.push({path:b,title:T,excerpt:j,score:h})}}catch{}return c.sort((m,g)=>g.score-m.score),c.slice(0,a)}async listNotes(e,t,s){let n=this.getProjectPath(e,t),o=s?this.validatePath(n,s):n,i=await st.readdir(o,{withFileTypes:!0}),a=[];for(let c of i){if(r.BLOCKED_DIRS.has(c.name)||c.name.startsWith("."))continue;let u=s?`${s}/${c.name}`:c.name;if(c.isDirectory())a.push({path:u,name:c.name,isDir:!0});else if(r.ALLOWED_EXTENSIONS.has(q.extname(c.name).toLowerCase())){let d=await st.stat(q.join(o,c.name));a.push({path:u,name:c.name,isDir:!1,size:d.size})}}return a}async getVaultStats(e,t){let s=this.getProjectPath(e,t),n={},o=0,i=0,a=await this.walkDir(s);for(let c of a){if(!r.ALLOWED_EXTENSIONS.has(q.extname(c).toLowerCase()))continue;let u=q.relative(s,c),d=q.dirname(u).split(q.sep)[0]||".";n[d]=(n[d]||0)+1,o++;try{let p=await st.stat(c);i+=p.size}catch{}}return{totalNotes:o,folders:n,totalSize:i}}parseYamlFrontmatter(e){let t={};for(let s of e.split(`
|
|
1406
|
+
`)){let n=s.match(/^(\w[\w-]*)\s*:\s*(.*)$/);if(n){let[,o,i]=n;i.startsWith("[")&&i.endsWith("]")?t[o]=i.slice(1,-1).split(",").map(a=>a.trim()).filter(Boolean):i==="true"?t[o]=!0:i==="false"?t[o]=!1:!Number.isNaN(Number(i))&&i.trim()!==""?t[o]=Number(i):t[o]=i}}return t}async walkDir(e){let t=[];try{let s=await st.readdir(e,{withFileTypes:!0});for(let n of s){if(r.BLOCKED_DIRS.has(n.name)||n.name.startsWith("."))continue;let o=q.join(e,n.name);n.isDirectory()?t.push(...await this.walkDir(o)):t.push(o)}}catch{}return t}},xr=new ed});import jr from"node:path";var Rr,td=S(()=>{"use strict";Te();ve();Uh();B();hs();Fe();Mt();Rr=class extends Ce{static{l(this,"ObsidianCommands")}async obsidian(e=null,t=process.cwd()){let s=(e||"status").split(" ").filter(Boolean),n=s[0],o=s.includes("--md"),i,a=s.indexOf("--vault-path");a!==-1&&s[a+1]&&(i=s[a+1]);let c=!s.includes("--no-auto-export"),u={md:o,vaultPath:i,autoExport:c};switch(n){case"setup":return this.setup(t,u);case"export":return this.export(t,u);case"status":return this.status(t,u);default:return{success:!1,message:u.md?U(os("error",`Unknown subcommand: ${n}. Use: setup, export, status`)):`Unknown subcommand: ${n}`}}}async setup(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=t.vaultPath;if(!o){let g="Vault path required. Usage: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(g),{success:!1,message:t.md?U(os("error",g)):""}}if(!await C(o)){let g=`Vault path does not exist: ${o}`;return t.md||f.fail(g),{success:!1,message:t.md?U(os("error",g)):""}}let i=jr.basename(e),a={vaultPath:o,projectFolder:i,autoExport:t.autoExport??!0},c=A.getGlobalProjectPath(n),u=jr.join(c,"project.json"),d=await Ae(u)||{},p=d.integrations||{};p.obsidian=a,d.integrations=p,await de(u,d);let m=xr.getProjectPath(a,i);return await xr.ensureStructure(m),await xr.writeLink(m,n,e),t.md||(f.done("Obsidian vault linked"),f.info(`Vault: ${o}`),f.info(`Project folder: projects/${i}/`),f.info("Run `prjct obsidian export` to populate the vault")),{success:!0,message:t.md?U(fe("Obsidian Linked"),Ye({Vault:o,"Project folder":`projects/${i}/`,"Auto-export":a.autoExport?"enabled":"disabled"}),le([{label:"Export project data to vault",command:"prjct obsidian export"},{label:"Check integration status",command:"prjct obsidian status"}])):""}}async export(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o){let c="Obsidian not configured. Run: prjct obsidian setup --vault-path /path/to/vault";return t.md||f.fail(c),{success:!1,message:t.md?U(os("error",c)):""}}let i=jr.basename(e);t.md||f.info("Exporting to Obsidian vault...");let a=await xr.exportAll(n,i,o);if(!t.md)if(a.success)f.done("Export complete"),f.info(`Board: ${a.exported.board} tasks`),f.info(`Queue: ${a.exported.queue} items`),f.info(`Shipped: ${a.exported.shipped} items`),f.info(`Roadmap: ${a.exported.roadmap} features`),f.info(`Daily: ${a.exported.daily?"generated":"skipped"}`);else{f.warn("Export completed with errors");for(let c of a.errors)f.fail(c)}return{success:a.success,message:t.md?U(fe("Obsidian Export",a.success?"All sections exported":"Completed with errors"),Ye({Board:`${a.exported.board} tasks`,Queue:`${a.exported.queue} items`,Shipped:`${a.exported.shipped} items`,Roadmap:`${a.exported.roadmap} features`,Daily:a.exported.daily?"generated":"skipped"}),a.errors.length>0?`### Errors
|
|
1407
1407
|
${a.errors.map(c=>`- ${c}`).join(`
|
|
1408
|
-
`)}`:null,le([{label:"Open vault in Obsidian",command:`open ${o.vaultPath}`},{label:"Re-export",command:"prjct obsidian export"}])):""}}async status(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o)return t.md||f.info("Obsidian integration is not enabled. All data is stored in the local database by default."),{success:!0,message:t.md?U(os("info","Obsidian integration is not enabled. All data is stored in the local database by default."),le([{label:"Enable Obsidian (optional)",command:"prjct obsidian setup --vault-path /path/to/vault"}])):""};let i=
|
|
1408
|
+
`)}`:null,le([{label:"Open vault in Obsidian",command:`open ${o.vaultPath}`},{label:"Re-export",command:"prjct obsidian export"}])):""}}async status(e,t){let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,message:"No project ID found"};let o=await this.getObsidianConfig(n);if(!o)return t.md||f.info("Obsidian integration is not enabled. All data is stored in the local database by default."),{success:!0,message:t.md?U(os("info","Obsidian integration is not enabled. All data is stored in the local database by default."),le([{label:"Enable Obsidian (optional)",command:"prjct obsidian setup --vault-path /path/to/vault"}])):""};let i=jr.basename(e),a=xr.getProjectPath(o,i),c=await C(jr.join(a,".prjct-link.yml"));return t.md||(f.done("Obsidian configured"),f.info(`Vault: ${o.vaultPath}`),f.info(`Project folder: projects/${o.projectFolder||i}/`),f.info(`Auto-export: ${o.autoExport?"enabled":"disabled"}`),f.info(`Link file: ${c?"present":"missing"}`)),{success:!0,message:t.md?U(fe("Obsidian Status"),Ye({Vault:o.vaultPath,"Project folder":`projects/${o.projectFolder||i}/`,"Auto-export":o.autoExport?"enabled":"disabled","Link file":c?"present":"missing"}),le([{label:"Export data to vault",command:"prjct obsidian export"}])):""}}async getObsidianConfig(e){let t=A.getGlobalProjectPath(e),s=jr.join(t,"project.json"),n=await Ae(s);if(!n)return null;let o=n.integrations;return o?.obsidian?o.obsidian:null}}});var sd,pE,Ar,Hh=S(()=>{"use strict";Vt();ai();sd=class{static{l(this,"TaskDispatcher")}async planFromQueue(e,t={}){let s=t.maxAgents||10,n=await ce.getActiveTasks(e),o=t.includeBacklog?await ce.getBacklog(e):[],i=[...n,...o],c=ii(i).filter(u=>!u.completed).slice(0,s).map(u=>({id:u.id,title:u.description,priority:u.priority,source:"queue",queueTaskId:u.id}));return this.buildPlan(c,"queue",t)}planFromDescriptions(e,t={}){let s=t.maxAgents||e.length,n=e.slice(0,s).map((o,i)=>({id:`manual-${i+1}`,title:o,source:"manual"}));return this.buildPlan(n,"manual",t)}generateFetchInstructions(e,t={}){let s=t.maxResults||10;if(e==="linear"){let i=['assignee: "me"','state: { type: { eq: "unstarted" } }'];if(t.labels?.length&&i.push(`labels: { name: { in: [${t.labels.map(a=>`"${a}"`).join(", ")}] } }`),t.priority){let c={urgent:1,high:2,medium:3,low:4}[t.priority];c&&i.push(`priority: { lte: ${c} }`)}return["Use the Linear MCP tool `list_issues` with these parameters:",`- filter: { ${i.join(", ")} }`,`- first: ${s}`,'- orderBy: "priority"',"","Return the results as a JSON array with fields: id, identifier, title, priority, estimate.","I will use this to create parallel worktrees for each ticket."].join(`
|
|
1409
1409
|
`)}let n=["assignee = currentUser()",'statusCategory = "To Do"'];return t.sprint?n.push("sprint in openSprints()"):t.backlog&&n.push("sprint is EMPTY"),t.labels?.length&&n.push(`labels in (${t.labels.join(", ")})`),t.priority&&n.push(`priority = "${t.priority}"`),["Use the Jira MCP tool `searchJiraIssuesUsingJql` with:",`- jql: "${`${n.join(" AND ")} ORDER BY priority DESC`}"`,`- maxResults: ${s}`,"","Return the results as a JSON array with fields: key, summary, priority, storyPoints.","I will use this to create parallel worktrees for each ticket."].join(`
|
|
1410
|
-
`)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,u)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,
|
|
1411
|
-
`)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},
|
|
1412
|
-
Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(
|
|
1413
|
-
Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await L.getActiveTasks(e),n=await Yt.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Yt.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},
|
|
1410
|
+
`)}planFromTracker(e,t,s={}){return this.buildPlan(e,t,s)}buildPlan(e,t,s={}){let n=s.maxAgents||e.length,o=s.strategy||"priority-first",i=[...e];if(o==="priority-first"){let a={urgent:0,critical:0,highest:0,high:1,medium:2,normal:2,low:3,none:4};i.sort((c,u)=>{let d=a[c.priority?.toLowerCase()||"none"]??4,p=a[u.priority?.toLowerCase()||"none"]??4;return d-p})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
|
|
1411
|
+
`)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},pE=new sd,Ar=pE});var Ir,Un,wH,nd=S(()=>{"use strict";Te();Ut();Hh();oo();vt();W();Fe();Mt();Ir=null,Un=class extends Ce{static{l(this,"ParallelCommands")}async parallel(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);switch(e){case"status":return this.status(o,t);case"plan":return this.plan(o,t,s);case"dispatch":return this.dispatch(o,t);case"spawn":return{success:!1,error:"Usage: prjct parallel spawn <task-description>"};case"join":return this.join(o,t);case"cleanup":return this.cleanup(t);default:return this.status(o,t)}}catch(n){return{success:!1,error:k(n)}}}async spawn(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t),i=this.slugify(e),a=await Yt.create(t,i,{branch:s.branch});await Yt.setup(a.path,t);let c=Z();return await L.startTaskInWorkspace(o,{id:Z(),description:e,sessionId:Z(),workspaceId:c,worktreePath:a.path},c),f.success(`Worktree: ${a.path}`),f.info(`Branch: ${a.branch}`),f.info(`Task: ${e}`),{success:!0,message:`Worktree created at ${a.path}`}}catch(n){return{success:!1,error:k(n)}}}async batchSpawn(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t),o=[];for(let i of e){let a=this.slugify(i);try{let c=await Yt.create(t,a);await Yt.setup(c.path,t);let u=Z();await L.startTaskInWorkspace(n,{id:Z(),description:i,sessionId:Z(),workspaceId:u,worktreePath:c.path},u),o.push(` ${c.branch} \u2192 ${i}`)}catch(c){o.push(` FAILED: ${i} \u2014 ${k(c)}`)}}f.success(`Spawned ${o.length} agent sessions:`);for(let i of o)f.info(i);return{success:!0,message:`Spawned ${o.length} sessions`}}catch(s){return{success:!1,error:k(s)}}}async plan(e,t,s){let n=s.max||10,o=s.strategy||"priority-first";if(s.fromLinear){let a=Ar.generateFetchInstructions("linear",{maxResults:n});return f.info("Linear MCP instructions for orchestrating agent:"),f.info(""),f.info(a),f.info(""),f.info("After fetching, pass the results to `prjct parallel dispatch`."),{success:!0,message:a}}if(s.fromJira){let a=Ar.generateFetchInstructions("jira",{sprint:!0,maxResults:n});return f.info("Jira MCP instructions for orchestrating agent:"),f.info(""),f.info(a),{success:!0,message:a}}let i=await Ar.planFromQueue(e,{maxAgents:n,strategy:o,includeBacklog:s.includeBacklog});return i.items.length===0?(f.warn("No tasks in queue. Add tasks with `prjct bug` or `prjct idea`, then retry."),f.info("Or use `prjct parallel spawn <task>` to create individual sessions."),f.info('Or use `prjct parallel batch "task1" "task2" "task3"` for inline dispatch.'),{success:!0,message:"Empty queue"}):(Ir=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info(Ar.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!Ir||Ir.items.length===0)return f.warn("No dispatch plan. Run `prjct parallel plan` first, or use `prjct parallel spawn`."),{success:!1,error:"No plan"};let s=[],n=0;for(let o of Ir.items){let i=Ar.slugify(o);try{let a=await Yt.create(t,i);await Yt.setup(a.path,t);let c=Z();await L.startTaskInWorkspace(e,{id:Z(),description:o.title,sessionId:Z(),workspaceId:c,worktreePath:a.path,linearId:o.linearId,jiraId:o.jiraId,dispatchedFrom:Ir.source},c),s.push(` ${a.branch} \u2192 ${o.title.slice(0,60)}`),n++}catch(a){s.push(` FAILED: ${o.title.slice(0,40)} \u2014 ${k(a)}`)}}Ir=null,f.success(`Dispatched ${n}/${s.length} agent sessions:`);for(let o of s)f.info(o);return f.info(""),f.info("Start Claude Code / AI agent sessions in each worktree to begin work."),f.info("Use `prjct parallel status` to monitor progress."),{success:!0,message:`Dispatched ${n} sessions`}}async status(e,t){let[s,n]=await Promise.all([L.getActiveTasks(e),Yt.list(t)]),o=await L.getCurrentTask(e);if(o&&f.info(`Main worktree: ${o.description}`),s.length>0){f.info(`
|
|
1412
|
+
Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(m=>m.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",p=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${u} | ${a.description}${p}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
|
|
1413
|
+
Worktrees: ${n.length} total (${i} agent)`),{success:!0}}async join(e,t){let s=await L.getActiveTasks(e),n=await Yt.list(t),o=new Set(s.map(a=>a.worktreePath).filter(Boolean)),i=n.filter(a=>!a.isMain&&!o.has(a.path));if(i.length===0)return f.info(`All ${s.length} sessions still active. Nothing to join yet.`),{success:!0};f.success(`${i.length} completed worktree(s) ready to join:`);for(let a of i)f.info(` ${a.branch} (${a.slug})`);return f.info(""),f.info("Create PRs for each branch, then `prjct parallel cleanup` to remove worktrees."),{success:!0}}async cleanup(e){let t=await Yt.clean(e);return f.success(`Cleaned up ${t.length} stale worktree reference(s).`),{success:!0}}slugify(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},wH=new Un});import We from"chalk";function Aa(r,e,t){return t==="below"?r<=e?We.green("\u2713"):We.yellow("\u26A0"):r>=e?We.green("\u2713"):We.yellow("\u26A0")}var an,Dr,rd=S(()=>{"use strict";Te();Ti();W();Fe();Mt();an={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(Aa,"statusIcon");Dr=class extends Ce{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await xn.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1414
1414
|
${We.dim("No performance data yet.")}`),console.log(`${We.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1415
1415
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1416
|
-
${We.cyan("Performance Report")} ${We.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=
|
|
1417
|
-
${We.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${We.bold(`${u.avg}ms`)} ${We.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}}});import
|
|
1416
|
+
${We.cyan("Performance Report")} ${We.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=Aa(i.startup.avg,an.startup.max,"below");console.log(` Startup: avg ${We.bold(`${i.startup.avg}ms`)} ${We.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${We.dim(`target: <${an.startup.max}ms`)}`)}if(i.memory){let c=Aa(i.memory.peakHeapMB,an.heapMB.max,"below");console.log(` Memory: avg ${We.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${We.dim(`target: <${an.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Aa(i.contextCorrectness.rate,an.contextRate.min,"above");console.log(` Context: ${We.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${We.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${We.dim(`target: ${an.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Aa(i.subtaskHandoff.rate,an.handoffRate.min,"above");console.log(` Handoff: ${We.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${We.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${We.dim(`target: ${an.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1417
|
+
${We.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${We.bold(`${u.avg}ms`)} ${We.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}}});import gE from"node:fs/promises";import fE from"node:path";var Gh,Wh,od,hE,Dt,Ia=S(()=>{"use strict";ve();B();Gh="https://api.prjct.app",Wh={apiKey:null,apiUrl:Gh,userId:null,email:null,lastAuth:null},od=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=A.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Ae(this.configPath);return this.cachedConfig=e??{...Wh},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await rt(fE.dirname(this.configPath)),await de(this.configPath,s),await gE.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||Gh}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Wh},await de(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},hE=new od,Dt=hE});function wE(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function kE(r){let e={};for(let[t,s]of Object.entries(r))e[wE(t)]=s;return e}function SE(r,e){let[t,s]=e.type.split("."),n=yE[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=kE(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}function qh(r,e){return e.map(t=>SE(r,t)).filter(t=>t!==null)}var yE,Bh=S(()=>{"use strict";yE={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};l(wE,"camelToSnake");l(kE,"snakeCaseKeys");l(SE,"mapCliEventToWebFormat");l(qh,"mapCliEventsToWebFormat")});var id,$r,ad=S(()=>{"use strict";Pn();Ia();Bh();id=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=qh(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,since:t})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async getStatus(e){let{apiUrl:t,apiKey:s}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),nr("API_REQUEST"));try{let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":n},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Dt.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Dt.getApiUrl(),Dt.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),nr("API_REQUEST"));try{let i=await fetch(e,{...t,signal:n.signal});if(clearTimeout(o),i.status>=500&&s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${nr("API_REQUEST")}ms)`);if(s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},$r=new id});var cd,bE,Vh,Jh=S(()=>{"use strict";Cc();Js();Vt();zs();vt();Ia();ad();cd=class{static{l(this,"SyncManager")}async hasAuth(){return await Dt.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await $r.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},s=await this.push(e);s.success&&!s.skipped&&(t.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let n=await this.pull(e);return n.success&&!n.skipped&&(t.pulled={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()}),(!s.success||!n.success)&&(t.success=!1,t.error=s.error||n.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await Vs.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),n=s?[s,...t]:t,o=await $r.pushEvents(e,n);if(o.success)return await Vs.clearPending(e),await Vs.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${c}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let s=(await Vs.getLastSync(e))?.timestamp,n=await $r.pullEvents(e,s);if(n.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:n.syncedAt};let o=await this.applyPulledEvents(e,n.events);return await Vs.updateLastSync(e),{success:!0,skipped:!1,count:n.events.length,applied:o,syncedAt:n.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let s=0;for(let n of t)try{await this.applyEvent(e,n),s++}catch(o){let i=n.entity_type||n.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,n,o;if(t.entity_type)s=t.entity_type,n=t.event_type,o=t.data||{};else{let[i,a]=(t.type||"").split(".");s={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"}[i]||i,n=a==="deleted"?"delete":"upsert",o=t.data||{}}if(n!=="delete")switch(s){case"tasks":await this.applyTaskUpsert(e,o);break;case"ideas":await this.applyIdeaUpsert(e,o);break;case"shipped_items":await this.applyShippedUpsert(e,o);break;case"queue_tasks":await this.applyQueueUpsert(e,o);break;case"roadmap_features":break;case"projects":break}}async applyTaskUpsert(e,t){let s=t.status||"";s==="active"||t.started_at||t.startedAt?await L.update(e,n=>!n.currentTask||t.id!==n.currentTask.id?{...n,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:n):s==="completed"?await L.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await ce.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await $e.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await $e.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await it.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await ce.addTask(e,{description:t.description||"",priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"})}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},bE=new cd,Vh=bE});import vE from"node:fs/promises";import TE from"node:http";import EE from"node:path";import ae from"chalk";var Mr,ld=S(()=>{"use strict";Os();Te();ve();pr();Ia();ad();Jh();W();Je();B();jo();Fe();ut();Mt();Mr=class extends Ce{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await Dt.write({apiKey:o,...i?{apiUrl:i}:{}}),await $r.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ae.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
|
|
1418
1418
|
- **Status**: Connected
|
|
1419
1419
|
- **Key**: \`${o.substring(0,12)}...\`
|
|
1420
1420
|
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(ae.dim(`Key: ${o.substring(0,12)}...`)),f.info(ae.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
|
|
@@ -1431,13 +1431,13 @@ Key: ${t.apiKeyPrefix}`),f.info(`Run ${ae.cyan("prjct logout")} first to re-a
|
|
|
1431
1431
|
- **Email**: ${t.email}
|
|
1432
1432
|
- **Key**: \`${t.apiKeyPrefix}\`
|
|
1433
1433
|
|
|
1434
|
-
Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=
|
|
1434
|
+
Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=TE.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),p=c.searchParams.get("user_id");if(u){await Dt.saveAuth(u,p||"",d||"");let m=`${s}/api`;await Dt.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
|
|
1435
1435
|
Key: ${u.substring(0,12)}...
|
|
1436
1436
|
Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
|
|
1437
1437
|
- **Email**: ${d}
|
|
1438
1438
|
- **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
|
|
1439
1439
|
Authentication failed: no API key received`:""}));return}a.writeHead(404),a.end("Not found")});o.listen(0,"127.0.0.1",async()=>{let i=o.address();if(!i||typeof i=="string"){o.close(),e.md||f.fail("Failed to start callback server"),n({success:!1,message:e.md?`## Error
|
|
1440
|
-
Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(ae.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await F(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${ae.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},
|
|
1440
|
+
Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(ae.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await F(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${ae.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},5*60*1e3)})}async logout(){return(await Dt.getStatus()).authenticated?(await Dt.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await $.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await Vh.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
|
|
1441
1441
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
1442
1442
|
<title>prjct CLI Connected</title>
|
|
1443
1443
|
<style>
|
|
@@ -1492,7 +1492,7 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
|
|
|
1492
1492
|
<h1>Authentication Failed</h1>
|
|
1493
1493
|
<div class="msg">${e}</div>
|
|
1494
1494
|
<p class="hint">Return to your terminal and try again.</p>
|
|
1495
|
-
</div></body></html>`}async start(){let e=await Ue.checkInstallation(),t=(lt(),
|
|
1495
|
+
</div></body></html>`}async start(){let e=await Ue.checkInstallation(),t=(lt(),bt(Nt)),s=await t.detectCodex(),n=e.providerDetected,o=n?await t.getActiveProvider():null,i=n?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
|
|
1496
1496
|
`),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1497
1497
|
|
|
1498
1498
|
Please install one first:
|
|
@@ -1501,22 +1501,22 @@ Please install one first:
|
|
|
1501
1501
|
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Ue.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
|
|
1502
1502
|
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1503
1503
|
${A.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
1504
|
-
\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(()=>(
|
|
1504
|
+
\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(()=>(fr(),qi));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): ${k(a)}`)}return await this.setupMcpServers(),console.log(`
|
|
1505
1505
|
\u{1F389} Setup complete!`),console.log(`
|
|
1506
1506
|
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...
|
|
1507
1507
|
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ue.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ue.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1508
1508
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1509
1509
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
|
|
1510
|
-
\u{1F4DD} Installing global configuration...`);let s=await Ue.installGlobalConfig(),n=s.path?A.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${n}`):s.action==="updated"?console.log(`\u2705 Updated ${n}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${n}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(lt(),
|
|
1511
|
-
\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(()=>(
|
|
1510
|
+
\u{1F4DD} Installing global configuration...`);let s=await Ue.installGlobalConfig(),n=s.path?A.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${n}`):s.action==="updated"?console.log(`\u2705 Updated ${n}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${n}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(lt(),bt(Nt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
|
|
1511
|
+
\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(()=>(fr(),qi));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): ${k(c)}`)}return await this.setupMcpServers(),console.log(`
|
|
1512
1512
|
\u{1F389} Setup complete!
|
|
1513
1513
|
`),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
|
|
1514
|
-
\u{1F50C} Configuring MCP servers...`);try{await ss.install();let e=await ss.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: ${k(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=
|
|
1514
|
+
\u{1F50C} Configuring MCP servers...`);try{await ss.install();let e=await ss.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: ${k(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=ws();await sn("linear",e)?console.log("\u2705 Linear MCP already configured"):(await uu("linear",ra.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: ${k(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=ws();await sn("jira",e)?console.log("\u2705 Jira MCP already configured"):(await uu("jira",ra.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: ${k(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),s=EE.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
|
|
1515
1515
|
# prjct Status Line for Claude Code
|
|
1516
1516
|
# Shows version update notifications and current task
|
|
1517
1517
|
|
|
1518
1518
|
# Current CLI version (embedded at install time)
|
|
1519
|
-
CLI_VERSION="${
|
|
1519
|
+
CLI_VERSION="${ke}"
|
|
1520
1520
|
|
|
1521
1521
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1522
1522
|
read -r json
|
|
@@ -1567,14 +1567,14 @@ fi
|
|
|
1567
1567
|
|
|
1568
1568
|
# Default: show prjct branding
|
|
1569
1569
|
echo "\u26A1 prjct"
|
|
1570
|
-
`;await
|
|
1570
|
+
`;await vE.writeFile(s,n,{mode:493});let o={};if(await C(t))try{o=await Ae(t)??{}}catch{}return o.statusLine={type:"command",command:s},await de(t,o),{success:!0}}catch(e){return{success:!1,error:k(e)}}}showAsciiArt(){console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ae.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ae.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ae.bold.cyan("prjct")}${ae.magenta("/")}${ae.green("cli")} ${ae.dim.white(`v${ke} installed`)}`),console.log(""),console.log(` ${ae.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ae.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ae.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ae.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ae.bold.cyan("\u{1F680} Quick Start")),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.bold("1.")} Initialize your project:`),console.log(` ${ae.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ae.bold("2.")} Start your first task:`),console.log(` ${ae.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ae.bold("3.")} Ship & celebrate:`),console.log(` ${ae.green('prjct ship "user login"')}`),console.log(""),console.log(ae.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ae.dim("Documentation:")} ${ae.cyan("https://prjct.app")}`),console.log(` ${ae.dim("Report issues:")} ${ae.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ae.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import zh from"node:path";var CE,PE,Da,Xh=S(()=>{"use strict";K();B();CE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],PE=`# Changelog
|
|
1571
1571
|
|
|
1572
1572
|
All notable changes to this project will be documented in this file.
|
|
1573
1573
|
|
|
1574
1574
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
1575
1575
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
1576
|
-
`,
|
|
1577
|
-
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await _e(t.filePath),n=e.date||
|
|
1576
|
+
`,Da=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of CE){let n=zh.join(this.projectPath,s);if(await C(n)){let o=await _e(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=zh.join(this.projectPath,e);return await Pt(t,`${PE}
|
|
1577
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await _e(t.filePath),n=e.date||um(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await Pt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,s){let n=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+n}
|
|
1578
1578
|
${a}`}return`${e.trimEnd()}
|
|
1579
1579
|
|
|
1580
1580
|
${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
|
|
@@ -1584,31 +1584,31 @@ ${a}`}return`${n}
|
|
|
1584
1584
|
|
|
1585
1585
|
${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push("### Added"),s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1586
1586
|
`)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1587
|
-
`)}}});import
|
|
1588
|
-
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(Kh(n))return{current:n,next:
|
|
1589
|
-
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await
|
|
1590
|
-
`);break}}async writeJsonVersion(e,t){let s=await Ae(e,{});s&&(s.version=t,await de(e,s))}async writeTomlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Pt(e,n)}async writeXmlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Pt(e,n)}};l(Kh,"isSemver");l(
|
|
1591
|
-
${
|
|
1587
|
+
`)}}});import Or from"node:path";function Kh(r){return/^\d+\.\d+\.\d+/.test(r)}function _r(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}function xE(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function jE(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}function RE(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var $a,Yh=S(()=>{"use strict";Je();B();$a=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=Or.join(this.projectPath,"package.json"),t=await Ae(e,null);return t?.version?{current:t.version,next:_r(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Or.join(this.projectPath,"Cargo.toml"),t=await _e(e,"");if(!t)return null;let s=xE(t);return s?{current:s,next:_r(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Or.join(this.projectPath,"pyproject.toml"),t=await _e(e,"");if(!t)return null;let s=jE(t);return s?{current:s,next:_r(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Cs(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Or.join(this.projectPath,e[0]),s=await _e(t,"");if(!s)return null;let n=RE(s);return n?{current:n,next:_r(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Or.join(this.projectPath,e),s=await _e(t,"");if(!s)return null;let n=s.trim();return Kh(n)?{current:n,next:_r(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await F("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
1588
|
+
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(Kh(n))return{current:n,next:_r(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Or.join(this.projectPath,"VERSION");return await Pt(e,`0.1.0
|
|
1589
|
+
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await fn("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Pt(e.file,`${e.next}
|
|
1590
|
+
`);break}}async writeJsonVersion(e,t){let s=await Ae(e,{});s&&(s.version=t,await de(e,s))}async writeTomlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Pt(e,n)}async writeXmlVersion(e,t){let s=await _e(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Pt(e,n)}};l(Kh,"isSemver");l(_r,"bumpPatch");l(xE,"parseTomlVersion");l(jE,"parsePyprojectVersion");l(RE,"parseCsprojVersion")});import Gt from"chalk";async function ls(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=je.getRulesForCommand(r,e).filter(p=>p.position===t),a=i.filter(p=>p.type==="gate");for(let p of a){let m=p.description||p.action;console.log(`
|
|
1591
|
+
${Gt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let w=Date.now()-g,b=w>1e3?`${(w/1e3).toFixed(1)}s`:`${w}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`gate passed (${b})`)}`)}catch(g){return console.log(`${Gt.red("\u2717")} gate failed: ${m}`),n.gatesFailed.push(m),n.success=!1,n.output+=`Gate failed: ${m}
|
|
1592
1592
|
${k(g)}
|
|
1593
|
-
`,n}}let c=i.filter(
|
|
1594
|
-
${
|
|
1595
|
-
${
|
|
1596
|
-
${k(
|
|
1597
|
-
`}}let d=i.filter(
|
|
1598
|
-
${
|
|
1599
|
-
${k(
|
|
1600
|
-
`,n}}return n}var
|
|
1593
|
+
`,n}}let c=i.filter(p=>p.type==="instruction");for(let p of c){let m=p.description||p.action;console.log(`
|
|
1594
|
+
${Gt.dim(`[instruction] ${t}-${e}: ${m}`)}`),n.instructions.push(p.action)}let u=i.filter(p=>p.type==="hook");for(let p of u){console.log(`
|
|
1595
|
+
${Gt.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let m=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`(${w})`)}`)}catch(m){console.log(`${Gt.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),n.hooksFailed.push(p.description||p.action),n.output+=`Hook failed: ${p.action}
|
|
1596
|
+
${k(m)}
|
|
1597
|
+
`}}let d=i.filter(p=>p.type==="step");for(let p of d){console.log(`
|
|
1598
|
+
${Gt.dim(`[step] ${e}: ${p.action}`)}`);try{let m=Date.now();await F(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`step passed (${w})`)}`),n.stepsRun.push(p.description||p.action)}catch(m){return console.log(`${Gt.red("\u2717")} step failed: ${p.action}`),n.gatesFailed.push(p.description||p.action),n.success=!1,n.output+=`Step failed: ${p.action}
|
|
1599
|
+
${k(m)}
|
|
1600
|
+
`,n}}return n}var ud=S(()=>{"use strict";go();W();Je();l(ls,"executeWorkflowRules")});var Nr,dd=S(()=>{"use strict";Ii();Te();Xh();Yi();Yh();zs();vt();W();K();Je();hs();yr();Fe();ud();Mt();Nr=class extends Ce{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await L.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await L.completeTask(o)),i||(i="current work");let c=await ls(o,"ship","before",{projectPath:t,skipRules:s.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};s.md||f.step(1,4,"Bumping version...");let d=await new $a(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new Da(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let m=await this._createShipCommit(i,t),g="skipped";if(m.success){let h=await this._gitPush(t);g=h.success?"pushed":h.message}await it.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:v()}),await Tt.learnDecision(o,"commit_footer","prjct","ship"),await Tt.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let w=await ls(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),b=[...c.instructions,...w.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Ns.sync(t),s.md||f.done("\u2713 AI context updated")}catch(h){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",k(h))}if(s.md){let h=ea("ship",!0),x=U(fe(`Shipped: ${i}`,`Version: ${d}`),te("Results",He([`Version: ${d}`,`Commit: ${m.success?"created":m.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),b.length>0?te("Agent Instructions",He(b)):null,le(h.map(T=>({label:T.desc,command:T.cmd}))));console.log(x)}else f.done(`v${d} shipped`),Wt("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async _createShipCommit(e,t){try{await F("git add .");let s=`feat: ${e}
|
|
1601
1601
|
|
|
1602
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1602
|
+
Generated with [p/](https://www.prjct.app/)`;return await fn("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return O(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await F("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return O(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import{execSync as Fr}from"node:child_process";import md from"node:fs/promises";import Mo from"node:path";import Lr from"chalk";function Qh(){try{return!!Fr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function Zh(){try{let e=Fr("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}}var Ur,pd=S(()=>{"use strict";Os();si();ve();Lu();Ll();W();Fe();ut();Mt();l(Qh,"isHomebrewInstall");l(Zh,"getCurrentVersion");Ur=class extends Ce{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),!s&&o.phase1.success&&this.redirectToInstalledPackage(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await io.updateVersion(ke)}catch{}try{await new ha().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(k(i)),{success:!1,error:k(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=Zh();if(e)return Qh()?(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(Qh()){try{Fr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Fr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Fr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=Zh();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(n){t.success=!1,t.errors.push(k(n))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},s=await this.getAllProjectIds();if(s.length===0)t.details.push("No projects found");else{let n=0,o=0;for(let i of s)if(!e)try{let a=await Bi(i),c=await Vi(i);if(n+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${k(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Ms().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${k(n)}`)}try{let o=await new Ms().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${k(n)}`)}try{await new Ms().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${k(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(lt(),Nt)),o=await n(),i=Mo.join(Bt("node:os").homedir());if(o.gemini.installed){let a=Mo.join(i,".gemini","GEMINI.md");try{let c=await md.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let{getTemplateContent:p}=await Promise.resolve().then(()=>(fs(),ml)),m=p("global/GEMINI.md");if(m?.includes(u)&&m.includes(d)){let g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),w=c.substring(0,c.indexOf(u)),b=c.substring(c.indexOf(d)+d.length),h=w+g+b,x="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",T="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(h.includes(x)&&h.includes(T)){let I=h.substring(0,h.indexOf(x)),M=h.substring(h.indexOf(T)+T.length);h=`${(I+M).replace(/\n{3,}/g,`
|
|
1603
1603
|
|
|
1604
1604
|
`).trim()}
|
|
1605
|
-
`}await
|
|
1606
|
-
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=
|
|
1605
|
+
`}await md.writeFile(a,h,"utf-8"),t.details.push("Gemini global config updated")}}}catch{}}}catch{}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:s,stopDaemon:n,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Ts(),vs));await s()?(await n()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(s){t.success=!1,t.errors.push(k(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?Lr.green("\u2713"):c?Lr.red("\u2717"):Lr.yellow("\u26A0");console.log(` ${u} ${Lr.bold(i)}`);for(let d of a.details)console.log(` ${Lr.dim(d)}`);for(let d of a.errors)console.log(` ${Lr.yellow("\u26A0")} ${d}`)}return console.log(""),t?f.done("Dry run complete \u2014 no changes made"):s?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}formatMdOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[];n.push(t?"# Update (Dry Run)":"# System Update"),n.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${u})`);for(let d of a.details)n.push(`- ${d}`);for(let d of a.errors)n.push(`- WARNING: ${d}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
|
|
1606
|
+
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}redirectToInstalledPackage(){try{let e=Fr("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),t=Mo.join(e,"prjct-cli"),s=Mo.join(t,"package.json"),{existsSync:n,lstatSync:o,readFileSync:i}=Bt("node:fs");if(!n(s)||o(t).isSymbolicLink())return;try{if(JSON.parse(i(s,"utf-8")).name!=="prjct-cli")return}catch{return}mc(t);let{resetBundle:c}=(fs(),bt(ml));c()}catch{}}async getAllProjectIds(){let e=Mo.join(A.getGlobalBasePath(),"projects");try{return(await md.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}}});import Ge from"chalk";var Hr,gd=S(()=>{"use strict";gu();Te();po();gi();W();Fe();Sr();Mt();Hr=class extends Ce{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await $.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await $t.getAll(n);if(i.length===0)return console.log(`
|
|
1607
1607
|
${Ge.dim("No velocity data yet.")}`),console.log(`${Ge.dim("Complete tasks with estimates to build velocity history.")}
|
|
1608
|
-
`),{success:!0,message:"No data"};let a=
|
|
1609
|
-
${Ge.cyan("Sprint Velocity")} ${Ge.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let
|
|
1610
|
-
${Ge.dim("Patterns:")}`);for(let
|
|
1611
|
-
${Ge.dim("Projection:")}`),console.log(` Backlog: ${Ge.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${
|
|
1608
|
+
`),{success:!0,message:"No data"};let a=oa(i,o);await tr.saveMetrics(n,a),console.log(`
|
|
1609
|
+
${Ge.cyan("Sprint Velocity")} ${Ge.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let p of c){let m=p.estimationAccuracy>=80?Ge.green:p.estimationAccuracy>=60?Ge.yellow:Ge.red;console.log(` Sprint ${String(p.sprintNumber).padStart(2)}: ${Ge.bold(`${p.pointsCompleted} pts`)} | ${p.tasksCompleted} tasks | accuracy: ${m(`${p.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Ge.green("\u2191"):a.velocityTrend==="declining"?Ge.red("\u2193"):Ge.dim("\u2192");if(console.log(` Average: ${Ge.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Ge.bold(`${a.estimationAccuracy}%`)} ${Ge.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1610
|
+
${Ge.dim("Patterns:")}`);for(let p of a.underEstimated)console.log(` ${Ge.yellow("\u26A0")} ${p.category} tasks underestimated by avg ${Ge.bold(`${p.avgVariance}%`)}`);for(let p of a.overEstimated)console.log(` ${Ge.green("\u2713")} ${p.category} tasks estimated within ${Ge.bold(`${p.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let p=Cf(d,a.averageVelocity,o),m=p.estimatedDate?new Date(p.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1611
|
+
${Ge.dim("Projection:")}`),console.log(` Backlog: ${Ge.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${p.sprints} sprints (${p.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ge.bold(m)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async loadVelocityConfig(e){try{let s=await $.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...Xs,...s.velocity}}catch{}return Xs}}});var ty,Hn,ey,sy,ny,AE,fd=S(()=>{"use strict";ko();K();Sr();ty=l(r=>hl.includes(r),"isValidPoint"),Hn=l(r=>yl[r],"pointsToMinutes"),ey=l(r=>{if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`},"formatMinutes"),sy=l(r=>{let e=Hn(r);return`${ey(e.min)}\u2013${ey(e.max)}`},"pointsToTimeRange"),ny=l(async(r,e)=>{let s=(await $t.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+Lt(c.actualDuration),0)/s.length;return{points:AE(o),basedOn:s.length}},"suggestFromHistory"),AE=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of hl){let n=Math.abs(yl[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint")});import hd from"node:fs/promises";import IE from"node:os";import Ma from"node:path";var yd,wd,ry=S(()=>{"use strict";W();B();yd=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ma.join(IE.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await hd.mkdir(this.commandsPath,{recursive:!0});let s=Ma.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await hd.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:k(s)}}}async deleteWorkflowTemplate(e){try{let t=Ma.join(this.commandsPath,`${e}.md`);return await hd.unlink(t),{success:!0}}catch(t){return O(t)?{success:!0}:{success:!1,error:k(t)}}}async templateExists(e){let t=Ma.join(this.commandsPath,`${e}.md`);return C(t)}buildTemplateContent(e,t){return`---
|
|
1612
1612
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1613
1613
|
---
|
|
1614
1614
|
|
|
@@ -1644,97 +1644,97 @@ Suggest relevant actions based on the workflow results:
|
|
|
1644
1644
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1645
1645
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1646
1646
|
- Run again: \`p. ${e}\`
|
|
1647
|
-
`}},
|
|
1648
|
-
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}var
|
|
1649
|
-
`)}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 ${xt(t*1e3)} of work`),s.join(" ")}},
|
|
1647
|
+
`}},wd=new yd});function DE(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}async function $E(r,e){let t=vr.detectTaskType(e),s=await ny(r,t);if(s){let a=Hn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=vr.estimateComplexity(e),o=DE(n.level),i=Hn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}var kd,oy=S(()=>{"use strict";fd();Gu();l(DE,"complexityToPoints");l($E,"estimateTaskForStart");kd=$E});async function Oa(r){try{let{stdout:e}=await F("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function iy(r,e=20){try{let{stdout:t}=await F("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
|
|
1648
|
+
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}var Sd=S(()=>{"use strict";Je();l(Oa,"getGitBranch");l(iy,"getModifiedFiles")});var Wr,ME,bd,cn,ay=S(()=>{"use strict";ve();ee();K();Sd();Wr="session-snapshot",ME=30,bd=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Oa(t),o=await iy(t),i=s.startedAt?Math.round((Date.now()-new Date(s.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(s,i),u={sessionId:s.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:s.taskDescription,taskStatus:s.taskStatus,activeSubtaskIndex:s.activeSubtaskIndex,subtaskCount:s.subtaskCount,branch:n,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:v(),resumeHint:c};return E.setDoc(e,Wr,u),u}getSnapshot(e){try{return E.getDoc(e,Wr)}catch{return null}}clearSnapshot(e){try{E.deleteDoc(e,Wr)}catch{}}async listAllSnapshots(){let e=await A.listProjects(),t=[];for(let s of e)try{if(!E.exists(s))continue;let n=E.getDoc(s,Wr);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=ME){let t=await A.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!E.exists(o))continue;let i=E.getDoc(o,Wr);i&&new Date(i.timestamp).getTime()<s&&(E.deleteDoc(o,Wr),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${xt(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&s.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let n=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${n}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${xt(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
|
|
1649
|
+
`)}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 ${xt(t*1e3)} of work`),s.join(" ")}},cn=new bd});var vd,Oo,cy=S(()=>{"use strict";ee();vd=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){E.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
|
|
1650
1650
|
VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=E.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!n)return;let o=new Set(JSON.parse(n.suggested_files)),i=new Set(s),a=[...o].filter(d=>i.has(d)).length,c=o.size>0?a/o.size:0,u=i.size>0?a/i.size:0;E.run(e,`UPDATE context_feedback
|
|
1651
1651
|
SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
|
|
1652
1652
|
WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=E.get(e,"SELECT precision, recall FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);return s?{precision:s.precision,recall:s.recall}:null}getHistoricalBoosts(e,t){let s=new Map;if(t.length===0)return s;let n=E.query(e,`SELECT * FROM context_feedback
|
|
1653
1653
|
WHERE actual_files IS NOT NULL
|
|
1654
|
-
ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),
|
|
1654
|
+
ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),p=[...o].filter(h=>d.has(h)).length,m=new Set([...o,...d]).size,g=m>0?p/m:0;if(g===0)continue;let w=new Set(JSON.parse(c.suggested_files)),b=new Set(JSON.parse(c.actual_files));for(let h of b){let x=i.get(h)??0;i.set(h,x+g)}for(let h of w)if(!b.has(h)){let x=i.get(h)??0;i.set(h,x-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}},Oo=new vd});function ly(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(p=>p.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)}function uy(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=En.readDomainsSync(e);if(n?.domains)for(let o of n.domains){if(t.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(t.includes(i.toLowerCase())){s.add(o.name);break}}}catch{}return s.size>0?[...s]:["general"]}function Td(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=ly(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
|
|
1655
1655
|
|
|
1656
|
-
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",
|
|
1656
|
+
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",p=a.name.toLowerCase().split(/[\s\-_/]+/).filter(w=>w.length>2),m;if(Array.isArray(s))for(let w=0;w<s.length;w++){if(o.has(w))continue;let b=`${s[w].issue} ${s[w].suggestion}`.toLowerCase();if(p.some(h=>b.includes(h))){m=s[w],o.add(w);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return m&&g.push(` - VIOLATION: ${m.issue} \u2014 ${m.suggestion}`),g.join(`
|
|
1657
1657
|
`)}).join(`
|
|
1658
1658
|
|
|
1659
|
-
`)}`}function
|
|
1660
|
-
`)}var
|
|
1661
|
-
`)}function
|
|
1662
|
-
`)}catch{return null}}function
|
|
1663
|
-
`)}async function
|
|
1659
|
+
`)}`}function Ed(r,e){let t=r.slice(0,6).map(i=>`\`${i.path}\``),n=["### Context Contract",`- **Key files**: ${t.length>0?t.join(", "):"Run `prjct sync` to improve file targeting"}`],o=e?.antiPatterns||[];if(Array.isArray(o)){let i=o.filter(a=>a.severity==="high");if(i.length>0){n.push(""),n.push("#### Avoid (high-severity)");for(let a of i.slice(0,3))n.push(`- ${a.suggestion}`)}}return n.join(`
|
|
1660
|
+
`)}var Cd=S(()=>{"use strict";Hc();l(ly,"rankPatterns");l(uy,"detectDomainsFromTask");l(Td,"buildPatternBriefing");l(Ed,"buildContextContract")});import OE from"node:fs/promises";import _E from"node:path";function LE(){return["### Efficiency","- Be concise. No preamble, no filler.","- **Use sub-agents (Agent tool) for exploration that produces >5 file reads.** Sub-agents isolate context and prevent the main conversation from bloating.","- Prefer `file:line` references over dumping full file contents.","- When context grows large, use `prjct compact --md` to create a truth snapshot."].join(`
|
|
1661
|
+
`)}function FE(r){try{let{prjctDb:e}=(ee(),bt(ri)),t=e.getDoc(r,"rpi:current:research"),s=e.getDoc(r,"rpi:current:plan"),n;t?s?n={phase:"implement",researchDoc:t,planDoc:s}:n={phase:"plan",researchDoc:t}:n={phase:"research"};let o=["### RPI Phase"];switch(n.phase){case"research":o.push("**Phase: RESEARCH** \u2014 Explore the codebase first. Use the **Agent tool** (sub-agents) for broad exploration.","Produce a truth snapshot: exact files + lines, function call chains, test locations.","Save findings with `prjct compact --md` when done exploring.");break;case"plan":o.push("**Phase: PLAN** \u2014 Create an implementation plan with real code snippets.","Reference exact files and line numbers from research.","Use sub-agents to verify assumptions if needed."),n.researchDoc&&o.push("","<research-context>",n.researchDoc,"</research-context>");break;case"implement":if(o.push("**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration.","Work only with the scoped files. Avoid reading new files unless absolutely necessary."),n.planDoc){let i=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,a=new Set;for(let c of n.planDoc.matchAll(i))a.add(c[1]);a.size>0&&o.push(`**Scoped Files**: ${[...a].slice(0,20).map(c=>`\`${c}\``).join(", ")}`)}break}return o.join(`
|
|
1662
|
+
`)}catch{return null}}function dy(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}async function UE(r){try{let e=_E.join(r,"analysis","repo-analysis.json"),t=await OE.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e),null}}function HE(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),s=e.filter(m=>m.type==="instruction"&&m.position==="before"),n=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),c=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=l((m,g,w)=>{let b=g.map(I=>` ${I.enabled?w:"o"} #${I.id} ${I.action}`),h=[m,...b],T=Math.max(...h.map(I=>I.length))+2;u.push(`+${"-".repeat(T)}+`);for(let I of h)u.push(`| ${I.padEnd(T-1)}|`);u.push(`+${"-".repeat(T)}+`)},"drawBox"),p=l(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),p(u)),n.length>0&&(d("HOOKS (before)",n,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),c.length>0&&(p(u),d("STEPS (after)",c,">")),u.join(`
|
|
1663
|
+
`)}async function WE(r,e){let{execSync:t}=await import("node:child_process"),s=new Set,n={cwd:r,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,n);for(let i of o.split(`
|
|
1664
1664
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --cached --name-only",n);for(let i of o.split(`
|
|
1665
1665
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
|
|
1666
|
-
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}function
|
|
1667
|
-
${xe.map(([
|
|
1666
|
+
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}function GE(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}var NE,Gr,Pd=S(()=>{"use strict";Ou();fd();Te();ve();ry();Ut();pr();oy();Sd();ay();lr();cy();li();Vt();vt();go();Ao();W();K();jo();hs();yr();Fe();qu();ud();Sr();Mt();Cd();Cd();NE=[{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}],Gr=class extends Ce{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await ls(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 ss.ensureReady()}catch(xe){return It("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:k(xe)}),{success:!1,error:k(xe)}}let m=await kd(o,c),g=await L.getCurrentTask(o),w=await L.getActiveTasks(o),{worktreeService:b}=await Promise.resolve().then(()=>(oo(),ei)),h=await b.detect(t);if(h){let xe=w.find(St=>St.worktreePath===h.path);if(xe)return It("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:xe.description,requested_task:c}),{success:!0,message:"Task already active in this worktree",currentTask:xe}}let x;if(g&&!h){let xe=c.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40);try{let St=await b.create(t,xe);await b.setup(St.path,t),x=St.path,os("info",`Parallel session created: \`${St.branch}\` at \`${St.path}\``)}catch{return It("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g}}}if(x||h){let xe=Z();await L.startTaskInWorkspace(o,{id:Z(),description:c,sessionId:Z(),workspaceId:xe,worktreePath:x||h.path,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes},xe)}else await L.startTask(o,{id:Z(),description:c,sessionId:Z(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let I=A.getGlobalProjectPath(o),M=fu(c),y;try{y=Oo.getHistoricalBoosts(o,M),y.size===0&&(y=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[m.taskType]??80)>=80?15:10,[G,Q,,Ve]=await Promise.all([Oa(t),pt.getActive(o).catch(()=>null),UE(I),nn(c,t,{maxFiles:D,minScore:.15,historicalBoosts:y}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),he=null;try{let xe=cn.getSnapshot(o);xe&&(he=cn.formatContinuityContext(xe),cn.clearSnapshot(o))}catch{}let Ne=null;if(Q?.analyzedAt){let xe=new Date(Q.analyzedAt),St=Math.floor((Date.now()-xe.getTime())/(1e3*60*60*24));St>7&&(Ne=os("warn",`Analysis is ${St} days old. Run \`p. sync\` to refresh patterns and file index.`))}else Q||(Ne=os("info","No project analysis found. Run `p. sync` for better context targeting."));let us=null;if(y&&y.size>0){let xe=[...y.entries()].filter(([,St])=>St>.3).sort((St,Xa)=>Xa[1]-St[1]).slice(0,5);xe.length>0&&(us=`### Previously Useful Files
|
|
1667
|
+
${xe.map(([Xa])=>`\`${Xa}\``).join(", ")}`)}let Wa=uy(c,o),Ga=hr({description:c,branch:G,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes,estimateSource:m.source,domains:Wa}),qa=su(Ve.files.map(xe=>({path:xe.path,description:xe.reasons.join(", ")}))),Ba=Ve.files.map(xe=>xe.path),Va=Td(Q,Ba),Ja=Ed(Ve.files,Q),za=le([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),ue=LE(),Qy=FE(o);console.log(U(he,Ne,Ga,Ja,qa,us,Va,Qy,ue,za));try{let xe=await L.getCurrentTask(o);xe&&Oo.recordSuggestions(o,xe.id,M,Ve.files.map(St=>St.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:v()}),await ls(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await fa.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let p=await kd(o,c);return await L.startTask(o,{id:Z(),description:c,sessionId:Z(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes}),f.done(`${e}`),Co("working"),Wt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:v()}),await ls(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:ty,pointsToMinutes:Hn,pointsToTimeRange:sy,storeEstimate:l(async m=>{let g=Hn(m);return await L.updateCurrentTask(o,{estimatedPoints:m,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?js(new Date(i.startedAt)):void 0,c=hr({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,p=u.length>0?tu(u,d):"",m=le([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(U(c,p,m))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=k(n);return s.md?o.includes("Cannot run")||o.includes("working state")?It("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):f.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let{worktreeService:o}=await Promise.resolve().then(()=>(oo(),ei)),i=await o.detect(e),a=await L.getCurrentTask(n),c;if(i){let G=(await L.getActiveTasks(n)).find(Q=>Q.worktreePath===i.path);G&&(a=G,c=G.workspaceId)}if(!a)return t.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let u=await ls(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!u.success)return{success:!1,error:u.gatesFailed.length>0?`Blocked: ${u.gatesFailed.join(", ")}`:`Hook failed: ${u.hooksFailed.join(", ")}`};let d=a.description,p="",m=0;if(a.startedAt){let D=new Date(a.startedAt);p=js(D),m=Math.round((Date.now()-D.getTime())/6e4)}let g=a.estimatedMinutes,w=a.estimatedPoints,b=a.type||"feature",h=a.linearId;try{await $t.record(n,{sessionId:a.sessionId,command:"done",task:d,startedAt:a.startedAt,completedAt:v(),estimatedDuration:g?dy(g):"0m",actualDuration:p||"0m",variance:g?GE(m-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[b,h].filter(Boolean)})}catch{}let x="";if(w&&g){let D=m-g,G=g>0?Math.round((m-g)/g*100):0,Q=D>=0?"+":"";x=` | est: ${w}pt (${dy(g)}) \u2192 ${Q}${G}%`}let T=[],I=null,M=null;try{if(T=await WE(e,a.startedAt),T.length>0){Oo.completeFeedback(n,a.id,T);let D=Oo.getFeedback(n,a.id);D&&(I=D.precision,M=D.recall)}}catch{}c?await L.completeTaskInWorkspace(n,c,t.feedback):await L.completeTask(n,t.feedback);try{cn.clearSnapshot(n)}catch{}let y=a.linearId,j=y!=null?await sn("linear",ws()).catch(()=>!1):!1;if(t.md){let D=p?` (${p})`:"",G=null;if(T.length>0){let he=T.slice(0,10).map(us=>`\`${us}\``),Ne=T.length>10?`, +${T.length-10} more`:"";G=`### Files Modified (${T.length})
|
|
1668
1668
|
${he.join(", ")}${Ne}`}let Q=null;if(I!==null&&M!==null){let he=Math.round(I*100),Ne=Math.round(M*100);Q=`### Context Accuracy
|
|
1669
1669
|
| Metric | Value |
|
|
1670
1670
|
|--------|-------|
|
|
1671
1671
|
| Precision | ${he}% of suggested files were used |
|
|
1672
|
-
| Recall | ${Ne}% of modified files were suggested |`}let Ve=null;try{let{prjctDb:he}=(ee(),
|
|
1673
|
-
Research is available. Create your implementation plan next.`):Ve="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(U(fe("Completed",`${d}${D}`),Ye({Duration:m||"unknown",...x?{Variance:x.replace(" | ","")}:{}}),G,Q,Ve,le([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let D=m?` (${m}${x})`:"";y&&j?f.done(`${d}${D} \u2192 Linear linked (update via MCP)`):f.done(`${d}${D}`),jo("completed"),Gt("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:m,estimatedPoints:w,estimatedMinutes:g,actualMinutes:p,timestamp:v()}),await ls(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:m}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ce.getActiveTasks(n);if(o.length===0)return t.md?It("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let a=o.slice(0,10).map(c=>{let u=c.type?` [${c.type}]`:"",d=c.priority?` ${c.priority}`:"";return`${c.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${u}${d}`});o.length>10&&a.push(`...and ${o.length-10} more`),console.log(U(te("Queue",`${o.length} task${o.length!==1?"s":""}`),He(a,!0),le([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Gt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=xs(new Date(i.startedAt))),await L.pauseTask(o,e);try{await ln.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(U(fe("Task Paused",`**Paused:** ${i.description}`),Ye({Reason:e||void 0,"Duration worked":a||void 0}),le([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),jo("paused"),Gt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:v()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return s.md?It("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(s.md?console.log(U(fe("Task Resumed",`**Resumed:** ${a.description}`),le([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),jo("working"),Gt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:v()}),{success:!0,task:a.description}):(s.md?It("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${k(n)}`):f.fail(k(n)),{success:!1,error:k(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of UE){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let u=Ke.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let p=Ke.getAllWorkflows(t).map(w=>w.name).join(", "),g=`Workflow '${c}' not found. Available: ${p}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=je.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ke.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=Ke.getAllWorkflows(t).map(g=>g.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=je.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("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`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Ke.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let w=Ke.getAllWorkflows(t).map(h=>h.name).join(", "),b=`Workflow '${o}' not found. Available: ${w}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[m]=this._parseAction(d);if(!m){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let p=je.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("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`}]))):f.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!je.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(U(fe("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=je.resetRules(e);return t.md?console.log(U(fe("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let u=je.getRuleById(t,o);if(!u){let d=`Rule #${o} not found`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}if(!u.enabled){let d=`Rule #${o} is already disabled`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!0,message:d}}return je.updateRule(t,o,{enabled:!1}),s.md?console.log(U(fe("Rule Disabled",`#${o} [${u.type}] ${u.action}`),le([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${u.action}`),{success:!0,ruleId:o}}let i=je.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let u=`No rules matching "${n}"`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(a.length===1){let u=a[0];return je.updateRule(t,u.id,{enabled:!1}),s.md?console.log(U(fe("Rule Disabled",`#${u.id} [${u.type}] ${u.action}`))):f.done(`disabled rule #${u.id}: ${u.action}`),{success:!0,ruleId:u.id}}let c=a.slice(0,5);if(s.md){let u=c.map(d=>`#${d.id} [${d.type}] ${d.position} ${d.command} -> \`${d.action}\``);a.length>5&&u.push(`...and ${a.length-5} more`),console.log(U(te("Multiple matches",`${a.length} rules match "${n}"`),He(u),le(c.map(d=>({label:`Disable #${d.id}`,command:`prjct workflow disable ${d.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let u of c)console.log(` #${u.id} [${u.type}] ${u.position} ${u.command} -> ${u.action}`);a.length>5&&console.log(` ...and ${a.length-5} more`)}return{success:!0,matches:a.map(u=>u.id)}}async _workflowHelp(e){return e.md?console.log(U(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",He(["`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)",He(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=je.getRulesForCommand(t,e):o=je.getAllRules(t),o.length===0)return s.md?console.log(U(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'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(qE(d,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(te(c,u),a.length>0?nu(a.join(`
|
|
1672
|
+
| Recall | ${Ne}% of modified files were suggested |`}let Ve=null;try{let{prjctDb:he}=(ee(),bt(ri)),Ne=he.getDoc(n,"rpi:current:research"),us=he.getDoc(n,"rpi:current:plan");Ne?us||(Ve=`### RPI Phase: Plan Ready
|
|
1673
|
+
Research is available. Create your implementation plan next.`):Ve="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(U(fe("Completed",`${d}${D}`),Ye({Duration:p||"unknown",...x?{Variance:x.replace(" | ","")}:{}}),G,Q,Ve,le([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let D=p?` (${p}${x})`:"";y&&j?f.done(`${d}${D} \u2192 Linear linked (update via MCP)`):f.done(`${d}${D}`),Co("completed"),Wt("done")}return await this.logToMemory(e,"task_completed",{task:d,duration:p,estimatedPoints:w,estimatedMinutes:g,actualMinutes:m,timestamp:v()}),await ls(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:d,duration:p}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await ce.getActiveTasks(n);if(o.length===0)return t.md?It("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let a=o.slice(0,10).map(c=>{let u=c.type?` [${c.type}]`:"",d=c.priority?` ${c.priority}`:"";return`${c.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${u}${d}`});o.length>10&&a.push(`...and ${o.length-10} more`),console.log(U(te("Queue",`${o.length} task${o.length!==1?"s":""}`),He(a,!0),le([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),Wt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=js(new Date(i.startedAt))),await L.pauseTask(o,e);try{await cn.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(U(fe("Task Paused",`**Paused:** ${i.description}`),Ye({Reason:e||void 0,"Duration worked":a||void 0}),le([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),Co("paused"),Wt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:v()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return s.md?It("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(s.md?console.log(U(fe("Task Resumed",`**Resumed:** ${a.description}`),le([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),Co("working"),Wt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:v()}),{success:!0,task:a.description}):(s.md?It("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${k(n)}`):f.fail(k(n)),{success:!1,error:k(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of NE){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=Xe.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=Xe.getAllWorkflows(t).map(w=>w.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=je.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Xe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=Xe.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=je.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("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`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Xe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let w=Xe.getAllWorkflows(t).map(h=>h.name).join(", "),b=`Workflow '${o}' not found. Available: ${w}`;return s.md?console.log(`> ${b}`):f.warn(b),{success:!1,error:b}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[p]=this._parseAction(d);if(!p){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let m=je.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(U(fe("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!je.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(U(fe("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=je.resetRules(e);return t.md?console.log(U(fe("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let u=je.getRuleById(t,o);if(!u){let d=`Rule #${o} not found`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}if(!u.enabled){let d=`Rule #${o} is already disabled`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!0,message:d}}return je.updateRule(t,o,{enabled:!1}),s.md?console.log(U(fe("Rule Disabled",`#${o} [${u.type}] ${u.action}`),le([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${u.action}`),{success:!0,ruleId:o}}let i=je.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let u=`No rules matching "${n}"`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(a.length===1){let u=a[0];return je.updateRule(t,u.id,{enabled:!1}),s.md?console.log(U(fe("Rule Disabled",`#${u.id} [${u.type}] ${u.action}`))):f.done(`disabled rule #${u.id}: ${u.action}`),{success:!0,ruleId:u.id}}let c=a.slice(0,5);if(s.md){let u=c.map(d=>`#${d.id} [${d.type}] ${d.position} ${d.command} -> \`${d.action}\``);a.length>5&&u.push(`...and ${a.length-5} more`),console.log(U(te("Multiple matches",`${a.length} rules match "${n}"`),He(u),le(c.map(d=>({label:`Disable #${d.id}`,command:`prjct workflow disable ${d.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let u of c)console.log(` #${u.id} [${u.type}] ${u.position} ${u.command} -> ${u.action}`);a.length>5&&console.log(` ...and ${a.length-5} more`)}return{success:!0,matches:a.map(u=>u.id)}}async _workflowHelp(e){return e.md?console.log(U(te("Workflow Help","Manage hooks, gates, and steps for your workflow"),te("Commands",He(["`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)",He(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=je.getRulesForCommand(t,e):o=je.getAllRules(t),o.length===0)return s.md?console.log(U(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'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let p=o.filter(m=>m.command===d);p.length!==0&&a.push(HE(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(U(te(c,u),a.length>0?eu(a.join(`
|
|
1674
1674
|
|
|
1675
|
-
`),""):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 n=je.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await ba(t),i=0,a=[],c=je.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=je.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=je.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(U(fe("Workflow Initialized",`Added ${a.length} default ship rules`),He(a),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!
|
|
1676
|
-
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=k(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=
|
|
1675
|
+
`),""):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 n=je.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await ba(t),i=0,a=[],c=je.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=je.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=je.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(U(fe("Workflow Initialized",`Added ${a.length} default ship rules`),He(a),le([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!Xe.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Xe.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Xe.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}try{let u=Xe.createWorkflow(t,{name:i,description:a}),d=await wd.generateWorkflowTemplate(i,a);if(!d.success){Xe.deleteWorkflow(t,i);let p=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${p}`):f.fail(p),{success:!1,error:p}}return n.md?console.log(U(fe("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}`}]))):(f.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
|
|
1676
|
+
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=k(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=Xe.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):f.warn(i),{success:!0,workflows:[]}}let n=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(n.length>0){let a=n.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Built-in Workflows",a.join(`
|
|
1677
1677
|
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(te("Custom Workflows",a.join(`
|
|
1678
1678
|
`)))}console.log(U(...i,le([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(f.done(`${s.length} workflow${s.length!==1?"s":""}`),n.length>0){console.log(`
|
|
1679
1679
|
Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1680
|
-
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!Ke.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await xd.deleteWorkflowTemplate(n),s.md?console.log(U(fe("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=k(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=Ke.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await ls(o,i,"before",{projectPath:t});if(!c.success){if(s.md)It("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await ls(o,i,"after",{projectPath:t}),s.md?console.log(U(fe(`Workflow: ${i}`,a.description||""),le([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=k(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await ln.cleanup();return t.md?console.log(fe("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await ln.listAllSnapshots();if(s.length===0)return t.md?It("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let o=s.slice(0,10).map(i=>{let a=xt(Date.now()-new Date(i.timestamp).getTime()),c=i.projectName||i.projectId.slice(0,8),u=i.subtaskCount&&i.activeSubtaskIndex!==void 0?` (${i.activeSubtaskIndex+1}/${i.subtaskCount})`:"";return`[${i.taskStatus}] **${c}** \u2014 ${i.taskDescription}${u} (${a} ago)`});s.length>10&&o.push(`...and ${s.length-10} more`),console.log(U(te("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),He(o),le([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=xt(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let m="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(U(te("Tokens",m))):f.fail(m),{success:!1,error:m}}let d=await L.addTokens(o,c,u);return d?(s.md?console.log(U(te("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),Ye({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}};l(HE,"buildEfficiencySection");l(WE,"buildRpiSection");l(uy,"formatMinutesToDuration");l(GE,"loadRepoAnalysis");l(qE,"buildFlowDiagram");l(BE,"getFilesModifiedSinceTaskStart");l(VE,"formatVariance")});var un,zq,_d=S(()=>{"use strict";Ca();Yu();xa();ld();dd();md();gd();Ea();kd();bd();vd();Td();Od();un=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;obsidianCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new qr,this.planning=new Nn,this.shipping=new Fr,this.analytics=new Pr,this.performanceCmds=new Mr,this.maintenance=new jr,this.analysis=new Un,this.setupCmds=new _r,this.updateCmds=new Hr,this.velocityCmds=new Wr,this.contextCmds=new an,this.obsidianCmds=new Ir,this.parallelCmds=new Hn,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async obsidian(e=null,t=process.cwd()){return this.obsidianCmds.obsidian(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},zq=new un});var Ho,Br,Nd=S(()=>{"use strict";Ho={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}},Br=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{name:"obsidian",group:"optional",description:"Obsidian vault integration \u2014 Kanban board, KB, and bidirectional sync",usage:{claude:"/p:obsidian [command]",terminal:"prjct obsidian [command]"},params:"[setup|export|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Export tasks as Kanban board with Obsidian Kanban plugin support","Export queue, shipped, and roadmap as Obsidian notes","Generate Canvas roadmap with dependency arrows","Daily standup notes with task progress","Dataview-compatible frontmatter on all files"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var fy={};Se(fy,{UninstallCommands:()=>Go,uninstall:()=>gy});import{execSync as Fa}from"node:child_process";import Ot from"node:fs/promises";import JE from"node:os";import Fs from"node:path";import zE from"node:readline";import Me from"chalk";async function py(r){let e=0;try{let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Fs.join(r,s.name);if(s.isDirectory())e+=await py(n);else try{let o=await Ot.stat(n);e+=o.size}catch{}}}catch{}return e}function dy(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function KE(r){try{return(await Ot.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function XE(){let r={homebrew:!1,npm:!1};try{Fa("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Fa("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function YE(){let r=[],e=xm(),t=A.getGlobalBasePath(),s=await C(t),n=s?await KE(Fs.join(t,"projects")):0,o=s?await py(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=Fs.join(e.claude.config,"CLAUDE.md"),a=await C(i),c=!1;if(a)try{let T=await Ot.readFile(i,"utf-8");c=T.includes(Ua)&&T.includes(Wo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await C(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let m=Fs.join(e.claude.config,"prjct-statusline.sh"),p=await C(m);r.push({path:m,type:"file",description:"Status line script",exists:p});let g=e.gemini.router,w=await C(g);r.push({path:g,type:"file",description:"Gemini router",exists:w});let b=Fs.join(e.gemini.config,"GEMINI.md"),h=await C(b),x=!1;if(h)try{let T=await Ot.readFile(b,"utf-8");x=T.includes(Ua)&&T.includes(Wo)}catch{}return h&&x&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function QE(r){try{let e=await Ot.readFile(r,"utf-8");if(!e.includes(Ua)||!e.includes(Wo))return!1;let t=e.indexOf(Ua),s=e.indexOf(Wo)+Wo.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1680
|
+
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!Xe.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await wd.deleteWorkflowTemplate(n),s.md?console.log(U(fe("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=k(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=Xe.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await ls(o,i,"before",{projectPath:t});if(!c.success){if(s.md)It("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await ls(o,i,"after",{projectPath:t}),s.md?console.log(U(fe(`Workflow: ${i}`,a.description||""),le([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=k(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await cn.cleanup();return t.md?console.log(fe("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await cn.listAllSnapshots();if(s.length===0)return t.md?It("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let o=s.slice(0,10).map(i=>{let a=xt(Date.now()-new Date(i.timestamp).getTime()),c=i.projectName||i.projectId.slice(0,8),u=i.subtaskCount&&i.activeSubtaskIndex!==void 0?` (${i.activeSubtaskIndex+1}/${i.subtaskCount})`:"";return`[${i.taskStatus}] **${c}** \u2014 ${i.taskDescription}${u} (${a} ago)`});s.length>10&&o.push(`...and ${s.length-10} more`),console.log(U(te("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),He(o),le([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=xt(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(k(s)),{success:!1,error:k(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return s.md?It("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let p="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(U(te("Tokens",p))):f.fail(p),{success:!1,error:p}}let d=await L.addTokens(o,c,u);return d?(s.md?console.log(U(te("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),Ye({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(k(n)),{success:!1,error:k(n)}}}};l(LE,"buildEfficiencySection");l(FE,"buildRpiSection");l(dy,"formatMinutesToDuration");l(UE,"loadRepoAnalysis");l(HE,"buildFlowDiagram");l(WE,"getFilesModifiedSinceTaskStart");l(GE,"formatVariance")});var ln,Uq,xd=S(()=>{"use strict";Ca();zu();xa();Zu();td();nd();rd();Ea();ld();dd();pd();gd();Pd();ln=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;obsidianCmds;parallelCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Gr,this.planning=new _n,this.shipping=new Nr,this.analytics=new Er,this.performanceCmds=new Dr,this.maintenance=new Pr,this.analysis=new Fn,this.setupCmds=new Mr,this.updateCmds=new Ur,this.velocityCmds=new Hr,this.contextCmds=new on,this.obsidianCmds=new Rr,this.parallelCmds=new Un,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async parallel(e=null,t=process.cwd(),s={}){return this.parallelCmds.parallel(e,t,s)}async parallelSpawn(e,t=process.cwd(),s={}){return this.parallelCmds.spawn(e,t,s)}async parallelBatch(e,t=process.cwd()){return this.parallelCmds.batchSpawn(e,t)}async obsidian(e=null,t=process.cwd()){return this.obsidianCmds.obsidian(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},Uq=new ln});var _o,qr,jd=S(()=>{"use strict";_o={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}},qr=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"worktree",group:"optional",description:"Manage git worktrees for parallel agent sessions",usage:{claude:null,terminal:"prjct worktree [command]"},params:"[create|list|remove|clean] [slug]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Create isolated worktrees per task","Auto-setup: .env copy, dependency install, config symlink","Clean up completed worktrees"]},{name:"parallel",group:"optional",description:"Manage parallel agent sessions across worktrees",usage:{claude:null,terminal:"prjct parallel [command]"},params:"[status|spawn|plan|dispatch|join|cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Spawn tasks in isolated worktrees","Plan dispatch from Linear/Jira tickets","Track all active agent sessions","Join completed branches"]},{name:"conductor",group:"optional",description:"Conductor.build integration for multi-agent workflows",usage:{claude:null,terminal:"prjct conductor [command]"},params:"[init|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scaffold conductor.json + setup/teardown scripts","Detect Conductor environment"]},{name:"obsidian",group:"optional",description:"Obsidian vault integration \u2014 Kanban board, KB, and bidirectional sync",usage:{claude:"/p:obsidian [command]",terminal:"prjct obsidian [command]"},params:"[setup|export|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Export tasks as Kanban board with Obsidian Kanban plugin support","Export queue, shipped, and roadmap as Obsidian notes","Generate Canvas roadmap with dependency arrows","Daily standup notes with task progress","Dataview-compatible frontmatter on all files"]},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}]});var hy={};ye(hy,{UninstallCommands:()=>Lo,uninstall:()=>fy});import{execSync as _a}from"node:child_process";import Ot from"node:fs/promises";import qE from"node:os";import Us from"node:path";import BE from"node:readline";import Me from"chalk";async function py(r){let e=0;try{let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Us.join(r,s.name);if(s.isDirectory())e+=await py(n);else try{let o=await Ot.stat(n);e+=o.size}catch{}}}catch{}return e}function my(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function VE(r){try{return(await Ot.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function JE(){let r={homebrew:!1,npm:!1};try{_a("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{_a("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function zE(){let r=[],e=wp(),t=A.getGlobalBasePath(),s=await C(t),n=s?await VE(Us.join(t,"projects")):0,o=s?await py(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=Us.join(e.claude.config,"CLAUDE.md"),a=await C(i),c=!1;if(a)try{let T=await Ot.readFile(i,"utf-8");c=T.includes(Na)&&T.includes(No)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await C(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=Us.join(e.claude.config,"prjct-statusline.sh"),m=await C(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,w=await C(g);r.push({path:g,type:"file",description:"Gemini router",exists:w});let b=Us.join(e.gemini.config,"GEMINI.md"),h=await C(b),x=!1;if(h)try{let T=await Ot.readFile(b,"utf-8");x=T.includes(Na)&&T.includes(No)}catch{}return h&&x&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function XE(r){try{let e=await Ot.readFile(r,"utf-8");if(!e.includes(Na)||!e.includes(No))return!1;let t=e.indexOf(Na),s=e.indexOf(No)+No.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1681
1681
|
|
|
1682
1682
|
`).trim(),!n||n.trim().length===0?await Ot.unlink(r):await Ot.writeFile(r,`${n}
|
|
1683
|
-
`,"utf-8"),!0}catch{return!1}}async function
|
|
1684
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Me.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Me.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Me.dim("(section only)"):c.size&&(d=Me.dim(`(${
|
|
1685
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Me.blue("Removing prjct..."));let{deleted:i,errors:a}=await
|
|
1686
|
-
${a.length} errors:`));for(let c of a)console.log(Me.red(` - ${c}`))}return console.log(""),console.log(Me.green("prjct has been uninstalled.")),console.log(Me.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var
|
|
1687
|
-
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await
|
|
1683
|
+
`,"utf-8"),!0}catch{return!1}}async function KE(){let r=qE.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Us.join(r,`.prjct-backup-${e}`);try{await Ot.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await C(s)&&await gy(s,Us.join(t,".prjct-cli")),t}catch{return null}}async function gy(r,e){await Ot.mkdir(e,{recursive:!0});let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Us.join(r,s.name),o=Us.join(e,s.name);s.isDirectory()?await gy(n,o):await Ot.copyFile(n,o)}}async function YE(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await XE(o.path)&&s.push(o.path):o.type==="directory"?(await Ot.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await Ot.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${k(i)}`)}try{await new Ms().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||_a(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${k(o)}`)}if(e.npm)try{t.dryRun||_a("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${k(o)}`)}}return{deleted:s,errors:n}}async function QE(r){let e=BE.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}async function fy(r={},e=process.cwd()){let t=await zE(),s=JE(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(Me.yellow(`
|
|
1684
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(Me.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Me.white("The following will be permanently deleted:")),console.log("");for(let c of n){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=Me.dim("(section only)"):c.size&&(d=Me.dim(`(${my(c.size)})`)),console.log(` ${Me.cyan(u.padEnd(35))} ${d}`),console.log(` ${Me.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${Me.cyan("Homebrew".padEnd(35))} ${Me.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${Me.cyan("npm global".padEnd(35))} ${Me.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Me.dim(` Total size: ${my(o)}`)),console.log("")),r.dryRun)return console.log(Me.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(Me.blue("Creating backup..."));let c=await KE();c?(console.log(Me.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(Me.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(Me.yellow('Type "uninstall" to confirm:')),!await QE("> ")))return console.log(Me.yellow(`
|
|
1685
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Me.blue("Removing prjct..."));let{deleted:i,errors:a}=await YE(t,s,r);if(console.log(""),i.length>0&&console.log(Me.green(`Removed ${i.length} items`)),a.length>0){console.log(Me.yellow(`
|
|
1686
|
+
${a.length} errors:`));for(let c of a)console.log(Me.red(` - ${c}`))}return console.log(""),console.log(Me.green("prjct has been uninstalled.")),console.log(Me.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var Na,No,Lo,Rd=S(()=>{"use strict";Os();ve();W();B();Mt();Na="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",No="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(py,"getDirectorySize");l(my,"formatSize");l(VE,"countDirectoryItems");l(JE,"detectInstallation");l(zE,"gatherUninstallItems");l(XE,"removePrjctSection");l(KE,"createBackup");l(gy,"copyDirectory");l(YE,"performUninstall");l(QE,"promptConfirmation");l(fy,"uninstall");Lo=class extends Ce{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return fy(e,t)}}});function iC(){for(let[r,e]of Object.entries(_o))H.registerCategory(r,e)}function aC(){if(H.has("work"))return;iC();let r=l(e=>qr.find(t=>t.name===e),"getMeta");H.registerMethod("task",un,"now",r("task")),H.registerMethod("done",un,"done",r("done")),H.registerMethod("next",un,"next",r("next")),H.registerMethod("pause",un,"pause",r("pause")),H.registerMethod("resume",un,"resume",r("resume")),H.registerMethod("workflow",un,"workflow",r("workflow")),H.registerMethod("tokens",un,"tokens",r("tokens")),H.registerMethod("sessions",un,"sessions",r("sessions")),H.registerMethod("init",La,"init",r("init")),H.registerMethod("bug",La,"bug",r("bug")),H.registerMethod("idea",La,"idea",r("idea")),H.registerMethod("spec",La,"spec",r("spec")),H.registerMethod("ship",ZE,"ship",r("ship")),H.registerMethod("dash",yy,"dash",r("dash")),H.registerMethod("help",yy,"help",r("help")),H.registerMethod("perf",eC,"perf",r("perf")),H.registerMethod("velocity",sC,"velocity",r("velocity")),H.registerMethod("cleanup",dn,"cleanup",r("cleanup")),H.registerMethod("cleanup-projects",dn,"cleanupProjects",r("cleanup-projects")),H.registerMethod("design",dn,"design",r("design")),H.registerMethod("recover",dn,"recover",r("recover")),H.registerMethod("undo",dn,"undo",r("undo")),H.registerMethod("redo",dn,"redo",r("redo")),H.registerMethod("history",dn,"history",r("history")),H.registerMethod("enrich",dn,"enrich",r("enrich")),H.registerMethod("analyze",Br,"analyze",r("analyze")),H.registerMethod("sync",Br,"sync",r("sync")),H.registerMethod("stats",Br,"stats",r("stats")),H.registerMethod("status",Br,"status",r("status")),H.registerMethod("seal",Br,"seal",r("seal")),H.registerMethod("verify",Br,"verify",r("verify")),H.registerMethod("start",Fo,"start",r("start")),H.registerMethod("setup",Fo,"setup",r("setup")),H.registerMethod("login",Fo,"login",r("login")),H.registerMethod("logout",Fo,"logout",r("logout")),H.registerMethod("auth",Fo,"auth",r("auth")),H.registerMethod("uninstall",rC,"uninstall",r("uninstall")),H.registerMethod("update",oC,"update",r("update")),H.registerMethod("context",tC,"context",r("context")),H.registerMethod("obsidian",nC,"obsidian",r("obsidian")),H.registerMethod("parallel",Ad,"parallel",r("parallel")),H.registerMethod("worktree",Ad,"parallel",r("worktree")),H.registerMethod("conductor",Ad,"parallel",r("conductor"))}var un,La,ZE,yy,eC,dn,Br,Fo,tC,sC,nC,Ad,rC,oC,Id=S(()=>{"use strict";Ca();zu();jd();xa();Zu();td();nd();rd();Ea();Do();ld();dd();Rd();pd();gd();Pd();un=new Gr,La=new _n,ZE=new Nr,yy=new Er,eC=new Dr,dn=new Pr,Br=new Fn,Fo=new Mr,tC=new on,sC=new Hr,nC=new Rr,Ad=new Un,rC=new Lo,oC=new Ur;l(iC,"registerCategories");l(aC,"registerAllCommands");aC()});var Sy={};ye(Sy,{shutdown:()=>Wn,startDaemon:()=>uC});import Ze from"node:fs";import{createServer as cC}from"node:net";async function uC(r){let e=Le.socket(),t=Le.pid(),s=Le.runDir();if(Ze.mkdirSync(s,{recursive:!0}),Ze.existsSync(t)){let i=parseInt(Ze.readFileSync(t,"utf-8").trim(),10);fC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ze.unlinkSync(t)}Ze.existsSync(e)&&Ze.unlinkSync(e),wC();let n=hC(),o=null;if(n)try{o=Ze.statSync(n).mtimeMs}catch{}if(Oe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ka,idleTimer:null,entryPath:n,entryMtime:o},Pe=new ln,Vr=cC(i=>dC(i)),Vr.listen(e,()=>{Ze.chmodSync(e,384),Ze.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),wy()}),Vr.on("error",i=>{console.error("Daemon socket error:",i.message),Wn(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||hi;Uo=fi({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Uo.start()}}catch{}if(process.on("SIGTERM",()=>Wn(0)),process.on("SIGINT",()=>Wn(0)),process.on("SIGHUP",()=>{Pe=new ln,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function dC(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Ya){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(pn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1687
|
+
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await mC(o);r.write(pn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(pn(i))}}}),r.on("error",()=>{})}async function mC(r){if(!Oe||!Pe)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(wy(),Oe.commandsServed++,Oe.lastActivity=Date.now(),Oe.commandsServed%lC===0&&N.checkpointAll(),ky()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),Wn(0)},200)),r.command==="daemon")return gC(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,n=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await pC(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1688
1688
|
`)||o.message||void 0,stderr:t.join(`
|
|
1689
|
-
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function
|
|
1690
|
-
${
|
|
1691
|
-
`),console.log(` ${
|
|
1692
|
-
`),r.forEach((t,s)=>{let n=s===e?
|
|
1689
|
+
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function pC(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return Pe.sync(r.cwd,{preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:s,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Pe.status(r.cwd,{json:t.json===!0,md:s});case"stats":return Pe.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return Pe.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return Pe.seal(r.cwd,{json:t.json===!0});case"rollback":return Pe.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return Pe.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Pe.task(e,r.cwd,{md:s});case"done":return Pe.done(r.cwd,{md:s});case"next":return Pe.next(r.cwd,{md:s});case"pause":return Pe.pause(e||"",r.cwd,{md:s});case"resume":return Pe.resume(e,r.cwd,{md:s});case"bug":return Pe.bug(e||"",r.cwd,{md:s});case"idea":return Pe.idea(e||"",r.cwd,{md:s});case"ship":return Pe.ship(e,r.cwd,{md:s});case"dash":return Pe.dash(e||"default",r.cwd,{md:s});case"workflow":return Pe.workflowPrefs(e,r.cwd,{md:s});case"sessions":return Pe.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return Pe.design(e||"",t,r.cwd);case"analysis-payload":return Pe.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return Pe.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return Pe.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return Pe.analyze(t,r.cwd);case"cleanup":return Pe.cleanup(t,r.cwd);case"cleanup-projects":return Pe.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return H.execute(r.command,e,r.cwd)}}function gC(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Le.socket(),uptime:Oe?Date.now()-Oe.startedAt:0,commandsServed:Oe?.commandsServed??0,lastActivity:Oe?new Date(Oe.lastActivity).toISOString():null,registeredCommands:H.list().length,stale:ky()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Wn(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function wy(){Oe&&(Oe.idleTimer&&clearTimeout(Oe.idleTimer),Oe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Oe.idleTimeoutMs/1e3/60} minutes, shutting down`),Wn(0)},Oe.idleTimeoutMs),Oe.idleTimer.unref&&Oe.idleTimer.unref())}function Wn(r){console.log("Daemon shutting down..."),Oe?.idleTimer&&clearTimeout(Oe.idleTimer),Uo&&(Uo.stop(),Uo=null),Vr&&(Vr.close(),Vr=null),N.close();let e=Le.socket(),t=Le.pid();try{Ze.existsSync(e)&&Ze.unlinkSync(e)}catch{}try{Ze.existsSync(t)&&Ze.unlinkSync(t)}catch{}process.exit(r)}function fC(r){try{return process.kill(r,0),!0}catch{return!1}}function hC(){let r=Bt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(Ze.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(Ze.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of t)if(Ze.existsSync(n))return n;let s=process.argv[1];return s&&Ze.existsSync(s)?s:null}function wC(){let r=Le.log();try{if(Ze.statSync(r).size>yC){let t=`${r}.1`;try{Ze.unlinkSync(t)}catch{}Ze.renameSync(r,t)}}catch{}}function ky(){if(!Oe?.entryPath||Oe.entryMtime===null)return!1;try{return Ze.statSync(Oe.entryPath).mtimeMs!==Oe.entryMtime}catch{return!1}}var lC,Vr,Uo,Pe,Oe,yC,by=S(()=>{"use strict";xd();Do();Id();Te();Kc();ee();Wo();lC=50,Vr=null,Uo=null,Pe=null,Oe=null;l(uC,"startDaemon");l(dC,"handleConnection");l(mC,"handleRequest");l(pC,"executeCommand");l(gC,"handleDaemonCommand");l(wy,"resetIdleTimer");l(Wn,"shutdown");l(fC,"isProcessRunning");l(hC,"resolveEntryPath");yC=1024*1024;l(wC,"rotateLog");l(ky,"isCodeStale")});var Ey={};ye(Ey,{runStart:()=>jC});import ks from"node:fs/promises";import vy from"node:os";import Ss from"node:path";import X from"chalk";function bC(){console.clear(),console.log(kC),console.log(SC)}function Ty(r,e){console.log(`
|
|
1690
|
+
${X.bold(" Select AI providers to configure:")}
|
|
1691
|
+
`),console.log(` ${X.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
|
|
1692
|
+
`),r.forEach((t,s)=>{let n=s===e?X.cyan("\u276F"):" ",o=t.selected?X.green("[\u2713]"):X.dim("[ ]"),i=t.installed?X.green("(installed)"):X.yellow("(will install)"),a=s===e?X.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function vC(){let r=await Ps(),e=[{name:"claude",displayName:"Claude Code",installed:r.claude.installed,selected:r.claude.installed},{name:"gemini",displayName:"Gemini CLI",installed:r.gemini.installed,selected:r.gemini.installed},{name:"codex",displayName:"OpenAI Codex",installed:r.codex.installed,selected:r.codex.installed}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let s=0,n=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Ty(e,s)},"render");Ty(e,s),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let o=l(()=>{process.stdin.setRawMode(!1),process.stdin.removeListener("data",i),process.stdin.pause()},"cleanup"),i=l(a=>{if(a===""&&(o(),console.log(`
|
|
1693
1693
|
Cancelled.
|
|
1694
1694
|
`),process.exit(0)),a==="\r"||a===`
|
|
1695
1695
|
`){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(s=Math.max(0,s-1),n()),a==="\x1B[B"&&(s=Math.min(e.length-1,s+1),n()),a===" "&&(e[s].selected=!e[s].selected,n())},"handleKey");process.stdin.on("data",i)}):(console.log(`
|
|
1696
|
-
${
|
|
1697
|
-
`),e.forEach(t=>{t.installed&&console.log(` ${
|
|
1698
|
-
|
|
1699
|
-
${a}`)}else await
|
|
1700
|
-
${
|
|
1701
|
-
`),console.log(` ${
|
|
1702
|
-
${
|
|
1703
|
-
|
|
1704
|
-
${
|
|
1705
|
-
${
|
|
1706
|
-
${
|
|
1707
|
-
|
|
1708
|
-
${
|
|
1709
|
-
${
|
|
1710
|
-
${
|
|
1711
|
-
${
|
|
1712
|
-
|
|
1713
|
-
${
|
|
1714
|
-
`)}async function
|
|
1715
|
-
${
|
|
1716
|
-
`);for(let e of r){let t=ze[e];process.stdout.write(` ${
|
|
1717
|
-
|
|
1718
|
-
${
|
|
1719
|
-
${
|
|
1720
|
-
${
|
|
1721
|
-
${
|
|
1722
|
-
${
|
|
1723
|
-
${
|
|
1724
|
-
|
|
1725
|
-
`,
|
|
1726
|
-
|
|
1727
|
-
${
|
|
1696
|
+
${X.bold(" Detected providers:")}
|
|
1697
|
+
`),e.forEach(t=>{t.installed&&console.log(` ${X.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function TC(r){let e=ze[r];if(!e.configDir)return!1;try{let t=Ss.join(e.configDir,"commands");await ks.mkdir(t,{recursive:!0});let{getPackageRoot:s}=await Promise.resolve().then(()=>(ut(),Kn)),n=s(),o=r==="claude"?"p.md":"p.toml",i=Ss.join(n,"templates","commands",o),a=Ss.join(t,o);return await C(i)?(await ks.copyFile(i,a),!0):!1}catch(t){return console.error(` ${X.yellow("\u26A0")} Failed to install ${r} router: ${k(t)}`),!1}}async function EC(r){let e=ze[r];if(!e.configDir)return!1;try{let t=r==="gemini"?Ss.join(e.configDir,"commands"):Ss.join(e.configDir,"commands","p");await ks.mkdir(t,{recursive:!0});let s=new Set(["p.md","p.toml"]),o=$s("commands/").filter(i=>i.endsWith(".md")).map(i=>i.replace("commands/","")).filter(i=>!s.has(i));for(let i of o){let a=ht(`commands/${i}`);a&&await ks.writeFile(Ss.join(t,i),a,"utf-8")}return!0}catch(t){return console.error(` ${X.yellow("\u26A0")} Failed to install ${r} subcommands: ${k(t)}`),!1}}async function CC(r){let e=ze[r];if(!e.configDir)return!1;try{await ks.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(ut(),Kn)),s=t(),n=r==="claude"?"CLAUDE.md":"GEMINI.md",o=Ss.join(s,"templates","global",n),i=Ss.join(e.configDir,n);if(await C(o)){let a=await ks.readFile(o,"utf-8");if(await C(i)){let c=await ks.readFile(i,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=c.substring(0,c.indexOf(u)),m=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await ks.writeFile(i,p+g+m)}else await ks.writeFile(i,`${c}
|
|
1698
|
+
|
|
1699
|
+
${a}`)}else await ks.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${X.yellow("\u26A0")} Failed to install ${r} config: ${k(t)}`),!1}}async function PC(r){let e=Ss.join(vy.homedir(),".prjct-cli","config","installed-editors.json"),t={version:ke,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:Ss.join(vy.homedir(),`.${r[0]}`,"commands")};await de(e,t)}function xC(r){console.log(`
|
|
1700
|
+
${X.green.bold(" \u2713 Setup complete!")}
|
|
1701
|
+
`),console.log(` ${X.dim("Configured providers:")}`),r.forEach(e=>{let t=ze[e];console.log(` ${X.green("\u2713")} ${t.displayName}`)}),console.log(`
|
|
1702
|
+
${X.bold("Next steps:")}
|
|
1703
|
+
|
|
1704
|
+
${X.cyan("1.")} Navigate to your project directory
|
|
1705
|
+
${X.cyan("2.")} Run ${X.bold("p. init")} to initialize prjct for that project
|
|
1706
|
+
${X.cyan("3.")} Start tracking with ${X.bold('p. task "your task"')}
|
|
1707
|
+
|
|
1708
|
+
${X.dim("Tips:")}
|
|
1709
|
+
${X.dim("\u2022")} Use ${X.bold("p. sync")} to analyze your codebase
|
|
1710
|
+
${X.dim("\u2022")} Use ${X.bold("p. done")} to complete tasks
|
|
1711
|
+
${X.dim("\u2022")} Use ${X.bold("p. ship")} to create PRs
|
|
1712
|
+
|
|
1713
|
+
${X.dim("Learn more: https://prjct.app/docs")}
|
|
1714
|
+
`)}async function jC(){bC();let r=await vC();console.log(`
|
|
1715
|
+
${X.cyan("Setting up...")}
|
|
1716
|
+
`);for(let e of r){let t=ze[e];process.stdout.write(` ${X.dim("\u2022")} ${t.displayName}... `);let s=await TC(e),n=await EC(e),o=await CC(e);console.log(s&&n&&o?X.green("\u2713"):s||o?X.yellow("partial"):X.yellow("skipped"))}await PC(r),xC(r)}var Jr,zr,Xr,Kr,Yr,kC,SC,Cy=S(()=>{"use strict";fs();lt();W();B();ut();Jr=X.rgb(180,180,175),zr=X.rgb(200,200,195),Xr=X.rgb(220,220,215),Kr=X.rgb(235,235,230),Yr=X.rgb(250,250,245),kC=`
|
|
1717
|
+
|
|
1718
|
+
${Jr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${zr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Xr(" \u2588\u2588\u2557")}${Kr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Yr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
|
|
1719
|
+
${Jr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${zr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Xr(" \u2588\u2588\u2551")}${Kr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${Yr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
|
|
1720
|
+
${Jr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${zr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Xr(" \u2588\u2588\u2551")}${Kr("\u2588\u2588\u2551 ")}${Yr(" \u2588\u2588\u2551 ")}
|
|
1721
|
+
${Jr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${zr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Xr("\u2588\u2588 \u2588\u2588\u2551")}${Kr("\u2588\u2588\u2551 ")}${Yr(" \u2588\u2588\u2551 ")}
|
|
1722
|
+
${Jr(" \u2588\u2588\u2551 ")}${zr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${Xr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Kr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${Yr(" \u2588\u2588\u2551 ")}
|
|
1723
|
+
${Jr(" \u255A\u2550\u255D ")}${zr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${Xr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${Kr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${Yr(" \u255A\u2550\u255D ")}
|
|
1724
|
+
|
|
1725
|
+
`,SC=` ${X.white("Context Layer for AI Agents")} ${X.dim(`v${ke}`)}
|
|
1726
|
+
|
|
1727
|
+
${X.dim(`Project context layer for AI coding agents.
|
|
1728
1728
|
Works with Claude Code, Gemini CLI, Codex, and more.`)}
|
|
1729
|
-
${
|
|
1730
|
-
`;l(
|
|
1731
|
-
`).filter(Boolean).map(c=>c.replace(/^\.\//,"")).filter(c=>c!==r);for(let c of a)t.push({file:c})}catch{}return t}async function
|
|
1729
|
+
${X.cyan("https://prjct.app")}
|
|
1730
|
+
`;l(bC,"showBanner");l(Ty,"showProviderSelection");l(vC,"selectProviders");l(TC,"installRouter");l(EC,"installSubcommands");l(CC,"installGlobalConfig");l(PC,"saveSetupConfig");l(xC,"showCompletion");l(jC,"runStart")});import jy from"node:fs/promises";import Hs from"node:path";async function Ho(r,e=process.cwd(),t={}){let s=Hs.isAbsolute(r)?r:Hs.join(e,r),n;try{n=await jy.readFile(s,"utf-8")}catch(g){if(O(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=Hs.extname(r).toLowerCase(),i=DC[o]||"unknown",a=IC[i]||[],c=await $C(n,a,s,e),u=[];t.reverse&&(u=await OC(r,e));let d;t.depth&&t.depth>0&&(d=await Ry(r,e,t.depth));let p=c.filter(g=>g.isExternal).length,m=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:p,internalImports:m,importedByCount:u.length}}}async function $C(r,e,t,s){let n=[],o=new Set;for(let i of e){i.pattern.lastIndex=0;let a;for(;(a=i.pattern.exec(r))!==null;){let c=a[i.sourceIndex];if(!c||o.has(c))continue;o.add(c);let u;if(i.namesIndex!==void 0){let m=a[i.namesIndex];m&&(u=m.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),p=null;d||(p=await MC(c,t,s)),n.push({source:c,resolved:p,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return n}async function MC(r,e,t){let s=Hs.dirname(e);if(r.startsWith("@/")){let o=Hs.join(t,"src",r.slice(2));return xy(o,t)}let n=Hs.resolve(s,r);return xy(n,t)}async function xy(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let s of t){let n=r+s;try{if((await jy.stat(n)).isFile())return Hs.relative(e,n)}catch{}}return null}async function OC(r,e){let t=[],s=Hs.basename(r,Hs.extname(r));try{let o=[`from ['"].*${s}['"]`,`from ['"]\\./${s}['"]`,`import\\(['"'].*${s}['"]`,`require\\(['"'].*${s}['"]`].join("|"),{stdout:i}=await F(`grep -r -l -E '${o}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),a=i.trim().split(`
|
|
1731
|
+
`).filter(Boolean).map(c=>c.replace(/^\.\//,"")).filter(c=>c!==r);for(let c of a)t.push({file:c})}catch{}return t}async function Ry(r,e,t,s=0,n=new Set){let o={file:r,imports:[],depth:s};if(s>=t||n.has(r))return o;n.add(r);let i=await Ho(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Ry(a.resolved,e,t,s+1,n);o.imports.push(c)}return o}var Py,RC,AC,IC,DC,Dd=S(()=>{"use strict";W();Je();Py=[{pattern:/import\s*\{([^}]+)\}\s*from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1},{pattern:/import\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isDefault:!0},{pattern:/import\s*\*\s*as\s+(\w+)\s+from\s*['"]([^'"]+)['"]/g,sourceIndex:2,namesIndex:1,isNamespace:!0},{pattern:/import\s*['"]([^'"]+)['"]/g,sourceIndex:1},{pattern:/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1},{pattern:/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,sourceIndex:1}],RC=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],AC=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],IC={typescript:Py,javascript:Py,python:RC,go:AC},DC={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(Ho,"analyzeImports");l($C,"extractImports");l(MC,"resolveImport");l(xy,"tryResolve");l(OC,"findImportedBy");l(Ry,"buildDependencyTree")});import Ay from"node:fs/promises";import bs from"node:path";async function $d(r,e=process.cwd()){let t=bs.isAbsolute(r)?r:bs.join(e,r),s;try{s=await Ay.readFile(t,"utf-8")}catch(m){if(O(m))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Dn("")};throw m}let n=bs.extname(r).toLowerCase(),o=Iy[n]||"unknown",i=await $n(r,e),a=await Ho(r,e),c=NC(s,o),u=i.signatures.filter(m=>m.exported).map(m=>({name:m.name,type:m.type,signature:m.signature,description:m.docstring?LC(m.docstring):void 0})),d=a.imports.filter(m=>!m.isExternal&&m.resolved).map(m=>m.resolved).slice(0,10),p=FC(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:ca(s,p)}}async function Dy(r,e=process.cwd(),t={}){let s=bs.isAbsolute(r)?r:bs.join(e,r),n=[];async function o(i){let a=await Ay.readdir(i,{withFileTypes:!0});for(let c of a){let u=bs.join(i,c.name),d=bs.relative(e,u);if(c.isDirectory()){if(c.name==="node_modules"||c.name===".git"||c.name.startsWith("."))continue;t.recursive&&await o(u)}else if(c.isFile()){let p=bs.extname(c.name).toLowerCase();if(Iy[p]){let m=await $d(d,e);n.push(m)}}}}return l(o,"processDir"),await o(s),n}function NC(r,e){let t=_C[e]||[],s=r.split(`
|
|
1732
1732
|
`);for(let o=0;o<Math.min(30,s.length);o++){let i=s[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<s.length&&a.start.test(s[u].trim());)c.push(s[u].trim().replace(a.start,"").trim()),u++;if(c.length>0)return c.slice(0,3).join(" ").trim()}else if(a.end){let c="",u=o;for(;u<s.length&&(c+=`${s[u]}
|
|
1733
1733
|
`,!a.end.test(s[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
|
|
1734
|
-
`).map(
|
|
1735
|
-
`)[0]||"";return`Module: ${
|
|
1736
|
-
`)[0].trim()}function
|
|
1737
|
-
`)}var
|
|
1734
|
+
`).map(p=>p.replace(/^\s*\*\s?/,"").trim()).filter(p=>p.length>0&&!p.startsWith("@"));if(d.length>0)return d.slice(0,2).join(" ").trim()}}if(i.length>0&&!i.startsWith("//")&&!i.startsWith("#")&&!i.startsWith("/*")&&!i.startsWith("*")&&!i.startsWith("'")&&!i.startsWith('"'))break}let n=r.split(`
|
|
1735
|
+
`)[0]||"";return`Module: ${bs.basename(n,bs.extname(n))}`}function LC(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
|
|
1736
|
+
`)[0].trim()}function FC(r,e,t){let s=[];if(s.push(`Purpose: ${r}`),s.push(""),e.length>0){s.push("Public API:");for(let n of e){let o=n.description?` - ${n.description}`:"";s.push(` ${n.type} ${n.name}: ${n.signature}${o}`)}s.push("")}return t.length>0&&s.push(`Dependencies: ${t.join(", ")}`),s.join(`
|
|
1737
|
+
`)}var _C,Iy,$y=S(()=>{"use strict";W();Dd();ua();la();_C={typescript:[{start:/\/\*\*/,end:/\*\//},{start:/\/\/\//,end:null,singleLine:!0}],javascript:[{start:/\/\*\*/,end:/\*\//}],python:[{start:/"""/,end:/"""/},{start:/'''/,end:/'''/}],go:[{start:/\/\//,end:null,singleLine:!0}],rust:[{start:/\/\/\//,end:null,singleLine:!0},{start:/\/\/!/,end:null,singleLine:!0}]},Iy={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l($d,"summarizeFile");l(Dy,"summarizeDirectory");l(NC,"extractFilePurpose");l(LC,"extractDescriptionFromDocstring");l(FC,"buildSummaryText")});var My={};ye(My,{runContextTool:()=>UC});async function UC(r,e,t){let s=Date.now(),[n,...o]=r;try{let i;switch(n){case"files":i=await HC(o,t);break;case"signatures":i=await WC(o,t);break;case"imports":i=await GC(o,t);break;case"recent":i=await qC(o,t);break;case"summary":i=await BC(o,t);break;case"help":return{tool:"error",result:{error:XC(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-s,c=VC(i),u=JC(i);return await zC(e,{tool:n,timestamp:v(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:k(i),code:"EXECUTION_ERROR"}}}}async function HC(r,e){let t={},s=[];for(let i=0;i<r.length;i++)r[i]==="--max"&&r[i+1]?t.maxFiles=parseInt(r[++i],10):r[i]==="--min-score"&&r[i+1]?t.minScore=parseFloat(r[++i]):r[i]==="--include-tests"?t.includeTests=!0:s.push(r[i]);let n=s.join(" ");return n?{tool:"files",result:await nn(n,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function WC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await $f(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=ku(c.map(p=>p.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(p=>p.signatures.map(m=>({...m,file:p.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await $n(t,e)}}async function GC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context imports <file> [--reverse] [--depth N]",code:"MISSING_ARG"}};let s={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?s.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(s.depth=parseInt(r[++o],10));return{tool:"imports",result:await Ho(t,e,s)}}async function qC(r,e){let t={};for(let n=0;n<r.length;n++)r[n]==="--branch"||r[n]==="-b"?t.branch=!0:r[n]==="--max"&&r[n+1]?t.maxFiles=parseInt(r[++n],10):/^\d+$/.test(r[n])&&(t.commits=parseInt(r[n],10));return{tool:"recent",result:await aa(e,t)}}async function BC(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context summary <file_or_directory> [--recursive]",code:"MISSING_ARG"}};let s=await import("node:fs/promises"),n=await import("node:path"),o=n.isAbsolute(t)?t:n.join(e,t);try{if((await s.stat(o)).isDirectory()){let c=await Dy(t,e,{recursive:r.includes("--recursive")||r.includes("-r")});return{tool:"summary",result:{file:t,purpose:`Directory with ${c.length} files`,publicAPI:c.flatMap(d=>d.publicAPI.map(p=>({...p,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:ku(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await $d(t,e)}}function VC(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.tokens.saved;case"files":return r.result.metrics.filesScanned*50-r.result.metrics.filesReturned*50;case"imports":return r.result.metrics.totalImports*20;case"recent":return r.result.metrics.totalFilesChanged*30;default:return 0}}function JC(r){if(r.tool==="error")return 0;switch(r.tool){case"signatures":case"summary":return r.result.metrics.compression;case"files":{let e=r.result.metrics.filesScanned,t=r.result.metrics.filesReturned;return e>0?(e-t)/e:0}default:return 0}}async function zC(r,e){try{await Zt.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function XC(){return`
|
|
1738
1738
|
Context Tools - Smart context filtering for AI agents
|
|
1739
1739
|
|
|
1740
1740
|
USAGE:
|
|
@@ -1795,7 +1795,7 @@ TOOLS:
|
|
|
1795
1795
|
OUTPUT:
|
|
1796
1796
|
All tools output JSON for easy parsing by AI agents.
|
|
1797
1797
|
Each output includes metrics showing token savings.
|
|
1798
|
-
`.trim()}var
|
|
1798
|
+
`.trim()}var Oy=S(()=>{"use strict";mo();W();K();Ao();Dd();hu();ua();$y();la();l(UC,"runContextTool");l(HC,"runFilesTool");l(WC,"runSignaturesTool");l(GC,"runImportsTool");l(qC,"runRecentTool");l(BC,"runSummaryTool");l(VC,"getTokensSaved");l(JC,"getCompressionRate");l(zC,"recordToolUsage");l(XC,"getHelpText")});var Fy={};ye(Fy,{hooksService:()=>sP});import nt from"node:fs/promises";import qe from"node:path";import qt from"chalk";function Ny(){return`#!/bin/sh
|
|
1799
1799
|
# prjct auto-sync hook (post-commit)
|
|
1800
1800
|
# Syncs project context after each commit
|
|
1801
1801
|
# Installed by: prjct hooks install
|
|
@@ -1816,7 +1816,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1816
1816
|
fi
|
|
1817
1817
|
|
|
1818
1818
|
exit 0
|
|
1819
|
-
`}function
|
|
1819
|
+
`}function Ly(){return`#!/bin/sh
|
|
1820
1820
|
# prjct auto-sync hook (post-checkout)
|
|
1821
1821
|
# Syncs project context after branch switch
|
|
1822
1822
|
# Installed by: prjct hooks install
|
|
@@ -1848,7 +1848,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1848
1848
|
fi
|
|
1849
1849
|
|
|
1850
1850
|
exit 0
|
|
1851
|
-
`}async function
|
|
1851
|
+
`}async function Md(r){let e=[];return(await C(qe.join(r,"lefthook.yml"))||await C(qe.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await C(qe.join(r,".husky"))||await C(qe.join(r,".husky","_")))&&e.push("husky"),await C(qe.join(r,".git"))&&e.push("direct"),e}function _y(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function KC(r,e){let t=await C(qe.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",s=qe.join(r,t),n=await nt.readFile(s,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(n.includes(a))continue;let c=`
|
|
1852
1852
|
${i}:
|
|
1853
1853
|
commands:
|
|
1854
1854
|
${a}:
|
|
@@ -1859,37 +1859,37 @@ ${i}:
|
|
|
1859
1859
|
${a}:
|
|
1860
1860
|
run: prjct sync --quiet --yes
|
|
1861
1861
|
fail_text: "prjct sync failed (non-blocking)"`):n=`${n.trimEnd()}
|
|
1862
|
-
${c}`}return await nt.writeFile(s,n,"utf-8"),!0}async function
|
|
1862
|
+
${c}`}return await nt.writeFile(s,n,"utf-8"),!0}async function YC(r,e){let t=qe.join(r,".husky");for(let s of e){let n=qe.join(t,s),o=s==="post-commit"?Ny():Ly();if(await C(n)){if((await nt.readFile(n,"utf-8")).includes("prjct sync"))continue;await nt.appendFile(n,`
|
|
1863
1863
|
# prjct auto-sync
|
|
1864
1864
|
prjct sync --quiet --yes &
|
|
1865
|
-
`)}else await nt.writeFile(n,o,{mode:493})}return!0}async function
|
|
1865
|
+
`)}else await nt.writeFile(n,o,{mode:493})}return!0}async function QC(r,e){let t=qe.join(r,".git","hooks");await C(t)||await nt.mkdir(t,{recursive:!0});for(let s of e){let n=qe.join(t,s),o=s==="post-commit"?Ny():Ly();if(await C(n)){if((await nt.readFile(n,"utf-8")).includes("prjct sync"))continue;await nt.appendFile(n,`
|
|
1866
1866
|
# prjct auto-sync
|
|
1867
1867
|
${o.split(`
|
|
1868
1868
|
`).slice(1).join(`
|
|
1869
|
-
`)}`)}else await nt.writeFile(n,o,{mode:493})}return!0}async function
|
|
1870
|
-
`,"utf-8"),!0}async function
|
|
1869
|
+
`)}`)}else await nt.writeFile(n,o,{mode:493})}return!0}async function ZC(r){let e=await C(qe.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=qe.join(r,e);if(!await C(t))return!1;let s=await nt.readFile(t,"utf-8");return s=s.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),s=s.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await nt.writeFile(t,`${s.trimEnd()}
|
|
1870
|
+
`,"utf-8"),!0}async function eP(r){let e=qe.join(r,".husky");for(let t of["post-commit","post-checkout"]){let s=qe.join(e,t);if(!await C(s))continue;let n=await nt.readFile(s,"utf-8");if(!n.includes("prjct sync"))continue;let o=n.split(`
|
|
1871
1871
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1872
|
-
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await nt.unlink(s):await nt.writeFile(s,o,{mode:493})}return!0}async function
|
|
1872
|
+
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await nt.unlink(s):await nt.writeFile(s,o,{mode:493})}return!0}async function tP(r){let e=qe.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let s=qe.join(e,t);if(!await C(s))continue;let n=await nt.readFile(s,"utf-8");if(n.includes("prjct sync"))if(n.includes("Installed by: prjct hooks install"))await nt.unlink(s);else{let o=n.split(`
|
|
1873
1873
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1874
|
-
`);await nt.writeFile(s,o,{mode:493})}}return!0}var
|
|
1875
|
-
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${s.length} uncommitted change${s.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await ss.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await
|
|
1876
|
-
\u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let s=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(
|
|
1877
|
-
${
|
|
1878
|
-
`)}function
|
|
1879
|
-
`)}function
|
|
1880
|
-
`)}function
|
|
1874
|
+
`);await nt.writeFile(s,o,{mode:493})}}return!0}var Od,sP,Uy=S(()=>{"use strict";Te();ee();W();B();Fe();l(Ny,"getPostCommitScript");l(Ly,"getPostCheckoutScript");l(Md,"detectHookManagers");l(_y,"selectStrategy");l(KC,"installLefthook");l(YC,"installHusky");l(QC,"installDirect");l(ZC,"uninstallLefthook");l(eP,"uninstallHusky");l(tP,"uninstallDirect");Od=class{static{l(this,"HooksService")}async install(e,t={}){let s=t.hooks||["post-commit","post-checkout"],n=await Md(e);if(n.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||_y(n);try{let i=!1;switch(o){case"lefthook":i=await KC(e,s);break;case"husky":i=await YC(e,s);break;case"direct":i=await QC(e,s);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:s,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?s:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:k(i)}}}async uninstall(e){try{let s=(await this.getHookConfig(e))?.strategy||"direct",n=!1;switch(s){case"lefthook":n=await ZC(e);break;case"husky":n=await eP(e);break;case"direct":n=await tP(e);break}return n&&await this.saveHookConfig(e,{enabled:!1,strategy:s,hooks:[]}),{success:n}}catch(t){return{success:!1,error:k(t)}}}async status(e){let t=await Md(e),s=await this.getHookConfig(e),n=["post-commit","post-checkout"],o=await Promise.all(n.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,s?.strategy||null),path:await this.getHookPath(e,i,s?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:s?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await $.getProjectId(e))return console.error('No prjct project found. Run "prjct init" first.'),1;switch(t){case"install":return this.runInstall(e);case"uninstall":return this.runUninstall(e);case"status":return this.runStatus(e);default:return this.runStatus(e)}}async runInstall(e){f.start(),f.section("Git Hooks Installation");let t=await Md(e),s=_y(t);console.log(` Strategy: ${qt.cyan(s)}`),console.log(` Hooks: ${qt.dim("post-commit, post-checkout")}`),console.log("");let n=await this.install(e,{strategy:s});if(n.success){f.done(`Hooks installed via ${n.strategy}`),console.log("");for(let o of n.hooksInstalled)console.log(` ${qt.green("\u2713")} ${o}`);console.log(""),console.log(qt.dim(" Context will auto-sync on commit and branch switch.")),console.log(qt.dim(" Remove with: prjct hooks uninstall"))}else f.fail(n.error||"Failed to install hooks");return console.log(""),f.end(),n.success?0:1}async runUninstall(e){f.start(),f.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?f.done("Hooks removed"):f.fail(t.error||"Failed to remove hooks"),console.log(""),f.end(),t.success?0:1}async runStatus(e){f.start(),f.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${qt.green("Active")}`),console.log(` Strategy: ${qt.cyan(t.strategy)}`)):console.log(` Status: ${qt.dim("Not installed")}`),console.log("");for(let s of t.hooks){let n=s.installed?qt.green("\u2713"):qt.dim("\u25CB"),o=s.installed?s.name:qt.dim(s.name);console.log(` ${n} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${qt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(qt.dim(" Install with: prjct hooks install"))),console.log(""),f.end(),0}async isHookInstalled(e,t,s){if(s==="lefthook"){let o=await C(qe.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=qe.join(e,o);return await C(i)?(await nt.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(s==="husky"){let o=qe.join(e,".husky",t);return await C(o)?(await nt.readFile(o,"utf-8")).includes("prjct sync"):!1}let n=qe.join(e,".git","hooks",t);return await C(n)?(await nt.readFile(n,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,s){return s==="lefthook"?await C(qe.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":s==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await $.getProjectId(e);if(!t)return null;try{let s=E.getDoc(t,"project");return s&&s.hooks||null}catch{return null}}async saveHookConfig(e,t){let s=await $.getProjectId(e);if(s)try{let n=E.getDoc(s,"project")||{};n.hooks=t,E.setDoc(s,"project",n)}catch{}}},sP=new Od});var Wy={};ye(Wy,{DoctorService:()=>Fa,doctorService:()=>rP});import{execSync as _d}from"node:child_process";import nP from"node:fs/promises";import Hy from"node:path";import mn from"chalk";var Fa,rP,Gy=S(()=>{"use strict";Te();ve();fr();vt();B();jo();Fe();ut();pr();Fa=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await $.getProjectId(e),this.projectId&&(this.globalPath=A.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),s=await this.checkProject(),n=this.generateRecommendations(t,s),o=[...t,...s].some(a=>a.status==="error"&&!a.optional),i=[...t,...s].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:s,recommendations:n,hasErrors:o,hasWarnings:i}}async run(e=process.cwd()){let t=await this.check(e);return this.printHeader(),this.printSection("System Tools",t.tools),this.printSection("Project Status",t.project),t.recommendations.length>0&&this.printRecommendations(t.recommendations),this.printSummary(t),t.hasErrors?1:0}async checkTools(){let e=[];return e.push(this.checkCommand("git","git --version",/git version ([\d.]+)/,!1)),e.push(this.checkCommand("node","node --version",/v([\d.]+)/,!1)),e.push(this.checkCommand("bun","bun --version",/([\d.]+)/,!0)),e.push(this.checkCommand("gh","gh --version",/gh version ([\d.]+)/,!0,"needed for PR commands")),e.push(this.checkCommand("claude","claude --version",/claude ([\d.]+)/,!0,"Anthropic Claude Code CLI")),e.push(this.checkCommand("gemini","gemini --version",/gemini ([\d.]+)/,!0,"Google Gemini CLI")),e}checkCommand(e,t,s,n,o){try{let a=_d(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(s),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:n}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:n}}}async checkProject(){let e=[];return e.push(await this.checkPrjctConfig()),e.push(await this.checkClaudeMd()),e.push(await this.checkGitRepo()),e.push(await this.checkStateFile()),e.push(await this.checkContext7()),e.push(await this.checkCodexPRouter()),e.push(await this.checkMcpProvider("jira")),e.push(await this.checkMcpProvider("linear")),e}async checkPrjctConfig(){let e=Hy.join(this.projectPath,".prjct","prjct.config.json");return await C(e)?{name:"prjct config",status:"ok",message:"initialized"}:{name:"prjct config",status:"error",message:'not initialized - run "prjct init"'}}async checkClaudeMd(){if(!this.globalPath)return{name:"CLAUDE.md",status:"warn",message:"project not initialized"};let e=Hy.join(this.globalPath,"context","CLAUDE.md");try{let t=await nP.stat(e),s=Date.now()-t.mtimeMs,n=Math.floor(s/(1e3*60*60)),o=Math.floor(n/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:n>0?i=`${n} hour${n>1?"s":""} ago`:i="recently",n>24?{name:"CLAUDE.md",status:"warn",message:`stale (last sync: ${i})`}:{name:"CLAUDE.md",status:"ok",message:`synced ${i}`}}catch{return{name:"CLAUDE.md",status:"error",message:'not found - run "prjct sync"'}}}async checkGitRepo(){try{_d("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=_d("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let s=e.trim().split(`
|
|
1875
|
+
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${s.length} uncommitted change${s.length>1?"s":""}`}}return{name:"git repo",status:"ok",message:"clean"}}catch{return{name:"git repo",status:"warn",message:"not a git repository"}}}async checkStateFile(){if(!this.globalPath||!this.projectId)return{name:"task state",status:"warn",message:"project not initialized"};try{let e=await L.read(this.projectId);return e.currentTask?{name:"task state",status:"ok",message:`active: ${e.currentTask.description?.slice(0,30)}...`}:{name:"task state",status:"ok",message:"no active task"}}catch{return{name:"task state",status:"ok",message:"no state data (normal for new projects)",optional:!0}}}async checkContext7(){try{let e=await ss.verify();return e.installed?e.verified?{name:"context7 mcp",status:"ok",message:"ready"}:{name:"context7 mcp",status:"error",message:e.message||"configured but verification failed"}:{name:"context7 mcp",status:"error",message:'not configured - run "prjct start"'}}catch(e){return{name:"context7 mcp",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkCodexPRouter(){try{let e=await gr({autoRepair:!0});return e.installed?e.verified?{name:"codex p-router",status:"ok",message:`ready (${e.templateSource||"local-dev"})`}:{name:"codex p-router",status:"error",message:e.message||"router verification failed"}:{name:"codex p-router",status:"ok",message:"codex not detected (check skipped)",optional:!0}}catch(e){return{name:"codex p-router",status:"error",message:`check failed: ${e instanceof Error?e.message:"unknown error"}`}}}async checkMcpProvider(e){try{if(!(await hf(e)).configured)return{name:`${e} mcp`,status:"ok",message:"not configured (optional)",optional:!0};let s=await yf(e);if(!s.valid){let o=s.autoFixed?" (auto-fixed)":"";return{name:`${e} mcp`,status:"warn",message:`config issues${o}: ${s.issues.join("; ")}`,optional:!0}}let n=await wf(e);if(!n.ready){let o=n.cleaned?"corrupted tokens cleaned \u2014 re-run OAuth":n.migrated?"tokens migrated \u2014 restart AI client":"OAuth tokens missing/invalid";return{name:`${e} mcp`,status:"warn",message:o,optional:!0}}return{name:`${e} mcp`,status:"ok",message:`healthy${n.validated?" (validated)":""}`,optional:!0}}catch(t){return{name:`${e} mcp`,status:"error",message:`check failed: ${t instanceof Error?t.message:"unknown error"}`,optional:!0}}}generateRecommendations(e,t){let s=[];e.find(m=>m.name==="gh"&&m.status==="error")&&s.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(m=>m.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&s.push('Run "prjct sync" to update context');let i=t.find(m=>m.name==="prjct config");i?.status==="error"&&s.push('Run "prjct init" to initialize this project'),t.find(m=>m.name==="CLAUDE.md"&&m.status==="error")&&!i?.status?.includes("error")&&s.push('Run "prjct sync" to generate context files');let c=t.find(m=>m.name==="context7 mcp");c&&c.status!=="ok"&&s.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(m=>m.name==="codex p-router");u&&u.status==="error"&&s.push('Run "prjct start" or "prjct setup" to repair Codex p. router');let d=t.find(m=>m.name==="jira mcp");d&&d.status!=="ok"&&s.push('Run "prjct jira setup" to repair Jira MCP configuration');let p=t.find(m=>m.name==="linear mcp");return p&&p.status!=="ok"&&s.push('Run "prjct linear setup" to repair Linear MCP configuration'),s}printHeader(){f.section(`prjct doctor v${ke}`)}printSection(e,t){f.section(e);let s=t.map(n=>{let o=this.getStatusIcon(n.status,n.optional),i=n.name.padEnd(14),a=n.version||n.message||"",c=n.optional&&n.status==="error"?mn.dim(" (optional)"):"";return`${o} ${i} ${mn.dim(a)}${c}`});for(let n of s)console.log(` ${n}`)}printRecommendations(e){f.section("Recommendations"),f.list(e,{bullet:mn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(mn.dim("\u2500".repeat(40))),e.hasErrors?f.fail("Some required checks failed"):e.hasWarnings?f.warn("All required checks passed (some warnings)"):f.done("All checks passed"),console.log("")}getStatusIcon(e,t){switch(e){case"ok":return mn.green("\u2713");case"warn":return mn.yellow("\u26A0");case"error":return t?mn.dim("\u25CB"):mn.red("\u2717")}}},rP=new Fa});var qy={};ye(qy,{WatchService:()=>Ua,watchService:()=>lP});import oP from"node:path";import kt from"chalk";import iP from"chokidar";var aP,cP,Ua,lP,By=S(()=>{"use strict";Te();W();K();Yi();aP=["package.json","package-lock.json","bun.lockb","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.*.json",".env",".env.*","Cargo.toml","go.mod","pyproject.toml","requirements.txt","src/**/*.ts","src/**/*.tsx","src/**/*.js","src/**/*.jsx","lib/**/*.ts","core/**/*.ts","app/**/*.ts","app/**/*.tsx","pages/**/*.ts","pages/**/*.tsx"],cP=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Ua=class{static{l(this,"WatchService")}watcher=null;projectPath="";projectId=null;debounceTimer=null;lastSyncTime=0;pendingChanges=new Set;options={debounceMs:2e3,minIntervalMs:3e4,verbose:!1,quiet:!1};isRunning=!1;syncCount=0;sigintHandler=null;sigtermHandler=null;async start(e=process.cwd(),t={}){return this.projectPath=e,this.options={...this.options,...t},this.projectId=await $.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=iP.watch(aP,{cwd:this.projectPath,ignored:cP,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",s=>this.handleChange("add",s)).on("change",s=>this.handleChange("change",s)).on("unlink",s=>this.handleChange("unlink",s)).on("error",s=>this.handleError(s)),this.sigintHandler&&process.off("SIGINT",this.sigintHandler),this.sigtermHandler&&process.off("SIGTERM",this.sigtermHandler),this.sigintHandler=()=>this.stop(),this.sigtermHandler=()=>this.stop(),process.on("SIGINT",this.sigintHandler),process.on("SIGTERM",this.sigtermHandler),{success:!0}):{success:!1,error:'No prjct project. Run "prjct init" first.'}}async stop(){this.options.quiet||(console.log(""),console.log(kt.dim(`
|
|
1876
|
+
\u{1F44B} Stopped watching (${this.syncCount} syncs performed)`))),this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null),this.watcher&&(await this.watcher.close(),this.watcher=null),this.sigintHandler&&(process.off("SIGINT",this.sigintHandler),this.sigintHandler=null),this.sigtermHandler&&(process.off("SIGTERM",this.sigtermHandler),this.sigtermHandler=null),this.pendingChanges.clear(),this.isRunning=!1,process.exit(0)}handleChange(e,t){if(this.pendingChanges.add(t),this.options.verbose&&!this.options.quiet){let s=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(kt.dim(` ${s} ${t}`))}this.scheduleSyncIfNeeded()}scheduleSyncIfNeeded(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{let t=Date.now()-this.lastSyncTime;if(t<this.options.minIntervalMs&&this.lastSyncTime>0){let s=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(kt.dim(` \u23F3 Rate limited, waiting ${Math.round(s/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),s);return}await this.performSync()},this.options.debounceMs)}async performSync(){let e=Array.from(this.pendingChanges);if(this.pendingChanges.clear(),e.length===0)return;let t=v().split("T")[1].split(".")[0];if(!this.options.quiet){let s=e.length===1?e[0]:`${e.length} files`;console.log(`
|
|
1877
|
+
${kt.dim(`[${t}]`)} ${kt.cyan("\u27F3")} ${s} changed \u2192 syncing...`)}try{let s=await Ns.sync(this.projectPath,{changedFiles:e});this.lastSyncTime=Date.now(),this.syncCount++,s.success?this.options.quiet||console.log(`${kt.dim(`[${t}]`)} ${kt.green("\u2713")} Synced`):console.error(`${kt.dim(`[${t}]`)} ${kt.red("\u2717")} Sync failed: ${s.error}`)}catch(s){console.error(`${kt.dim(`[${t}]`)} ${kt.red("\u2717")} Error: ${k(s)}`)}}handleError(e){console.error(kt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(kt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(kt.dim(` Project: ${oP.basename(this.projectPath)}`)),console.log(kt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(kt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(kt.dim(" Press Ctrl+C to stop")),console.log("")}},lP=new Ua});var Jy={};ye(Jy,{getHelp:()=>hP});import Y from"chalk";function dP(){let r=[];r.push(""),r.push(`${Y.cyan.bold("prjct")} v${ke} - Context layer for AI coding agents`),r.push(Y.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(Y.bold("QUICK START")),r.push(Y.dim("\u2500".repeat(60))),r.push(` ${Y.green("1.")} prjct start ${Y.dim("# Configure AI providers")}`),r.push(` ${Y.green("2.")} cd my-project && prjct init`),r.push(` ${Y.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${Y.green("4.")} p. sync ${Y.dim("# Analyze project")}`),r.push(""),r.push(Y.bold("TERMINAL COMMANDS")),r.push(Y.dim("\u2500".repeat(60)));for(let t of Vy){let s=`prjct ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(""),r.push(`${Y.bold("AI AGENT COMMANDS")} ${Y.dim("(inside Claude/Gemini/Cursor)")}`),r.push(Y.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${Y.dim("\u2500".repeat(56))}`);let e=qr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let s=`p. ${t.name}`.padEnd(22);r.push(` ${s} ${t.description}`)}r.push(` ${Y.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(Y.bold("FLAGS")),r.push(Y.dim("\u2500".repeat(60)));for(let t of uP)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(Y.bold("MORE INFO")),r.push(Y.dim("\u2500".repeat(60))),r.push(` Documentation: ${Y.cyan("https://prjct.app")}`),r.push(` GitHub: ${Y.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
|
|
1878
|
+
`)}function mP(r){let e=Vy.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${Y.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(Y.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(Y.bold("OPTIONS"));for(let s of e.options)t.push(` ${s}`);t.push("")}if(e.subcommands){t.push(Y.bold("SUBCOMMANDS"));for(let s of e.subcommands)t.push(` ${s}`);t.push("")}return t.join(`
|
|
1879
|
+
`)}function pP(r){let e=qr.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${Y.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(Y.bold("USAGE")),e.usage?.claude&&t.push(` Claude/Gemini: ${e.usage.claude.replace("/p:","p. ")}`),e.usage?.terminal&&t.push(` Terminal: ${e.usage.terminal}`),t.push(""),e.params&&(t.push(Y.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(Y.bold("FEATURES"));for(let n of e.features)t.push(` \u2022 ${n}`);t.push("")}e.blockingRules&&(t.push(Y.bold("REQUIREMENTS")),t.push(` ${Y.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let s=_o[e.group];return s&&(t.push(Y.dim(`Category: ${s.title}`)),e.isOptional&&t.push(Y.dim("This is an optional command.")),t.push("")),t.join(`
|
|
1880
|
+
`)}function gP(r){let e=mP(r);if(e)return e;let t=pP(r);return t||`
|
|
1881
1881
|
${Y.yellow(`Command '${r}' not found.`)}
|
|
1882
1882
|
|
|
1883
1883
|
Run 'prjct help' to see all available commands.
|
|
1884
|
-
`}function
|
|
1885
|
-
`)}function gP(r){return r?r==="commands"||r==="all"?Ky():zy(r):By()}var qy,mP,Yy=S(()=>{"use strict";Nd();ut();qy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],mP=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(By,"formatMainHelp");l(Vy,"formatTerminalCommandHelp");l(Jy,"formatAgentCommandHelp");l(zy,"formatCommandHelp");l(Ky,"formatCommandList");l(gP,"getHelp")});var Qy=aw((QV,fP)=>{fP.exports={name:"prjct-cli",version:"1.56.2",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"^1.0.0","@hono/node-server":"^1.13.7","@modelcontextprotocol/sdk":"^1.28.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=18.0.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var TP={};import Zy from"node:os";import Ba from"node:path";import Be from"chalk";async function hP(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>cw(Qy()));await bP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(vP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=H.getByName(r);if(!s){let p=wP(r),g=p?`Did you mean 'prjct ${p}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(jn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let p=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:p}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:n,options:o}=SP(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=yP(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await $.getProjectId(process.cwd()),c&&(await Ys.expireIfStale(c),await Ys.touch(c))}catch{}let d=new un,m;if(r==="parallel"&&n[0]==="spawn"&&n.length>1){let p=n.slice(1).join(" ");m=await d.parallelSpawn(p,process.cwd(),{md:o.md===!0})}else if(r==="parallel"&&n[0]==="batch"){let p=n.slice(1);p.length===0&&(f.failWithHint({message:"No tasks provided",hint:'Usage: prjct parallel batch "task1" "task2" "task3"'}),process.exit(1)),m=await d.parallelBatch(p,process.cwd())}else if(r==="design"){let p=n.join(" ");m=await d.design(p,o)}else if(r==="analyze")m=await d.analyze(o);else if(r==="cleanup")m=await d.cleanup(o);else if(r==="cleanup-projects")m=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")m=await d.setup(o);else if(r==="update")m=await d.update(o);else{let p=n.join(" ")||null,g=o.md===!0,b={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth"),parallel:l(h=>d.parallel(h,process.cwd(),{md:g,max:o.max?Number(o.max):void 0,fromQueue:o["from-queue"]===!0,fromLinear:o["from-linear"]===!0,fromJira:o["from-jira"]===!0,includeBacklog:o["include-backlog"]===!0}),"parallel"),worktree:l(h=>d.parallel(h,process.cwd(),{md:g}),"worktree"),conductor:l(h=>d.parallel(h,process.cwd(),{md:g}),"conductor"),obsidian:l(h=>d.obsidian(h,process.cwd()),"obsidian")}[r];if(b)m=await b(p);else throw new Error(`Command '${r}' has no handler`)}if(c){let p=Date.now()-u;try{await Ys.trackCommand(c,r,p)}catch{}try{await Rn.recordTiming(c,"command_duration",p,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await Rn.recordTiming(c,"startup_time",w)}await Rn.recordMemory(c,{command:r})}catch{}}m?.message&&console.log(m.message),t||f.end(),process.exit(m?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(rc(s)),t||f.end(),process.exit(1)}}function yP(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return jn("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function wP(r){let e=H.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=kP(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function kP(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function SP(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function bP(r){let e=await Cs(),t=Ba.join(Zy.homedir(),".claude","commands","p.md"),s=Ba.join(Zy.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([C(t),C(s),C(Ba.join(process.cwd(),".cursor","commands","sync.md")),C(Ba.join(process.cwd(),".cursor"))]),c=await Vn();if(console.log(`
|
|
1884
|
+
`}function fP(){let r=[];r.push(""),r.push(Y.cyan.bold("All Commands")),r.push("");let e=Object.entries(_o).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=qr.filter(o=>o.group===t);if(n.length!==0){r.push(`${Y.bold(s.title)} ${Y.dim(`(${n.length} commands)`)}`),r.push(Y.dim(s.description)),r.push("");for(let o of n){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(Y.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
|
|
1885
|
+
`)}function hP(r){return r?r==="commands"||r==="all"?fP():gP(r):dP()}var Vy,uP,zy=S(()=>{"use strict";jd();ut();Vy=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],uP=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];l(dP,"formatMainHelp");l(mP,"formatTerminalCommandHelp");l(pP,"formatAgentCommandHelp");l(gP,"formatCommandHelp");l(fP,"formatCommandList");l(hP,"getHelp")});var Xy=rw((qV,yP)=>{yP.exports={name:"prjct-cli",version:"1.56.10",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@hono/node-server":"1.13.7","@modelcontextprotocol/sdk":"1.28.0","better-sqlite3":"12.6.2",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1",hono:"4.11.3","jsonc-parser":"3.3.1",zod:"3.24.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/better-sqlite3":"7.6.13","@types/bun":"latest","@types/chokidar":"2.1.7",esbuild:"0.25.0",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.22.2"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var CP={};import Ky from"node:os";import Ha from"node:path";import Be from"chalk";async function wP(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>ow(Xy()));await TP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(EP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=H.getByName(r);if(!s){let m=SP(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(ho("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:n,options:o}=vP(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=kP(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await $.getProjectId(process.cwd()),c&&(await Qs.expireIfStale(c),await Qs.touch(c))}catch{}let d=new ln,p;if(r==="parallel"&&n[0]==="spawn"&&n.length>1){let m=n.slice(1).join(" ");p=await d.parallelSpawn(m,process.cwd(),{md:o.md===!0})}else if(r==="parallel"&&n[0]==="batch"){let m=n.slice(1);m.length===0&&(f.failWithHint({message:"No tasks provided",hint:'Usage: prjct parallel batch "task1" "task2" "task3"'}),process.exit(1)),p=await d.parallelBatch(m,process.cwd())}else if(r==="design"){let m=n.join(" ");p=await d.design(m,o)}else if(r==="analyze")p=await d.analyze(o);else if(r==="cleanup")p=await d.cleanup(o);else if(r==="cleanup-projects")p=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")p=await d.setup(o);else if(r==="update")p=await d.update(o);else{let m=n.join(" ")||null,g=o.md===!0,b={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth"),parallel:l(h=>d.parallel(h,process.cwd(),{md:g,max:o.max?Number(o.max):void 0,fromQueue:o["from-queue"]===!0,fromLinear:o["from-linear"]===!0,fromJira:o["from-jira"]===!0,includeBacklog:o["include-backlog"]===!0}),"parallel"),worktree:l(h=>d.parallel(h,process.cwd(),{md:g}),"worktree"),conductor:l(h=>d.parallel(h,process.cwd(),{md:g}),"conductor"),obsidian:l(h=>d.obsidian(h,process.cwd()),"obsidian")}[r];if(b)p=await b(m);else throw new Error(`Command '${r}' has no handler`)}if(c){let m=Date.now()-u;try{await Qs.trackCommand(c,r,m)}catch{}try{await xn.recordTiming(c,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await xn.recordTiming(c,"startup_time",w)}await xn.recordMemory(c,{command:r})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(ec(s)),t||f.end(),process.exit(1)}}function kP(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return ho("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function SP(r){let e=H.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=bP(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function bP(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function vP(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function TP(r){let e=await Ps(),t=Ha.join(Ky.homedir(),".claude","commands","p.md"),s=Ha.join(Ky.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([C(t),C(s),C(Ha.join(process.cwd(),".cursor","commands","sync.md")),C(Ha.join(process.cwd(),".cursor"))]),c=await Bn();if(console.log(`
|
|
1886
1886
|
${Be.cyan("p/")} prjct v${r}
|
|
1887
1887
|
${Be.dim("Context layer for AI coding agents")}
|
|
1888
1888
|
|
|
1889
1889
|
${Be.dim("Providers:")}`),e.claude.installed){let u=n?Be.green("\u2713 ready"):Be.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${Be.dim(d)}`)}else console.log(` Claude Code ${Be.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?Be.green("\u2713 ready"):Be.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${Be.dim(d)}`)}else console.log(` Gemini CLI ${Be.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?Be.green("\u2713 ready"):Be.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${Be.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${Be.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${Be.green("\u2713 ready")} ${Be.dim("(use /sync, /task)")}`:a?` Cursor IDE ${Be.yellow("\u25CF detected")} ${Be.dim("(run prjct init)")}`:` Cursor IDE ${Be.dim("\u25CB no .cursor/ folder")}`),console.log(`
|
|
1890
1890
|
${Be.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
|
|
1891
1891
|
${Be.cyan("https://prjct.app")}
|
|
1892
|
-
`)}function
|
|
1892
|
+
`)}function EP(){console.log(`
|
|
1893
1893
|
prjct - Context layer for AI coding agents
|
|
1894
1894
|
Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
|
|
1895
1895
|
|
|
@@ -1948,7 +1948,7 @@ MORE INFO
|
|
|
1948
1948
|
---------
|
|
1949
1949
|
Documentation: https://prjct.app
|
|
1950
1950
|
GitHub: https://github.com/jlopezlira/prjct-cli
|
|
1951
|
-
`)}var
|
|
1951
|
+
`)}var Yy=S(()=>{"use strict";xd();Do();Id();lt();Te();Ti();vi();W();ki();B();Fe();l(wP,"main");l(kP,"validateCommandParams");l(SP,"findClosestCommand");l(bP,"editDistance");l(vP,"parseCommandArgs");l(TP,"displayVersion");l(EP,"displayHelp");wP().catch(r=>{console.error("Fatal error:",k(r)),process.env.DEBUG&&console.error(ec(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var Qr=process.argv.slice(2),Nd=Qr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),PP=new Set(["daemon","stop","restart","start","setup","update","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","jira","help","-h","--help","version","-v","--version"]);if(Nd&&!PP.has(Nd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Wo(),Fd)),t=e.socket();if(r.existsSync(t)){let{sendRequest:s}=await Promise.resolve().then(()=>(Ts(),vs)),n=await import("node:crypto"),o=[],i={};for(let a=0;a<Qr.length;a++){let c=Qr[a];if(c.startsWith("--")){let u=c.slice(2);if(u.includes("=")){let d=u.indexOf("=");i[u.slice(0,d)]=u.slice(d+1)}else a+1<Qr.length&&!Qr[a+1].startsWith("--")?i[u]=Qr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await s({id:n.randomUUID(),command:Nd,args:o,options:i,cwd:process.cwd(),perfStartNs:globalThis.__perfStartNs?.toString()});a.stdout&&console.log(a.stdout),a.stderr&&console.error(a.stderr),process.exit(a.exitCode)}catch{}}}async function xP(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:s}=await Promise.resolve().then(()=>(lt(),Nt)),n=(await Promise.resolve().then(()=>(Te(),hm))).default,o=(await Promise.resolve().then(()=>(si(),wm))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(Kc(),Zm)),{fileExists:c}=await Promise.resolve().then(()=>(B(),_t)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(oc(),sm)),{VERSION:d}=await Promise.resolve().then(()=>(ut(),Kn));async function p(){let T=r.homedir(),I=await s();if(I.claude.installed){let M=e.join(T,".claude","CLAUDE.md");try{if(!(await import("node:fs/promises").then(j=>j.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}if(I.gemini.installed){let M=e.join(T,".gemini","GEMINI.md");try{if(!(await import("node:fs/promises").then(j=>j.readFile(M,"utf-8"))).includes("prjct:start"))return!1}catch{return!1}}return!I.claude.installed&&!I.gemini.installed,!0}l(p,"checkRoutersInstalled");let m=process.argv.slice(2),g=m.findIndex(T=>T==="--quiet"||T==="-q"),w=g!==-1;if(w){m.splice(g,1);let{setQuietMode:T}=await Promise.resolve().then(()=>(Fe(),ip));T(!0)}let b=m.indexOf("--refresh"),h=b!==-1;h&&(m.splice(b,1),await u());async function x(T){let I=Date.now();try{let M=await n.getProjectId(process.cwd());if(M){let{sessionTracker:y}=await Promise.resolve().then(()=>(vi(),lp));return await y.expireIfStale(M),await y.touch(M),()=>{let j=Date.now()-I;y.trackCommand(M,T,j).catch(()=>{}),Promise.resolve().then(()=>(Ti(),dp)).then(({performanceTracker:D})=>{D.recordTiming(M,"command_duration",j,{command:T}).catch(()=>{}),D.recordMemory(M,{command:T}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(x,"trackSession"),m[0]==="daemon"){let T=m[1]||"status";if(T==="start"){let{isDaemonRunning:I,spawnDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(await I())console.log("Daemon is already running."),process.exitCode=0;else if(m.includes("--foreground")||m.includes("-f")){let{startDaemon:j}=await Promise.resolve().then(()=>(by(),Sy)),D=parseInt(m.find(Q=>Q.startsWith("--port="))?.split("=")[1]||"",10)||void 0,G=m.includes("--no-http");await j({port:D,noHttp:G,foreground:!0})}else await M()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(T==="stop"){let{isDaemonRunning:I,stopDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(await I()){let y=await M();console.log(y?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=y?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(T==="status"){let{getDaemonStatus:I}=await Promise.resolve().then(()=>(Ts(),vs)),M=await I();if(M.running){let y=M.uptime?Math.round(M.uptime/1e3):0,j=M.stale;console.log(`Daemon running (PID ${M.pid})${j?" \u26A0 STALE":""}`),console.log(` Uptime: ${y}s`),console.log(` Commands served: ${M.commandsServed??0}`),M.lastActivity&&console.log(` Last activity: ${M.lastActivity}`),j&&console.log(` ${t.yellow("\u26A0 Code changed since daemon started. Run: prjct restart")}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${T}. Use: start, stop, status`),process.exitCode=1}else if(m[0]==="stop"){let{isDaemonRunning:T,stopDaemon:I,forceKillDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(m.includes("--force")||m.includes("-f")){let j=M();console.log(j?"Daemon force-killed.":"Daemon is not running."),process.exitCode=0}else await T()?await I()?(console.log("Daemon stopped."),process.exitCode=0):(console.log("Graceful stop failed, force-killing..."),M(),console.log("Daemon force-killed."),process.exitCode=0):(M(),console.log("Daemon is not running (cleaned up stale files)."),process.exitCode=0)}else if(m[0]==="restart"){let{isDaemonRunning:T,stopDaemon:I,forceKillDaemon:M,spawnDaemon:y}=await Promise.resolve().then(()=>(Ts(),vs));await T()?(await I()||M(),await new Promise(G=>setTimeout(G,300))):M(),await y()?(console.log("Daemon restarted."),process.exitCode=0):(console.error("Failed to restart daemon."),process.exitCode=1)}else if(m[0]==="start"||m[0]==="setup"){let{runStart:T}=await Promise.resolve().then(()=>(Cy(),Ey));await T()}else if(m[0]==="dev")console.log("Dev mode is not yet implemented."),console.log('Use "prjct serve" to start the web server.'),process.exitCode=0;else if(m[0]==="web"||m[0]==="serve")try{let T=process.cwd(),I=await n.getProjectId(T);if(!I)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=parseInt(m[1],10)||i;await a(I,T,M)}}catch(T){console.error("Server error:",T.message),process.exitCode=1}else if(m[0]==="context"){let T=process.cwd(),I=await n.getProjectId(T);if(!I)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let M=await x("context"),y=m.slice(1).filter(D=>D!=="--md"&&D!=="--json"),j=m.includes("--md");if(y.length===0){let{ContextCommands:D}=await Promise.resolve().then(()=>(xa(),Sh)),Q=await new D().context(null,T,{md:j});process.exitCode=Q.success?0:1}else{let{runContextTool:D}=await Promise.resolve().then(()=>(Oy(),My)),G=await D(y,I,T);console.log(JSON.stringify(G,null,2)),process.exitCode=G.tool==="error"?1:0}M()}}else if(m[0]==="hooks"){let T=await x("hooks"),{hooksService:I}=await Promise.resolve().then(()=>(Uy(),Fy)),M=m[1]||"status",y=await I.run(process.cwd(),M);process.exitCode=y,T()}else if(m[0]==="doctor"){let T=await x("doctor"),{doctorService:I}=await Promise.resolve().then(()=>(Gy(),Wy)),M=await I.run(process.cwd());process.exitCode=M,T()}else if(m[0]==="uninstall"){let{uninstall:T}=await Promise.resolve().then(()=>(Rd(),hy)),I=m.includes("--force")||m.includes("-f"),M=m.includes("--backup")||m.includes("-b"),y=m.includes("--dry-run")||m.includes("-n"),j=m.includes("--keep-package"),D=await T({force:I,backup:M,dryRun:y,keepPackage:j});process.exitCode=D.success?0:1}else if(m[0]==="watch"){let T=process.cwd();if(!await n.getProjectId(T))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:M}=await Promise.resolve().then(()=>(By(),qy)),y=m.includes("--verbose")||m.includes("-v"),j=m.find(he=>he.startsWith("--debounce=")),D=j?parseInt(j.split("=")[1],10):void 0,G=m.find(he=>he.startsWith("--interval=")),Q=G?parseInt(G.split("=")[1],10)*1e3:void 0,Ve=await M.start(T,{verbose:y,quiet:w,debounceMs:D,minIntervalMs:Q});Ve.success||(console.error(Ve.error),process.exitCode=1)}}else if(m[0]==="linear"){let{spawn:T}=await import("node:child_process"),I=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","linear.ts"),j=e.join(__dirname,"..","dist","cli","linear.mjs"),D=e.join(__dirname,"..","cli","linear.mjs"),G,Q;if(I.existsSync(y)?(G=y,Q="bun"):I.existsSync(D)?(G=D,Q="node"):I.existsSync(j)?(G=j,Q="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Q=""),G){let Ve=[...m.slice(1)];T(Q,[G,...Ve],{stdio:"inherit",cwd:M}).on("close",Ne=>{process.exitCode=Ne||0})}}else if(m[0]==="jira"){let{spawn:T}=await import("node:child_process"),I=await import("node:fs"),M=process.cwd(),y=e.join(__dirname,"..","core","cli","jira.ts"),j=e.join(__dirname,"..","dist","cli","jira.mjs"),D=e.join(__dirname,"..","cli","jira.mjs"),G,Q;if(I.existsSync(y)?(G=y,Q="bun"):I.existsSync(D)?(G=D,Q="node"):I.existsSync(j)?(G=j,Q="node"):(console.error('Jira CLI not found. Run "npm run build" first.'),process.exitCode=1,G="",Q=""),G){let Ve=[...m.slice(1)];T(Q,[G,...Ve],{stdio:"inherit",cwd:M}).on("close",Ne=>{process.exitCode=Ne||0})}}else if(m[0]==="help"||m[0]==="-h"||m[0]==="--help"){let{getHelp:T}=await Promise.resolve().then(()=>(zy(),Jy)),I=m[1];console.log(T(I)),process.exitCode=0}else if(m[0]==="version"||m[0]==="-v"||m[0]==="--version"){let T=await s(h),I=r.homedir(),M=process.cwd(),[y,j,D,G,Q,Ve]=await Promise.all([c(e.join(I,".claude","commands","p.md")),c(e.join(I,".gemini","commands","p.toml")),c(e.join(M,".cursor")),c(e.join(M,".cursor","rules","prjct.mdc")),c(e.join(M,".windsurf")),c(e.join(M,".windsurf","rules","prjct.md"))]);if(console.log(`
|
|
1952
1952
|
${t.cyan("p/")} prjct v${d}
|
|
1953
1953
|
${t.dim("Context layer for AI coding agents")}
|
|
1954
1954
|
|
|
@@ -1956,7 +1956,7 @@ ${t.dim("Providers:")}`),T.claude.installed){let he=y?t.green("\u2713 ready"):t.
|
|
|
1956
1956
|
${t.dim("Run 'prjct start' to configure (CLI providers)")}
|
|
1957
1957
|
${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
|
|
1958
1958
|
${t.cyan("https://prjct.app")}
|
|
1959
|
-
`)}else{let T=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),I=await
|
|
1959
|
+
`)}else{let T=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),I=await p();if(!new Set(["auth","login","logout","init"]).has(m[0])&&(!await c(T)||!I))console.log(`
|
|
1960
1960
|
${t.cyan.bold(" Welcome to prjct!")}
|
|
1961
1961
|
|
|
1962
1962
|
Run ${t.bold("prjct start")} to configure your AI providers.
|
|
@@ -1965,4 +1965,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
|
|
|
1965
1965
|
Claude Code, Gemini CLI, or both.`)}
|
|
1966
1966
|
`),process.exitCode=0;else{try{let y=await o.getLastVersion();if(y&&y!==d){console.log(`
|
|
1967
1967
|
${t.yellow("\u2139")} Updating prjct v${y} \u2192 v${d}...
|
|
1968
|
-
`);try{let{default:j}=await Promise.resolve().then(()=>(
|
|
1968
|
+
`);try{let{default:j}=await Promise.resolve().then(()=>(fr(),qi));await j.run()}catch{await o.updateVersion(d).catch(()=>{})}}}catch{}m.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(Ts(),vs)).then(({spawnDaemon:y})=>y()).catch(()=>{}),await Promise.resolve().then(()=>(Yy(),CP))}}}l(xP,"main");xP().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
|