prjct-cli 1.56.0 → 1.56.6
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 +35 -0
- package/bin/prjct +13 -5
- package/dist/bin/prjct-core.mjs +238 -238
- package/dist/cli/jira.mjs +4 -4
- package/dist/cli/linear.mjs +4 -4
- package/dist/daemon/entry.mjs +204 -204
- package/dist/mcp/server.mjs +2 -2
- package/package.json +19 -19
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 m=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(m)}catch(m){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function
|
|
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 ps.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 ps.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 ps.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=
|
|
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=ms.join(t,".env");await C(s)&&await
|
|
7
|
+
var iw=Object.create;var no=Object.defineProperty;var aw=Object.getOwnPropertyDescriptor;var cw=Object.getOwnPropertyNames;var lw=Object.getPrototypeOf,uw=Object.prototype.hasOwnProperty;var l=(r,e)=>no(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 dw=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ye=(r,e)=>{for(var t in e)no(r,t,{get:e[t],enumerable:!0})},ep=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of cw(e))!uw.call(r,n)&&n!==t&&no(r,n,{get:()=>e[n],enumerable:!(s=aw(e,n))||s.enumerable});return r};var pw=(r,e,t)=>(t=r!=null?iw(lw(r)):{},ep(e||!r||!r.__esModule?no(t,"default",{value:r,enumerable:!0}):t,r)),bt=r=>ep(no({},"__esModule",{value:!0}),r);var tp={};ye(tp,{DAEMON_PATHS:()=>Le,IDLE_TIMEOUT_MS:()=>tc,MAX_BUFFER_SIZE:()=>sc,decodeMessage:()=>mw,encodeMessage:()=>gn});function gn(r){return Buffer.from(`${JSON.stringify(r)}
|
|
8
|
+
`)}function mw(r){return JSON.parse(r.trim())}var Le,tc,sc,Jo=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")},tc=30*60*1e3,sc=1024*1024;l(gn,"encodeMessage");l(mw,"decodeMessage")});function sp(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function nc(){if(sp()==="bun")return!0;try{let{execSync:r}=Bt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function fn(){return sp()==="bun"}var ro=S(()=>{"use strict";l(sp,"detectRuntime");l(nc,"isBunAvailable");l(fn,"isBun")});var vs={};ye(vs,{executeViaDaemon:()=>hw,forceKillDaemon:()=>ww,getDaemonStatus:()=>fw,isDaemonRunning:()=>np,sendRequest:()=>oo,spawnDaemon:()=>rp,stopDaemon:()=>yw});import zo from"node:crypto";import ct from"node:fs";import{connect as gw}from"node:net";async function np(){let r=Le.socket();if(!ct.existsSync(r))return!1;try{return(await oo({id:zo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{ct.unlinkSync(r)}catch{}return!1}}async function fw(){let r=Le.socket(),e=Le.pid();if(!ct.existsSync(r))return{running:!1};try{let t=await oo({id:zo.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 oo(r){return new Promise((e,t)=>{let s=Le.socket(),n=gw(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(gn(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 m=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(m)}catch(m){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function hw(r,e,t,s,n,o=!0){let i=Le.socket();if(!ct.existsSync(i))return o&&rp().catch(()=>{}),null;try{return await oo({id:zo.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function yw(){try{return(await oo({id:zo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function ww(){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 rp(){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=nc()?"bun":"node";else if(ct.existsSync(n))o=n,i=nc()?"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 m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await np())return!0;return!1}var Ts=S(()=>{"use strict";ro();Jo();l(np,"isDaemonRunning");l(fw,"getDaemonStatus");l(oo,"sendRequest");l(hw,"executeViaDaemon");l(yw,"stopDaemon");l(ww,"forceKillDaemon");l(rp,"spawnDaemon")});var io=S(()=>{"use strict"});import{z as ds}from"zod";function op(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 HP,WP,GP,qn,qP,Ko=S(()=>{"use strict";HP=ds.enum(["opus","sonnet","haiku"]),WP=ds.enum(["2.5-pro","2.5-flash","2.0-flash"]),GP=ds.string().min(1),qn=ds.object({provider:ds.string(),model:ds.string(),cliVersion:ds.string().optional(),recordedAt:ds.string()}),qP=ds.object({preferredModel:ds.string().optional(),lastAnalysisModel:qn.optional()});l(op,"compareSemver")});var ap={};ye(ap,{execAsync:()=>F,execFileAsync:()=>hn});import{exec as kw,execFile as Sw}from"node:child_process";import{promisify as ip}from"node:util";var F,hn,Je=S(()=>{"use strict";F=ip(kw),hn=ip(Sw)});var cp,lp,up,rc=S(()=>{"use strict";cp=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"]),lp=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],up=/(?:import|from)\s+['"]([^'"]+)['"]/g});function bw(r){return r instanceof Error&&"code"in r}function O(r){return bw(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function oc(r){if(r instanceof Error)return r.stack}var W=S(()=>{"use strict";l(bw,"isNodeError");l(O,"isNotFoundError");l(k,"getErrorMessage");l(oc,"getErrorStack")});import mp from"node:fs/promises";async function gp(r,e){let t;try{t=await mp.readFile(r,"utf-8")}catch(o){if(O(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await dp(r,t),pp(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await dp(r,t),pp(r,vw(n.error)),null)}async function dp(r,e){let t=`${r}.backup`;try{await mp.writeFile(t,e,"utf-8")}catch{}}function pp(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 vw(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var fp=S(()=>{"use strict";W();l(gp,"safeRead");l(dp,"createBackup");l(pp,"logCorruption");l(vw,"formatZodError")});var _t={};ye(_t,{appendLine:()=>ic,appendToFile:()=>Ew,atomicWrite:()=>Tw,batchProcess:()=>wn,copyFile:()=>Aw,deleteDir:()=>xw,deleteFile:()=>Pw,dirExists:()=>Xt,ensureDir:()=>rt,fileExists:()=>C,getFileExtension:()=>Mw,getFileModifiedTime:()=>Rw,getFileNameWithoutExtension:()=>Ow,getFileSize:()=>jw,listFiles:()=>Cs,moveFile:()=>Iw,prependToFile:()=>Cw,readFile:()=>_e,readJson:()=>Ae,readLines:()=>Dw,walkDir:()=>yn,writeFile:()=>Pt,writeJson:()=>de,writeLines:()=>$w});import Re from"node:fs/promises";import Es from"node:path";async function yn(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(cp.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 wn(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 gp(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 Tw(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 Ew(r,e){await Re.appendFile(r,e,"utf-8")}async function ic(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.appendFile(r,`${e}
|
|
10
|
+
`,"utf-8")}async function Cw(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 Xt(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 Pw(r){try{return await Re.unlink(r),!0}catch(e){if(O(e))return!1;throw e}}async function xw(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 jw(r){return(await Re.stat(r)).size}async function Rw(r){return(await Re.stat(r)).mtime}async function Aw(r,e){await Re.copyFile(r,e)}async function Iw(r,e){await Re.rename(r,e)}async function Dw(r){return(await _e(r,"")).split(`
|
|
11
|
+
`)}async function $w(r,e){let t=e.join(`
|
|
12
|
+
`);await Pt(r,t)}function Mw(r){return Es.extname(r)}function Ow(r){return Es.basename(r,Es.extname(r))}var B=S(()=>{"use strict";rc();fp();W();l(yn,"walkDir");l(wn,"batchProcess");l(Ae,"readJson");l(de,"writeJson");l(_e,"readFile");l(Pt,"writeFile");l(Tw,"atomicWrite");l(Ew,"appendToFile");l(ic,"appendLine");l(Cw,"prependToFile");l(C,"fileExists");l(Xt,"dirExists");l(rt,"ensureDir");l(Pw,"deleteFile");l(xw,"deleteDir");l(Cs,"listFiles");l(jw,"getFileSize");l(Rw,"getFileModifiedTime");l(Aw,"copyFile");l(Iw,"moveFile");l(Dw,"readLines");l($w,"writeLines");l(Mw,"getFileExtension");l(Ow,"getFileNameWithoutExtension")});function Gs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var Bn,kn=S(()=>{"use strict";l(Gs,"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 wp={};ye(wp,{invalidateProviderCache:()=>Fw,readProviderCache:()=>cc,writeProviderCache:()=>lc});import hp from"node:fs/promises";import _w from"node:os";import yp from"node:path";async function cc(){try{let r=await hp.readFile(ac,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Gs(e.timestamp,Lw)?null:e.detection}catch{return null}}async function lc(r){let e={timestamp:new Date().toISOString(),detection:r};await de(ac,e)}async function Fw(){try{await hp.unlink(ac)}catch{}}var Nw,ac,Lw,uc=S(()=>{"use strict";kn();B();Nw=yp.join(_w.homedir(),".prjct-cli","cache"),ac=yp.join(Nw,"providers.json"),Lw=10*60*1e3;l(cc,"readProviderCache");l(lc,"writeProviderCache");l(Fw,"invalidateProviderCache")});var Nt={};ye(Nt,{AntigravityProvider:()=>pc,ClaudeProvider:()=>Xo,CodexProvider:()=>mc,CursorProvider:()=>Sp,GeminiProvider:()=>dc,Providers:()=>ze,WindsurfProvider:()=>bp,detectAllProviders:()=>Ps,detectAntigravity:()=>Vn,detectCodex:()=>Sn,detectCursorProject:()=>Ep,detectProvider:()=>Yo,detectWindsurfProject:()=>Cp,getActiveProvider:()=>Gw,getCapabilities:()=>Hw,getCommandsDir:()=>Xw,getGlobalContextPath:()=>Jw,getGlobalSettingsPath:()=>zw,getProjectCommandsPath:()=>Yw,getProviderBranding:()=>Qo,getSkillsPath:()=>Kw,hasProviderConfig:()=>qw,needsCursorRouterRegeneration:()=>Bw,needsWindsurfRouterRegeneration:()=>Vw,selectProvider:()=>gc,validateCliVersion:()=>Tp});import qs from"node:os";import ot from"node:path";function Hw(r,e){return{...Uw[r],...e}}async function vp(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Ww(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 Yo(r){let e=ze[r];if(!e.cliCommand)return{installed:!1};let t=await vp(e.cliCommand);if(!t)return{installed:!1};let s=await Ww(e.cliCommand),n=Tp(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Tp(r,e){let t=ze[r];return!t.minCliVersion||!e?null:op(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 cc();if(i)return i}let[e,t,s]=await Promise.all([Yo("claude"),Yo("gemini"),Sn()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await lc(o).catch(()=>{}),o}async function Gw(r){if(r&&ze[r])return ze[r];let e=await Ps();return e.claude.installed&&!e.gemini.installed?Xo:e.gemini.installed&&!e.claude.installed?dc:Xo}async function qw(r){let e=ze[r];return e.configDir?C(e.configDir):!1}function Qo(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 Ep(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 Bw(r){let e=await Ep(r);return e.detected&&!e.routerInstalled}async function Cp(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 Vw(r){let e=await Cp(r);return e.detected&&!e.routerInstalled}async function Vn(){let r=pc.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=mc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await vp("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 Jw(r){let e=ze[r];return e.configDir?ot.join(e.configDir,e.contextFile):null}function zw(r){let e=ze[r];return!e.configDir||!e.settingsFile?null:ot.join(e.configDir,e.settingsFile)}function Kw(r){return ze[r].skillsDir}function Xw(r){return ze[r].commandsDir}function Yw(r,e){let t=ze[r];return ot.join(e,t.commandsDir)}async function gc(){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 Uw,Xo,dc,pc,Sp,bp,mc,ze,lt=S(()=>{"use strict";io();Ko();Je();B();uc();Uw={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(Hw,"getCapabilities");Xo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ot.join(qs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ot.join(qs.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"},dc={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ot.join(qs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ot.join(qs.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"},pc={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ot.join(qs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ot.join(qs.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"},Sp={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"},bp={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"},mc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ot.join(qs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ot.join(qs.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:Xo,gemini:dc,cursor:Sp,antigravity:pc,windsurf:bp,codex:mc};l(vp,"whichCommand");l(Ww,"getCliVersion");l(Yo,"detectProvider");l(Tp,"validateCliVersion");l(Ps,"detectAllProviders");l(Gw,"getActiveProvider");l(qw,"hasProviderConfig");l(Qo,"getProviderBranding");l(Ep,"detectCursorProject");l(Bw,"needsCursorRouterRegeneration");l(Cp,"detectWindsurfProject");l(Vw,"needsWindsurfRouterRegeneration");l(Vn,"detectAntigravity");l(Sn,"detectCodex");l(Jw,"getGlobalContextPath");l(zw,"getGlobalSettingsPath");l(Kw,"getSkillsPath");l(Xw,"getCommandsDir");l(Yw,"getProjectCommandsPath");l(gc,"selectProvider")});import{z as De}from"zod";function Qw(r){return r instanceof Jn}function we(r){return Qw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var zn,Cx,Px,xx,jx,Rx,Ax,Jn,Zo,ei,ao,xs=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}},Cx=zn.create("FileError",De.object({path:De.string(),operation:De.enum(["read","write","delete","create","copy"]),reason:De.string().optional()})),Px=zn.create("ValidationError",De.object({field:De.string(),expected:De.string(),received:De.string().optional(),message:De.string().optional()})),xx=zn.create("PermissionError",De.object({action:De.string(),resource:De.string(),reason:De.string().optional()})),jx=zn.create("TaskError",De.object({taskId:De.string().optional(),operation:De.enum(["create","update","complete","pause","resume","delete"]),reason:De.string()})),Rx=zn.create("SessionError",De.object({sessionId:De.string().optional(),reason:De.string()})),Ax=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)}},Zo=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")}},ei=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")}},ao=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(Qw,"isPrjctError");l(we,"getErrorMessage")});import{formatDistanceToNowStrict as Mx}from"date-fns";function Pp(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 xp(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 Bs(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 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 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 X=S(()=>{"use strict";l(Pp,"formatDate");l(xp,"getYearMonthDay");l(v,"getTimestamp");l(Bs,"getDaysAgo");l(xt,"formatDuration");l(js,"calculateDuration");l(Kn,"parseVarianceMinutes");l(Lt,"parseDurationMinutes")});var Yn={};ye(Yn,{PACKAGE_ROOT:()=>jt,VERSION:()=>ke,compareVersions:()=>jp,getPackageInfo:()=>Zw,getPackageRoot:()=>hc,getVersion:()=>bn,isCompatible:()=>ek,needsMigration:()=>tk,resetPackageRoot:()=>yc});import fc from"node:fs";import ti from"node:path";function hc(){if(Xn)return Xn;let r=__dirname;for(let e=0;e<5;e++){let t=ti.join(r,"package.json");if(fc.existsSync(t))try{if(JSON.parse(fc.readFileSync(t,"utf-8")).name==="prjct-cli")return Xn=r,r}catch{}r=ti.dirname(r)}return Xn=ti.join(__dirname,"..","..",".."),Xn}function bn(){if(co)return co;try{let r=ti.join(hc(),"package.json"),e=JSON.parse(fc.readFileSync(r,"utf-8"));return co=e.version,si=e,co}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Zw(){return si||bn(),si}function jp(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 ek(r){let e=bn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function tk(r,e=null){let t=e||bn();return jp(r,t)<0}function yc(r){Xn=r,co=null,si=null}var co,si,Xn,ke,jt,ut=S(()=>{"use strict";W();co=null,si=null,Xn=null;l(hc,"getPackageRoot");l(bn,"getVersion");l(Zw,"getPackageInfo");l(jp,"compareVersions");l(ek,"isCompatible");l(tk,"needsMigration");l(yc,"resetPackageRoot");ke=bn(),jt=hc()});async function ni(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function sk(){let r=await ni("gh api user --jq .login");return r.success&&r.output||(r=await ni("git config --global github.user"),r.success&&r.output)?r.output:null}async function nk(){let r=await ni("git config user.name");return r.success&&r.output?r.output:null}async function rk(){let r=await ni("git config user.email");return r.success&&r.output?r.output:null}async function Qn(){let[r,e,t]=await Promise.all([sk(),nk(),rk()]);return{github:r,email:t,name:e||r||"Unknown"}}var ri=S(()=>{"use strict";Je();l(ni,"execCommand");l(sk,"detectGitHubUsername");l(nk,"detectGitName");l(rk,"detectGitEmail");l(Qn,"detect")});import ok from"node:crypto";import ps from"node:fs/promises";import kc from"node:os";import z from"node:path";import{globSync as ik}from"glob";var Sc,ak,A,ve=S(()=>{"use strict";X();B();Sc=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(kc.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 ok.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}=xp(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=kc.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(kc.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 ps.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 ps.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 ps.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=ik(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 ps.readFile(u,"utf-8"),m=JSON.parse(d),p=z.join(c,"PRJCT.md");s.push({name:m.name||z.basename(a),path:c,relativePath:a,hasPrjctMd:await C(p)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=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}},ak=new Sc,A=ak});var oi={};ye(oi,{default:()=>Yt,worktreeService:()=>Ap});import bc from"node:fs/promises";import ms from"node:path";var Rp,vc,Ap,Yt,lo=S(()=>{"use strict";Je();B();Rp=".worktrees",vc=class{static{l(this,"WorktreeService")}async create(e,t,s={}){let n=await this.getMainWorktree(e),o=ms.join(n,Rp,t),i=s.branch||`feat/${t}`;await bc.mkdir(ms.join(n,Rp),{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=ms.resolve(e,t.trim()),o=ms.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=ms.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=ms.join(t,".env");await C(s)&&await bc.copyFile(s,ms.join(e,".env"));let n=ms.join(t,".prjct"),o=ms.join(e,".prjct");await C(n)&&!await C(o)&&await bc.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 m of i)m.startsWith("worktree ")?a=m.replace("worktree ","").trim():m.startsWith("HEAD ")?c=m.replace("HEAD ","").trim():m.startsWith("branch ")?u=m.replace("branch refs/heads/","").trim():m==="bare"?d=!0:m==="detached"&&(u="(detached)");if(a){let m=a===t||d;s.push({path:a,branch:u,commit:c,isMain:m,slug:m?"main":ms.basename(a)})}}return s}},
|
|
17
|
+
`),a="",c="",u="",d=!1;for(let m of i)m.startsWith("worktree ")?a=m.replace("worktree ","").trim():m.startsWith("HEAD ")?c=m.replace("HEAD ","").trim():m.startsWith("branch ")?u=m.replace("branch refs/heads/","").trim():m==="bare"?d=!0:m==="detached"&&(u="(detached)");if(a){let m=a===t||d;s.push({path:a,branch:u,commit:c,isMain:m,slug:m?"main":ms.basename(a)})}}return s}},Ap=new vc,Yt=Ap});var Dp={};ye(Dp,{default:()=>$});import Tc from"node:fs/promises";import ck from"node:path";import*as ii from"jsonc-parser";function Ip(r){let e=[],t=ii.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}: ${ii.printParseErrorCode(s.error)}`)}return t}var Ec,lk,$,Te=S(()=>{"use strict";xs();W();X();B();ut();ri();ve();l(Ip,"parseJsonc");Ec=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await Tc.readFile(t,"utf-8");return Ip(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 Tc.readFile(t,"utf-8");return Ip(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 Tc.readdir(ck.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(()=>(lo(),oi));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 Qn(),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))}}},lk=new Ec,$=lk});var Mp={};ye(Mp,{default:()=>uo});import Cc from"node:fs/promises";import uk from"node:os";import $p from"node:path";var Pc,dk,uo,ai=S(()=>{"use strict";W();B();Pc=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=uk.homedir(),this.configDir=$p.join(this.homeDir,".prjct-cli","config"),this.configFile=$p.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Cc.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",k(e))}}async loadConfig(){try{let e=await Cc.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 Cc.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",k(e)),!1}}},dk=new Pc,uo=dk});var li={};ye(li,{PrjctDatabase:()=>ci,default:()=>N,prjctDb:()=>E});import xc from"node:fs";import Op from"node:path";function pk(r){if(fn()){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 mk,gk,ci,E,N,ee=S(()=>{"use strict";ve();ro();l(pk,"openDatabase");mk=[{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,52 +475,52 @@ 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")}],gk=3,ci=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return Op.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=gk&&this.evictLru();let s=this.getDbPath(e),n=Op.dirname(s);xc.existsSync(n)||xc.mkdirSync(n,{recursive:!0});let o=pk(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 xc.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 mk)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 ci,N=E});import{z as J}from"zod";var fk,hk,_p,yk,wk,kk,Sk,bk,Np,bj,Lp=S(()=>{"use strict";fk=J.enum(["low","medium","high"]),hk=J.enum(["pending","converted","completed","archived","dormant"]),_p=J.enum(["high","medium","low"]),yk=J.object({impact:_p,effort:_p}),wk=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()}),kk=J.object({name:J.string(),description:J.string()}),Sk=J.object({name:J.string(),description:J.string().optional()}),bk=J.object({id:J.string(),text:J.string(),details:J.string().optional(),priority:fk,status:hk,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:yk.optional(),implementationNotes:J.string().optional(),stack:wk.optional(),modules:J.array(kk).optional(),roles:J.array(Sk).optional(),risks:J.array(J.string()).optional(),risksCount:J.number().optional()}),Np=J.object({ideas:J.array(bk),lastUpdated:J.string()}),bj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import vk from"node:crypto";import{homedir as Tk}from"node:os";import{join as Ek}from"node:path";function Z(){return vk.randomUUID()}var xj,Ut=S(()=>{"use strict";l(Z,"generateUUID");xj=Ek(Tk(),".prjct-cli","projects")});var Rs,jc,Rt,Vs=S(()=>{"use strict";Ut();X();ee();Rs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},jc=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 jc});var Rc,Js,Ac=S(()=>{"use strict";ve();X();B();Rc=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)}},Js=new Rc});var dt,As=S(()=>{"use strict";Ac();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 Js.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 Ic,$e,zs=S(()=>{"use strict";Lp();Ut();X();Vs();As();Ic=class extends dt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Np)}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=Bs(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 Ic});import{z as P}from"zod";var Ck,ui,Pk,xk,jk,Dc,Up,Hp,Wp,$c,Fp,Rk,Ak,Ik,Gp,qp,Bp,Dk,$k,eR,Mc=S(()=>{"use strict";Ko();Ck=P.enum(["low","medium","high","critical"]),ui=P.enum(["feature","bug","improvement","chore"]),Pk=P.enum(["active","backlog","previously_active"]),xk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),jk=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),Dc=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()}),Up=P.object({output:P.string().min(1,"Subtask output is required"),summary:Dc}),Hp=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:xk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:Dc.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),Wp=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),$c=P.object({id:P.string(),description:P.string(),type:ui.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(Hp).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Wp.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()}),Fp=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:ui.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(Hp).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Wp.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()}),Rk=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()}),Ak=P.object({taskId:P.string(),title:P.string(),classification:ui,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(Dc),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:Rk.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),Ik=$c.extend({workspaceId:P.string(),worktreePath:P.string().optional(),agentSessionId:P.string().optional(),jiraId:P.string().optional(),jiraUuid:P.string().optional(),dispatchedFrom:P.string().optional()}),Gp=P.object({currentTask:$c.nullable(),previousTask:Fp.nullable().optional(),pausedTasks:P.array(Fp).optional(),taskHistory:P.array(Ak).optional(),activeTasks:P.array(Ik).optional(),lastUpdated:P.string()}),qp=P.object({id:P.string(),description:P.string(),body:P.string().optional(),priority:Ck,type:ui,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:Pk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Bp=P.object({tasks:P.array(qp),lastUpdated:P.string()}),Dk=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),$k=P.object({type:jk,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),eR=P.object({projectId:P.string(),currentTask:$c.nullable(),queue:P.array(qp),stats:Dk,recentActivity:P.array($k),lastSync:P.string()})});function di(r){return[...r].sort((e,t)=>{let s=Jp[e.section]-Jp[t.section];return s!==0?s:Vp[e.priority]-Vp[t.priority]})}function Oc(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Vp,Jp,pi=S(()=>{"use strict";Vp={critical:0,high:1,medium:2,low:3},Jp={active:0,previously_active:1,backlog:2};l(di,"sortBySectionAndPriority");l(Oc,"uniqueBy")});var _c,ce,Vt=S(()=>{"use strict";Ut();Mc();pi();X();Vs();As();_c=class extends dt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Bp)}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 di(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=Bs(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 _c});import{z as re}from"zod";var Mk,zp,Ok,_k,Nk,Lk,Fk,Uk,Hk,Kp,Xp=S(()=>{"use strict";Mk=re.enum(["feature","fix","improvement","refactor"]),zp=re.enum(["pass","warning","fail","skipped"]),Ok=re.enum(["added","changed","fixed","removed"]),_k=re.object({hours:re.number(),minutes:re.number(),totalMinutes:re.number()}),Nk=re.object({filesChanged:re.number().nullable().optional(),linesAdded:re.number().nullable().optional(),linesRemoved:re.number().nullable().optional(),commits:re.number().nullable().optional()}),Lk=re.object({description:re.string(),type:Ok.optional()}),Fk=re.object({lintStatus:zp.nullable().optional(),lintDetails:re.string().optional(),testStatus:zp.nullable().optional(),testDetails:re.string().optional()}),Uk=re.object({hash:re.string().optional(),message:re.string().optional(),branch:re.string().optional()}),Hk=re.object({id:re.string(),name:re.string(),version:re.string().nullable().optional(),type:Mk,agent:re.string().optional(),description:re.string().optional(),changes:re.array(Lk).optional(),codeSnippets:re.array(re.string()).optional(),commit:Uk.optional(),codeMetrics:Nk.optional(),qualityMetrics:Fk.optional(),quantitativeImpact:re.string().optional(),duration:_k.optional(),tasksCompleted:re.number().nullable().optional(),shippedAt:re.string(),featureId:re.string().optional()}),Kp=re.object({shipped:re.array(Hk),lastUpdated:re.string()})});var Nc,it,Ks=S(()=>{"use strict";Ut();Xp();X();Vs();As();Nc=class extends dt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Kp)}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=Bs(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 Nc});var po,Lc,vn,Fc=S(()=>{"use strict";po={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"}},Lc=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=po[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 po[e]}getPrompt(e){return po[e].prompt}getValidCommands(e){return po[e].transitions}formatNextSteps(e){return po[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 Lc});var Uc,L,vt=S(()=>{"use strict";Ut();Mc();X();Fc();Vs();As();Uc=class extends dt{static{l(this,"StateStorage")}constructor(){super("state.json",Gp)}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=Up.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,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt: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(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated: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(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated: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
|
|
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,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),g<m?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt: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(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated: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(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated: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 Uc});function Gk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Wk.has(r)||r.includes("prjct"))return{level:Zn.debug,name:"debug"};let e=Zn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function mi(r,e,t){return Yp>=r?(...s)=>console[t](e,...s):Bk}var Zn,Wk,Yp,qk,Bk,Vk,V,Is=S(()=>{"use strict";Zn={error:0,warn:1,info:2,debug:3},Wk=new Set(["1","true","*"]);l(Gk,"getLogLevel");({level:Yp,name:qk}=Gk()),Bk=l(()=>{},"noop");l(mi,"createLogMethod");Vk={error:mi(Zn.error,"[prjct:error]","error"),warn:mi(Zn.warn,"[prjct:warn]","warn"),info:mi(Zn.info,"[prjct:info]","log"),debug:mi(Zn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Yp>=0,"isEnabled"),level:l(()=>qk,"level")},V=Vk});import Jk from"node:fs/promises";import zk from"node:path";import{Hono as Kk}from"hono";function Xk(r){return A.getGlobalProjectPath(r)}function Qp(r,e){let t=new Kk,s=Xk(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=zk.join(s,"context",`${o}.md`),c=await Jk.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 Zp=S(()=>{"use strict";ve();ee();zs();Vt();Ks();vt();W();Is();l(Xk,"getProjectDataPath");l(Qp,"createRoutes")});function Yk(r){return{id:r.id,taskId:r.task_id,author:r.author,content:r.content,createdAt:r.created_at,updatedAt:r.updated_at}}function Qk(){return`cmt_${Math.random().toString(36).slice(2,10)}${Date.now().toString(36)}`}var Hc,mo,em=S(()=>{"use strict";ee();l(Yk,"rowToComment");l(Qk,"generateId");Hc=class{static{l(this,"CommentStorage")}addComment(e,t,s,n="user"){let o=Qk(),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(Yk)}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}},mo=new Hc});var Wc,go,Gc=S(()=>{"use strict";ee();Wc=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}}},go=new Wc});var qc,Ke,gi=S(()=>{"use strict";ee();qc=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}}},Ke=new qc});import{createHash as tm}from"node:crypto";function fo(r){return tm("sha256").update(r).digest("hex")}function Tn(r){return fo(r).slice(0,16)}function sm(r){return tm("md5").update(r).digest("hex")}var En=S(()=>{"use strict";l(fo,"sha256");l(Tn,"sha256Short");l(sm,"md5")});import fi from"node:fs/promises";import nm from"node:path";function Zk(){return{version:er,lastUpdated:"",checksums:{}}}var er,Bc,Cn,Vc=S(()=>{"use strict";ve();W();X();En();ee();er="1.0.0";l(Zk,"getDefaultChecksums");Bc=class{static{l(this,"IndexStorage")}getIndexPath(e){return nm.join(A.getGlobalProjectPath(e),"index")}async ensureIndexDir(e){let t=this.getIndexPath(e);return await fi.mkdir(t,{recursive:!0}),t}async readIndex(e){try{let t=this.getIndexMeta(e,"project-index");if(t!==null)return t.version!==er?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 Zk()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await fi.readFile(e);return sm(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:er,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 fi.readdir(t);await Promise.all(s.map(n=>fi.unlink(nm.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!==er?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===er)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!==er?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 Bc});var Jc,hi,Qt,tr=S(()=>{"use strict";X();ee();Jc=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}})}},hi=new Jc,Qt=hi});import{z as Xe}from"zod";function am(r,e="default"){let t=rm[e]||rm.default;return r/1e3*t}function yi(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var eS,tS,om,im,rm,wi=S(()=>{"use strict";eS=Xe.object({date:Xe.string(),tokensSaved:Xe.number(),syncs:Xe.number(),avgCompressionRate:Xe.number(),totalDuration:Xe.number()}),tS=Xe.object({agentName:Xe.string(),usageCount:Xe.number(),tokensSaved:Xe.number()}),om=Xe.object({totalTokensSaved:Xe.number(),avgCompressionRate:Xe.number(),syncCount:Xe.number(),watchTriggers:Xe.number(),avgSyncDuration:Xe.number(),totalSyncDuration:Xe.number(),agentUsage:Xe.array(tS),dailyStats:Xe.array(eS),firstSync:Xe.string(),lastUpdated:Xe.string()}),im={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},rm={"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(am,"estimateCostSaved");l(yi,"formatCost")});var zc,Zt,ho=S(()=>{"use strict";wi();X();As();zc=class extends dt{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",om)}getDefault(){return{...im}}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:am(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 zc});import{z as be}from"zod";var sS,nS,cm,jA,RA,AA,Xs,lm,yo=S(()=>{"use strict";sS=be.enum(["improving","stable","declining"]),nS=be.object({sprintNumber:be.number(),startDate:be.string(),endDate:be.string(),pointsCompleted:be.number(),tasksCompleted:be.number(),avgVariance:be.number(),estimationAccuracy:be.number()}),cm=be.object({category:be.string(),avgVariance:be.number(),taskCount:be.number()}),jA=be.object({totalPoints:be.number(),sprints:be.number(),estimatedDate:be.string()}),RA=be.object({sprints:be.array(nS),averageVelocity:be.number(),velocityTrend:sS,estimationAccuracy:be.number(),overEstimated:be.array(cm),underEstimated:be.array(cm),lastUpdated:be.string()}),AA=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},lm={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Kc,sr,ki=S(()=>{"use strict";yo();As();Kc=class extends dt{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:lm,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}},sr=new Kc});function Xc(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 Yc,je,wo=S(()=>{"use strict";gi();ee();l(Xc,"rowToRule");Yc=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?Xc(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(Xc)}getAllRules(e){return E.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Xc)}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 Yc});import gs from"node:fs/promises";import Zc from"node:path";import{Hono as rS}from"hono";function ko(r){return E.getDoc(r,"project")}async function Qc(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 um(){let r=new rS;return r.get("/projects",async e=>{try{await gs.mkdir(nr,{recursive:!0});let s=(await gs.readdir(nr,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=ko(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 Qc(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(ko(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 Qc(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(nr,{recursive:!0});let s=(await gs.readdir(nr,{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(nr,{recursive:!0});let n=(await gs.readdir(nr,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let m=ko(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=ko(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await Qc(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=mo.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=mo.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()?mo.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 mo.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"),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(Zc.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 sr.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=hi.getActive(t),n=hi.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=go.getSummary(t,30),n=go.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=ko(t);return e.json(s||{projectId:t})}catch{return e.json({projectId:t})}}),r}var oS,nr,dm=S(()=>{"use strict";ve();Vs();em();Gc();gi();ee();zs();Vc();tr();ho();Vt();Ks();vt();ki();wo();oS=A.getGlobalBasePath(),nr=Zc.join(oS,"projects");l(ko,"getProjectConfig");l(Qc,"calculateDuration");l(um,"createExtendedRoutes")});var pm=S(()=>{"use strict"});import{streamSSE as iS}from"hono/streaming";function gm(){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()>mm&&t(i)},aS),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 iS(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)}},cS),p=setTimeout(()=>{t(a)},mm);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 mm,aS,cS,fm=S(()=>{"use strict";pm();mm=60*60*1e3,aS=5*60*1e3,cS=3e4;l(gm,"createSSEManager")});var hm={};ye(hm,{DEFAULT_PORT:()=>bi,createServer:()=>Si,startServer:()=>mS});import el from"node:fs";import Ys from"node:path";import{Hono as lS}from"hono";import{cors as uS}from"hono/cors";import{logger as dS}from"hono/logger";import{secureHeaders as pS}from"hono/secure-headers";function Si(r){let e=new lS,t=gm();e.use("*",pS()),r.enableCors!==!1&&e.use("*",uS({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("*",dS()),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=Qp(r.projectId,r.projectPath);e.route("/api",s);let n=um();e.route("/api",n),e.get("/api/events",c=>t.handleConnection(c));let i=[Ys.resolve(__dirname,"..","dist","web"),Ys.resolve(__dirname,"..","..","dist","web"),Ys.resolve(process.cwd(),"dist","web"),Ys.resolve(__dirname,"..","web")].find(c=>el.existsSync(Ys.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=Ys.join(i,u.req.path);try{let m=el.readFileSync(d),p=Ys.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=el.readFileSync(Ys.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 mS(r,e,t=bi){let s=Si({port:t,projectId:r,projectPath:e});return await s.start(),s}var bi,tl=S(()=>{"use strict";ro();ut();Zp();dm();fm();l(Si,"createServer");bi=3478;l(mS,"startServer")});import Pn from"chalk";var ym,gS,fS,es,wm=S(()=>{"use strict";lt();ym=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],gS=80,fS={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:ym,speed:gS},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(ym[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")=>Qo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Qo(r).signature,"getSignature")},es=fS});function rr(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 hS[r]}var me,sl,nl,vi,hS,Jt,km,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"},sl=["feature","spec","design","refactor","migrate"],nl=["ship","cleanup","git","migrate"],vi=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],hS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(rr,"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},km={HISTORY_MAX:100}});var So,rl=S(()=>{"use strict";So={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{...So[r],...e}}function or(r,e,t){return{message:r,hint:e,...t}}var bo=S(()=>{"use strict";rl();rl();l(jn,"getError");l(or,"createError")});var bm={};ye(bm,{ERRORS:()=>So,ICONS:()=>Qs,OUTPUT_TIERS:()=>Sm,createError:()=>or,default:()=>f,formatForHuman:()=>bS,getError:()=>jn,getOutputTier:()=>wS,getTierConfig:()=>Ei,isQuietMode:()=>SS,limitLines:()=>Ti,setOutputTier:()=>yS,setQuietMode:()=>kS});import pe from"chalk";function yS(r){ar=r}function wS(){return ar}function Ei(){return Sm[ar]}function kS(r){At=r}function SS(){return At}function Ti(r,e){let t=e??Ei().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
|
-
${pe.dim(`...${o} more lines`)}`}function
|
|
497
|
+
${pe.dim(`...${o} more lines`)}`}function bS(r){let e=Ei();if(ar==="silent")return"";if(ar==="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&&ar==="compact"&&o.push(pe.dim(String(t.url))),Ti(o.join(`
|
|
498
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(pe.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?
|
|
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=pe.dim(` [${s.join(" | ")}]`))}console.log(`${
|
|
499
|
+
`)}let n=["id","name","title","status","message","success","error"].filter(o=>o in t);return n.length>0?Ti(n.map(o=>`${o}: ${zt(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
|
|
500
|
+
`),e.maxLines):Ti(JSON.stringify(r,null,2),e.maxLines)}var U0,ol,Sm,ar,Qs,ir,il,At,zt,vS,TS,f,Fe=S(()=>{"use strict";wm();xn();bo();bo();U0=es.spinner.frames,ol=es.spinner.speed,Sm={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}},ar="compact";l(yS,"setOutputTier");l(wS,"getOutputTier");l(Ei,"getTierConfig");Qs={success:pe.green("\u2713"),fail:pe.red("\u2717"),warn:pe.yellow("\u26A0"),info:pe.blue("\u2139"),debug:pe.dim("\u{1F527}"),bullet:pe.dim("\u2022"),arrow:pe.dim("\u2192"),check:pe.green("\u2713"),cross:pe.red("\u2717"),spinner:pe.cyan("\u25D0")},ir=null,il=0,At=!1;l(kS,"setQuietMode");l(SS,"isQuietMode");zt=l((r,e)=>{let t=e??(Ei().maxCharsPerLine||Jt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Ti,"limitLines");l(bS,"formatForHuman");vS=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Jt.CLEAR_WIDTH)}\r`):!0,"clear"),TS={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?(ir=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(il++,zt(r,Jt.SPINNER_MSG))}`)},ol),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=pe.dim(` [${s.join(" | ")}]`))}console.log(`${Qs.success} ${zt(r,Jt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Qs.fail} ${zt(r,Jt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?jn(r):r;return console.error(),console.error(`${Qs.fail} ${e.message}`),e.file&&console.error(pe.dim(` File: ${e.file}`)),e.hint&&console.error(pe.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(pe.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),At||console.log(`${Qs.warn} ${zt(r,Jt.WARN_MSG)}`),this},info(r){return this.stop(),At||console.log(`${Qs.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!At&&e&&console.log(`${Qs.debug} ${pe.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),At)return this;let t=e.bullet||Qs.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(pe.dim(n)),console.log(pe.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
502
|
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(pe.dim(`\u250C${n}\u2510`)),console.log(`${pe.dim("\u2502")} ${pe.bold(r.padEnd(s))} ${pe.dim("\u2502")}`),console.log(pe.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${pe.dim("\u2502")} ${o.padEnd(s)} ${pe.dim("\u2502")}`);return console.log(pe.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),At?this:(console.log(`
|
|
503
|
-
${pe.bold(r)}`),console.log(pe.dim("\u2500".repeat(r.length))),this)},stop(){return
|
|
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=pe.cyan("\u2588".repeat(n))+pe.dim("\u2591".repeat(o)),a=t?` ${zt(t,Jt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(
|
|
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 = ?,
|
|
503
|
+
${pe.bold(r)}`),console.log(pe.dim("\u2500".repeat(r.length))),this)},stop(){return ir&&(clearInterval(ir),ir=null,vS()),this},step(r,e,t){if(At)return this;this.stop();let s=pe.dim(`[${r}/${e}]`);return process.stdout.isTTY?(ir=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(il++,`${s} ${zt(t,Jt.STEP_MSG)}`)}`)},ol),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=pe.cyan("\u2588".repeat(n))+pe.dim("\u2591".repeat(o)),a=t?` ${zt(t,Jt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(ir=setInterval(()=>{process.stdout.write(`\r${es.cli.spin(il++,`[${i}] ${s}%${a}`)}`)},ol),this):(process.stdout.write(`${es.cli.spin(0,`[${i}] ${s}%${a}`)}
|
|
505
|
+
`),this)}},f=TS});var Em={};ye(Em,{default:()=>CS,sessionTracker:()=>Zs});var vm,Tm,al,Zs,CS,Ci=S(()=>{"use strict";io();ee();kn();X();vm=50,Tm=200,al=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 Gs(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>vm&&(n.current.commands=n.current.commands.slice(-vm)),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>Tm&&(n.current.files=n.current.files.slice(-Tm)),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}},Zs=new al,CS=Zs});var Pm={};ye(Pm,{default:()=>Rn,performanceTracker:()=>Cm});var PS,cl,Cm,Rn,Pi=S(()=>{"use strict";ee();PS=BigInt(5*60*1e9),cl=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>PS&&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}},Cm=new cl,Rn=Cm});import xi from"node:fs/promises";var ll,xS,An,ji=S(()=>{"use strict";Te();ve();W();kn();B();ll=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 xi.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([xi.readFile(d,"utf-8"),xi.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 xi.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()}},xS=new ll,An=xS});function Ri(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var et,vo=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(Ri,"calculateConfidence")});var Ai,Ii,Di,ul=S(()=>{"use strict";ee();vo();X();Ai=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}},Ii=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()}},Di=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 $i,xm=S(()=>{"use strict";ee();vo();X();ul();$i=class r extends Ai{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=Ri(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=Ri(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:Ri(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 cr,dl=S(()=>{"use strict";Ut();ee();vo();X();En();l(Ds,"rowToMemory");cr=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
506
|
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let p=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
508
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,p,e,t,s,c,i??null,d,o?1:0,u,u),p}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?Tn(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,m)=>({...d,relevanceScore:Math.max(10,100-m*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-m*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,m)=>d+m.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[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
|
|
@@ -528,15 +528,15 @@ Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async f
|
|
|
528
528
|
|
|
529
529
|
---
|
|
530
530
|
|
|
531
|
-
`),d=new Set;for(let p of i)if(p.tags)for(let g of p.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&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 m=[];for(let p of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,p.id),m.push(p.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:m})}return t}async getMemoryById(e,t){let s=N.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?
|
|
531
|
+
`),d=new Set;for(let p of i)if(p.tags)for(let g of p.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&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 m=[];for(let p of c)N.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,p.id),m.push(p.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:m})}return t}async getMemoryById(e,t){let s=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 pl,jS,Tt,Mi=S(()=>{"use strict";ul();xm();dl();pl=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new cr,this._patternStore=new $i,this._historyStore=new Di,this._sessionStore=new Ii}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()}},jS=new pl,Tt=jS});import Kt from"node:fs/promises";import ts from"node:path";var ml,RS,pt,jm=S(()=>{"use strict";W();Je();B();ml=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 Kt.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 Kt.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 Kt.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 Kt.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 Kt.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 Kt.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 Kt.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 Kt.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 Kt.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
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 Kt.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 Kt.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 Kt.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[]}}},
|
|
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
|
|
533
|
+
`).filter(Boolean)}catch{return[]}}},RS=new ml,pt=RS});var bl={};ye(bl,{clearCache:()=>kl,default:()=>Sl,getAllowedTools:()=>Rm,getTemplateContent:()=>ht,listTemplates:()=>$s,load:()=>wl,parseFrontmatter:()=>yl,resetBundle:()=>MS});import fl from"node:fs";import AS from"node:fs/promises";import _i from"node:path";function hl(){if(gl)return Oi;gl=!0;let r=_i.join(jt,"dist","templates.json");try{let e=fl.readFileSync(r,"utf-8");return Oi=JSON.parse(e),Oi}catch{return null}}function DS(r){let e=In.indexOf(r);e>-1&&In.splice(e,1),In.push(r)}function $S(){for(;lr.size>=IS&&In.length>0;){let r=In.shift();r&&lr.delete(r)}}function yl(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 wl(r){if(lr.has(r))return DS(r),lr.get(r);let e,t=hl();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=_i.join(jt,"templates","commands",`${r}.md`);try{e=await AS.readFile(n,"utf-8")}catch{throw ei.notFound(r)}}let s=yl(e);return $S(),lr.set(r,s),In.push(r),s}async function Rm(r){return(await wl(r)).frontmatter["allowed-tools"]||[]}function kl(){lr.clear(),In.length=0}function MS(){Oi=null,gl=!1,kl()}function ht(r){let e=hl();if(e?.[r])return e[r];let t=_i.join(jt,"templates",r);try{return fl.readFileSync(t,"utf-8")}catch{return null}}function $s(r){let e=hl();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=_i.join(jt,"templates",r);try{return fl.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var IS,lr,In,Oi,gl,OS,Sl,fs=S(()=>{"use strict";xs();ut();IS=50,lr=new Map,In=[],Oi=null,gl=!1;l(hl,"loadBundle");l(DS,"updateLruOrder");l($S,"evictLru");l(yl,"parseFrontmatter");l(wl,"load");l(Rm,"getAllowedTools");l(kl,"clearCache");l(MS,"resetBundle");l(ht,"getTemplateContent");l($s,"listTemplates");OS={load:wl,parseFrontmatter:yl,getAllowedTools:Rm,clearCache:kl,getTemplateContent:ht,listTemplates:$s},Sl=OS});function Ni(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 vl=S(()=>{"use strict";fs();W();B();Is();ut();l(Ni,"mergeWithMarkers")});import yt from"node:fs/promises";import Li from"node:os";import Ie from"node:path";async function _S(){try{let r=Ie.join(Li.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(Yn)),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 NS(){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=Am;if(t!=="claude"){let g=ht(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:w}=(ut(),bt(Yn)),b=Ie.join(w,"templates","global",e.contextFile);try{o=await yt.readFile(b,"utf-8")}catch{t==="gemini"&&(o=Am.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 p=
|
|
539
|
+
`}let p=Ni(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await yt.writeFile(n,p.content,"utf-8"),{success:!0,action:p.action,path:n}}catch(n){return{success:!1,error:k(n),action:"failed"}}}function Im(){let r=Li.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 Am,Ms,LS,Ue,Os=S(()=>{"use strict";fs();W();B();vl();Am=`<!-- 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(_S,"installDocs");l(NS,"installGlobalConfig");Ms=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=Li.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 NS()}async cleanupAllLegacy(){let e=Li.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 _S()}};l(Im,"getProviderPaths");LS=new Ms,Ue=LS});function Dm(r,e){let t=[];To("Languages",r.languages,e.languages,t),To("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)"}),To("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);To("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);To("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 Tl(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 $m(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 To(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 El=S(()=>{"use strict";l(Dm,"generateAnalysisDiff");l(Tl,"formatAnalysisDiffMd");l($m,"formatAnalysisDiffText");l(To,"diffStringArray")});var Cl,Pl,Mm,Eo=S(()=>{"use strict";Cl=[1,2,3,5,8,13,21],Pl={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}},Mm={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import FS from"node:fs/promises";import US from"node:path";function ur(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 HS(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...ur(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(...ur(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(...ur(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(...ur(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ur(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&&!Nm.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function WS(r){return r.split(/\s+/).flatMap(e=>ur(e)).filter(e=>e.length>1&&!Nm.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function GS(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async a=>{try{let c=await FS.readFile(US.join(r,a),"utf-8"),u=HS(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 qS(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function BS(r,e){let t=WS(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=qS(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 VS(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,Lm,t)}function Fi(r){let e=N.getDoc(r,Lm);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 Fm(r,e){let t=await GS(r);return VS(e,t),t}function Um(r,e,t=15){let s=Fi(r);return s?BS(e,s).slice(0,t):[]}var Nm,Lm,xl=S(()=>{"use strict";Eo();ee();B();Nm=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(ur,"splitIdentifier");l(HS,"tokenizeFile");l(WS,"tokenizeQuery");l(GS,"buildIndex");l(qS,"idf");l(BS,"score");Lm="bm25-index";l(VS,"saveIndex");l(Fi,"loadIndex");l(Fm,"indexProject");l(Um,"queryFiles")});import jl from"node:fs/promises";import en from"node:path";import{z as se}from"zod";async function YS(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 jl.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 QS(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 sb(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=XS[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 ZS(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 eb(r,e){let t=Date.now();try{let s=await nb(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 tb(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 Hm(r,e){let t=Date.now(),s=await Promise.all([YS(r,e),QS(r,e),ZS(r,e),eb(r,e),tb(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 sb(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await jl.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 nb(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await jl.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 JS,zS,KS,Rl,bD,XS,Wm=S(()=>{"use strict";W();B();Ko();JS=se.enum(["draft","verified","sealed"]),zS=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()}),KS=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()}),Rl=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(zS),antiPatterns:se.array(KS),analyzedAt:se.string(),modelMetadata:qn.optional(),status:JS.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),bD={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},XS={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(YS,"verifyFrameworks");l(QS,"verifyLanguages");l(ZS,"verifyPatternLocations");l(eb,"verifyFileCount");l(tb,"verifyAntiPatternFiles");l(Hm,"semanticVerify");l(sb,"getProjectExtensions");l(nb,"countProjectFiles")});var Al,mt,dr=S(()=>{"use strict";Wm();El();X();En();As();Al=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"};Rl.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 Rl.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:Dm(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 Hm(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 fo(JSON.stringify(t))}},mt=new Al});import Gm from"node:fs/promises";import qm from"node:path";async function Dl(r,e,t,s){let[n,o,i,a]=await Promise.all([ib(r,e,s),ab(r),cb(r),lb(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,rb).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 ib(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=Um(r,n,Il*2);for(let a of o){if(s.length>=Il)break;try{let c=qm.join(e,a.path),u=await Gm.readFile(c,"utf-8");u.length>Ui*3?s.push({path:a.path,content:`${u.slice(0,Ui)}
|
|
560
|
+
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Ui),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>=Il)break;if(!s.some(c=>c.path===a))try{let c=qm.join(e,a),u=await Gm.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,Ui),reason:"entry point"})}catch{}}return s}async function ab(r){try{let e=await mt.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 cb(r){try{return(await L.getTaskHistory(r)).slice(0,ob).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function lb(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 Ui,Il,rb,ob,Bm=S(()=>{"use strict";xl();dr();tr();vt();Is();Ui=800,Il=6,rb=8,ob=5;l(Dl,"buildAnalysisPayload");l(ib,"selectCodeSamples");l(ab,"getExistingPatterns");l(cb,"getTaskHistory");l(lb,"getPreviousAnalysisSummary")});var Hi=S(()=>{"use strict"});import _s from"chalk";function Vm(r){return Math.ceil(r.length/4)}function Jm(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 $l(r){return r.includes("<!-- prjct:preserve")}function zm(r,e){let t=Jm(r),s=Jm(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Vm(r),tokensAfter:Vm(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)$l(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()&&($l(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
|
|
565
|
+
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!$l(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 Km(r,e={}){let{colorize:t=!0}=e,s=[],n=t?_s.green:p=>p,o=t?_s.red:p=>p,i=t?_s.yellow:p=>p,a=t?_s.dim:p=>p,c=t?_s.bold:p=>p;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
|
|
567
567
|
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let p of r.added)s.push(n(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)s.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)s.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let p of r.preserved)s.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}s.push(""),s.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
|
|
568
|
-
`)}function
|
|
568
|
+
`)}function Xm(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 Ym=S(()=>{"use strict";Hi();l(Vm,"estimateTokens");l(Jm,"parseMarkdownSections");l($l,"isPreservedSection");l(zm,"generateSyncDiff");l(Km,"formatDiffPreview");l(Xm,"formatFullDiff")});var ub,Ml,Wi,Ol=S(()=>{"use strict";ee();W();Je();Ci();ub={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Ml=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...ub,...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 Zs.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}},Wi=l((r,e)=>new Ml(r,e),"createStalenessChecker")});import Qm from"node:fs/promises";import mr from"node:path";function db(r){let e=[],t,s=new RegExp(up.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function pb(r,e,t){let s;if(r.startsWith("@/"))s=mr.join(t,"src",r.slice(2));else{let n=mr.dirname(mr.join(t,e));s=mr.resolve(n,r)}for(let n of lp){let o=s+n;try{if((await Qm.stat(o)).isFile())return mr.relative(t,o)}catch{}}return null}async function mb(r){let e=await yn(r),t={},s={},n=0,o=await wn(e,50,async i=>{try{let a=await Qm.readFile(mr.join(r,i),"utf-8"),c=db(a),u=[];for(let d of c){let m=await pb(d,i,r);m&&m!==i&&u.push(m)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function gb(r,e){N.setDoc(r,Zm,e)}function Gi(r){return N.getDoc(r,Zm)}async function eg(r,e){let t=await mb(r);return gb(e,t),t}var Zm,_l=S(()=>{"use strict";rc();ee();B();l(db,"extractImportSources");l(pb,"resolveImport");l(mb,"buildGraph");Zm="import-graph";l(gb,"saveGraph");l(Gi,"loadGraph");l(eg,"indexImports")});function tg(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=Gi(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 sg(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 ng=S(()=>{"use strict";_l();l(tg,"propagateChanges");l(sg,"affectedDomains")});import rg from"node:fs/promises";import fb from"node:path";function hb(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 yb(r){let e=await yn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await wn(e,100,async n=>{try{let o=fb.join(r,n),[i,a]=await Promise.all([rg.readFile(o,"utf-8"),rg.stat(o)]);return{path:n,hash:hb(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function wb(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 Nl(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 kb(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 Ll(r,e){let[t,s]=await Promise.all([yb(r),Promise.resolve(kb(e))]);return{diff:wb(t,s),currentHashes:t}}function og(r){return N.hasDoc(r,"file-hashes-meta")}var ig=S(()=>{"use strict";ee();B();l(hb,"hashContent");l(yb,"computeHashes");l(wb,"diffHashes");l(Nl,"saveHashes");l(kb,"loadHashes");l(Ll,"detectChanges");l(og,"hasHashRegistry")});async function bb(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&&vb(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function vb(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 Tb(r,e=100){let t=await bb(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=Eb(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,m=s.get(u)||0;if(d<2||m<2)continue;let p=d+m-a,g=p>0?a/p:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function Eb(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Cb(r,e){N.setDoc(r,lg,e)}function ug(r){return N.getDoc(r,lg)}async function dg(r,e,t=100){let s=await Tb(r,t);return Cb(e,s),s}var lg,pg=S(()=>{"use strict";Eo();ee();Je();l(bb,"parseGitLog");l(vb,"isSourceFile");l(Tb,"buildMatrix");l(Eb,"pairKey");lg="cochange-index";l(Cb,"saveMatrix");l(ug,"loadMatrix");l(dg,"indexCoChanges")});import hg from"node:fs/promises";import mg from"node:os";import Fl from"node:path";function xb(){let r=ht("mcp-config.json");if(!r)return{mcpServers:{context7:Ul}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Ul}}}}function yg(){return xb().mcpServers?.context7||Ul}function gg(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Fl.join(mg.tmpdir(),"prjct-context7-test","mcp.json"):Fl.join(mg.homedir(),".claude","mcp.json")}async function fg(r){try{let e=await hg.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(O(e))return{};throw e}}async function jb(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=yg(),e=[...r.args||[],"--help"];await hn(r.command||"npx",e,{timeout:15e3})}var Ul,gr,Hl,Rb,ss,fr=S(()=>{"use strict";fs();io();W();Je();B();Ul={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},gr=null;l(xb,"parseTemplateConfig");l(yg,"getContext7Config");l(gg,"getConfigPath");l(fg,"readConfig");l(jb,"runSmokeCheck");Hl=class{static{l(this,"Context7Service")}async install(){let e=gg(),t=Fl.dirname(e);await hg.mkdir(t,{recursive:!0});let s=await fg(e),n=s.mcpServers||{};return n.context7=yg(),s.mcpServers=n,await de(e,s),gr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(gr&&Date.now()-gr.at<3e5)return gr.status;let e=gg(),n=((await fg(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 jb();let o={installed:!0,verified:!0,configPath:e};return gr={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${k(o)}`};return gr={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}},Rb=new Hl,ss=Rb});import{execFileSync as wg,execSync as Ab}from"node:child_process";var qi,Wl,Bi,kg,Sg=S(()=>{"use strict";kn();bo();qi={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"}},Wl=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=qi[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=qi[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Bi(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=qi[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
|
|
585
|
+
`);throw new Bi({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(qi),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=Ab(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:or(`${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:or(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return wg(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return wg(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:or(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Gs(t,this.cacheTimeout)?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Bi=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}},kg=new Wl});var Ji={};ye(Ji,{installAntigravitySkill:()=>Cg,installCodexSkill:()=>Gl,needsAntigravityInstallation:()=>Ob,run:()=>Eg,verifyCodexPRouterReady:()=>hr});import{execFileSync as Ib}from"node:child_process";import oe from"node:fs/promises";import Dn from"node:os";import ge from"node:path";import Ee from"chalk";async function Db(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!kg.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(""),Ib("npm",["install","-g",e],{stdio:"inherit",timeout:rr("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 Eg(){let r=await Ps(),e=await gc(),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 Db(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 p=await Ue.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,s.commandsAdded+=p.added,s.commandsUpdated+=p.updated);let g=await Ue.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Ue.installDocs(),await Fb(),await ss.ensureReady()}}else if(a==="gemini"){await $b()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await Mb();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await Vn()).installed&&(await Cg()).success&&console.log(` ${Ee.green("\u2713")} Antigravity skill installed`),(await Sn()).installed){if(!(await Gl()).success)throw new Error("Codex skill installation failed");let c=await hr({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 uo.saveConfig(ke,await Ue.getInstallPath(),e.provider),await Lb();for(let a of s.providers)Ub(a,ze[a.provider]);return s}async function $b(){try{let r=ge.join(Dn.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 Mb(){try{let r=ge.join(Dn.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=Ni(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 Cg(){try{let r=ge.join(Dn.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 Ob(){let r=await Vn();return r.installed&&!r.skillInstalled}function xg(){return ge.join(Dn.homedir(),".codex","skills","prjct","SKILL.md")}function _b(r){return`<!-- ${Pg}: ${JSON.stringify({version:ke,templateHash:r})} -->`}function bg(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 Nb(r){return fo(r)}async function jg(){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 Rg(r){let e=r.trimEnd(),t=Nb(e),s=_b(t);return{content:`${e}
|
|
587
587
|
|
|
588
588
|
${s}
|
|
589
|
-
`,templateHash:t}}async function
|
|
589
|
+
`,templateHash:t}}async function Gl(){try{let r=xg(),e=ge.dirname(r);await oe.mkdir(e,{recursive:!0});let t=await C(r),s=await jg();if(!s)return V.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Rg(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 hr(r={}){let e=xg();if(!(await Sn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await jg();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=Rg(s),o=l(async()=>r.autoRepair?(await Gl()).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=bg(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=bg(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 Lb(){try{let r=ge.join(Dn.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 vg(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 Fb(){try{let r=ge.join(Dn.homedir(),".claude"),e=ge.join(r,"settings.json"),t=ge.join(r,"prjct-statusline.sh"),s=ge.join(Dn.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"),m=ge.join(u,"themes"),p=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 Vi(p,i),await Vi(g,a),await Tg(t,n),await vg(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 Vi(p,i),await Vi(g,a),await C(m)){let h=await oe.readdir(m);for(let x of h){let T=ge.join(m,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 Tg(t,n),await vg(e,t)}catch(r){O(r)||V.warn(`Status line warning: ${k(r)}`)}}async function Vi(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 Tg(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 Ub(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,Hb,yr=S(()=>{"use strict";fs();fr();Sg();ee();W();xn();B();En();Is();ut();lt();Os();ai();vl();l(Db,"installAICLI");l(Eg,"run");l($b,"installGeminiRouter");l(Mb,"installGeminiGlobalConfig");l(Cg,"installAntigravitySkill");l(Ob,"needsAntigravityInstallation");Pg="prjct-codex-router";l(xg,"getCodexSkillPath");l(_b,"getCodexSkillMetadata");l(bg,"parseCodexSkillMetadata");l(Nb,"hashContent");l(jg,"loadCodexSkillTemplate");l(Rg,"buildCodexSkillContent");l(Gl,"installCodexSkill");l(hr,"verifyCodexPRouterReady");l(Lb,"migrateProjectsCliVersion");l(vg,"ensureStatusLineSettings");l(Fb,"installStatusLine");l(Vi,"installStatusLineModules");l(Tg,"ensureStatusLineSymlink");l(Ub,"showResults");Hb=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Hb&&Eg().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import ie from"node:fs/promises";import ne from"node:path";async function zi(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 Wb(n,o,i),E.getDb(r);for(let{filename:c,key:u}of Vl){let d=ne.join(n,c),m=await ns(d);if(m===null){t.skippedFiles.push(c);continue}try{E.setDoc(r,u,m),Ag(r,u,m),t.migratedFiles.push(c)}catch(p){t.errors.push({file:c,error:String(p)})}}for(let{filename:c,key:u}of Bl){let d=ne.join(o,c),m=await ns(d);if(m===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(m),new Date().toISOString()),Ig(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(p){t.errors.push({file:`index/${c}`,error:String(p)})}}await Xb(r,o,t),await Yb(r,o,t),await Qb(r,i,t),await Zb(r,i,t);let a=ne.join(s,"sessions");return await ev(r,a,t),t.errors.length===0&&await tv(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 Wb(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 ql(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await ql(e,ne.join(s,"index")),await ql(t,ne.join(s,"memory")),s}async function ql(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 Ag(r,e,t){switch(e){case"state":Gb(r,t);break;case"queue":qb(r,t);break;case"ideas":Bb(r,t);break;case"shipped":Vb(r,t);break;case"metrics":Jb(r,t);break;case"analysis":zb(r,t);break}}function Gb(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 m=u[d];n.run(_(m.id)??`subtask-${d}`,_(a.id),_(m.description)??"",_(m.status)??"pending",_(m.domain),_(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,_(m.startedAt),_(m.completedAt),_(m.output),m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function
|
|
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 m=u[d];n.run(_(m.id)??`subtask-${d}`,_(a.id),_(m.description)??"",_(m.status)??"pending",_(m.domain),_(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,_(m.startedAt),_(m.completedAt),_(m.output),m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function qb(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 Bb(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 Vb(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 Jb(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),tn(o.tokensSaved)??0,tn(o.syncs)??0,tn(o.avgCompressionRate)??0,tn(o.totalDuration)??0)}function
|
|
648
|
+
`);for(let o of t)n.run(_(o.date)??new Date().toISOString().slice(0,10),tn(o.tokensSaved)??0,tn(o.syncs)??0,tn(o.avgCompressionRate)??0,tn(o.totalDuration)??0)}function zb(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 Ig(r,e,t){e==="categories-cache"&&Kb(r,t)}function Kb(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 Xb(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 Yb(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,tn(c.score)??0,tn(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
|
|
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",m=_(u.taskId??u.task_id),p=_(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function
|
|
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()}`,m=u.tags,p=m&&m.length>0?_(m[0]):null;a.run(d,p,c,1,_(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function
|
|
662
|
+
`);i.transaction(()=>{for(let c of o){let u=_(c.path);u&&a.run(u,tn(c.score)??0,tn(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 Qb(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",m=_(u.taskId??u.task_id),p=_(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Zb(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()}`,m=u.tags,p=m&&m.length>0?_(m[0]):null;a.run(d,p,c,1,_(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){O(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function ev(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),tn(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 m of u){let p=ne.join(c,m);try{if(!(await ie.stat(p)).isDirectory())continue;let w=await ie.readdir(p);for(let h of w){if(!h.endsWith(".json"))continue;let x=ne.join(p,h),T=await ns(x);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${m}/${h}`),await ie.unlink(x).catch(()=>{})}catch(I){t.errors.push({file:`sessions/archive/${m}/${h}`,error:String(I)})}}(await ie.readdir(p)).length===0&&await ie.rmdir(p).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
|
|
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),tn(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 m of u){let p=ne.join(c,m);try{if(!(await ie.stat(p)).isDirectory())continue;let w=await ie.readdir(p);for(let h of w){if(!h.endsWith(".json"))continue;let x=ne.join(p,h),T=await ns(x);if(T!==null)try{o(T),t.migratedFiles.push(`sessions/archive/${m}/${h}`),await ie.unlink(x).catch(()=>{})}catch(I){t.errors.push({file:`sessions/archive/${m}/${h}`,error:String(I)})}}(await ie.readdir(p)).length===0&&await ie.rmdir(p).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 tv(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 Vl)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 tn(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 Ki(r){let e=A.getGlobalProjectPath(r),t=ne.join(e,"storage"),s=0;E.getDb(r);for(let{filename:w,key:b}of Vl){let h=ne.join(t,w),x=await ns(h);if(x!==null){E.setDoc(r,b,x),Ag(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),tn(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 m=ne.join(a,"archive");try{let w=await ie.readdir(m);for(let h of w){let x=ne.join(m,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(m).catch(()=>[])).length===0&&await ie.rmdir(m).catch(()=>{})}catch{}try{(await ie.readdir(a)).length===0&&await ie.rmdir(a).catch(()=>{})}catch{}let p=ne.join(e,"index"),g=[...
|
|
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),tn(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 m=ne.join(a,"archive");try{let w=await ie.readdir(m);for(let h of w){let x=ne.join(m,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(m).catch(()=>[])).length===0&&await ie.rmdir(m).catch(()=>{})}catch{}try{(await ie.readdir(a)).length===0&&await ie.rmdir(a).catch(()=>{})}catch{}let p=ne.join(e,"index"),g=[...Bl.map(w=>w.filename),"checksums.json","file-scores.json"];for(let w of g){let b=ne.join(p,w),h=await ns(b);if(h===null)continue;let x=Bl.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()),Ig(r,x.key,h));try{await ie.unlink(b)}catch{}s++}return s}var Vl,Bl,Jl=S(()=>{"use strict";ve();W();ee();Vl=[{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"}],Bl=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(zi,"migrateJsonToSqlite");l(Wb,"createBackup");l(ql,"copyFiles");l(Ag,"populateNormalized");l(Gb,"populateTasksFromState");l(qb,"populateQueueTasks");l(Bb,"populateIdeas");l(Vb,"populateShippedFeatures");l(Jb,"populateMetricsDaily");l(zb,"populateAnalysis");l(Ig,"populateIndexTables");l(Kb,"populateCategoriesIndex");l(Xb,"migrateChecksums");l(Yb,"migrateFileScores");l(Qb,"migrateEventsJsonl");l(Zb,"migrateLearningsJsonl");l(ev,"migrateSessionFiles");l(tv,"cleanupJsonFiles");l(_,"toStr");l(tn,"toNum");l(ns,"readJsonSafe");l(Ki,"sweepLegacyJson")});var Co,zl,Kl,Dg=S(()=>{"use strict";vo();X();Co=3,zl=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>=Co){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}/${Co} 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>=Co){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}/${Co} 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>=Co&&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
|
+
`)}},Kl=new zl});import{z as R}from"zod";var $g,sv,nv,Mg,rv,ov,iv,av,cv,lv,uv,Og,dv,pv,dM,_g,Ng,Lg,Fg,mv,Xi,Ug=S(()=>{"use strict";$g=R.number().min(1).max(5),sv=R.enum(["exceeded","met","partial","failed"]),nv=R.enum(["definitely","probably","maybe","no"]),Mg=R.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),rv=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:Mg.optional(),explanation:R.string().optional()})}),ov=R.object({name:R.string(),baseline:R.number().nullable(),target:R.number(),actual:R.number(),unit:R.string(),achieved:R.boolean(),percentOfTarget:R.number()}),iv=R.object({criteria:R.string(),met:R.boolean(),notes:R.string().optional()}),av=R.object({metrics:R.array(ov),acceptanceCriteria:R.array(iv),overallSuccess:sv,successScore:R.number().min(0).max(100)}),cv=R.object({category:R.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:R.string(),actionable:R.boolean(),action:R.string().optional()}),lv=R.object({whatWorked:R.array(R.string()),whatDidnt:R.array(R.string()),surprises:R.array(R.string()),recommendations:R.array(cv)}),uv=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:nv,worthItReason:R.string().optional(),alternativeConsidered:R.string().optional(),betterAlternativeExists:R.boolean().optional()}),Og=R.object({id:R.string(),taskId:R.string(),description:R.string(),estimatedMinutes:R.number().optional(),actualMinutes:R.number(),completedAsPlanned:R.boolean(),qualityScore:$g,blockers:R.array(R.string()),agentUsed:R.string().optional(),skillsUsed:R.array(R.string()).optional(),startedAt:R.string(),completedAt:R.string()}),dv=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:rv,success:av.optional(),learnings:lv,roi:uv,rating:$g,taskOutcomes:R.array(Og).optional(),startedAt:R.string(),shippedAt:R.string(),reviewedAt:R.string().optional(),reviewedBy:R.string().optional(),legacy:R.boolean().optional()}),pv=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:Mg,count:R.number(),averageVariance:R.number()})),topLearnings:R.array(R.object({insight:R.string(),frequency:R.number()}))}),dM=R.object({outcomes:R.array(dv),taskOutcomes:R.array(Og).optional(),aggregates:pv.optional(),lastUpdated:R.string(),lastAggregated:R.string().optional()}),_g={outcomes:[],taskOutcomes:[],lastUpdated:""},Ng=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"),Lg=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Fg=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),mv=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Xi=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=>mv(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,m)=>{let p=m.effort.variance.reason;return d[p]||(d[p]={count:0,totalVariance:0}),d[p].count++,d[p].totalVariance+=m.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,m])=>({reason:d,count:m.count,averageVariance:Math.round(m.totalVariance/m.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,m)=>(d[m]=(d[m]||0)+1,d),{}),u=Object.entries(c).sort((d,m)=>m[1]-d[1]).slice(0,10).map(([d,m])=>({insight:d,frequency:m}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,m)=>d+m,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,m)=>d+m,0)/t.length):0,averageROI:Math.round(s.reduce((d,m)=>d+m,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var Xl,Hg,Wg=S(()=>{"use strict";Ug();As();X();Xl=class extends dt{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{..._g,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:Xi([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?Xi(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Xi(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=Ng(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Lg(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:Fg(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}}},Hg=new Xl});import Yl from"node:fs/promises";import Yi from"node:path";var Ql,Zl,Gg,qg=S(()=>{"use strict";W();B();Ql=".prjct/.prjct-state.md",Zl=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Yi.join(e,Ql);await Yl.mkdir(Yi.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await Yl.writeFile(s,n,"utf-8")}async remove(e){try{await Yl.unlink(Yi.join(e,Ql))}catch(t){if(!O(t))throw t}}async exists(e){let t=Yi.join(e,Ql);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
|
+
`)}},Gg=new Zl});var eu,Ht,$n=S(()=>{"use strict";Te();Vs();ee();eu=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 eu});import gv from"node:path";function fv(r){return Tn(gv.resolve(r))}function Po(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function hv(r){return Oc(r,e=>`${Po(e.name)}::${Po(e.source)}`)}function yv(r){return Oc(r,e=>`${Po(e.issue)}::${Po(e.file)}::${Po(e.source)}`)}var tu,wv,Bg,Vg=S(()=>{"use strict";ee();pi();En();l(fv,"repoHash");l(Po,"normalizeKey");l(hv,"dedupePatterns");l(yv,"dedupeAntiPatterns");tu=class{static{l(this,"PatternExtractor")}async extract(e){let t=fv(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=hv([...s,...n]),a=yv([...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}}},wv=new tu,Bg=wv});import xo from"node:fs/promises";import kv from"node:os";import jo from"node:path";function Sv(r){return`# ${r.projectName}
|
|
676
|
+
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function bv(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 vv(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 Tv(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 Ev(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 Cv(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 Pv(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 xv(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 jv(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 Rv(r){return[bv(r),vv(r),Tv(r),Ev(r),Cv(r),Pv(r.commands),xv(r),jv(r)].filter(Boolean).join("")}function Av(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 Iv(r,e){return`${Av(r,e)}
|
|
714
714
|
|
|
715
|
-
${r.body(e)}`}var
|
|
716
|
-
${
|
|
715
|
+
${r.body(e)}`}var su,nu,Jg,zg=S(()=>{"use strict";xs();Is();l(Sv,"formatProjectHeader");l(bv,"formatPatterns");l(vv,"formatAntiPatterns");l(Tv,"formatGotchas");l(Ev,"formatRecentShipped");l(Cv,"formatVelocity");l(Pv,"formatCommands");l(xv,"formatState");l(jv,"formatUserPatterns");l(Rv,"formatRichContext");su=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${Sv(r)}
|
|
716
|
+
${Rv(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(
|
|
820
|
+
`,"body")}];l(Av,"buildFrontmatter");l(Iv,"buildSkillContent");nu=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=jo.join(kv.homedir(),".claude","skills");for(let c of su){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await xo.rm(jo.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=Iv(c,o),d=jo.join(i,c.name),m=jo.join(d,"SKILL.md");await xo.mkdir(d,{recursive:!0}),await xo.writeFile(m,u,"utf-8"),n.generated.push({name:c.name,path:m})}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(su.map(c=>c.name));try{let c=await xo.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await xo.rm(jo.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 su}},Jg=new nu});var Kg=S(()=>{"use strict"});import Dv from"node:fs/promises";import Xg from"node:path";var Qi,Yg=S(()=>{"use strict";B();Qi=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=Xg.join(this.projectPath,"package.json"),t=await Dv.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return C(Xg.join(this.projectPath,e))}}});import ru from"node:path";async function Qg(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
821
|
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await 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,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${bn()}`}function U(...r){return
|
|
824
|
-
`)}function
|
|
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:we(t)})}return e}async function rs(r,e){let t=await C(ru.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Zg(r){let e={fileCount:0,version:"0.0.0",name:ru.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=ru.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 ef(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 tf(r){return new Qi(r).detect()}var sf=S(()=>{"use strict";xs();Kg();Je();B();Is();Yg();l(Qg,"analyzeGit");l(rs,"fileExistsInProject");l(Zg,"gatherStats");l(ef,"detectCommands");l(tf,"detectStack")});import nf from"node:fs/promises";import Zi from"node:path";var ou,iu,rf,of=S(()=>{"use strict";vt();W();Je();B();ou={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Zi.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=Zi.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=Zi.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 nf.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await nf.readFile(Zi.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}}},iu=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[ou.contextFilesExist(t),ou.jsonFilesValid(t),ou.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}}}},rf=new iu});import af from"node:fs/promises";import au from"node:path";var cu,Ns,ea=S(()=>{"use strict";dl();xl();ng();ig();pg();_l();xs();lt();Os();Te();ve();yr();dr();Vs();ee();zs();tr();ho();Jl();Vt();Ks();vt();ki();X();B();Is();Dg();Wg();fr();qg();$n();Vg();zg();sf();of();cu=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 af.rm(au.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Sn()).installed){let y=await hr({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 zi(this.projectId);try{let y=await Ki(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([Qg(this.projectPath),Zg(this.projectPath),ef(this.projectPath),tf(this.projectPath)]),m=t.full===!0,p,g=!0,w=new Set;if(!m&&og(this.projectId))try{let{diff:y,currentHashes:j}=await Ll(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=tg(y,this.projectId);w=sg(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)}}Nl(this.projectId,j)}catch(y){V.debug("Incremental detection failed, falling back to full sync",{error:we(y)})}else try{let{currentHashes:y}=await Ll(this.projectPath,this.projectId);Nl(this.projectId,y)}catch(y){V.debug("Hash computation failed (non-critical)",{error:we(y)})}if(g)try{await Promise.all([Fm(this.projectPath,this.projectId),eg(this.projectPath,this.projectId),dg(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,Ja,za]=await Promise.all([Promise.resolve(Qt.getActive(this.projectId)).catch(()=>null),mt.getActive(this.projectId).catch(()=>null),it.getRecent(this.projectId,3).catch(()=>[]),sr.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)]),Ka={backlogCount:Q.length,completedTaskCount:Ve.length,pausedTaskCount:he.length,hasActiveTask:!!us},Xa=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})),Ya=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"})),Qa=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:Xa,antiPatterns:Ya,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:Ja?.pending??0,shippedCount:za};b=await Jg.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:Qa,stack:d},Ka,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 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 rf.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: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:we(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>af.mkdir(au.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 Gg.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=Fi(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=Fi(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=Gi(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=ug(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 Bg.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: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 cr,s=await Kl.learnFromTaskHistory(this.projectId,e,t);try{let n=await Hg.getFeatureOutcomes(this.projectId);n.length>0&&await Kl.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=au.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 cu});var df={};ye(df,{mdActionRequired:()=>It,mdBadge:()=>ta,mdCallout:()=>os,mdCodeBlock:()=>lu,mdDone:()=>fe,mdError:()=>$v,mdFooter:()=>lf,mdFrontmatter:()=>uf,mdHeader:()=>cf,mdJoin:()=>sa,mdList:()=>He,mdNextSteps:()=>le,mdObsidianNote:()=>Ls,mdOutput:()=>U,mdRelevantFiles:()=>du,mdSection:()=>te,mdStats:()=>Ye,mdSubtasks:()=>uu,mdTable:()=>sn,mdTaskHeader:()=>wr,mdWarn:()=>pu});function cf(){return"---"}function lf(){return`---
|
|
823
|
+
prjct v${bn()}`}function U(...r){return sa(cf(),...r.filter(Boolean),lf())}function sn(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
|
|
824
|
+
`)}function lu(r,e=""){return`\`\`\`${e}
|
|
825
825
|
${r}
|
|
826
|
-
\`\`\``}function
|
|
826
|
+
\`\`\``}function ta(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
|
-
${sn(t,s)}`}function
|
|
828
|
+
`)}function wr(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 uu(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
|
+
${sn(t,s)}`}function du(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
833
|
${sn(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 sn(t,s)}function fe(r,e){return e?`## ${r}
|
|
834
|
-
> ${e}`:`## ${r}`}function
|
|
835
|
-
`)}function
|
|
834
|
+
> ${e}`:`## ${r}`}function pu(r){return`> **WARNING:** ${r}`}function $v(r){return`> **ERROR:** ${r}`}function uf(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[uf(r),`# ${e}`,...t.filter(Boolean)].join(`
|
|
836
836
|
|
|
837
|
-
`)}function
|
|
837
|
+
`)}function sa(...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(cf,"mdHeader");l(lf,"mdFooter");l(U,"mdOutput");l(sn,"mdTable");l(lu,"mdCodeBlock");l(ta,"mdBadge");l(os,"mdCallout");l(te,"mdSection");l(He,"mdList");l(wr,"mdTaskHeader");l(uu,"mdSubtasks");l(du,"mdRelevantFiles");l(le,"mdNextSteps");l(Ye,"mdStats");l(fe,"mdDone");l(pu,"mdWarn");l($v,"mdError");l(uf,"mdFrontmatter");l(Ls,"mdObsidianNote");l(sa,"mdJoin");l(It,"mdActionRequired")});import Ro from"chalk";function Wt(r,e={}){if(e.quiet)return;let t=mf[r]||"idle",s=vn.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:pf[o]||o}));console.log(Ro.dim(`
|
|
841
|
+
Next:`));for(let o of n){let i=Ro.cyan(o.cmd.padEnd(12));console.log(Ro.dim(` ${i} \u2192 ${o.desc}`))}}function na(r,e=!1){let t=mf[r]||"idle";return vn.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:pf[n]||n}))}function Ao(r){let e=vn.getStateInfo(r);console.log(Ro.dim(`\u{1F4CD} State: ${Ro.white(r.toUpperCase())} - ${e.description}`))}var pf,mf,kr=S(()=>{"use strict";Fc();pf={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"},mf={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(na,"getNextSteps");l(Ao,"showStateInfo")});import Mv from"node:path";async function mu(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: ${Sr(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 gf(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,m)=>d-m);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 Sr(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function gu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function ff(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 hf(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 | ${Sr(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${yi(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${gu(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: ${Sr(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 yf(r,e){let t=[];t.push(`# Repository Analysis
|
|
844
844
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
845
|
-
`);let s=
|
|
845
|
+
`);let s=Mv.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 wf=S(()=>{"use strict";Os();wi();$n();X();kr();Fe();l(mu,"showSyncResult");l(gf,"getSessionActivity");l(Sr,"formatTokens");l(gu,"formatDuration");l(ff,"generateSparkline");l(hf,"generateStatsMarkdown");l(yf,"generateAnalysisSummary")});var kf,Sf,bf=S(()=>{"use strict";kf=["task","done","ship","resume","bug","enrich"],Sf=["init","sync","pause","next","dash","history","undo","redo"]});import ys from"chalk";function Ov(r){return vf[r.toLowerCase()]||vf.default}var vf,fu,Tf,Ef=S(()=>{"use strict";vf={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(Ov,"getIcon");fu=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=Ov(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`}},Tf=new fu});import Cf from"node:fs";import ra from"node:path";function _v(r){if(fn()){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 hu,oa,Pf=S(()=>{"use strict";ro();l(_v,"openDatabase");hu=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?ra.resolve(e):ra.join(Bt("node:os").homedir(),".prjct-cli");this.dbPath=ra.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=ra.dirname(this.dbPath);Cf.existsSync(e)||Cf.mkdirSync(e,{recursive:!0});let t=_v(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)}},oa=new hu});import is from"node:fs/promises";import Io from"node:os";import gt from"node:path";function Nv(){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 xf(){return Do.split("@")[1]}function ws(){return process.env.PRJCT_TEST_MODE==="1"?gt.join(Io.tmpdir(),"prjct-context7-test","mcp.json"):gt.join(Io.homedir(),".claude","mcp.json")}async function jf(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:ws(),mergeIntoExisting:!1}];let r=Io.homedir(),e=[],t=gt.join(r,".claude");await Xt(t)&&e.push({provider:"claude",configPath:gt.join(t,"mcp.json"),mergeIntoExisting:!1});let s=gt.join(r,".gemini");return await Xt(s)&&e.push({provider:"gemini",configPath:gt.join(s,"settings.json"),mergeIntoExisting:!0}),e}async function Rf(r){let e=await jf(),t=await Promise.all(e.map(async s=>({provider:s.provider,configured:await nn(r,s.configPath),path:s.configPath})));return{configured:t.some(s=>s.configured),providers:t}}async function ia(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 Lv(){let r=xf(),e=gt.join(Io.homedir(),".mcp-auth"),t=gt.join(e,`mcp-remote-${r}`);if((await ia(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 ia(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 Fv(r){if((await ia(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 Af(r){let e=[],t=!1,s=await jf();for(let n of s){let o=await wu(n.configPath),i=o.mcpServers?.[r];if(!i){e.push(`${n.provider}: no ${r} entry in mcp.json`);continue}let a=aa[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 Df(o,n.configPath),t=!0}}return{valid:e.length===0,issues:e,autoFixed:t}}async function If(r){let e=xf(),t=gt.join(Io.homedir(),".mcp-auth"),s=gt.join(t,`mcp-remote-${e}`),n=!1,o=!1,i=await ia(s);if(i.valid)return oa.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 Fv(s));let a=await Lv();if(a.migrated)return n=!0,oa.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(m=>m.startsWith("mcp-remote-")&&m!==`mcp-remote-${e}`)}catch{}let u=o?`Previous tokens were invalid and cleaned. Run in a terminal: ${yu[r]}`:c.length>0?`Legacy tokens found (${c.join(", ")}) but invalid. Run: ${yu[r]}`:`OAuth not completed. Run in a terminal: ${yu[r]}`;return oa.setMcpHealth(r,{status:"unhealthy",lastError:u,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:u,validated:!1,migrated:!1,cleaned:o}}async function wu(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 Df(r,e=ws()){await de(e,r)}async function ku(r,e,t=ws()){let s=await wu(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await Df(s,t),{path:t,changed:i}}async function nn(r,e=ws()){return!!(await wu(e)).mcpServers?.[r]}var Do,aa,yu,$o=S(()=>{"use strict";Pf();W();B();Do="mcp-remote@0.1.38";l(Nv,"getPrjctMcpConfig");aa={prjct:Nv(),linear:{command:"npx",args:["-y",Do,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Do,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},yu={linear:`npx -y ${Do} https://mcp.linear.app/mcp`,jira:`npx -y ${Do} https://mcp.atlassian.com/v1/mcp`};l(xf,"getMcpRemoteVersion");l(ws,"getClaudeMcpConfigPath");l(jf,"getActiveMcpConfigPaths");l(Rf,"hasMcpServerAny");l(ia,"validateTokenFiles");l(Lv,"migrateOAuthTokens");l(Fv,"cleanCorruptedTokens");l(Af,"validateMcpConfig");l(If,"checkOAuthTokens");l(wu,"readMcpConfig");l(Df,"writeMcpConfig");l(ku,"upsertMcpServer");l(nn,"hasMcpServer")});import wt from"chalk";function Uv(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%$f.length;return $f[t]}function Hv(r,e,t="\u25B6"){let s=wt.dim(String(r+1).padStart(2)),o=Uv(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 Wv(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(Hv(t,r[t]));return e.push(""),e.join(`
|
|
886
|
+
`)}function Mf(r){console.log(Wv(r))}var $f,Of=S(()=>{"use strict";$f=[wt.cyan,wt.magenta,wt.yellow,wt.blue,wt.green,wt.redBright,wt.magentaBright,wt.cyanBright];l(Uv,"getDomainColor");l(Hv,"formatSubtaskLine");l(Wv,"renderSubtaskProgress");l(Mf,"printSubtaskProgress")});function qv(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 Bv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Gv)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:qv(t)};return{detected:!1}}function Vv(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 Jv(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 zv(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 Kv(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 Gv,Su,Xv,br,_f=S(()=>{"use strict";Gv=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l(qv,"getHallucinationSuggestion");l(Bv,"detectHallucination");l(Vv,"isSimilarError");l(Jv,"analyzeErrorPattern");l(zv,"generateEscalationMessage");l(Kv,"generateSuggestion");Su=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=>Vv(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=Jv(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:zv(e,o,this.maxAttempts),suggestion:Kv(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 Bv(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}}},Xv=new Su,br=Xv});function bu(r,e){let t=Mo(e),s=Mm[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 Yv(r,e){let t=Mo(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Qv(r,e,t){let s=Mo(t),n=bu(r,t),o=bu(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function ca(r,e=Xs){let t=Mo(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Zv(r,e),n=eT(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=nT(o),a=tT(o),c=sT(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=rT(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function Lf(r,e,t=Xs){let s=Mo(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 Zv(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=Qv(i,n,e);if(!t.has(a)){let c=bu(i,e),u=Yv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function eT(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+oT(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>vu(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 tT(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 sT(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=vu(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function nT(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 rT(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=vu(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 vu(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 Ff(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 oT(r){if(!r.estimatedDuration)return 0;let e=Lt(r.estimatedDuration);if(e<=0)return 0;let t=Nf[0],s=Number.POSITIVE_INFINITY;for(let n of Nf){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function Mo(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Nf,Tu=S(()=>{"use strict";Eo();yo();X();l(bu,"getSprintStart");l(Yv,"getSprintEnd");l(Qv,"getSprintNumber");l(ca,"calculateVelocity");l(Lf,"projectCompletion");l(Zv,"bucketBySprint");l(eT,"buildSprintVelocities");l(tT,"detectTrend");l(sT,"calculateOverallAccuracy");l(nT,"calculateAverageVelocity");l(rT,"detectEstimationPatterns");l(vu,"parseVariancePercent");l(Ff,"formatVelocityContext");Nf=[{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(oT,"derivePoints");l(Mo,"resolveConfig")});import iT from"node:fs/promises";import la from"node:path";async function Fs(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Eu(r),c=await uT(e),u=await dT(e),d=[];for(let p of c){if(!i&&mT(p))continue;let g=pT(p,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,n);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-s}}}function Eu(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 uT(r){let e=[];async function t(s,n=""){try{let o=await iT.readdir(s,{withFileTypes:!0});for(let i of o){let a=la.join(s,i.name),c=la.join(n,i.name);if(i.isDirectory()){if(lT.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=la.extname(i.name).toLowerCase();cT.has(u)&&e.push(c)}}}catch(o){O(o)}}return l(t,"walk"),await t(r),e}async function dT(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 pT(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),m=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let h of e){d.includes(h)&&(o+=.3,n.push(`keyword:${h}`));for(let x of m)if(x.includes(h)||h.includes(x)){o+=.15;break}}o=Math.min(1,o);for(let[h,x]of Object.entries(aT))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 p=t.get(r);p&&(p.daysAgo<=1?(a=1,n.push("recent:1d")):p.daysAgo<=3?(a=.8,n.push("recent:3d")):p.daysAgo<=7?(a=.6,n.push("recent:1w")):p.daysAgo<=30&&(a=.3,n.push("recent:1m")),p.commits>=5&&(a=Math.min(1,a+.2)));let g=la.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 mT(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 aT,cT,lT,Oo=S(()=>{"use strict";W();Je();aT={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"]},cT=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),lT=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Fs,"findRelevantFiles");l(Eu,"extractKeywords");l(uT,"getAllCodeFiles");l(dT,"getGitRecency");l(pT,"scoreFile");l(mT,"isTestFile")});async function _o(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 hT(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await fT(r,t);return o=o.filter(c=>!yT(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 fT(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),m=c[3],p=o-d,g=Math.floor(p/86400),w=Math.floor(p/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:m,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
|
|
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),m=c[3],p=o-d,g=Math.floor(p/86400),w=Math.floor(p/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:m,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 hT(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 m=parseInt(d[1],10);m>c&&(c=m)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let m=parseInt(d[1],10),p=parseInt(d[2],10),g=d[3],w=a-p,b=Math.floor(w/86400),h=Math.floor(w/3600),x=Math.max(0,1-b/14),T=m/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:m,heatScore:Math.round(I*100)/100,lastChanged:M,lastChangedAt:new Date(p*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function
|
|
914
|
-
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:
|
|
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 m=parseInt(d[1],10);m>c&&(c=m)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let m=parseInt(d[1],10),p=parseInt(d[2],10),g=d[3],w=a-p,b=Math.floor(w/86400),h=Math.floor(w/3600),x=Math.max(0,1-b/14),T=m/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:m,heatScore:Math.round(I*100)/100,lastChanged:M,lastChangedAt:new Date(p*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function yT(r){let e=r.split("/").pop()||"";for(let t of gT)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var gT,Cu=S(()=>{"use strict";Je();gT=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(_o,"getRecentFiles");l(fT,"getHotFilesFromCommits");l(hT,"getBranchOnlyFiles");l(yT,"shouldIgnore")});function Pu(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Uf(r,e){let t=wT[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function Hf(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function ua(r,e){let t=Pu(r),s=Pu(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=Uf(n,kT),a=xu.map(c=>({model:c,...Uf(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Hf(i.total),byModel:a}}}function Mn(r){let e=Pu(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:xu.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function ju(r){if(r.length===0)return Mn("");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=xu.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:Hf(i),byModel:o}}}var wT,kT,xu,da=S(()=>{"use strict";Hi();wT={"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}},kT="claude-sonnet-4.5";l(Pu,"countTokens");xu=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Uf,"calculateModelCost");l(Hf,"formatCostSaved");l(ua,"measureCompression");l(Mn,"noCompression");l(ju,"combineMetrics")});import qf from"node:fs/promises";import as from"node:path";async function rn(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:Mn("")};let o;try{o=await qf.readFile(t,"utf-8")}catch(m){if(O(m))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Mn("")};throw m}let i=as.extname(r).toLowerCase(),a=Bf[i]||"unknown",c=TT[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Mn(o)};let u=ET(o,c),d=u.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
|
|
914
|
+
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:ua(o,d)}}async function Ru(r,e=process.cwd(),t={}){let s=as.isAbsolute(r)?r:as.join(e,r),n=[];async function o(i){let a=await qf.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 m=as.extname(c.name).toLowerCase();if(Bf[m]){let p=await rn(d,e);n.push(p)}}}}return l(o,"processDir"),await o(s),n}function ET(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,m=i[0].trim(),p;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:
|
|
916
|
+
`).length,m=i[0].trim(),p;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:CT(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function CT(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var Bf,Wf,ST,bT,vT,Gf,TT,pa=S(()=>{"use strict";W();da();Bf={".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"},Wf=[{type:"function",pattern:/^export\s+(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^export\s+const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1,exported:!0},{type:"function",pattern:/^(?:async\s+)?function\s+(\w+)\s*(<[^>]*>)?\s*\(([^)]*)\)\s*(?::\s*([^{;]+))?/gm,nameIndex:1},{type:"function",pattern:/^const\s+(\w+)\s*(?::\s*[^=]+)?\s*=\s*(?:async\s+)?\([^)]*\)\s*(?::\s*[^=]+)?\s*=>/gm,nameIndex:1},{type:"interface",pattern:/^export\s+interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"interface",pattern:/^interface\s+(\w+)(?:<[^>]+>)?\s*(?:extends\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"type",pattern:/^export\s+type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1,exported:!0},{type:"type",pattern:/^type\s+(\w+)(?:<[^>]+>)?\s*=/gm,nameIndex:1},{type:"class",pattern:/^export\s+(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1,exported:!0},{type:"class",pattern:/^(?:abstract\s+)?class\s+(\w+)(?:<[^>]+>)?(?:\s+extends\s+[^{]+)?(?:\s+implements\s+[^{]+)?\s*\{/gm,nameIndex:1},{type:"enum",pattern:/^export\s+enum\s+(\w+)\s*\{/gm,nameIndex:1,exported:!0},{type:"enum",pattern:/^enum\s+(\w+)\s*\{/gm,nameIndex:1},{type:"const",pattern:/^export\s+const\s+(\w+)\s*(?::\s*([^=]+))?\s*=/gm,nameIndex:1,exported:!0}],ST=[{type:"function",pattern:/^def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"function",pattern:/^async\s+def\s+(\w+)\s*\(([^)]*)\)\s*(?:->\s*([^:]+))?\s*:/gm,nameIndex:1},{type:"class",pattern:/^class\s+(\w+)(?:\(([^)]*)\))?\s*:/gm,nameIndex:1}],bT=[{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}],vT=[{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}],Gf=[{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}],TT={typescript:Wf,javascript:Wf,python:ST,go:bT,rust:vT,java:Gf,csharp:Gf,php:[],ruby:[],unknown:[]};l(rn,"extractSignatures");l(Ru,"extractDirectorySignatures");l(ET,"extractFromContent");l(CT,"cleanSignature")});import Au from"node:path";var PT,xT,Iu,jT,$t,vr=S(()=>{"use strict";ve();Ut();X();B();PT="outcomes",xT="outcomes.jsonl",Iu=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return Au.join(t,PT)}getOutcomesPath(e){return Au.join(this.getOutcomesDir(e),xT)}async record(e,t){let s={...t,id:Z()},n=this.getOutcomesPath(e);return await rt(Au.dirname(n)),await ic(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=Kn(n.variance),i=
|
|
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=Kn(n.variance),i=Lt(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},jT=new Iu,$t=jT});import{z as Qe}from"zod";var ma,Tr,RT,uN,Du,Vf,ga=S(()=>{"use strict";ma=Qe.string(),Tr=Qe.object({primaryDomain:ma,secondaryDomains:Qe.array(ma),confidence:Qe.number().min(0).max(1),filePatterns:Qe.array(Qe.string()),relevantAgents:Qe.array(Qe.string())}),RT=Qe.object({classification:Tr,classifiedAt:Qe.string(),source:Qe.enum(["cache","history","llm","heuristic"]),descriptionHash:Qe.string(),projectId:Qe.string()}),uN=Qe.object({entries:Qe.record(Qe.string(),RT),confirmedPatterns:Qe.array(Qe.object({descriptionHash:Qe.string(),classification:Tr,confirmedAt:Qe.string(),taskDescription:Qe.string()}))}),Du={entries:{},confirmedPatterns:[]},Vf={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import IT from"node:fs/promises";import Kf from"node:path";function Jf(r){return Tn(r.toLowerCase().trim())}async function zf(r){try{let e=Kf.join(r,"storage","classification-cache.json"),t=await IT.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e)?Du:(console.warn("[classifier] Failed to load cache:",k(e)),Du)}}async function DT(r,e){try{let t=Kf.join(r,"storage","classification-cache.json");await de(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",k(t))}}function $T(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||Gs(s.classifiedAt,36e5)?null:s.classification}function MT(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var $u,OT,Xf,Yf=S(()=>{"use strict";io();ga();W();kn();B();En();l(Jf,"hashDescription");l(zf,"loadCache");l(DT,"saveCache");l($T,"lookupCache");l(MT,"lookupPatterns");$u=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=Jf(e),o=await zf(s),i=$T(o,n,t);if(i)return{classification:i,source:"cache"};let a=MT(o,n);return a?{classification:a,source:"history"}:{classification:Vf,source:"heuristic"}}async confirmClassification(e,t,s){let n=Jf(e),o=await zf(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await DT(s,o))}},OT=new $u,Xf=OT});import _T from"node:fs/promises";import NT from"node:path";var Mu,LT,fa,Ou=S(()=>{"use strict";Tu();Te();ve();yo();dr();tr();vt();Oo();Cu();pa();W();Je();vr();Yf();Mu=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"],m=[],p=u.map((M,y)=>{if(M.status==="fulfilled")return M.value;m.push(d[y]),console.warn(`Context tool "${d[y]}" failed: ${k(M.reason)}`)}),[g,w,b]=p,h={level:m.length===0?"full":m.length>=2?"minimal":"partial",failedTools:m},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(li)),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),Fs(e,t,{maxFiles:10,minScore:.15}),_o(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await rn(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
|
|
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 m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=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 mt.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=
|
|
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 m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=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 mt.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=ca(t,Xs);return s.sprints.length===0?null:Ff(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=NT.join(e,"analysis","repo-analysis.json"),s=await _T.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 Xf.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=this.buildDependencyGraph(o),a=o.map((c,u)=>{let d=`${c}.md`,m=i.get(c)||[],p=m.length===0&&u===o.indexOf(o.find(g=>(i.get(g)||[]).length===0)||c);return{id:`subtask-${u+1}`,description:this.generateSubtaskDescription(e,c),domain:c,agent:d,status:p?"in_progress":"pending",dependsOn:m,order:u+1}});return await 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?"...":""}`}},LT=new Mu,fa=LT});function FT(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 _u,UT,tt,Qf=S(()=>{"use strict";Ut();X();xn();xn();l(FT,"generateApprovalPrompt");_u=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return sl.includes(e)}isDestructive(e){return nl.includes(e)}isToolAllowedInPlanning(e){return vi.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>vi.includes(s)):t}startPlanning(e,t,s){let n={id:Z(),projectId:e,command:t,params:s,status:me.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?[me.GATHERING,me.ANALYZING,me.PROPOSING,me.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===me.APPROVED?s.approvedAt=v():t===me.EXECUTING?s.executionStartedAt=v():(t===me.COMPLETED||t===me.ABORTED)&&(s.completedAt=v()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=me.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=me.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!==me.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=me.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=me.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!==me.APPROVED?null:(t.status=me.EXECUTING,t.executionStartedAt=v(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==me.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!==me.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=me.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=me.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 FT(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[me.GATHERING]:"\u{1F50D}",[me.ANALYZING]:"\u{1F9E0}",[me.PROPOSING]:"\u{1F4DD}",[me.PENDING_APPROVAL]:"\u23F3",[me.APPROVED]:"\u2705",[me.EXECUTING]:"\u26A1",[me.COMPLETED]:"\u{1F389}",[me.REJECTED]:"\u274C",[me.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===me.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`}},UT=new _u,tt=UT});var Nu,HT,Zf,eh=S(()=>{"use strict";X();vr();Nu=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((m,p)=>m+p.qualityScore,0)/t.length,n=await $t.getEstimateAccuracy(e),o=new Map;for(let m of t)for(let p of m.blockers||[])o.set(p,(o.get(p)||0)+1);let i=[...o.entries()].sort((m,p)=>p[1]-m[1]).slice(0,5).map(([m])=>m),c=(await this.getAgentMetrics(e)).sort((m,p)=>p.successRate-m.successRate).slice(0,3).map(m=>m.agent),d=(await this.detectPatterns(e)).map(m=>m.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await $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,m=i.filter(b=>{if(!b.variance)return!1;let h=Kn(b.variance),x=Lt(b.estimatedDuration);return x===0?!1:Math.abs(h)/x<=.2}),p=Math.round(m.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:p,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=>Kn(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=>Kn(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}},HT=new Nu,Zf=HT});var oh={};ye(oh,{AgentAssignmentSchema:()=>th,OUTPUT_SCHEMAS:()=>nh,SubtaskBreakdownSchema:()=>sh,TaskClassificationSchema:()=>Tr,renderSchemaForPrompt:()=>WT});import{z as ft}from"zod";function WT(r){let e=nh[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
|
|
930
|
+
${GT(e.schema)}`:null}function GT(r){if(r instanceof ft.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${rh(s)}`).join(`
|
|
931
|
+
`)}return"(see example above)"}function rh(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 ${rh(r.element)}`:r instanceof ft.ZodObject?"object":"any"}var th,sh,nh,ih=S(()=>{"use strict";ga();ga();th=ft.object({agentName:ft.string(),reasoning:ft.string(),confidence:ft.number().min(0).max(1)}),sh=ft.object({subtasks:ft.array(ft.object({description:ft.string(),domain:ma,agent:ft.string(),dependsOn:ft.array(ft.number())})),effort:ft.enum(["low","medium","high"])}),nh={classification:{schema:Tr,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:th,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:sh,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(WT,"renderSchemaForPrompt");l(GT,"describeSchema");l(rh,"describeField")});import ah from"node:fs/promises";import Er from"node:path";function ha(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
|
|
932
|
+
... (truncated to ~${e} tokens)`}function ch(r){return Math.ceil(r.length/4)}var Lu,Fu,Uu,qT,lh,uh=S(()=>{"use strict";Hi();Vt();vt();W();B();ut();eh();fs();Lu={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(ha,"truncateToTokenBudget");l(ch,"estimateTokens");Fu=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Lu,...e}}addSection(e,t){let s=ha(e,t),n=ch(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=ha(s,o);return this.used+=ch(i),i}return this.used+=n,s}},Uu=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 ah.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=Er.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=Er.basename(n,".md");t[i]=o}}}else{let n=Er.join(jt,"templates","checklists");if(await C(n)){let o=(await ah.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=Er.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 Zf.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 ha(n,Lu.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=Er.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let m=await this.buildInjectedContext(t.projectId);m&&u.push(m)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let m=d?.skipNativeContext??!1,p=d?.mcpActive??!1,g=[],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: ${Er.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
|
`)}
|
|
@@ -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(()=>(ih(),oh)),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 Fu({totalPrompt:Lu.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
|
|
1114
|
+
`);return ha(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},qT=new Uu,lh=qT});import Hu from"node:fs/promises";import BT from"node:os";import Wu from"node:path";function dh(){let r=process.env.PRJCT_CLI_HOME?.trim()||Wu.join(BT.homedir(),".prjct-cli");return Wu.join(r,".running")}async function VT(r){try{let e=dh(),t=Wu.dirname(e);await C(t)||await Hu.mkdir(t,{recursive:!0}),await Hu.writeFile(e,`/p:${r}`)}catch{}}async function JT(){try{let r=dh();await C(r)&&await Hu.unlink(r)}catch{}}var Gu,zT,ya,qu=S(()=>{"use strict";bf();W();Ef();B();$o();Of();ji();_f();Mi();Ou();Qf();uh();fs();l(dh,"getRunningFilePath");l(VT,"signalStart");l(JT,"signalEnd");Gu=class{static{l(this,"CommandExecutor")}async signalStart(e){await VT(e)}async signalEnd(){await JT()}requiresOrchestration(e){return kf.includes(e)?!0:!Sf.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(br.shouldEscalate(e,n)){let o=br.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Sl.load(e),i=await An.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 m=t.task||t.description||"",p=null;if(this.requiresOrchestration(e)&&m)try{if(p=await fa.execute(e,m,s),p.detectedDomains.length>0&&Tf.orchestrate(p.detectedDomains),p.requiresFragmentation&&p.subtasks){let D=p.subtasks.map(G=>({id:G.id,domain:G.domain,description:G.description,status:G.status}));Mf(D)}}catch(D){console.warn(`\u26A0\uFE0F Orchestrator warning: ${k(D)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},w=await An.loadState(i),b=await nn("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 lh.build(o,g,w,null,h,null,x,T,p,{skipNativeContext:y,mcpActive:b});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),br.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:p,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=br.recordAttempt(e,n,{success:!1,error:k(o)});if(i.shouldEscalate){let a=br.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}}}},zT=new Gu,ya=zT});import KT from"node:https";import XT from"node:os";import Bu from"node:path";import cs from"chalk";var Vu,wa,Ju=S(()=>{"use strict";W();B();Vu=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Bu.join(XT.homedir(),".prjct-cli","config"),this.cacheFile=Bu.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=Bu.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=KT.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
|
-
`}},
|
|
1120
|
+
`}},wa=Vu});import ph from"node:path";async function ZT(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await C(ph.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await C(ph.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function eE(){return{...YT}}function tE(){return{...QT}}async function mh(){return ka||(ka=await ZT()?eE():tE(),ka)}var ka,YT,QT,gh=S(()=>{"use strict";B();ka=null,YT={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}},QT={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(ZT,"isClaudeEnvironment");l(eE,"getClaudeAgent");l(tE,"getTerminalAgent");l(mh,"detect")});import Sa from"node:fs/promises";var zu,fh,hh=S(()=>{"use strict";W();B();zu=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 Sa.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 Sa.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 Sa.readdir(e)}async fileExists(e){return C(e)}async createDirectory(e){await Sa.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}}},fh=zu});function yh(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&nE.has(e.code))return!0;if(e.code&&kh.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 rE(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&kh.has(e.code))}function wh(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 Ku(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 oE(r){on.delete(r)}var nE,kh,on,ba,Sh,VL,bh=S(()=>{"use strict";nE=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),kh=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(yh,"isTransientError");l(rE,"isPermanentError");on=new Map;l(wh,"isCircuitOpen");l(Ku,"recordFailure");l(oE,"recordSuccess");ba=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(wh(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 oE(t),o}catch(o){if(s=o,n++,rE(o))throw Ku(t,this.options.circuitBreakerThreshold),o;if(!(yh(o)&&n<this.options.maxAttempts))throw Ku(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 Ku(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return yh(e)}isCircuitOpen(e){return wh(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return on.get(e)}resetCircuit(e){on.delete(e)}resetAllCircuits(){on.clear()}},Sh=new ba({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),VL=new ba({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var iE,Xu,va,vh=S(()=>{"use strict";xs();gh();hh();bh();iE=["claude"],Xu=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Sh.execute(async()=>{if(this.agentInfo=await mh(),!this.agentInfo?.isSupported)throw ao.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!iE.includes(e))throw ao.notSupported(this.agentInfo?.type??"unknown");return this.agent=new fh,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},va=new Xu});var Yu,Cr,Qu=S(()=>{"use strict";Yu=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Cr=new Yu});import Et from"node:path";async function aE(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 Th(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function cE(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Pr(r,e){for(let n of lE)if(await C(Et.join(r,n)))return n;let s=(e??await Cs(r)).find(n=>n.endsWith(uE));if(s)return s}async function Us(r){for(let e of dE)if(await C(Et.join(r,e)))return e}async function Ta(r){let e=Et.join(r,"package.json"),t=await Ae(e,null);if(t){let a=await aE(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Th(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Th(a,"typecheck")}),c.test&&(u.test={tool:a,command:cE(a)}),u.versionFile=await Pr(r),u.changelogFile=await Us(r),u}if(await C(Et.join(r,"pytest.ini"))){let a=await Pr(r),c=await Us(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 Pr(r),c=await Us(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await C(Et.join(r,"Cargo.toml"))){let a=await Us(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 Pr(r),c=await Us(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 Pr(r,n),c=await Us(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 Us(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 Us(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Pr(r),i=await Us(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var lE,uE,dE,Zu=S(()=>{"use strict";B();l(aE,"detectPackageManager");l(Th,"pmRun");l(cE,"pmTest");lE=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],uE=".csproj",dE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(Pr,"detectVersionFile");l(Us,"detectChangelogFile");l(Ta,"detectProjectCommands")});import*as Se from"@clack/prompts";import On from"chalk";var Ea,Eh,No,Ch=S(()=>{"use strict";B();Fe();Ea=[{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."}],Eh=[{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"}],No=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(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 Se.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=Ea.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:Ea.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?Ea[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:Eh.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=[`${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
|
+
`);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 Xt(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 Xt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Je(),ap));await n("which codex"),s.push("codex")}catch{await Xt(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 Ea.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Eh.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 Ph={};ye(Ph,{PlanningCommands:()=>Nn});import Ca from"node:fs/promises";import _n from"node:path";async function pE(){if(!ed){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(xa(),xh));ed=new r}return ed}var ed,Nn,Pa=S(()=>{"use strict";ri();Os();Te();ve();Ut();zs();Vt();wo();W();X();B();hs();kr();Fe();Zu();Ch();Mt();ed=null;l(pE,"getAnalysisCommands");Nn=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 No(t).runNonInteractive());else if(a=await new No(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await Qn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await $.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let g={"core/now.md":`# NOW
|
|
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
|
|
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 Ca.writeFile(_n.join(p,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 pE();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:m,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:m,wizard:a};f.spin("architect mode...");let x=_n.join(p,"planning","architect-session.md"),T=`# Architect Session
|
|
1187
1187
|
|
|
1188
1188
|
## Idea
|
|
1189
1189
|
${h}
|
|
@@ -1192,7 +1192,7 @@ ${h}
|
|
|
1192
1192
|
Initialized - awaiting stack recommendation
|
|
1193
1193
|
|
|
1194
1194
|
Generated: ${new Date().toLocaleString()}
|
|
1195
|
-
`;return await
|
|
1195
|
+
`;return await Ca.writeFile(x,T),await Ue.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:h,wizard:a}}return await Ue.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,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
1196
|
`);let n=await this.getGlobalProjectPath(t),o=_n.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:
|
|
@@ -1229,9 +1229,9 @@ Initialized - awaiting architecture design
|
|
|
1229
1229
|
4. Generate roadmap
|
|
1230
1230
|
|
|
1231
1231
|
Generated: ${new Date().toLocaleString()}
|
|
1232
|
-
`;return await
|
|
1232
|
+
`;return await Ca.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),m=_n.join(d,"planning","specs");try{let w=(await(await import("node:fs/promises")).readdir(m)).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
|
|
@@ -1266,9 +1266,9 @@ Generated: ${new Date().toLocaleString()}
|
|
|
1266
1266
|
---
|
|
1267
1267
|
Created: ${new Date().toLocaleString()}
|
|
1268
1268
|
Status: Draft
|
|
1269
|
-
`;return await
|
|
1269
|
+
`;return await Ca.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
|
|
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 Ta(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 td,Ln,jh=S(()=>{"use strict";xs();ri();Te();ve();W();B();Fe();td=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(()=>(Pa(),Ph)),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 Qn();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)}},Ln=new td});var Ce,Mt=S(()=>{"use strict";qu();Ju();vh();Qu();$n();jh();Ce=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new wa,this.updateNotificationShown=!1,this.commandExecutor=ya}get agent(){return va.getAgent()}get agentInfo(){return va.getInfo()}get currentAuthor(){return Ln.getCurrentAuthor()}async initializeAgent(){return va.initialize()}async ensureProjectInit(e){return Ln.ensureInit(e)}async ensureAuthor(){return Ln.ensureAuthor()}async getGlobalProjectPath(e){return Ln.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return Ht.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return Ln.isEmptyDirectory(e)}async _detectExistingCode(e){return Ln.hasExistingCode(e)}_breakdownFeatureTasks(e){return Cr.breakdownFeature(e)}_detectBugSeverity(e){return Cr.detectBugSeverity(e)}}});var xh={};ye(xh,{AnalysisCommands:()=>Un});import ja from"node:fs/promises";import Rh from"node:path";import*as Fn from"@clack/prompts";var Ah,Un,xa=S(()=>{"use strict";ji();Mi();jm();Os();Te();ve();wi();El();Bm();Ym();Ol();ea();dr();ee();tr();ho();W();X();hs();kr();Fe();wf();Mt();Ah=`{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}],
|
|
@@ -1276,27 +1276,27 @@ Status: Draft
|
|
|
1276
1276
|
riskAreas:[{path, reason, risk, severity}], refactorSuggestions:[{description, files:[], benefit, effort}],
|
|
1277
1277
|
projectInsights:[], conventions:[{category, rule, example}],
|
|
1278
1278
|
commands:{build, test, lint, dev, format, install}, stack:{languages:[], frameworks:[], packageManager}}`,Un=class extends Ce{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1279
|
-
`),pt.init(t);let s=await An.build(t,e),n={packageJson:await pt.readPackageJson(),cargoToml:await pt.readCargoToml(),goMod:await pt.readGoMod(),requirements:await pt.readRequirements(),directories:await pt.listDirectories(),fileCount:await pt.countFiles(),gitStats:await pt.getGitStats(),gitLog:await pt.getGitLog(20),hasDockerfile:await pt.fileExists("Dockerfile"),hasDockerCompose:await pt.fileExists("docker-compose.yml"),hasReadme:await pt.fileExists("README.md"),hasTsconfig:await pt.fileExists("tsconfig.json"),hasViteConfig:await pt.fileExists("vite.config.ts")||await pt.fileExists("vite.config.js"),hasNextConfig:await pt.fileExists("next.config.js")||await pt.fileExists("next.config.mjs")},o=
|
|
1279
|
+
`),pt.init(t);let s=await An.build(t,e),n={packageJson:await pt.readPackageJson(),cargoToml:await pt.readCargoToml(),goMod:await pt.readGoMod(),requirements:await pt.readRequirements(),directories:await pt.listDirectories(),fileCount:await pt.countFiles(),gitStats:await pt.getGitStats(),gitLog:await pt.getGitLog(20),hasDockerfile:await pt.fileExists("Dockerfile"),hasDockerCompose:await pt.fileExists("docker-compose.yml"),hasReadme:await pt.fileExists("README.md"),hasTsconfig:await pt.fileExists("tsconfig.json"),hasViteConfig:await pt.fileExists("vite.config.ts")||await pt.fileExists("vite.config.js"),hasNextConfig:await pt.fileExists("next.config.js")||await pt.fileExists("next.config.mjs")},o=yf(n,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await ja.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 m=await A.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(w=>w.name===t.package||w.relativePath===t.package);if(!p){let w=m.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${w}`}}let g=await
|
|
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 m=await A.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(w=>w.name===t.package||w.relativePath===t.package);if(!p){let w=m.packages.map(b=>b.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${w}`}}let g=await Ns.sync(e,{packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(U(fe(`Synced package: ${p.name}`))):f.done(`Synced package: ${p.name}`),{success:g.success}}let a=Rh.join(o,"context","CLAUDE.md"),c=null;try{c=await ja.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let m=await Ns.sync(e,{full:t.full});if(!m.success)return t.md?(console.log(U("## Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(f.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await ja.readFile(a,"utf-8")}catch{p=""}let g=zm(c,p);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 ja.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(Km(g)),t.preview)return await w(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let b=await Fn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(Fn.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
|
+
${Xm(g)}`);let h=await Fn.confirm({message:"Apply these changes?",initialValue:!0});if(Fn.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"),mu(m,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 m=Date.now()-i,p=d.generatedSkills?.generated?.length??0,g=null;try{let j=await mt.diff(n);j?.hasChanges&&(g=Tl(j))}catch{}let w=d.git.recentCommits[0]?.hash??null,b=w&&Qt.isCurrent(n,w),h=null;if(!b)try{let j=await Dl(n,e,d.git,d.stats);h=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Ah,"```","### 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=na("sync",!0),T=d.syncMetrics?.indexes,I={Duration:`${(m/1e3).toFixed(1)}s`,Skills:`${p} 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?pu("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 mu(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 Dl(n,e,o.git,o.stats);return t.md?console.log(U("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",Ah,"```","### 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 gf(n),c=await Tt.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: ${Sr(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${yi(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${gu(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=ff(i);if(console.log(` ${p} ${Sr(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=hf(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=Wi(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=Rh.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(Tl(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log($m(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 sd,H,Lo=S(()=>{"use strict";Te();ve();W();X();sd=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 sd});import mE from"node:fs/promises";import gE from"node:path";var xr,nd=S(()=>{"use strict";ji();Te();Ol();Gc();ee();zs();Vt();Ks();vt();W();X();hs();Fe();Mt();Lo();xr=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=gE.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=Bs(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(`
|
|
1286
1286
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1287
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,m);return console.log(`
|
|
1288
1288
|
Activity: ${b}
|
|
1289
|
-
`),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let m=await An.build(t),p=null;try{p=await
|
|
1289
|
+
`),{success:!0,view:e,metrics:w}}if(e==="roadmap"){let m=await An.build(t),p=null;try{p=await mE.readFile(m.paths.roadmap,"utf-8")}catch{p=null}if(console.log(`
|
|
1290
1290
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1291
1291
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1292
1292
|
`);else{let g=p.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 m=a?`${a.description}${a.startedAt?` (started ${
|
|
1294
|
+
`),{success:!0,view:"roadmap"}}if(s.md){let m=a?`${a.description}${a.startedAt?` (started ${js(new Date(a.startedAt))} ago)`:""}`:"No active task",p=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=go.getSummary(o,7);(h.smartPercent<100||h.compactions>0)&&(w=`### Context Health (7d)
|
|
1295
1295
|
`+sn(["Zone","%"],[["Smart",`${h.smartPercent}%`],["Warning",`${h.warningPercent}%`],["Dumb",`${h.dumbPercent}%`],["Compactions",`${h.compactions}`]]))}catch{}let b=U(`## Dashboard: ${i}`,te("Current Focus",m),te(`Queue (${c.length})`,He(p,!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 m=
|
|
1297
|
+
`),console.log("\u2550".repeat(50));let m=Wi(t),p=await m.check(o),g=m.getWarning(p);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(`
|
|
@@ -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)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var
|
|
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)),m=e.filter(p=>{let g=new Date(p.timestamp);return g>=u&&g<=d}).length;o.push(m)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}}});var Dh={};ye(Dh,{ContextCommands:()=>an,contextCommands:()=>Ih,default:()=>yE});import fE from"node:fs/promises";import hE from"node:path";var an,Ih,yE,Ra=S(()=>{"use strict";Ou();Te();ve();vt();W();hs();an=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),m=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(b=>({id:b.id,description:b.description,status:b.status,domain:b.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,p=null;if(i)try{p=await fa.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:m,domains:p?.detectedDomains||[],primaryDomain:p?.primaryDomain||null,subtasks:p?.subtasks?.map(b=>({id:b.id,description:b.description,domain:b.domain,agent:b.agent,status:b.status,order:b.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(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",sa(ta("ID",e.projectId),ta("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(wr({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=hE.join(e,"analysis","repo-analysis.json"),s=await fE.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}}},Ih=new an,yE=Ih});import rd from"node:fs";import $h from"node:path";async function Aa(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 Ia(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 od(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await Aa(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 Ia(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 Mh(r){let e=A.getGlobalBasePath(),t=$h.join(e,"projects");if(!rd.existsSync(t))return{success:!0,message:"No projects directory found"};let s=rd.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=$h.join(t,a);if(!wE.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{N.close(a),rd.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 wE,id=S(()=>{"use strict";Te();ve();$n();ee();zs();Vt();W();X();Fe();l(Aa,"cleanupMemory");l(Ia,"cleanupMemoryInternal");l(od,"cleanup");wE=[/^qa-/,/^nonexistent-/,/^test-/];l(Mh,"cleanupProjects")});import Oh from"node:path";async function ad(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=Oh.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=Oh.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 cd=S(()=>{"use strict";Te();ve();$n();W();X();B();Fe();l(ad,"design")});var at,_h=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 ld,Ct,Fo,Nh=S(()=>{"use strict";xs();ee();_h();xn();Is();ld=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=km.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 ld,Fo={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 Da(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 Fh(r){return xt(r*1e3)}var Lh,Uh=S(()=>{"use strict";Ut();X();Lh=Z;l(Da,"calculateDuration");l(Fh,"formatDuration")});function Hh(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 $a,Wh=S(()=>{"use strict";Nh();Te();ee();W();Je();Uh();l(Hh,"rowToSession");$a=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 Lh()}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?Hh(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 Fo.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 Fo.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=Da(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Fo.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=Da(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 Fo.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return Da(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(Hh)}async logEvent(e,t){try{E.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return Fh(e)}}});import jr from"node:path";async function ud(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 $a(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 dd(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=jr.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=jr.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 pd(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=jr.join(A.getGlobalProjectPath(e),"snapshots"),s=jr.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 md(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=jr.join(A.getGlobalProjectPath(e),"snapshots"),s=jr.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,17 +1348,17 @@ ${"\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,m={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,estimated_points:c.estimatedPoints,started_at:c.startedAt,updated_at:new Date().toISOString()},p=u.map((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=
|
|
1351
|
+
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(k(e)),{success:!1,error:k(e)}}}var gd=S(()=>{"use strict";Te();ve();$n();Wh();W();X();B();Fe();l(ud,"recover");l(dd,"undo");l(pd,"redo");l(md,"history")});var Rr,fd=S(()=>{"use strict";Oo();Mt();id();cd();gd();id();cd();gd();Rr=class extends Ce{static{l(this,"MaintenanceCommands")}_cleanupMemory=Aa;_cleanupMemoryInternal=Ia;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?od(e,t):s}async cleanupProjects(e={}){return Mh(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?ad(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ud(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?dd(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?pd(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?md(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 Fs(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 hd,Ar,Gh=S(()=>{"use strict";ee();Vt();Ks();vt();hs();hd=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,m={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,estimated_points:c.estimatedPoints,started_at:c.startedAt,updated_at:new Date().toISOString()},p=u.map((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(m,c.description,p.length>0?`## Subtasks
|
|
1354
1354
|
${p.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()},m=
|
|
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()},m=Ls(d,c.description,"Status: paused");await st.writeFile(q.join(n,`${u}.md`),m,"utf-8"),o++}let a=s.activeTasks||[];for(let c of a){let u={prjct_id:c.id,prjct_type:"task",status:"in_progress",type:c.type||"feature",description:c.description,branch:c.branch,linear_id:c.linearId,started_at:c.startedAt,worktree:c.worktreePath,updated_at:new Date().toISOString()},d=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(m=>`- ${m.type?`**${m.type}**: `:""}${m.description}`);c.push(`## Changes
|
|
1358
1358
|
${d.join(`
|
|
1359
1359
|
`)}`)}if(i.codeMetrics){let d=i.codeMetrics,m=[];d.filesChanged&&m.push(`- **Files**: ${d.filesChanged} changed`),(d.linesAdded||d.linesRemoved)&&m.push(`- **Lines**: +${d.linesAdded||0} / -${d.linesRemoved||0}`),i.duration&&m.push(`- **Duration**: ${i.duration}`),m.length>0&&c.push(`## Metrics
|
|
1360
1360
|
${m.join(`
|
|
1361
|
-
`)}`)}let u=
|
|
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(m=>`- [${m.completed?"x":" "}] ${m.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?`
|
|
@@ -1367,7 +1367,7 @@ Quarter: ${a.quarter}`:""}`,x:c%4*300,y:Math.floor(c/4)*200,width:260,height:120
|
|
|
1367
1367
|
`+(m.branch?`Branch: \`${m.branch}\`
|
|
1368
1368
|
`:"")+(p.length>0?`Progress: ${g}/${p.length}`:""))}else c.push(`## Active Task
|
|
1369
1369
|
No active task.`);let u=n.tasks.filter(m=>!m.completed).slice(0,5);if(u.length>0){let m=u.map(p=>[p.priority,p.type,p.description]);c.push(`## Queue (Top ${u.length})
|
|
1370
|
-
${sn(["Priority","Type","Description"],m)}`)}let d=
|
|
1370
|
+
${sn(["Priority","Type","Description"],m)}`)}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(),df));c=`${u(o)}
|
|
1404
1404
|
|
|
1405
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(p=>p.length>1),m=await this.walkDir(i);for(let p of m)if(r.ALLOWED_EXTENSIONS.has(q.extname(p).toLowerCase()))try{let g=await st.readFile(p,"utf-8"),w=g.toLowerCase(),b=q.relative(o,p),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(p,q.extname(p)),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((p,g)=>g.score-p.score),c.slice(0,a)}async listNotes(e,t,s){let n=this.getProjectPath(e,t),o=s?this.validatePath(n,s):n,i=await 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 m=await st.stat(c);i+=m.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}},
|
|
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}},Ar=new hd});import Ir from"node:path";var Dr,yd=S(()=>{"use strict";Te();ve();Gh();B();hs();Fe();Mt();Dr=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=Ir.basename(e),a={vaultPath:o,projectFolder:i,autoExport:t.autoExport??!0},c=A.getGlobalProjectPath(n),u=Ir.join(c,"project.json"),d=await Ae(u)||{},m=d.integrations||{};m.obsidian=a,d.integrations=m,await de(u,d);let p=Ar.getProjectPath(a,i);return await Ar.ensureStructure(p),await Ar.writeLink(p,n,e),t.md||(f.done("Obsidian vault linked"),f.info(`Vault: ${o}`),f.info(`Project folder: projects/${i}/`),f.info("Run `prjct obsidian export` to populate the vault")),{success:!0,message:t.md?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=Ir.basename(e);t.md||f.info("Exporting to Obsidian vault...");let a=await Ar.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.
|
|
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=Ir.basename(e),a=Ar.getProjectPath(o,i),c=await C(Ir.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=Ir.join(t,"project.json"),n=await Ae(s);if(!n)return null;let o=n.integrations;return o?.obsidian?o.obsidian:null}}});var wd,kE,$r,qh=S(()=>{"use strict";Vt();pi();wd=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=di(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
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,m=a[u.priority?.toLowerCase()||"none"]??4;return d-m})}else o==="estimate-balanced"&&i.sort((a,c)=>(c.estimatedPoints||0)-(a.estimatedPoints||0));return i=i.slice(0,n),{items:i,source:t,strategy:o,maxAgents:n,createdAt:new Date().toISOString()}}formatPlan(e){let t=["## Dispatch Plan","",`Source: **${e.source}**`,`Strategy: **${e.strategy}**`,`Tasks: **${e.items.length}** (max agents: ${e.maxAgents})`,"","| # | ID | Task | Priority |","|---|-----|------|----------|"];for(let s=0;s<e.items.length;s++){let n=e.items[s],o=n.linearId||n.jiraId||n.queueTaskId?.slice(0,8)||n.id;t.push(`| ${s+1} | ${o} | ${n.title.slice(0,50)} | ${n.priority||"-"} |`)}return t.push(""),t.push("Run `prjct parallel dispatch` to create worktrees and start agents."),t.join(`
|
|
1411
|
-
`)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},
|
|
1411
|
+
`)}slugify(e){return(e.linearId||e.jiraId||e.title).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,40)}},kE=new wd,$r=kE});var Mr,Hn,jH,kd=S(()=>{"use strict";Te();Ut();qh();lo();vt();W();Fe();Mt();Mr=null,Hn=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=$r.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=$r.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 $r.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"}):(Mr=i,f.success(`Dispatch plan created (${i.items.length} tasks from queue):`),f.info(""),f.info($r.formatPlan(i)),{success:!0,message:`Plan: ${i.items.length} tasks`})}async dispatch(e,t){if(!Mr||Mr.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 Mr.items){let i=$r.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:Mr.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)}`)}}Mr=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
1412
|
Parallel sessions (${s.length}):`);for(let a of s){let u=n.find(p=>p.path===a.worktreePath)?.branch||"?",d=a.linearId||a.jiraId||"",m=d?` [${d}]`:"";f.info(` ${a.workspaceId.slice(0,8)} | ${u} | ${a.description}${m}`)}}else o||(f.info("No active sessions."),f.info(""),f.info("Start parallel agents:"),f.info(" prjct parallel spawn <task> \u2014 single worktree"),f.info(" prjct parallel plan [--max 10] \u2014 plan from queue"),f.info(" prjct parallel plan --from-linear \u2014 plan from Linear"),f.info(" prjct parallel dispatch \u2014 execute plan"));let i=n.filter(a=>!a.isMain).length;return i>0&&f.info(`
|
|
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)}},
|
|
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)}},jH=new Hn});import We from"chalk";function Ma(r,e,t){return t==="below"?r<=e?We.green("\u2713"):We.yellow("\u26A0"):r>=e?We.green("\u2713"):We.yellow("\u26A0")}var cn,Or,Sd=S(()=>{"use strict";Te();Pi();W();Fe();Mt();cn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(Ma,"statusIcon");Or=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 Rn.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=Ma(i.startup.avg,cn.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: <${cn.startup.max}ms`)}`)}if(i.memory){let c=Ma(i.memory.peakHeapMB,cn.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: <${cn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=Ma(i.contextCorrectness.rate,cn.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: ${cn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=Ma(i.subtaskHandoff.rate,cn.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: ${cn.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 SE from"node:fs/promises";import bE from"node:path";var Vh,Bh,bd,vE,Dt,Oa=S(()=>{"use strict";ve();B();Vh="https://api.prjct.app",Bh={apiKey:null,apiUrl:Vh,userId:null,email:null,lastAuth:null},bd=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??{...Bh},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await rt(bE.dirname(this.configPath)),await de(this.configPath,s),await SE.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||Vh}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Bh},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}},vE=new bd,Dt=vE});function EE(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function CE(r){let e={};for(let[t,s]of Object.entries(r))e[EE(t)]=s;return e}function PE(r,e){let[t,s]=e.type.split("."),n=TE[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=CE(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 Jh(r,e){return e.map(t=>PE(r,t)).filter(t=>t!==null)}var TE,zh=S(()=>{"use strict";TE={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};l(EE,"camelToSnake");l(CE,"snakeCaseKeys");l(PE,"mapCliEventToWebFormat");l(Jh,"mapCliEventsToWebFormat")});var vd,_r,Td=S(()=>{"use strict";xn();Oa();zh();vd=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=Jh(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(),rr("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(),rr("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: ${rr("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 vd});var Ed,xE,Kh,Xh=S(()=>{"use strict";Ac();zs();Vt();Ks();vt();Oa();Td();Ed=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 Js.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 Js.clearPending(e),await Js.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 Js.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 Js.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}}},xE=new Ed,Kh=xE});import jE from"node:fs/promises";import RE from"node:http";import AE from"node:path";import ae from"chalk";var Nr,Cd=S(()=>{"use strict";Os();Te();ve();fr();Oa();Td();Xh();W();Je();B();$o();Fe();ut();Mt();Nr=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=RE.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),m=c.searchParams.get("user_id");if(u){await Dt.saveAuth(u,m||"",d||"");let p=`${s}/api`;await Dt.write({apiUrl:p}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
|
|
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 Kh.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(()=>(yr(),Ji));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(()=>(yr(),Ji));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 nn("linear",e)?console.log("\u2705 Linear MCP already configured"):(await ku("linear",aa.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 nn("jira",e)?console.log("\u2705 Jira MCP already configured"):(await ku("jira",aa.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=AE.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 jE.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 Yh from"node:path";var IE,DE,_a,Qh=S(()=>{"use strict";X();B();IE=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],DE=`# 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
|
+
`,_a=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of IE){let n=Yh.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=Yh.join(this.projectPath,e);return await Pt(t,`${DE}
|
|
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||Pp(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(
|
|
1587
|
+
`)}}});import Lr from"node:path";function Zh(r){return/^\d+\.\d+\.\d+/.test(r)}function Fr(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}function $E(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function ME(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 OE(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Na,ey=S(()=>{"use strict";Je();B();Na=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=Lr.join(this.projectPath,"package.json"),t=await Ae(e,null);return t?.version?{current:t.version,next:Fr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Lr.join(this.projectPath,"Cargo.toml"),t=await _e(e,"");if(!t)return null;let s=$E(t);return s?{current:s,next:Fr(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Lr.join(this.projectPath,"pyproject.toml"),t=await _e(e,"");if(!t)return null;let s=ME(t);return s?{current:s,next:Fr(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Cs(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Lr.join(this.projectPath,e[0]),s=await _e(t,"");if(!s)return null;let n=OE(s);return n?{current:n,next:Fr(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Lr.join(this.projectPath,e),s=await _e(t,"");if(!s)return null;let n=s.trim();return Zh(n)?{current:n,next:Fr(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(Zh(n))return{current:n,next:Fr(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Lr.join(this.projectPath,"VERSION");return await Pt(e,`0.1.0
|
|
1589
1589
|
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await hn("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(
|
|
1591
|
-
${
|
|
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(Zh,"isSemver");l(Fr,"bumpPatch");l($E,"parseTomlVersion");l(ME,"parsePyprojectVersion");l(OE,"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(m=>m.position===t),a=i.filter(m=>m.type==="gate");for(let m of a){let p=m.description||m.action;console.log(`
|
|
1591
|
+
${Gt.dim(`[gate] ${t}-${e}: ${m.action}`)}`);try{let g=Date.now();await F(m.action,{timeout:m.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: ${p}`),n.gatesFailed.push(p),n.success=!1,n.output+=`Gate failed: ${p}
|
|
1592
1592
|
${k(g)}
|
|
1593
1593
|
`,n}}let c=i.filter(m=>m.type==="instruction");for(let m of c){let p=m.description||m.action;console.log(`
|
|
1594
|
-
${
|
|
1595
|
-
${
|
|
1594
|
+
${Gt.dim(`[instruction] ${t}-${e}: ${p}`)}`),n.instructions.push(m.action)}let u=i.filter(m=>m.type==="hook");for(let m of u){console.log(`
|
|
1595
|
+
${Gt.dim(`[hook] ${t}-${e}: ${m.action}`)}`);try{let p=Date.now();await F(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`(${w})`)}`)}catch(p){console.log(`${Gt.yellow("\u26A0")} hook failed (non-blocking): ${m.action}`),n.hooksFailed.push(m.description||m.action),n.output+=`Hook failed: ${m.action}
|
|
1596
1596
|
${k(p)}
|
|
1597
1597
|
`}}let d=i.filter(m=>m.type==="step");for(let m of d){console.log(`
|
|
1598
|
-
${
|
|
1598
|
+
${Gt.dim(`[step] ${e}: ${m.action}`)}`);try{let p=Date.now();await F(m.action,{timeout:m.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-p,w=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${Gt.green("\u2713")} ${Gt.dim(`step passed (${w})`)}`),n.stepsRun.push(m.description||m.action)}catch(p){return console.log(`${Gt.red("\u2717")} step failed: ${m.action}`),n.gatesFailed.push(m.description||m.action),n.success=!1,n.output+=`Step failed: ${m.action}
|
|
1599
1599
|
${k(p)}
|
|
1600
|
-
`,n}}return n}var
|
|
1600
|
+
`,n}}return n}var Pd=S(()=>{"use strict";wo();W();Je();l(ls,"executeWorkflowRules")});var Ur,xd=S(()=>{"use strict";Mi();Te();Qh();ea();ey();Ks();vt();W();X();Je();hs();kr();Fe();Pd();Mt();Ur=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 Na(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new _a(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let p=await this._createShipCommit(i,t),g="skipped";if(p.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=na("ship",!0),x=U(fe(`Shipped: ${i}`,`Version: ${d}`),te("Results",He([`Version: ${d}`,`Commit: ${p.success?"created":p.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 hn("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
|
|
1602
|
+
Generated with [p/](https://www.prjct.app/)`;return await hn("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 Wr}from"node:child_process";import jd from"node:fs/promises";import Uo from"node:path";import Hr from"chalk";function ty(){try{return!!Wr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}function sy(){try{let e=Wr("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 Gr,Rd=S(()=>{"use strict";Os();ai();ve();Ju();Jl();W();Fe();ut();Mt();l(ty,"isHomebrewInstall");l(sy,"getCurrentVersion");Gr=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 uo.updateVersion(ke)}catch{}try{await new wa().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=sy();if(e)return ty()?(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(ty()){try{Wr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Wr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Wr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=sy();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 zi(i),c=await Ki(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=Uo.join(Bt("node:os").homedir());if(o.gemini.installed){let a=Uo.join(i,".gemini","GEMINI.md");try{let c=await jd.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:m}=await Promise.resolve().then(()=>(fs(),bl)),p=m("global/GEMINI.md");if(p?.includes(u)&&p.includes(d)){let g=p.substring(p.indexOf(u),p.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 jd.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?Hr.green("\u2713"):c?Hr.red("\u2717"):Hr.yellow("\u26A0");console.log(` ${u} ${Hr.bold(i)}`);for(let d of a.details)console.log(` ${Hr.dim(d)}`);for(let d of a.errors)console.log(` ${Hr.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=Wr("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),t=Uo.join(e,"prjct-cli"),s=Uo.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}yc(t);let{resetBundle:c}=(fs(),bt(bl));c()}catch{}}async getAllProjectIds(){let e=Uo.join(A.getGlobalBasePath(),"projects");try{return(await jd.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}}});import Ge from"chalk";var qr,Ad=S(()=>{"use strict";Tu();Te();yo();ki();W();Fe();vr();Mt();qr=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=
|
|
1608
|
+
`),{success:!0,message:"No data"};let a=ca(i,o);await sr.saveMetrics(n,a),console.log(`
|
|
1609
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 m of c){let p=m.estimationAccuracy>=80?Ge.green:m.estimationAccuracy>=60?Ge.yellow:Ge.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${Ge.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.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 m of a.underEstimated)console.log(` ${Ge.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ge.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ge.green("\u2713")} ${m.category} tasks estimated within ${Ge.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=
|
|
1611
|
-
${Ge.dim("Projection:")}`),console.log(` Backlog: ${Ge.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ge.bold(p)}`)}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{...
|
|
1610
|
+
${Ge.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${Ge.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${Ge.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${Ge.green("\u2713")} ${m.category} tasks estimated within ${Ge.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=Lf(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.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: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Ge.bold(p)}`)}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 ry,Wn,ny,oy,iy,_E,Id=S(()=>{"use strict";Eo();X();vr();ry=l(r=>Cl.includes(r),"isValidPoint"),Wn=l(r=>Pl[r],"pointsToMinutes"),ny=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"),oy=l(r=>{let e=Wn(r);return`${ny(e.min)}\u2013${ny(e.max)}`},"pointsToTimeRange"),iy=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:_E(o),basedOn:s.length}},"suggestFromHistory"),_E=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of Cl){let n=Math.abs(Pl[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint")});import Dd from"node:fs/promises";import NE from"node:os";import La from"node:path";var $d,Md,ay=S(()=>{"use strict";W();B();$d=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=La.join(NE.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Dd.mkdir(this.commandsPath,{recursive:!0});let s=La.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await Dd.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:k(s)}}}async deleteWorkflowTemplate(e){try{let t=La.join(this.commandsPath,`${e}.md`);return await Dd.unlink(t),{success:!0}}catch(t){return O(t)?{success:!0}:{success:!1,error:k(t)}}}async templateExists(e){let t=La.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,59 +1644,59 @@ 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(" ")}},ln=new
|
|
1647
|
+
`}},Md=new $d});function LE(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}async function FE(r,e){let t=Cr.detectTaskType(e),s=await iy(r,t);if(s){let a=Wn(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=Cr.estimateComplexity(e),o=LE(n.level),i=Wn(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}var Od,cy=S(()=>{"use strict";Id();Qu();l(LE,"complexityToPoints");l(FE,"estimateTaskForStart");Od=FE});async function Fa(r){try{let{stdout:e}=await F("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function ly(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 _d=S(()=>{"use strict";Je();l(Fa,"getGitBranch");l(ly,"getModifiedFiles")});var Br,UE,Nd,ln,uy=S(()=>{"use strict";ve();ee();X();_d();Br="session-snapshot",UE=30,Nd=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await Fa(t),o=await ly(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,Br,u),u}getSnapshot(e){try{return E.getDoc(e,Br)}catch{return null}}clearSnapshot(e){try{E.deleteDoc(e,Br)}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,Br);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=UE){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,Br);i&&new Date(i.timestamp).getTime()<s&&(E.deleteDoc(o,Br),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(" ")}},ln=new Nd});var Ld,Ho,dy=S(()=>{"use strict";ee();Ld=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),m=[...o].filter(h=>d.has(h)).length,p=new Set([...o,...d]).size,g=p>0?m/p: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}},
|
|
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),m=[...o].filter(h=>d.has(h)).length,p=new Set([...o,...d]).size,g=p>0?m/p: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}},Ho=new Ld});function py(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(m=>m.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}function my(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=Cn.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 Fd(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=py(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
|
|
1655
1655
|
|
|
1656
1656
|
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",m=a.name.toLowerCase().split(/[\s\-_/]+/).filter(w=>w.length>2),p;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(m.some(h=>b.includes(h))){p=s[w],o.add(w);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return p&&g.push(` - VIOLATION: ${p.issue} \u2014 ${p.suggestion}`),g.join(`
|
|
1657
1657
|
`)}).join(`
|
|
1658
1658
|
|
|
1659
|
-
`)}`}function
|
|
1660
|
-
`)}var
|
|
1661
|
-
`)}function
|
|
1662
|
-
`)}catch{return null}}function
|
|
1663
|
-
`)}async function
|
|
1659
|
+
`)}`}function Ud(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 Hd=S(()=>{"use strict";Vc();l(py,"rankPatterns");l(my,"detectDomainsFromTask");l(Fd,"buildPatternBriefing");l(Ud,"buildContextContract")});import HE from"node:fs/promises";import WE from"node:path";function qE(){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 BE(r){try{let{prjctDb:e}=(ee(),bt(li)),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 gy(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 VE(r){try{let e=WE.join(r,"analysis","repo-analysis.json"),t=await HE.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return O(e),null}}function JE(r,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),s=e.filter(p=>p.type==="instruction"&&p.position==="before"),n=e.filter(p=>p.type==="hook"&&p.position==="before"),o=e.filter(p=>p.type==="step"&&p.position==="before"),i=e.filter(p=>p.type==="instruction"&&p.position==="after"),a=e.filter(p=>p.type==="hook"&&p.position==="after"),c=e.filter(p=>p.type==="step"&&p.position==="after"),u=[],d=l((p,g,w)=>{let b=g.map(I=>` ${I.enabled?w:"o"} #${I.id} ${I.action}`),h=[p,...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"),m=l(p=>{p.push(" |"),p.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),m(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),m(u)),n.length>0&&(d("HOOKS (before)",n,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(m(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(m(u),d("HOOKS (after)",a,">")),c.length>0&&(m(u),d("STEPS (after)",c,">")),u.join(`
|
|
1663
|
+
`)}async function zE(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 KE(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 GE,Vr,Wd=S(()=>{"use strict";qu();Id();Te();ve();ay();Ut();fr();cy();_d();uy();dr();dy();gi();Vt();vt();wo();Oo();W();X();$o();hs();kr();Fe();Zu();Pd();vr();Mt();Hd();Hd();GE=[{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}],Vr=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 p=await Od(o,c),g=await L.getCurrentTask(o),w=await L.getActiveTasks(o),{worktreeService:b}=await Promise.resolve().then(()=>(lo(),oi)),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:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes},xe)}else await L.startTask(o,{id:Z(),description:c,sessionId:Z(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes});let I=A.getGlobalProjectPath(o),M=Eu(c),y;try{y=Ho.getHistoricalBoosts(o,M),y.size===0&&(y=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[p.taskType]??80)>=80?15:10,[G,Q,,Ve]=await Promise.all([Fa(t),mt.getActive(o).catch(()=>null),VE(I),Fs(c,t,{maxFiles:D,minScore:.15,historicalBoosts:y}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),he=null;try{let xe=ln.getSnapshot(o);xe&&(he=ln.formatContinuityContext(xe),ln.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,ec)=>ec[1]-St[1]).slice(0,5);xe.length>0&&(us=`### Previously Useful Files
|
|
1667
|
+
${xe.map(([ec])=>`\`${ec}\``).join(", ")}`)}let Ja=my(c,o),za=wr({description:c,branch:G,linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes,estimateSource:p.source,domains:Ja}),Ka=du(Ve.files.map(xe=>({path:xe.path,description:xe.reasons.join(", ")}))),Xa=Ve.files.map(xe=>xe.path),Ya=Fd(Q,Xa),Qa=Ud(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=qE(),ow=BE(o);console.log(U(he,Ne,za,Qa,Ka,us,Ya,ow,ue,Za));try{let xe=await L.getCurrentTask(o);xe&&Ho.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 ya.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let m=await Od(o,c);return await L.startTask(o,{id:Z(),description:c,sessionId:Z(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes}),f.done(`${e}`),Ao("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:ry,pointsToMinutes:Wn,pointsToTimeRange:oy,storeEstimate:l(async p=>{let g=Wn(p);return await L.updateCurrentTask(o,{estimatedPoints:p,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=wr({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,m=u.length>0?uu(u,d):"",p=le([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(U(c,m,p))}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(()=>(lo(),oi)),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,m="",p=0;if(a.startedAt){let D=new Date(a.startedAt);m=js(D),p=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?gy(g):"0m",actualDuration:m||"0m",variance:g?KE(p-g):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[b,h].filter(Boolean)})}catch{}let x="";if(w&&g){let D=p-g,G=g>0?Math.round((p-g)/g*100):0,Q=D>=0?"+":"";x=` | est: ${w}pt (${gy(g)}) \u2192 ${Q}${G}%`}let T=[],I=null,M=null;try{if(T=await zE(e,a.startedAt),T.length>0){Ho.completeFeedback(n,a.id,T);let D=Ho.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{ln.clearSnapshot(n)}catch{}let y=a.linearId,j=y!=null?await nn("linear",ws()).catch(()=>!1):!1;if(t.md){let D=m?` (${m})`:"",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(li)),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: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}`),Ao("completed"),Wt("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`),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 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})`:""}`),Ao("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)}`),Ao("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 GE){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(JE(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?lu(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
|
|
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 Ta(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(!Ke.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(Ke.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Ke.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=Ke.createWorkflow(t,{name:i,description:a}),d=await Md.generateWorkflowTemplate(i,a);if(!d.success){Ke.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${m}`):f.fail(m),{success:!1,error:m}}return n.md?console.log(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
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=Ke.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(!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 Md.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(qE,"buildEfficiencySection");l(BE,"buildRpiSection");l(gy,"formatMinutesToDuration");l(VE,"loadRepoAnalysis");l(JE,"buildFlowDiagram");l(zE,"getFilesModifiedSinceTaskStart");l(KE,"formatVariance")});var un,Xq,Gd=S(()=>{"use strict";xa();nd();Ra();fd();yd();kd();Sd();Pa();Cd();xd();Rd();Ad();Wd();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 Vr,this.planning=new Nn,this.shipping=new Ur,this.analytics=new xr,this.performanceCmds=new Or,this.maintenance=new Rr,this.analysis=new Un,this.setupCmds=new Nr,this.updateCmds=new Gr,this.velocityCmds=new qr,this.contextCmds=new an,this.obsidianCmds=new Dr,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)}},Xq=new un});var Wo,Jr,qd=S(()=>{"use strict";Wo={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}},Jr=[{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 ky={};ye(ky,{UninstallCommands:()=>qo,uninstall:()=>wy});import{execSync as Ua}from"node:child_process";import Ot from"node:fs/promises";import XE from"node:os";import Hs from"node:path";import YE from"node:readline";import Me from"chalk";async function hy(r){let e=0;try{let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Hs.join(r,s.name);if(s.isDirectory())e+=await hy(n);else try{let o=await Ot.stat(n);e+=o.size}catch{}}}catch{}return e}function fy(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 QE(r){try{return(await Ot.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function ZE(){let r={homebrew:!1,npm:!1};try{Ua("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ua("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function eC(){let r=[],e=Im(),t=A.getGlobalBasePath(),s=await C(t),n=s?await QE(Hs.join(t,"projects")):0,o=s?await hy(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=Hs.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(Ha)&&T.includes(Go)}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=Hs.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=Hs.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(Ha)&&T.includes(Go)}catch{}return h&&x&&r.push({path:b,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function tC(r){try{let e=await Ot.readFile(r,"utf-8");if(!e.includes(Ha)||!e.includes(Go))return!1;let t=e.indexOf(Ha),s=e.indexOf(Go)+Go.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 sC(){let r=XE.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Hs.join(r,`.prjct-backup-${e}`);try{await Ot.mkdir(t,{recursive:!0});let s=A.getGlobalBasePath();return await C(s)&&await yy(s,Hs.join(t,".prjct-cli")),t}catch{return null}}async function yy(r,e){await Ot.mkdir(e,{recursive:!0});let t=await Ot.readdir(r,{withFileTypes:!0});for(let s of t){let n=Hs.join(r,s.name),o=Hs.join(e,s.name);s.isDirectory()?await yy(n,o):await Ot.copyFile(n,o)}}async function nC(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await tC(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||Ua(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${k(o)}`)}if(e.npm)try{t.dryRun||Ua("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 rC(r){let e=YE.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}async function wy(r={},e=process.cwd()){let t=await eC(),s=ZE(),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(`(${fy(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: ${fy(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 sC();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 rC("> ")))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 nC(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 Ha,Go,qo,Bd=S(()=>{"use strict";Os();ve();W();B();Mt();Ha="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Go="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(hy,"getDirectorySize");l(fy,"formatSize");l(QE,"countDirectoryItems");l(ZE,"detectInstallation");l(eC,"gatherUninstallItems");l(tC,"removePrjctSection");l(sC,"createBackup");l(yy,"copyDirectory");l(nC,"performUninstall");l(rC,"promptConfirmation");l(wy,"uninstall");qo=class extends Ce{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return wy(e,t)}}});function pC(){for(let[r,e]of Object.entries(Wo))H.registerCategory(r,e)}function mC(){if(H.has("work"))return;pC();let r=l(e=>Jr.find(t=>t.name===e),"getMeta");H.registerMethod("task",dn,"now",r("task")),H.registerMethod("done",dn,"done",r("done")),H.registerMethod("next",dn,"next",r("next")),H.registerMethod("pause",dn,"pause",r("pause")),H.registerMethod("resume",dn,"resume",r("resume")),H.registerMethod("workflow",dn,"workflow",r("workflow")),H.registerMethod("tokens",dn,"tokens",r("tokens")),H.registerMethod("sessions",dn,"sessions",r("sessions")),H.registerMethod("init",Wa,"init",r("init")),H.registerMethod("bug",Wa,"bug",r("bug")),H.registerMethod("idea",Wa,"idea",r("idea")),H.registerMethod("spec",Wa,"spec",r("spec")),H.registerMethod("ship",oC,"ship",r("ship")),H.registerMethod("dash",Sy,"dash",r("dash")),H.registerMethod("help",Sy,"help",r("help")),H.registerMethod("perf",iC,"perf",r("perf")),H.registerMethod("velocity",cC,"velocity",r("velocity")),H.registerMethod("cleanup",pn,"cleanup",r("cleanup")),H.registerMethod("cleanup-projects",pn,"cleanupProjects",r("cleanup-projects")),H.registerMethod("design",pn,"design",r("design")),H.registerMethod("recover",pn,"recover",r("recover")),H.registerMethod("undo",pn,"undo",r("undo")),H.registerMethod("redo",pn,"redo",r("redo")),H.registerMethod("history",pn,"history",r("history")),H.registerMethod("enrich",pn,"enrich",r("enrich")),H.registerMethod("analyze",zr,"analyze",r("analyze")),H.registerMethod("sync",zr,"sync",r("sync")),H.registerMethod("stats",zr,"stats",r("stats")),H.registerMethod("status",zr,"status",r("status")),H.registerMethod("seal",zr,"seal",r("seal")),H.registerMethod("verify",zr,"verify",r("verify")),H.registerMethod("start",Bo,"start",r("start")),H.registerMethod("setup",Bo,"setup",r("setup")),H.registerMethod("login",Bo,"login",r("login")),H.registerMethod("logout",Bo,"logout",r("logout")),H.registerMethod("auth",Bo,"auth",r("auth")),H.registerMethod("uninstall",uC,"uninstall",r("uninstall")),H.registerMethod("update",dC,"update",r("update")),H.registerMethod("context",aC,"context",r("context")),H.registerMethod("obsidian",lC,"obsidian",r("obsidian")),H.registerMethod("parallel",Vd,"parallel",r("parallel")),H.registerMethod("worktree",Vd,"parallel",r("worktree")),H.registerMethod("conductor",Vd,"parallel",r("conductor"))}var dn,Wa,oC,Sy,iC,pn,zr,Bo,aC,cC,lC,Vd,uC,dC,Jd=S(()=>{"use strict";xa();nd();qd();Ra();fd();yd();kd();Sd();Pa();Lo();Cd();xd();Bd();Rd();Ad();Wd();dn=new Vr,Wa=new Nn,oC=new Ur,Sy=new xr,iC=new Or,pn=new Rr,zr=new Un,Bo=new Nr,aC=new an,cC=new qr,lC=new Dr,Vd=new Hn,uC=new qo,dC=new Gr;l(pC,"registerCategories");l(mC,"registerAllCommands");mC()});var Ty={};ye(Ty,{shutdown:()=>Gn,startDaemon:()=>hC});import Ze from"node:fs";import{createServer as gC}from"node:net";async function hC(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);bC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ze.unlinkSync(t)}Ze.existsSync(e)&&Ze.unlinkSync(e),EC();let n=vC(),o=null;if(n)try{o=Ze.statSync(n).mtimeMs}catch{}if(Oe={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:tc,idleTimer:null,entryPath:n,entryMtime:o},Pe=new un,Kr=gC(i=>yC(i)),Kr.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}`),by()}),Kr.on("error",i=>{console.error("Daemon socket error:",i.message),Gn(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||bi;Vo=Si({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Vo.start()}}catch{}if(process.on("SIGTERM",()=>Gn(0)),process.on("SIGINT",()=>Gn(0)),process.on("SIGHUP",()=>{Pe=new un,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function yC(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>sc){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(gn(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 wC(o);r.write(gn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(gn(i))}}}),r.on("error",()=>{})}async function wC(r){if(!Oe||!Pe)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(by(),Oe.commandsServed++,Oe.lastActivity=Date.now(),Oe.commandsServed%fC===0&&N.checkpointAll(),vy()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),Gn(0)},200)),r.command==="daemon")return SC(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 kC(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
|
|
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 kC(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 SC(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:vy()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Gn(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function by(){Oe&&(Oe.idleTimer&&clearTimeout(Oe.idleTimer),Oe.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Oe.idleTimeoutMs/1e3/60} minutes, shutting down`),Gn(0)},Oe.idleTimeoutMs),Oe.idleTimer.unref&&Oe.idleTimer.unref())}function Gn(r){console.log("Daemon shutting down..."),Oe?.idleTimer&&clearTimeout(Oe.idleTimer),Vo&&(Vo.stop(),Vo=null),Kr&&(Kr.close(),Kr=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 bC(r){try{return process.kill(r,0),!0}catch{return!1}}function vC(){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 EC(){let r=Le.log();try{if(Ze.statSync(r).size>TC){let t=`${r}.1`;try{Ze.unlinkSync(t)}catch{}Ze.renameSync(r,t)}}catch{}}function vy(){if(!Oe?.entryPath||Oe.entryMtime===null)return!1;try{return Ze.statSync(Oe.entryPath).mtimeMs!==Oe.entryMtime}catch{return!1}}var fC,Kr,Vo,Pe,Oe,TC,Ey=S(()=>{"use strict";Gd();Lo();Jd();Te();tl();ee();Jo();fC=50,Kr=null,Vo=null,Pe=null,Oe=null;l(hC,"startDaemon");l(yC,"handleConnection");l(wC,"handleRequest");l(kC,"executeCommand");l(SC,"handleDaemonCommand");l(by,"resetIdleTimer");l(Gn,"shutdown");l(bC,"isProcessRunning");l(vC,"resolveEntryPath");TC=1024*1024;l(EC,"rotateLog");l(vy,"isCodeStale")});var xy={};ye(xy,{runStart:()=>MC});import ks from"node:fs/promises";import Cy from"node:os";import Ss from"node:path";import K from"chalk";function xC(){console.clear(),console.log(CC),console.log(PC)}function Py(r,e){console.log(`
|
|
1690
1690
|
${K.bold(" Select AI providers to configure:")}
|
|
1691
1691
|
`),console.log(` ${K.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
|
|
1692
|
-
`),r.forEach((t,s)=>{let n=s===e?K.cyan("\u276F"):" ",o=t.selected?K.green("[\u2713]"):K.dim("[ ]"),i=t.installed?K.green("(installed)"):K.yellow("(will install)"),a=s===e?K.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function
|
|
1692
|
+
`),r.forEach((t,s)=>{let n=s===e?K.cyan("\u276F"):" ",o=t.selected?K.green("[\u2713]"):K.dim("[ ]"),i=t.installed?K.green("(installed)"):K.yellow("(will install)"),a=s===e?K.bold(t.displayName):t.displayName;console.log(` ${n} ${o} ${a} ${i}`)}),console.log("")}async function jC(){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"),Py(e,s)},"render");Py(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
1696
|
${K.bold(" Detected providers:")}
|
|
1697
|
-
`),e.forEach(t=>{t.installed&&console.log(` ${K.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function
|
|
1697
|
+
`),e.forEach(t=>{t.installed&&console.log(` ${K.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function RC(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(),Yn)),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(` ${K.yellow("\u26A0")} Failed to install ${r} router: ${k(t)}`),!1}}async function AC(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(` ${K.yellow("\u26A0")} Failed to install ${r} subcommands: ${k(t)}`),!1}}async function IC(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(),Yn)),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 m=c.substring(0,c.indexOf(u)),p=c.substring(c.indexOf(d)+d.length),g=a.substring(a.indexOf(u),a.indexOf(d)+d.length);await ks.writeFile(i,m+g+p)}else await ks.writeFile(i,`${c}
|
|
1698
1698
|
|
|
1699
|
-
${a}`)}else await
|
|
1699
|
+
${a}`)}else await ks.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${K.yellow("\u26A0")} Failed to install ${r} config: ${k(t)}`),!1}}async function DC(r){let e=Ss.join(Cy.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(Cy.homedir(),`.${r[0]}`,"commands")};await de(e,t)}function $C(r){console.log(`
|
|
1700
1700
|
${K.green.bold(" \u2713 Setup complete!")}
|
|
1701
1701
|
`),console.log(` ${K.dim("Configured providers:")}`),r.forEach(e=>{let t=ze[e];console.log(` ${K.green("\u2713")} ${t.displayName}`)}),console.log(`
|
|
1702
1702
|
${K.bold("Next steps:")}
|
|
@@ -1711,30 +1711,30 @@ ${K.green.bold(" \u2713 Setup complete!")}
|
|
|
1711
1711
|
${K.dim("\u2022")} Use ${K.bold("p. ship")} to create PRs
|
|
1712
1712
|
|
|
1713
1713
|
${K.dim("Learn more: https://prjct.app/docs")}
|
|
1714
|
-
`)}async function
|
|
1714
|
+
`)}async function MC(){xC();let r=await jC();console.log(`
|
|
1715
1715
|
${K.cyan("Setting up...")}
|
|
1716
|
-
`);for(let e of r){let t=ze[e];process.stdout.write(` ${K.dim("\u2022")} ${t.displayName}... `);let s=await
|
|
1716
|
+
`);for(let e of r){let t=ze[e];process.stdout.write(` ${K.dim("\u2022")} ${t.displayName}... `);let s=await RC(e),n=await AC(e),o=await IC(e);console.log(s&&n&&o?K.green("\u2713"):s||o?K.yellow("partial"):K.yellow("skipped"))}await DC(r),$C(r)}var Xr,Yr,Qr,Zr,eo,CC,PC,jy=S(()=>{"use strict";fs();lt();W();B();ut();Xr=K.rgb(180,180,175),Yr=K.rgb(200,200,195),Qr=K.rgb(220,220,215),Zr=K.rgb(235,235,230),eo=K.rgb(250,250,245),CC=`
|
|
1717
1717
|
|
|
1718
|
-
${
|
|
1719
|
-
${
|
|
1720
|
-
${
|
|
1721
|
-
${
|
|
1722
|
-
${
|
|
1723
|
-
${
|
|
1718
|
+
${Xr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Yr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${Qr(" \u2588\u2588\u2557")}${Zr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${eo("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
|
|
1719
|
+
${Xr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Yr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Qr(" \u2588\u2588\u2551")}${Zr("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${eo("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
|
|
1720
|
+
${Xr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Yr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Qr(" \u2588\u2588\u2551")}${Zr("\u2588\u2588\u2551 ")}${eo(" \u2588\u2588\u2551 ")}
|
|
1721
|
+
${Xr(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${Yr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${Qr("\u2588\u2588 \u2588\u2588\u2551")}${Zr("\u2588\u2588\u2551 ")}${eo(" \u2588\u2588\u2551 ")}
|
|
1722
|
+
${Xr(" \u2588\u2588\u2551 ")}${Yr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${Qr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${Zr("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${eo(" \u2588\u2588\u2551 ")}
|
|
1723
|
+
${Xr(" \u255A\u2550\u255D ")}${Yr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${Qr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${Zr(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${eo(" \u255A\u2550\u255D ")}
|
|
1724
1724
|
|
|
1725
|
-
`,
|
|
1725
|
+
`,PC=` ${K.white("Context Layer for AI Agents")} ${K.dim(`v${ke}`)}
|
|
1726
1726
|
|
|
1727
1727
|
${K.dim(`Project context layer for AI coding agents.
|
|
1728
1728
|
Works with Claude Code, Gemini CLI, Codex, and more.`)}
|
|
1729
1729
|
${K.cyan("https://prjct.app")}
|
|
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
|
|
1730
|
+
`;l(xC,"showBanner");l(Py,"showProviderSelection");l(jC,"selectProviders");l(RC,"installRouter");l(AC,"installSubcommands");l(IC,"installGlobalConfig");l(DC,"saveSetupConfig");l($C,"showCompletion");l(MC,"runStart")});import Iy from"node:fs/promises";import Ws from"node:path";async function to(r,e=process.cwd(),t={}){let s=Ws.isAbsolute(r)?r:Ws.join(e,r),n;try{n=await Iy.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=Ws.extname(r).toLowerCase(),i=LC[o]||"unknown",a=NC[i]||[],c=await FC(n,a,s,e),u=[];t.reverse&&(u=await HC(r,e));let d;t.depth&&t.depth>0&&(d=await Dy(r,e,t.depth));let m=c.filter(g=>g.isExternal).length,p=c.filter(g=>!g.isExternal).length;return{file:r,imports:c,importedBy:u,dependencyTree:d,metrics:{totalImports:c.length,externalImports:m,internalImports:p,importedByCount:u.length}}}async function FC(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 p=a[i.namesIndex];p&&(u=p.split(",").map(g=>g.trim().split(" as ")[0].trim()).filter(Boolean))}let d=!c.startsWith(".")&&!c.startsWith("/")&&!c.startsWith("@/"),m=null;d||(m=await UC(c,t,s)),n.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return n}async function UC(r,e,t){let s=Ws.dirname(e);if(r.startsWith("@/")){let o=Ws.join(t,"src",r.slice(2));return Ay(o,t)}let n=Ws.resolve(s,r);return Ay(n,t)}async function Ay(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let s of t){let n=r+s;try{if((await Iy.stat(n)).isFile())return Ws.relative(e,n)}catch{}}return null}async function HC(r,e){let t=[],s=Ws.basename(r,Ws.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 Dy(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 to(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Dy(a.resolved,e,t,s+1,n);o.imports.push(c)}return o}var Ry,OC,_C,NC,LC,zd=S(()=>{"use strict";W();Je();Ry=[{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}],OC=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],_C=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],NC={typescript:Ry,javascript:Ry,python:OC,go:_C},LC={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(to,"analyzeImports");l(FC,"extractImports");l(UC,"resolveImport");l(Ay,"tryResolve");l(HC,"findImportedBy");l(Dy,"buildDependencyTree")});import $y from"node:fs/promises";import bs from"node:path";async function Ga(r,e=process.cwd()){let t=bs.isAbsolute(r)?r:bs.join(e,r),s;try{s=await $y.readFile(t,"utf-8")}catch(p){if(O(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Mn("")};throw p}let n=bs.extname(r).toLowerCase(),o=My[n]||"unknown",i=await rn(r,e),a=await to(r,e),c=GC(s,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?qC(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=BC(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:ua(s,m)}}async function Kd(r,e=process.cwd(),t={}){let s=bs.isAbsolute(r)?r:bs.join(e,r),n=[];async function o(i){let a=await $y.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 m=bs.extname(c.name).toLowerCase();if(My[m]){let p=await Ga(d,e);n.push(p)}}}}return l(o,"processDir"),await o(s),n}function GC(r,e){let t=WC[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
1734
|
`).map(m=>m.replace(/^\s*\*\s?/,"").trim()).filter(m=>m.length>0&&!m.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: ${
|
|
1736
|
-
`)[0].trim()}function
|
|
1737
|
-
`)}var
|
|
1735
|
+
`)[0]||"";return`Module: ${bs.basename(n,bs.extname(n))}`}function qC(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
|
|
1736
|
+
`)[0].trim()}function BC(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 WC,My,Oy=S(()=>{"use strict";W();zd();pa();da();WC={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}]},My={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ga,"summarizeFile");l(Kd,"summarizeDirectory");l(GC,"extractFilePurpose");l(qC,"extractDescriptionFromDocstring");l(BC,"buildSummaryText")});var _y={};ye(_y,{analyzeImports:()=>to,extractDirectorySignatures:()=>Ru,extractSignatures:()=>rn,findRelevantFiles:()=>Fs,getRecentFiles:()=>_o,runContextTool:()=>VC,summarizeDirectory:()=>Kd,summarizeFile:()=>Ga});async function VC(r,e,t){let s=Date.now(),[n,...o]=r;try{let i;switch(n){case"files":i=await JC(o,t);break;case"signatures":i=await zC(o,t);break;case"imports":i=await KC(o,t);break;case"recent":i=await XC(o,t);break;case"summary":i=await YC(o,t);break;case"help":return{tool:"error",result:{error:tP(),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=QC(i),u=ZC(i);return await eP(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 JC(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 Fs(n,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function zC(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 Ru(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=ju(c.map(m=>m.metrics));return{tool:"signatures",result:{file:t,language:"multiple",signatures:c.flatMap(m=>m.signatures.map(p=>({...p,file:m.file}))),fallback:!1,metrics:u}}}}catch{}return{tool:"signatures",result:await rn(t,e)}}async function KC(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 to(t,e,s)}}async function XC(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 _o(e,t)}}async function YC(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 Kd(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(m=>({...m,file:d.file}))),dependencies:[...new Set(c.flatMap(d=>d.dependencies))],metrics:ju(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ga(t,e)}}function QC(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 ZC(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 eP(r,e){try{await Zt.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function tP(){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 Ny=S(()=>{"use strict";ho();W();X();Oo();zd();Cu();pa();Oy();da();l(VC,"runContextTool");l(JC,"runFilesTool");l(zC,"runSignaturesTool");l(KC,"runImportsTool");l(XC,"runRecentTool");l(YC,"runSummaryTool");l(QC,"getTokensSaved");l(ZC,"getCompressionRate");l(eP,"recordToolUsage");l(tP,"getHelpText")});var Hy={};ye(Hy,{hooksService:()=>cP});import nt from"node:fs/promises";import qe from"node:path";import qt from"chalk";function Fy(){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 Uy(){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 Xd(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 Ly(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function sP(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 nP(r,e){let t=qe.join(r,".husky");for(let s of e){let n=qe.join(t,s),o=s==="post-commit"?Fy():Uy();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 rP(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"?Fy():Uy();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 oP(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 iP(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 aP(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 Yd,cP,Wy=S(()=>{"use strict";Te();ee();W();B();Fe();l(Fy,"getPostCommitScript");l(Uy,"getPostCheckoutScript");l(Xd,"detectHookManagers");l(Ly,"selectStrategy");l(sP,"installLefthook");l(nP,"installHusky");l(rP,"installDirect");l(oP,"uninstallLefthook");l(iP,"uninstallHusky");l(aP,"uninstallDirect");Yd=class{static{l(this,"HooksService")}async install(e,t={}){let s=t.hooks||["post-commit","post-checkout"],n=await Xd(e);if(n.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||Ly(n);try{let i=!1;switch(o){case"lefthook":i=await sP(e,s);break;case"husky":i=await nP(e,s);break;case"direct":i=await rP(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 oP(e);break;case"husky":n=await iP(e);break;case"direct":n=await aP(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 Xd(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 Xd(e),s=Ly(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{}}},cP=new Yd});var qy={};ye(qy,{DoctorService:()=>qa,doctorService:()=>uP});import{execSync as Qd}from"node:child_process";import lP from"node:fs/promises";import Gy from"node:path";import mn from"chalk";var qa,uP,By=S(()=>{"use strict";Te();ve();yr();vt();B();$o();Fe();ut();fr();qa=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=Qd(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=Gy.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=Gy.join(this.globalPath,"context","CLAUDE.md");try{let t=await lP.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{Qd("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=Qd("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 hr({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 Rf(e)).configured)return{name:`${e} mcp`,status:"ok",message:"not configured (optional)",optional:!0};let s=await Af(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 If(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(p=>p.name==="gh"&&p.status==="error")&&s.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(p=>p.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&s.push('Run "prjct sync" to update context');let i=t.find(p=>p.name==="prjct config");i?.status==="error"&&s.push('Run "prjct init" to initialize this project'),t.find(p=>p.name==="CLAUDE.md"&&p.status==="error")&&!i?.status?.includes("error")&&s.push('Run "prjct sync" to generate context files');let c=t.find(p=>p.name==="context7 mcp");c&&c.status!=="ok"&&s.push('Run "prjct start" to install/repair Context7 MCP');let u=t.find(p=>p.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(p=>p.name==="jira mcp");d&&d.status!=="ok"&&s.push('Run "prjct jira setup" to repair Jira MCP configuration');let m=t.find(p=>p.name==="linear mcp");return m&&m.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")}}},uP=new qa});var Vy={};ye(Vy,{WatchService:()=>Ba,watchService:()=>fP});import dP from"node:path";import kt from"chalk";import pP from"chokidar";var mP,gP,Ba,fP,Jy=S(()=>{"use strict";Te();W();X();ea();mP=["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"],gP=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],Ba=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=pP.watch(mP,{cwd:this.projectPath,ignored:gP,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: ${dP.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("")}},fP=new Ba});var ew={};ye(ew,{formatAgentCommandHelp:()=>Yy,formatCommandHelp:()=>Qy,formatCommandList:()=>Zy,formatMainHelp:()=>Ky,formatTerminalCommandHelp:()=>Xy,getHelp:()=>yP});import Y from"chalk";function Ky(){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 zy){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=Jr.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 hP)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 Xy(r){let e=zy.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 Yy(r){let e=Jr.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=Wo[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 Qy(r){let e=Xy(r);if(e)return e;let t=Yy(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.0",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 Zy(){let r=[];r.push(""),r.push(Y.cyan.bold("All Commands")),r.push("");let e=Object.entries(Wo).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=Jr.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 yP(r){return r?r==="commands"||r==="all"?Zy():Qy(r):Ky()}var zy,hP,tw=S(()=>{"use strict";qd();ut();zy=[{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"]}],hP=[{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(Ky,"formatMainHelp");l(Xy,"formatTerminalCommandHelp");l(Yy,"formatAgentCommandHelp");l(Qy,"formatCommandHelp");l(Zy,"formatCommandList");l(yP,"getHelp")});var sw=dw((eJ,wP)=>{wP.exports={name:"prjct-cli",version:"1.56.6",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:">=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 PP={};import nw from"node:os";import Va from"node:path";import Be from"chalk";async function kP(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>pw(sw()));await EP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(CP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=H.getByName(r);if(!s){let p=bP(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}=TP(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=SP(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 Zs.expireIfStale(c),await Zs.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 Zs.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(oc(s)),t||f.end(),process.exit(1)}}function SP(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 bP(r){let e=H.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=vP(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function vP(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 TP(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 EP(r){let e=await Ps(),t=Va.join(nw.homedir(),".claude","commands","p.md"),s=Va.join(nw.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([C(t),C(s),C(Va.join(process.cwd(),".cursor","commands","sync.md")),C(Va.join(process.cwd(),".cursor"))]),c=await Vn();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 CP(){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 rw=S(()=>{"use strict";Gd();Lo();Jd();lt();Te();Pi();Ci();W();bo();B();Fe();l(kP,"main");l(SP,"validateCommandParams");l(bP,"findClosestCommand");l(vP,"editDistance");l(TP,"parseCommandArgs");l(EP,"displayVersion");l(CP,"displayHelp");kP().catch(r=>{console.error("Fatal error:",k(r)),process.env.DEBUG&&console.error(oc(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var so=process.argv.slice(2),Zd=so.find(r=>!r.startsWith("--")&&!r.startsWith("-")),xP=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(Zd&&!xP.has(Zd)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(Jo(),tp)),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<so.length;a++){let c=so[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<so.length&&!so[a+1].startsWith("--")?i[u]=so[++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:Zd,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 jP(){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(),Dp))).default,o=(await Promise.resolve().then(()=>(ai(),Mp))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(tl(),hm)),{fileExists:c}=await Promise.resolve().then(()=>(B(),_t)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(uc(),wp)),{VERSION:d}=await Promise.resolve().then(()=>(ut(),Yn));async function m(){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(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(T=>T==="--quiet"||T==="-q"),w=g!==-1;if(w){p.splice(g,1);let{setQuietMode:T}=await Promise.resolve().then(()=>(Fe(),bm));T(!0)}let b=p.indexOf("--refresh"),h=b!==-1;h&&(p.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(()=>(Ci(),Em));return await y.expireIfStale(M),await y.touch(M),()=>{let j=Date.now()-I;y.trackCommand(M,T,j).catch(()=>{}),Promise.resolve().then(()=>(Pi(),Pm)).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"),p[0]==="daemon"){let T=p[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(p.includes("--foreground")||p.includes("-f")){let{startDaemon:j}=await Promise.resolve().then(()=>(Ey(),Ty)),D=parseInt(p.find(Q=>Q.startsWith("--port="))?.split("=")[1]||"",10)||void 0,G=p.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(p[0]==="stop"){let{isDaemonRunning:T,stopDaemon:I,forceKillDaemon:M}=await Promise.resolve().then(()=>(Ts(),vs));if(p.includes("--force")||p.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(p[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(p[0]==="start"||p[0]==="setup"){let{runStart:T}=await Promise.resolve().then(()=>(jy(),xy));await T()}else if(p[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(p[0]==="web"||p[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(p[1],10)||i;await a(I,T,M)}}catch(T){console.error("Server error:",T.message),process.exitCode=1}else if(p[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=p.slice(1).filter(D=>D!=="--md"&&D!=="--json"),j=p.includes("--md");if(y.length===0){let{ContextCommands:D}=await Promise.resolve().then(()=>(Ra(),Dh)),Q=await new D().context(null,T,{md:j});process.exitCode=Q.success?0:1}else{let{runContextTool:D}=await Promise.resolve().then(()=>(Ny(),_y)),G=await D(y,I,T);console.log(JSON.stringify(G,null,2)),process.exitCode=G.tool==="error"?1:0}M()}}else if(p[0]==="hooks"){let T=await x("hooks"),{hooksService:I}=await Promise.resolve().then(()=>(Wy(),Hy)),M=p[1]||"status",y=await I.run(process.cwd(),M);process.exitCode=y,T()}else if(p[0]==="doctor"){let T=await x("doctor"),{doctorService:I}=await Promise.resolve().then(()=>(By(),qy)),M=await I.run(process.cwd());process.exitCode=M,T()}else if(p[0]==="uninstall"){let{uninstall:T}=await Promise.resolve().then(()=>(Bd(),ky)),I=p.includes("--force")||p.includes("-f"),M=p.includes("--backup")||p.includes("-b"),y=p.includes("--dry-run")||p.includes("-n"),j=p.includes("--keep-package"),D=await T({force:I,backup:M,dryRun:y,keepPackage:j});process.exitCode=D.success?0:1}else if(p[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(()=>(Jy(),Vy)),y=p.includes("--verbose")||p.includes("-v"),j=p.find(he=>he.startsWith("--debounce=")),D=j?parseInt(j.split("=")[1],10):void 0,G=p.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(p[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=[...p.slice(1)];T(Q,[G,...Ve],{stdio:"inherit",cwd:M}).on("close",Ne=>{process.exitCode=Ne||0})}}else if(p[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=[...p.slice(1)];T(Q,[G,...Ve],{stdio:"inherit",cwd:M}).on("close",Ne=>{process.exitCode=Ne||0})}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:T}=await Promise.resolve().then(()=>(tw(),ew)),I=p[1];console.log(T(I)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[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
|
|
|
@@ -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(()=>(yr(),Ji));await j.run()}catch{await o.updateVersion(d).catch(()=>{})}}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(Ts(),vs)).then(({spawnDaemon:y})=>y()).catch(()=>{}),await Promise.resolve().then(()=>(rw(),PP))}}}l(jP,"main");jP().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
|