prjct-cli 1.26.0 → 1.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -1
- package/dist/bin/prjct-core.mjs +305 -592
- package/dist/cli/linear.mjs +10 -10
- package/dist/daemon/entry.mjs +242 -529
- package/package.json +3 -1
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -2,15 +2,15 @@ import { fileURLToPath as __fileURLToPath } from 'url';
|
|
|
2
2
|
import { dirname as __pathDirname } from 'path';
|
|
3
3
|
const __filename = __fileURLToPath(import.meta.url);
|
|
4
4
|
const __dirname = __pathDirname(__filename);
|
|
5
|
-
var
|
|
6
|
-
`)}function
|
|
7
|
-
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),s.end(),e(m)}catch(m){i=!0,clearTimeout(a),s.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),s.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),s.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function
|
|
8
|
-
`,"utf-8")}async function
|
|
9
|
-
`)}async function
|
|
10
|
-
`);await Ud(r,t)}function fw(r){return ks.extname(r)}function hw(r){return ks.basename(r,ks.extname(r))}var xe=y(()=>{"use strict";Ld();_();l(Gn,"readJson");l(Rr,"writeJson");l(Ss,"readFile");l(Ud,"writeFile");l(rw,"atomicWrite");l(ow,"appendToFile");l(za,"appendLine");l(iw,"prependToFile");l(T,"fileExists");l(jo,"dirExists");l(_t,"ensureDir");l(aw,"deleteFile");l(cw,"deleteDir");l(bs,"listFiles");l(lw,"getFileSize");l(uw,"getFileModifiedTime");l(dw,"copyFile");l(pw,"moveFile");l(mw,"readLines");l(gw,"writeLines");l(fw,"getFileExtension");l(hw,"getFileNameWithoutExtension")});var zd={};fe(zd,{invalidateProviderCache:()=>kw,readProviderCache:()=>Ba,writeProviderCache:()=>Va});import Do from"node:fs/promises";import yw from"node:os";import Hd from"node:path";async function Ba(){try{let r=await Do.readFile(Wa,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>ww?null:e.detection}catch{return null}}async function Va(r){let e={timestamp:new Date().toISOString(),detection:r};await Do.mkdir(Gd,{recursive:!0}),await Do.writeFile(Wa,JSON.stringify(e,null,2))}async function kw(){try{await Do.unlink(Wa)}catch{}}var Gd,Wa,ww,Ja=y(()=>{"use strict";Gd=Hd.join(yw.homedir(),".prjct-cli","cache"),Wa=Hd.join(Gd,"providers.json"),ww=600*1e3;l(Ba,"readProviderCache");l(Va,"writeProviderCache");l(kw,"invalidateProviderCache")});var mt={};fe(mt,{AntigravityProvider:()=>Ka,ClaudeProvider:()=>Ro,CursorProvider:()=>Vd,GeminiProvider:()=>qa,Providers:()=>_e,WindsurfProvider:()=>Jd,detectAllProviders:()=>un,detectAntigravity:()=>vs,detectCursorProject:()=>Kd,detectProvider:()=>$o,detectWindsurfProject:()=>Yd,getActiveProvider:()=>Pw,getCommandsDir:()=>Dw,getGlobalContextPath:()=>Iw,getGlobalSettingsPath:()=>Aw,getProjectCommandsPath:()=>Rw,getProviderBranding:()=>Mo,getSkillsPath:()=>jw,hasProviderConfig:()=>xw,needsCursorRouterRegeneration:()=>Tw,needsWindsurfRouterRegeneration:()=>Ew,selectProvider:()=>Ya,validateCliVersion:()=>qd});import{exec as Sw}from"node:child_process";import Cs from"node:os";import rt from"node:path";import{promisify as bw}from"node:util";async function Cw(r){try{let{stdout:e}=await Wd(`which ${r}`,{timeout:Bd});return e.trim()}catch{return null}}async function vw(r){try{let{stdout:e}=await Wd(`${r} --version`,{timeout:Bd}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function $o(r){let e=_e[r];if(!e.cliCommand)return{installed:!1};let t=await Cw(e.cliCommand);if(!t)return{installed:!1};let n=await vw(e.cliCommand),s=qd(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function qd(r,e){let t=_e[r];return!t.minCliVersion||!e?null:$d(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 un(r=!1){if(!r){let s=await Ba();if(s)return s}let[e,t]=await Promise.all([$o("claude"),$o("gemini")]),n={claude:e,gemini:t};return await Va(n).catch(()=>{}),n}async function Pw(r){if(r&&_e[r])return _e[r];let e=await un();return e.claude.installed&&!e.gemini.installed?Ro:e.gemini.installed&&!e.claude.installed?qa:Ro}async function xw(r){let e=_e[r];return e.configDir?T(e.configDir):!1}function Mo(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"}[r]||"\u26A1 prjct"}}async function Kd(r){let e=rt.join(r,".cursor"),t=rt.join(e,"rules"),n=rt.join(t,"prjct.mdc"),[s,o]=await Promise.all([T(e),T(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Tw(r){let e=await Kd(r);return e.detected&&!e.routerInstalled}async function Yd(r){let e=rt.join(r,".windsurf"),t=rt.join(e,"rules"),n=rt.join(t,"prjct.md"),[s,o]=await Promise.all([T(e),T(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function Ew(r){let e=await Yd(r);return e.detected&&!e.routerInstalled}async function vs(){let r=Ka.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=rt.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([T(r),T(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function Iw(r){let e=_e[r];return e.configDir?rt.join(e.configDir,e.contextFile):null}function Aw(r){let e=_e[r];return!e.configDir||!e.settingsFile?null:rt.join(e.configDir,e.settingsFile)}function jw(r){return _e[r].skillsDir}function Dw(r){return _e[r].commandsDir}function Rw(r,e){let t=_e[r];return rt.join(e,t.commandsDir)}async function Ya(){let r=await un(),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 Wd,Bd,Ro,qa,Ka,Vd,Jd,_e,Je=y(()=>{"use strict";Dr();xe();Ja();Wd=bw(Sw),Bd=2e3,Ro={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:rt.join(Cs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:rt.join(Cs.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"},qa={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:rt.join(Cs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:rt.join(Cs.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"},Ka={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:rt.join(Cs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:rt.join(Cs.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},Vd={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},Jd={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},_e={claude:Ro,gemini:qa,cursor:Vd,antigravity:Ka,windsurf:Jd};l(Cw,"whichCommand");l(vw,"getCliVersion");l($o,"detectProvider");l(qd,"validateCliVersion");l(un,"detectAllProviders");l(Pw,"getActiveProvider");l(xw,"hasProviderConfig");l(Mo,"getProviderBranding");l(Kd,"detectCursorProject");l(Tw,"needsCursorRouterRegeneration");l(Yd,"detectWindsurfProject");l(Ew,"needsWindsurfRouterRegeneration");l(vs,"detectAntigravity");l(Iw,"getGlobalContextPath");l(Aw,"getGlobalSettingsPath");l(jw,"getSkillsPath");l(Dw,"getCommandsDir");l(Rw,"getProjectCommandsPath");l(Ya,"selectProvider")});import{z as ke}from"zod";function $w(r){return r instanceof Ps}function ne(r){return $w(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var xs,QI,ZI,eA,tA,nA,sA,Ps,Oo,Fo,$r,dn=y(()=>{"use strict";xs={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},QI=xs.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),ZI=xs.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),eA=xs.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),tA=xs.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),nA=xs.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),sA=xs.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),Ps=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)}},Oo=class r extends Ps{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")}},Fo=class r extends Ps{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")}},$r=class r extends Ps{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($w,"isPrjctError");l(ne,"getErrorMessage")});var B={};fe(B,{calculateDuration:()=>Gw,formatDate:()=>_o,formatDuration:()=>Mr,formatMonth:()=>Ow,getDateKey:()=>Fw,getDateRange:()=>Lw,getDaysAgo:()=>Cn,getDaysFromNow:()=>Nw,getEndOfDay:()=>Ww,getStartOfDay:()=>zw,getTimestamp:()=>C,getTodayKey:()=>Xd,getYearMonthDay:()=>Xa,isToday:()=>Uw,isWithinLastDays:()=>Hw,parseDate:()=>_w,toRelative:()=>bt});import{formatDistanceToNowStrict as Mw}from"date-fns";function _o(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function Ow(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Xd(){return _o(new Date)}function Fw(r){return _o(r)}function Xa(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function _w(r){return new Date(r)}function C(){return new Date().toISOString()}function Cn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Nw(r){let e=new Date;return e.setDate(e.getDate()+r),e}function Lw(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function Uw(r){return _o(r)===Xd()}function Hw(r,e){let t=Cn(e);return r>=t}function Mr(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function Gw(r,e=new Date){let t=e.getTime()-r.getTime();return Mr(t)}function zw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Ww(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function bt(r){let e=typeof r=="string"?new Date(r):r;return Mw(e,{addSuffix:!0})}var ie=y(()=>{"use strict";l(_o,"formatDate");l(Ow,"formatMonth");l(Xd,"getTodayKey");l(Fw,"getDateKey");l(Xa,"getYearMonthDay");l(_w,"parseDate");l(C,"getTimestamp");l(Cn,"getDaysAgo");l(Nw,"getDaysFromNow");l(Lw,"getDateRange");l(Uw,"isToday");l(Hw,"isWithinLastDays");l(Mr,"formatDuration");l(Gw,"calculateDuration");l(zw,"getStartOfDay");l(Ww,"getEndOfDay");l(bt,"toRelative")});var Uo={};fe(Uo,{PACKAGE_ROOT:()=>pe,VERSION:()=>he,compareVersions:()=>Qd,getPackageInfo:()=>Bw,getPackageRoot:()=>ec,getVersion:()=>Fr,isCompatible:()=>Vw,needsMigration:()=>Jw});import Qa from"node:fs";import Lo from"node:path";function ec(){if(Or)return Or;let r=__dirname;for(let e=0;e<5;e++){let t=Lo.join(r,"package.json");if(Qa.existsSync(t))try{if(JSON.parse(Qa.readFileSync(t,"utf-8")).name==="prjct-cli")return Or=r,r}catch{}r=Lo.dirname(r)}return Or=Lo.join(__dirname,"..","..",".."),Or}function Fr(){if(No)return No;try{let r=Lo.join(ec(),"package.json"),e=JSON.parse(Qa.readFileSync(r,"utf-8"));return No=e.version,Za=e,No}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function Bw(){return Za||Fr(),Za}function Qd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<Math.max(t.length,n.length);s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Vw(r){let e=Fr(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Jw(r,e=null){let t=e||Fr();return Qd(r,t)<0}var No,Za,Or,he,pe,gt=y(()=>{"use strict";_();No=null,Za=null,Or=null;l(ec,"getPackageRoot");l(Fr,"getVersion");l(Bw,"getPackageInfo");l(Qd,"compareVersions");l(Vw,"isCompatible");l(Jw,"needsMigration");he=Fr(),pe=ec()});import{exec as qw}from"node:child_process";import{promisify as Kw}from"node:util";async function Ho(r){try{let{stdout:e}=await Yw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Xw(){let r=await Ho("gh api user --jq .login");return r.success&&r.output||(r=await Ho("git config --global github.user"),r.success&&r.output)?r.output:null}async function Qw(){let r=await Ho("git config user.name");return r.success&&r.output?r.output:null}async function Zw(){let r=await Ho("git config user.email");return r.success&&r.output?r.output:null}async function Ts(){let[r,e,t]=await Promise.all([Xw(),Qw(),Zw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Yw,Go=y(()=>{"use strict";Yw=Kw(qw);l(Ho,"execCommand");l(Xw,"detectGitHubUsername");l(Qw,"detectGitName");l(Zw,"detectGitEmail");l(Ts,"detect")});import ek from"node:crypto";import Qt from"node:fs/promises";import nc from"node:os";import H from"node:path";import{globSync as tk}from"glob";var sc,nk,E,me=y(()=>{"use strict";ie();xe();sc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?H.resolve(e):H.join(nc.homedir(),".prjct-cli"),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=H.resolve(e),this.globalProjectsDir=H.join(this.globalBaseDir,"projects"),this.globalConfigDir=H.join(this.globalBaseDir,"config")}generateProjectId(e){return ek.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return H.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return H.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return H.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return H.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await jo(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await T(t)}async ensureGlobalStructure(){await _t(this.globalBaseDir),await _t(this.globalProjectsDir),await _t(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await _t(H.join(t,s));return await _t(H.join(t,"planning","tasks")),await _t(H.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Xa(t);return H.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await _t(n),n}async listSessions(e,t=null,n=null){let s=H.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Qt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=H.join(s,a.name),u=await Qt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=H.join(c,d.name),p=await Qt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:H.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return H.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Qt.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 jo(t)}getDisplayPath(e){let t=nc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return H.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return H.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return H.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return H.join(this.globalBaseDir,".running")}getDocsPath(){return H.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Je(),Et(mt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Je(),Et(mt)).getActiveProvider();return(Je(),Et(mt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return H.join(nc.homedir(),".claude")}getClaudeSettingsPath(){return H.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?H.join(this.getGlobalProjectPath(e),"agents"):H.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return H.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return H.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of n){let o=H.join(e,s.file);if(await T(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=H.join(e,"package.json");if(await T(s))try{let o=await Qt.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await Qt.readFile(H.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
11
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=
|
|
12
|
-
`,"utf-8")}async readGlobalConfig(e){try{let t=
|
|
13
|
-
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:
|
|
5
|
+
var vy=Object.create;var fr=Object.defineProperty;var xy=Object.getOwnPropertyDescriptor;var Py=Object.getOwnPropertyNames;var Ty=Object.getPrototypeOf,Ey=Object.prototype.hasOwnProperty;var l=(r,e)=>fr(r,"name",{value:e,configurable:!0}),hr=(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')}),dd=r=>e=>{var t=r[e];if(t)return t();throw new Error("Module not found in bundle: "+e)};var y=(r,e)=>()=>(r&&(e=r(r=0)),e);var Iy=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ge=(r,e)=>{for(var t in e)fr(r,t,{get:e[t],enumerable:!0})},pd=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Py(e))!Ey.call(r,s)&&s!==t&&fr(r,s,{get:()=>e[s],enumerable:!(n=xy(e,s))||n.enumerable});return r};var Ay=(r,e,t)=>(t=r!=null?vy(Ty(r)):{},pd(e||!r||!r.__esModule?fr(t,"default",{value:r,enumerable:!0}):t,r)),xt=r=>pd(fr({},"__esModule",{value:!0}),r);var md={};ge(md,{DAEMON_PATHS:()=>Ue,IDLE_TIMEOUT_MS:()=>Ea,decodeMessage:()=>jy,encodeMessage:()=>ds});function ds(r){return Buffer.from(`${JSON.stringify(r)}
|
|
6
|
+
`)}function jy(r){return JSON.parse(r.trim())}var Ue,Ea,ho=y(()=>{"use strict";Ue={runDir:l(()=>`${process.env.HOME||hr("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Ue.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Ue.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Ue.runDir()}/daemon.log`,"log")},Ea=1800*1e3;l(ds,"encodeMessage");l(jy,"decodeMessage")});var ps={};ge(ps,{executeViaDaemon:()=>$y,getDaemonStatus:()=>Ry,isDaemonRunning:()=>gd,sendRequest:()=>yr,spawnDaemon:()=>fd,stopDaemon:()=>My});import yo from"node:crypto";import Pt from"node:fs";import{connect as Dy}from"node:net";async function gd(){let r=Ue.socket();if(!Pt.existsSync(r))return!1;try{return(await yr({id:yo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Pt.unlinkSync(r)}catch{}return!1}}async function Ry(){let r=Ue.socket(),e=Ue.pid();if(!Pt.existsSync(r))return{running:!1};try{let t=await yr({id:yo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Pt.existsSync(e)?{running:!1,pid:parseInt(Pt.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function yr(r){return new Promise((e,t)=>{let n=Ue.socket(),s=Dy(n),o="",i=!1,a=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(ds(r))}),s.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
7
|
+
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),s.end(),e(m)}catch(m){i=!0,clearTimeout(a),s.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),s.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),s.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function $y(r,e,t,n,s,o=!0){let i=Ue.socket();if(!Pt.existsSync(i))return o&&fd().catch(()=>{}),null;try{return await yr({id:yo.randomUUID(),command:r,args:e,options:t,cwd:n,perfStartNs:s})}catch{return null}}async function My(){try{return(await yr({id:yo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}async function fd(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),n=e.join(__dirname,"..","daemon","entry.mjs"),s=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Pt.existsSync(t))o=t,i="bun";else if(Pt.existsSync(n))o=n,i="node";else if(Pt.existsSync(s))o=s,i="node";else return!1;let a=Ue.runDir();Pt.mkdirSync(a,{recursive:!0});let c=Ue.log(),u=Pt.openSync(c,"a");return r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Pt.closeSync(u),await new Promise(m=>setTimeout(m,500)),gd()}var ms=y(()=>{"use strict";ho();l(gd,"isDaemonRunning");l(Ry,"getDaemonStatus");l(yr,"sendRequest");l($y,"executeViaDaemon");l(My,"stopDaemon");l(fd,"spawnDaemon")});import{z as Kt}from"zod";function hd(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var BE,VE,JE,wr,qE,Sr=y(()=>{"use strict";BE=Kt.enum(["opus","sonnet","haiku"]),VE=Kt.enum(["2.5-pro","2.5-flash","2.0-flash"]),JE=Kt.string().min(1),wr=Kt.object({provider:Kt.string(),model:Kt.string(),cliVersion:Kt.string().optional(),recordedAt:Kt.string()}),qE=Kt.object({preferredModel:Kt.string().optional(),lastAnalysisModel:wr.optional()});l(hd,"compareSemver")});function yd(r){return r instanceof Error&&"code"in r}function v(r){return yd(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function wo(r){if(r instanceof Error)return r.stack}var _=y(()=>{"use strict";l(yd,"isNodeError");l(v,"isNotFoundError");l(w,"getErrorMessage");l(wo,"getErrorStack")});import kd from"node:fs/promises";async function bd(r,e){let t;try{t=await kd.readFile(r,"utf-8")}catch(o){if(v(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await wd(r,t),Sd(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await wd(r,t),Sd(r,Oy(s.error)),null)}async function wd(r,e){let t=`${r}.backup`;try{await kd.writeFile(t,e,"utf-8")}catch{}}function Sd(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 Oy(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Cd=y(()=>{"use strict";_();l(bd,"safeRead");l(wd,"createBackup");l(Sd,"logCorruption");l(Oy,"formatZodError")});var ce={};ge(ce,{appendLine:()=>Ia,appendToFile:()=>_y,atomicWrite:()=>Fy,copyFile:()=>zy,deleteDir:()=>Hy,deleteFile:()=>Ly,dirExists:()=>So,ensureDir:()=>Mt,fileExists:()=>P,getFileExtension:()=>Jy,getFileModifiedTime:()=>Gy,getFileNameWithoutExtension:()=>qy,getFileSize:()=>Uy,listFiles:()=>hs,moveFile:()=>Wy,prependToFile:()=>Ny,readFile:()=>fs,readJson:()=>_n,readLines:()=>By,writeFile:()=>vd,writeJson:()=>kr,writeLines:()=>Vy});import ye from"node:fs/promises";import gs from"node:path";async function _n(r,e=null,t){if(t)return await bd(r,t)??e;try{let n=await ye.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(v(n))return e;throw n}}async function kr(r,e,t=2){let n=JSON.stringify(e,null,t);await ye.writeFile(r,n,"utf-8")}async function fs(r,e=""){try{return await ye.readFile(r,"utf-8")}catch(t){if(v(t))return e;throw t}}async function vd(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.writeFile(r,e,"utf-8")}async function Fy(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0});let n=`${r}.${Date.now()}.tmp`;await ye.writeFile(n,e,"utf-8"),await ye.rename(n,r)}async function _y(r,e){await ye.appendFile(r,e,"utf-8")}async function Ia(r,e){let t=gs.dirname(r);await ye.mkdir(t,{recursive:!0}),await ye.appendFile(r,`${e}
|
|
8
|
+
`,"utf-8")}async function Ny(r,e){try{let t=await ye.readFile(r,"utf-8");await ye.writeFile(r,e+t,"utf-8")}catch(t){if(v(t))await ye.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await ye.access(r),!0}catch(e){if(v(e))return!1;throw e}}async function So(r){try{return(await ye.stat(r)).isDirectory()}catch(e){if(v(e))return!1;throw e}}async function Mt(r){await ye.mkdir(r,{recursive:!0})}async function Ly(r){try{return await ye.unlink(r),!0}catch(e){if(v(e))return!1;throw e}}async function Hy(r){try{return await ye.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(v(e))return!1;throw e}}async function hs(r,e={}){try{let n=await ye.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(v(t))return[];throw t}}async function Uy(r){return(await ye.stat(r)).size}async function Gy(r){return(await ye.stat(r)).mtime}async function zy(r,e){await ye.copyFile(r,e)}async function Wy(r,e){await ye.rename(r,e)}async function By(r){return(await fs(r,"")).split(`
|
|
9
|
+
`)}async function Vy(r,e){let t=e.join(`
|
|
10
|
+
`);await vd(r,t)}function Jy(r){return gs.extname(r)}function qy(r){return gs.basename(r,gs.extname(r))}var xe=y(()=>{"use strict";Cd();_();l(_n,"readJson");l(kr,"writeJson");l(fs,"readFile");l(vd,"writeFile");l(Fy,"atomicWrite");l(_y,"appendToFile");l(Ia,"appendLine");l(Ny,"prependToFile");l(P,"fileExists");l(So,"dirExists");l(Mt,"ensureDir");l(Ly,"deleteFile");l(Hy,"deleteDir");l(hs,"listFiles");l(Uy,"getFileSize");l(Gy,"getFileModifiedTime");l(zy,"copyFile");l(Wy,"moveFile");l(By,"readLines");l(Vy,"writeLines");l(Jy,"getFileExtension");l(qy,"getFileNameWithoutExtension")});var Td={};ge(Td,{invalidateProviderCache:()=>Xy,readProviderCache:()=>ja,writeProviderCache:()=>Da});import ko from"node:fs/promises";import Ky from"node:os";import xd from"node:path";async function ja(){try{let r=await ko.readFile(Aa,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Yy?null:e.detection}catch{return null}}async function Da(r){let e={timestamp:new Date().toISOString(),detection:r};await ko.mkdir(Pd,{recursive:!0}),await ko.writeFile(Aa,JSON.stringify(e,null,2))}async function Xy(){try{await ko.unlink(Aa)}catch{}}var Pd,Aa,Yy,Ra=y(()=>{"use strict";Pd=xd.join(Ky.homedir(),".prjct-cli","cache"),Aa=xd.join(Pd,"providers.json"),Yy=600*1e3;l(ja,"readProviderCache");l(Da,"writeProviderCache");l(Xy,"invalidateProviderCache")});var ut={};ge(ut,{AntigravityProvider:()=>Ma,ClaudeProvider:()=>bo,CursorProvider:()=>Ad,GeminiProvider:()=>$a,Providers:()=>Fe,WindsurfProvider:()=>jd,detectAllProviders:()=>an,detectAntigravity:()=>ws,detectCursorProject:()=>Rd,detectProvider:()=>Co,detectWindsurfProject:()=>$d,getActiveProvider:()=>nw,getCommandsDir:()=>lw,getGlobalContextPath:()=>iw,getGlobalSettingsPath:()=>aw,getProjectCommandsPath:()=>uw,getProviderBranding:()=>vo,getSkillsPath:()=>cw,hasProviderConfig:()=>sw,needsCursorRouterRegeneration:()=>rw,needsWindsurfRouterRegeneration:()=>ow,selectProvider:()=>Oa,validateCliVersion:()=>Dd});import{exec as Qy}from"node:child_process";import ys from"node:os";import nt from"node:path";import{promisify as Zy}from"node:util";async function ew(r){try{let{stdout:e}=await Ed(`which ${r}`,{timeout:Id});return e.trim()}catch{return null}}async function tw(r){try{let{stdout:e}=await Ed(`${r} --version`,{timeout:Id}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Co(r){let e=Fe[r];if(!e.cliCommand)return{installed:!1};let t=await ew(e.cliCommand);if(!t)return{installed:!1};let n=await tw(e.cliCommand),s=Dd(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function Dd(r,e){let t=Fe[r];return!t.minCliVersion||!e?null:hd(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 an(r=!1){if(!r){let s=await ja();if(s)return s}let[e,t]=await Promise.all([Co("claude"),Co("gemini")]),n={claude:e,gemini:t};return await Da(n).catch(()=>{}),n}async function nw(r){if(r&&Fe[r])return Fe[r];let e=await an();return e.claude.installed&&!e.gemini.installed?bo:e.gemini.installed&&!e.claude.installed?$a:bo}async function sw(r){let e=Fe[r];return e.configDir?P(e.configDir):!1}function vo(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"}[r]||"\u26A1 prjct"}}async function Rd(r){let e=nt.join(r,".cursor"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.mdc"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function rw(r){let e=await Rd(r);return e.detected&&!e.routerInstalled}async function $d(r){let e=nt.join(r,".windsurf"),t=nt.join(e,"rules"),n=nt.join(t,"prjct.md"),[s,o]=await Promise.all([P(e),P(n)]);return{detected:s,routerInstalled:o,projectRoot:s?r:void 0}}async function ow(r){let e=await $d(r);return e.detected&&!e.routerInstalled}async function ws(){let r=Ma.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=nt.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}function iw(r){let e=Fe[r];return e.configDir?nt.join(e.configDir,e.contextFile):null}function aw(r){let e=Fe[r];return!e.configDir||!e.settingsFile?null:nt.join(e.configDir,e.settingsFile)}function cw(r){return Fe[r].skillsDir}function lw(r){return Fe[r].commandsDir}function uw(r,e){let t=Fe[r];return nt.join(e,t.commandsDir)}async function Oa(){let r=await an(),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 Ed,Id,bo,$a,Ma,Ad,jd,Fe,Be=y(()=>{"use strict";Sr();xe();Ra();Ed=Zy(Qy),Id=2e3,bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:nt.join(ys.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:nt.join(ys.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"},$a={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:nt.join(ys.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:nt.join(ys.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"},Ma={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:nt.join(ys.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:nt.join(ys.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},Ad={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},jd={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},Fe={claude:bo,gemini:$a,cursor:Ad,antigravity:Ma,windsurf:jd};l(ew,"whichCommand");l(tw,"getCliVersion");l(Co,"detectProvider");l(Dd,"validateCliVersion");l(an,"detectAllProviders");l(nw,"getActiveProvider");l(sw,"hasProviderConfig");l(vo,"getProviderBranding");l(Rd,"detectCursorProject");l(rw,"needsCursorRouterRegeneration");l($d,"detectWindsurfProject");l(ow,"needsWindsurfRouterRegeneration");l(ws,"detectAntigravity");l(iw,"getGlobalContextPath");l(aw,"getGlobalSettingsPath");l(cw,"getSkillsPath");l(lw,"getCommandsDir");l(uw,"getProjectCommandsPath");l(Oa,"selectProvider")});import{z as we}from"zod";function dw(r){return r instanceof Ss}function ne(r){return dw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var ks,bI,CI,vI,xI,PI,TI,Ss,xo,Po,br,cn=y(()=>{"use strict";ks={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let o=e.parse(s);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===r}static create(s){return new t(s)}}return t}},bI=ks.create("FileError",we.object({path:we.string(),operation:we.enum(["read","write","delete","create","copy"]),reason:we.string().optional()})),CI=ks.create("ValidationError",we.object({field:we.string(),expected:we.string(),received:we.string().optional(),message:we.string().optional()})),vI=ks.create("PermissionError",we.object({action:we.string(),resource:we.string(),reason:we.string().optional()})),xI=ks.create("TaskError",we.object({taskId:we.string().optional(),operation:we.enum(["create","update","complete","pause","resume","delete"]),reason:we.string()})),PI=ks.create("SessionError",we.object({sessionId:we.string().optional(),reason:we.string()})),TI=ks.create("SyncError",we.object({projectId:we.string().optional(),operation:we.enum(["push","pull","auth","connect"]),reason:we.string()})),Ss=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)}},xo=class r extends Ss{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")}},Po=class r extends Ss{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")}},br=class r extends Ss{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(dw,"isPrjctError");l(ne,"getErrorMessage")});var B={};ge(B,{calculateDuration:()=>kw,formatDate:()=>To,formatDuration:()=>Cr,formatMonth:()=>mw,getDateKey:()=>gw,getDateRange:()=>yw,getDaysAgo:()=>yn,getDaysFromNow:()=>hw,getEndOfDay:()=>Cw,getStartOfDay:()=>bw,getTimestamp:()=>C,getTodayKey:()=>Md,getYearMonthDay:()=>Fa,isToday:()=>ww,isWithinLastDays:()=>Sw,parseDate:()=>fw,toRelative:()=>vw});import{formatDistanceToNowStrict as pw}from"date-fns";function To(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function mw(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0");return`${e}-${t}`}function Md(){return To(new Date)}function gw(r){return To(r)}function Fa(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function fw(r){return new Date(r)}function C(){return new Date().toISOString()}function yn(r){let e=new Date;return e.setDate(e.getDate()-r),e}function hw(r){let e=new Date;return e.setDate(e.getDate()+r),e}function yw(r,e){let t=[],n=new Date(r);for(;n<=e;)t.push(new Date(n)),n=new Date(n.getFullYear(),n.getMonth(),n.getDate()+1);return t}function ww(r){return To(r)===Md()}function Sw(r,e){let t=yn(e);return r>=t}function Cr(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function kw(r,e=new Date){let t=e.getTime()-r.getTime();return Cr(t)}function bw(r){let e=new Date(r);return e.setHours(0,0,0,0),e}function Cw(r){let e=new Date(r);return e.setHours(23,59,59,999),e}function vw(r){let e=typeof r=="string"?new Date(r):r;return pw(e,{addSuffix:!0})}var le=y(()=>{"use strict";l(To,"formatDate");l(mw,"formatMonth");l(Md,"getTodayKey");l(gw,"getDateKey");l(Fa,"getYearMonthDay");l(fw,"parseDate");l(C,"getTimestamp");l(yn,"getDaysAgo");l(hw,"getDaysFromNow");l(yw,"getDateRange");l(ww,"isToday");l(Sw,"isWithinLastDays");l(Cr,"formatDuration");l(kw,"calculateDuration");l(bw,"getStartOfDay");l(Cw,"getEndOfDay");l(vw,"toRelative")});var Ao={};ge(Ao,{PACKAGE_ROOT:()=>pe,VERSION:()=>fe,compareVersions:()=>Od,getPackageInfo:()=>xw,getPackageRoot:()=>La,getVersion:()=>xr,isCompatible:()=>Pw,needsMigration:()=>Tw});import _a from"node:fs";import Io from"node:path";function La(){if(vr)return vr;let r=__dirname;for(let e=0;e<5;e++){let t=Io.join(r,"package.json");if(_a.existsSync(t))try{if(JSON.parse(_a.readFileSync(t,"utf-8")).name==="prjct-cli")return vr=r,r}catch{}r=Io.dirname(r)}return vr=Io.join(__dirname,"..","..",".."),vr}function xr(){if(Eo)return Eo;try{let r=Io.join(La(),"package.json"),e=JSON.parse(_a.readFileSync(r,"utf-8"));return Eo=e.version,Na=e,Eo}catch(r){return console.error("Failed to read version from package.json:",w(r)),"0.0.0"}}function xw(){return Na||xr(),Na}function Od(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<Math.max(t.length,n.length);s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Pw(r){let e=xr(),[t,n]=e.split(".").map(Number),[s,o]=r.split(".").map(Number);return t===s&&n===o}function Tw(r,e=null){let t=e||xr();return Od(r,t)<0}var Eo,Na,vr,fe,pe,dt=y(()=>{"use strict";_();Eo=null,Na=null,vr=null;l(La,"getPackageRoot");l(xr,"getVersion");l(xw,"getPackageInfo");l(Od,"compareVersions");l(Pw,"isCompatible");l(Tw,"needsMigration");fe=xr(),pe=La()});import{exec as Ew}from"node:child_process";import{promisify as Iw}from"node:util";async function jo(r){try{let{stdout:e}=await Aw(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function jw(){let r=await jo("gh api user --jq .login");return r.success&&r.output||(r=await jo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Dw(){let r=await jo("git config user.name");return r.success&&r.output?r.output:null}async function Rw(){let r=await jo("git config user.email");return r.success&&r.output?r.output:null}async function bs(){let[r,e,t]=await Promise.all([jw(),Dw(),Rw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Aw,Do=y(()=>{"use strict";Aw=Iw(Ew);l(jo,"execCommand");l(jw,"detectGitHubUsername");l(Dw,"detectGitName");l(Rw,"detectGitEmail");l(bs,"detect")});import $w from"node:crypto";import Yt from"node:fs/promises";import Ua from"node:os";import U from"node:path";import{globSync as Mw}from"glob";var Ga,Ow,A,Ce=y(()=>{"use strict";le();xe();Ga=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?U.resolve(e):U.join(Ua.homedir(),".prjct-cli"),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=U.resolve(e),this.globalProjectsDir=U.join(this.globalBaseDir,"projects"),this.globalConfigDir=U.join(this.globalBaseDir,"config")}generateProjectId(e){return $w.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return U.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return U.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return U.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return U.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await So(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Mt(this.globalBaseDir),await Mt(this.globalProjectsDir),await Mt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["core","progress","planning","analysis","memory","agents"];for(let s of n)await Mt(U.join(t,s));return await Mt(U.join(t,"planning","tasks")),await Mt(U.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Fa(t);return U.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await Mt(n),n}async listSessions(e,t=null,n=null){let s=U.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Yt.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=U.join(s,a.name),u=await Yt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let m=U.join(c,d.name),p=await Yt.readdir(m,{withFileTypes:!0});for(let g of p)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:U.join(m,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return U.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Yt.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 So(t)}getDisplayPath(e){let t=Ua.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return U.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return U.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return U.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return U.join(this.globalBaseDir,".running")}getDocsPath(){return U.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Be(),xt(ut)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),xt(ut)).getActiveProvider();return(Be(),xt(ut)).getGlobalSettingsPath(e.name)}getClaudeDir(){return U.join(Ua.homedir(),".claude")}getClaudeSettingsPath(){return U.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?U.join(this.getGlobalProjectPath(e),"agents"):U.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return U.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return U.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let s of n){let o=U.join(e,s.file);if(await P(o)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=U.join(e,"package.json");if(await P(s))try{let o=await Yt.readFile(s,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let n=[],s=[];try{if(t==="pnpm"){let i=(await Yt.readFile(U.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(s=i[1].split(`
|
|
11
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=U.join(e,"package.json"),i=await Yt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?s=a.workspaces:a.workspaces?.packages&&(s=a.workspaces.packages),t==="lerna"){let c=U.join(e,"lerna.json");if(await P(c)){let u=await Yt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(s=d.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=U.join(e,"package.json"),i=await Yt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(s=a.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let o of s){if(o.startsWith("!"))continue;let i=Mw(o,{cwd:e,absolute:!1});for(let a of i){let c=U.join(e,a),u=U.join(c,"package.json");if(await P(u))try{let d=await Yt.readFile(u,"utf-8"),m=JSON.parse(d),p=U.join(c,"PRJCT.md");n.push({name:m.name||U.basename(a),path:c,relativePath:a,hasPrjctMd:await P(p)})}catch{}}}}catch{}return n}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let n=U.resolve(e);for(let s of t.packages){let o=U.resolve(s.path);if(n.startsWith(o))return s}return null}async findMonorepoRoot(e){let t=U.resolve(e),n=U.parse(t).root;for(;t!==n;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=U.dirname(t)}return null}},Ow=new Ga,A=Ow});var _d={};ge(_d,{default:()=>R});import Nn from"node:fs/promises";import Fw from"node:path";import*as Ro from"jsonc-parser";function Fd(r){let e=[],t=Ro.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Ro.printParseErrorCode(n.error)}`)}return t}var za,_w,R,Ve=y(()=>{"use strict";cn();_();le();dt();Do();Ce();l(Fd,"parseJsonc");za=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),n=await Nn.readFile(t,"utf-8");return Fd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read config at ${e}: ${ne(t)}`),null}}async writeConfig(e,t){let n=A.getLocalConfigPath(e),s=A.getLegacyPrjctPath(e);await Nn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
|
|
12
|
+
`,"utf-8")}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),n=await Nn.readFile(t,"utf-8");return Fd(n)}catch(t){return v(t)||console.warn(`Warning: Could not read global config for ${e}: ${ne(t)}`),null}}async writeGlobalConfig(e,t){let n=A.getGlobalProjectConfigPath(e),s=A.getGlobalProjectPath(e);await Nn.mkdir(s,{recursive:!0});let o=JSON.stringify(t,null,2);await Nn.writeFile(n,`${o}
|
|
13
|
+
`,"utf-8")}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=C();t={projectId:e,authors:[],version:fe,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=A.generateProjectId(e),s=A.getGlobalProjectPath(n),o=A.getDisplayPath(s),i=C(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:fe,created:i,lastSync:i};return await this.writeGlobalConfig(n,c),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=C(),await this.writeGlobalConfig(t,n))}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 s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=A.getGlobalProjectPath(s.projectId);try{return(await Nn.readdir(Fw.join(o,"core"))).length===0}catch(i){return v(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:A.generateProjectId(e)}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=C();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=C(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await bs(),n=await this.getProjectId(e);return await this.addAuthor(n,{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 n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=A.generateProjectId(e);return{projectId:n,dataPath:A.getDisplayPath(A.getGlobalProjectPath(n))}}},_w=new za,R=_w});var Ld={};ge(Ld,{default:()=>Ba});import Cs from"node:fs/promises";import Nw from"node:os";import Nd from"node:path";var Wa,Lw,Ba,Va=y(()=>{"use strict";_();Wa=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=Nw.homedir(),this.configDir=Nd.join(this.homeDir,".prjct-cli","config"),this.configFile=Nd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Cs.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",w(e))}}async loadConfig(){try{let e=await Cs.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",w(e)),null}}async saveConfig(e,t,n="claude"){try{await this.ensureConfigDir();let s={version:e,editor:n,provider:n,lastInstall:new Date().toISOString(),path:t};return await Cs.writeFile(this.configFile,JSON.stringify(s,null,2),"utf-8"),!0}catch(s){return console.error("[editors-config] Error saving config:",w(s)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||e.editor||"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 Cs.writeFile(this.configFile,JSON.stringify(t,null,2),"utf-8"),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",w(t)),!1}}async configExists(){try{return await Cs.access(this.configFile),!0}catch{return!1}}async deleteConfig(){try{return await this.configExists()&&await Cs.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",w(e)),!1}}},Lw=new Wa,Ba=Lw});function Hw(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Pr(){return Hw()==="bun"}var Ja=y(()=>{"use strict";l(Hw,"detectRuntime");l(Pr,"isBun")});import qa from"node:fs";import Hd from"node:path";function Uw(r){if(Pr()){let{Database:s}=hr("bun:sqlite");return new s(r,{create:!0})}let e=hr("better-sqlite3"),t=new e(r),n=t.exec.bind(t);return t.run=s=>n(s),t}var Gw,$o,$,V,he=y(()=>{"use strict";Ce();Ja();l(Uw,"openDatabase");Gw=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
14
14
|
-- =======================================================================
|
|
15
15
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
16
16
|
-- =======================================================================
|
|
@@ -241,13 +241,13 @@ var By=Object.create;var Ir=Object.defineProperty;var Vy=Object.getOwnPropertyDe
|
|
|
241
241
|
CREATE INDEX idx_archives_entity_type ON archives(entity_type);
|
|
242
242
|
CREATE INDEX idx_archives_archived_at ON archives(archived_at);
|
|
243
243
|
CREATE INDEX idx_archives_entity_id ON archives(entity_id);
|
|
244
|
-
`)},"up")}]
|
|
244
|
+
`)},"up")}],$o=class{static{l(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Hd.join(A.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let n=this.getDbPath(e),s=Hd.dirname(n);qa.existsSync(s)||qa.mkdirSync(s,{recursive:!0});let o=Uw(n);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 = 268435456"),this.runMigrations(o),this.connections.set(e,o),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return qa.existsSync(this.getDbPath(e))}getDoc(e,t){let s=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,n){let s=this.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.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,n,s){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(n),i)}getEvents(e,t,n=100){let s=this.getDb(e);return t?s.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,n):s.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(n)}query(e,t,...n){return this.getDb(e).prepare(t).all(...n)}run(e,t,...n){this.getDb(e).prepare(t).run(...n)}get(e,t,...n){return this.getDb(e).prepare(t).get(...n)??null}transaction(e,t){let n=this.getDb(e);return n.transaction(t)(n)}runMigrations(e){e.run(`
|
|
245
245
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
246
246
|
version INTEGER PRIMARY KEY,
|
|
247
247
|
name TEXT NOT NULL,
|
|
248
248
|
applied_at TEXT NOT NULL
|
|
249
249
|
)
|
|
250
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of lk)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},$=new Wo,V=$});var op=y(()=>{"use strict"});import _r from"node:fs/promises";import vn from"node:path";import{z as ue}from"zod";async function gk(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 n=vn.join(e,"package.json"),s=await _r.readFile(n,"utf-8"),o=JSON.parse(s),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(n){return v(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function fk(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 n=await kk(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=mk[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function hk(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=vn.join(e,a);try{await _r.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.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: ${s.join(", ")}`,durationMs:Date.now()-t}}async function yk(r,e){let t=Date.now();try{let n=await Sk(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function wk(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 n=[],s=[];for(let o of r.antiPatterns){let i=vn.join(e,o.file);try{await _r.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function ip(r,e){let t=Date.now(),n=await Promise.all([gk(r,e),fk(r,e),hk(r,e),yk(r,e),wk(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function kk(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await _r.readdir(s,{withFileTypes:!0});for(let i of o){let a=vn.join(s,i.name),c=vn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=vn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function Sk(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await _r.readdir(s,{withFileTypes:!0});for(let i of o){let a=vn.join(s,i.name),c=vn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var uk,dk,pk,uc,KA,mk,dc=y(()=>{"use strict";_();Dr();uk=ue.enum(["draft","verified","sealed"]),dk=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),pk=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),uc=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(dk),antiPatterns:ue.array(pk),analyzedAt:ue.string(),modelMetadata:jr.optional(),status:uk.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),KA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},mk={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(gk,"verifyFrameworks");l(fk,"verifyLanguages");l(hk,"verifyPatternLocations");l(yk,"verifyFileCount");l(wk,"verifyAntiPatternFiles");l(ip,"semanticVerify");l(kk,"getProjectExtensions");l(Sk,"countProjectFiles")});import{z as Me}from"zod";var Bo,Pn,bk,ZA,pc,ap,Nr=y(()=>{"use strict";Bo=Me.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Pn=Me.object({primaryDomain:Bo,secondaryDomains:Me.array(Bo),confidence:Me.number().min(0).max(1),filePatterns:Me.array(Me.string()),relevantAgents:Me.array(Me.string())}),bk=Me.object({classification:Pn,classifiedAt:Me.string(),source:Me.enum(["cache","history","llm","heuristic"]),descriptionHash:Me.string(),projectId:Me.string()}),ZA=Me.object({entries:Me.record(Me.string(),bk),confirmedPatterns:Me.array(Me.object({descriptionHash:Me.string(),classification:Pn,confirmedAt:Me.string(),taskDescription:Me.string()}))}),pc={entries:{},confirmedPatterns:[]},ap={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var Ck,vk,cp,Pk,xk,Tk,Ek,Ik,lp,nj,mc=y(()=>{"use strict";Ck=z.enum(["low","medium","high"]),vk=z.enum(["pending","converted","completed","archived","dormant"]),cp=z.enum(["high","medium","low"]),Pk=z.object({impact:cp,effort:cp}),xk=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),Tk=z.object({name:z.string(),description:z.string()}),Ek=z.object({name:z.string(),description:z.string().optional()}),Ik=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:Ck,status:vk,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:Pk.optional(),implementationNotes:z.string().optional(),stack:xk.optional(),modules:z.array(Tk).optional(),roles:z.array(Ek).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),lp=z.object({ideas:z.array(Ik),lastUpdated:z.string()}),nj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function dp(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var up,Ak,jk,Dk,Rk,ij,aj,gc=y(()=>{"use strict";up=Y.enum(["linear","jira","github","monday","asana","none"]),Ak=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),jk=Y.enum(["none","urgent","high","medium","low"]),Dk=Y.enum(["feature","bug","improvement","task","chore","epic"]),Rk=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:Ak,priority:jk,type:Dk.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),ij=Y.object({provider:up,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),Rk)}),aj=Y.object({provider:up,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(dp,"createEmptyIssues")});var hp={};fe(hp,{AgentAssignmentSchema:()=>pp,OUTPUT_SCHEMAS:()=>gp,SubtaskBreakdownSchema:()=>mp,TaskClassificationSchema:()=>Pn,renderSchemaForPrompt:()=>fc});import{z as Ke}from"zod";function fc(r){let e=gp[r];return e?`## OUTPUT FORMAT
|
|
250
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(n=>n.version));for(let n of Gw)t.has(n.version)||e.transaction(()=>{n.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},$=new $o,V=$});var Ud=y(()=>{"use strict"});import Tr from"node:fs/promises";import wn from"node:path";import{z as ue}from"zod";async function Jw(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 n=wn.join(e,"package.json"),s=await Tr.readFile(n,"utf-8"),o=JSON.parse(s),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(n){return v(n)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function qw(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 n=await Qw(e),s=new Set(n),o=[],i=[];for(let a of r.languages){let c=Vw[a];if(!c)continue;c.some(d=>s.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(n){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Kw(r,e){let t=Date.now(),n=r.patterns.filter(i=>i.location);if(n.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of n){let a=i.location,c=wn.join(e,a);try{await Tr.access(c),o.push(a)}catch{s.push(`${i.name} (${a})`)}}return s.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: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Yw(r,e){let t=Date.now();try{let n=await Zw(e),s=r.fileCount,o=.1,i=Math.abs(n-s),a=s*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${n})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${n} (diff: ${i})`,durationMs:Date.now()-t}}catch(n){return{name:"File count verification",passed:!1,error:`Failed to count files: ${n instanceof Error?n.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Xw(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 n=[],s=[];for(let o of r.antiPatterns){let i=wn.join(e,o.file);try{await Tr.access(i),s.push(o.file)}catch{n.push(`${o.issue} (${o.file})`)}}return n.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Gd(r,e){let t=Date.now(),n=await Promise.all([Jw(r,e),qw(r,e),Kw(r,e),Yw(r,e),Xw(r,e)]),s=n.filter(i=>!i.passed).length,o=n.filter(i=>i.passed).length;return{passed:s===0,checks:n,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function Qw(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Tr.readdir(s,{withFileTypes:!0});for(let i of o){let a=wn.join(s,i.name),c=wn.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await n(a);else if(i.isFile()){let u=wn.extname(i.name);u&&e.add(u)}}}}catch{}}return l(n,"scanDir"),await n(r),Array.from(e)}async function Zw(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function n(s){try{let o=await Tr.readdir(s,{withFileTypes:!0});for(let i of o){let a=wn.join(s,i.name),c=wn.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await n(a):i.isFile()&&e++)}}catch{}}return l(n,"scanDir"),await n(r),e}var zw,Ww,Bw,Ka,wA,Vw,Ya=y(()=>{"use strict";_();Sr();zw=ue.enum(["draft","verified","sealed"]),Ww=ue.object({name:ue.string(),description:ue.string(),location:ue.string().optional()}),Bw=ue.object({issue:ue.string(),file:ue.string(),suggestion:ue.string()}),Ka=ue.object({projectId:ue.string(),languages:ue.array(ue.string()),frameworks:ue.array(ue.string()),packageManager:ue.string().optional(),sourceDir:ue.string().optional(),testDir:ue.string().optional(),configFiles:ue.array(ue.string()),fileCount:ue.number(),patterns:ue.array(Ww),antiPatterns:ue.array(Bw),analyzedAt:ue.string(),modelMetadata:wr.optional(),status:zw.default("draft"),commitHash:ue.string().optional(),signature:ue.string().optional(),sealedAt:ue.string().optional(),verifiedAt:ue.string().optional()}),wA={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},Vw={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(Jw,"verifyFrameworks");l(qw,"verifyLanguages");l(Kw,"verifyPatternLocations");l(Yw,"verifyFileCount");l(Xw,"verifyAntiPatternFiles");l(Gd,"semanticVerify");l(Qw,"getProjectExtensions");l(Zw,"countProjectFiles")});import{z as Me}from"zod";var Mo,Sn,eS,CA,Xa,zd,Er=y(()=>{"use strict";Mo=Me.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),Sn=Me.object({primaryDomain:Mo,secondaryDomains:Me.array(Mo),confidence:Me.number().min(0).max(1),filePatterns:Me.array(Me.string()),relevantAgents:Me.array(Me.string())}),eS=Me.object({classification:Sn,classifiedAt:Me.string(),source:Me.enum(["cache","history","llm","heuristic"]),descriptionHash:Me.string(),projectId:Me.string()}),CA=Me.object({entries:Me.record(Me.string(),eS),confirmedPatterns:Me.array(Me.object({descriptionHash:Me.string(),classification:Sn,confirmedAt:Me.string(),taskDescription:Me.string()}))}),Xa={entries:{},confirmedPatterns:[]},zd={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import{z}from"zod";var tS,nS,Wd,sS,rS,oS,iS,aS,Bd,PA,Qa=y(()=>{"use strict";tS=z.enum(["low","medium","high"]),nS=z.enum(["pending","converted","completed","archived","dormant"]),Wd=z.enum(["high","medium","low"]),sS=z.object({impact:Wd,effort:Wd}),rS=z.object({frontend:z.string().optional(),backend:z.string().optional(),payments:z.string().optional(),ai:z.string().optional(),deploy:z.string().optional(),other:z.array(z.string()).optional()}),oS=z.object({name:z.string(),description:z.string()}),iS=z.object({name:z.string(),description:z.string().optional()}),aS=z.object({id:z.string(),text:z.string(),details:z.string().optional(),priority:tS,status:nS,tags:z.array(z.string()),addedAt:z.string(),completedAt:z.string().optional(),convertedTo:z.string().optional(),source:z.string().optional(),sourceFiles:z.array(z.string()).optional(),painPoints:z.array(z.string()).optional(),solutions:z.array(z.string()).optional(),filesAffected:z.array(z.string()).optional(),impactEffort:sS.optional(),implementationNotes:z.string().optional(),stack:rS.optional(),modules:z.array(oS).optional(),roles:z.array(iS).optional(),risks:z.array(z.string()).optional(),risksCount:z.number().optional()}),Bd=z.object({ideas:z.array(aS),lastUpdated:z.string()}),PA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import{z as Y}from"zod";function Jd(r){return{provider:r,lastSync:"",staleAfter:18e5,issues:{}}}var Vd,cS,lS,uS,dS,AA,jA,Za=y(()=>{"use strict";Vd=Y.enum(["linear","jira","github","monday","asana","none"]),cS=Y.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),lS=Y.enum(["none","urgent","high","medium","low"]),uS=Y.enum(["feature","bug","improvement","task","chore","epic"]),dS=Y.object({id:Y.string(),identifier:Y.string(),title:Y.string(),description:Y.string().optional(),status:cS,priority:lS,type:uS.optional(),assignee:Y.object({id:Y.string(),name:Y.string(),email:Y.string().optional()}).optional(),labels:Y.array(Y.string()).default([]),team:Y.object({id:Y.string(),name:Y.string(),key:Y.string().optional()}).optional(),project:Y.object({id:Y.string(),name:Y.string()}).optional(),url:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),fetchedAt:Y.string()}),AA=Y.object({provider:Vd,lastSync:Y.string(),staleAfter:Y.number().default(18e5),issues:Y.record(Y.string(),dS)}),jA=Y.object({provider:Vd,fetched:Y.number(),updated:Y.number(),errors:Y.array(Y.object({issueId:Y.string(),error:Y.string()})),timestamp:Y.string()});l(Jd,"createEmptyIssues")});var Qd={};ge(Qd,{AgentAssignmentSchema:()=>qd,OUTPUT_SCHEMAS:()=>Yd,SubtaskBreakdownSchema:()=>Kd,TaskClassificationSchema:()=>Sn,renderSchemaForPrompt:()=>ec});import{z as Je}from"zod";function ec(r){let e=Yd[r];return e?`## OUTPUT FORMAT
|
|
251
251
|
|
|
252
252
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
253
253
|
|
|
@@ -256,29 +256,51 @@ ${e.example}
|
|
|
256
256
|
\`\`\`
|
|
257
257
|
|
|
258
258
|
Fields:
|
|
259
|
-
${
|
|
260
|
-
`)}return"(see example above)"}function fp(r){return r instanceof Ke.ZodString?"string":r instanceof Ke.ZodNumber?"number":r instanceof Ke.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Ke.ZodArray?`array of ${fp(r.element)}`:r instanceof Ke.ZodObject?"object":"any"}var pp,mp,gp,Vo=y(()=>{"use strict";Nr();Nr();pp=Ke.object({agentName:Ke.string(),reasoning:Ke.string(),confidence:Ke.number().min(0).max(1)}),mp=Ke.object({subtasks:Ke.array(Ke.object({description:Ke.string(),domain:Bo,agent:Ke.string(),dependsOn:Ke.array(Ke.number())})),effort:Ke.enum(["low","medium","high"])}),gp={classification:{schema:Pn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:pp,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:mp,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(fc,"renderSchemaForPrompt");l($k,"describeSchema");l(fp,"describeField")});import{z as A}from"zod";var yp,Mk,Ok,wp,Fk,_k,Nk,Lk,Uk,Hk,Gk,kp,zk,Wk,fj,Sp,bp,Cp,vp,Bk,Jo,hc=y(()=>{"use strict";yp=A.number().min(1).max(5),Mk=A.enum(["exceeded","met","partial","failed"]),Ok=A.enum(["definitely","probably","maybe","no"]),wp=A.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Fk=A.object({estimated:A.object({hours:A.number(),confidence:A.enum(["low","medium","high"]).optional(),source:A.enum(["prd","manual","historical"]).optional()}),actual:A.object({hours:A.number(),commits:A.number().optional(),linesAdded:A.number().optional(),linesRemoved:A.number().optional(),sessions:A.number().optional()}),variance:A.object({hours:A.number(),percentage:A.number(),reason:wp.optional(),explanation:A.string().optional()})}),_k=A.object({name:A.string(),baseline:A.number().nullable(),target:A.number(),actual:A.number(),unit:A.string(),achieved:A.boolean(),percentOfTarget:A.number()}),Nk=A.object({criteria:A.string(),met:A.boolean(),notes:A.string().optional()}),Lk=A.object({metrics:A.array(_k),acceptanceCriteria:A.array(Nk),overallSuccess:Mk,successScore:A.number().min(0).max(100)}),Uk=A.object({category:A.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:A.string(),actionable:A.boolean(),action:A.string().optional()}),Hk=A.object({whatWorked:A.array(A.string()),whatDidnt:A.array(A.string()),surprises:A.array(A.string()),recommendations:A.array(Uk)}),Gk=A.object({valueDelivered:A.number().min(1).max(10),userImpact:A.enum(["none","low","medium","high","critical"]),businessImpact:A.enum(["none","low","medium","high","critical"]),roiScore:A.number(),worthIt:Ok,worthItReason:A.string().optional(),alternativeConsidered:A.string().optional(),betterAlternativeExists:A.boolean().optional()}),kp=A.object({id:A.string(),taskId:A.string(),description:A.string(),estimatedMinutes:A.number().optional(),actualMinutes:A.number(),completedAsPlanned:A.boolean(),qualityScore:yp,blockers:A.array(A.string()),agentUsed:A.string().optional(),skillsUsed:A.array(A.string()).optional(),startedAt:A.string(),completedAt:A.string()}),zk=A.object({id:A.string(),featureId:A.string(),featureName:A.string(),prdId:A.string().nullable(),version:A.string().optional(),branch:A.string().optional(),prUrl:A.string().optional(),effort:Fk,success:Lk.optional(),learnings:Hk,roi:Gk,rating:yp,taskOutcomes:A.array(kp).optional(),startedAt:A.string(),shippedAt:A.string(),reviewedAt:A.string().optional(),reviewedBy:A.string().optional(),legacy:A.boolean().optional()}),Wk=A.object({totalFeatures:A.number(),averageEstimationAccuracy:A.number(),averageSuccessRate:A.number(),averageROI:A.number(),bySuccessLevel:A.object({exceeded:A.number(),met:A.number(),partial:A.number(),failed:A.number()}),variancePatterns:A.array(A.object({reason:wp,count:A.number(),averageVariance:A.number()})),topLearnings:A.array(A.object({insight:A.string(),frequency:A.number()}))}),fj=A.object({outcomes:A.array(zk),taskOutcomes:A.array(kp).optional(),aggregates:Wk.optional(),lastUpdated:A.string(),lastAggregated:A.string().optional()}),Sp={outcomes:[],taskOutcomes:[],lastUpdated:""},bp=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),Cp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),vp=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Bk=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Jo=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=>Bk(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={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(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as ze}from"zod";function Xk(){let r={};for(let e of qk)r[e]="allow";for(let e of Kk)r[e]="ask";for(let e of Yk)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var qo,kj,Vk,yc,Jk,Sj,qk,Kk,Yk,bj,Pp=y(()=>{"use strict";qo=ze.enum(["allow","deny","ask"]),kj=ze.enum(["read","write","delete","create"]),Vk=ze.record(ze.string(),qo),yc=ze.record(ze.string(),qo),Jk=ze.object({enabled:ze.boolean().default(!0),allowedDomains:ze.array(ze.string()).optional(),blockedDomains:ze.array(ze.string()).optional()}),Sj=ze.object({bash:Vk.optional(),files:ze.object({read:yc.optional(),write:yc.optional(),delete:yc.optional()}).optional(),web:Jk.optional(),skills:ze.record(ze.string(),qo).optional(),doomLoop:ze.object({enabled:ze.boolean().default(!0),maxRetries:ze.number().default(3)}).optional(),externalDirectories:qo.default("ask")}),qk=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Kk=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],Yk=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(Xk,"buildDefaultPermissions");bj=Xk()});import{z as ut}from"zod";var xj,Tj,xp=y(()=>{"use strict";xj=ut.object({projectId:ut.string(),name:ut.string(),repoPath:ut.string(),description:ut.string().optional(),version:ut.string().optional(),cliVersion:ut.string().optional(),techStack:ut.array(ut.string()),fileCount:ut.number(),commitCount:ut.number(),createdAt:ut.string(),lastSync:ut.string(),lastSyncCommit:ut.string().optional(),lastSyncBranch:ut.string().optional()}),Tj={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as j}from"zod";var Qk,Zk,eS,tS,nS,sS,rS,oS,iS,aS,cS,lS,uS,dS,pS,mS,gS,fS,jj,Dj,Tp=y(()=>{"use strict";Qk=j.enum(["planned","active","completed","shipped"]),Zk=j.enum(["low","medium","high"]),eS=j.enum(["feature","breaking_change","refactor","infrastructure"]),tS=j.enum(["completed","active","planned"]),nS=j.enum(["planned","active","completed"]),sS=j.enum(["git","git-branch","manual","prd"]),rS=j.object({id:j.string(),description:j.string(),completed:j.boolean(),completedAt:j.string().optional()}),oS=j.object({id:j.string(),name:j.string(),status:tS,completedAt:j.string().optional()}),iS=j.object({goal:j.string(),phases:j.array(oS),successMetrics:j.array(j.string()).optional()}),aS=j.object({hours:j.number(),minutes:j.number(),totalMinutes:j.number(),display:j.string().optional()}),cS=j.object({hash:j.string(),message:j.string(),date:j.string(),author:j.string().optional()}),lS=j.object({hours:j.number(),confidence:j.enum(["low","medium","high"]).optional(),breakdown:j.array(j.object({area:j.string(),hours:j.number()})).optional()}),uS=j.object({hours:j.number().optional(),commits:j.number().optional(),linesAdded:j.number().optional(),linesRemoved:j.number().optional()}),dS=j.object({estimated:lS.nullable(),actual:uS.nullable()}),pS=j.object({totalHours:j.number(),allocatedHours:j.number(),bufferPercent:j.number().optional()}),mS=j.object({id:j.string(),name:j.string(),theme:j.string().optional(),goals:j.array(j.string()).optional(),features:j.array(j.string()),capacity:pS.optional(),status:nS,startDate:j.string().optional(),endDate:j.string().optional()}),gS=j.object({id:j.string(),name:j.string(),description:j.string().optional(),date:j.string(),status:Qk,impact:Zk,effort:j.string().optional(),progress:j.number(),type:eS.optional(),roi:j.number().optional(),why:j.array(j.string()).optional(),technicalNotes:j.array(j.string()).optional(),compatibility:j.string().optional(),phase:j.string().optional(),tasks:j.array(rS),createdAt:j.string(),shippedAt:j.string().optional(),version:j.string().optional(),duration:aS.optional(),taskCount:j.number().optional(),agent:j.string().optional(),sprintName:j.string().optional(),completedDate:j.string().optional(),prdId:j.string().nullable().optional(),legacy:j.boolean().optional(),inferredFrom:sS.optional(),quarter:j.string().nullable().optional(),dependencies:j.array(j.string()).optional(),blockedBy:j.array(j.string()).optional(),effortTracking:dS.optional(),valueScore:j.number().optional(),commits:j.array(cS).optional(),branch:j.string().optional(),commitsAhead:j.number().optional()}),fS=j.object({id:j.string(),title:j.string(),prdId:j.string().nullable().optional(),valueScore:j.number().optional(),effortEstimate:j.number().optional(),reason:j.string().optional()}),jj=j.object({strategy:iS.nullable().optional(),features:j.array(gS),backlog:j.array(j.union([j.string(),fS])),lastUpdated:j.string(),quarters:j.array(mS).optional(),generatedFrom:j.enum(["git-history","manual","prd"]).optional(),generatedAt:j.string().optional()}),Dj={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import hS from"node:crypto";import{homedir as yS}from"node:os";import{join as wS}from"node:path";function Se(){return hS.randomUUID()}var kS,Ep=y(()=>{"use strict";l(Se,"generateUUID");kS=wS(yS(),".prjct-cli","projects")});import{z as Q}from"zod";var SS,Ip,bS,CS,vS,PS,xS,TS,ES,Ap,wc=y(()=>{"use strict";SS=Q.enum(["feature","fix","improvement","refactor"]),Ip=Q.enum(["pass","warning","fail","skipped"]),bS=Q.enum(["added","changed","fixed","removed"]),CS=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),vS=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),PS=Q.object({description:Q.string(),type:bS.optional()}),xS=Q.object({lintStatus:Ip.nullable().optional(),lintDetails:Q.string().optional(),testStatus:Ip.nullable().optional(),testDetails:Q.string().optional()}),TS=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),ES=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:SS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(PS).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:TS.optional(),codeMetrics:vS.optional(),qualityMetrics:xS.optional(),quantitativeImpact:Q.string().optional(),duration:CS.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),Ap=Q.object({shipped:Q.array(ES),lastUpdated:Q.string()})});import{z as I}from"zod";var IS,Dp,AS,jS,DS,kc,Rp,RS,$S,$p,jp,MS,OS,Mp,Op,Fp,FS,_S,Wj,Ko=y(()=>{"use strict";Dr();IS=I.enum(["low","medium","high","critical"]),Dp=I.enum(["feature","bug","improvement","chore"]),AS=I.enum(["active","backlog","previously_active"]),jS=I.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),DS=I.enum(["task_completed","feature_shipped","idea_captured","session_started"]),kc=I.object({title:I.string(),description:I.string(),filesChanged:I.array(I.object({path:I.string(),action:I.enum(["created","modified","deleted"])})),whatWasDone:I.array(I.string()).min(1),outputForNextAgent:I.string().min(1),notes:I.string().optional()}),Rp=I.object({output:I.string().min(1,"Subtask output is required"),summary:kc}),RS=I.object({id:I.string(),description:I.string(),domain:I.string(),agent:I.string(),status:jS,dependsOn:I.array(I.string()),startedAt:I.string().optional(),completedAt:I.string().optional(),output:I.string().optional(),summary:kc.optional(),skipReason:I.string().optional(),blockReason:I.string().optional(),estimatedPoints:I.number().optional(),estimatedMinutes:I.number().optional()}),$S=I.object({completed:I.number(),total:I.number(),percentage:I.number()}),$p=I.object({id:I.string(),description:I.string(),startedAt:I.string(),sessionId:I.string(),featureId:I.string().optional(),subtasks:I.array(RS).optional(),currentSubtaskIndex:I.number().optional(),subtaskProgress:$S.optional(),linearId:I.string().optional(),linearUuid:I.string().optional(),estimatedPoints:I.number().optional(),estimatedMinutes:I.number().optional(),modelMetadata:jr.optional()}),jp=I.object({id:I.string(),description:I.string(),status:I.literal("paused"),startedAt:I.string(),pausedAt:I.string(),pauseReason:I.string().optional()}),MS=I.object({stackConfirmed:I.array(I.string()).optional(),patternsDiscovered:I.array(I.string()).optional(),agentAccuracy:I.array(I.object({agent:I.string(),rating:I.enum(["helpful","neutral","inaccurate"]),note:I.string().optional()})).optional(),issuesEncountered:I.array(I.string()).optional()}),OS=I.object({taskId:I.string(),title:I.string(),classification:Dp,startedAt:I.string(),completedAt:I.string(),subtaskCount:I.number(),subtaskSummaries:I.array(kc),outcome:I.string(),branchName:I.string(),linearId:I.string().optional(),linearUuid:I.string().optional(),prUrl:I.string().optional(),feedback:MS.optional()}),Mp=I.object({currentTask:$p.nullable(),previousTask:jp.nullable().optional(),pausedTasks:I.array(jp).optional(),taskHistory:I.array(OS).optional(),lastUpdated:I.string()}),Op=I.object({id:I.string(),description:I.string(),priority:IS,type:Dp,featureId:I.string().optional(),originFeature:I.string().optional(),completed:I.boolean(),completedAt:I.string().optional(),createdAt:I.string(),section:AS,agent:I.string().optional(),groupName:I.string().optional(),groupId:I.string().optional()}),Fp=I.object({tasks:I.array(Op),lastUpdated:I.string()}),FS=I.object({tasksToday:I.number(),tasksThisWeek:I.number(),streak:I.number(),velocity:I.string(),avgDuration:I.string()}),_S=I.object({type:DS,description:I.string(),timestamp:I.string(),duration:I.string().optional()}),Wj=I.object({projectId:I.string(),currentTask:$p.nullable(),queue:I.array(Op),stats:FS,recentActivity:I.array(_S),lastSync:I.string()})});import{z as ae}from"zod";var NS,LS,_p,qj,Kj,Yj,xn,Np,Is=y(()=>{"use strict";NS=ae.enum(["improving","stable","declining"]),LS=ae.object({sprintNumber:ae.number(),startDate:ae.string(),endDate:ae.string(),pointsCompleted:ae.number(),tasksCompleted:ae.number(),avgVariance:ae.number(),estimationAccuracy:ae.number()}),_p=ae.object({category:ae.string(),avgVariance:ae.number(),taskCount:ae.number()}),qj=ae.object({totalPoints:ae.number(),sprints:ae.number(),estimatedDate:ae.string()}),Kj=ae.object({sprints:ae.array(LS),averageVelocity:ae.number(),velocityTrend:NS,estimationAccuracy:ae.number(),overEstimated:ae.array(_p),underEstimated:ae.array(_p),lastUpdated:ae.string()}),Yj=ae.object({sprintLengthDays:ae.number().min(1).max(90).default(7),startDay:ae.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ae.number().min(1).max(52).default(6),accuracyTolerance:ae.number().min(0).max(100).default(20)}),xn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Np={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Nt=y(()=>{"use strict";op();dc();Nr();mc();gc();Vo();Dr();hc();Pp();xp();Tp();Ep();wc();Ko();Is()});var Zt,Sc,Ct,Tn=y(()=>{"use strict";Nt();ie();ye();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Sc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=Se(),s=C();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Se(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ct=new Sc});var Lp=y(()=>{"use strict"});var Yo,Up=y(()=>{"use strict";Yo={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 As,Xo=y(()=>{"use strict";As={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 'p. linear setup' to configure Linear"},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"}}});var Hp=y(()=>{"use strict"});var Gp=y(()=>{"use strict";Hp()});function Qo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,zp,js=y(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},zp=["frontend","backend","devops","docs","testing","database","general"];l(Qo,"calculateConfidence")});var bc=y(()=>{"use strict"});var Cc=y(()=>{"use strict";Lp();Up();Xo();_();Gp();js();bc()});function Ds(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return zS[r]}var se,vc,Pc,Zo,zS,At,Wp,Lr,pn=y(()=>{"use strict";se={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},vc=["feature","spec","design","refactor","migrate"],Pc=["ship","cleanup","git","migrate"],Zo=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],zS={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ds,"getTimeout");At={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},Wp={HISTORY_MAX:100},Lr={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function BS(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(WS.has(r)||r.includes("prjct"))return{level:Rs.debug,name:"debug"};let e=Rs[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function ei(r,e,t){return Bp>=r?(...n)=>console[t](e,...n):JS}var Rs,WS,Bp,VS,JS,qS,U,Wn=y(()=>{"use strict";Rs={error:0,warn:1,info:2,debug:3},WS=new Set(["1","true","*"]);l(BS,"getLogLevel");({level:Bp,name:VS}=BS()),JS=l(()=>{},"noop");l(ei,"createLogMethod");qS={error:ei(Rs.error,"[prjct:error]","error"),warn:ei(Rs.warn,"[prjct:warn]","warn"),info:ei(Rs.info,"[prjct:info]","log"),debug:ei(Rs.debug,"[prjct:debug]","log"),isEnabled:l(()=>Bp>=0,"isEnabled"),level:l(()=>VS,"level")},U=qS});var ti,KS,Vp=y(()=>{"use strict";dn();ye();Cc();pn();Wn();ti=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Wp.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 n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&U.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,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Yo.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Yo.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw U.error("Event callback error:",n),n}}async logEvent(e){try{$.appendEvent(this.projectId,e.type,e)}catch(t){U.debug("Failed to log event:",ne(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.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())}},KS=new ti});function si(r,e){let t=r[0];return e==="delete"?`${t}.deleted`:`${t}.updated`}var ni,$s,Jp=y(()=>{"use strict";me();ie();xe();l(si,"inferEventType");ni=class{static{l(this,"SyncEventBus")}async publish(e){let t=E.getSyncPendingPath(e.projectId),n=await Gn(t,[])??[];n.push(e),await Rr(t,n)}async getPending(e){let t=E.getSyncPendingPath(e);return await Gn(t,[])??[]}async clearPending(e){let t=E.getSyncPendingPath(e);await Rr(t,[])}async updateLastSync(e){let t=E.getLastSyncPath(e),n={timestamp:C(),success:!0};await Rr(t,n)}async getLastSync(e){let t=E.getLastSyncPath(e);return await Gn(t,null)}},$s=new ni});var xc=y(()=>{"use strict";Vp();Jp()});var Lt,ri=y(()=>{"use strict";Lt=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import qp from"node:fs/promises";import YS from"node:path";var We,en=y(()=>{"use strict";xc();me();ri();ie();ye();We=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Lt({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}getContextPath(e,t){let n=this.getLayer();return E.getFilePath(e,n,t)}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){let n=this.getContextPath(e,this.getMdFilename());await qp.mkdir(YS.dirname(n),{recursive:!0}),$.setDoc(e,this.getStoreKey(),t);let s=this.toMarkdown(t);await qp.writeFile(n,s,"utf-8"),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await $s.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return $.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Tc,Be,Ms=y(()=>{"use strict";Nt();mc();ie();Tn();en();Tc=class extends We{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",lp)}getDefault(){return{ideas:[],lastUpdated:""}}getMdFilename(){return"ideas.md"}getLayer(){return"planning"}getEventType(e){return`ideas.${e}d`}toMarkdown(e){let t=["# IDEAS \u{1F4A1}",""],n=e.ideas.filter(a=>a.status==="pending"),s=e.ideas.filter(a=>a.status==="converted"),o=e.ideas.filter(a=>a.status==="archived"),i=e.ideas.filter(a=>a.status==="dormant");return t.push("## Brain Dump"),n.length>0?n.forEach(a=>{let c=bt(a.addedAt),u=a.tags.length>0?` ${a.tags.map(m=>`#${m}`).join(" ")}`:"",d=a.priority!=="medium"?` [${a.priority.toUpperCase()}]`:"";t.push(`- ${a.text}${d} _(${c})_${u}`)}):t.push("_No pending ideas_"),t.push(""),s.length>0&&(t.push("## Converted"),s.forEach(a=>{let c=bt(a.addedAt),u=a.convertedTo?` \u2192 ${a.convertedTo}`:"";t.push(`- \u2713 ${a.text}${u} _(${c})_`)}),t.push("")),o.length>0&&(t.push("## Archived"),o.forEach(a=>{let c=bt(a.addedAt);t.push(`- ${a.text} _(${c})_`)}),t.push("")),i.length>0&&(t.push(`_${i.length} dormant idea(s) excluded from context_`),t.push("")),t.join(`
|
|
261
|
-
`)}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:Se(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.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:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Cn(Zt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;Ct.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Be=new Tc});var Ec,be,Os=y(()=>{"use strict";Nt();Ko();ie();Tn();en();Ec=class extends We{static{l(this,"QueueStorage")}constructor(){super("queue.json",Fp)}getDefault(){return{tasks:[],lastUpdated:""}}getMdFilename(){return"next.md"}getLayer(){return"core"}getEventType(e){return`queue.${e}d`}toMarkdown(e){let t=["# Priority Queue",""],n=e.tasks.filter(i=>i.section==="active"&&!i.completed),s=e.tasks.filter(i=>i.section==="backlog"&&!i.completed),o=e.tasks.filter(i=>i.section==="previously_active"&&!i.completed);return t.push("## Active Tasks"),n.length>0?n.forEach((i,a)=>{let c=i.completed?"[x]":"[ ]",u=i.priority!=="medium"?` [${i.priority.toUpperCase()}]`:"",d=i.agent?` @${i.agent}`:"",m=i.originFeature?` (from: ${i.originFeature})`:"",p=i.type==="bug"?" \u{1F41B}":"";t.push(`${a+1}. ${c}${p}${u} ${i.description}${d}${m}`)}):t.push("_No active tasks_"),t.push(""),o.length>0&&(t.push("## Previously Active"),o.forEach(i=>{t.push(`- [ ] ${i.description}`)}),t.push("")),t.push("## Backlog"),s.length>0?s.forEach(i=>{let a=i.priority!=="medium"?` [${i.priority.toUpperCase()}]`:"",c=i.type==="bug"?" \u{1F41B}":"";t.push(`- [ ]${c}${a} ${i.description}`)}):t.push("_No backlog items_"),t.push(""),t.join(`
|
|
262
|
-
`)}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:Se(),createdAt:C(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),s=t.map(o=>({...o,id:Se(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Cn(Zt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;Ct.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},be=new Ec});var Ic,ot,Fs=y(()=>{"use strict";Nt();wc();ie();Tn();en();Ic=class extends We{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Ap)}getDefault(){return{shipped:[],lastUpdated:""}}getMdFilename(){return"shipped.md"}getLayer(){return"progress"}getEventType(e){return`shipped.${e}d`}toMarkdown(e){let t=["# SHIPPED \u{1F680}",""];if(e.shipped.length===0)return t.push("_No features shipped yet. Use /p:ship to celebrate!_"),t.push(""),t.join(`
|
|
263
|
-
`);let n=new Map;return e.shipped.forEach(o=>{let a=new Date(o.shippedAt).toLocaleDateString("en-US",{year:"numeric",month:"long"});n.has(a)||n.set(a,[]),n.get(a).push(o)}),Array.from(n.keys()).sort((o,i)=>{let a=new Date(n.get(o)[0].shippedAt);return new Date(n.get(i)[0].shippedAt).getTime()-a.getTime()}).forEach(o=>{t.push(`## ${o}`),t.push(""),n.get(o).sort((a,c)=>new Date(c.shippedAt).getTime()-new Date(a.shippedAt).getTime()).forEach(a=>{let c=bt(a.shippedAt),u=a.version?` v${a.version}`:"",d=a.duration?` (${a.duration})`:"";t.push(`- **${a.name}**${u}${d} - ${c}`),a.description&&t.push(` _${a.description}_`)}),t.push("")}),t.push("---"),t.push(""),t.push(`**Total shipped:** ${e.shipped.length}`),t.push(""),t.join(`
|
|
264
|
-
`)}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:Se(),shippedAt:C()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=Cn(Zt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;Ct.archiveMany(e,s.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)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},ot=new Ic});function Kp(){return new Ac}var Ac,Yp=y(()=>{"use strict";Ac=class{static{l(this,"MarkdownBuilder")}lines=[];h1(e){return this.lines.push(`# ${e}`,""),this}h2(e){return this.lines.push(`## ${e}`,""),this}h3(e){return this.lines.push(`### ${e}`),this}h4(e){return this.lines.push(`#### ${e}`),this}p(e){return this.lines.push(e,""),this}bold(e){return this.lines.push(`**${e}**`),this}italic(e){return this.lines.push(`*${e}*`),this}code(e){return this.lines.push(`\`${e}\``),this}codeBlock(e,t=""){return this.lines.push(`\`\`\`${t}`,e,"```",""),this}li(e,t){let n=" ".repeat(t?.indent??0);return t?.checked!==void 0?this.lines.push(`${n}- [${t.checked?"x":" "}] ${e}`):this.lines.push(`${n}- ${e}`),this}oli(e,t){return this.lines.push(`${t}. ${e}`),this}list(e,t){for(let n of e)this.li(n,t);return this}orderedList(e){for(let t=0;t<e.length;t++)this.oli(e[t],t+1);return this}hr(){return this.lines.push("","---",""),this}blank(){return this.lines.push(""),this}raw(e){return this.lines.push(e),this}rawLines(e){return this.lines.push(...e),this}quote(e){return this.lines.push(`> ${e}`),this}link(e,t){return this.lines.push(`[${e}](${t})`),this}kv(e,t){return this.lines.push(`**${e}:** ${t}`),this}table(e,t){return this.lines.push(`| ${e.join(" | ")} |`),this.lines.push(`| ${e.map(()=>"---").join(" | ")} |`),t.forEach(n=>{this.lines.push(`| ${n.join(" | ")} |`)}),this.blank(),this}when(e,t){return e&&t(this),this}maybe(e,t){return e!=null&&t(this,e),this}each(e,t){for(let n=0;n<e.length;n++)t(this,e[n],n);return this}section(e,t,n){switch(t){case 1:this.h1(e);break;case 2:this.h2(e);break;case 3:this.h3(e);break;case 4:this.h4(e);break}return n(this),this}build(){return this.lines.join(`
|
|
265
|
-
`)}get length(){return this.lines.length}};l(Kp,"md")});var Ur,jc,Bn,Dc=y(()=>{"use strict";Ur={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"}},jc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Ur[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}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 Ur[e]}getPrompt(e){return Ur[e].prompt}getValidCommands(e){return Ur[e].transitions}formatNextSteps(e){return Ur[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Bn=new jc});var Rc,L,_s=y(()=>{"use strict";Nt();Ko();ie();Yp();Dc();Tn();en();Rc=class extends We{static{l(this,"StateStorage")}constructor(){super("state.json",Mp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getMdFilename(){return"now.md"}getLayer(){return"core"}getEventType(e){return`state.${e}d`}toMarkdown(e){return Kp().h1("NOW").when(!!e.currentTask,t=>{let n=e.currentTask;if(t.bold(n.description).blank().raw(`Started: ${bt(n.startedAt)}`).raw(`Session: ${n.sessionId}`).maybe(n.featureId,(s,o)=>s.raw(`Feature: ${o}`)),n.subtasks&&n.subtasks.length>0){t.blank().h2("Subtasks Progress").raw(`**Progress**: ${n.subtaskProgress?.completed||0}/${n.subtaskProgress?.total||0} (${n.subtaskProgress?.percentage||0}%)`).blank().raw("| # | Domain | Description | Status | Agent |").raw("|---|--------|-------------|--------|-------|"),n.subtasks.forEach((i,a)=>{let c=i.status==="completed"?"\u2705":i.status==="in_progress"?"\u25B6\uFE0F":i.status==="failed"?"\u274C":i.status==="skipped"?"\u23ED\uFE0F":i.status==="blocked"?"\u{1F6AB}":"\u23F3",u=a===n.currentSubtaskIndex?" **\u2190 Active**":"";t.raw(`| ${a+1} | ${i.domain} | ${i.description} | ${c} ${i.status}${u} | ${i.agent} |`)});let s=n.subtasks[n.currentSubtaskIndex||0];s&&s.status==="in_progress"&&(t.blank().h3("Current Subtask").raw(`**#${(n.currentSubtaskIndex||0)+1}**: ${s.description}`).raw(`**Agent**: ${s.agent}`).raw(`**Domain**: ${s.domain}`),s.dependsOn.length>0&&t.raw(`**Depends on**: ${s.dependsOn.join(", ")}`));let o=n.subtasks.filter(i=>i.status==="completed"&&i.summary);if(o.length>0){let i=o[o.length-1];i.summary&&t.blank().h3("Previous Subtask Output").raw(`**${i.summary.title}**`).raw(i.summary.description).maybe(i.summary.outputForNextAgent,(a,c)=>a.blank().raw(`**Available for next agent**: ${c}`))}}}).when(!e.currentTask,t=>{t.italic("No active task. Use /p:work to start.")}).when((e.pausedTasks?.length||0)>0||!!e.previousTask,t=>{let n=e.pausedTasks?.length?e.pausedTasks:e.previousTask?[e.previousTask]:[];n.length!==0&&(t.hr().h2(`Paused (${n.length})`),n.forEach((s,o)=>{t.raw(`${o+1}. **${s.description}**`).raw(` Paused: ${bt(s.pausedAt)}`),s.pauseReason&&t.raw(` Reason: ${s.pauseReason}`)}),t.blank().italic("Use /p:resume to continue"))}).when((e.taskHistory?.length||0)>0,t=>{let n=this.getTaskHistoryFromState(e);if(n.length===0)return;let s=e.currentTask?.type,o=s?n.filter(i=>i.classification===s).slice(0,3):n.slice(0,5);o.length!==0&&(t.hr().h2(s?`Recent ${s} tasks (${o.length})`:`Recent tasks (${o.length})`),o.forEach((i,a)=>{t.raw(`${a+1}. **${i.title}** (${i.classification})`).raw(` Completed: ${bt(i.completedAt)} | ${i.subtaskCount} subtask${i.subtaskCount>1?"s":""}`).raw(` Outcome: ${i.outcome}`),i.linearId&&t.raw(` Linear: ${i.linearId}`),i.feedback?.patternsDiscovered?.length&&t.raw(` Patterns: ${i.feedback.patternsDiscovered.join(", ")}`),i.feedback?.issuesEncountered?.length&&t.raw(` Gotchas: ${i.feedback.issuesEncountered.join(", ")}`)}),t.blank().italic("Task history helps identify patterns and improve decisions"))}).blank().build()}validateTransition(e,t){let n=Bn.getCurrentState(e),s=Bn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:Se()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];Ct.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=Rp.safeParse(t);if(!n.success){let f=n.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
259
|
+
${pS(e.schema)}`:null}function pS(r){if(r instanceof Je.ZodObject){let e=r.shape;return Object.entries(e).map(([t,n])=>`- \`${t}\`: ${Xd(n)}`).join(`
|
|
260
|
+
`)}return"(see example above)"}function Xd(r){return r instanceof Je.ZodString?"string":r instanceof Je.ZodNumber?"number":r instanceof Je.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof Je.ZodArray?`array of ${Xd(r.element)}`:r instanceof Je.ZodObject?"object":"any"}var qd,Kd,Yd,Oo=y(()=>{"use strict";Er();Er();qd=Je.object({agentName:Je.string(),reasoning:Je.string(),confidence:Je.number().min(0).max(1)}),Kd=Je.object({subtasks:Je.array(Je.object({description:Je.string(),domain:Mo,agent:Je.string(),dependsOn:Je.array(Je.number())})),effort:Je.enum(["low","medium","high"])}),Yd={classification:{schema:Sn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:qd,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:Kd,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(ec,"renderSchemaForPrompt");l(pS,"describeSchema");l(Xd,"describeField")});import{z as E}from"zod";var Zd,mS,gS,ep,fS,hS,yS,wS,SS,kS,bS,tp,CS,vS,NA,np,sp,rp,op,xS,Fo,tc=y(()=>{"use strict";Zd=E.number().min(1).max(5),mS=E.enum(["exceeded","met","partial","failed"]),gS=E.enum(["definitely","probably","maybe","no"]),ep=E.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),fS=E.object({estimated:E.object({hours:E.number(),confidence:E.enum(["low","medium","high"]).optional(),source:E.enum(["prd","manual","historical"]).optional()}),actual:E.object({hours:E.number(),commits:E.number().optional(),linesAdded:E.number().optional(),linesRemoved:E.number().optional(),sessions:E.number().optional()}),variance:E.object({hours:E.number(),percentage:E.number(),reason:ep.optional(),explanation:E.string().optional()})}),hS=E.object({name:E.string(),baseline:E.number().nullable(),target:E.number(),actual:E.number(),unit:E.string(),achieved:E.boolean(),percentOfTarget:E.number()}),yS=E.object({criteria:E.string(),met:E.boolean(),notes:E.string().optional()}),wS=E.object({metrics:E.array(hS),acceptanceCriteria:E.array(yS),overallSuccess:mS,successScore:E.number().min(0).max(100)}),SS=E.object({category:E.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:E.string(),actionable:E.boolean(),action:E.string().optional()}),kS=E.object({whatWorked:E.array(E.string()),whatDidnt:E.array(E.string()),surprises:E.array(E.string()),recommendations:E.array(SS)}),bS=E.object({valueDelivered:E.number().min(1).max(10),userImpact:E.enum(["none","low","medium","high","critical"]),businessImpact:E.enum(["none","low","medium","high","critical"]),roiScore:E.number(),worthIt:gS,worthItReason:E.string().optional(),alternativeConsidered:E.string().optional(),betterAlternativeExists:E.boolean().optional()}),tp=E.object({id:E.string(),taskId:E.string(),description:E.string(),estimatedMinutes:E.number().optional(),actualMinutes:E.number(),completedAsPlanned:E.boolean(),qualityScore:Zd,blockers:E.array(E.string()),agentUsed:E.string().optional(),skillsUsed:E.array(E.string()).optional(),startedAt:E.string(),completedAt:E.string()}),CS=E.object({id:E.string(),featureId:E.string(),featureName:E.string(),prdId:E.string().nullable(),version:E.string().optional(),branch:E.string().optional(),prUrl:E.string().optional(),effort:fS,success:wS.optional(),learnings:kS,roi:bS,rating:Zd,taskOutcomes:E.array(tp).optional(),startedAt:E.string(),shippedAt:E.string(),reviewedAt:E.string().optional(),reviewedBy:E.string().optional(),legacy:E.boolean().optional()}),vS=E.object({totalFeatures:E.number(),averageEstimationAccuracy:E.number(),averageSuccessRate:E.number(),averageROI:E.number(),bySuccessLevel:E.object({exceeded:E.number(),met:E.number(),partial:E.number(),failed:E.number()}),variancePatterns:E.array(E.object({reason:ep,count:E.number(),averageVariance:E.number()})),topLearnings:E.array(E.object({insight:E.string(),frequency:E.number()}))}),NA=E.object({outcomes:E.array(CS),taskOutcomes:E.array(tp).optional(),aggregates:vS.optional(),lastUpdated:E.string(),lastAggregated:E.string().optional()}),np={outcomes:[],taskOutcomes:[],lastUpdated:""},sp=l((r,e)=>{let t=e-r,n=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(n*10)/10}},"calculateVariance"),rp=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),op=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),xS=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),Fo=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=>xS(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),n=r.map(d=>d.roi.roiScore),s={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(n.reduce((d,m)=>d+m,0)/n.length*100)/100,bySuccessLevel:s,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});import{z as Ge}from"zod";function jS(){let r={};for(let e of ES)r[e]="allow";for(let e of IS)r[e]="ask";for(let e of AS)r[e]="deny";return{bash:r,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}var _o,GA,PS,nc,TS,zA,ES,IS,AS,WA,ip=y(()=>{"use strict";_o=Ge.enum(["allow","deny","ask"]),GA=Ge.enum(["read","write","delete","create"]),PS=Ge.record(Ge.string(),_o),nc=Ge.record(Ge.string(),_o),TS=Ge.object({enabled:Ge.boolean().default(!0),allowedDomains:Ge.array(Ge.string()).optional(),blockedDomains:Ge.array(Ge.string()).optional()}),zA=Ge.object({bash:PS.optional(),files:Ge.object({read:nc.optional(),write:nc.optional(),delete:nc.optional()}).optional(),web:TS.optional(),skills:Ge.record(Ge.string(),_o).optional(),doomLoop:Ge.object({enabled:Ge.boolean().default(!0),maxRetries:Ge.number().default(3)}).optional(),externalDirectories:_o.default("ask")}),ES=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],IS=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],AS=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];l(jS,"buildDefaultPermissions");WA=jS()});import{z as at}from"zod";var qA,KA,ap=y(()=>{"use strict";qA=at.object({projectId:at.string(),name:at.string(),repoPath:at.string(),description:at.string().optional(),version:at.string().optional(),cliVersion:at.string().optional(),techStack:at.array(at.string()),fileCount:at.number(),commitCount:at.number(),createdAt:at.string(),lastSync:at.string(),lastSyncCommit:at.string().optional(),lastSyncBranch:at.string().optional()}),KA={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()}});import{z as I}from"zod";var DS,RS,$S,MS,OS,FS,_S,NS,LS,HS,US,GS,zS,WS,BS,VS,JS,qS,ZA,ej,cp=y(()=>{"use strict";DS=I.enum(["planned","active","completed","shipped"]),RS=I.enum(["low","medium","high"]),$S=I.enum(["feature","breaking_change","refactor","infrastructure"]),MS=I.enum(["completed","active","planned"]),OS=I.enum(["planned","active","completed"]),FS=I.enum(["git","git-branch","manual","prd"]),_S=I.object({id:I.string(),description:I.string(),completed:I.boolean(),completedAt:I.string().optional()}),NS=I.object({id:I.string(),name:I.string(),status:MS,completedAt:I.string().optional()}),LS=I.object({goal:I.string(),phases:I.array(NS),successMetrics:I.array(I.string()).optional()}),HS=I.object({hours:I.number(),minutes:I.number(),totalMinutes:I.number(),display:I.string().optional()}),US=I.object({hash:I.string(),message:I.string(),date:I.string(),author:I.string().optional()}),GS=I.object({hours:I.number(),confidence:I.enum(["low","medium","high"]).optional(),breakdown:I.array(I.object({area:I.string(),hours:I.number()})).optional()}),zS=I.object({hours:I.number().optional(),commits:I.number().optional(),linesAdded:I.number().optional(),linesRemoved:I.number().optional()}),WS=I.object({estimated:GS.nullable(),actual:zS.nullable()}),BS=I.object({totalHours:I.number(),allocatedHours:I.number(),bufferPercent:I.number().optional()}),VS=I.object({id:I.string(),name:I.string(),theme:I.string().optional(),goals:I.array(I.string()).optional(),features:I.array(I.string()),capacity:BS.optional(),status:OS,startDate:I.string().optional(),endDate:I.string().optional()}),JS=I.object({id:I.string(),name:I.string(),description:I.string().optional(),date:I.string(),status:DS,impact:RS,effort:I.string().optional(),progress:I.number(),type:$S.optional(),roi:I.number().optional(),why:I.array(I.string()).optional(),technicalNotes:I.array(I.string()).optional(),compatibility:I.string().optional(),phase:I.string().optional(),tasks:I.array(_S),createdAt:I.string(),shippedAt:I.string().optional(),version:I.string().optional(),duration:HS.optional(),taskCount:I.number().optional(),agent:I.string().optional(),sprintName:I.string().optional(),completedDate:I.string().optional(),prdId:I.string().nullable().optional(),legacy:I.boolean().optional(),inferredFrom:FS.optional(),quarter:I.string().nullable().optional(),dependencies:I.array(I.string()).optional(),blockedBy:I.array(I.string()).optional(),effortTracking:WS.optional(),valueScore:I.number().optional(),commits:I.array(US).optional(),branch:I.string().optional(),commitsAhead:I.number().optional()}),qS=I.object({id:I.string(),title:I.string(),prdId:I.string().nullable().optional(),valueScore:I.number().optional(),effortEstimate:I.number().optional(),reason:I.string().optional()}),ZA=I.object({strategy:LS.nullable().optional(),features:I.array(JS),backlog:I.array(I.union([I.string(),qS])),lastUpdated:I.string(),quarters:I.array(VS).optional(),generatedFrom:I.enum(["git-history","manual","prd"]).optional(),generatedAt:I.string().optional()}),ej={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null}});import KS from"node:crypto";import{homedir as YS}from"node:os";import{join as XS}from"node:path";function Se(){return KS.randomUUID()}var QS,lp=y(()=>{"use strict";l(Se,"generateUUID");QS=XS(YS(),".prjct-cli","projects")});import{z as Q}from"zod";var ZS,up,ek,tk,nk,sk,rk,ok,ik,dp,sc=y(()=>{"use strict";ZS=Q.enum(["feature","fix","improvement","refactor"]),up=Q.enum(["pass","warning","fail","skipped"]),ek=Q.enum(["added","changed","fixed","removed"]),tk=Q.object({hours:Q.number(),minutes:Q.number(),totalMinutes:Q.number()}),nk=Q.object({filesChanged:Q.number().nullable().optional(),linesAdded:Q.number().nullable().optional(),linesRemoved:Q.number().nullable().optional(),commits:Q.number().nullable().optional()}),sk=Q.object({description:Q.string(),type:ek.optional()}),rk=Q.object({lintStatus:up.nullable().optional(),lintDetails:Q.string().optional(),testStatus:up.nullable().optional(),testDetails:Q.string().optional()}),ok=Q.object({hash:Q.string().optional(),message:Q.string().optional(),branch:Q.string().optional()}),ik=Q.object({id:Q.string(),name:Q.string(),version:Q.string().nullable().optional(),type:ZS,agent:Q.string().optional(),description:Q.string().optional(),changes:Q.array(sk).optional(),codeSnippets:Q.array(Q.string()).optional(),commit:ok.optional(),codeMetrics:nk.optional(),qualityMetrics:rk.optional(),quantitativeImpact:Q.string().optional(),duration:tk.optional(),tasksCompleted:Q.number().nullable().optional(),shippedAt:Q.string(),featureId:Q.string().optional()}),dp=Q.object({shipped:Q.array(ik),lastUpdated:Q.string()})});import{z as T}from"zod";var ak,mp,ck,lk,uk,rc,gp,dk,pk,fp,pp,mk,gk,hp,yp,wp,fk,hk,mj,No=y(()=>{"use strict";Sr();ak=T.enum(["low","medium","high","critical"]),mp=T.enum(["feature","bug","improvement","chore"]),ck=T.enum(["active","backlog","previously_active"]),lk=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),uk=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),rc=T.object({title:T.string(),description:T.string(),filesChanged:T.array(T.object({path:T.string(),action:T.enum(["created","modified","deleted"])})),whatWasDone:T.array(T.string()).min(1),outputForNextAgent:T.string().min(1),notes:T.string().optional()}),gp=T.object({output:T.string().min(1,"Subtask output is required"),summary:rc}),dk=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:lk,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:rc.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),pk=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),fp=T.object({id:T.string(),description:T.string(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(dk).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:pk.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:wr.optional()}),pp=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional()}),mk=T.object({stackConfirmed:T.array(T.string()).optional(),patternsDiscovered:T.array(T.string()).optional(),agentAccuracy:T.array(T.object({agent:T.string(),rating:T.enum(["helpful","neutral","inaccurate"]),note:T.string().optional()})).optional(),issuesEncountered:T.array(T.string()).optional()}),gk=T.object({taskId:T.string(),title:T.string(),classification:mp,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(rc),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:mk.optional()}),hp=T.object({currentTask:fp.nullable(),previousTask:pp.nullable().optional(),pausedTasks:T.array(pp).optional(),taskHistory:T.array(gk).optional(),lastUpdated:T.string()}),yp=T.object({id:T.string(),description:T.string(),priority:ak,type:mp,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:ck,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),wp=T.object({tasks:T.array(yp),lastUpdated:T.string()}),fk=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),hk=T.object({type:uk,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),mj=T.object({projectId:T.string(),currentTask:fp.nullable(),queue:T.array(yp),stats:fk,recentActivity:T.array(hk),lastSync:T.string()})});import{z as ie}from"zod";var yk,wk,Sp,yj,wj,Sj,kn,kp,vs=y(()=>{"use strict";yk=ie.enum(["improving","stable","declining"]),wk=ie.object({sprintNumber:ie.number(),startDate:ie.string(),endDate:ie.string(),pointsCompleted:ie.number(),tasksCompleted:ie.number(),avgVariance:ie.number(),estimationAccuracy:ie.number()}),Sp=ie.object({category:ie.string(),avgVariance:ie.number(),taskCount:ie.number()}),yj=ie.object({totalPoints:ie.number(),sprints:ie.number(),estimatedDate:ie.string()}),wj=ie.object({sprints:ie.array(wk),averageVelocity:ie.number(),velocityTrend:yk,estimationAccuracy:ie.number(),overEstimated:ie.array(Sp),underEstimated:ie.array(Sp),lastUpdated:ie.string()}),Sj=ie.object({sprintLengthDays:ie.number().min(1).max(90).default(7),startDay:ie.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:ie.number().min(1).max(52).default(6),accuracyTolerance:ie.number().min(0).max(100).default(20)}),kn={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},kp={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ot=y(()=>{"use strict";Ud();Ya();Er();Qa();Za();Oo();Sr();tc();ip();ap();cp();lp();sc();No();vs()});var Xt,oc,St,bn=y(()=>{"use strict";Ot();le();he();Xt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},oc=class{static{l(this,"ArchiveStorage")}archive(e,t){let n=Se(),s=C();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),n}archiveMany(e,t){if(t.length===0)return 0;let n=C();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Se(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},St=new oc});var bp=y(()=>{"use strict"});var Lo,Cp=y(()=>{"use strict";Lo={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 xs,Ho=y(()=>{"use strict";xs={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 'p. linear setup' to configure Linear"},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"}}});var vp=y(()=>{"use strict"});var xp=y(()=>{"use strict";vp()});function Uo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var M,Pp,Ps=y(()=>{"use strict";M={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"},Pp=["frontend","backend","devops","docs","testing","database","general"];l(Uo,"calculateConfidence")});var ic=y(()=>{"use strict"});var ac=y(()=>{"use strict";bp();Cp();Ho();_();xp();Ps();ic()});function Ts(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let n=Number.parseInt(t,10);if(!Number.isNaN(n)&&n>0)return n}return Ck[r]}var se,cc,lc,Go,Ck,Tt,Tp,Ir,ln=y(()=>{"use strict";se={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},cc=["feature","spec","design","refactor","migrate"],lc=["ship","cleanup","git","migrate"],Go=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],Ck={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(Ts,"getTimeout");Tt={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},Tp={HISTORY_MAX:100},Ir={NO_PREFERENCES:"No workflow preferences configured.",SET_EXAMPLE:"p. workflow before ship run the tests",MODIFY_EXAMPLE:"p. workflow before ship run npm test",REMOVE_EXAMPLE:"p. workflow remove the ship hook"}});function xk(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(vk.has(r)||r.includes("prjct"))return{level:Es.debug,name:"debug"};let e=Es[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function zo(r,e,t){return Ep>=r?(...n)=>console[t](e,...n):Tk}var Es,vk,Ep,Pk,Tk,Ek,H,Ln=y(()=>{"use strict";Es={error:0,warn:1,info:2,debug:3},vk=new Set(["1","true","*"]);l(xk,"getLogLevel");({level:Ep,name:Pk}=xk()),Tk=l(()=>{},"noop");l(zo,"createLogMethod");Ek={error:zo(Es.error,"[prjct:error]","error"),warn:zo(Es.warn,"[prjct:warn]","warn"),info:zo(Es.info,"[prjct:info]","log"),debug:zo(Es.debug,"[prjct:debug]","log"),isEnabled:l(()=>Ep>=0,"isEnabled"),level:l(()=>Pk,"level")},H=Ek});var Wo,Ik,Ip=y(()=>{"use strict";cn();he();ac();ln();Ln();Wo=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Tp.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 n=this.onceListeners.get(e);n&&n.delete(t)}}off(e,t){let n=this.listeners.get(e);n&&n.delete(t)}async emit(e,t={}){let n=new Date().toISOString(),s={type:e,timestamp:n,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,s)))).forEach(u=>{u.status==="rejected"&&H.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,s);this.onceListeners.delete(e)}let c=this.onceListeners.get(Lo.ALL);if(c)for(let u of c)await this.executeCallback(u,s)}getMatchingListeners(e){let t=[],n=this.listeners.get(e);n&&t.push(...n);let s=this.listeners.get(Lo.ALL);s&&t.push(...s);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let n=e(t);n instanceof Promise&&await n}catch(n){throw H.error("Event callback error:",n),n}}async logEvent(e){try{$.appendEvent(this.projectId,e.type,e)}catch(t){H.debug("Failed to log event:",ne(t))}}getHistory(e=10,t=null){let n=this.history;return t&&(n=n.filter(s=>s.type===t||s.type.startsWith(t))),n.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())}},Ik=new Wo});var Bo,Vo,Ap=y(()=>{"use strict";Ce();le();xe();Bo=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),n=await _n(t,[])??[];n.push(e),await kr(t,n)}async getPending(e){let t=A.getSyncPendingPath(e);return await _n(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await kr(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),n={timestamp:C(),success:!0};await kr(t,n)}async getLastSync(e){let t=A.getLastSyncPath(e);return await _n(t,null)}},Vo=new Bo});var uc=y(()=>{"use strict";Ip();Ap()});var Ft,Jo=y(()=>{"use strict";Ft=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var ze,Qt=y(()=>{"use strict";uc();Jo();le();he();ze=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Ft({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let n=$.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){$.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=await this.read(e),s=t(n);return await this.write(e,s),s}async publishEvent(e,t,n){let s={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:C(),projectId:e};await Vo.publish(s)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,i={...s,timestamp:C()};await this.publishEvent(e,o,i)}async exists(e){try{return $.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var dc,Ye,Ar=y(()=>{"use strict";Ot();Qa();le();bn();Qt();dc=class extends ze{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Bd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:Se(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:C()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:C()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:C()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:C()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:C()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:C()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.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:C()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=yn(Xt.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:C()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Ye=new dc});var pc,Pe,jr=y(()=>{"use strict";Ot();No();le();bn();Qt();pc=class extends ze{static{l(this,"QueueStorage")}constructor(){super("queue.json",wp)}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(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let n={...t,id:Se(),createdAt:C(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:C()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=C(),s=t.map(o=>({...o,id:Se(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:C()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:C()},n):i),lastUpdated:C()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:C()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:C()}))}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:C()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=yn(Xt.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},n={active:0,previously_active:1,backlog:2};return[...e].sort((s,o)=>{let i=n[s.section]-n[o.section];if(i!==0)return i;let a=t[s.priority]-t[o.priority];return a!==0?a:new Date(s.createdAt).getTime()-new Date(o.createdAt).getTime()})}},Pe=new pc});var mc,pt,Dr=y(()=>{"use strict";Ot();sc();le();bn();Qt();mc=class extends ze{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",dp)}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((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let n={...t,id:Se(),shippedAt:C()};return await this.update(e,s=>({shipped:[n,...s.shipped],lastUpdated:C()})),await this.publishEvent(e,"feature.shipped",{shipId:n.id,name:n.name,version:n.version,shippedAt:n.shippedAt}),n}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,n){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=n})}async getStats(e,t="month"){let n=new Date,s;switch(t){case"week":s=new Date(n.getTime()-10080*60*1e3);break;case"month":s=new Date(n.getFullYear(),n.getMonth(),1);break;case"year":s=new Date(n.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,n)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),n=yn(Xt.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<n);if(s.length===0)return 0;St.archiveMany(e,s.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)>=n).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:C()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},pt=new mc});var Rr,gc,Hn,fc=y(()=>{"use strict";Rr={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"}},gc=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let n=Rr[e];if(n.transitions.includes(t))return{valid:!0};let s=n.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${s}`}}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 Rr[e]}getPrompt(e){return Rr[e].prompt}getValidCommands(e){return Rr[e].transitions}formatNextSteps(e){return Rr[e].transitions.map(n=>{switch(n){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${n}`}})}},Hn=new gc});var hc,L,$r=y(()=>{"use strict";Ot();No();le();fc();bn();Qt();hc=class extends ze{static{l(this,"StateStorage")}constructor(){super("state.json",hp)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let n=Hn.getCurrentState(e),s=Hn.canTransition(n,t);if(!s.valid)throw new Error(`${s.error}. ${s.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:C()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:C()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=C(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,()=>({currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,n){let s=e,o=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),i=o.length>0?o.map(c=>c.title).join(", "):"Task completed",a={taskId:e.id,title:s.parentDescription||e.description,classification:s.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:o,outcome:i,branchName:s.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:s.prUrl};return n&&(a.feedback=n),a}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;this.validateTransition(n,"pause");let s={id:n.currentTask.id,description:n.currentTask.description,status:"paused",startedAt:n.currentTask.startedAt,pausedAt:C(),pauseReason:t},o=this.getPausedTasksFromState(n),i=[s,...o].slice(0,this.maxPausedTasks);return await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:C()})),await this.publishEvent(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async resumeTask(e,t){let n=await this.read(e),s=this.getPausedTasksFromState(n);if(s.length===0)return null;this.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(u=>u.id===t),o===-1))return null;let i=s[o],a=s.filter((u,d)=>d!==o),c={id:i.id,description:i.description,startedAt:C(),sessionId:Se()};return await this.update(e,()=>({currentTask:c,previousTask:null,pausedTasks:a,lastUpdated:C()})),await this.publishEvent(e,"task.resumed",{taskId:c.id,description:c.description,resumedAt:c.startedAt,remainingPaused:a.length}),c}getPausedTasksFromState(e){let t=e.pausedTasks||[];return e.previousTask&&e.previousTask.status==="paused"&&!t.some(s=>s.id===e.previousTask.id)?[e.previousTask,...t]:t}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async archiveStalePausedTasks(e){let t=await this.read(e),n=this.getPausedTasksFromState(t),s=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];St.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:C()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:C()}))}async hasTask(e){let t=await this.read(e),n=this.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let n=await this.read(e);return this.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let n=(await this.getTaskHistory(e)).filter(p=>p.feedback),s=[],o=[],i=[],a=[];for(let p of n){let g=p.feedback;g.stackConfirmed&&s.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,g])=>g>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async createSubtasks(e,t){let n=await this.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?C():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:C()})),await this.publishEvent(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let n=gp.safeParse(t);if(!n.success){let f=n.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
266
261
|
${f.join(`
|
|
267
|
-
`)}`)}let{output:s,summary:o}=n.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:C(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,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 n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||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(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});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:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});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:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new Rc});import XS from"node:fs/promises";import QS from"node:path";import{Hono as ZS}from"hono";function eb(r){return E.getGlobalProjectPath(r)}function Xp(r,e){let t=new ZS,n=eb(r);return t.get("/state",async s=>{let o=await L.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await be.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Be.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await ot.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),be.read(r),Be.read(r),ot.read(r)]),u=$.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await L.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=QS.join(n,"context",`${o}.md`),c=await XS.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return v(a)||U.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Qp=y(()=>{"use strict";me();ye();Ms();Os();Fs();_s();_();Wn();l(eb,"getProjectDataPath");l(Xp,"createRoutes")});import Ns from"node:fs/promises";import tb from"node:path";import{Hono as nb}from"hono";function oi(r){return $.getDoc(r,"project")}async function $c(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}function Zp(){let r=new nb;return r.get("/projects",async e=>{try{await Ns.mkdir(Ls,{recursive:!0});let n=(await Ns.readdir(Ls,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=oi(o),a=await L.read(o),c=await be.read(o),u=await Be.read(o),d=await ot.read(o),m=a?.currentTask,p=await $c(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(oi(t)),L.read(t),be.read(t),Be.read(t),ot.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await $c(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,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:s},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(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),be.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);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(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Be.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Ns.mkdir(Ls,{recursive:!0});let n=(await Ns.readdir(Ls,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await be.read(c),m=await Be.read(c),p=await ot.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Ns.mkdir(Ls,{recursive:!0});let s=(await Ns.readdir(Ls,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=oi(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await L.read(d),p=oi(d);if(m?.currentTask){i={id:d,name:p?.name||d,path:p?.repoPath||p?.path},a={...m.currentTask,duration:await $c(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:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}var sb,Ls,em=y(()=>{"use strict";me();ye();Ms();Os();Fs();_s();sb=E.getGlobalBasePath(),Ls=tb.join(sb,"projects");l(oi,"getProjectConfig");l($c,"calculateDuration");l(Zp,"createExtendedRoutes")});import{streamSSE as rb}from"hono/streaming";function nm(){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 n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>tm&&t(i)},ob),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return rb(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},ib),p=setTimeout(()=>{t(a)},tm);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(){s();for(let o of[...r.keys()])t(o)}}}var tm,ob,ib,sm=y(()=>{"use strict";bc();tm=3600*1e3,ob=300*1e3,ib=3e4;l(nm,"createSSEManager")});var rm={};fe(rm,{DEFAULT_PORT:()=>ai,createServer:()=>ii,startServer:()=>ub});import{Hono as ab}from"hono";import{cors as cb}from"hono/cors";import{logger as lb}from"hono/logger";function ii(r){let e=new ab,t=nm();r.enableCors!==!1&&e.use("*",cb({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",lb()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",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 n=Xp(r.projectId,r.projectPath);e.route("/api",n);let s=Zp();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(cc())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${cc()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}async function ub(r,e,t=ai){let n=ii({port:t,projectId:r,projectPath:e});return await n.start(),n}var ai,Mc=y(()=>{"use strict";sp();Qp();em();sm();l(ii,"createServer");ai=3478;l(ub,"startServer")});import Vn from"chalk";var om,db,pb,Ut,im=y(()=>{"use strict";Je();om=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],db=80,pb={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:om,speed:db},cli:{header:l(()=>`${Vn.cyan.bold("\u26A1")} ${Vn.cyan("prjct")}`,"header"),footer:l(()=>Vn.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Vn.cyan("\u26A1")} ${Vn.cyan("prjct")} ${Vn.cyan(om[r%10])} ${Vn.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")=>Mo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Mo(r).signature,"getSignature")},Ut=pb});function Jn(r,e){return{...As[r],...e}}function Hr(r,e,t){return{message:r,hint:e,...t}}var Gr=y(()=>{"use strict";Xo();Xo();l(Jn,"getError");l(Hr,"createError")});var cm={};fe(cm,{ERRORS:()=>As,ICONS:()=>En,OUTPUT_TIERS:()=>am,createError:()=>Hr,default:()=>h,formatForHuman:()=>yb,getError:()=>Jn,getOutputTier:()=>gb,getTierConfig:()=>li,isQuietMode:()=>hb,limitLines:()=>ci,setOutputTier:()=>mb,setQuietMode:()=>fb});import te from"chalk";function mb(r){Hs=r}function gb(){return Hs}function li(){return am[Hs]}function fb(r){dt=r}function hb(){return dt}function ci(r,e){let t=e??li().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
|
|
262
|
+
`)}`)}let{output:s,summary:o}=n.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:C(),output:s,summary:o};let d=u.filter(f=>f.status==="completed").length,m=u.length,p=Math.round(d/m*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:C()}),await this.update(e,f=>({...f,currentTask:{...f.currentTask,subtasks:u,currentSubtaskIndex:g<m?g:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:C()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:s,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 n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||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(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async failSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:C(),output:`Failed: ${t}`};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});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:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:C(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()});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:s,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:C()})),await this.publishEvent(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let n=await this.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:C()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:s},lastUpdated:C()})),await this.publishEvent(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new hc});import jk from"node:fs/promises";import Dk from"node:path";import{Hono as Rk}from"hono";function $k(r){return A.getGlobalProjectPath(r)}function jp(r,e){let t=new Rk,n=$k(r);return t.get("/state",async s=>{let o=await L.read(r);return s.json(o)}),t.get("/queue",async s=>{let o=await Pe.read(r);return s.json(o)}),t.get("/ideas",async s=>{let o=await Ye.read(r);return s.json(o)}),t.get("/roadmap",async s=>{let o=$.getDoc(r,"roadmap");return o?s.json(o):s.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async s=>{let o=await pt.read(r);return s.json(o)}),t.get("/dashboard",async s=>{let[o,i,a,c]=await Promise.all([L.read(r),Pe.read(r),Ye.read(r),pt.read(r)]),u=$.getDoc(r,"roadmap");return s.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async s=>{try{let o=await s.req.json();return await L.write(r,o),s.json({success:!0})}catch(o){return s.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async s=>{let o=s.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return s.json({error:"Invalid context file"},400);try{let a=Dk.join(n,"context",`${o}.md`),c=await jk.readFile(a,"utf-8");return s.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return v(a)||H.error(`Context read error: ${w(a)}`),s.text("",200,{"Content-Type":"text/markdown"})}}),t}var Dp=y(()=>{"use strict";Ce();he();Ar();jr();Dr();$r();_();Ln();l($k,"getProjectDataPath");l(jp,"createRoutes")});import Is from"node:fs/promises";import Mk from"node:path";import{Hono as Ok}from"hono";function qo(r){return $.getDoc(r,"project")}async function yc(r){if(!r)return"";let e=new Date(r),n=new Date().getTime()-e.getTime(),s=Math.floor(n/(1e3*60*60)),o=Math.floor(n%(1e3*60*60)/(1e3*60));return s>0?`${s}h ${o}m`:`${o}m`}function Rp(){let r=new Ok;return r.get("/projects",async e=>{try{await Is.mkdir(As,{recursive:!0});let n=(await Is.readdir(As,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),s=await Promise.all(n.map(async o=>{let i=qo(o),a=await L.read(o),c=await Pe.read(o),u=await Ye.read(o),d=await pt.read(o),m=a?.currentTask,p=await yc(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:p}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return s.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:s})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[n,s,o,i,a]=await Promise.all([Promise.resolve(qo(t)),L.read(t),Pe.read(t),Ye.read(t),pt.read(t)]),c=$.getDoc(t,"roadmap");s?.currentTask?.startedAt&&(s.currentTask.duration=await yc(s.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(d);m.setDate(m.getDate()-m.getDay());let p=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=d)?.length||0,g=o?.tasks?.filter(f=>!f.completed||!f.completedAt?!1:new Date(f.completedAt)>=m)?.length||0;return e.json({id:t,name:n?.name||t,path:n?.path,state:s||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:p,tasksThisWeek:g,queueCount:o?.tasks?.filter(f=>!f.completed)?.length||0,ideasCount:i?.ideas?.filter(f=>f.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(n){return e.json({error:String(n)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.currentTask)return e.json({success:!1,error:"No active task"},400);let s=n.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,completedTask:s,message:`Completed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=(await e.req.json().catch(()=>({}))).reason,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:s},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(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let n=await L.read(t);if(!n?.previousTask)return e.json({success:!1,error:"No paused task"},400);let s={id:n.previousTask.id,description:n.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:s,previousTask:null,lastUpdated:new Date().toISOString()};return await L.write(t,o),e.json({success:!0,resumedTask:s,message:`Resumed: ${s.description}`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{taskId:s}=n;if(!s)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([L.read(t),Pe.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===s);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(n){return e.json({success:!1,error:String(n)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let n=await e.req.json(),{text:s,priority:o="medium",tags:i=[]}=n;if(!s)return e.json({success:!1,error:"text required"},400);let a=await Ye.addIdea(t,s,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${s.slice(0,50)}...`})}catch(n){return e.json({success:!1,error:String(n)},500)}}),r.get("/stats/global",async e=>{try{await Is.mkdir(As,{recursive:!0});let n=(await Is.readdir(As,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),s=0,o=0,i=0,a=0;for(let c of n){let u=await L.read(c),d=await Pe.read(c),m=await Ye.read(c),p=await pt.read(c);u?.currentTask&&a++,s+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=p?.shipped?.length||0}return e.json({totalProjects:n.length,activeProjects:a,totalTasks:s,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Is.mkdir(As,{recursive:!0});let s=(await Is.readdir(As,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of s){let m=qo(d),p=m?.repoPath||m?.path;if(p&&t.startsWith(p)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:s;for(let d of u){let m=await L.read(d),p=qo(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:s.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}var Fk,As,$p=y(()=>{"use strict";Ce();he();Ar();jr();Dr();$r();Fk=A.getGlobalBasePath(),As=Mk.join(Fk,"projects");l(qo,"getProjectConfig");l(yc,"calculateDuration");l(Rp,"createExtendedRoutes")});import{streamSSE as _k}from"hono/streaming";function Op(){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 n(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Mp&&t(i)},Nk),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(n,"startReaper");function s(){e&&(clearInterval(e),e=null)}return l(s,"stopReaper"),n(),{handleConnection(o){return _k(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,f)=>{i.writeSSE({event:g,data:JSON.stringify(f)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},Lk),p=setTimeout(()=>{t(a)},Mp);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(){s();for(let o of[...r.keys()])t(o)}}}var Mp,Nk,Lk,Fp=y(()=>{"use strict";ic();Mp=3600*1e3,Nk=300*1e3,Lk=3e4;l(Op,"createSSEManager")});var _p={};ge(_p,{DEFAULT_PORT:()=>Yo,createServer:()=>Ko,startServer:()=>zk});import{Hono as Hk}from"hono";import{cors as Uk}from"hono/cors";import{logger as Gk}from"hono/logger";function Ko(r){let e=new Hk,t=Op();r.enableCors!==!1&&e.use("*",Uk({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",Gk()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:"0.20.0",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 n=jp(r.projectId,r.projectPath);e.route("/api",n);let s=Rp();e.route("/api",s),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(Pr())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${Pr()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}async function zk(r,e,t=Yo){let n=Ko({port:t,projectId:r,projectPath:e});return await n.start(),n}var Yo,wc=y(()=>{"use strict";Ja();Dp();$p();Fp();l(Ko,"createServer");Yo=3478;l(zk,"startServer")});import Un from"chalk";var Np,Wk,Bk,_t,Lp=y(()=>{"use strict";Be();Np=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Wk=80,Bk={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Np,speed:Wk},cli:{header:l(()=>`${Un.cyan.bold("\u26A1")} ${Un.cyan("prjct")}`,"header"),footer:l(()=>Un.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Un.cyan("\u26A1")} ${Un.cyan("prjct")} ${Un.cyan(Np[r%10])} ${Un.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")=>vo(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>vo(r).signature,"getSignature")},_t=Bk});function Gn(r,e){return{...xs[r],...e}}function Mr(r,e,t){return{message:r,hint:e,...t}}var Or=y(()=>{"use strict";Ho();Ho();l(Gn,"getError");l(Mr,"createError")});var Up={};ge(Up,{ERRORS:()=>xs,ICONS:()=>Cn,OUTPUT_TIERS:()=>Hp,createError:()=>Mr,default:()=>h,formatForHuman:()=>Yk,getError:()=>Gn,getOutputTier:()=>Jk,getTierConfig:()=>Qo,isQuietMode:()=>Kk,limitLines:()=>Xo,setOutputTier:()=>Vk,setQuietMode:()=>qk});import te from"chalk";function Vk(r){Ds=r}function Jk(){return Ds}function Qo(){return Hp[Ds]}function qk(r){ct=r}function Kk(){return ct}function Xo(r,e){let t=e??Qo().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
|
|
268
263
|
`);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
|
|
269
264
|
`)}
|
|
270
|
-
${te.dim(`...${o} more lines`)}`}function
|
|
271
|
-
`),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} ${
|
|
272
|
-
`)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?
|
|
273
|
-
`),e.maxLines):
|
|
274
|
-
`),this))},done(r,e){if(this.stop(),!
|
|
275
|
-
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),
|
|
276
|
-
${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return
|
|
277
|
-
`),this)},progress(r,e,t){if(
|
|
278
|
-
`),this)}},h=kb});var dm={};fe(dm,{default:()=>bb,sessionTracker:()=>In});var Sb,lm,um,_c,In,bb,ui=y(()=>{"use strict";ye();ie();Sb=1800*1e3,lm=50,um=200,_c=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Sb}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>lm&&(s.current.commands=s.current.commands.slice(-lm)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>um&&(s.current.files=s.current.files.slice(-um)),await this.write(e,s)}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 n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Mr(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Mr(u),commandCount:n.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}},In=new _c,bb=In});var mm={};fe(mm,{default:()=>qn,performanceTracker:()=>pm});var Nc,pm,qn,di=y(()=>{"use strict";ye();Nc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){V.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)V.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){V.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){V.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(k=>Math.round(k/1048576*10)/10,"toMB"),g=a.map(k=>k.value),f=c.map(k=>k.value);o.memory={avgHeapMB:p(g.reduce((k,S)=>k+S,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((k,S)=>k+S,0)/f.length):0}}let u=s.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=s.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=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((k,S)=>k+S,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},pm=new Nc,qn=pm});import{createHash as Cb}from"node:crypto";var Lc,tn,pi=y(()=>{"use strict";dc();ie();en();Lc=class extends We{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getMdFilename(){return"analysis.md"}getLayer(){return"analysis"}getEventType(e){return`analysis.${e}d`}toMarkdown(e){let t=["# Analysis Status",""];return e.sealed&&(t.push("## Sealed Analysis"),t.push("- **Status**: sealed"),t.push(`- **Commit**: \`${e.sealed.commitHash||"unknown"}\``),t.push(`- **Sealed at**: ${e.sealed.sealedAt||"unknown"}`),t.push(`- **Languages**: ${e.sealed.languages.join(", ")||"none"}`),t.push(`- **Frameworks**: ${e.sealed.frameworks.join(", ")||"none"}`),t.push(`- **Files**: ${e.sealed.fileCount}`),e.sealed.patterns.length>0&&t.push(`- **Patterns**: ${e.sealed.patterns.map(n=>n.name).join(", ")}`),t.push("")),e.draft&&e.draft.status==="draft"&&(t.push("## Draft Analysis"),t.push("- **Status**: draft (not yet sealed)"),t.push(`- **Commit**: \`${e.draft.commitHash||"unknown"}\``),t.push(`- **Analyzed at**: ${e.draft.analyzedAt}`),t.push(`- **Languages**: ${e.draft.languages.join(", ")||"none"}`),t.push(`- **Frameworks**: ${e.draft.frameworks.join(", ")||"none"}`),t.push(`- **Files**: ${e.draft.fileCount}`),t.push("")),!e.sealed&&!e.draft&&(t.push("_No analysis available. Run `p. sync` to generate._"),t.push("")),t.join(`
|
|
279
|
-
|
|
280
|
-
`)
|
|
281
|
-
`)
|
|
265
|
+
${te.dim(`...${o} more lines`)}`}function Yk(r){let e=Qo();if(Ds==="silent")return"";if(Ds==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return Et(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${Et(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&&Ds==="compact"&&o.push(te.dim(String(t.url))),Xo(o.join(`
|
|
266
|
+
`),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} ${Et(String(a.title),Tt.ISSUE_TITLE)}${c}`});return o.length>e.maxLines&&i.push(te.dim(`...${o.length-e.maxLines} more`)),i.join(`
|
|
267
|
+
`)}let s=["id","name","title","status","message","success","error"].filter(o=>o in t);return s.length>0?Xo(s.map(o=>`${o}: ${Et(String(t[o]),e.maxCharsPerLine-o.length-2)}`).join(`
|
|
268
|
+
`),e.maxLines):Xo(JSON.stringify(r,null,2),e.maxLines)}var fR,Sc,Hp,Ds,Cn,js,kc,ct,Et,Xk,Qk,h,Nt=y(()=>{"use strict";Lp();ln();Or();Or();fR=_t.spinner.frames,Sc=_t.spinner.speed,Hp={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}},Ds="compact";l(Vk,"setOutputTier");l(Jk,"getOutputTier");l(Qo,"getTierConfig");Cn={success:te.green("\u2713"),fail:te.red("\u2717"),warn:te.yellow("\u26A0"),info:te.blue("\u2139"),debug:te.dim("\u{1F527}"),bullet:te.dim("\u2022"),arrow:te.dim("\u2192"),check:te.green("\u2713"),cross:te.red("\u2717"),spinner:te.cyan("\u25D0")},js=null,kc=0,ct=!1;l(qk,"setQuietMode");l(Kk,"isQuietMode");Et=l((r,e)=>{let t=e??(Qo().maxCharsPerLine||Tt.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate");l(Xo,"limitLines");l(Yk,"formatForHuman");Xk=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(Tt.CLEAR_WIDTH)}\r`):!0,"clear"),Qk={start(){return ct||console.log(_t.cli.header()),this},end(){return ct||console.log(_t.cli.footer()),this},spin(r){return ct?this:(this.stop(),process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,Et(r,Tt.SPINNER_MSG))}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,Et(r,Tt.SPINNER_MSG))}
|
|
269
|
+
`),this))},done(r,e){if(this.stop(),!ct){let t="";if(e){let n=[];e.agents!==void 0&&n.push(`${e.agents}a`),e.reduction!==void 0&&n.push(`${e.reduction}%`),e.tokens!==void 0&&n.push(`${Math.round(e.tokens)}K`),n.length>0&&(t=te.dim(` [${n.join(" | ")}]`))}console.log(`${Cn.success} ${Et(r,Tt.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Cn.fail} ${Et(r,Tt.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Gn(r):r;return console.error(),console.error(`${Cn.fail} ${e.message}`),e.file&&console.error(te.dim(` File: ${e.file}`)),e.hint&&console.error(te.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(te.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),ct||console.log(`${Cn.warn} ${Et(r,Tt.WARN_MSG)}`),this},info(r){return this.stop(),ct||console.log(`${Cn.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!ct&&e&&console.log(`${Cn.debug} ${te.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),ct)return this;let t=e.bullet||Cn.bullet,n=" ".repeat(e.indent||0);for(let s of r)console.log(`${n}${t} ${s}`);return this},table(r,e={}){if(this.stop(),ct||r.length===0)return this;let t=Object.keys(r[0]),n={};for(let s of t){n[s]=s.length;for(let o of r){let i=String(o[s]??"");i.length>n[s]&&(n[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(n[o])).join(" ");console.log(te.dim(s)),console.log(te.dim("\u2500".repeat(s.length)))}for(let s of r){let o=t.map(i=>String(s[i]??"").padEnd(n[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),ct)return this;let t=e.split(`
|
|
270
|
+
`),n=Math.max(r.length,...t.map(o=>o.length)),s="\u2500".repeat(n+2);console.log(te.dim(`\u250C${s}\u2510`)),console.log(`${te.dim("\u2502")} ${te.bold(r.padEnd(n))} ${te.dim("\u2502")}`),console.log(te.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${te.dim("\u2502")} ${o.padEnd(n)} ${te.dim("\u2502")}`);return console.log(te.dim(`\u2514${s}\u2518`)),this},section(r){return this.stop(),ct?this:(console.log(`
|
|
271
|
+
${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){return js&&(clearInterval(js),js=null,Xk()),this},step(r,e,t){if(ct)return this;this.stop();let n=te.dim(`[${r}/${e}]`);return process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,`${n} ${Et(t,Tt.STEP_MSG)}`)}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,`${n} ${Et(t,Tt.STEP_MSG)}`)}
|
|
272
|
+
`),this)},progress(r,e,t){if(ct)return this;this.stop();let n=Math.round(r/e*100),s=Math.round(n/10),o=10-s,i=te.cyan("\u2588".repeat(s))+te.dim("\u2591".repeat(o)),a=t?` ${Et(t,Tt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(js=setInterval(()=>{process.stdout.write(`\r${_t.cli.spin(kc++,`[${i}] ${n}%${a}`)}`)},Sc),this):(process.stdout.write(`${_t.cli.spin(0,`[${i}] ${n}%${a}`)}
|
|
273
|
+
`),this)}},h=Qk});var Wp={};ge(Wp,{default:()=>eb,sessionTracker:()=>vn});var Zk,Gp,zp,bc,vn,eb,Zo=y(()=>{"use strict";he();le();Zk=1800*1e3,Gp=50,zp=200,bc=class{static{l(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:Zk}}}isExpired(e,t){let n=new Date(e.lastActivity).getTime();return Date.now()-n>t}async touch(e){let t=await this.read(e),n=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>Gp&&(s.current.commands=s.current.commands.slice(-Gp)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>zp&&(s.current.files=s.current.files.slice(-zp)),await this.write(e,s)}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 n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=n.commands.map(g=>g.command),m=new Set(n.files.filter(g=>g.operation==="read").map(g=>g.path)).size,p=new Set(n.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:n.id,duration:Cr(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Cr(u),commandCount:n.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}},vn=new bc,eb=vn});var Vp={};ge(Vp,{default:()=>zn,performanceTracker:()=>Bp});var Cc,Bp,zn,ei=y(()=>{"use strict";he();Cc=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}recordTiming(e,t,n,s){V.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)V.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}recordContextCorrectness(e,t){V.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){V.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let n=t.toISOString();return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(p=>"metric"in p&&p.metric==="startup_time");if(i.length>0){let p=i.map(g=>g.value);o.startup={avg:Math.round(p.reduce((g,f)=>g+f,0)/p.length),min:Math.min(...p),max:Math.max(...p),count:p.length,unit:"ms"}}let a=s.filter(p=>"metric"in p&&p.metric==="heap_used"),c=s.filter(p=>"metric"in p&&p.metric==="rss");if(a.length>0){let p=l(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),f=c.map(S=>S.value);o.memory={avgHeapMB:p(g.reduce((S,b)=>S+b,0)/g.length),peakHeapMB:p(Math.max(...g)),avgRssMB:f.length>0?p(f.reduce((S,b)=>S+b,0)/f.length):0}}let u=s.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=s.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=s.filter(p=>"metric"in p&&p.metric==="command_duration");if(m.length>0){let p={};for(let g of m){let f=g.context?.command||"unknown";p[f]||(p[f]=[]),p[f].push(g.value)}o.commandDurations={};for(let[g,f]of Object.entries(p))o.commandDurations[g]={avg:Math.round(f.reduce((S,b)=>S+b,0)/f.length),min:Math.min(...f),max:Math.max(...f),count:f.length,unit:"ms"}}return o}},Bp=new Cc,zn=Bp});function xc(r){if(Pp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(ti))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var vc,ti,Wn,Fr,_r,Nr=y(()=>{"use strict";he();Ps();le();vc={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},ti={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(xc,"resolveCanonicalDomains");Wn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=V.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();V.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Fr=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()}},_r=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};V.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Lr,Pc=y(()=>{"use strict";he();Ps();le();Nr();Lr=class r extends Wn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>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,n,s="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Uo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=C();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Uo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Uo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=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();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=V.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return V.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Bn,Tc=y(()=>{"use strict";Ot();Ps();le();Nr();Bn=class extends Wn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id:Se(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let D=this._getCommandTags(t.commandName),x=(p.tags||[]).filter(O=>D.includes(O));g.tagMatch=Math.min(20,x.length*8)}let S=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-S*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let D=this._extractKeywordsFromText(t.taskDescription),x=0;for(let O of D)p.content.toLowerCase().includes(O)&&(x+=2),p.title.toLowerCase().includes(O)&&(x+=3);g.keywords=Math.min(15,x)}p.userTriggered&&(g.userTriggered=5);let b=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:b,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=vc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=ti[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return xc(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
|
|
274
|
+
Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var Ec,tb,Te,Rs=y(()=>{"use strict";Nr();Pc();Tc();Nr();Pc();Tc();Ec=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Bn,this._patternStore=new Lr,this._historyStore=new _r,this._sessionStore=new Fr}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,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,s){return this._semanticMemories.autoRemember(e,t,n,s)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,s){return this._patternStore.recordDecision(e,t,n,s)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,s){return this._patternStore.setPreference(e,t,n,s)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let s=await this.getDecision(e,t);return s?s.value:null}async learnDecision(e,t,n,s=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,s),await this.appendHistory(e,{type:"decision",key:t,value:n,context:s})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},tb=new Ec,Te=tb});import{exec as nb}from"node:child_process";import kt from"node:fs/promises";import Lt from"node:path";import{promisify as sb}from"node:util";var Vn,Ic,rb,qe,Jp=y(()=>{"use strict";_();Vn=sb(nb),Ic=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Lt.join(this.projectPath,"package.json"),t=await kt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Lt.join(this.projectPath,"Cargo.toml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readRequirements(){try{let e=Lt.join(this.projectPath,"requirements.txt");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGoMod(){try{let e=Lt.join(this.projectPath,"go.mod");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGemfile(){try{let e=Lt.join(this.projectPath,"Gemfile");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readMixExs(){try{let e=Lt.join(this.projectPath,"mix.exs");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readPomXml(){try{let e=Lt.join(this.projectPath,"pom.xml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readComposerJson(){try{let e=Lt.join(this.projectPath,"composer.json"),t=await kt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Lt.join(this.projectPath,"pyproject.toml");return await kt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Vn('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(`
|
|
275
|
+
`).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[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(n=>t.some(s=>s.test(n)))}catch(e){if(v(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(v(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Vn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Vn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Vn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Vn('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:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await Vn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await kt.access(Lt.join(this.projectPath,e)),!0}catch(t){if(v(t))return!1;throw t}}async readFile(e){try{let t=Lt.join(this.projectPath,e);return await kt.readFile(t,"utf-8")}catch(t){if(v(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Vn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
276
|
+
`).filter(Boolean)}catch{return[]}}},rb=new Ic,qe=rb});import jc from"node:fs";import ob from"node:fs/promises";import ni from"node:path";function Dc(){if(qp)return Ac;qp=!0;let r=ni.join(pe,"dist","templates.json");try{let e=jc.readFileSync(r,"utf-8");return Ac=JSON.parse(e),Ac}catch{return null}}function ab(r){let e=Jn.indexOf(r);e>-1&&Jn.splice(e,1),Jn.push(r)}function cb(){for(;$s.size>=ib&&Jn.length>0;){let r=Jn.shift();r&&$s.delete(r)}}function si(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
|
|
277
|
+
`).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:s.trim()}}async function Kp(r){if($s.has(r))return ab(r),$s.get(r);let e,t=Dc();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ni.join(pe,"templates","commands",`${r}.md`);try{e=await ob.readFile(s,"utf-8")}catch{throw Po.notFound(r)}}let n=si(e);return cb(),$s.set(r,n),Jn.push(r),n}async function lb(r){return(await Kp(r)).frontmatter["allowed-tools"]||[]}function ub(){$s.clear(),Jn.length=0}function ve(r){let e=Dc();if(e?.[r])return e[r];let t=ni.join(pe,"templates",r);try{return jc.readFileSync(t,"utf-8")}catch{return null}}function Ms(r){let e=Dc();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ni.join(pe,"templates",r);try{return jc.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var ib,$s,Jn,Ac,qp,db,Rc,qn=y(()=>{"use strict";cn();dt();ib=50,$s=new Map,Jn=[],Ac=null,qp=!1;l(Dc,"loadBundle");l(ab,"updateLruOrder");l(cb,"evictLru");l(si,"parseFrontmatter");l(Kp,"load");l(lb,"getAllowedTools");l(ub,"clearCache");l(ve,"getTemplateContent");l(Ms,"listTemplates");db={load:Kp,parseFrontmatter:si,getAllowedTools:lb,clearCache:ub,getTemplateContent:ve,listTemplates:Ms},Rc=db});import X from"node:fs/promises";import Mc from"node:os";import Z from"node:path";async function pb(){try{let r=ve("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Z.join(pe,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function mb(r){let e=await pb();if(!e){let i=ve("global/CLAUDE.md");if(i)return i;let a=Z.join(pe,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=ve("global/CLAUDE.md");if(a)return a;let c=Z.join(pe,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=ve(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Z.join(pe,"templates/global/modules",i),u=await X.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
|
|
278
|
+
`)}async function gb(){try{let r=Z.join(Mc.homedir(),".prjct-cli","docs");await X.mkdir(r,{recursive:!0});let e=Ms("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=ve(s);if(o){let i=Z.basename(s);await X.writeFile(Z.join(r,i),o,"utf-8")}}return{success:!0}}let t=Z.join(pe,"templates/global/docs"),n=await X.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=Z.join(t,s),i=Z.join(r,s),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function fb(){let r=(Be(),xt(ut)),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 X.mkdir(e.configDir,{recursive:!0});let s=Z.join(e.configDir,e.contextFile),o=Z.join(pe,"templates","global",e.contextFile),i="";try{let u=ve(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await mb()}catch{let d=ve("global/CLAUDE.md");if(d)i=d;else{let m=Z.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=ve("global/CLAUDE.md");if(d)i=d;else{let m=Z.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await X.readFile(s,"utf-8"),c=!0}catch(u){if(v(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),S=p+f+g;return await X.writeFile(s,S,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
279
|
+
|
|
280
|
+
${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await X.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function Yp(){let r=Mc.homedir();return{claude:{commands:Z.join(r,".claude","commands","p"),config:Z.join(r,".claude"),router:Z.join(r,".claude","commands","p.md")},gemini:{commands:Z.join(r,".gemini","commands"),config:Z.join(r,".gemini"),router:Z.join(r,".gemini","commands","p.toml")}}}var $c,hb,Ee,xn=y(()=>{"use strict";qn();_();dt();l(pb,"loadModuleConfig");l(mb,"composeGlobalTemplate");l(gb,"installDocs");l(fb,"installGlobalConfig");$c=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=Mc.homedir(),this.templatesDir=Z.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Be(),xt(ut)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Z.join(t.configDir,"commands"):this.claudeCommandsPath=Z.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await X.access(this.claudeConfigPath),!0}catch(e){if(v(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=new Set(["p.md","p.toml"]),t=Ms("commands/");if(t.length>0)return t.filter(n=>n.endsWith(".md")).map(n=>n.replace("commands/","")).filter(n=>!e.has(n));try{return(await X.readdir(this.templatesDir)).filter(s=>s.endsWith(".md")&&!e.has(s))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Be(),xt(ut)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=Z.join(this.claudeCommandsPath,a),u=ve(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=Z.join(this.templatesDir,a),m=await X.readFile(d,"utf-8");await X.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:w(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=Z.join(this.claudeCommandsPath,s);await X.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(v(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(ve(`commands/${e}.md`))return!0;try{let n=Z.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(v(n))return!1;throw n}}async installRouter(){let t=await(Be(),xt(ut)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Z.join(t.configDir,"commands",n);await X.mkdir(Z.dirname(s),{recursive:!0});let o=ve(`commands/${n}`);if(o)return await X.writeFile(s,o,"utf-8"),!0;let i=Z.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(s,a,"utf-8"),!0}catch(s){if(v(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Be(),xt(ut)).getActiveProvider(),n=Z.join(t.configDir,"commands"),s=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(Z.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(v(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=Z.join(this.claudeCommandsPath,o),a=n.includes(o),c=ve(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=Z.join(this.templatesDir,o),d=await X.readFile(u,"utf-8");await X.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return fb()}async installDocs(){return gb()}};l(Yp,"getProviderPaths");hb=new $c,Ee=hb});import{z as Oe}from"zod";function em(r,e="default"){let t=Xp[e]||Xp.default;return r/1e3*t}function ri(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var yb,wb,Qp,Zp,Xp,oi=y(()=>{"use strict";yb=Oe.object({date:Oe.string(),tokensSaved:Oe.number(),syncs:Oe.number(),avgCompressionRate:Oe.number(),totalDuration:Oe.number()}),wb=Oe.object({agentName:Oe.string(),usageCount:Oe.number(),tokensSaved:Oe.number()}),Qp=Oe.object({totalTokensSaved:Oe.number(),avgCompressionRate:Oe.number(),syncCount:Oe.number(),watchTriggers:Oe.number(),avgSyncDuration:Oe.number(),totalSyncDuration:Oe.number(),agentUsage:Oe.array(wb),dailyStats:Oe.array(yb),firstSync:Oe.string(),lastUpdated:Oe.string()}),Zp={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Xp={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"claude-3-opus":.015,"claude-3-sonnet":.003,"gpt-4o":.0025,"gpt-4":.01,"gemini-pro":.00125,default:.003};l(em,"estimateCostSaved");l(ri,"formatCost")});function Sb(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function kb(r){let e=[],t=Sb(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(Oc,o+i.length);if(c===-1)continue;let u=c+Oc.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Fc(r,e){let t=kb(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
`,n+=`## Your Customizations
|
|
285
|
+
|
|
286
|
+
`,n+=`_The sections below are preserved during sync. Edit freely._
|
|
287
|
+
|
|
288
|
+
`;for(let s of t)n+=s.content,n+=`
|
|
289
|
+
|
|
290
|
+
`;return`${n.trimEnd()}
|
|
291
|
+
`}function _c(r){let e=[],t=r.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=r.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let s=0,o=0,i=r.split(`
|
|
292
|
+
`);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(Oc)&&s--,s>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),s<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var Oc,Nc=y(()=>{"use strict";Oc="<!-- /prjct:preserve -->";l(Sb,"createPreserveStartRegex");l(kb,"extractPreservedSections");l(Fc,"mergePreservedSections");l(_c,"validatePreserveBlocks")});function Hr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&bb.has(e.code))return!0;if(e.code&&nm.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 ai(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&nm.has(e.code))}function tm(r,e,t){let n=Pn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(Pn.delete(r),!1):!0:!1}function Lc(r,e){let t=Pn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Pn.set(r,t)}function Cb(r){Pn.delete(r)}var bb,nm,Pn,ii,sm,Ur,ci=y(()=>{"use strict";bb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),nm=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Hr,"isTransientError");l(ai,"isPermanentError");Pn=new Map;l(tm,"isCircuitOpen");l(Lc,"recordFailure");l(Cb,"recordSuccess");ii=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(tm(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return Cb(t),o}catch(o){if(n=o,s++,ai(o))throw Lc(t,this.options.circuitBreakerThreshold),o;if(!(Hr(o)&&s<this.options.maxAttempts))throw Lc(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Lc(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Hr(e)}isCircuitOpen(e){return tm(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Pn.get(e)}resetCircuit(e){Pn.delete(e)}resetAllCircuits(){Pn.clear()}},sm=new ii({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),Ur=new ii({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var rm=y(()=>{"use strict";Nc();ci()});import li from"node:fs/promises";import Hc from"node:path";var Uc,om,im=y(()=>{"use strict";Ve();Ce();_();Uc=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=A.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await li.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await li.readFile(Hc.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return v(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=Hc.join(this.agentsPath,`${e}.md`),n=await li.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return v(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=Hc.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
|
|
293
|
+
`;await li.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},om=Uc});import am from"node:path";async function Pb(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(am.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(am.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Tb(){return{...vb}}function Eb(){return{...xb}}async function cm(){return ui||(ui=await Pb()?Tb():Eb(),ui)}var ui,vb,xb,lm=y(()=>{"use strict";xe();ui=null,vb={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},xb={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(Pb,"isClaudeEnvironment");l(Tb,"getClaudeAgent");l(Eb,"getTerminalAgent");l(cm,"detect")});var Ab,Gc=y(()=>{Ab=dd({})});var jb,di,Os,um=y(()=>{"use strict";im();cn();lm();ci();Gc();jb=["claude"],di=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new om}async initialize(){return this.agent?this.agent:await sm.execute(async()=>{if(this.agentInfo=await cm(),!this.agentInfo?.isSupported)throw br.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!jb.includes(e))throw br.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await Ab(`../infrastructure/${e}-agent`);return this.agent=new t,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
|
|
294
|
+
AGENTIC EXECUTION:
|
|
295
|
+
- Read: templates/agentic/orchestrator.md
|
|
296
|
+
- Analyze task: "${e}"
|
|
297
|
+
- Available specialists: ${s.join(", ")}
|
|
298
|
+
- Claude decides which agent(s) to use
|
|
299
|
+
- Always prefer specialists over generalist
|
|
300
|
+
- Fragment complex tasks into subtasks
|
|
301
|
+
`}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},Os=new di});var pi,mi,dm=y(()=>{"use strict";pi=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},mi=new pi});import Db from"node:crypto";import gi from"node:fs/promises";import pm from"node:path";function mm(){return{version:Ht,lastUpdated:"",checksums:{}}}var Ht,zc,Xe,Gr=y(()=>{"use strict";Ce();_();le();he();Ht="1.0.0";l(mm,"getDefaultChecksums");zc=class{static{l(this,"IndexStorage")}getIndexPath(e){return pm.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!==Ht?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 mm()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return Db.createHash("md5").update(t).digest("hex")}catch{return""}}async detectChangedFiles(e,t){let s=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in s?s[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(s))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 n={version:Ht,lastUpdated:C(),scores:t};this.setIndexMeta(e,"file-scores",n)}async clearIndex(e){try{$.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let n=await gi.readdir(t);await Promise.all(n.map(s=>gi.unlink(pm.join(t,s))))}catch(n){if(!v(n))throw n}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let n=new Date(t.lastFullScan);return(new Date().getTime()-n.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Ht?null: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!==Ht?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let n=await this.readCategories(e),s=new Map;if(!n)return s;let o=new Set(t);for(let i of n.fileCategories)o.has(i.path)&&s.set(i.path,i.categories);return s}async getFilesByDomain(e,t){let n=await this.readCategories(e);return n?n.domainIndex[t]||[]:[]}getIndexMeta(e,t){let s=$.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setIndexMeta(e,t,n){let s=$.getDb(e),o=JSON.stringify(n),i=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},Xe=new zc});var gm,Rb,fi,$b,fm=y(()=>{"use strict";Gr();gm=8e4,Rb={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},fi=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||gm,[c,u,d]=await Promise.all([Xe.readIndex(t),Xe.readDomains(t),Xe.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let x of m){let O=d.domainIndex[x]||[];for(let F of O)p.add(F)}if(i&&d.domainIndex.general){let x=d.domainIndex.general.slice(0,10);for(let O of x)p.add(O)}let g=c.relevantFiles.filter(x=>p.has(x.path)&&x.score>=o);g.sort((x,O)=>O.score-x.score);let f=0,S=[];for(let x of g){let O=Math.ceil(x.size/this.CHARS_PER_TOKEN);if(f+O>a||S.length>=s)break;S.push(x),f+=O}let b=Math.ceil(c.relevantFiles.reduce((x,O)=>x+O.size,0)/this.CHARS_PER_TOKEN),D=b>0?(b-f)/b:0;return{files:S,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:S.length,compressionRate:D,estimatedTokensSaved:b-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(Rb))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await Xe.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Xe.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Xe.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||gm,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},$b=new fi});import hm from"node:path";var Wc,hi,Mb,ym=y(()=>{"use strict";Gr();le();Wc=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],hi=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of Wc)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=hm.dirname(i.path);n.get(u).add(`**/${hm.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=Wc.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of Wc)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=C(),o={version:Ht,projectId:e,domains:t,discoveredAt:s};await Xe.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Ht,lastUpdate:s,fileCategories:n,domainIndex:i};await Xe.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Xe.readDomains(e),Xe.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await Xe.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await Xe.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Ht,lastUpdate:C(),fileCategories:u,domainIndex:d};await Xe.writeCategories(e,m)}return o}},Mb=new hi});import Bc from"node:path";var Vc,Ob,Fb,yi,wm,Jc=y(()=>{"use strict";Vc=30,Ob=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],Fb=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],yi=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=Vc){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=Bc.basename(e.path);for(let n of Ob)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=Bc.basename(e.path);for(let s of Fb)if(s.test(t))return 15;let n=Bc.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},wm=new yi});import{execSync as qc}from"node:child_process";var wi,Kc,Si,Fs,ki=y(()=>{"use strict";Or();wi={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"}},Kc=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 n=wi[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=wi[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new Si(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=wi[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
302
|
+
`);throw new Si({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
303
|
+
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(wi),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=qc(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Mr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return qc(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qc(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Mr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},Si=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}},Fs=new Kc});import{exec as _b}from"node:child_process";import{promisify as Nb}from"node:util";var CM,Sm=y(()=>{"use strict";ln();ki();CM=Nb(_b)});var bi,mt,Yc=y(()=>{"use strict";Ve();bn();he();bi=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;V.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?V.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await R.getProjectId(e);return s?V.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;V.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 V.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Xt.MEMORY_MAX_ENTRIES)return 0;let s=n-Xt.MEMORY_MAX_ENTRIES,o=V.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);St.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&&V.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},mt=new bi});var km=y(()=>{"use strict";Ce();xe()});import{exec as Hb}from"node:child_process";import{promisify as Ub}from"node:util";var NM,bm=y(()=>{"use strict";Gr();le();Jc();NM=Ub(Hb)});import{createHash as Gb}from"node:crypto";var Xc,Zt,Ci=y(()=>{"use strict";Ya();le();Qt();Xc=class extends ze{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let n={...t,status:"draft"};Ka.parse(n),await this.update(e,s=>({...s,draft:n,lastUpdated:C()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:n.commitHash,fileCount:n.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let n=this.computeSignature(t.draft),s=C(),o={...t.draft,status:"sealed",signature:n,sealedAt:s};return Ka.parse(o),await this.write(e,{draft:null,sealed:o,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:n}),{success:!0,signature:n}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let n=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return n===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${n}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let n=await this.read(e),s=n.sealed??n.draft;return s?await Gd(s,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 Gb("sha256").update(JSON.stringify(t)).digest("hex")}},Zt=new Xc});var Qc,un,zr=y(()=>{"use strict";oi();le();Qt();Qc=class extends ze{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Qp)}getDefault(){return{...Zp}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let n=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?n/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+n,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/a,m=[...i.dailyStats],p=m.findIndex(D=>D.date===o);if(p>=0){let D=m[p];m[p]={...D,tokensSaved:D.tokensSaved+n,syncs:D.syncs+1,avgCompressionRate:(D.avgCompressionRate*D.syncs+s)/(D.syncs+1),totalDuration:D.totalDuration+t.duration}}else m.push({date:o,tokensSaved:n,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let f=g.toISOString().split("T")[0],S=m.filter(D=>D.date>=f),b=[...i.agentUsage];if(t.agents)for(let D of t.agents){let x=b.findIndex(O=>O.agentName===D);x>=0?b[x]={...b[x],usageCount:b[x].usageCount+1,tokensSaved:b[x].tokensSaved+Math.floor(n/t.agents.length)}:b.push({agentName:D,usageCount:1,tokensSaved:Math.floor(n/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:b,dailyStats:S,firstSync:i.firstSync||C(),lastUpdated:C()}})}async getSummary(e){let t=await this.read(e),n=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=n.reduce((c,u)=>c+u.tokensSaved,0),i=s.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 n=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return n.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=t.toISOString().split("T")[0];return e.filter(s=>s.date>=n)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let n=new Date;n.setDate(n.getDate()-60);let s=n.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},un=new Qc});import lt from"node:fs/promises";import de from"node:path";async function Wr(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if($.exists(r)&&$.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let n=A.getGlobalProjectPath(r),s=de.join(n,"storage"),o=de.join(n,"index"),i=de.join(n,"memory");t.backupDir=await zb(s,o,i),$.getDb(r);for(let{filename:a,key:c}of tl){let u=de.join(s,a),d=await Kn(u);if(d===null){t.skippedFiles.push(a);continue}try{$.setDoc(r,c,d),Cm(r,c,d),t.migratedFiles.push(a)}catch(m){t.errors.push({file:a,error:String(m)})}}for(let{filename:a,key:c}of el){let u=de.join(o,a),d=await Kn(u);if(d===null){t.skippedFiles.push(`index/${a}`);continue}try{$.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",c,JSON.stringify(d),new Date().toISOString()),vm(r,c,d),t.migratedFiles.push(`index/${a}`)}catch(m){t.errors.push({file:`index/${a}`,error:String(m)})}}return await Xb(r,o,t),await Qb(r,o,t),await Zb(r,i,t),await eC(r,i,t),t.errors.length===0&&await tC(s,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(n){return t.errors.push({file:"<migration>",error:String(n)}),t.duration=Date.now()-e,t}}async function zb(r,e,t){let n=de.join(r,"backup");return await lt.mkdir(n,{recursive:!0}),await lt.mkdir(de.join(n,"index"),{recursive:!0}),await lt.mkdir(de.join(n,"memory"),{recursive:!0}),await Zc(r,n,s=>s.endsWith(".json")||s.endsWith(".jsonl")),await Zc(e,de.join(n,"index")),await Zc(t,de.join(n,"memory")),n}async function Zc(r,e,t){try{let n=await lt.readdir(r,{withFileTypes:!0});for(let s of n){if(!s.isFile()||t&&!t(s.name))continue;let o=de.join(r,s.name),i=de.join(e,s.name);await lt.copyFile(o,i)}}catch(n){if(!v(n))throw n}}function Cm(r,e,t){switch(e){case"state":Wb(r,t);break;case"queue":Bb(r,t);break;case"ideas":Vb(r,t);break;case"shipped":Jb(r,t);break;case"metrics":qb(r,t);break;case"analysis":Kb(r,t);break}}function Wb(r,e){let t=$.getDb(r),n=t.prepare(`
|
|
282
304
|
INSERT OR REPLACE INTO tasks
|
|
283
305
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
284
306
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -289,235 +311,77 @@ ${te.bold(r)}`),console.log(te.dim("\u2500".repeat(r.length))),this)},stop(){ret
|
|
|
289
311
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
290
312
|
depends_on, started_at, completed_at, output, summary)
|
|
291
313
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
292
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,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];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,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
|
|
314
|
+
`),o=l((a,c)=>{if(!a||!a.id)return;n.run(a.id,a.description??a.parentDescription??"",a.type??null,c??a.status??"unknown",a.parentDescription??null,a.branch??null,a.linearId??null,a.linearUuid??null,a.sessionId??null,a.featureId??null,a.startedAt??new Date().toISOString(),a.completedAt??null,a.shippedAt??null,a.pausedAt??null,a.pauseReason??null,a.prUrl??null,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];s.run(m.id??`subtask-${d}`,a.id,m.description??"",m.status??"pending",m.domain??null,m.agent??null,d,m.dependsOn?JSON.stringify(m.dependsOn):null,m.startedAt??null,m.completedAt??null,m.output??null,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 Bb(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
293
315
|
INSERT OR REPLACE INTO queue_tasks
|
|
294
316
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
295
317
|
feature_id, feature_name)
|
|
296
318
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
297
|
-
`);for(let o of t)s.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function
|
|
319
|
+
`);for(let o of t)s.run(o.id,o.description??"",o.type??null,o.priority??null,o.section??null,o.createdAt??new Date().toISOString(),o.completed?1:0,o.completedAt??null,o.featureId??null,o.featureName??null)}function Vb(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
298
320
|
INSERT OR REPLACE INTO ideas
|
|
299
321
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
300
322
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
301
|
-
`);for(let o of t)s.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function
|
|
323
|
+
`);for(let o of t)s.run(o.id,o.text??"",o.status??"pending",o.priority??"medium",o.tags?JSON.stringify(o.tags):null,o.addedAt??new Date().toISOString(),o.convertedTo??null,o.details??null,JSON.stringify(o))}function Jb(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
302
324
|
INSERT OR REPLACE INTO shipped_features
|
|
303
325
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
304
326
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
305
|
-
`);for(let o of t)s.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function
|
|
327
|
+
`);for(let o of t)s.run(o.id,o.name??"",o.shippedAt??new Date().toISOString(),o.version??"0.0.0",o.description??null,o.type??null,o.duration??null,JSON.stringify(o))}function qb(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
306
328
|
INSERT OR REPLACE INTO metrics_daily
|
|
307
329
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
308
330
|
VALUES (?, ?, ?, ?, ?)
|
|
309
|
-
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function
|
|
331
|
+
`);for(let o of t)s.run(o.date,o.tokensSaved??0,o.syncs??0,o.avgCompressionRate??0,o.totalDuration??0)}function Kb(r,e){let n=$.getDb(r).prepare(`
|
|
310
332
|
INSERT OR REPLACE INTO analysis
|
|
311
333
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
312
334
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
313
|
-
`),s=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&s(e.draft,"draft"),e.sealed&&s(e.sealed,"sealed")}function
|
|
335
|
+
`),s=l((o,i)=>{o&&n.run(i,o.status??"unknown",o.commitHash??null,o.signature??null,o.sealedAt??null,o.analyzedAt??null,JSON.stringify(o))},"migrate");e.draft&&s(e.draft,"draft"),e.sealed&&s(e.sealed,"sealed")}function vm(r,e,t){e==="categories-cache"&&Yb(r,t)}function Yb(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let s=$.getDb(r).prepare(`
|
|
314
336
|
INSERT OR REPLACE INTO index_files
|
|
315
337
|
(path, categories, domain, score, size, mtime, language)
|
|
316
338
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
317
|
-
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function
|
|
339
|
+
`);for(let o of t)s.run(o.path,o.categories?JSON.stringify(o.categories):null,o.primaryDomain??null,o.path)}async function Xb(r,e,t){let n=de.join(e,"checksums.json"),s=await Kn(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=$.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 Qb(r,e,t){let n=de.join(e,"file-scores.json"),s=await Kn(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=$.getDb(r),a=i.prepare(`
|
|
318
340
|
INSERT OR REPLACE INTO index_files
|
|
319
341
|
(path, score, size, mtime, language, categories, domain)
|
|
320
342
|
VALUES (?, ?, ?, ?, NULL,
|
|
321
343
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
322
344
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
323
|
-
`);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function
|
|
324
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.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??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function
|
|
325
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.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(s){v(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function
|
|
326
|
-
`).filter(f=>f.trim());if(p.length===0){await
|
|
327
|
-
|
|
328
|
-
`)}
|
|
329
|
-
|
|
330
|
-
<!-- projectId: ${e} -->
|
|
331
|
-
<!-- Generated: ${new Date().toISOString()} -->
|
|
332
|
-
|
|
333
|
-
## PROJECT DATA
|
|
334
|
-
|
|
335
|
-
### Dependencies (${f.length+k.length})
|
|
336
|
-
|
|
337
|
-
**Production** (${f.length}):
|
|
338
|
-
${f.length>0?f.map(x=>`- ${x}: ${c.dependencies[x]}`).join(`
|
|
339
|
-
`):"_None_"}
|
|
340
|
-
|
|
341
|
-
**Dev** (${k.length}):
|
|
342
|
-
${k.length>0?k.map(x=>`- ${x}: ${c.devDependencies[x]}`).join(`
|
|
343
|
-
`):"_None_"}
|
|
344
|
-
|
|
345
|
-
### Scripts
|
|
346
|
-
|
|
347
|
-
${Object.keys(c.scripts).length>0?Object.entries(c.scripts).map(([x,P])=>`- \`${x}\`: ${P}`).join(`
|
|
348
|
-
`):"_None_"}
|
|
349
|
-
|
|
350
|
-
### Git
|
|
351
|
-
|
|
352
|
-
- Branch: ${a.branch}
|
|
353
|
-
- Commits: ${a.commits}
|
|
354
|
-
- Contributors: ${a.contributors}
|
|
355
|
-
- Uncommitted: ${a.hasChanges?"Yes":"No"}
|
|
356
|
-
|
|
357
|
-
**Recent:**
|
|
358
|
-
${a.recentCommits.length>0?a.recentCommits.slice(0,5).map(x=>`- \`${x.hash}\` ${x.message}`).join(`
|
|
359
|
-
`):"_None_"}
|
|
360
|
-
|
|
361
|
-
---
|
|
362
|
-
|
|
363
|
-
## CURRENT STATE
|
|
364
|
-
|
|
365
|
-
**Now:** ${m?m.description:"_No active task_"}
|
|
366
|
-
|
|
367
|
-
**Queue (${p.length}):**
|
|
368
|
-
${p.length>0?p.slice(0,10).map((x,P)=>`${P+1}. ${x.description}`).join(`
|
|
369
|
-
`):"_Empty_"}
|
|
370
|
-
|
|
371
|
-
**Active Features (${g.length}):**
|
|
372
|
-
${g.length>0?g.map(x=>`- ${x.name}`).join(`
|
|
373
|
-
`):"_None_"}
|
|
374
|
-
|
|
375
|
-
**Ideas (${o.length}):**
|
|
376
|
-
${o.length>0?o.slice(0,5).map(x=>`- ${x.title}`).join(`
|
|
377
|
-
`):"_None_"}
|
|
378
|
-
|
|
379
|
-
---
|
|
380
|
-
|
|
381
|
-
## AGENTS
|
|
382
|
-
|
|
383
|
-
${i.length>0?i.map(x=>`- **${x.name}**: ${x.role||"Specialist"}`).join(`
|
|
384
|
-
`):"_None_"}
|
|
385
|
-
|
|
386
|
-
---
|
|
387
|
-
|
|
388
|
-
## DATA LOCATION
|
|
389
|
-
|
|
390
|
-
\`\`\`
|
|
391
|
-
~/.prjct-cli/projects/${e}/
|
|
392
|
-
\u251C\u2500\u2500 data/ # JSON (source of truth)
|
|
393
|
-
\u2502 \u251C\u2500\u2500 project.json
|
|
394
|
-
\u2502 \u251C\u2500\u2500 tasks/
|
|
395
|
-
\u2502 \u251C\u2500\u2500 features/
|
|
396
|
-
\u2502 \u251C\u2500\u2500 ideas/
|
|
397
|
-
\u2502 \u2514\u2500\u2500 agents/
|
|
398
|
-
\u251C\u2500\u2500 context/ # MD (for Claude)
|
|
399
|
-
\u2502 \u251C\u2500\u2500 CLAUDE.md
|
|
400
|
-
\u2502 \u251C\u2500\u2500 now.md
|
|
401
|
-
\u2502 \u2514\u2500\u2500 queue.md
|
|
402
|
-
\u2514\u2500\u2500 sync/ # Sync state
|
|
403
|
-
\u2514\u2500\u2500 pending.json
|
|
404
|
-
\`\`\`
|
|
405
|
-
`;await Ws.writeFile(zs.join(r,"CLAUDE.md"),S,"utf-8")}async function Jb(r,e){let t=e.find(s=>s.status==="in_progress"),n=t?`# NOW
|
|
406
|
-
|
|
407
|
-
**Task:** ${t.description}
|
|
408
|
-
|
|
409
|
-
**Started:** ${t.startedAt||"Unknown"}
|
|
410
|
-
|
|
411
|
-
**Priority:** ${t.priority||"medium"}
|
|
412
|
-
`:`# NOW
|
|
413
|
-
|
|
414
|
-
_No active task. Use /p:now to start._
|
|
415
|
-
`;await Ws.writeFile(zs.join(r,"now.md"),n,"utf-8")}async function qb(r,e){let t=e.filter(s=>s.status==="pending"),n=`# QUEUE
|
|
416
|
-
|
|
417
|
-
${t.length>0?t.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}]`:""}`).join(`
|
|
418
|
-
`):"_Empty queue. Use /p:next to add tasks._"}
|
|
419
|
-
`;await Ws.writeFile(zs.join(r,"queue.md"),n,"utf-8")}async function Kb(r,e,t,n){let s=`# PROJECT SUMMARY
|
|
420
|
-
|
|
421
|
-
**Name:** ${e.name||"Unknown"}
|
|
422
|
-
**Version:** ${e.version||"N/A"}
|
|
423
|
-
**Stack:** ${e.techStack?.join(", ")||"Not detected"}
|
|
424
|
-
|
|
425
|
-
## Git
|
|
426
|
-
|
|
427
|
-
- Branch: ${t.branch}
|
|
428
|
-
- Commits: ${t.commits}
|
|
429
|
-
- Status: ${t.hasChanges?"Has uncommitted changes":"Clean"}
|
|
430
|
-
|
|
431
|
-
## Dependencies
|
|
432
|
-
|
|
433
|
-
- Production: ${Object.keys(n.dependencies).length}
|
|
434
|
-
- Dev: ${Object.keys(n.devDependencies).length}
|
|
435
|
-
`;await Ws.writeFile(zs.join(r,"summary.md"),s,"utf-8")}var Vr,vm=y(()=>{"use strict";me();Dt();Vr=zb(Gb);l(Cm,"generateContext");l(Wb,"getGitData");l(Bb,"getPackageData");l(Vb,"generateClaudeMd");l(Jb,"generateNowMd");l(qb,"generateQueueMd");l(Kb,"generateSummaryMd")});function Qc(r){if(zp.includes(r))return[r];let e=r.toLowerCase().replace(/[-_\s]/g,""),t=[];for(let[n,s]of Object.entries(yi))if(n!=="general"){for(let o of s)if(e.includes(o)||o.includes(e)){t.push(n);break}}return t.length>0?t:["general"]}var Xc,yi,Xn,Jr,qr,Kr=y(()=>{"use strict";ye();js();ie();Xc={frontend:[M.CODE_STYLE,M.FILE_STRUCTURE,M.ARCHITECTURE,M.TECH_STACK],backend:[M.CODE_STYLE,M.ARCHITECTURE,M.DEPENDENCIES,M.TECH_STACK],devops:[M.SHIP_WORKFLOW,M.TEST_BEHAVIOR,M.DEPENDENCIES,M.ARCHITECTURE],docs:[M.CODE_STYLE,M.NAMING_CONVENTION,M.FILE_STRUCTURE],testing:[M.TEST_BEHAVIOR,M.CODE_STYLE,M.DEPENDENCIES],database:[M.ARCHITECTURE,M.NAMING_CONVENTION,M.TECH_STACK,M.DEPENDENCIES],general:Object.values(M)},yi={frontend:["ui","ux","uxui","css","styling","component","layout","design","responsive","react","vue","svelte","angular","html","tailwind","sass","web","accessibility","a11y"],backend:["api","server","route","endpoint","rest","graphql","middleware","worker","queue","auth","hono","express","service","microservice"],devops:["ci","cd","docker","kubernetes","deploy","infra","infrastructure","monitoring","cloud","aws","gcp","azure","pipeline","helm","terraform"],docs:["documentation","readme","guide","tutorial","wiki","changelog","jsdoc","typedoc"],testing:["test","spec","e2e","unit","integration","coverage","mock","vitest","jest","playwright","cypress"],database:["db","sql","schema","migration","query","orm","prisma","mongo","postgres","redis","drizzle","sqlite"],general:[]};l(Qc,"resolveCanonicalDomains");Xn=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),n=V.getDoc(e,t);return n!==null?(this._data=n,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();V.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let n=await this.load(e),s=t(n);return this._data=s,await this.save(e),s}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Jr=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()}},qr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let n={ts:C(),...t,type:t.type};V.appendEvent(e,`history.${t.type}`,n)}async getRecentHistory(e,t=20){return V.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>JSON.parse(s.data))}}});var Yr,Zc=y(()=>{"use strict";ye();js();ie();Kr();Yr=class r extends Xn{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))t.contexts.length>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,n,s="",o={}){let i=await this.load(e),a=C();if(!i.decisions[t])i.decisions[t]={value:n,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[s].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===n?(c.count++,c.lastSeen=a,s&&!c.contexts.includes(s)&&(c.contexts.push(s),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Qo(c.count,c.userConfirmed)):(c.value=n,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let s=(await this.load(e)).decisions[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getDecision(e,t){let s=(await this.load(e)).decisions[t];return!s||s.confidence==="low"?null:{value:s.value,confidence:s.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,n){let s=await this.load(e),o=C();if(!s.workflows[t])s.workflows[t]={...n,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=s.workflows[t];i.count++,i.lastSeen=o,i.confidence=Qo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let s=(await this.load(e)).workflows[t];return s?(s.userConfirmed=!0,s.confidence="high",s.lastSeen=C(),await this.save(e),!0):!1}async getWorkflow(e,t){let s=(await this.load(e)).workflows[t];return!s||s.count<3?null:s}async setPreference(e,t,n,s={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=s.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:n,updatedAt:C(),confidence:Qo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let s=(await this.load(e)).preferences[t];return s?(s.userConfirmed=!0,s.confidence="high",s.updatedAt=C(),await this.save(e),!0):!1}async getPreference(e,t,n=null){return(await this.load(e)).preferences[t]?.value??n}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(n=>n.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),n=Date.now(),s=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();n-u>s&&o.push(a)}if(o.length===0)return 0;let i=V.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return V.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});var Qn,el=y(()=>{"use strict";Nt();js();ie();Kr();Qn=class extends Xn{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(M),t={};for(let n of e)t[n]=[];return t}_normalizeIndex(e){let t=Object.values(M);for(let n of t)e.index[n]||(e.index[n]=[])}_coerceTags(e){let t=new Set(Object.values(M));return e.filter(n=>t.has(n))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:n,tags:s=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(s),c=C(),u={id:Se(),title:t,content:n,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let d of a)i.index[d].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,n){let s=await this.load(e),o=s.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=s.memories[o],a=i.tags||[];if(n.title&&(i.title=n.title),n.content&&(i.content=n.content),n.tags){let c=this._coerceTags(n.tags);for(let u of a)s.index[u]=s.index[u].filter(d=>d!==t);for(let u of c)s.index[u].push(t);i.tags=c}return i.updatedAt=C(),await this.save(e),!0}async deleteMemory(e,t){let n=await this.load(e),s=n.memories.findIndex(i=>i.id===t);if(s===-1)return!1;let o=n.memories[s];for(let i of o.tags||[])n.index[i]&&(n.index[i]=n.index[i].filter(a=>a!==t));return n.memories.splice(s,1),await this.save(e),!0}async findByTags(e,t,n=!1){let s=await this.load(e),o=this._coerceTags(t);if(n)return s.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=s.index[a];for(let u of c)i.add(u)}return s.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let n=await this.load(e),s=t.toLowerCase();return n.memories.filter(o=>o.title.toLowerCase().includes(s)||o.content.toLowerCase().includes(s))}async getRelevantMemories(e,t,n=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let p of i.tags||[])c.includes(p)&&(a+=10);let d=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-d),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let p of m)i.content.toLowerCase().includes(p)&&(a+=2),i.title.toLowerCase().includes(p)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,n).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let n=await this.load(e),s=n.memories.length;if(s===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=n.memories.map(p=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,p.tags||[])),t.commandName){let x=this._getCommandTags(t.commandName),P=(p.tags||[]).filter(O=>x.includes(O));g.tagMatch=Math.min(20,P.length*8)}let k=(Date.now()-new Date(p.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),p.confidence?g.confidence=p.confidence==="high"?20:p.confidence==="medium"?12:5:p.observationCount&&(g.confidence=Math.min(20,p.observationCount*3)),t.taskDescription){let x=this._extractKeywordsFromText(t.taskDescription),P=0;for(let O of x)p.content.toLowerCase().includes(O)&&(P+=2),p.title.toLowerCase().includes(O)&&(P+=3);g.keywords=Math.min(15,P)}p.userTriggered&&(g.userTriggered=5);let S=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...p,relevanceScore:S,scoreBreakdown:g}}).filter(p=>p.relevanceScore>=i),d=c.sort((p,g)=>g.relevanceScore-p.relevanceScore).slice(0,o),m=d.length>0?Math.round(d.reduce((p,g)=>p+g.relevanceScore,0)/d.length):0;return{memories:d,metrics:{totalMemories:s,memoriesConsidered:c.length,memoriesReturned:d.length,filteringRatio:s>0?d.length/s:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){let n=this._resolveCanonicalDomains(e);if(n.length===0)return 0;let s=new Set;for(let a of n){let c=Xc[a];if(c)for(let u of c)s.add(u)}let o=new Set;for(let a of n){let c=yi[a];if(c)for(let u of c)o.add(u)}let i=0;for(let a of t){if(s.has(a)){i+=10;continue}let c=a.toLowerCase().replace(/[-_\s]/g,"");for(let u of o)if(c.includes(u)||u.includes(c)){i+=5;break}}return Math.min(25,i)}_resolveCanonicalDomains(e){return Qc(e)}_getCommandTags(e){return{ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE],task:[M.BRANCH_NAMING,M.CODE_STYLE],sync:[M.TECH_STACK,M.ARCHITECTURE,M.DEPENDENCIES],test:[M.TEST_BEHAVIOR],bug:[M.CODE_STYLE,M.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),n=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(s=>s.length>2&&!n.has(s))}_extractContextTags(e){let t=[],n={ship:[M.COMMIT_STYLE,M.SHIP_WORKFLOW,M.TEST_BEHAVIOR],feature:[M.ARCHITECTURE,M.CODE_STYLE],done:[M.SHIP_WORKFLOW],analyze:[M.TECH_STACK,M.ARCHITECTURE],spec:[M.ARCHITECTURE,M.CODE_STYLE]};return e.commandName&&n[e.commandName]&&t.push(...n[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let n=["the","a","an","is","are","to","for","and","or","in"];return t.filter(s=>s.length>2&&!n.includes(s))}async autoRemember(e,t,n,s=""){let i={commit_footer:[M.COMMIT_STYLE],branch_naming:[M.BRANCH_NAMING],test_before_ship:[M.TEST_BEHAVIOR,M.SHIP_WORKFLOW],preferred_agent:[M.AGENT_PREFERENCE],code_style:[M.CODE_STYLE],verbosity:[M.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${n}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${n}${s?`
|
|
436
|
-
Context: ${s}`:""}`,tags:i,userTriggered:!0})}async getAllMemories(e){return(await this.load(e)).memories}async getMemoryStats(e){let t=await this.load(e),n={};for(let[s,o]of Object.entries(t.index))n[s]=o.length;return{totalMemories:t.memories.length,userTriggered:t.memories.filter(s=>s.userTriggered).length,tagCounts:n,oldestMemory:t.memories[0]?.createdAt,newestMemory:t.memories[t.memories.length-1]?.createdAt}}}});var tl,Yb,Te,Bs=y(()=>{"use strict";Kr();Zc();el();Kr();Zc();el();tl=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new Qn,this._patternStore=new Yr,this._historyStore=new qr,this._sessionStore=new Jr}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,n){return this._semanticMemories.updateMemory(e,t,n)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,n){return this._semanticMemories.findByTags(e,t,n)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,n){return this._semanticMemories.getRelevantMemories(e,t,n)}autoRemember(e,t,n,s){return this._semanticMemories.autoRemember(e,t,n,s)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,n,s){return this._patternStore.recordDecision(e,t,n,s)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,n){return this._patternStore.recordWorkflow(e,t,n)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,n,s){return this._patternStore.setPreference(e,t,n,s)}getPreference(e,t,n){return this._patternStore.getPreference(e,t,n)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let n=this.getSession(`decision:${t}`);if(n!==void 0)return n;let s=await this.getDecision(e,t);return s?s.value:null}async learnDecision(e,t,n,s=""){this.setSession(`decision:${t}`,n),await this.recordDecision(e,t,n,s),await this.appendHistory(e,{type:"decision",key:t,value:n,context:s})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Yb=new tl,Te=Yb});import{exec as Xb}from"node:child_process";import vt from"node:fs/promises";import zt from"node:path";import{promisify as Qb}from"node:util";var Zn,nl,Zb,Ye,Pm=y(()=>{"use strict";_();Zn=Qb(Xb),nl=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=zt.join(this.projectPath,"package.json"),t=await vt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=zt.join(this.projectPath,"Cargo.toml");return await vt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readRequirements(){try{let e=zt.join(this.projectPath,"requirements.txt");return await vt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGoMod(){try{let e=zt.join(this.projectPath,"go.mod");return await vt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readGemfile(){try{let e=zt.join(this.projectPath,"Gemfile");return await vt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readMixExs(){try{let e=zt.join(this.projectPath,"mix.exs");return await vt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readPomXml(){try{let e=zt.join(this.projectPath,"pom.xml");return await vt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async readComposerJson(){try{let e=zt.join(this.projectPath,"composer.json"),t=await vt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=zt.join(this.projectPath,"pyproject.toml");return await vt.readFile(e,"utf-8")}catch(e){if(v(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await Zn('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(`
|
|
437
|
-
`).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await vt.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(n=>t.some(s=>s.test(n)))}catch(e){if(v(e))return[];throw e}}async listDirectories(){try{return(await vt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(v(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await Zn(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await Zn("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await Zn('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await Zn('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:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await Zn('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){try{return await vt.access(zt.join(this.projectPath,e)),!0}catch(t){if(v(t))return!1;throw t}}async readFile(e){try{let t=zt.join(this.projectPath,e);return await vt.readFile(t,"utf-8")}catch(t){if(v(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await Zn(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
438
|
-
`).filter(Boolean)}catch{return[]}}},Zb=new nl,Ye=Zb});import rl from"node:fs";import eC from"node:fs/promises";import wi from"node:path";function ol(){if(xm)return sl;xm=!0;let r=wi.join(pe,"dist","templates.json");try{let e=rl.readFileSync(r,"utf-8");return sl=JSON.parse(e),sl}catch{return null}}function nC(r){let e=es.indexOf(r);e>-1&&es.splice(e,1),es.push(r)}function sC(){for(;Vs.size>=tC&&es.length>0;){let r=es.shift();r&&Vs.delete(r)}}function ki(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
|
|
439
|
-
`).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:s.trim()}}async function Tm(r){if(Vs.has(r))return nC(r),Vs.get(r);let e,t=ol();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=wi.join(pe,"templates","commands",`${r}.md`);try{e=await eC.readFile(s,"utf-8")}catch{throw Fo.notFound(r)}}let n=ki(e);return sC(),Vs.set(r,n),es.push(r),n}async function rC(r){return(await Tm(r)).frontmatter["allowed-tools"]||[]}function oC(){Vs.clear(),es.length=0}function Pe(r){let e=ol();if(e?.[r])return e[r];let t=wi.join(pe,"templates",r);try{return rl.readFileSync(t,"utf-8")}catch{return null}}function Js(r){let e=ol();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=wi.join(pe,"templates",r);try{return rl.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var tC,Vs,es,sl,xm,iC,il,ts=y(()=>{"use strict";dn();gt();tC=50,Vs=new Map,es=[],sl=null,xm=!1;l(ol,"loadBundle");l(nC,"updateLruOrder");l(sC,"evictLru");l(ki,"parseFrontmatter");l(Tm,"load");l(rC,"getAllowedTools");l(oC,"clearCache");l(Pe,"getTemplateContent");l(Js,"listTemplates");iC={load:Tm,parseFrontmatter:ki,getAllowedTools:rC,clearCache:oC,getTemplateContent:Pe,listTemplates:Js},il=iC});import X from"node:fs/promises";import cl from"node:os";import Z from"node:path";async function aC(){try{let r=Pe("global/modules/module-config.json");if(r)return JSON.parse(r);let e=Z.join(pe,"templates/global/modules/module-config.json"),t=await X.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async function cC(r){let e=await aC();if(!e){let i=Pe("global/CLAUDE.md");if(i)return i;let a=Z.join(pe,"templates/global/CLAUDE.md");return X.readFile(a,"utf-8")}let t=r||e.default,n=e.profiles[t];if(!n&&!e.profiles[e.default]){let a=Pe("global/CLAUDE.md");if(a)return a;let c=Z.join(pe,"templates/global/CLAUDE.md");return X.readFile(c,"utf-8")}let s=(n||e.profiles[e.default]).modules,o=[];o.push("<!-- prjct:start - DO NOT REMOVE THIS MARKER -->");for(let i of s){let a=Pe(`global/modules/${i}`);if(a)o.push(""),o.push(a);else try{let c=Z.join(pe,"templates/global/modules",i),u=await X.readFile(c,"utf-8");o.push(""),o.push(u)}catch{console.warn(`Module not found: ${i}`)}}return o.push(""),o.push("<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"),o.push(""),o.join(`
|
|
440
|
-
`)}async function lC(){try{let r=Z.join(cl.homedir(),".prjct-cli","docs");await X.mkdir(r,{recursive:!0});let e=Js("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Pe(s);if(o){let i=Z.basename(s);await X.writeFile(Z.join(r,i),o,"utf-8")}}return{success:!0}}let t=Z.join(pe,"templates/global/docs"),n=await X.readdir(t);for(let s of n)if(s.endsWith(".md")){let o=Z.join(t,s),i=Z.join(r,s),a=await X.readFile(o,"utf-8");await X.writeFile(i,a,"utf-8")}return{success:!0}}catch(r){return{success:!1,error:w(r)}}}async function uC(){let r=(Je(),Et(mt)),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 X.mkdir(e.configDir,{recursive:!0});let s=Z.join(e.configDir,e.contextFile),o=Z.join(pe,"templates","global",e.contextFile),i="";try{let u=Pe(`global/${e.contextFile}`);u?i=u:i=await X.readFile(o,"utf-8")}catch{if(t==="claude")try{i=await cC()}catch{let d=Pe("global/CLAUDE.md");if(d)i=d;else{let m=Z.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}}else{let d=Pe("global/CLAUDE.md");if(d)i=d;else{let m=Z.join(pe,"templates/global/CLAUDE.md");i=await X.readFile(m,"utf-8")}t==="gemini"&&(i=i.replace(/Claude/g,"Gemini"))}}let a="",c=!1;try{a=await X.readFile(s,"utf-8"),c=!0}catch(u){if(v(u))c=!1;else throw u}if(c){let u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(a.includes(u)&&a.includes(d)){let p=a.substring(0,a.indexOf(u)),g=a.substring(a.indexOf(d)+d.length),f=i.substring(i.indexOf(u),i.indexOf(d)+d.length),k=p+f+g;return await X.writeFile(s,k,"utf-8"),{success:!0,action:"updated",path:s}}else{let p=`${a}
|
|
441
|
-
|
|
442
|
-
${i}`;return await X.writeFile(s,p,"utf-8"),{success:!0,action:"appended",path:s}}}else return await X.writeFile(s,i,"utf-8"),{success:!0,action:"created",path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}function Em(){let r=cl.homedir();return{claude:{commands:Z.join(r,".claude","commands","p"),config:Z.join(r,".claude"),router:Z.join(r,".claude","commands","p.md")},gemini:{commands:Z.join(r,".gemini","commands"),config:Z.join(r,".gemini"),router:Z.join(r,".gemini","commands","p.toml")}}}var al,dC,Ee,An=y(()=>{"use strict";ts();_();gt();l(aC,"loadModuleConfig");l(cC,"composeGlobalTemplate");l(lC,"installDocs");l(uC,"installGlobalConfig");al=class{static{l(this,"CommandInstaller")}homeDir;claudeCommandsPath="";claudeConfigPath="";templatesDir;_initialized=!1;constructor(){this.homeDir=cl.homedir(),this.templatesDir=Z.join(pe,"templates","commands")}async ensureInit(){if(this._initialized)return;let t=await(Je(),Et(mt)).getActiveProvider();t.name==="gemini"?this.claudeCommandsPath=Z.join(t.configDir,"commands"):this.claudeCommandsPath=Z.join(t.configDir,"commands","p"),this.claudeConfigPath=t.configDir,this._initialized=!0}async detectActiveProvider(){await this.ensureInit();try{return await X.access(this.claudeConfigPath),!0}catch(e){if(v(e))return!1;throw e}}async detectClaude(){return this.detectActiveProvider()}async getCommandFiles(){let e=Js("commands/");if(e.length>0)return e.filter(t=>t.endsWith(".md")).map(t=>t.replace("commands/",""));try{return(await X.readdir(this.templatesDir)).filter(n=>n.endsWith(".md"))}catch{return["init.md","now.md","done.md","ship.md","next.md","idea.md","recap.md","progress.md","stuck.md","context.md","analyze.md","sync.md","roadmap.md","task.md","git.md","fix.md","test.md","cleanup.md","design.md"]}}async installCommands(){let e=await this.detectActiveProvider(),n=await(Je(),Et(mt)).getActiveProvider();if(!e)return{success:!1,error:`${n.displayName} not detected. Please install it first.`};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let s=await this.getCommandFiles(),o=[],i=[];for(let a of s)try{let c=Z.join(this.claudeCommandsPath,a),u=Pe(`commands/${a}`);if(u)await X.writeFile(c,u,"utf-8");else{let d=Z.join(this.templatesDir,a),m=await X.readFile(d,"utf-8");await X.writeFile(c,m,"utf-8")}o.push(a.replace(".md",""))}catch(c){i.push({file:a,error:w(c)})}return{success:!0,installed:o,errors:i,path:this.claudeCommandsPath}}catch(s){return{success:!1,error:w(s)}}}async uninstallCommands(){try{let e=await this.getCommandFiles(),t=[],n=[];for(let s of e)try{let o=Z.join(this.claudeCommandsPath,s);await X.unlink(o),t.push(s.replace(".md",""))}catch(o){o.code!=="ENOENT"&&n.push({file:s,error:w(o)})}try{await X.rmdir(this.claudeCommandsPath)}catch{}return{success:!0,uninstalled:t,errors:n}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){if(!await this.detectClaude())return{installed:!1,claudeDetected:!1};try{await X.access(this.claudeCommandsPath);let n=(await X.readdir(this.claudeCommandsPath)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""));return{installed:n.length>0,claudeDetected:!0,commands:n,path:this.claudeCommandsPath}}catch(t){if(v(t))return{installed:!1,claudeDetected:!0,commands:[]};throw t}}async updateCommands(){console.log("Updating commands with latest templates...");let e=await this.installCommands();return e.success&&e.installed&&console.log(`Updated ${e.installed.length} commands`),e}async installToAll(){return await this.installCommands()}async getInstallPath(){return await this.ensureInit(),this.claudeCommandsPath}async verifyTemplate(e){if(Pe(`commands/${e}.md`))return!0;try{let n=Z.join(this.templatesDir,`${e}.md`);return await X.access(n),!0}catch(n){if(v(n))return!1;throw n}}async installRouter(){let t=await(Je(),Et(mt)).getActiveProvider(),n=t.name==="gemini"?"p.toml":"p.md";try{let s=Z.join(t.configDir,"commands",n);await X.mkdir(Z.dirname(s),{recursive:!0});let o=Pe(`commands/${n}`);if(o)return await X.writeFile(s,o,"utf-8"),!0;let i=Z.join(this.templatesDir,n),a=await X.readFile(i,"utf-8");return await X.writeFile(s,a,"utf-8"),!0}catch(s){if(v(s))return!1;throw s}}async removeLegacyCommands(){let t=await(Je(),Et(mt)).getActiveProvider(),n=Z.join(t.configDir,"commands"),s=0;try{let i=(await X.readdir(n)).filter(a=>a.startsWith("p.")&&a.endsWith(".md"));for(let a of i)try{await X.unlink(Z.join(n,a)),s++}catch{}}catch{}return s}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{await this.installRouter(),await X.mkdir(this.claudeCommandsPath,{recursive:!0});let t=await this.getCommandFiles(),n=[];try{n=await X.readdir(this.claudeCommandsPath),n=n.filter(o=>o.endsWith(".md"))}catch(o){if(v(o))n=[];else throw o}let s={success:!0,added:0,updated:0,removed:0,errors:[]};for(let o of t)try{let i=Z.join(this.claudeCommandsPath,o),a=n.includes(o),c=Pe(`commands/${o}`);if(c)await X.writeFile(i,c,"utf-8");else{let u=Z.join(this.templatesDir,o),d=await X.readFile(u,"utf-8");await X.writeFile(i,d,"utf-8")}a?s.updated++:s.added++}catch(i){s.errors.push({file:o,error:w(i)})}return await this.removeLegacyCommands(),s}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async installGlobalConfig(){return uC()}async installDocs(){return lC()}};l(Em,"getProviderPaths");dC=new al,Ee=dC});function pC(){return/<!-- prjct:preserve(?::([\w-]+))? -->/g}function mC(r){let e=[],t=pC(),n,s=0;for(;(n=t.exec(r))!==null;){let o=n.index,i=n[0],a=n[1]||`section-${s++}`,c=r.indexOf(ll,o+i.length);if(c===-1)continue;let u=c+ll.length,d=r.substring(o,u);e.push({id:a,content:d,startIndex:o,endIndex:u})}return e}function Xr(r,e){let t=mC(e);if(t.length===0)return r;let n=r.trimEnd();n+=`
|
|
443
|
-
|
|
444
|
-
---
|
|
445
|
-
|
|
446
|
-
`,n+=`## Your Customizations
|
|
447
|
-
|
|
448
|
-
`,n+=`_The sections below are preserved during sync. Edit freely._
|
|
449
|
-
|
|
450
|
-
`;for(let s of t)n+=s.content,n+=`
|
|
451
|
-
|
|
452
|
-
`;return`${n.trimEnd()}
|
|
453
|
-
`}function Qr(r){let e=[],t=r.match(/<!-- prjct:preserve(?::\w+)? -->/g)||[],n=r.match(/<!-- \/prjct:preserve -->/g)||[];t.length!==n.length&&e.push(`Mismatched preserve markers: ${t.length} opening, ${n.length} closing`);let s=0,o=0,i=r.split(`
|
|
454
|
-
`);for(let a=0;a<i.length;a++){let c=i[a];/<!-- prjct:preserve(?::\w+)? -->/.test(c)&&(s++,o=Math.max(o,s)),c.includes(ll)&&s--,s>1&&e.push(`Nested preserve blocks detected at line ${a+1} (not supported)`),s<0&&e.push(`Unexpected closing marker at line ${a+1}`)}return{valid:e.length===0,errors:e}}var ll,Si=y(()=>{"use strict";ll="<!-- /prjct:preserve -->";l(pC,"createPreserveStartRegex");l(mC,"extractPreservedSections");l(Xr,"mergePreservedSections");l(Qr,"validatePreserveBlocks")});function Zr(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&gC.has(e.code))return!0;if(e.code&&Am.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 Ci(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Am.has(e.code))}function Im(r,e,t){let n=jn.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(jn.delete(r),!1):!0:!1}function ul(r,e){let t=jn.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),jn.set(r,t)}function fC(r){jn.delete(r)}var gC,Am,jn,bi,jm,eo,vi=y(()=>{"use strict";gC=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Am=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Zr,"isTransientError");l(Ci,"isPermanentError");jn=new Map;l(Im,"isCircuitOpen");l(ul,"recordFailure");l(fC,"recordSuccess");bi=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(Im(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return fC(t),o}catch(o){if(n=o,s++,Ci(o))throw ul(t,this.options.circuitBreakerThreshold),o;if(!(Zr(o)&&s<this.options.maxAttempts))throw ul(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw ul(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return Zr(e)}isCircuitOpen(e){return Im(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return jn.get(e)}resetCircuit(e){jn.delete(e)}resetAllCircuits(){jn.clear()}},jm=new bi({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),eo=new bi({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Dm=y(()=>{"use strict";Si();vi()});import Pi from"node:fs/promises";import dl from"node:path";var pl,Rm,$m=y(()=>{"use strict";qe();me();_();pl=class{static{l(this,"AgentRouter")}projectId=null;projectPath=null;agentsPath=null;async initialize(e){this.projectId=await R.getProjectId(e),this.projectPath=e,this.agentsPath=E.getFilePath(this.projectId,"agents","")}async loadAvailableAgents(){if(!this.agentsPath)return[];try{let e=await Pi.readdir(this.agentsPath),t=[];for(let n of e)if(n.endsWith(".md")){let s=n.replace(".md",""),o=await Pi.readFile(dl.join(this.agentsPath,n),"utf-8");t.push({name:s,content:o})}return t}catch(e){return v(e)||console.error(`Agent loading error: ${w(e)}`),[]}}async getAgentNames(){return(await this.loadAvailableAgents()).map(t=>t.name)}async loadAgent(e){if(!this.agentsPath)return null;try{let t=dl.join(this.agentsPath,`${e}.md`),n=await Pi.readFile(t,"utf-8");return{name:e,content:n}}catch(t){return v(t)||console.error(`Agent load error: ${w(t)}`),null}}async buildAssignmentContext(e,t){let n=await this.getAgentNames();return{task:typeof e=="string"?e:e.description||"",availableAgents:n,projectPath:t,projectId:this.projectId,_template:"templates/agent-assignment.md"}}async logUsage(e,t,n){try{let s=dl.join(process.env.HOME||"",".prjct-cli","projects",this.projectId||"","agent-usage.jsonl"),o=`${JSON.stringify({timestamp:new Date().toISOString(),task:typeof e=="string"?e:e.description,agent:typeof t=="string"?t:t.name,projectId:this.projectId})}
|
|
455
|
-
`;await Pi.appendFile(s,o)}catch(s){v(s)||console.error(`Agent usage log error: ${w(s)}`)}}},Rm=pl});import Mm from"node:path";async function wC(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await T(Mm.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await T(Mm.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function kC(){return{...hC}}function SC(){return{...yC}}async function Om(){return xi||(xi=await wC()?kC():SC(),xi)}var xi,hC,yC,Fm=y(()=>{"use strict";xe();xi=null,hC={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",agentsDir:"~/.claude/agents",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},yC={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",agentsDir:null,commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(wC,"isClaudeEnvironment");l(kC,"getClaudeAgent");l(SC,"getTerminalAgent");l(Om,"detect")});var CC,ml=y(()=>{CC=Id({})});var vC,Ti,qs,_m=y(()=>{"use strict";$m();dn();Fm();vi();ml();vC=["claude"],Ti=class{static{l(this,"AgentService")}agent=null;agentInfo=null;agentRouter;constructor(){this.agentRouter=new Rm}async initialize(){return this.agent?this.agent:await jm.execute(async()=>{if(this.agentInfo=await Om(),!this.agentInfo?.isSupported)throw $r.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!vC.includes(e))throw $r.notSupported(this.agentInfo?.type??"unknown");let{default:t}=await CC(`../infrastructure/${e}-agent`);return this.agent=new t,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}async assignForTask(e,t,n){try{await this.agentRouter.initialize(t);let s=await this.agentRouter.getAgentNames();return s.length===0?{agent:null,routing:{confidence:0,reason:'No specialized agents available. Run "p. sync" to generate agents.',availableAgents:[]},_agenticNote:"AGENTIC: Claude reads orchestrator.md and decides how to proceed"}:{agent:null,routing:{confidence:0,reason:"AGENTIC: Claude will analyze task and select appropriate specialist agents",availableAgents:s},_agenticNote:`
|
|
456
|
-
AGENTIC EXECUTION:
|
|
457
|
-
- Read: templates/agentic/orchestrator.md
|
|
458
|
-
- Analyze task: "${e}"
|
|
459
|
-
- Available specialists: ${s.join(", ")}
|
|
460
|
-
- Claude decides which agent(s) to use
|
|
461
|
-
- Always prefer specialists over generalist
|
|
462
|
-
- Fragment complex tasks into subtasks
|
|
463
|
-
`}}catch{return{agent:null,routing:{confidence:0,reason:'Agent routing unavailable - run "p. sync" first',availableAgents:[]},_agenticNote:"AGENTIC: Suggest running p. sync to generate agents"}}}async getAvailableAgents(e){try{return await this.agentRouter.initialize(e),await this.agentRouter.getAgentNames()}catch{return[]}}reset(){this.agent=null,this.agentInfo=null}},qs=new Ti});var Ei,Ii,Nm=y(()=>{"use strict";Ei=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[`Analyze and plan: ${e}`,"Implement core functionality","Test and validate","Document changes"]}detectBugSeverity(e){let t=e.toLowerCase();return t.includes("crash")||t.includes("data loss")||t.includes("security")||t.includes("production down")?"critical":t.includes("broken")||t.includes("not working")||t.includes("error")||t.includes("blocking")?"high":t.includes("minor")||t.includes("cosmetic")||t.includes("typo")||t.includes("polish")?"low":"medium"}estimateComplexity(e){let t=e.split(/\s+/).length;return["refactor","migrate","redesign","overhaul","rewrite","integration","authentication","authorization"].some(o=>e.toLowerCase().includes(o))||t>30?{level:"high",hours:8}:t>10?{level:"medium",hours:4}:{level:"low",hours:1}}detectTaskType(e){let t=e.toLowerCase();return t.includes("bug")||t.includes("fix")||t.includes("error")?"bug":t.includes("refactor")||t.includes("improve")||t.includes("optimize")||t.includes("cleanup")?"improvement":t.includes("update")||t.includes("deps")||t.includes("config")||t.includes("chore")?"chore":"feature"}},Ii=new Ei});var Lm,PC,Ai,xC,Um=y(()=>{"use strict";zr();Lm=8e4,PC={payments:["payment","pay","stripe","billing","checkout","invoice","subscription","charge","refund","transaction","pricing","price"],auth:["auth","login","logout","signup","sign up","sign in","register","password","session","token","jwt","oauth","sso","permission","role","access","user"],api:["api","endpoint","route","rest","graphql","webhook","request","response","http","fetch","axios"],database:["database","db","model","schema","migration","query","sql","prisma","drizzle","mongoose","sequelize","typeorm"],frontend:["component","page","view","ui","button","form","modal","layout","style","css","react","vue","svelte","html"],testing:["test","spec","unit","e2e","cypress","jest","vitest","mocha","coverage","mock"],integrations:["integration","integrate","connect","sync","webhook","oauth","linear","jira","github","slack","discord"],config:["config","configuration","setting","env","environment","setup"],utilities:["util","utility","helper","lib","common","shared","tool"],services:["service","handler","processor","worker","job","queue","cron"],types:["type","interface","dto","schema","definition"]},Ai=class{static{l(this,"ContextSelector")}CHARS_PER_TOKEN=4;async selectForTask(e,t,n={}){let s=n.maxFiles||50,o=n.minScore||30,i=n.includeGeneral!==!1,a=n.tokenBudget||Lm,[c,u,d]=await Promise.all([Ze.readIndex(t),Ze.readDomains(t),Ze.readCategories(t)]);if(!c||!u||!d)return this.fallbackSelection(c?.relevantFiles||[],n);let m=this.detectTaskDomains(e,u.domains),p=new Set;for(let P of m){let O=d.domainIndex[P]||[];for(let F of O)p.add(F)}if(i&&d.domainIndex.general){let P=d.domainIndex.general.slice(0,10);for(let O of P)p.add(O)}let g=c.relevantFiles.filter(P=>p.has(P.path)&&P.score>=o);g.sort((P,O)=>O.score-P.score);let f=0,k=[];for(let P of g){let O=Math.ceil(P.size/this.CHARS_PER_TOKEN);if(f+O>a||k.length>=s)break;k.push(P),f+=O}let S=Math.ceil(c.relevantFiles.reduce((P,O)=>P+O.size,0)/this.CHARS_PER_TOKEN),x=S>0?(S-f)/S:0;return{files:k,domains:m,metrics:{totalFiles:c.relevantFiles.length,selectedFiles:k.length,compressionRate:x,estimatedTokensSaved:S-f}}}detectTaskDomains(e,t){let n=e.toLowerCase(),s=new Set;for(let[o,i]of Object.entries(PC))for(let a of i)if(n.includes(a)){s.add(o);break}for(let o of t){if(n.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(n.includes(i.toLowerCase())){s.add(o.name);break}}return s.size===0&&(s.add("services"),s.add("api")),Array.from(s)}async filterByDomains(e,t,n){let s=await Ze.readCategories(e);if(!s)return n||[];let o=new Set;for(let a of t){let c=s.domainIndex[a]||[];for(let u of c)o.add(u)}if(n)return n.filter(a=>o.has(a.path));let i=await Ze.readIndex(e);return i?i.relevantFiles.filter(a=>o.has(a.path)):[]}async getFilesDomains(e,t){return Ze.getFileCategories(e,t)}fallbackSelection(e,t){let n=t.maxFiles||50,s=t.minScore||30,o=t.tokenBudget||Lm,i=e.filter(d=>d.score>=s).sort((d,m)=>m.score-d.score),a=0,c=[];for(let d of i){let m=Math.ceil(d.size/this.CHARS_PER_TOKEN);if(a+m>o||c.length>=n)break;c.push(d),a+=m}let u=Math.ceil(e.reduce((d,m)=>d+m.size,0)/this.CHARS_PER_TOKEN);return{files:c,domains:[],metrics:{totalFiles:e.length,selectedFiles:c.length,compressionRate:u>0?(u-a)/u:0,estimatedTokensSaved:u-a}}}suggestRelatedDomains(e){let t=new Set,n={payments:["api","database","services"],auth:["api","database","users"],api:["services","types"],database:["types","services"],frontend:["types","utilities"],testing:["services","api"]};for(let s of e){let o=n[s];if(o)for(let i of o)e.includes(i)||t.add(i)}return Array.from(t)}},xC=new Ai});import Hm from"node:path";var gl,ji,TC,Gm=y(()=>{"use strict";zr();ie();gl=[{pattern:/\b(payment|stripe|billing|checkout|invoice)/i,domain:"payments"},{pattern:/\b(auth|login|signup|user|session|password|oauth)/i,domain:"auth"},{pattern:/\b(api|endpoint|route|controller)/i,domain:"api"},{pattern:/\b(model|schema|migration|database|db|prisma|drizzle)/i,domain:"database"},{pattern:/\b(component|page|view|layout|ui|button|form|modal)/i,domain:"frontend"},{pattern:/\b(test|spec|__tests__|e2e|cypress)/i,domain:"testing"},{pattern:/\b(config|setting|env)/i,domain:"config"},{pattern:/\b(util|helper|lib|common|shared)/i,domain:"utilities"},{pattern:/\b(service|handler|processor|worker)/i,domain:"services"},{pattern:/\b(type|interface|dto)/i,domain:"types"}],ji=class{static{l(this,"FileCategorizer")}batchSize;maxDomains;constructor(e={}){this.batchSize=e.batchSize||20,this.maxDomains=e.maxDomains||15}async analyzeProject(e,t,n={}){let s=n.useLLM!==!1,o=s?await this.discoverDomainsWithLLM(e,t):this.discoverDomainsHeuristic(t),i=s?await this.categorizeFilesWithLLM(t,o):this.categorizeFilesHeuristic(t,o);for(let a of o)a.fileCount=i.filter(c=>c.primaryDomain===a.name).length;return n.projectId&&await this.saveToCache(n.projectId,o,i),{domains:o,categories:i,metrics:{totalFiles:t.length,categorizedFiles:i.length,domainsDiscovered:o.length,llmCalls:s?Math.ceil(t.length/this.batchSize)+1:0,usedHeuristics:!s}}}async discoverDomainsWithLLM(e,t){return this.discoverDomainsHeuristic(t)}async categorizeFilesWithLLM(e,t){return this.categorizeFilesHeuristic(e,t)}discoverDomainsHeuristic(e){let t=new Map,n=new Map;for(let i of e){let a=i.path.toLowerCase();for(let{pattern:c,domain:u}of gl)if(c.test(a)){t.set(u,(t.get(u)||0)+1),n.has(u)||n.set(u,new Set);let d=Hm.dirname(i.path);n.get(u).add(`**/${Hm.basename(d)}/**`)}}let s=this.extractDirectoryDomains(e);for(let[i,a]of s)t.set(i,(t.get(i)||0)+a);let o=[];for(let[i,a]of t)if(a>=2){let c=gl.find(u=>u.domain===i);o.push({name:i,description:`Files related to ${i}`,keywords:c?[i]:[i],filePatterns:Array.from(n.get(i)||[]),fileCount:a})}return o.sort((i,a)=>a.fileCount-i.fileCount).slice(0,this.maxDomains)}extractDirectoryDomains(e){let t=new Map;for(let n of e){let s=n.path.split("/");for(let o of s.slice(0,-1)){let i=o.toLowerCase();["src","lib","app","core","dist","build"].includes(i)||i.length>2&&!i.startsWith(".")&&t.set(i,(t.get(i)||0)+1)}}return t}categorizeFilesHeuristic(e,t){let n=[],s=C();for(let o of e){let i=[],a=o.path.toLowerCase();for(let m of t){let p=0;for(let g of m.keywords)a.includes(g.toLowerCase())&&(p+=1);for(let{pattern:g,domain:f}of gl)f===m.name&&g.test(a)&&(p+=2);for(let g of m.filePatterns){let f=g.replace(/\*\*/g,"").replace(/\//g,"");a.includes(f.toLowerCase())&&(p+=1)}p>0&&i.push({domain:m.name,score:p})}i.sort((m,p)=>p.score-m.score);let c=i.length>0?i.slice(0,3).map(m=>m.domain):["general"],u=c[0],d=i.length>0?Math.min(1,i[0].score/5):.1;n.push({path:o.path,categories:c,primaryDomain:u,confidence:d,categorizedAt:s,method:"heuristic"})}return n}async saveToCache(e,t,n){let s=C(),o={version:Gt,projectId:e,domains:t,discoveredAt:s};await Ze.writeDomains(e,o);let i={};for(let c of n)for(let u of c.categories)i[u]||(i[u]=[]),i[u].push(c.path);let a={version:Gt,lastUpdate:s,fileCategories:n,domainIndex:i};await Ze.writeCategories(e,a)}async loadFromCache(e){let[t,n]=await Promise.all([Ze.readDomains(e),Ze.readCategories(e)]);return!t||!n?null:{domains:t.domains,categories:n.fileCategories,metrics:{totalFiles:n.fileCategories.length,categorizedFiles:n.fileCategories.length,domainsDiscovered:t.domains.length,llmCalls:0,usedHeuristics:n.fileCategories[0]?.method==="heuristic"}}}async updateFilesCategories(e,t,n={}){let s=await Ze.readDomains(e);if(!s)return(await this.analyzeProject("",t,{...n,projectId:e})).categories;let o=n.useLLM!==!1?await this.categorizeFilesWithLLM(t,s.domains):this.categorizeFilesHeuristic(t,s.domains),i=await Ze.readCategories(e);if(i){let a=new Set(t.map(p=>p.path)),u=[...i.fileCategories.filter(p=>!a.has(p.path)),...o],d={};for(let p of u)for(let g of p.categories)d[g]||(d[g]=[]),d[g].push(p.path);let m={version:Gt,lastUpdate:C(),fileCategories:u,domainIndex:d};await Ze.writeCategories(e,m)}return o}},TC=new ji});import fl from"node:path";var hl,EC,IC,Di,zm,yl=y(()=>{"use strict";hl=30,EC=[/^package\.json$/,/^tsconfig.*\.json$/,/^\.env(\..*)?$/,/^\.eslintrc.*$/,/^\.prettierrc.*$/,/^vite\.config\.\w+$/,/^next\.config\.\w+$/,/^webpack\.config\.\w+$/,/^rollup\.config\.\w+$/,/^jest\.config\.\w+$/,/^vitest\.config\.\w+$/,/^tailwind\.config\.\w+$/,/^postcss\.config\.\w+$/,/^Cargo\.toml$/,/^go\.mod$/,/^pyproject\.toml$/,/^requirements\.txt$/,/^Dockerfile$/,/^docker-compose\.ya?ml$/,/^\.github\/workflows\/.*\.ya?ml$/],IC=[/^index\.\w+$/,/^main\.\w+$/,/^app\.\w+$/,/^server\.\w+$/,/^router\.\w+$/,/^routes\.\w+$/,/^api\.\w+$/,/^schema\.\w+$/,/^types?\.\w+$/,/^constants?\.\w+$/,/^config\.\w+$/,/^utils?\.\w+$/,/^helpers?\.\w+$/,/README\.md$/i,/CHANGELOG\.md$/i],Di=class{static{l(this,"FileScorer")}scoreFile(e,t){let n={recency:this.calculateRecency(e,t),centrality:this.calculateCentrality(e,t),configRelevance:this.calculateConfigRelevance(e),nameRelevance:this.calculateNameRelevance(e),sizeOptimal:this.calculateSizeOptimal(e,t),gitActivity:this.calculateGitActivity(e,t)},s=Object.values(n).reduce((o,i)=>o+i,0);return{path:e.path,score:Math.min(100,Math.max(0,s)),factors:n}}scoreAll(e){let t=[];for(let n of e.allFiles.values())t.push(this.scoreFile(n,e));return t.sort((n,s)=>s.score-n.score)}getRelevantFiles(e,t=hl){return this.scoreAll(e).filter(n=>n.score>=t)}calculateRecency(e,t){let n=(t.now.getTime()-e.mtime.getTime())/864e5;return n<1?20:n<7?15:n<30?10:n<90?5:0}calculateCentrality(e,t){let n=e.importedBy?.length||0,s=t.allFiles.size;if(s===0)return 0;let o=n/s;return o>=.2?25:o>=.1?20:o>=.05?15:n>=5?10:n>=2?5:0}calculateConfigRelevance(e){let t=fl.basename(e.path);for(let n of EC)if(n.test(t)||n.test(e.path))return 20;return 0}calculateNameRelevance(e){let t=fl.basename(e.path);for(let s of IC)if(s.test(t))return 15;let n=fl.dirname(e.path);return n.includes("/api/")||n.includes("/routes/")||n.includes("/components/")&&t.startsWith("index")?10:n.includes("/pages/")||n.includes("/app/")?8:0}calculateSizeOptimal(e,t){let n=e.size;return n<100?2:n>=500&&n<=5e4?10:n>5e4&&n<=2e5?5:n>2e5?0:5}calculateGitActivity(e,t){let n=e.recentCommits||0;if(t.maxRecentCommits===0)return 0;let s=n/t.maxRecentCommits;return s>=.5?10:s>=.25?7:s>=.1?5:n>0?2:0}},zm=new Di});import{execSync as wl}from"node:child_process";var Ri,kl,$i,Ks,Mi=y(()=>{"use strict";Gr();Ri={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"}},kl=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 n=Ri[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=Ri[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new $i(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=Ri[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
|
|
464
|
-
`);throw new $i({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
465
|
-
${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(Ri),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=wl(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:Hr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){try{return wl(`${e} --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return wl(`${e} -v`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Hr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Date.now()-t>this.cacheTimeout?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},$i=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}},Ks=new kl});import{exec as AC}from"node:child_process";import{promisify as jC}from"node:util";var nF,Wm=y(()=>{"use strict";pn();Mi();nF=jC(AC)});var Oi,ft,Sl=y(()=>{"use strict";qe();Tn();ye();Oi=class{static{l(this,"MemoryService")}async log(e,t,n,s){try{let o=await R.getProjectId(e);if(!o)return;V.appendEvent(o,`memory.${t}`,{...n,author:s})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let n=await R.getProjectId(e);return n?V.query(n,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async search(e,t,n=50){let s=await this.getRecent(e,1e3),o=t.toLowerCase();return s.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-n)}async getByAction(e,t,n=50){try{let s=await R.getProjectId(e);return s?V.query(s,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,n).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async clear(e){try{let t=await R.getProjectId(e);if(!t)return;V.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 V.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n<=Zt.MEMORY_MAX_ENTRIES)return 0;let s=n-Zt.MEMORY_MAX_ENTRIES,o=V.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",s);Ct.archiveMany(e,o.map((a,c)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||c}`,entityData:{type:a.type,data:JSON.parse(a.data),timestamp:a.timestamp},summary:a.type.replace("memory.",""),reason:"overflow"})));let i=o[o.length-1]?.id;return i!==void 0&&V.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},ft=new Oi});import Fi from"node:fs/promises";import Fe from"node:path";var to,bl=y(()=>{"use strict";me();xe();to=class{static{l(this,"NestedContextResolver")}rootPath;monoInfo=null;constructor(e){this.rootPath=Fe.resolve(e)}async initialize(){this.monoInfo=await E.detectMonorepo(this.rootPath)}async discoverContextFiles(){let e=[],t=Fe.join(this.rootPath,"PRJCT.md");if(await T(t)){let s=await this.loadContext(t,null);e.push(s)}if(this.monoInfo?.isMonorepo)for(let s of this.monoInfo.packages){let o=Fe.join(s.path,"PRJCT.md");if(await T(o)){let i=e.find(c=>c.depth===0)||null,a=await this.loadContext(o,i,s);e.push(a),i&&i.children.push(a)}}let n=await this.scanForNestedContexts(this.rootPath,e);return e.push(...n),e}async loadContext(e,t,n=null){let s=await Fi.readFile(e,"utf-8"),o=Fe.relative(this.rootPath,e),i=o.split(Fe.sep).length-1;return{path:e,relativePath:o,depth:i,parent:t,children:[],content:s,sections:this.parseSections(s),package:n}}parseSections(e){let t=[],n=e.split(`
|
|
466
|
-
`),s=null,o=[];for(let i of n){let a=i.match(/^##\s+(.+)$/);if(a){s&&(s.content=o.join(`
|
|
467
|
-
`).trim(),t.push(s));let c=a[1],u=c.includes("@override")||c.includes("(override)");s={name:c.replace(/@override|\(override\)/gi,"").trim(),content:"",override:u},o=[]}else s&&o.push(i)}return s&&(s.content=o.join(`
|
|
468
|
-
`).trim(),t.push(s)),t}async scanForNestedContexts(e,t){let n=[],s=new Set(t.map(i=>i.path)),o=l(async(i,a)=>{if(!(a>5))try{let c=await Fi.readdir(i,{withFileTypes:!0});for(let u of c)if(!(u.name.startsWith(".")||u.name==="node_modules"||u.name==="dist"||u.name==="build"||u.name==="coverage")&&u.isDirectory()){let d=Fe.join(i,u.name),m=Fe.join(d,"PRJCT.md");if(await T(m)&&!s.has(m)){let p=this.findParentContext(m,t.concat(n)),g=await this.loadContext(m,p);n.push(g),s.add(m),p&&p.children.push(g)}await o(d,a+1)}}catch{}},"scan");return await o(e,0),n}findParentContext(e,t){let n=Fe.dirname(e),s=[...t].sort((o,i)=>i.depth-o.depth);for(let o of s){let i=Fe.dirname(o.path);if(n.startsWith(i)&&n!==i)return o}return null}async resolveContextForPath(e){let t=await this.discoverContextFiles(),n=Fe.resolve(e),s=null;for(let a of t){let c=Fe.dirname(a.path);n.startsWith(c)&&(!s||a.depth>s.depth)&&(s=a)}if(!s)return{content:"",sources:[],overrides:[]};let o=[],i=s;for(;i;)o.unshift(i),i=i.parent;return this.mergeContextChain(o)}mergeContextChain(e){let t=new Map,n=[],s=[];for(let i of e){n.push(i.relativePath);for(let a of i.sections)if(a.override||!t.has(a.name))t.set(a.name,a.content),a.override&&s.push(`${i.relativePath}:${a.name}`);else{let c=t.get(a.name)||"";t.set(a.name,`${c}
|
|
469
|
-
|
|
470
|
-
${a.content}`)}}let o=[];for(let[i,a]of t)o.push(`## ${i}
|
|
471
|
-
|
|
472
|
-
${a}`);return{content:o.join(`
|
|
473
|
-
|
|
474
|
-
---
|
|
475
|
-
|
|
476
|
-
`),sources:n,overrides:s}}async getPackageContext(e){if(!this.monoInfo?.isMonorepo)return null;let t=this.monoInfo.packages.find(n=>n.name===e);return t?this.resolveContextForPath(t.path):null}async getAllPackageContexts(){let e=new Map;if(!this.monoInfo?.isMonorepo)return e;for(let t of this.monoInfo.packages){let n=await this.resolveContextForPath(t.path);e.set(t.name,n)}return e}async discoverAgentFiles(){let e=[],t=Fe.join(this.rootPath,"AGENTS.md");if(await T(t)){let s=await this.loadAgents(t,null);e.push(s)}if(this.monoInfo?.isMonorepo)for(let s of this.monoInfo.packages){let o=Fe.join(s.path,"AGENTS.md");if(await T(o)){let i=e.find(c=>c.depth===0)||null,a=await this.loadAgents(o,i,s);e.push(a),i&&i.children.push(a)}}let n=await this.scanForNestedAgents(this.rootPath,e);return e.push(...n),e}async loadAgents(e,t,n=null){let s=await Fi.readFile(e,"utf-8"),o=Fe.relative(this.rootPath,e),i=o.split(Fe.sep).length-1;return{path:e,relativePath:o,depth:i,parent:t,children:[],content:s,agents:this.parseAgents(s),package:n}}parseAgents(e){let t=[],n=e.split(`
|
|
477
|
-
`),s=null,o=null,i=[],a=l(()=>{if(s){if(o){let c=i.join(`
|
|
478
|
-
`).trim();switch(o.toLowerCase()){case"triggers":s.triggers=this.parseListItems(c);break;case"rules":s.rules=this.parseListItems(c);break;case"patterns":s.patterns=this.parseCodeBlocks(c);break;case"examples":s.examples=this.parseListItems(c);break;case"domain":s.domain=c;break}}else{let c=i.join(`
|
|
479
|
-
`).trim();c&&!s.description&&(s.description=c)}i=[]}},"saveCurrentContent");for(let c of n){let u=c.match(/^##\s+([^#].+)$/);if(u){s&&(a(),t.push(s));let m=u[1],p=m.includes("@override")||m.includes("(override)");s={name:m.replace(/@override|\(override\)/gi,"").trim(),description:"",override:p},o=null,i=[];continue}let d=c.match(/^###\s+(.+)$/);if(d&&s){a(),o=d[1].trim(),i=[];continue}s&&i.push(c)}return s&&(a(),t.push(s)),t}parseListItems(e){return e.split(`
|
|
480
|
-
`).filter(t=>t.match(/^\s*[-*]\s+/)).map(t=>t.replace(/^\s*[-*]\s+/,"").trim()).filter(t=>t.length>0)}parseCodeBlocks(e){let t=[],n=/```[\w]*\n([\s\S]*?)```/g,s;for(;(s=n.exec(e))!==null;)t.push(s[1].trim());return t.length===0&&e.trim()&&t.push(e.trim()),t}async scanForNestedAgents(e,t){let n=[],s=new Set(t.map(i=>i.path)),o=l(async(i,a)=>{if(!(a>5))try{let c=await Fi.readdir(i,{withFileTypes:!0});for(let u of c)if(!(u.name.startsWith(".")||u.name==="node_modules"||u.name==="dist"||u.name==="build"||u.name==="coverage")&&u.isDirectory()){let d=Fe.join(i,u.name),m=Fe.join(d,"AGENTS.md");if(await T(m)&&!s.has(m)){let p=this.findParentAgents(m,t.concat(n)),g=await this.loadAgents(m,p);n.push(g),s.add(m),p&&p.children.push(g)}await o(d,a+1)}}catch{}},"scan");return await o(e,0),n}findParentAgents(e,t){let n=Fe.dirname(e),s=[...t].sort((o,i)=>i.depth-o.depth);for(let o of s){let i=Fe.dirname(o.path);if(n.startsWith(i)&&n!==i)return o}return null}async resolveAgentsForPath(e){let t=await this.discoverAgentFiles(),n=Fe.resolve(e),s=null;for(let a of t){let c=Fe.dirname(a.path);n.startsWith(c)&&(!s||a.depth>s.depth)&&(s=a)}if(!s)return{agents:[],sources:[],overrides:[]};let o=[],i=s;for(;i;)o.unshift(i),i=i.parent;return this.mergeAgentsChain(o)}mergeAgentsChain(e){let t=new Map,n=[],s=[];for(let o of e){n.push(o.relativePath);for(let i of o.agents){let a=t.get(i.name);if(i.override||!a)t.set(i.name,{...i}),i.override&&a&&s.push(`${o.relativePath}:${i.name}`);else{let c={...a};i.triggers&&(c.triggers=[...a.triggers||[],...i.triggers]),i.rules&&(c.rules=[...a.rules||[],...i.rules]),i.patterns&&(c.patterns=[...a.patterns||[],...i.patterns]),i.examples&&(c.examples=[...a.examples||[],...i.examples]),i.description&&(c.description=`${a.description}
|
|
481
|
-
|
|
482
|
-
${i.description}`),i.domain&&(c.domain=i.domain),t.set(i.name,c)}}}return{agents:Array.from(t.values()),sources:n,overrides:s}}async getPackageAgents(e){if(!this.monoInfo?.isMonorepo)return null;let t=this.monoInfo.packages.find(n=>n.name===e);return t?this.resolveAgentsForPath(t.path):null}async getAllPackageAgents(){let e=new Map;if(!this.monoInfo?.isMonorepo)return e;for(let t of this.monoInfo.packages){let n=await this.resolveAgentsForPath(t.path);e.set(t.name,n)}return e}}});import{exec as DC}from"node:child_process";import{promisify as RC}from"node:util";var SF,Bm=y(()=>{"use strict";zr();ie();yl();SF=RC(DC)});function it(r,e,t=2){return`${"#".repeat(t)} ${r}
|
|
483
|
-
${e}`}function Wt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
|
|
484
|
-
`)}function Cl(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.duration&&e.push(`Duration: ${r.duration}`);let t=e.length>0?`
|
|
485
|
-
${e.join(" | ")}`:"";return`## ${r.description}${t}`}function vl(r,e){return`### Subtasks
|
|
345
|
+
`);i.transaction(()=>{for(let c of o)a.run(c.path,c.score??0,c.size??null,c.mtime??null,c.path,c.path)})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Zb(r,e,t){let n=de.join(e,"events.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
|
|
346
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=$.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??null,p=u.timestamp??u.ts??new Date().toISOString();a.run(d,m,c,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){v(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function eC(r,e,t){let n=de.join(e,"learnings.jsonl");try{let o=(await lt.readFile(n,"utf-8")).split(`
|
|
347
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=$.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(s){v(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function tC(r,e,t,n){let s=l(async(i,a)=>{try{await lt.unlink(i)}catch(c){v(c)||n.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of tl)await s(de.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 s(de.join(e,i),`cleanup:index/${i}`);await s(de.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await s(de.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}async function Kn(r){try{let e=await lt.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(v(e)||e instanceof SyntaxError)return null;throw e}}async function vi(r){let e=A.getGlobalProjectPath(r),t=de.join(e,"storage"),n=0;$.getDb(r);for(let{filename:u,key:d}of tl){let m=de.join(t,u),p=await Kn(m);if(p!==null){$.setDoc(r,d,p),Cm(r,d,p);try{await lt.unlink(m)}catch{}n++}}let s=de.join(e,"project.json"),o=await Kn(s);if(o!==null){$.setDoc(r,"project",o);try{await lt.unlink(s)}catch{}n++}let i=de.join(e,"memory");for(let u of["events.jsonl","learnings.jsonl"]){let d=de.join(i,u);try{let p=(await lt.readFile(d,"utf-8")).split(`
|
|
348
|
+
`).filter(f=>f.trim());if(p.length===0){await lt.unlink(d),n++;continue}let g=$.getDb(r);if(u==="events.jsonl"){let f=g.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let b=JSON.parse(S);f.run(b.type??b.action??"unknown",b.taskId??b.task_id??null,S,b.timestamp??b.ts??new Date().toISOString())}catch{}})()}else{let f=g.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");g.transaction(()=>{for(let S of p)try{let b=JSON.parse(S),D=`learning:${b.taskId??b.timestamp??Date.now()}`,x=b.tags;f.run(D,x?.[0]??null,S,1,b.timestamp??new Date().toISOString())}catch{}})()}await lt.unlink(d),n++}catch{}}let a=de.join(e,"index"),c=[...el.map(u=>u.filename),"checksums.json","file-scores.json"];for(let u of c){let d=de.join(a,u),m=await Kn(d);if(m===null)continue;let p=el.find(g=>g.filename===u);p&&($.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",p.key,JSON.stringify(m),new Date().toISOString()),vm(r,p.key,m));try{await lt.unlink(d)}catch{}n++}return n}var tl,el,xi=y(()=>{"use strict";Ce();_();he();tl=[{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"}],el=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Wr,"migrateJsonToSqlite");l(zb,"createBackup");l(Zc,"copyFiles");l(Cm,"populateNormalized");l(Wb,"populateTasksFromState");l(Bb,"populateQueueTasks");l(Vb,"populateIdeas");l(Jb,"populateShippedFeatures");l(qb,"populateMetricsDaily");l(Kb,"populateAnalysis");l(vm,"populateIndexTables");l(Yb,"populateCategoriesIndex");l(Xb,"migrateChecksums");l(Qb,"migrateFileScores");l(Zb,"migrateEventsJsonl");l(eC,"migrateLearningsJsonl");l(tC,"cleanupJsonFiles");l(Kn,"readJsonSafe");l(vi,"sweepLegacyJson")});var xm=y(()=>{"use strict";uc();_()});var nl,sl,rl=y(()=>{"use strict";vs();Qt();nl=class extends ze{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:kp,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}},sl=new nl});var Ut=y(()=>{"use strict";Ci();bn();he();Ar();Gr();zr();xi();jr();Dr();$r();xm();Qt();rl()});function st(r,e,t=2){return`${"#".repeat(t)} ${r}
|
|
349
|
+
${e}`}function Gt(r,e=!1){return r.map((t,n)=>e?`${n+1}. ${t}`:`- ${t}`).join(`
|
|
350
|
+
`)}function ol(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.duration&&e.push(`Duration: ${r.duration}`);let t=e.length>0?`
|
|
351
|
+
${e.join(" | ")}`:"";return`## ${r.description}${t}`}function il(r,e){return`### Subtasks
|
|
486
352
|
${r.map((n,s)=>{let o=n.status==="completed",i=s===e?" \u2190 current":"";return`${o?"- [x]":"- [ ]"} ${n.description}${i}`}).join(`
|
|
487
|
-
`)}`}function
|
|
488
|
-
${
|
|
353
|
+
`)}`}function Pm(r){return`### Rules
|
|
354
|
+
${Gt(r)}`}function Qe(r){return`### Next
|
|
489
355
|
${r.map(t=>`- ${t.label}: \`${t.command}\``).join(`
|
|
490
|
-
`)}`}function
|
|
491
|
-
`)}function
|
|
492
|
-
${e}`:`## ${r} \u2713`}function
|
|
356
|
+
`)}`}function zt(r){let e=[];for(let[t,n]of Object.entries(r))n!=null&&e.push(`- **${t}:** ${n}`);return e.join(`
|
|
357
|
+
`)}function en(r,e){return e?`## ${r} \u2713
|
|
358
|
+
${e}`:`## ${r} \u2713`}function Tn(r){return`> \u26A0\uFE0F ${r}`}function Ie(...r){return r.filter(Boolean).join(`
|
|
493
359
|
|
|
494
|
-
`)}var
|
|
495
|
-
Next:`));for(let o of s){let i=
|
|
360
|
+
`)}var _s=y(()=>{"use strict";l(st,"mdSection");l(Gt,"mdList");l(ol,"mdTaskHeader");l(il,"mdSubtasks");l(Pm,"mdRules");l(Qe,"mdNextSteps");l(zt,"mdStats");l(en,"mdDone");l(Tn,"mdWarn");l(Ie,"mdJoin")});import Br from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Em[r]||"idle",n=Hn.getValidCommands(t);if(n.length===0)return;let s=n.map(o=>({cmd:`p. ${o}`,desc:Tm[o]||o}));console.log(Br.dim(`
|
|
361
|
+
Next:`));for(let o of s){let i=Br.cyan(o.cmd.padEnd(12));console.log(Br.dim(` ${i} \u2192 ${o.desc}`))}}function Pi(r){let e=Em[r]||"idle";return Hn.getValidCommands(e).map(n=>({cmd:`p. ${n}`,desc:Tm[n]||n}))}function Vr(r){let e=Hn.getStateInfo(r);console.log(Br.dim(`\u{1F4CD} State: ${Br.white(r.toUpperCase())} - ${e.description}`))}var Tm,Em,Ns=y(()=>{"use strict";fc();Tm={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"},Em={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(bt,"showNextSteps");l(Pi,"getNextSteps");l(Vr,"showStateInfo")});import It from"chalk";import Yn from"prompts";var al,Im,Ls,Am=y(()=>{"use strict";Nt();al=[{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."}],Im=[{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"}],Ls=class{static{l(this,"OnboardingWizard")}projectPath;currentStep=0;totalSteps=5;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,Yn.override({})}async run(){this.printWelcome();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(this.currentStep++,this.printStepHeader(t.title),!await t.run()||this.aborted)return this.buildResult(!0);return this.buildResult(!1)}async runNonInteractive(){return h.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType,this.selectedAgents=["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,h.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=await Yn({type:"select",name:"projectType",message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",choices:al.map(t=>({title:t.title,description:t.description,value:t.value,selected:t.value===this.detectedType})),initial:al.findIndex(t=>t.value===this.detectedType)},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.confirmedType=e.projectType||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await Yn({type:"multiselect",name:"agents",message:"Which AI agents do you use?",choices:Im.map(n=>({title:n.title,description:n.description,value:n.value,selected:e.includes(n.value)})),hint:"- Space to select, Enter to confirm",instructions:!1,min:1},{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.selectedAgents=t.agents||["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);console.log(It.dim(`
|
|
496
362
|
Detected: ${e}
|
|
497
|
-
`));let t=await
|
|
363
|
+
`));let t=await Yn({type:"confirm",name:"confirmed",message:"Is this stack correct?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;if(t.confirmed)this.confirmedStack=this.detectedStack;else{let n=await Yn([{type:"text",name:"language",message:"Primary language:",initial:this.detectedStack.language},{type:"text",name:"framework",message:"Framework (optional):",initial:this.detectedStack.framework||""}],{onCancel:l(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await Yn([{type:"select",name:"verbosity",message:"Output verbosity:",choices:[{title:"Minimal",description:"Essential output only",value:"minimal"},{title:"Normal (Recommended)",description:"Balanced information",value:"normal"},{title:"Verbose",description:"Detailed logging",value:"verbose"}],initial:1},{type:"confirm",name:"autoSync",message:"Auto-sync context on file changes?",initial:!0}],{onCancel:l(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){console.log(""),console.log(It.bold(" Configuration Summary")),console.log(It.dim(` ${"\u2500".repeat(40)}`)),console.log(` ${It.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`),console.log(` ${It.cyan("AI Agents:")} ${this.selectedAgents.map(t=>this.getAgentLabel(t)).join(", ")}`),console.log(` ${It.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`),console.log(` ${It.cyan("Verbosity:")} ${this.preferences.verbosity}`),console.log(` ${It.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`),console.log("");let e=await Yn({type:"confirm",name:"proceed",message:"Generate configuration with these settings?",initial:!0},{onCancel:l(()=>this.handleCancel(),"onCancel")});return!(this.aborted||!e.proceed)}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let n=await e.readdir(this.projectPath);if(n.includes("turbo.json")||n.includes("lerna.json")||n.includes("nx.json"))return"monorepo";if(n.includes("package.json")){let s=t.join(this.projectPath,"package.json"),o=await e.readFile(s,"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 n.includes("pyproject.toml")||n.includes("setup.py")?n.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":n.includes("go.mod")?n.includes("main.go")?"cli-tool":"library":n.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:fs/promises"),t=await import("node:path"),n=await import("node:os"),s=[];try{await e.access(t.join(n.homedir(),".claude")),s.push("claude")}catch{}try{await e.access(t.join(this.projectPath,".cursorrules")),s.push("cursor")}catch{}try{await e.access(t.join(this.projectPath,".windsurfrules")),s.push("windsurf")}catch{}try{await e.access(t.join(this.projectPath,".github","copilot-instructions.md")),s.push("copilot")}catch{}try{await e.access(t.join(n.homedir(),".gemini")),s.push("gemini")}catch{}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),n={language:"Unknown",technologies:[]};try{let s=await e.readdir(this.projectPath);if(s.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};n.language=c.typescript?"TypeScript":"JavaScript",c.next?n.framework="Next.js":c.nuxt?n.framework="Nuxt":c.react?n.framework="React":c.vue?n.framework="Vue":c["@angular/core"]?n.framework="Angular":c.express?n.framework="Express":c.hono?n.framework="Hono":c.fastify?n.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(n.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?n.runtime="Bun":n.runtime="Node.js",s.includes("bun.lockb")?n.packageManager="Bun":s.includes("pnpm-lock.yaml")?n.packageManager="pnpm":s.includes("yarn.lock")?n.packageManager="Yarn":s.includes("package-lock.json")&&(n.packageManager="npm"),(c.prisma||c["@prisma/client"])&&n.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&n.technologies.push("Drizzle"),c.tailwindcss&&n.technologies.push("Tailwind CSS"),c.zod&&n.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&n.technologies.push("tRPC")}else s.includes("pyproject.toml")||s.includes("requirements.txt")?n.language="Python":s.includes("go.mod")?n.language="Go":s.includes("Cargo.toml")?n.language="Rust":(s.includes("pom.xml")||s.includes("build.gradle"))&&(n.language="Java");return n}catch{return n}}printWelcome(){console.log(""),console.log(It.bold.cyan(" Welcome to prjct-cli!")),console.log(It.dim(" Let's set up your project in 60 seconds.")),console.log("")}printStepHeader(e){console.log(""),console.log(It.dim(` Step ${this.currentStep}/${this.totalSteps}: ${e}`)),console.log("")}handleCancel(){this.aborted=!0,console.log(It.yellow(`
|
|
498
364
|
Setup cancelled. Run again anytime.
|
|
499
|
-
`))}getProjectTypeLabel(e){return
|
|
500
|
-
`).filter(s=>s.trim()).map(s=>JSON.parse(s)):[]}async filter(e,t){return(await this.getAll(e)).filter(s=>{if(t.sessionId&&s.sessionId!==t.sessionId||t.command&&s.command!==t.command||t.agent&&s.agentUsed!==t.agent||t.fromDate&&s.startedAt<t.fromDate||t.toDate&&s.completedAt>t.toDate||t.minQuality&&s.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=s.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 n=t.filter(s=>{if(!s.variance)return!1;let o=this.parseVariance(s.variance),i=this.parseDuration(s.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},OC=new Ni,ht=OC});var Li,FC,Tl,Xm=y(()=>{"use strict";ss();Li=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await ht.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await ht.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(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await ht.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(k=>k.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((k,S)=>k+S.qualityScore,0)/a,m=i.filter(k=>{if(!k.variance)return!1;let S=this.parseVariance(k.variance),x=this.parseDuration(k.estimatedDuration);return x===0?!1:Math.abs(S)/x<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let k of i.filter(S=>S.completedAsPlanned))for(let S of k.tags||[])g.set(S,(g.get(S)||0)+1);let f=[...g.entries()].sort((k,S)=>S[1]-k[1]).slice(0,3).map(([k])=>k);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await ht.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.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&&n.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&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await ht.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.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 s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},FC=new Li,Tl=FC});var ro,Ui,El,Il=y(()=>{"use strict";js();ie();ro=3,Ui=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=ro){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${ro} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=ro){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${ro} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.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(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)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>=ro&&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((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
501
|
-
`)}},
|
|
502
|
-
`);let n=e.outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,5);if(n.length>0){t.push("## Recent Outcomes"),t.push("");for(let s of n){let o=s.success?.overallSuccess??"unknown",i=s.roi.roiScore,a=bt(s.shippedAt);t.push(`- **${s.featureName}** (${o}, ROI: ${i}) - ${a}`),s.learnings.whatWorked.length>0&&t.push(` What worked: ${s.learnings.whatWorked.slice(0,2).join(", ")}`),s.learnings.whatDidnt.length>0&&t.push(` Issues: ${s.learnings.whatDidnt.slice(0,2).join(", ")}`)}t.push("")}if(e.aggregates&&(t.push("## Aggregate Metrics"),t.push(""),t.push(`- Features: ${e.aggregates.totalFeatures}`),t.push(`- Estimation Accuracy: ${e.aggregates.averageEstimationAccuracy}%`),t.push(`- Success Rate: ${e.aggregates.averageSuccessRate}%`),t.push(`- Average ROI: ${e.aggregates.averageROI}`),t.push(""),e.aggregates.topLearnings.length>0)){t.push("### Top Learnings"),t.push("");for(let s of e.aggregates.topLearnings.slice(0,5))t.push(`- ${s.insight} (${s.frequency}x)`);t.push("")}return t.join(`
|
|
503
|
-
`)}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Jo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Jo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Jo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=bp(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Cp(5,s);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:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:vp(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},Qm=new Hi});var jl=y(()=>{"use strict";Ym();Xm();Il();ss();Al()});import sn from"chalk";function _C(r){return Zm[r.toLowerCase()]||Zm.default}var Zm,Dl,Gi,eg=y(()=>{"use strict";Zm={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(_C,"getIcon");Dl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(sn.cyan(`
|
|
365
|
+
`))}getProjectTypeLabel(e){return al.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Im.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}}});import cl from"node:path";var nC,sC,Ti,rC,gt,Xn=y(()=>{"use strict";Ce();Ot();xe();nC="outcomes",sC="outcomes.jsonl",Ti=class{static{l(this,"OutcomeRecorder")}getOutcomesDir(e){let t=A.getGlobalProjectPath(e);return cl.join(t,nC)}getOutcomesPath(e){return cl.join(this.getOutcomesDir(e),sC)}async record(e,t){let n={...t,id:Se()},s=this.getOutcomesPath(e);return await Mt(cl.dirname(s)),await Ia(s,JSON.stringify(n)),n}async getAll(e){let t=this.getOutcomesPath(e);if(!await P(t))return[];let n=await fs(t);return n.trim()?n.trim().split(`
|
|
366
|
+
`).filter(s=>s.trim()).map(s=>JSON.parse(s)):[]}async filter(e,t){return(await this.getAll(e)).filter(s=>{if(t.sessionId&&s.sessionId!==t.sessionId||t.command&&s.command!==t.command||t.agent&&s.agentUsed!==t.agent||t.fromDate&&s.startedAt<t.fromDate||t.toDate&&s.completedAt>t.toDate||t.minQuality&&s.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=s.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 n=t.filter(s=>{if(!s.variance)return!1;let o=this.parseVariance(s.variance),i=this.parseDuration(s.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(n.length/t.length*100)}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},rC=new Ti,gt=rC});var Ei,oC,ll,jm=y(()=>{"use strict";Xn();Ei=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await gt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let n=t.reduce((m,p)=>m+p.qualityScore,0)/t.length,s=await gt.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(n*10)/10,estimateAccuracy:s,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await gt.getAll(e),n=new Map;for(let o of t){let i=o.agentUsed||"unknown";n.has(i)||n.set(i,[]),n.get(i).push(o)}let s=[];for(let[o,i]of n){let a=i.length,c=i.filter(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,b)=>S+b.qualityScore,0)/a,m=i.filter(S=>{if(!S.variance)return!1;let b=this.parseVariance(S.variance),D=this.parseDuration(S.estimatedDuration);return D===0?!1:Math.abs(b)/D<=.2}),p=Math.round(m.length/a*100),g=new Map;for(let S of i.filter(b=>b.completedAsPlanned))for(let b of S.tags||[])g.set(b,(g.get(b)||0)+1);let f=[...g.entries()].sort((S,b)=>b[1]-S[1]).slice(0,3).map(([S])=>S);s.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:p,bestFor:f})}return s}async detectPatterns(e){let t=await gt.getAll(e),n=[];if(t.length<3)return n;let s=t.filter(c=>this.parseVariance(c.variance)>0);s.length/t.length>.6&&n.push({description:"Tasks consistently take longer than estimated",confidence:s.length/t.length,occurrences:s.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>this.parseVariance(c.variance)<0);o.length/t.length>.6&&n.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&&n.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&&n.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return n.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let s=(await gt.getAll(e)).filter(a=>a.tags?.includes(t));if(s.length<2)return null;let o=s.reduce((a,c)=>a+this.parseDuration(c.actualDuration),0),i=Math.round(o/s.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 s=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return s.length===0?null:s.sort((o,i)=>i.successRate-o.successRate)[0].agent}parseVariance(e){let t=e.match(/^([+-])(\d+)([mh])$/);if(!t)return 0;let n=t[1]==="-"?-1:1,s=parseInt(t[2],10),o=t[3];return n*(o==="h"?s*60:s)}parseDuration(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t}},oC=new Ei,ll=oC});var Jr,Ii,ul,dl=y(()=>{"use strict";Ps();le();Jr=3,Ii=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Jr} occurrences needed`});return s}async learnFromOutcomes(e,t,n){let s={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return s;let o=this.extractOutcomePatterns(t);s.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Jr){s.patternsQualified++;let a=await this.injectIntoMemory(e,i,n);a&&(s.memoriesInjected++,s.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else s.patternsSkipped++,s.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Jr} occurrences needed`});return s}extractFileCochangePatterns(e){let t=new Map;for(let s of e){if(!s.subtaskSummaries)continue;let o=new Set;for(let a of s.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(s.taskId),t.set(u,d)}}let n=[];for(let[s,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=s.split("|");n.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return n.sort((s,o)=>o.occurrences-s.occurrences)}extractStackPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.stackConfirmed)for(let s of n.feedback.stackConfirmed){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:`Project uses ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let n of e)if(n.feedback?.patternsDiscovered)for(let s of n.feedback.patternsDiscovered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).map(([n,{count:s,tasks:o}])=>({pattern:n,occurrences:s,confidence:this.calculateConfidence(s),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let n of e)if(n.feedback?.issuesEncountered)for(let s of n.feedback.issuesEncountered){let o=t.get(s)||{count:0,tasks:[]};o.count++,o.tasks.push(n.taskId),t.set(s,o)}return Array.from(t.entries()).filter(([n,{count:s}])=>s>=2).map(([n,{count:s,tasks:o}])=>({pattern:`Known gotcha: ${n}`,occurrences:s,confidence:this.calculateConfidence(s),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],n=new Map,s=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}for(let a of i.learnings.whatDidnt){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}}for(let[i,{count:a,ids:c}]of n)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of s)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>=Jr&&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((n,s)=>s.occurrences-n.occurrences)}async injectIntoMemory(e,t,n){let s=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await n.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await n.updateMemory(e,c.id,{content:i,tags:s}),{action:"updated"}):(await n.createMemory(e,{title:o,content:i,tags:s,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[M.FILE_STRUCTURE,M.ARCHITECTURE],tech_stack:[M.TECH_STACK],architecture:[M.ARCHITECTURE,M.CODE_STYLE],estimation:[M.SHIP_WORKFLOW],workflow:[M.SHIP_WORKFLOW,M.CODE_STYLE],gotcha:[M.TEST_BEHAVIOR,M.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${C()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
367
|
+
`)}},ul=new Ii});var Ai,Dm,pl=y(()=>{"use strict";tc();Qt();le();Ai=class extends ze{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...np,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,n=>({...n,outcomes:[t,...n.outcomes],aggregates:Fo([t,...n.outcomes]),lastUpdated:C()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,n=>({...n,taskOutcomes:[t,...n.taskOutcomes||[]],lastUpdated:C()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let n=await this.read(e),s=n.taskOutcomes||[];return t?n.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:s}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?Fo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:Fo(t.outcomes),lastAggregated:C(),lastUpdated:C()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration?this.parseDurationString(e.duration):60,n=t/60,s=t/60,o=sp(n,s),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=rp(5,s);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:n,confidence:"low",source:"manual"},actual:{hours:s,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:op(a),successScore:a},learnings:i,roi:{valueDelivered:5,userImpact:"medium",businessImpact:"medium",roiScore:c,worthIt:"probably"},rating:3,startedAt:e.shippedAt,shippedAt:e.shippedAt,legacy:!0}}parseDurationString(e){let t=0,n=e.match(/(\d+)h/);n&&(t+=parseInt(n[1],10)*60);let s=e.match(/(\d+)m/);return s&&(t+=parseInt(s[1],10)),t||60}},Dm=new Ai});var ml=y(()=>{"use strict";Am();jm();dl();Xn();pl()});import tn from"chalk";function iC(r){return Rm[r.toLowerCase()]||Rm.default}var Rm,gl,ji,$m=y(()=>{"use strict";Rm={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(iC,"getIcon");gl=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(tn.cyan(`
|
|
504
368
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
505
|
-
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=
|
|
506
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${
|
|
507
|
-
`)}function
|
|
508
|
-
`)}var
|
|
369
|
+
`))}startAgent(e,t,n){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let s=iC(t);console.log(tn.cyan(`\u250C\u2500 ${s} ${e} (${t})`)),n&&console.log(tn.dim(`\u2502 ${n}`))}progress(e){this.quiet||!this.currentAgent||console.log(tn.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(tn.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,n=this.formatDuration(t),s=e?tn.green("\u2713"):tn.red("\u2717");console.log(`\u2514\u2500 ${s} ${e?"Complete":"Failed"} ${tn.dim(`(${n})`)}
|
|
370
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let n=t?` ${tn.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(tn.green(`\u2705 ${e}${n}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},ji=new gl});import Ze from"chalk";function aC(r){let e=0;for(let n of r)e=(e<<5)-e+n.charCodeAt(0),e=e&e;let t=Math.abs(e)%Mm.length;return Mm[t]}function cC(r,e,t="\u25B6"){let n=Ze.dim(String(r+1).padStart(2)),o=aC(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=Ze.green("\u2713 Complete");break;case"in_progress":a=Ze.yellow(`${t} Working...`);break;case"pending":a=Ze.gray("\u25CB Pending");break;case"failed":a=Ze.red("\u2717 Failed");break;case"blocked":a=Ze.gray("\u2298 Blocked");break;default:a=Ze.gray(`\u25CB ${e.status}`)}return` ${n} ${o} ${i} ${a}`}function lC(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ze.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ze.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(cC(t,r[t]));return e.push(""),e.join(`
|
|
371
|
+
`)}function Om(r){console.log(lC(r))}var Mm,Fm=y(()=>{"use strict";Mm=[Ze.cyan,Ze.magenta,Ze.yellow,Ze.blue,Ze.green,Ze.redBright,Ze.magentaBright,Ze.cyanBright];l(aC,"getDomainColor");l(cC,"formatSubtaskLine");l(lC,"renderSubtaskProgress");l(Om,"printSubtaskProgress")});function uC(r){return _m.includes(r)}async function dC(r,e,t){let n=[],s=[],o=[];switch(r){case"ship":t.now&&!t.now.includes("No current task")?n.push({step:"Has active task",passed:!0}):(n.push({step:"Has active task",passed:!1,details:"No active task to ship"}),o.push("No active task")),t.shipped?n.push({step:"Shipped log accessible",passed:!0}):n.push({step:"Shipped log accessible",passed:!1,details:"shipped.md not found"}),s.push("Read current task from now.md"),s.push("Calculate duration"),s.push("Append to shipped.md"),s.push("Clear now.md"),s.push("Update metrics");break;case"feature":e.params.description||e.params.feature?n.push({step:"Has feature description",passed:!0}):(n.push({step:"Has feature description",passed:!1,details:"No description provided"}),o.push("Missing feature description")),t.analysis?n.push({step:"Project analyzed",passed:!0}):n.push({step:"Project analyzed",passed:!1,details:"Run /p:sync first"}),s.push("Parse feature description"),s.push("Generate tasks breakdown"),s.push("Add to roadmap.md"),s.push("Add tasks to next.md"),s.push("Suggest starting first task");break;case"spec":e.params.feature||e.params.name?n.push({step:"Has spec name",passed:!0}):(n.push({step:"Has spec name",passed:!1,details:"No spec name provided"}),o.push("Missing spec name")),s.push("Generate spec template"),s.push("Analyze requirements"),s.push("Create spec file"),s.push("Link to roadmap");break;case"cleanup":t.analysis?n.push({step:"Has code analysis",passed:!0}):n.push({step:"Has code analysis",passed:!1,details:"Run /p:analyze first"}),s.push("Scan for unused code"),s.push("Identify dead imports"),s.push("List files to clean"),s.push("Show preview"),s.push("Wait for approval"),s.push("Execute cleanup");break;case"migrate":n.push({step:"Migration safety check",passed:!0,details:"Will require manual approval"}),s.push("Analyze current state"),s.push("Generate migration plan"),s.push("Show affected files"),s.push("Request approval"),s.push("Execute migration"),s.push("Verify results");break;default:s.push("Execute command");break}let i=n.filter(u=>u.passed).length,a=n.length,c=a>0?i/a:1;return{commandName:r,reasoning:n.length>0?{steps:n,allPassed:o.length===0,criticalIssues:o}:null,plan:s,confidence:c}}function pC(r){let e=[];return e.push(`\u{1F4CB} Chain of Thought: ${r.commandName}`),e.push(""),r.reasoning&&(e.push("Steps:"),r.reasoning.steps.forEach(t=>{let n=t.passed?"\u2705":"\u274C";e.push(` ${n} ${t.step}`),t.details&&e.push(` ${t.details}`)}),e.push(""),r.reasoning.criticalIssues.length>0&&(e.push("Critical Issues:"),r.reasoning.criticalIssues.forEach(t=>{e.push(` \u26A0\uFE0F ${t}`)}),e.push(""))),r.plan.length>0&&(e.push("Plan:"),r.plan.forEach((t,n)=>{e.push(` ${n+1}. ${t}`)}),e.push("")),e.push(`Confidence: ${Math.round(r.confidence*100)}%`),e.join(`
|
|
372
|
+
`)}var _m,mC,Di,Nm=y(()=>{"use strict";_m=["ship","feature","spec","cleanup","migrate"];l(uC,"requiresReasoning");l(dC,"reason");l(pC,"formatPlan");mC={requiresReasoning:uC,reason:dC,formatPlan:pC,REASONING_REQUIRED_COMMANDS:_m},Di=mC});import qr from"node:fs/promises";var fl,gC,ft,hl=y(()=>{"use strict";Ve();Ce();_();Jo();fl=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new Ft({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let n=await R.getProjectId(e),s=A.getGlobalProjectPath(n);return this._currentProjectId!==null&&this._currentProjectId!==n&&this._cache.clear(),this._currentProjectId=n,{projectId:n,projectPath:e,globalPath:s,paths:{now:A.getFilePath(n,"core","now.md"),next:A.getFilePath(n,"core","next.md"),context:A.getFilePath(n,"core","context.md"),shipped:A.getFilePath(n,"progress","shipped.md"),metrics:A.getFilePath(n,"progress","metrics.md"),ideas:A.getFilePath(n,"planning","ideas.md"),roadmap:A.getFilePath(n,"planning","roadmap.md"),specs:A.getFilePath(n,"planning","specs"),memory:A.getFilePath(n,"memory","context.jsonl"),patterns:A.getFilePath(n,"memory","patterns.json"),analysis:A.getFilePath(n,"analysis","repo-summary.md"),codePatterns:A.getFilePath(n,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let n={},s=Object.entries(e.paths),o=t?s.filter(([a])=>t.includes(a)):s;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await qr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(v(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?n[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[m,p]=await Promise.all([qr.readFile(d,"utf-8"),qr.stat(d)]);return{key:u,filePath:d,content:m,mtime:p.mtimeMs}}catch(m){if(v(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)n[u]=m,this._cache.set(d,{content:m,mtime:p})}return n}async loadStateForCommand(e,t){let n={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"]},s=n[t]||n.default;return this.loadState(e,s)}async batchRead(e){let t=new Map,n=[];for(let s of e){let o=this._cache.get(s);o!==null?t.set(s,o.content):n.push(s)}if(n.length>0){let s=n.map(async i=>{try{let a=await qr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(v(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(s);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){try{return await qr.access(e),!0}catch(t){if(v(t))return!1;throw t}}getCacheStats(){return this._cache.stats()}},gC=new fl,ft=gC});import{exec as fC}from"node:child_process";import Ae from"node:fs/promises";import Lm from"node:os";import En from"node:path";import{promisify as hC}from"node:util";function Hm(r){let e=Math.floor(r/36e5),t=Math.floor(r%(1e3*60*60)/(1e3*60));return e>0?`${e}h ${t}m`:`${t}m`}function yl(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wC(r){if(r.verified||r.warnings.length===0)return null;let e=` Ground Truth Warnings:
|
|
509
373
|
`;return r.warnings.forEach(t=>{e+=` - ${t}
|
|
510
374
|
`}),r.recommendations.length>0&&(e+=`
|
|
511
375
|
Recommendations:
|
|
512
376
|
`,r.recommendations.forEach(t=>{e+=` -> ${t}
|
|
513
|
-
`})),e}async function
|
|
514
|
-
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=Rn.join(r.projectPath,"package.json");try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(v(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${Ml(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(v(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(v(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function ug(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ae.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(v(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(Ml(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(v(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function dg(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(v(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(v(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function pg(r){let e=[],t=[],n={},s=Rn.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(v(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=Rn.join(ig.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function mg(r){let e=[],t=[],n={},s=Rn.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(v(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=Rn.join(ig.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(v(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function gg(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await Ae.access(Rn.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!v(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(Rn.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!v(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function fg(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ae.access(s),n.specsExists=!0;let i=await Ae.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(v(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function yg(r,e,t){let n=hg[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function YC(r,e,t){let n=await yg(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function XC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var qC,hg,QC,Wi,wg=y(()=>{"use strict";_();qC=JC(VC);l(ag,"formatDuration");l(Ml,"escapeRegex");l(KC,"formatWarnings");l(cg,"verifyDone");l(lg,"verifyShip");l(ug,"verifyFeature");l(dg,"verifyNow");l(pg,"verifyInit");l(mg,"verifySync");l(gg,"verifyAnalyze");l(fg,"verifySpec");hg={done:cg,ship:lg,feature:ug,now:dg,init:pg,sync:mg,analyze:gg,spec:fg};l(yg,"verify");l(YC,"prepareCommand");l(XC,"requiresVerification");QC={verify:yg,prepareCommand:YC,requiresVerification:XC,verifiers:hg,formatWarnings:KC,formatDuration:ag,escapeRegex:Ml,verifyDone:cg,verifyShip:lg,verifyFeature:ug,verifyNow:dg,verifyInit:pg,verifySync:mg,verifyAnalyze:gg,verifySpec:fg},Wi=QC});function ev(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 tv(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of ZC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:ev(t)};return{detected:!1}}function nv(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function sv(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 rv(r,e,t){let n={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 n[e.type]||n.unknown}function ov(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 ZC,Ol,iv,Zs,kg=y(()=>{"use strict";ZC=[{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(ev,"getHallucinationSuggestion");l(tv,"detectHallucination");l(nv,"isSimilarError");l(sv,"analyzeErrorPattern");l(rv,"generateEscalationMessage");l(ov,"generateSuggestion");Ol=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>nv(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=sv(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:rv(e,o,this.maxAttempts),suggestion:ov(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return tv(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},iv=new Ol,Zs=iv});function Fl(r,e){let t=io(e),n=av[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function cv(r,e){let t=io(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function lv(r,e,t){let n=io(t),s=Fl(r,t),o=Fl(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function Bi(r,e=xn){let t=io(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=uv(r,e),s=dv(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=gv(o),a=pv(o),c=mv(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=fv(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function bg(r,e,t=xn){let n=io(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function uv(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=lv(i,s,e);if(!t.has(a)){let c=Fl(i,e),u=cv(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function dv(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+hv(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>Nl(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function pv(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function mv(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=Nl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function gv(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function fv(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=Nl(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function Nl(r){if(!r.variance)return 0;let e=_l(r.estimatedDuration),t=_l(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function _l(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function Cg(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(`
|
|
515
|
-
`)}function
|
|
377
|
+
`})),e}async function Um(r){let e=[],t=[],n={},s=r.paths.now;try{let a=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=a.trim(),n.nowLength=a.length,(a.includes("No current task")||a.match(/^#\s*NOW\s*$/m))&&(e.push("now.md appears to be empty or placeholder"),t.push('Start a task first with /p:now "task"'));let c=a.match(/Started:\s*(.+)/i);if(c){n.startedAt=c[1];let u=new Date(c[1]);Number.isNaN(u.getTime())||(n.durationMs=Date.now()-u.getTime(),n.durationFormatted=Hm(n.durationMs))}}catch(a){if(v(a))n.nowExists=!1,e.push("now.md does not exist"),t.push('Create a task with /p:now "task"');else throw a}let o=r.paths.next;try{let a=await Ae.readFile(o,"utf-8");n.nextExists=!0;let c=a.match(/- \[ \]/g)||[];n.pendingTasks=c.length}catch(a){if(v(a))n.nextExists=!1,n.pendingTasks=0;else throw a}let i=r.paths.metrics;try{await Ae.access(En.dirname(i),Ae.constants.W_OK),n.metricsWritable=!0}catch(a){if(v(a))n.metricsWritable=!1,e.push("Cannot write to metrics directory");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Gm(r){let e=[],t=[],n={};try{let{stdout:i}=await yC("git status --porcelain",{cwd:r.projectPath});n.hasUncommittedChanges=i.trim().length>0,n.uncommittedFiles=i.trim().split(`
|
|
378
|
+
`).filter(Boolean).length,n.hasUncommittedChanges&&(e.push(`${n.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{n.gitAvailable=!1}let s=En.join(r.projectPath,"package.json");try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.currentVersion=a.version,n.hasPackageJson=!0}catch(i){if(v(i))n.hasPackageJson=!1;else if(i instanceof SyntaxError)n.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Ae.readFile(o,"utf-8");n.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${yl(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(v(i))n.shippedExists=!1;else throw i}if(n.hasPackageJson)try{let i=await Ae.readFile(s,"utf-8"),a=JSON.parse(i);n.hasTestScript=!!a.scripts?.test}catch(i){if(v(i)||i instanceof SyntaxError)n.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function zm(r){let e=[],t=[],n={},s=r.paths.next;try{let a=await Ae.readFile(s,"utf-8");n.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];n.taskCount=c.length,n.pendingTasks=(a.match(/- \[ \]/g)||[]).length,n.taskCount>=90&&(e.push(`Queue nearly full (${n.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(v(a))n.nextExists=!1,n.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Ae.readFile(o,"utf-8");n.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(yl(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(v(a))n.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Ae.readFile(i,"utf-8");n.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),n.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(v(a))n.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Wm(r){let e=[],t=[],n={},s=r.paths.now;try{let i=await Ae.readFile(s,"utf-8");n.nowExists=!0,n.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(n.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(v(i))n.nowExists=!1,n.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Ae.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;n.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(v(i))n.pendingTasks=0;else throw i}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Bm(r){let e=[],t=[],n={},s=En.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Ae.readFile(s,"utf-8");n.alreadyInitialized=!0,n.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(v(i))n.alreadyInitialized=!1;else if(i instanceof SyntaxError)n.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=En.join(Lm.homedir(),".prjct-cli");try{await Ae.access(o,Ae.constants.W_OK),n.globalPathWritable=!0}catch(i){if(v(i))try{await Ae.mkdir(o,{recursive:!0}),n.globalPathWritable=!0,n.globalPathCreated=!0}catch{n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else n.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Vm(r){let e=[],t=[],n={},s=En.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Ae.readFile(s,"utf-8");n.hasConfig=!0,n.config=JSON.parse(a)}catch(a){if(v(a))return n.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:n,warnings:e,recommendations:t};if(a instanceof SyntaxError)return n.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:n,warnings:e,recommendations:t};throw a}let o=n.config?.projectId,i=En.join(Lm.homedir(),".prjct-cli/projects",o||"");try{await Ae.access(i),n.globalStorageExists=!0}catch(a){if(v(a))n.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate");else throw a}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Jm(r){let e=[],t=[],n={},s=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];n.detectedFiles=[];for(let i of s)try{await Ae.access(En.join(r.projectPath,i)),n.detectedFiles.push(i)}catch(a){if(!v(a))throw a}n.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];n.detectedSrcDirs=[];for(let i of o)try{(await Ae.stat(En.join(r.projectPath,i))).isDirectory()&&n.detectedSrcDirs.push(i)}catch(a){if(!v(a))throw a}return{verified:!0,actual:n,warnings:e,recommendations:t}}async function qm(r){let e=[],t=[],n={},s=r.paths.specs;try{await Ae.access(s),n.specsExists=!0;let i=await Ae.readdir(s);n.existingSpecs=i.filter(a=>a.endsWith(".md")),n.specCount=n.existingSpecs.length}catch(i){if(v(i))n.specsExists=!1,n.specCount=0;else throw i}let o=r.params.feature||r.params.name||r.params.description;if(o&&n.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");n.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:n,warnings:e,recommendations:t}}async function Ym(r,e,t){let n=Km[r];if(!n)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await n(e,t)}catch(s){return{verified:!1,actual:{},warnings:[`Verification error: ${w(s)}`],recommendations:["Check file permissions and project configuration"]}}}async function SC(r,e,t){let n=await Ym(r,e,t);return{...e,groundTruth:{...n,verifiedAt:new Date().toISOString(),command:r}}}function kC(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var yC,Km,bC,Ri,Xm=y(()=>{"use strict";_();yC=hC(fC);l(Hm,"formatDuration");l(yl,"escapeRegex");l(wC,"formatWarnings");l(Um,"verifyDone");l(Gm,"verifyShip");l(zm,"verifyFeature");l(Wm,"verifyNow");l(Bm,"verifyInit");l(Vm,"verifySync");l(Jm,"verifyAnalyze");l(qm,"verifySpec");Km={done:Um,ship:Gm,feature:zm,now:Wm,init:Bm,sync:Vm,analyze:Jm,spec:qm};l(Ym,"verify");l(SC,"prepareCommand");l(kC,"requiresVerification");bC={verify:Ym,prepareCommand:SC,requiresVerification:kC,verifiers:Km,formatWarnings:wC,formatDuration:Hm,escapeRegex:yl,verifyDone:Um,verifyShip:Gm,verifyFeature:zm,verifyNow:Wm,verifyInit:Bm,verifySync:Vm,verifyAnalyze:Jm,verifySpec:qm},Ri=bC});function vC(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 xC(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:n}of CC)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:n,message:`Potential hallucination detected: ${n}`,suggestion:vC(t)};return{detected:!1}}function PC(r,e){if(!r||!e)return!1;let t=l(n=>n.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function TC(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 EC(r,e,t){let n={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 n[e.type]||n.unknown}function IC(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 CC,wl,AC,Hs,Qm=y(()=>{"use strict";CC=[{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(vC,"getHallucinationSuggestion");l(xC,"detectHallucination");l(PC,"isSimilarError");l(TC,"analyzeErrorPattern");l(EC,"generateEscalationMessage");l(IC,"generateSuggestion");wl=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",n={}){let s=this._getKey(e,t),o=Date.now(),i=this._attempts.get(s);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=n.success||!1,n.error&&i.errors.push({message:n.error,timestamp:o}),this._attempts.set(s,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return!1;if(s.attempts>=2&&!s.success){let o=s.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>PC(c.message,i))}}return!1}shouldEscalate(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);return s?s.attempts>=this.maxAttempts&&!s.success:!1}getEscalationInfo(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);if(!s)return null;let o=TC(s.errors);return{status:"BLOCKED",command:e,context:t,attempts:s.attempts,duration:s.lastAttempt-s.firstAttempt,errorPattern:o,message:EC(e,o,this.maxAttempts),suggestion:IC(o),lastError:s.errors[s.errors.length-1]?.message||null}}recordSuccess(e,t=""){let n=this._getKey(e,t),s=this._attempts.get(n);s&&(s.success=!0,s.attempts=0,s.errors=[],this._attempts.set(n,s))}clearTracking(e,t=""){let n=this._getKey(e,t);this._attempts.delete(n)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,n]of this._attempts)e.commands[t]={attempts:n.attempts,success:n.success,errorCount:n.errors.length};return e}detectHallucination(e){return xC(e)}analyzeOutput(e,t){let n=this.detectHallucination(t);return n.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${n.description}`}),{...n,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},AC=new wl,Hs=AC});function Sl(r,e){let t=Kr(e),n=jC[t.startDay],s=new Date(r);s.setHours(0,0,0,0);let i=(s.getDay()-n+7)%7;return s.setDate(s.getDate()-i),s}function DC(r,e){let t=Kr(e),n=new Date(r);return n.setDate(n.getDate()+t.sprintLengthDays-1),n.setHours(23,59,59,999),n}function RC(r,e,t){let n=Kr(t),s=Sl(r,t),o=Sl(e,t),i=s.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/n.sprintLengthDays)+1}function $i(r,e=kn){let t=Kr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let n=$C(r,e),s=MC(n,t.accuracyTolerance),o=s.slice(-t.windowSize),i=_C(o),a=OC(o),c=FC(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=NC(r);return{sprints:s,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function eg(r,e,t=kn){let n=Kr(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let s=Math.ceil(r/e),o=s*n.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:s,estimatedDate:i.toISOString()}}function $C(r,e){let t=new Map,n=r.map(o=>new Date(o.completedAt)),s=new Date(Math.min(...n.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=RC(i,s,e);if(!t.has(a)){let c=Sl(i,e),u=DC(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function MC(r,e){let t=[];for(let[,n]of r){let s=n.outcomes.reduce((u,d)=>u+LC(d),0),o=n.outcomes.filter(u=>u.variance).map(u=>bl(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:n.sprintNumber,startDate:n.startDate.toISOString(),endDate:n.endDate.toISOString(),pointsCompleted:s,tasksCompleted:n.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((n,s)=>n.sprintNumber-s.sprintNumber)}function OC(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,n=0,s=0,o=0,i=0;for(let d=0;d<t;d++)n+=d,s+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-n*s)/(t*i-n*n),c=s/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function FC(r,e){let t=r.filter(s=>s.variance);if(t.length===0)return 0;let n=t.filter(s=>{let o=bl(s);return Math.abs(o)<=e});return Math.round(n.length/t.length*100)}function _C(r){if(r.length===0)return 0;let e=r.reduce((t,n)=>t+n.pointsCompleted,0);return Math.round(e/r.length*10)/10}function NC(r){let e=new Map;for(let s of r){if(!s.variance)continue;let o=bl(s),i=s.tags&&s.tags.length>0?s.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],n=[];for(let[s,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?n.push({category:s,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:s,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((s,o)=>o.avgVariance-s.avgVariance),n.sort((s,o)=>o.avgVariance-s.avgVariance),{overEstimated:t,underEstimated:n}}function bl(r){if(!r.variance)return 0;let e=kl(r.estimatedDuration),t=kl(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function kl(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let n=r.match(/(\d+)m/);return n&&(e+=Number.parseInt(n[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}function tg(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(`
|
|
379
|
+
`)}function LC(r){if(!r.estimatedDuration)return 0;let e=kl(r.estimatedDuration);if(e<=0)return 0;let t=Zm[0],n=Number.POSITIVE_INFINITY;for(let s of Zm){let o=Math.abs(s.typical-e);o<n&&(n=o,t=s)}return t.points}function Kr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var jC,Zm,Cl=y(()=>{"use strict";vs();jC={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6};l(Sl,"getSprintStart");l(DC,"getSprintEnd");l(RC,"getSprintNumber");l($i,"calculateVelocity");l(eg,"projectCompletion");l($C,"bucketBySprint");l(MC,"buildSprintVelocities");l(OC,"detectTrend");l(FC,"calculateOverallAccuracy");l(_C,"calculateAverageVelocity");l(NC,"detectEstimationPatterns");l(bl,"parseVariancePercent");l(kl,"parseDurationMinutes");l(tg,"formatVelocityContext");Zm=[{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(LC,"derivePoints");l(Kr,"resolveConfig")});import{exec as HC}from"node:child_process";import UC from"node:fs/promises";import Mi from"node:path";import{promisify as GC}from"node:util";async function Yr(r,e,t={}){let n=Date.now(),s=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=JC(r),c=await qC(e),u=await KC(e),d=[];for(let p of c){if(!i&&XC(p))continue;let g=YC(p,a,u);g.score>=o&&d.push(g)}d.sort((p,g)=>g.score-p.score);let m=d.slice(0,s);return{files:m,metrics:{filesScanned:c.length,filesReturned:m.length,scanDuration:Date.now()-n}}}function JC(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(n=>!t.has(n)&&n.length>2)}async function qC(r){let e=[];async function t(n,s=""){try{let o=await UC.readdir(n,{withFileTypes:!0});for(let i of o){let a=Mi.join(n,i.name),c=Mi.join(s,i.name);if(i.isDirectory()){if(VC.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=Mi.extname(i.name).toLowerCase();BC.has(u)&&e.push(c)}}}catch(o){v(o)}}return l(t,"walk"),await t(r),e}async function KC(r){let e=new Map;try{let{stdout:t}=await zC(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
516
380
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
517
381
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
518
382
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
519
383
|
'`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
|
|
520
|
-
`).filter(Boolean);for(let o of s){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((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function
|
|
384
|
+
`).filter(Boolean);for(let o of s){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((n-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function YC(r,e,t){let n=[],s=0,o=0,i=0,a=0,c=r.toLowerCase(),u=c.split("/").join(" ").split(/[^a-z0-9]+/);for(let g of e){c.includes(g)&&(s+=.3,n.push(`keyword:${g}`));for(let f of u)if(f.includes(g)||g.includes(f)){s+=.15;break}}s=Math.min(1,s);for(let[g,f]of Object.entries(WC))for(let S of f)if(c.includes(S)&&e.some(D=>f.includes(D)||D.includes(g)||g.includes(D))){o+=.4,n.push(`domain:${g}`);break}o=Math.min(1,o);let d=t.get(r);d&&(d.daysAgo<=1?(i=1,n.push("recent:1d")):d.daysAgo<=3?(i=.8,n.push("recent:3d")):d.daysAgo<=7?(i=.6,n.push("recent:1w")):d.daysAgo<=30&&(i=.3,n.push("recent:1m")),d.commits>=5&&(i=Math.min(1,i+.2)));let m=Mi.basename(r).toLowerCase();(m.includes("index")||m.includes("main")||m.includes("app")||m.includes("entry"))&&(a=.5,n.push("import:0")),(c.includes("/core/")||c.includes("/shared/")||c.includes("/lib/"))&&(a=Math.max(a,.3),n.some(g=>g.startsWith("import:"))||n.push("import:1"));let p=s*.6+o*.2+i*.15+a*.05;return{path:r,score:Math.min(1,p),reasons:[...new Set(n)]}}function XC(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 zC,WC,BC,VC,vl=y(()=>{"use strict";_();zC=GC(HC),WC={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"]},BC=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),VC=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(Yr,"findRelevantFiles");l(JC,"extractKeywords");l(qC,"getAllCodeFiles");l(KC,"getGitRecency");l(YC,"scoreFile");l(XC,"isTestFile")});import{exec as QC}from"node:child_process";import{promisify as ZC}from"node:util";async function Qr(r=process.cwd(),e={}){let t=e.commits??30,n=e.maxFiles??50,s=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(s){let c=await nv(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await tv(r,t);return o=o.filter(c=>!sv(c.path)).slice(0,n),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,n),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function tv(r,e){let{stdout:t}=await Xr(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
521
385
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
522
386
|
NF {
|
|
523
387
|
count[$0]++
|
|
@@ -527,8 +391,8 @@ Recommendations:
|
|
|
527
391
|
for (f in count) print count[f], lastmod[f], f
|
|
528
392
|
}
|
|
529
393
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),n=[],s=t.trim().split(`
|
|
530
|
-
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),
|
|
531
|
-
`).filter(Boolean),{stdout:i}=await
|
|
394
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of s){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),m=c[3],p=o-d,g=Math.floor(p/86400),f=Math.floor(p/3600),S=Math.max(0,1-g/30),b=u/i,D=S*.6+b*.4,x;f<1?x="just now":f<24?x=`${f}h ago`:g<7?x=`${g}d ago`:g<30?x=`${Math.floor(g/7)}w ago`:x=`${Math.floor(g/30)}mo ago`,n.push({path:m,changes:u,heatScore:Math.round(D*100)/100,lastChanged:x,lastChangedAt:new Date(d*1e3).toISOString()})}return n.sort((a,c)=>c.heatScore-a.heatScore)}async function nv(r){let{stdout:e}=await Xr("git branch --show-current",{cwd:r}),t=e.trim(),n="main";try{await Xr("git rev-parse --verify main",{cwd:r})}catch{n="master"}let{stdout:s}=await Xr(`git diff --name-only ${n}...HEAD`,{cwd:r}),o=s.trim().split(`
|
|
395
|
+
`).filter(Boolean),{stdout:i}=await Xr(`git log ${n}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
532
396
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
533
397
|
NF {
|
|
534
398
|
count[$0]++
|
|
@@ -538,10 +402,10 @@ Recommendations:
|
|
|
538
402
|
for (f in count) print count[f], lastmod[f], f
|
|
539
403
|
}
|
|
540
404
|
'`,{cwd:r,maxBuffer:10*1024*1024}),a=[],c=i.trim().split(`
|
|
541
|
-
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),
|
|
542
|
-
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:
|
|
405
|
+
`).filter(Boolean),u=Math.floor(Date.now()/1e3),d=1;for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(p){let g=parseInt(p[1],10);g>d&&(d=g)}}for(let m of c){let p=m.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!p)continue;let g=parseInt(p[1],10),f=parseInt(p[2],10),S=p[3],b=u-f,D=Math.floor(b/86400),x=Math.floor(b/3600),O=Math.max(0,1-D/14),F=g/d,K=O*.5+F*.5,oe;x<1?oe="just now":x<24?oe=`${x}h ago`:oe=`${D}d ago`,a.push({path:S,changes:g,heatScore:Math.round(K*100)/100,lastChanged:oe,lastChangedAt:new Date(f*1e3).toISOString()})}return{hotFiles:a.sort((m,p)=>p.heatScore-m.heatScore),branchOnlyFiles:o,analysisWindow:`${n}..HEAD`}}function sv(r){let e=r.split("/").pop()||"";for(let t of ev)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var Xr,ev,xl=y(()=>{"use strict";Xr=ZC(QC),ev=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Qr,"getRecentFiles");l(tv,"getHotFilesFromCommits");l(nv,"getBranchOnlyFiles");l(sv,"shouldIgnore")});function Oi(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function ng(r,e){let t=rv[e],n=r/1e3*t.input,s=r/1e3*t.output*.3;return{inputSaved:n,outputPotential:s,total:n+s}}function Tl(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Zr(r,e){let t=Oi(r),n=Oi(e),s=Math.max(0,t-n),o=t>0?(t-n)/t:0,i=ng(s,ov),a=Pl.map(c=>({model:c,...ng(s,c)}));return{tokens:{original:t,filtered:n,saved:s},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:Tl(i.total),byModel:a}}}function Qn(r){let e=Oi(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Pl.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}function Fi(r){if(r.length===0)return Qn("");let e=r.reduce((a,c)=>a+c.tokens.original,0),t=r.reduce((a,c)=>a+c.tokens.filtered,0),n=r.reduce((a,c)=>a+c.tokens.saved,0),s=e>0?(e-t)/e:0,o=Pl.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:n},compression:s,cost:{saved:i,formatted:Tl(i),byModel:o}}}function iv(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function av(r){return`${Math.round(r*100)}%`}var rv,ov,Pl,eo=y(()=>{"use strict";rv={"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}},ov="claude-sonnet-4.5";l(Oi,"countTokens");Pl=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(ng,"calculateModelCost");l(Tl,"formatCostSaved");l(Zr,"measureCompression");l(Qn,"noCompression");l(Fi,"combineMetrics");l(iv,"formatTokenCount");l(av,"formatCompressionRate")});import og from"node:fs/promises";import In from"node:path";async function An(r,e=process.cwd()){let t=In.isAbsolute(r)?r:In.join(e,r),n;try{n=await og.readFile(t,"utf-8")}catch(u){if(v(u))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Qn("")};throw u}let s=In.extname(r).toLowerCase(),o=ig[s]||"unknown",i=dv[o];if(!i||i.length===0)return{file:r,language:o,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${o}`,metrics:Qn(n)};let a=pv(n,i),c=a.map(u=>`${u.exported?"export ":""}${u.type} ${u.name}: ${u.signature}`).join(`
|
|
406
|
+
`);return{file:r,language:o,signatures:a,fallback:!1,metrics:Zr(n,c)}}async function El(r,e=process.cwd(),t={}){let n=In.isAbsolute(r)?r:In.join(e,r),s=[];async function o(i){let a=await og.readdir(i,{withFileTypes:!0});for(let c of a){let u=In.join(i,c.name),d=In.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=In.extname(c.name).toLowerCase();if(ig[m]){let p=await An(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function pv(r,e){let t=[],n=r.split(`
|
|
543
407
|
`),s=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(s.has(c))continue;s.add(c);let u=i.index,d=r.substring(0,u).split(`
|
|
544
|
-
`).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:
|
|
408
|
+
`).length,m=i[0].trim(),p;if(d>1){let g=n[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(p=g)}t.push({type:o.type,name:a,signature:mv(m),exported:o.exported||!1,line:d,docstring:p})}}return t.sort((o,i)=>o.line-i.line)}function mv(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var ig,sg,cv,lv,uv,rg,dv,_i=y(()=>{"use strict";_();eo();ig={".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"},sg=[{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}],cv=[{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}],lv=[{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}],uv=[{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}],rg=[{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}],dv={typescript:sg,javascript:sg,python:cv,go:lv,rust:uv,java:rg,csharp:rg,php:[],ruby:[],unknown:[]};l(An,"extractSignatures");l(El,"extractDirectorySignatures");l(pv,"extractFromContent");l(mv,"cleanSignature")});import{createHash as gv}from"node:crypto";import lg from"node:fs/promises";import ug from"node:path";function ag(r){return gv("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}async function cg(r){try{let e=ug.join(r,"storage","classification-cache.json"),t=await lg.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return v(e)?Xa:(console.warn("[classifier] Failed to load cache:",w(e)),Xa)}}async function Il(r,e){try{let t=ug.join(r,"storage","classification-cache.json");await lg.writeFile(t,JSON.stringify(e,null,2))}catch(t){console.warn("[classifier] Failed to save cache:",w(t))}}function hv(r,e,t){let n=r.entries[e];return!n||n.projectId!==t||Date.now()-new Date(n.classifiedAt).getTime()>fv?null:n.classification}function yv(r,e){return r.confirmedPatterns.find(n=>n.descriptionHash===e)?.classification??null}async function wv(r,e){let t=process.env.ANTHROPIC_API_KEY;if(!t)return null;let n=dg(e),s=ec("classification")||"",o=`Classify this software engineering task into a domain.
|
|
545
409
|
|
|
546
410
|
Task: "${r}"
|
|
547
411
|
|
|
@@ -549,19 +413,19 @@ Available domains in this project: ${n.join(", ")}
|
|
|
549
413
|
Available agents: ${e.agents.join(", ")||"none"}
|
|
550
414
|
Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
551
415
|
|
|
552
|
-
${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=
|
|
553
|
-
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.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,n]=await Promise.all([
|
|
554
|
-
`).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:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await
|
|
555
|
-
`)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},
|
|
556
|
-
`);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=
|
|
416
|
+
${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Sn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function kv(r,e){let t=dg(e),n=new Map;for(let[p,g]of Object.entries(Sv)){if(p==="general"||!t.includes(p))continue;let f=0;for(let S of g)r.match(new RegExp(S,"gi"))&&(f+=S.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return zd;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=bv(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function dg(r){let e=[];return r.domains.hasFrontend&&e.push("frontend"),r.domains.hasBackend&&e.push("backend"),r.domains.hasDatabase&&e.push("database"),r.domains.hasTesting&&e.push("testing"),r.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function bv(r){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[r]||e.general}var fv,Sv,Al,Cv,pg,mg=y(()=>{"use strict";Er();Oo();_();fv=3600*1e3;l(ag,"hashDescription");l(cg,"loadCache");l(Il,"saveCache");l(hv,"lookupCache");l(yv,"lookupPatterns");l(wv,"classifyWithLLM");Sv={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(kv,"classifyWithHeuristic");l(dg,"buildAvailableDomains");l(bv,"getFilePatterns");Al=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=ag(e),i=await cg(n),a=hv(i,o,t);if(a)return{classification:a,source:"cache"};let c=yv(i,o);if(c)return{classification:c,source:"history"};let u=await wv(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Il(n,i),{classification:u,source:"llm"};let d=kv(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Il(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=ag(e),o=await cg(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Il(n,o))}},Cv=new Al,pg=Cv});import{exec as vv}from"node:child_process";import to from"node:fs/promises";import xv from"node:os";import Zn from"node:path";import{promisify as Pv}from"node:util";var gg,fg,jl,Tv,Ni,Dl=y(()=>{"use strict";Cl();Ve();Ce();vs();Ut();vl();xl();_i();_();Xn();mg();qn();gg=Pv(vv),fg=["database","backend","frontend","testing","devops"],jl=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=A.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),[m,p,g]=await Promise.all([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),f=this.shouldFragment(a,t),S=null;return f&&e==="task"&&(S=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:f,subtasks:S,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:m,sealedAnalysis:p,velocityContext:g}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Yr(e,t,{maxFiles:10,minScore:.15}),Qr(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await An(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(`
|
|
417
|
+
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.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,n]=await Promise.all([gg("git branch --show-current",{cwd:e}),gg("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
|
|
418
|
+
`).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:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await Zt.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=$i(t,kn);return n.sprints.length===0?null:tg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=Zn.join(e,"analysis","repo-analysis.json"),n=await to.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return v(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=A.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await pg.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=Zn.join(e,"agents");return(await to.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=A.getGlobalProjectPath(t),s=Zn.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=Zn.join(s,u);try{let m=await to.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=si(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=Zn.join(xv.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=Zn.join(t,`${i}.md`),c=Zn.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=fg.indexOf(a),d=fg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Tv=new jl,Ni=Tv});function Ev(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 Rl,Iv,_e,hg=y(()=>{"use strict";Ot();le();ln();ln();l(Ev,"generateApprovalPrompt");Rl=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return cc.includes(e)}isDestructive(e){return lc.includes(e)}isToolAllowedInPlanning(e){return Go.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Go.includes(n)):t}startPlanning(e,t,n){let s={id:Se(),projectId:e,command:t,params:n,status:se.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[se.GATHERING,se.ANALYZING,se.PROPOSING,se.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===se.APPROVED?n.approvedAt=C():t===se.EXECUTING?n.executionStartedAt=C():(t===se.COMPLETED||t===se.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=se.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=se.PENDING_APPROVAL,this.formatPlanForApproval(n)):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 n=this.getActivePlan(e);return!n||n.status!==se.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=se.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=se.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==se.APPROVED?null:(t.status=se.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==se.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==se.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=se.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=se.ABORTED,n.completedAt=C(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Ev(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[se.GATHERING]:"\u{1F50D}",[se.ANALYZING]:"\u{1F9E0}",[se.PROPOSING]:"\u{1F4DD}",[se.PENDING_APPROVAL]:"\u23F3",[se.APPROVED]:"\u2705",[se.EXECUTING]:"\u26A1",[se.COMPLETED]:"\u{1F389}",[se.REJECTED]:"\u274C",[se.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===se.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
|
|
419
|
+
`)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},Iv=new Rl,_e=Iv});function Av(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Li[t]?Li[t]:Li[e]?Li[e]:e}function Hi(r){let e=new Set,t=[];for(let n of r){let s=Av(n);e.has(s)||(e.add(s),t.push(n))}return t}var Li,$l=y(()=>{"use strict";Li={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(Av,"normalizeFrameworkName");l(Hi,"deduplicateTechStack")});import{z as Ne}from"zod";function yg(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
420
|
+
`);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=Hi(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),r.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${r.analysisPackageManager}`),r.domains){let c=Object.entries(r.domains).filter(([,u])=>!u).map(([u])=>jv[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=r.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${r.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),r.fileCount&&e.push(`
|
|
557
421
|
Context: ${r.fileCount} files in project.`),e.join(`
|
|
558
|
-
`)}var
|
|
559
|
-
`,"utf-8"),
|
|
560
|
-
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",
|
|
422
|
+
`)}var H_,jv,wg=y(()=>{"use strict";$l();H_=Ne.object({projectPath:Ne.string(),language:Ne.string().optional(),framework:Ne.string().optional(),techStack:Ne.array(Ne.string()).default([]),domains:Ne.object({hasFrontend:Ne.boolean().default(!1),hasBackend:Ne.boolean().default(!1),hasDatabase:Ne.boolean().default(!1),hasTesting:Ne.boolean().default(!1),hasDocker:Ne.boolean().default(!1)}).optional(),fileCount:Ne.number().optional(),availableAgents:Ne.array(Ne.string()).default([]),analysisLanguages:Ne.array(Ne.string()).default([]),analysisFrameworks:Ne.array(Ne.string()).default([]),analysisPackageManager:Ne.string().optional()}),jv={hasFrontend:"Frontend (UI/components)",hasBackend:"Backend (APIs/servers)",hasDatabase:"Database (SQL/ORM)",hasTesting:"Testing (unit/integration)",hasDocker:"Docker/containers"};l(yg,"buildAntiHallucinationBlock")});import{z as Wt}from"zod";var Dv,Sg,kg=y(()=>{"use strict";Dv=Wt.object({agents:Wt.boolean(),patterns:Wt.boolean(),checklist:Wt.boolean(),modules:Wt.array(Wt.string())}),Sg=Wt.object({version:Wt.string(),description:Wt.string().optional(),commands:Wt.record(Wt.string(),Dv).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Ml(r,e){return e.filter(t=>new RegExp(`\\b${t}\\b`).test(r)).length}function bg(r,e){let t=(e.frontmatter?.description||"").toLowerCase(),n=e.content.toLowerCase(),s=e.frontmatter?.["allowed-tools"]||[],o=`${r} ${t} ${n}`,i=Ml(o,Rv),a=Ml(o,$v),c=Ml(o,Mv);return s.some(d=>Ov.includes(d))&&i>0?{agents:!0,patterns:!0,checklist:c>0,modules:[]}:c>0&&c>=a?{agents:!1,patterns:!0,checklist:!0,modules:[]}:a>0&&i===0?{agents:!1,patterns:!1,checklist:!1,modules:[]}:{agents:!0,patterns:!0,checklist:!1,modules:[]}}var Rv,$v,Mv,Ov,Cg=y(()=>{"use strict";Rv=["build","create","add","implement","fix","refactor","update","modify","change","write","generate","scaffold","migrate","optimize","improve","enhance","redesign","rewrite"],$v=["list","show","get","status","info","check","view","display","describe","explain","analyze","report","dashboard"],Mv=["test","verify","validate","review","audit","check","lint","ship","deploy","release","complete","done","finish"],Ov=["Write","Edit","Bash"];l(Ml,"countMatches");l(bg,"classifyCommand")});import Ol from"node:fs/promises";import Fv from"node:path";async function xg(){if(no)return no;let r=await Ol.readFile(Fl,"utf-8"),e=JSON.parse(r);return no=Sg.parse(e),no}function _v(r){return Pg.get(r)}function Nv(r,e){Pg.set(r,e)}function Hv(r,e){let t=r,n=vg.get(t);return n&&Gv(n.entry,e)?(n.count++,n.count>=Lv):(vg.set(t,{entry:e,count:1}),!1)}async function Uv(r,e){let t=await Ol.readFile(Fl,"utf-8"),n=JSON.parse(t);n.commands[r]=e,await Ol.writeFile(Fl,`${JSON.stringify(n,null,2)}
|
|
423
|
+
`,"utf-8"),no=null}function Gv(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,n)=>t===e.modules[n])}function Tg(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let n=_v(e);if(n)return{entry:n,source:"cache"};if(t){let s=bg(e,t);return Nv(e,s),Hv(e,s)&&Uv(e,s).catch(()=>{}),{entry:s,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Fl,no,Pg,vg,Lv,Eg=y(()=>{"use strict";kg();dt();Cg();Fl=Fv.join(pe,"core/config/command-context.config.json"),no=null;l(xg,"loadCommandContextConfig");Pg=new Map;l(_v,"getCachedClassification");l(Nv,"cacheClassification");vg=new Map,Lv=3;l(Hv,"trackClassification");l(Uv,"persistClassification");l(Gv,"isSameEntry");l(Tg,"resolveCommandContextFull")});import zv from"node:os";import{z as nn}from"zod";function Wv(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Bv(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Ig(r){let e=r.platform??zv.platform(),t=r.runtime??Wv(),n=r.date??new Date().toISOString().split("T")[0];return`<env>
|
|
424
|
+
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",Bv(e)],["runtime",t],["date",n],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
561
425
|
`)}
|
|
562
|
-
</env>`}var
|
|
563
|
-
... (truncated to ~${e} tokens)`}function
|
|
564
|
-
`);return
|
|
426
|
+
</env>`}var nN,Ag=y(()=>{"use strict";nN=nn.object({projectName:nn.string(),projectPath:nn.string(),isGitRepo:nn.boolean().default(!0),gitBranch:nn.string().optional(),platform:nn.string().optional(),runtime:nn.string().optional(),date:nn.string().optional(),model:nn.string().optional(),provider:nn.string().optional()});l(Wv,"detectRuntime");l(Bv,"normalizePlatform");l(Ig,"buildEnvironmentBlock")});function Dg(r){let e=r.getAllocationFor("injection");return{...Gi,totalPrompt:e}}function es(r,e){let t=e*Rg;return r.length<=t?r:`${r.substring(0,t)}
|
|
427
|
+
... (truncated to ~${e} tokens)`}function jg(r){return Math.ceil(r.length/Rg)}function $g(r,e){if(e.length===0||r.length===0)return r;let t=new Set;for(let n of e){let s=Vv[n.toLowerCase()];if(s)for(let o of s)t.add(o);t.add(n.toLowerCase())}return r.filter(n=>{let s=`${n.name} ${n.content}`.toLowerCase();for(let o of t)if(s.includes(o))return!0;return!1})}var Gi,Rg,Vv,Ui,Mg=y(()=>{"use strict";Gi={autoContext:500,agentContent:400,skillContent:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Dg,"budgetsFromCoordinator");Rg=4;l(es,"truncateToTokenBudget");l(jg,"estimateTokens");Vv={frontend:["react","vue","svelte","css","html","ui","component","frontend","web","dom"],backend:["api","server","backend","endpoint","route","middleware","database","sql"],testing:["test","spec","jest","vitest","cypress","playwright","coverage","assert"],devops:["docker","ci","cd","deploy","kubernetes","terraform","pipeline","github-actions"],docs:["documentation","readme","guide","tutorial","markdown"],design:["design","ux","ui","figma","wireframe","layout","accessibility"]};l($g,"filterSkillsByDomains");Ui=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Gi,...e}}addSection(e,t){let n=es(e,t),s=jg(n);if(this.used+s>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=es(n,o);return this.used+=jg(i),i}return this.used+=s,n}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});import Og from"node:fs/promises";import ts from"node:path";var _l,Jv,Fg,_g=y(()=>{"use strict";Ut();_();xe();dt();ml();wg();Eg();Ag();Mg();$l();qn();_l=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_currentContext=null;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;_coordinator=null;async getTemplate(e){let t=this._templateCache.get(e),n=Date.now();if(t&&n-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await P(e)){let s=await Og.readFile(e,"utf-8");return this._templateCache.set(e,{content:s,loadedAt:n}),s}}catch(s){v(s)||console.error(`Template loading warning: ${w(s)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}setCoordinator(e){this._coordinator=e}getCoordinator(){return this._coordinator}getEffectiveBudgets(){return this._coordinator?Dg(this._coordinator):Gi}resetContext(){this._currentContext=null}setContext(e){this._currentContext=e}async loadModule(e){let t=ve(`global/modules/${e}`);if(t)return t;let n=ts.join(pe,"templates/global/modules",e);return this.getTemplate(n)}getModulesForCommand(e,t){return t?t.modules:[]}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let n=Ms("checklists/");if(n.length>0){for(let s of n)if(s.endsWith(".md")){let o=ve(s);if(o){let i=ts.basename(s,".md");t[i]=o}}}else{let s=ts.join(pe,"templates","checklists");if(await P(s)){let o=(await Og.readdir(s)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=ts.join(s,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(n){v(n)||console.error(`Checklist loading warning: ${w(n)}`)}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[n,s]=await Promise.all([L.read(e),Pe.read(e)]),o={projectId:e,currentTask:n.currentTask,queue:s.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(n){if(v(n)||n instanceof SyntaxError)return null;throw n}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let n=[];if(n.push("## AUTO-INJECTED CONTEXT"),n.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);n.push(`**Current Task**: ${t.currentTask.description}`),n.push(`- Started: ${o} ago`)}else n.push("**Current Task**: None");if(n.push(""),t.queue.length>0){n.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)n.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&n.push(`- ... and ${t.queue.length-3} more`)}n.push("");try{let o=await ll.detectPatterns(e);if(o.length>0){n.push("**Project Conventions**");for(let i of o.slice(0,3))n.push(`- ${i.description}`),i.suggestedAction&&n.push(` \u2192 ${i.suggestedAction}`);n.push("")}}catch(o){!v(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${w(o)}`)}n.push("---"),n.push("");let s=n.join(`
|
|
428
|
+
`);return es(s,this.getEffectiveBudgets().autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),s=Date.now()-t,o=Math.floor(s/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=ts.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),n=await this.getTemplate(t);return n&&(this._checklistRoutingCache=n,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,n,s=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,n,s,o,i,a,c);return u.push(d),u.join("")}async build(e,t,n,s=null,o=null,i=null,a=null,c=null,u=null){let d=[];this._currentContext=t;let m=e.frontmatter?.name?.replace("p:","")||"",p;try{let k=await xg();p=Tg(k,m,e).entry}catch{p={agents:!0,patterns:!0,checklist:!1,modules:[]}}let g=p.agents;s&&g&&(d.push(`# AGENT: ${s.name}
|
|
565
429
|
`),s.role&&d.push(`Role: ${s.role}
|
|
566
430
|
`),s.skills?.length&&d.push(`Skills: ${s.skills.join(", ")}
|
|
567
431
|
`),d.push(`
|
|
@@ -570,86 +434,86 @@ Apply specialized expertise. Read agent file for details if needed.
|
|
|
570
434
|
`)),d.push(`TASK: ${e.frontmatter.description}
|
|
571
435
|
`),e.frontmatter["allowed-tools"]&&d.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
572
436
|
`);let f=t;(f.params?.task||f.params?.description)&&d.push(`INPUT: ${f.params.task||f.params.description}
|
|
573
|
-
`);let
|
|
574
|
-
${
|
|
575
|
-
`)}if(u){let
|
|
437
|
+
`);let S=t.projectPath;if(S){let k=u?.project?.id?ts.basename(S):ts.basename(S),j=Ig({projectName:k,projectPath:S,isGitRepo:!0,gitBranch:u?.realContext?.gitBranch});d.push(`
|
|
438
|
+
${j}
|
|
439
|
+
`)}if(u){let k=u.sealedAnalysis;if(d.push(`
|
|
576
440
|
## PROJECT ANALYSIS (Sealed)
|
|
577
441
|
`),d.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
578
442
|
`),d.push(`**Primary Domain**: ${u.primaryDomain}
|
|
579
443
|
`),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
580
|
-
`),
|
|
581
|
-
`),
|
|
582
|
-
`),
|
|
583
|
-
`),
|
|
584
|
-
`),
|
|
585
|
-
`),d.push(`**Files Analyzed**: ${
|
|
586
|
-
`),d.push(`**Analysis Status**: ${
|
|
587
|
-
`),
|
|
444
|
+
`),k){if(k.languages.length>0&&d.push(`**Languages**: ${k.languages.join(", ")}
|
|
445
|
+
`),k.frameworks.length>0&&d.push(`**Frameworks**: ${k.frameworks.join(", ")}
|
|
446
|
+
`),k.packageManager&&d.push(`**Package Manager**: ${k.packageManager}
|
|
447
|
+
`),k.sourceDir&&d.push(`**Source Dir**: ${k.sourceDir}
|
|
448
|
+
`),k.testDir&&d.push(`**Test Dir**: ${k.testDir}
|
|
449
|
+
`),d.push(`**Files Analyzed**: ${k.fileCount}
|
|
450
|
+
`),d.push(`**Analysis Status**: ${k.status}${k.commitHash?` (commit: ${k.commitHash.slice(0,8)})`:""}
|
|
451
|
+
`),k.patterns.length>0){d.push(`
|
|
588
452
|
### Code Patterns (Follow These)
|
|
589
|
-
`);for(let
|
|
590
|
-
`)}if(
|
|
453
|
+
`);for(let j of k.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
|
|
454
|
+
`)}if(k.antiPatterns.length>0){d.push(`
|
|
591
455
|
### Anti-Patterns (Avoid These)
|
|
592
|
-
`);for(let
|
|
456
|
+
`);for(let j of k.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
|
|
593
457
|
`)}}d.push(`
|
|
594
|
-
`)}let
|
|
595
|
-
`),d.push(
|
|
458
|
+
`)}let b=p.patterns,D=n?.codePatterns||"";if(b&&D&&D.trim()){let k=this.extractPatternSummary(D);k&&(d.push(`## CODE PATTERNS
|
|
459
|
+
`),d.push(k),d.push(`
|
|
596
460
|
Full patterns: Read analysis/patterns.md
|
|
597
|
-
`))}let
|
|
461
|
+
`))}let x=n?.analysis||"";if(b&&x&&x.trim()){let k=x.match(/Stack[:\s]+([^\n]+)/i)||x.match(/Technology[:\s]+([^\n]+)/i),j=k?k[1].trim():"detected";d.push(`
|
|
598
462
|
## STACK
|
|
599
|
-
Stack: ${
|
|
600
|
-
`),
|
|
463
|
+
Stack: ${j}
|
|
464
|
+
`),D||d.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
601
465
|
`)}if(u){if(u.agents.length>0){d.push(`
|
|
602
466
|
### LOADED AGENTS (Project-Specific Specialists)
|
|
603
467
|
|
|
604
|
-
`);for(let
|
|
605
|
-
`),
|
|
606
|
-
`),
|
|
607
|
-
`),
|
|
608
|
-
`);let ee=
|
|
468
|
+
`);for(let j of u.agents){d.push(`#### Agent: ${j.name} (${j.domain})
|
|
469
|
+
`),j.effort&&d.push(`Effort: ${j.effort}
|
|
470
|
+
`),j.model&&d.push(`Model: ${j.model}
|
|
471
|
+
`),j.skills.length>0&&d.push(`Skills: ${j.skills.join(", ")}
|
|
472
|
+
`);let ee=es(j.content,this.getEffectiveBudgets().agentContent);d.push(`\`\`\`markdown
|
|
609
473
|
${ee}
|
|
610
474
|
\`\`\`
|
|
611
475
|
|
|
612
|
-
`)}}let
|
|
476
|
+
`)}}let k=$g(u.skills,u.detectedDomains);if(k.length>0){d.push(`### LOADED SKILLS (From Agent Frontmatter)
|
|
613
477
|
|
|
614
|
-
`);for(let
|
|
615
|
-
`);let ee=
|
|
478
|
+
`);for(let j of k){d.push(`#### Skill: ${j.name}
|
|
479
|
+
`);let ee=es(j.content,this.getEffectiveBudgets().skillContent);d.push(`\`\`\`markdown
|
|
616
480
|
${ee}
|
|
617
481
|
\`\`\`
|
|
618
482
|
|
|
619
|
-
`)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let
|
|
620
|
-
`),d.push(
|
|
483
|
+
`)}}}let O=this.getModulesForCommand(m,p);if(O.length>0)for(let k of O){let j=await this.loadModule(k);j&&(d.push(`
|
|
484
|
+
`),d.push(j))}if(c?.isPlanning&&(d.push(`
|
|
621
485
|
## PLAN MODE
|
|
622
486
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
623
487
|
`),c.allowedTools&&d.push(`Tools: ${c.allowedTools.join(", ")}
|
|
624
488
|
`)),c?.requiresApproval&&d.push(`
|
|
625
489
|
## APPROVAL REQUIRED
|
|
626
490
|
Show changes, list affected files, ask for confirmation.
|
|
627
|
-
`),
|
|
628
|
-
${
|
|
629
|
-
`)}else d.push(this.buildCriticalRules());if(u?.realContext){let
|
|
491
|
+
`),S){let k=u?.sealedAnalysis,j=[...k?.frameworks||[],...u?.project?.conventions||[]],ee={projectPath:S,language:u?.project?.ecosystem,framework:k?.frameworks?.[0],techStack:Hi(j),domains:this.extractDomains(n),fileCount:t.files?.length||t.filteredSize||0,availableAgents:u?.agents?.map(N=>N.name)||[],analysisLanguages:k?.languages||[],analysisFrameworks:k?.frameworks||[],analysisPackageManager:k?.packageManager};d.push(`
|
|
492
|
+
${yg(ee)}
|
|
493
|
+
`)}else d.push(this.buildCriticalRules());if(u?.realContext){let k=u.realContext;if(d.push(`
|
|
630
494
|
### CODEBASE CONTEXT
|
|
631
495
|
|
|
632
|
-
`),d.push(`**Git State**: Branch \`${
|
|
496
|
+
`),d.push(`**Git State**: Branch \`${k.gitBranch}\` | ${k.gitStatus}
|
|
633
497
|
|
|
634
|
-
`),
|
|
498
|
+
`),k.relevantFiles.length>0){d.push(`**Relevant Files** (scored by task relevance):
|
|
635
499
|
`),d.push(`| Score | File | Why |
|
|
636
500
|
`),d.push(`|-------|------|-----|
|
|
637
|
-
`);for(let
|
|
501
|
+
`);for(let j of k.relevantFiles.slice(0,8))d.push(`| ${j.score} | ${j.path} | ${j.reason} |
|
|
638
502
|
`);d.push(`
|
|
639
|
-
`)}if(
|
|
640
|
-
`);for(let
|
|
641
|
-
// ${
|
|
642
|
-
${
|
|
503
|
+
`)}if(k.signatures.length>0){d.push(`**Code Signatures** (top files):
|
|
504
|
+
`);for(let j of k.signatures)d.push(`\`\`\`typescript
|
|
505
|
+
// ${j.path}
|
|
506
|
+
${j.content}
|
|
643
507
|
\`\`\`
|
|
644
508
|
`);d.push(`
|
|
645
|
-
`)}if(
|
|
509
|
+
`)}if(k.recentFiles.length>0){d.push("**Recently Changed**: ");let j=k.recentFiles.slice(0,5).map(ee=>`${ee.path} (${ee.lastChanged})`).join(", ");d.push(`${j}
|
|
646
510
|
|
|
647
|
-
`)}}let F=t.files||[];if(F.length>0){let
|
|
648
|
-
## FILES: ${F.length} available. Top: ${
|
|
511
|
+
`)}}let F=t.files||[];if(F.length>0){let k=F.slice(0,5).join(", ");d.push(`
|
|
512
|
+
## FILES: ${F.length} available. Top: ${k}
|
|
649
513
|
`),d.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
650
514
|
|
|
651
|
-
`)}else
|
|
652
|
-
## PROJECT: ${
|
|
515
|
+
`)}else S&&d.push(`
|
|
516
|
+
## PROJECT: ${S}
|
|
653
517
|
Read files before modifying.
|
|
654
518
|
|
|
655
519
|
`);let K=this.filterRelevantState(n);if(K&&(d.push(`
|
|
@@ -660,20 +524,20 @@ Read files before modifying.
|
|
|
660
524
|
|
|
661
525
|
`),d.push(u.velocityContext),d.push(`
|
|
662
526
|
|
|
663
|
-
`)),o&&Object.keys(o).some(
|
|
527
|
+
`)),o&&Object.keys(o).some(k=>o[k])){d.push(`
|
|
664
528
|
## PROJECT DEFAULTS (apply automatically)
|
|
665
|
-
`);for(let[
|
|
529
|
+
`);for(let[k,j]of Object.entries(o))j&&d.push(`- ${k}: ${j}
|
|
666
530
|
`)}if(i?.plan&&i.plan.length>0){if(d.push(`
|
|
667
531
|
## THINK FIRST (reasoning from analysis)
|
|
668
532
|
`),i.conclusions&&i.conclusions.length>0){d.push(`Conclusions:
|
|
669
|
-
`);for(let
|
|
533
|
+
`);for(let k of i.conclusions)d.push(` \u2192 ${k}
|
|
670
534
|
`)}d.push(`Plan:
|
|
671
|
-
`);for(let
|
|
535
|
+
`);for(let k=0;k<i.plan.length;k++)d.push(` ${k+1}. ${i.plan[k]}
|
|
672
536
|
`);d.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
|
|
673
537
|
`)}if(a&&a.length>0){d.push(`
|
|
674
538
|
## CONTEXT (apply these)
|
|
675
|
-
`);for(let
|
|
676
|
-
`),
|
|
539
|
+
`);for(let k of a)d.push(`- **${k.title}**: ${k.content}
|
|
540
|
+
`),k.tags&&k.tags.length>0&&d.push(` Tags: ${k.tags.join(", ")}
|
|
677
541
|
`)}if(d.push(`
|
|
678
542
|
---
|
|
679
543
|
`),d.push(e.content),u?.requiresFragmentation&&u.subtasks){d.push(`
|
|
@@ -681,34 +545,34 @@ Read files before modifying.
|
|
|
681
545
|
|
|
682
546
|
`),d.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),d.push(`| # | Domain | Description | Status |
|
|
683
547
|
`),d.push(`|---|--------|-------------|--------|
|
|
684
|
-
`);for(let
|
|
685
|
-
`)}let
|
|
686
|
-
**FOCUS ON SUBTASK #${
|
|
687
|
-
`),d.push(`Agent: ${
|
|
688
|
-
`),
|
|
689
|
-
`),
|
|
548
|
+
`);for(let j of u.subtasks){let ee=j.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":j.status==="completed"?"\u2705 Done":j.status==="failed"?"\u274C Failed":"\u23F3 Pending";d.push(`| ${j.order} | ${j.domain} | ${j.description} | ${ee} |
|
|
549
|
+
`)}let k=u.subtasks.find(j=>j.status==="in_progress");if(k&&(d.push(`
|
|
550
|
+
**FOCUS ON SUBTASK #${k.order}**: ${k.description}
|
|
551
|
+
`),d.push(`Agent: ${k.agent} | Domain: ${k.domain}
|
|
552
|
+
`),k.dependsOn.length>0&&d.push(`Dependencies: ${k.dependsOn.join(", ")}
|
|
553
|
+
`),k.handoff)){let j=k.handoff;d.push(`
|
|
690
554
|
### Previous Subtask Handoff
|
|
691
555
|
|
|
692
|
-
`),d.push(`**From:** ${
|
|
556
|
+
`),d.push(`**From:** ${j.fromSubtask}
|
|
693
557
|
|
|
694
558
|
`),d.push(`**What was done:**
|
|
695
|
-
`);for(let ee of
|
|
696
|
-
`);if(
|
|
559
|
+
`);for(let ee of j.whatWasDone)d.push(`- ${ee}
|
|
560
|
+
`);if(j.filesChanged.length>0){d.push(`
|
|
697
561
|
**Files changed:**
|
|
698
|
-
`);for(let ee of
|
|
562
|
+
`);for(let ee of j.filesChanged)d.push(`- \`${ee.path}\` (${ee.action})
|
|
699
563
|
`)}d.push(`
|
|
700
564
|
**Context for this subtask:**
|
|
701
|
-
${
|
|
565
|
+
${j.outputForNextAgent}
|
|
702
566
|
`)}d.push(`
|
|
703
|
-
`)}let oe=this.getSchemaTypeForCommand(m);if(oe){let{renderSchemaForPrompt:
|
|
704
|
-
${
|
|
705
|
-
`)}if(p.checklist){let
|
|
567
|
+
`)}let oe=this.getSchemaTypeForCommand(m);if(oe){let{renderSchemaForPrompt:k}=await Promise.resolve().then(()=>(Oo(),Qd)),j=k(oe);j&&d.push(`
|
|
568
|
+
${j}
|
|
569
|
+
`)}if(p.checklist){let k=await this.loadChecklistRouting(),j=await this.loadChecklists();k&&Object.keys(j).length>0&&(d.push(`
|
|
706
570
|
## QUALITY CHECKLISTS
|
|
707
571
|
`),d.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
708
|
-
`),d.push(`Available: ${Object.keys(
|
|
572
|
+
`),d.push(`Available: ${Object.keys(j).join(", ")}
|
|
709
573
|
`),d.push(`Path: templates/checklists/{name}.md
|
|
710
574
|
`),d.push(`Use Read tool to load checklists you determine are relevant.
|
|
711
|
-
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new
|
|
575
|
+
`))}return d.push(this.buildEfficiencyDirective()),d.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=this.getEffectiveBudgets(),n=new Ui({totalPrompt:t.stateData}),s=["now","next","context","analysis","codePatterns"],o=[];for(let[i,a]of Object.entries(e))if(a&&a.trim()){let c=s.includes(i)?500:250,u=n.addSection(`### ${i}
|
|
712
576
|
${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
713
577
|
|
|
714
578
|
`):null}buildAnalysis(e,t){let n=[];return n.push(`# Analyze: ${e}
|
|
@@ -725,7 +589,7 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
725
589
|
`);a&&t.push(a)}let s=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(s){let a=s[0].substring(0,300);t.push(`
|
|
726
590
|
Avoid:
|
|
727
591
|
${a}`)}let o=t.join(`
|
|
728
|
-
`);return
|
|
592
|
+
`);return es(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}buildCriticalRules(){return`
|
|
729
593
|
## RULES (CRITICAL)
|
|
730
594
|
1. **READ FIRST**: Use Read tool BEFORE modifying any file. Never assume code structure.
|
|
731
595
|
2. **MATCH PATTERNS**: Follow existing style, architecture, naming, imports exactly.
|
|
@@ -742,7 +606,7 @@ Context: ${this._currentContext?.files?.length||this._currentContext?.filteredSi
|
|
|
742
606
|
- Prefer structured output (JSON) over free text when applicable.
|
|
743
607
|
|
|
744
608
|
EXECUTE: Follow flow. Use tools. Decide.
|
|
745
|
-
`}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},
|
|
609
|
+
`}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let n=t.domains;return{hasFrontend:n.hasFrontend??!1,hasBackend:n.hasBackend??!1,hasDatabase:n.hasDatabase??!1,hasTesting:n.hasTesting??!1,hasDocker:n.hasDocker??!1}}}},Jv=new _l,Fg=Jv});import Ng from"node:fs/promises";import At from"node:path";var qv,Kv,Nl,Ll,zi,Hl=y(()=>{"use strict";Ve();Ce();_();qv=["task","done","ship","resume","bug","enrich"],Kv=["init","sync","pause","next","dash","history","undo","redo"],Nl=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return At.dirname(hr.resolve("prjct-cli/package.json"))}async getProjectId(e){return R.getProjectId(e)}async buildContext(e,t,n){let s=await this.getProjectId(n),o=A.getGlobalProjectPath(s),a=await(Be(),xt(ut)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=At.join(u,"templates")}catch{c=At.join(__dirname,"..","..","templates")}return{projectPath:n,projectId:s,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:At.join(c,"agentic","orchestrator.md"),agentRouting:At.join(c,"agentic","agent-routing.md"),taskFragmentation:At.join(c,"agentic","task-fragmentation.md"),commandTemplate:At.join(c,"commands",`${e}.md`),repoAnalysis:At.join(o,"analysis","repo-analysis.json"),agentsDir:At.join(o,"agents"),skillsDir:a.skillsDir,stateJson:At.join(o,"storage","state.json")}}}requiresOrchestration(e){return qv.includes(e)?!0:!Kv.includes(e)}async hasAgents(e){try{let t=await this.getProjectId(e),n=At.join(A.getGlobalProjectPath(t),"agents");return(await Ng.readdir(n)).some(o=>o.endsWith(".md"))}catch(t){return v(t),!1}}async getAvailableAgents(e){try{let t=await this.getProjectId(e),n=At.join(A.getGlobalProjectPath(t),"agents");return(await Ng.readdir(n)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch{return[]}}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
746
610
|
## Agentic Execution Mode
|
|
747
611
|
|
|
748
612
|
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
@@ -825,13 +689,13 @@ When fragmenting tasks:
|
|
|
825
689
|
2. Track progress: currentSubtaskIndex, subtaskProgress
|
|
826
690
|
3. Each completed subtask generates a summary
|
|
827
691
|
4. Pass summary to next agent for context handoff
|
|
828
|
-
`,context:e,requiresOrchestration:t}}},
|
|
829
|
-
`+
|
|
830
|
-
`+
|
|
831
|
-
`+
|
|
832
|
-
`+
|
|
833
|
-
`+
|
|
834
|
-
`}},
|
|
692
|
+
`,context:e,requiresOrchestration:t}}},Ll=new Nl,zi=Ll});import{exec as Yv}from"node:child_process";import Lg from"node:fs/promises";import{promisify as Xv}from"node:util";var Qv,ns,Ke,Ul=y(()=>{"use strict";ci();Qv=Xv(Yv),ns={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};ns.register("Read",async r=>{try{return await Ur.execute(async()=>await Lg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return ai(e)||Hr(e),null}});ns.register("Write",async(r,e)=>{try{return await Ur.execute(async()=>await Lg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return ai(t)||Hr(t),!1}});ns.register("Bash",async r=>{try{return await Ur.execute(async()=>await Qv(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});ns.register("GetTimestamp",async()=>new Date().toISOString());ns.register("GetDate",async()=>new Date().toISOString().split("T")[0]);ns.register("GetDateTime",async()=>new Date().toISOString());Ke=ns});import Gl from"node:fs/promises";import Zv from"node:os";import Hg from"node:path";async function ex(r){try{let e=Hg.dirname(Wi);await P(e)||await Gl.mkdir(e,{recursive:!0}),await Gl.writeFile(Wi,`/p:${r}`)}catch{}}async function tx(){try{await P(Wi)&&await Gl.unlink(Wi)}catch{}}var Wi,zl,nx,Bi,Wl=y(()=>{"use strict";_();$m();xe();Fm();Nm();hl();Xm();Qm();Rs();Dl();hg();_g();Hl();qn();Ul();Wi=Hg.join(Zv.homedir(),".prjct-cli",".running");l(ex,"signalStart");l(tx,"signalEnd");zl=class{static{l(this,"CommandExecutor")}async signalStart(e){await ex(e)}async signalEnd(){await tx()}async execute(e,t,n){await this.signalStart(e);let s=t.task||t.description||"";if(Hs.shouldEscalate(e,s)){let o=Hs.getEscalationInfo(e,s);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await Rc.load(e),i=await ft.build(n,t),a=_e.requiresPlanning(e),c=_e.isDestructive(e),u=_e.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=_e.startPlanning(i.projectId,e,t):u&&(d=_e.getActivePlan(i.projectId));let m=null;if(Ri.requiresVerification(e)){let k=await ft.loadStateForCommand(i,e);m=await Ri.verify(e,i,k),!m.verified&&m.warnings.length>0&&console.log(Ri.formatWarnings(m))}let p=null;if(Di.requiresReasoning(e)){let k=await ft.loadStateForCommand(i,e);p=await Di.reason(e,i,k),p.reasoning&&!p.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Di.formatPlan(p)))}let g=t.task||t.description||"",f=await zi.buildContext(e,g,n),S=zi.buildAgenticPrompt(f),b=null;if(zi.requiresOrchestration(e)&&g)try{b=await Ni.execute(e,g,n),b.detectedDomains.length>0&&ji.orchestrate(b.detectedDomains);for(let k of b.agents){let j=k.domain||k.name.replace(".md","");ji.startAgent(k.name,j,`Loading ${j} specialist...`),ji.endAgent(!0)}if(b.requiresFragmentation&&b.subtasks){let k=b.subtasks.map(j=>({id:j.id,domain:j.domain,description:j.description,status:j.status}));Om(k)}}catch(k){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(k)}`)}let D={...i,agentsPath:f.paths.agentsDir,agentRoutingPath:f.paths.agentRouting,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},x=await ft.loadState(i),O=null,F=null;i.projectId&&(O={commit_footer:await Te.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Te.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Te.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Te.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await Te.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let K={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},oe=await Fg.build(o,D,x,null,O,null,F,K,b);return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),S.requiresOrchestration&&console.log(` \u2192 Orchestration: ${f.paths.orchestrator}`),Hs.recordSuccess(e,s),await this.signalEnd(),{success:!0,template:o,context:D,state:x,prompt:oe,agenticDelegation:!0,agenticMode:!0,agenticExecContext:f,agenticPrompt:S.prompt,requiresOrchestration:S.requiresOrchestration,agentsPath:D.agentsPath,agentRoutingPath:D.agentRoutingPath,orchestratorPath:f.paths.orchestrator,taskFragmentationPath:f.paths.taskFragmentation,reasoning:p,groundTruth:m,learnedPatterns:O,relevantMemories:F,orchestratorContext:b,memory:{create:l(k=>Te.createMemory(i.projectId,k),"create"),autoRemember:l((k,j,ee)=>Te.autoRemember(i.projectId,k,j,ee),"autoRemember"),search:l(k=>Te.searchMemories(i.projectId,k),"search"),findByTags:l(k=>Te.findByTags(i.projectId,k),"findByTags"),getStats:l(()=>Te.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(k=>_e.recordGatheredInfo(i.projectId,k),"recordInfo"),setAnalysis:l(k=>_e.setAnalysis(i.projectId,k),"setAnalysis"),propose:l(k=>_e.proposePlan(i.projectId,k),"propose"),approve:l(k=>_e.approvePlan(i.projectId,k),"approve"),reject:l(k=>_e.rejectPlan(i.projectId,k),"reject"),getApprovalPrompt:l(()=>_e.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>_e.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>_e.getNextStep(i.projectId),"getNextStep"),completeStep:l(k=>_e.completeStep(i.projectId,k),"completeStep"),failStep:l(k=>_e.failStep(i.projectId,k),"failStep"),abort:l(k=>_e.abortPlan(i.projectId,k),"abort"),getStatus:l(()=>_e.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>_e.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Hs.recordAttempt(e,s,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Hs.getEscalationInfo(e,s);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,n){if(!Ke.isAllowed(e,n))throw new Error(`Tool ${e} not allowed for this command`);let s=Ke.get(e);if(!s)throw new Error(`Tool ${e} not found`);return await s(...t)}async executeSimple(e,t,n){try{let o=(await Rc.load(e)).frontmatter["allowed-tools"]||[],i=await ft.build(n);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,d)=>this.executeTool("Write",[u,d],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(s){return{success:!1,error:w(s)}}}},nx=new zl,Bi=nx});import Vi from"node:fs/promises";import sx from"node:https";import rx from"node:os";import Bl from"node:path";import Bt from"chalk";var Vl,Ug,Gg=y(()=>{"use strict";_();xe();Vl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Bl.join(rx.homedir(),".prjct-cli","config"),this.cacheFile=Bl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Bl.join(__dirname,"..","..","package.json");return JSON.parse(await Vi.readFile(e,"utf8")).version}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=sx.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await P(this.cacheFile))return JSON.parse(await Vi.readFile(this.cacheFile,"utf8"))}catch{}return null}async writeCache(e){try{await P(this.cacheDir)||await Vi.mkdir(this.cacheDir,{recursive:!0}),await Vi.writeFile(this.cacheFile,JSON.stringify(e,null,2),"utf8")}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
693
|
+
`+Bt.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
|
|
694
|
+
`+Bt.yellow("\u2502")+" "+Bt.bold("Update available!")+" "+Bt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Bt.yellow("\u2502")+`
|
|
695
|
+
`+Bt.yellow("\u2502")+" "+Bt.yellow("\u2502")+`
|
|
696
|
+
`+Bt.yellow("\u2502")+" Run: "+Bt.cyan("npm update -g prjct-cli")+" "+Bt.yellow("\u2502")+`
|
|
697
|
+
`+Bt.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
|
|
698
|
+
`}},Ug=Vl});var ke,rt=y(()=>{"use strict";Wl();hl();Ul();Ve();Ce();Gg();Dn();le();xe();Nt();ke=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Ug,this.updateNotificationShown=!1,this.commandExecutor=Bi}get agent(){return Os.getAgent()}get agentInfo(){return Os.getInfo()}get currentAuthor(){return jn.getCurrentAuthor()}async initializeAgent(){return Os.initialize()}async ensureProjectInit(e){return jn.ensureInit(e)}async ensureAuthor(){return jn.ensureAuthor()}async getGlobalProjectPath(e){return jn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();return mt.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return jn.isEmptyDirectory(e)}async _detectExistingCode(e){return jn.hasExistingCode(e)}_breakdownFeatureTasks(e){return mi.breakdownFeature(e)}_detectBugSeverity(e){return mi.detectBugSeverity(e)}async _assignAgentForTask(e,t,n){return Os.assignForTask(e,t,n)}}});var zg={};ge(zg,{PlanningCommands:()=>rs});import ss from"node:path";async function ox(){if(!Jl){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(qi(),Wg));Jl=new r}return Jl}var Jl,rs,Ji=y(()=>{"use strict";Do();xn();Ot();Ut();_();_s();Ns();ml();rt();Jl=null;l(ox,"getAnalysisCommands");rs=class extends ke{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await R.isConfigured(t))return h.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new Ls(t).runNonInteractive());else if(a=await new Ls(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};h.step(1,4,"Detecting author...");let c=await bs(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},m=(await R.createConfig(t,u)).projectId;h.step(2,4,"Creating structure..."),await A.ensureProjectStructure(m);let p=A.getGlobalProjectPath(m),g={"core/now.md":`# NOW
|
|
835
699
|
|
|
836
700
|
No current task. Use \`/p:now\` to set focus.
|
|
837
701
|
`,"core/next.md":`# NEXT
|
|
@@ -851,17 +715,17 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
851
715
|
`,"planning/roadmap.md":`# ROADMAP
|
|
852
716
|
|
|
853
717
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
854
|
-
`,"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
|
|
718
|
+
`,"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[D,x]of Object.entries(g))await Ke.get("Write")(ss.join(p,D),x);let f=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!f){h.step(3,4,"Analyzing project...");let D=await ox();if((await D.analyze({},t)).success)return h.step(4,4,"Generating agents..."),a?.agents?await D.sync(t,{aiTools:a.agents}):await D.sync(t),h.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let b=n.idea;if(f&&!S){if(!b)return h.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};h.spin("architect mode...");let D=ss.join(p,"planning","architect-session.md"),x=`# Architect Session
|
|
855
719
|
|
|
856
720
|
## Idea
|
|
857
|
-
${
|
|
721
|
+
${b}
|
|
858
722
|
|
|
859
723
|
## Status
|
|
860
724
|
Initialized - awaiting stack recommendation
|
|
861
725
|
|
|
862
726
|
Generated: ${new Date().toLocaleString()}
|
|
863
|
-
`;return await
|
|
864
|
-
`);let s=await this.getGlobalProjectPath(t),o=
|
|
727
|
+
`;return await Ke.get("Write")(D,x),await Ee.installGlobalConfig(),h.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:b,wizard:a}}return await Ee.installGlobalConfig(),h.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_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(n=>{switch(n){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";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 n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return h.fail("description required"),{success:!1,error:"Description required"};let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin(`planning ${e}...`);let o=await ft.build(t,{description:e}),i=this._breakdownFeatureTasks(e),a=Se(),c=[];for(let m of i){let g=(await this._assignAgentForTask(m,t,o)).agent?.name||"generalist";c.push({task:m,agent:g})}await Pe.addTasks(s,c.map(m=>({description:m.task,priority:"medium",type:"feature",section:"active",featureId:a,originFeature:e,agent:m.agent}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:a,tasks:c.length,assignments:c.map(m=>({task:m.task,agent:m.agent})),timestamp:B.getTimestamp()});let u=c.reduce((m,p)=>(m[p.agent]=(m[p.agent]||0)+1,m),{}),d=Object.entries(u).map(([m,p])=>`${m}:${p}`).join(" ");return h.done(`${i.length} tasks [${d}]`),{success:!0,feature:e,featureId:a,tasks:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async bug(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("bug description required"),{success:!1,error:"Description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};n.md||h.spin("tracking bug...");let i=await ft.build(t,{description:e}),a=this._detectBugSeverity(e),u=(await this._assignAgentForTask(`fix bug: ${e}`,t,i)).agent?.name||"generalist",m={critical:"critical",high:"high",medium:"medium",low:"low"}[a]||"medium";return await Pe.addTask(o,{description:`\u{1F41B} ${e}`,priority:m,type:"bug",section:"active",agent:u}),await this.logToMemory(t,"bug_reported",{bug:e,severity:a,priority:m,agent:u,timestamp:B.getTimestamp()}),n.md?console.log(Ie(st("Bug Reported",e),zt({Severity:a,Priority:m,Agent:u}),Qe([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(h.done(`bug [${a}] \u2192 ${u}`),bt("bug")),{success:!0,bug:e,severity:a,agent:u}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let n=await this.ensureProjectInit(t);if(!n.success)return n;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
|
|
728
|
+
`);let s=await this.getGlobalProjectPath(t),o=ss.join(s,"planning","architect-session.md"),i;try{i=await ce.readFile(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
865
729
|
|
|
866
730
|
Create a plan first:
|
|
867
731
|
1. Run /p:init in an empty directory
|
|
@@ -882,7 +746,7 @@ The architect plan is ready. Claude will now:
|
|
|
882
746
|
4. Create starter files with boilerplate
|
|
883
747
|
`),console.log(`
|
|
884
748
|
\u{1F4A1} This command shows the plan.`),console.log(" For code generation, Claude Code will read this plan"),console.log(` and generate the structure automatically.
|
|
885
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:B.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=
|
|
749
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:B.getTimestamp(),idea:d}),{success:!0,plan:i,idea:d}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async idea(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return n.md||h.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await R.getProjectId(t);if(!o)return n.md||h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){n.md||h.spin("analyzing idea...");let c=A.getGlobalProjectPath(o),u=ss.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
886
750
|
|
|
887
751
|
## Idea
|
|
888
752
|
${e}
|
|
@@ -897,14 +761,14 @@ Initialized - awaiting architecture design
|
|
|
897
761
|
4. Generate roadmap
|
|
898
762
|
|
|
899
763
|
Generated: ${new Date().toLocaleString()}
|
|
900
|
-
`;return await
|
|
764
|
+
`;return await Ke.get("Write")(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),zt({Mode:"architecture"}),Qe([{label:"Continue planning",command:"prjct architect execute"}]))):(h.done("architecture session created"),console.log(`
|
|
901
765
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
902
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await
|
|
766
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return n.md||h.spin("capturing idea..."),await Ye.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:B.getTimestamp()}),n.md?console.log(Ie(st("Idea Captured",e),zt({Mode:"capture"}),Qe([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(h.done(`idea captured: ${e.slice(0,40)}`),bt("idea")),{success:!0,mode:"capture",idea:e}}catch(s){return n.md||h.fail(w(s)),{success:!1,error:w(s)}}}async spec(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){h.spin("loading specs...");let d=A.getGlobalProjectPath(s),m=ss.join(d,"planning","specs");try{let f=(await(await import("node:fs/promises")).readdir(m)).filter(S=>S.endsWith(".md")&&S!==".gitkeep");return f.length===0?(h.warn("no specs yet"),console.log(`
|
|
903
767
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
904
768
|
`),{success:!0,specs:[]}):(console.log(`
|
|
905
769
|
\u{1F4CB} SPECIFICATIONS
|
|
906
|
-
`),console.log("\u2550".repeat(50)),f.forEach((
|
|
907
|
-
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=
|
|
770
|
+
`),console.log("\u2550".repeat(50)),f.forEach((S,b)=>{let D=S.replace(".md","").replace(/-/g," ");console.log(` ${b+1}. ${D}`)}),console.log(`${"\u2550".repeat(50)}
|
|
771
|
+
`),{success:!0,specs:f})}catch{return h.warn("no specs directory"),{success:!0,specs:[]}}}h.spin("creating spec...");let o=A.getGlobalProjectPath(s),i=ss.join(o,"planning","specs");await ce.ensureDir(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=ss.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
908
772
|
|
|
909
773
|
## Overview
|
|
910
774
|
[Brief description of the feature]
|
|
@@ -934,27 +798,27 @@ Generated: ${new Date().toLocaleString()}
|
|
|
934
798
|
---
|
|
935
799
|
Created: ${new Date().toLocaleString()}
|
|
936
800
|
Status: Draft
|
|
937
|
-
`;return await
|
|
801
|
+
`;return await Ke.get("Write")(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:B.getTimestamp()}),h.done(`spec created: ${a}.md`),console.log(`
|
|
938
802
|
\u{1F4DD} Edit: ~/.prjct-cli/projects/${s}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
|
|
939
|
-
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var
|
|
803
|
+
`),{success:!0,feature:e,specPath:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});var Ki,jn,Bg=y(()=>{"use strict";cn();Do();Ve();Ce();_();xe();Nt();Ki=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await R.isConfigured(e))return{success:!0};h.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Ji(),zg)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await R.getProjectId(e);if(!t)throw xo.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 bs();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 hs(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return v(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await hs(e)).some(s=>t.includes(s))}catch(t){return v(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await R.isConfigured(e)}async needsMigration(e){return await R.needsMigration(e)}},jn=new Ki});import{exec as ix}from"node:child_process";import{promisify as ax}from"node:util";var ql,cx,Yi,so,Vg=y(()=>{"use strict";he();_();Zo();ql=ax(ix),cx={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},Yi=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...cx,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let n={};try{let c=$.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;n=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=n.lastSyncCommit||null;let s=n.lastSync;try{let{stdout:c}=await ql("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([ql(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),ql(`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(`
|
|
940
804
|
`).filter(Boolean):[],s){let c=new Date(s),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(n){return t.reason=`Error checking staleness: ${w(n)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let n=[];if(e.lastSyncCommit&&n.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&n.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&n.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&n.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&n.push(`Files changed: ${e.changedFiles.length}`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let s of e.significantChanges.slice(0,5))t.push(` \u2022 ${s}`);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(`
|
|
941
|
-
`)}async getSessionInfo(e){return
|
|
805
|
+
`)}async getSessionInfo(e){return vn.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
942
806
|
`);t.push(`Session: \u25B6 Active (${e.duration})`);let n=[];if(e.commandCount>0){let s=new Set,o=[];for(let i of e.commands)s.has(i)||(s.add(i),o.push(i));n.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&n.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),n.push(`Idle: ${e.expiresIn} until timeout`),n.length>0){let s=Math.max(...n.map(i=>i.length)),o="\u2500".repeat(s+2);t.push(`\u250C${o}\u2510`);for(let i of n)t.push(`\u2502 ${i.padEnd(s)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
|
|
943
|
-
`)}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}},
|
|
944
|
-
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=
|
|
807
|
+
`)}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}},so=l((r,e)=>new Yi(r,e),"createStalenessChecker")});import Jg from"node:fs/promises";import Xi from"node:path";function ro(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 px(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of n)t.push(...ro(p));let s=[/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 s){let g;for(;(g=p.exec(r))!==null;)g[1]&&t.push(...ro(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(...ro(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(...ro(p));else{let g=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...ro(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&&!ux.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}async function qg(r,e){let t=[],n=await Jg.readdir(r,{withFileTypes:!0});for(let s of n){if(dx.has(s.name))continue;let o=Xi.join(r,s.name);if(s.isDirectory())t.push(...await qg(o,e));else if(s.isFile()){let i=Xi.extname(s.name).toLowerCase();lx.has(i)&&t.push(Xi.relative(e,o))}}return t}async function mx(r){let e=await qg(r,r),t={},n={},s=0,o=50;for(let a=0;a<e.length;a+=o){let c=e.slice(a,a+o),u=await Promise.all(c.map(async d=>{try{let m=await Jg.readFile(Xi.join(r,d),"utf-8"),p=px(m,d);return{filePath:d,tokens:p}}catch{return{filePath:d,tokens:[]}}}));for(let{filePath:d,tokens:m}of u){if(m.length===0)continue;t[d]={tokens:m,length:m.length},s+=m.length;let p=new Map;for(let g of m)p.set(g,(p.get(g)||0)+1);for(let[g,f]of p)n[g]||(n[g]=[]),n[g].push({path:d,tf:f})}}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function fx(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};V.setDoc(r,gx,t)}async function Kg(r,e){let t=await mx(r);return fx(e,t),t}var lx,ux,dx,gx,Yg=y(()=>{"use strict";he();lx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".cs",".rb",".php",".vue",".svelte"]),ux=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"]),dx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel","__pycache__","vendor","target"]);l(ro,"splitIdentifier");l(px,"tokenizeFile");l(qg,"listFiles");l(mx,"buildIndex");gx="bm25-index";l(fx,"saveIndex");l(Kg,"indexProject")});import Kl from"node:fs/promises";import dn from"node:path";function kx(r){let e=[],t,n=new RegExp(Sx.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function bx(r,e,t){let n;if(r.startsWith("@/"))n=dn.join(t,"src",r.slice(2));else{let s=dn.dirname(dn.join(t,e));n=dn.resolve(s,r)}for(let s of wx){let o=n+s;try{if((await Kl.stat(o)).isFile())return dn.relative(t,o)}catch{}}return null}async function Xg(r,e){let t=[],n=await Kl.readdir(r,{withFileTypes:!0});for(let s of n){if(yx.has(s.name))continue;let o=dn.join(r,s.name);if(s.isDirectory())t.push(...await Xg(o,e));else if(s.isFile()){let i=dn.extname(s.name).toLowerCase();hx.has(i)&&t.push(dn.relative(e,o))}}return t}async function Cx(r){let e=await Xg(r,r),t={},n={},s=0,o=50;for(let i=0;i<e.length;i+=o){let a=e.slice(i,i+o),c=await Promise.all(a.map(async u=>{try{let d=await Kl.readFile(dn.join(r,u),"utf-8"),m=kx(d),p=[];for(let g of m){let f=await bx(g,u,r);f&&f!==u&&p.push(f)}return{filePath:u,imports:p}}catch{return{filePath:u,imports:[]}}}));for(let{filePath:u,imports:d}of c)if(d.length!==0){t[u]=d,s+=d.length;for(let m of d)n[m]||(n[m]=[]),n[m].push(u)}}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function vx(r,e){V.setDoc(r,Qg,e)}function Zg(r){return V.getDoc(r,Qg)}async function ef(r,e){let t=await Cx(r);return vx(e,t),t}var hx,yx,wx,Sx,Qg,Yl=y(()=>{"use strict";he();hx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]),yx=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel"]),wx=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Sx=/(?:import|from)\s+['"]([^'"]+)['"]/g;l(kx,"extractImportSources");l(bx,"resolveImport");l(Xg,"listFiles");l(Cx,"buildGraph");Qg="import-graph";l(vx,"saveGraph");l(Zg,"loadGraph");l(ef,"indexImports")});function tf(r,e){let t=[...r.added,...r.modified],n=new Set(t),s=new Set,o=Zg(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)n.has(d)||s.add(d)}let i=Array.from(s),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function nf(r){let e=new Set;for(let t of r){let n=t.toLowerCase();(n.endsWith(".tsx")||n.endsWith(".jsx")||n.endsWith(".css")||n.endsWith(".scss")||n.endsWith(".vue")||n.endsWith(".svelte")||n.includes("/components/")||n.includes("/pages/")||n.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(n.includes(".test.")||n.includes(".spec.")||n.includes("__tests__")||n.includes("/test/"))&&e.add("testing"),(n.includes("dockerfile")||n.includes("docker-compose")||n.includes(".dockerignore")||n.includes(".github/")||n.includes("ci/")||n.includes("cd/"))&&e.add("devops"),(n.endsWith(".sql")||n.includes("prisma")||n.includes("drizzle")||n.includes("migration")||n.includes("/db/"))&&e.add("database"),(n.endsWith(".ts")||n.endsWith(".js"))&&!n.includes(".test.")&&!n.includes(".spec.")&&!n.endsWith(".d.ts")&&e.add("backend")}return e}var sf=y(()=>{"use strict";Yl();l(tf,"propagateChanges");l(nf,"affectedDomains")});import Xl from"node:fs/promises";import Qi from"node:path";async function rf(r,e){let t=[],n=await Xl.readdir(r,{withFileTypes:!0}).catch(()=>[]);for(let s of n){let o=String(s.name);if(Px.has(o)||o.startsWith(".")&&o!==".env.example")continue;let i=Qi.join(r,o);if(s.isDirectory())t.push(...await rf(i,e));else if(s.isFile()){let a=Qi.extname(o).toLowerCase();xx.has(a)&&t.push(Qi.relative(e,i))}}return t}function Tx(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 Ex(r){let e=await rf(r,r),t=new Map,n=100;for(let s=0;s<e.length;s+=n){let o=e.slice(s,s+n),i=await Promise.all(o.map(async a=>{try{let c=Qi.join(r,a),[u,d]=await Promise.all([Xl.readFile(c,"utf-8"),Xl.stat(c)]);return{path:a,hash:Tx(u),size:d.size,mtime:d.mtime.toISOString()}}catch{return null}}));for(let a of i)a&&t.set(a.path,a)}return t}function Ix(r,e){let t=[],n=[],s=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?n.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:n,deleted:o,unchanged:s}}function Ql(r,e){let t=V.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let n=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)n.run(s.path,s.hash,s.size,s.mtime)})(),V.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function Ax(r){let e=new Map;try{let t=V.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let n of t)e.set(n.path,{path:n.path,hash:n.checksum,size:n.size||0,mtime:n.mtime||""})}catch{}return e}async function Zl(r,e){let[t,n]=await Promise.all([Ex(r),Promise.resolve(Ax(e))]);return{diff:Ix(t,n),currentHashes:t}}function of(r){return V.hasDoc(r,"file-hashes-meta")}var xx,Px,af=y(()=>{"use strict";he();xx=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".css",".scss",".html",".vue",".svelte",".py",".go",".rs",".yaml",".yml",".toml"]),Px=new Set(["node_modules",".git","dist","build","out",".next","coverage",".cache",".turbo",".vercel",".prjct"]);l(rf,"listProjectFiles");l(Tx,"hashContent");l(Ex,"computeHashes");l(Ix,"diffHashes");l(Ql,"saveHashes");l(Ax,"loadHashes");l(Zl,"detectChanges");l(of,"hasHashRegistry")});import{exec as jx}from"node:child_process";import{promisify as Dx}from"node:util";async function Mx(r,e=100){try{let{stdout:t}=await Rx(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
|
|
808
|
+
`)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=lf&&n.push(s),s=new Set):i&&s&&Ox(i)&&s.add(i)}return s&&s.size>0&&s.size<=lf&&n.push(s),n}catch{return[]}}function Ox(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 Fx(r,e=100){let t=await Mx(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let c of a)n.set(c,(n.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=_x(a[c],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[c,u]=i.split("\0"),d=n.get(c)||0,m=n.get(u)||0;if(d<cf||m<cf)continue;let p=d+m-a,g=p>0?a/p:0;g<$x||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function _x(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Lx(r,e){V.setDoc(r,Nx,e)}async function uf(r,e,t=100){let n=await Fx(r,t);return Lx(e,n),n}var Rx,$x,cf,lf,Nx,df=y(()=>{"use strict";he();Rx=Dx(jx),$x=.1,cf=2,lf=30;l(Mx,"parseGitLog");l(Ox,"isSourceFile");l(Fx,"buildMatrix");l(_x,"pairKey");Nx="cochange-index";l(Lx,"saveMatrix");l(uf,"indexCoChanges")});function jt(r){return`<!-- source: ${r.file}, ${r.type} -->`}function os(){let r={file:"unknown",type:"detected"};return{name:{...r},version:{...r},ecosystem:{...r},languages:{...r},frameworks:{...r},commands:{...r},projectType:{...r},git:{file:"git",type:"detected"}}}var eu=y(()=>{"use strict";l(jt,"cite");l(os,"defaultSources")});function Hx(r,e){let t=r.sources||os();return`# ${r.name} - Project Rules
|
|
945
809
|
<!-- projectId: ${r.projectId} -->
|
|
946
810
|
<!-- Generated: ${new Date().toISOString()} -->
|
|
947
811
|
<!-- Ecosystem: ${r.ecosystem} | Type: ${r.projectType} -->
|
|
948
812
|
|
|
949
813
|
## THIS PROJECT (${r.ecosystem})
|
|
950
814
|
|
|
951
|
-
${
|
|
815
|
+
${jt(t.ecosystem)}
|
|
952
816
|
**Type:** ${r.projectType}
|
|
953
817
|
**Path:** ${r.repoPath}
|
|
954
818
|
|
|
955
819
|
### Commands (USE THESE, NOT OTHERS)
|
|
956
820
|
|
|
957
|
-
${
|
|
821
|
+
${jt(t.commands)}
|
|
958
822
|
| Action | Command |
|
|
959
823
|
|--------|---------|
|
|
960
824
|
| Install dependencies | \`${r.commands.install}\` |
|
|
@@ -966,9 +830,9 @@ ${Qe(t.commands)}
|
|
|
966
830
|
|
|
967
831
|
### Code Conventions
|
|
968
832
|
|
|
969
|
-
${
|
|
833
|
+
${jt(t.languages)}
|
|
970
834
|
- **Languages**: ${r.languages.join(", ")||"Not detected"}
|
|
971
|
-
${
|
|
835
|
+
${jt(t.frameworks)}
|
|
972
836
|
- **Frameworks**: ${r.frameworks.join(", ")||"Not detected"}
|
|
973
837
|
|
|
974
838
|
---
|
|
@@ -996,7 +860,7 @@ p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
|
996
860
|
|
|
997
861
|
## PROJECT STATE
|
|
998
862
|
|
|
999
|
-
${
|
|
863
|
+
${jt(t.name)}
|
|
1000
864
|
| Field | Value |
|
|
1001
865
|
|-------|-------|
|
|
1002
866
|
| Name | ${r.name} |
|
|
@@ -1014,163 +878,12 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
|
|
|
1014
878
|
|
|
1015
879
|
**Workflow**: ${r.agents.workflow.join(", ")}
|
|
1016
880
|
**Domain**: ${r.agents.domain.join(", ")||"none"}
|
|
1017
|
-
`}function
|
|
1018
|
-
`)}function
|
|
1019
|
-
`)}function
|
|
1020
|
-
`)}function
|
|
1021
|
-
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(n,null,2)}function
|
|
1022
|
-
|
|
1023
|
-
<!-- Generated: ${C()} -->
|
|
1024
|
-
<!-- Ecosystem: ${n.ecosystem} | Type: ${n.projectType} -->
|
|
1025
|
-
|
|
1026
|
-
## THIS PROJECT (${n.ecosystem})
|
|
1027
|
-
|
|
1028
|
-
${Qe(u.ecosystem)}
|
|
1029
|
-
**Type:** ${n.projectType}
|
|
1030
|
-
**Path:** ${this.config.projectPath}
|
|
1031
|
-
|
|
1032
|
-
### Commands (USE THESE, NOT OTHERS)
|
|
1033
|
-
|
|
1034
|
-
${Qe(u.commands)}
|
|
1035
|
-
| Action | Command |
|
|
1036
|
-
|--------|---------|
|
|
1037
|
-
| Install dependencies | \`${s.install}\` |
|
|
1038
|
-
| Run dev server | \`${s.dev}\` |
|
|
1039
|
-
| Run tests | \`${s.test}\` |
|
|
1040
|
-
| Build | \`${s.build}\` |
|
|
1041
|
-
| Lint | \`${s.lint}\` |
|
|
1042
|
-
| Format | \`${s.format}\` |
|
|
1043
|
-
|
|
1044
|
-
### Code Conventions
|
|
1045
|
-
|
|
1046
|
-
${Qe(u.languages)}
|
|
1047
|
-
- **Languages**: ${n.languages.join(", ")||"Not detected"}
|
|
1048
|
-
${Qe(u.frameworks)}
|
|
1049
|
-
- **Frameworks**: ${n.frameworks.join(", ")||"Not detected"}
|
|
1050
|
-
|
|
1051
|
-
---
|
|
1052
|
-
|
|
1053
|
-
## PRJCT RULES
|
|
1054
|
-
|
|
1055
|
-
### Path Resolution
|
|
1056
|
-
**ALL prjct writes go to**: \`~/.prjct-cli/projects/${this.config.projectId}/\`
|
|
1057
|
-
- NEVER write to \`.prjct/\`
|
|
1058
|
-
- NEVER write to \`./\` for prjct data
|
|
1059
|
-
|
|
1060
|
-
### Workflow
|
|
1061
|
-
\`\`\`
|
|
1062
|
-
p. sync \u2192 p. task "desc" \u2192 [work] \u2192 p. done \u2192 p. ship
|
|
1063
|
-
\`\`\`
|
|
1064
|
-
|
|
1065
|
-
| Command | Action |
|
|
1066
|
-
|---------|--------|
|
|
1067
|
-
| \`p. sync\` | Re-analyze project |
|
|
1068
|
-
| \`p. task X\` | Start task |
|
|
1069
|
-
| \`p. done\` | Complete subtask |
|
|
1070
|
-
| \`p. ship X\` | Ship feature |
|
|
1071
|
-
|
|
1072
|
-
---
|
|
1073
|
-
|
|
1074
|
-
## PROJECT STATE
|
|
1075
|
-
|
|
1076
|
-
${Qe(u.name)}
|
|
1077
|
-
| Field | Value |
|
|
1078
|
-
|-------|-------|
|
|
1079
|
-
| Name | ${n.name} |
|
|
1080
|
-
| Version | ${n.version} |
|
|
1081
|
-
| Ecosystem | ${n.ecosystem} |
|
|
1082
|
-
| Branch | ${t.branch} |
|
|
1083
|
-
| Files | ~${n.fileCount} |
|
|
1084
|
-
| Commits | ${t.commits} |
|
|
1085
|
-
|
|
1086
|
-
---
|
|
1087
|
-
|
|
1088
|
-
## AGENTS
|
|
1089
|
-
|
|
1090
|
-
Load from \`~/.prjct-cli/projects/${this.config.projectId}/agents/\`:
|
|
1091
|
-
|
|
1092
|
-
**Workflow**: ${a.join(", ")}
|
|
1093
|
-
**Domain**: ${c.join(", ")||"none"}
|
|
1094
|
-
`,m=on.join(e,"CLAUDE.md");await this.writeWithPreservation(m,d)}async generateNowMd(e){let t=null;try{t=(await L.read(this.config.projectId)).currentTask}catch{}let n=t?.branch,s=typeof n=="string"?n:n?.name,o=t?`# NOW
|
|
1095
|
-
|
|
1096
|
-
**${t.description}**
|
|
1097
|
-
|
|
1098
|
-
Started: ${t.startedAt}
|
|
1099
|
-
${s?`Branch: ${s}`:""}
|
|
1100
|
-
`:`# NOW
|
|
1101
|
-
|
|
1102
|
-
_No active task_
|
|
1103
|
-
|
|
1104
|
-
Use \`p. task "description"\` to start working.
|
|
1105
|
-
`;await this.writeWithPreservation(on.join(e,"now.md"),o)}async generateNextMd(e){let t={tasks:[]};try{t={tasks:(await be.read(this.config.projectId)).tasks||[]}}catch{}let n=`# NEXT
|
|
1106
|
-
|
|
1107
|
-
${t.tasks.length>0?t.tasks.map((s,o)=>`${o+1}. ${s.description}${s.priority?` [${s.priority}]`:""}`).join(`
|
|
1108
|
-
`):"_Empty queue_"}
|
|
1109
|
-
`;await this.writeWithPreservation(on.join(e,"next.md"),n)}async generateIdeasMd(e){let t={ideas:[]};try{t={ideas:(await Be.read(this.config.projectId)).ideas||[]}}catch{}let n=`# IDEAS
|
|
1110
|
-
|
|
1111
|
-
${t.ideas.length>0?t.ideas.map(s=>`- ${s.text}${s.priority?` [${s.priority}]`:""}`).join(`
|
|
1112
|
-
`):"_No ideas captured yet_"}
|
|
1113
|
-
`;await this.writeWithPreservation(on.join(e,"ideas.md"),n)}async generateShippedMd(e){let t={shipped:[]};try{t={shipped:(await ot.read(this.config.projectId)).shipped||[]}}catch{}let n=`# SHIPPED \u{1F680}
|
|
1114
|
-
|
|
1115
|
-
${t.shipped.length>0?t.shipped.slice(-10).map(s=>`- **${s.name}**${s.version?` v${s.version}`:""} - ${s.shippedAt}`).join(`
|
|
1116
|
-
`):"_Nothing shipped yet_"}
|
|
1117
|
-
|
|
1118
|
-
**Total shipped:** ${t.shipped.length}
|
|
1119
|
-
`;await this.writeWithPreservation(on.join(e,"shipped.md"),n)}async generateMonorepoContexts(e,t,n,s){let o=await E.detectMonorepo(this.config.projectPath);if(!o.isMonorepo)return[];let i=[],a=new to(this.config.projectPath);await a.initialize();for(let c of o.packages){if(!c.hasPrjctMd)continue;let u=await a.getPackageContext(c.name);if(!u)continue;let d=await this.generatePackageClaudeMd(c,u,e,t,n,s),m=on.join(c.path,"CLAUDE.md");await this.writeWithPreservation(m,d),i.push(on.relative(this.config.projectPath,m))}return i}async generatePackageClaudeMd(e,t,n,s,o,i){let a=i.filter(m=>m.type==="workflow").map(m=>m.name),c=i.filter(m=>m.type==="domain").map(m=>m.name),u=s.version,d=e.name;try{let m=on.join(e.path,"package.json"),p=JSON.parse(await Cu.readFile(m,"utf-8"));u=p.version||s.version,d=p.name||e.name}catch{}return`# ${d} - Package Rules
|
|
1120
|
-
<!-- package: ${e.relativePath} -->
|
|
1121
|
-
<!-- monorepo: ${s.name} -->
|
|
1122
|
-
<!-- Generated: ${C()} -->
|
|
1123
|
-
<!-- Sources: ${t.sources.join(" \u2192 ")} -->
|
|
1124
|
-
|
|
1125
|
-
## THIS PACKAGE
|
|
1126
|
-
|
|
1127
|
-
**Name:** ${d}
|
|
1128
|
-
**Path:** ${e.relativePath}
|
|
1129
|
-
**Version:** ${u}
|
|
1130
|
-
**Monorepo:** ${s.name}
|
|
1131
|
-
|
|
1132
|
-
---
|
|
1133
|
-
|
|
1134
|
-
## INHERITED CONTEXT
|
|
1135
|
-
|
|
1136
|
-
${t.content||"_No PRJCT.md rules defined_"}
|
|
1137
|
-
|
|
1138
|
-
${t.overrides.length>0?`
|
|
1139
|
-
**Overrides:** ${t.overrides.join(", ")}
|
|
1140
|
-
`:""}
|
|
1141
|
-
|
|
1142
|
-
---
|
|
1143
|
-
|
|
1144
|
-
## COMMANDS
|
|
1145
|
-
|
|
1146
|
-
| Action | Command |
|
|
1147
|
-
|--------|---------|
|
|
1148
|
-
| Install | \`${o.install}\` |
|
|
1149
|
-
| Dev | \`${o.dev}\` |
|
|
1150
|
-
| Test | \`${o.test}\` |
|
|
1151
|
-
| Build | \`${o.build}\` |
|
|
1152
|
-
|
|
1153
|
-
---
|
|
1154
|
-
|
|
1155
|
-
## PROJECT STATE
|
|
1156
|
-
|
|
1157
|
-
| Field | Value |
|
|
1158
|
-
|-------|-------|
|
|
1159
|
-
| Package | ${d} |
|
|
1160
|
-
| Monorepo | ${s.name} |
|
|
1161
|
-
| Branch | ${n.branch} |
|
|
1162
|
-
| Ecosystem | ${s.ecosystem} |
|
|
1163
|
-
|
|
1164
|
-
---
|
|
1165
|
-
|
|
1166
|
-
## AGENTS
|
|
1167
|
-
|
|
1168
|
-
Load from \`~/.prjct-cli/projects/${this.config.projectId}/agents/\`:
|
|
1169
|
-
|
|
1170
|
-
**Workflow**: ${a.join(", ")}
|
|
1171
|
-
**Domain**: ${c.join(", ")||"none"}
|
|
1172
|
-
`}}});import vu from"node:fs/promises";import Pu from"node:path";var xu,Tu,Uf,Hf=y(()=>{"use strict";_();xu=".prjct-state.md",Tu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=Pu.join(e,xu),s=this.toMarkdown(t);await vu.writeFile(n,s,"utf-8")}async remove(e){let t=Pu.join(e,xu);try{await vu.unlink(t)}catch(n){if(!v(n))throw n}}async exists(e){let t=Pu.join(e,xu);try{return await vu.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${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 n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
1173
|
-
`)}},Uf=new Tu});import Eu from"node:fs/promises";import Ix from"node:os";import Gf from"node:path";function Iu(){return Gf.join(Ix.homedir(),".prjct-cli","skills",Ax)}function jx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ko(){try{let r=await Eu.readFile(Iu(),"utf-8");return JSON.parse(r)}catch{return jx()}}async function Au(r){let e=Iu();await Eu.mkdir(Gf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Eu.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function Dx(r){let e=await ko();e.skills[r.name]=r,await Au(e)}async function Rx(r){let e=await ko();return r in e.skills?(delete e.skills[r],await Au(e),!0):!1}async function $x(r){return(await ko()).skills[r]||null}async function Mx(){return(await ko()).skills}function Ox(){return Iu()}var Ax,So,zf=y(()=>{"use strict";Ax=".skill-lock.json";l(Iu,"getLockFilePath");l(jx,"createEmptyLockFile");l(ko,"read");l(Au,"write");l(Dx,"addEntry");l(Rx,"removeEntry");l($x,"getEntry");l(Mx,"getAll");l(Ox,"getPath");So={read:ko,write:Au,addEntry:Dx,removeEntry:Rx,getEntry:$x,getAll:Mx,getPath:Ox}});import{exec as Fx}from"node:child_process";import yn from"node:fs/promises";import Du from"node:os";import ct from"node:path";import{promisify as _x}from"node:util";import{glob as Wf}from"glob";function Vf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ct.join(Du.homedir(),r.slice(1)):ct.resolve(r);return{type:"local",localPath:n,url:n}}let e=r.indexOf("@");if(e>0){let n=r.slice(0,e),s=r.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:s,url:`https://github.com/${o}/${i}`}}let t=r.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${r}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Jf(r){let e=[];try{let s=ct.join(r,"SKILL.md");await yn.access(s);let o=ct.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Wf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ct.basename(ct.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Wf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ct.basename(ct.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function Nx(r,e,t){let n=new Date().toISOString(),s=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&s.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=r.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
|
|
881
|
+
`}function Ux(r,e){let t=r.sources||os(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push(jt(t.languages)),n.push("## Tech Stack"),r.languages.length>0&&n.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- Frameworks: ${r.frameworks.join(", ")}`),n.push(""),n.push(jt(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),n.push("## Code Style"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns in this project"),n.push("- Use idiomatic constructs for the language"),n.push(""),n.push("## Best Practices"),n.push("- Write clean, readable code"),n.push("- Add comments only for complex logic"),n.push("- Keep functions small and focused"),n.push("- Handle errors appropriately"),n.push("- Write tests for new functionality"),n.join(`
|
|
882
|
+
`)}function Gx(r,e){let t=r.sources||os(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(jt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),n.push("## Conventions"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing code patterns"),n.push("- Keep code clean and readable"),n.push(""),n.push(jt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
|
|
883
|
+
`)}function zx(r,e){let t=r.sources||os(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${r.name}`),n.push(""),n.push(`${r.projectType} project using ${r.ecosystem}.`),n.push(""),n.push(jt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(jt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),n.push("## Rules"),n.push(`- Follow ${r.ecosystem} conventions`),n.push("- Match existing project patterns"),n.push("- Clean code, minimal comments"),n.push("- Test new functionality"),n.join(`
|
|
884
|
+
`)}function Wx(r,e){let n={systemMessage:[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`,"",`Follow ${r.ecosystem} conventions. Match existing code patterns.`].join(`
|
|
885
|
+
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(n,null,2)}function pf(r){return{claude:Hx,cursor:Ux,copilot:Gx,windsurf:zx,continue:Wx}[r]||null}var tu=y(()=>{"use strict";eu();l(Hx,"formatForClaude");l(Ux,"formatForCursor");l(Gx,"formatForCopilot");l(zx,"formatForWindsurf");l(Wx,"formatForContinue");l(pf,"getFormatter")});import{exec as Bx}from"node:child_process";import Vx from"node:os";import oo from"node:path";import{promisify as Jx}from"node:util";function mf(r){return Zi[r]||null}async function nu(r){try{return await qx(`which ${r}`),!0}catch{return!1}}async function ea(r=process.cwd()){let e=[];return await nu("claude")&&e.push("claude"),(await nu("cursor")||await P(oo.join(r,".cursor")))&&e.push("cursor"),await P(oo.join(r,".github"))&&e.push("copilot"),(await nu("windsurf")||await P(oo.join(r,".windsurf")))&&e.push("windsurf"),(await P(oo.join(r,".continue"))||await P(oo.join(Vx.homedir(),".continue")))&&e.push("continue"),e}async function gf(r,e=process.cwd()){if(r==="auto"){let t=await ea(e);return t.length>0?t:["claude"]}return r==="all"?Kx:r.filter(t=>Zi[t])}var qx,Zi,io,Kx,su=y(()=>{"use strict";xe();qx=Jx(Bx),Zi={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"}},io=["claude"],Kx=Object.keys(Zi);l(mf,"getAIToolConfig");l(nu,"commandExists");l(ea,"detectInstalledTools");l(gf,"resolveToolIds")});import ru from"node:fs/promises";import ou from"node:path";async function ff(r,e,t,n=io){let s=[];for(let o of n){let i=mf(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await Yx(r,i,e,t);s.push(a)}return s}async function Yx(r,e,t,n){let s=pf(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;e.outputPath==="repo"?i=ou.join(n,e.outputFile):i=ou.join(t,"context",e.outputFile),await ru.mkdir(ou.dirname(i),{recursive:!0});try{let a=await ru.readFile(i,"utf-8"),c=_c(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Fc(o,a)}catch{}return await ru.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var hf=y(()=>{"use strict";_();Nc();tu();su();l(ff,"generateAIToolContexts");l(Yx,"generateForTool")});var yf=y(()=>{"use strict";tu();hf();su()});import iu from"node:fs/promises";import au from"node:path";var cu,lu,wf,Sf=y(()=>{"use strict";_();cu=".prjct-state.md",lu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=au.join(e,cu),s=this.toMarkdown(t);await iu.writeFile(n,s,"utf-8")}async remove(e){let t=au.join(e,cu);try{await iu.unlink(t)}catch(n){if(!v(n))throw n}}async exists(e){let t=au.join(e,cu);try{return await iu.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${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 n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
886
|
+
`)}},wf=new lu});import uu from"node:fs/promises";import Xx from"node:os";import kf from"node:path";function du(){return kf.join(Xx.homedir(),".prjct-cli","skills",Qx)}function Zx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ao(){try{let r=await uu.readFile(du(),"utf-8");return JSON.parse(r)}catch{return Zx()}}async function pu(r){let e=du();await uu.mkdir(kf.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await uu.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function eP(r){let e=await ao();e.skills[r.name]=r,await pu(e)}async function tP(r){let e=await ao();return r in e.skills?(delete e.skills[r],await pu(e),!0):!1}async function nP(r){return(await ao()).skills[r]||null}async function sP(){return(await ao()).skills}function rP(){return du()}var Qx,co,bf=y(()=>{"use strict";Qx=".skill-lock.json";l(du,"getLockFilePath");l(Zx,"createEmptyLockFile");l(ao,"read");l(pu,"write");l(eP,"addEntry");l(tP,"removeEntry");l(nP,"getEntry");l(sP,"getAll");l(rP,"getPath");co={read:ao,write:pu,addEntry:eP,removeEntry:tP,getEntry:nP,getAll:sP,getPath:rP}});import{exec as oP}from"node:child_process";import pn from"node:fs/promises";import gu from"node:os";import ot from"node:path";import{promisify as iP}from"node:util";import{glob as Cf}from"glob";function xf(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?ot.join(gu.homedir(),r.slice(1)):ot.resolve(r);return{type:"local",localPath:n,url:n}}let e=r.indexOf("@");if(e>0){let n=r.slice(0,e),s=r.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:s,url:`https://github.com/${o}/${i}`}}let t=r.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${r}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Pf(r){let e=[];try{let s=ot.join(r,"SKILL.md");await pn.access(s);let o=ot.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Cf("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Cf("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=ot.basename(ot.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function aP(r,e,t){let n=new Date().toISOString(),s=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&s.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=r.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
|
|
1174
887
|
${s.join(`
|
|
1175
888
|
`)}`;return r.replace(o,`---
|
|
1176
889
|
${c}
|
|
@@ -1179,10 +892,10 @@ ${s.join(`
|
|
|
1179
892
|
`)}
|
|
1180
893
|
---
|
|
1181
894
|
|
|
1182
|
-
${r}`}function
|
|
895
|
+
${r}`}function fu(){return ot.join(gu.homedir(),".claude","skills")}async function mu(r,e,t,n){let s=fu(),o=ot.join(s,e),i=ot.join(o,"SKILL.md"),a=await pn.readFile(r,"utf-8"),c=aP(a,t,n);return await pn.mkdir(o,{recursive:!0}),await pn.writeFile(i,c,"utf-8"),{name:e,filePath:i,source:t,sha:n}}async function cP(r){let e={installed:[],skipped:[],errors:[]};if(!Fs.isAvailable("git")){let n=Fs.checkTool("git");return e.errors.push(`Cannot install from GitHub: git is not available. ${n.error?.hint||"Install git and try again."}`),e}let t=ot.join(gu.tmpdir(),`prjct-skill-${Date.now()}`);try{let n=`https://github.com/${r.owner}/${r.repo}.git`;await vf(`git clone --depth 1 ${n} ${t}`,{timeout:Ts("GIT_CLONE")});let s;try{let{stdout:a}=await vf("git rev-parse HEAD",{cwd:t,timeout:Ts("TOOL_CHECK")});s=a.trim()}catch{}let o=await Pf(t);if(o.length===0)return e.errors.push(`No SKILL.md files found in ${r.owner}/${r.repo}`),e;let i=r.skillName?o.filter(a=>a.name===r.skillName):o;if(r.skillName&&i.length===0)return e.errors.push(`Skill "${r.skillName}" not found in ${r.owner}/${r.repo}`),e;for(let a of i)try{let c=await mu(a.filePath,a.name,r,s),u={name:a.name,source:{type:"github",url:`${r.owner}/${r.repo}`,sha:s},installedAt:new Date().toISOString(),filePath:c.filePath};await co.addEntry(u),e.installed.push(c)}catch(c){e.errors.push(`Failed to install ${a.name}: ${w(c)}`)}}finally{try{await pn.rm(t,{recursive:!0,force:!0})}catch{}}return e}async function lP(r){let e={installed:[],skipped:[],errors:[]},t=r.localPath;try{await pn.access(t)}catch{return e.errors.push(`Local path not found: ${t}`),e}if((await pn.stat(t)).isFile()){let s=ot.basename(ot.dirname(t));try{let o=await mu(t,s,r),i={name:s,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:o.filePath};await co.addEntry(i),e.installed.push(o)}catch(o){e.errors.push(`Failed to install from ${t}: ${w(o)}`)}}else{let s=await Pf(t);if(s.length===0)return e.errors.push(`No SKILL.md files found in ${t}`),e;for(let o of s)try{let i=await mu(o.filePath,o.name,r),a={name:o.name,source:{type:"local",url:t},installedAt:new Date().toISOString(),filePath:i.filePath};await co.addEntry(a),e.installed.push(i)}catch(i){e.errors.push(`Failed to install ${o.name}: ${w(i)}`)}}return e}async function uP(r){let e=fu(),t=ot.join(e,r);try{await pn.rm(t,{recursive:!0,force:!0})}catch{}let n=ot.join(e,`${r}.md`);try{await pn.rm(n,{force:!0})}catch{}return co.removeEntry(r)}async function dP(r){let e=xf(r);switch(e.type){case"github":return cP(e);case"local":return lP(e);default:return{installed:[],skipped:[],errors:[`Unsupported source type: ${e.type}`]}}}var vf,Tf,Ef=y(()=>{"use strict";_();ln();ki();bf();vf=iP(oP);l(xf,"parseSource");l(Pf,"discoverSkills");l(aP,"injectSourceMetadata");l(fu,"getInstallDir");l(mu,"installSkillFile");l(cP,"installFromGitHub");l(lP,"installFromLocal");l(uP,"remove");l(dP,"install");Tf={install:dP,remove:uP,parseSource:xf,getInstallDir:fu}});import Dt from"node:fs/promises";import pP from"node:os";import Ct from"node:path";async function If(r,e,t,n){let s=[],o=Ct.join(r,"agents");try{let c=await Dt.readdir(o);for(let u of c)u.endsWith(".md")&&await Dt.unlink(Ct.join(o,u))}catch(c){H.debug("Failed to purge old agents",{path:o,error:ne(c)})}let i=["prjct-workflow","prjct-planner","prjct-shipper"];await Promise.all(i.map(c=>mP(c,o)));for(let c of i)s.push({name:c,type:"workflow"});let a=[];e.hasFrontend&&(a.push({name:"frontend",skill:"javascript-typescript"}),a.push({name:"uxui",skill:"frontend-design"})),e.hasBackend&&a.push({name:"backend",skill:"javascript-typescript"}),e.hasDatabase&&a.push({name:"database"}),e.hasTesting&&a.push({name:"testing",skill:"developer-kit"}),e.hasDocker&&a.push({name:"devops",skill:"developer-kit"}),await Promise.all(a.map(c=>gP(c.name,o,t,e,n)));for(let c of a)s.push({name:c.name,type:"domain",skill:c.skill});return s}async function Af(r){let e=Ct.join(r,"agents"),t=[];try{let n=await Dt.readdir(e),s=new Set(["prjct-workflow","prjct-planner","prjct-shipper"]);for(let o of n){if(!o.endsWith(".md"))continue;let i=o.replace(".md",""),a=s.has(i)?"workflow":"domain";t.push({name:i,type:a})}}catch{return[]}return t}async function jf(r){let e=/\{\{>\s*([\w-]+)\s*\}\}/g,t=[...r.matchAll(e)];if(t.length===0)return r;let n=r;for(let s of t){let o=s[1],i=ve(`subagents/${o}.md`);if(!i){let a=Ct.join(__dirname,"..","..","templates","subagents",`${o}.md`);try{i=await Dt.readFile(a,"utf-8")}catch{n=n.replace(s[0],`<!-- partial "${o}" not found -->`);continue}}n=n.replace(s[0],i.trim())}return n}async function mP(r,e){let t="";try{let n=Ct.join(__dirname,"..","..","templates","subagents","workflow",`${r}.md`);t=await Dt.readFile(n,"utf-8"),t=await jf(t)}catch(n){H.debug("Workflow agent template not found, generating minimal",{name:r,error:ne(n)}),t=hP(r)}await Dt.writeFile(Ct.join(e,`${r}.md`),t,"utf-8")}async function gP(r,e,t,n,s){let o="";try{let i=Ct.join(__dirname,"..","..","templates","subagents","domain",`${r}.md`);o=await Dt.readFile(i,"utf-8"),o=await jf(o),o=o.replace("{projectName}",t.name),o=o.replace("{frameworks}",n.frameworks.join(", ")||"None detected"),o=o.replace("{ecosystem}",t.ecosystem)}catch(i){H.debug("Domain agent template not found, generating minimal",{name:r,error:ne(i)}),o=yP(r,t,n)}o=fP(o,r,s),await Dt.writeFile(Ct.join(e,`${r}.md`),o,"utf-8")}function fP(r,e,t){if(!t)return r;let{patternsDiscovered:n,knownGotchas:s,agentAccuracy:o}=t,i=o.filter(u=>u.agent===`${e}.md`||u.agent===e);if(!(n.length>0||s.length>0||i.length>0))return r;let c=[`
|
|
1183
896
|
## Recent Learnings (from completed tasks)
|
|
1184
897
|
`];if(n.length>0){c.push("### Discovered Patterns");for(let u of n)c.push(`- ${u}`);c.push("")}if(s.length>0){c.push("### Known Gotchas");for(let u of s)c.push(`- ${u}`);c.push("")}if(i.length>0){c.push("### Agent Accuracy Notes");for(let u of i){let d=u.note?` \u2014 ${u.note}`:"";c.push(`- ${u.rating}${d}`)}c.push("")}return r+c.join(`
|
|
1185
|
-
`)}function
|
|
898
|
+
`)}function hP(r){return`---
|
|
1186
899
|
name: ${r}
|
|
1187
900
|
description: ${{"prjct-workflow":"Task lifecycle: now, done, pause, resume","prjct-planner":"Planning: task, prd, spec, bug","prjct-shipper":"Shipping: ship, merge, review"}[r]||"Workflow agent"}
|
|
1188
901
|
tools: Read, Write, Glob
|
|
@@ -1198,7 +911,7 @@ When invoked:
|
|
|
1198
911
|
1. Read \`.prjct/prjct.config.json\` \u2192 extract \`projectId\`
|
|
1199
912
|
2. Read \`~/.prjct-cli/projects/{projectId}/storage/state.json\`
|
|
1200
913
|
3. Execute requested operation
|
|
1201
|
-
`}function
|
|
914
|
+
`}function yP(r,e,t){return`---
|
|
1202
915
|
name: ${r}
|
|
1203
916
|
description: ${r.charAt(0).toUpperCase()+r.slice(1)} specialist for ${e.name}
|
|
1204
917
|
tools: Read, Write, Glob, Grep
|
|
@@ -1218,17 +931,17 @@ Domain specialist for ${r} tasks.
|
|
|
1218
931
|
## Your Role
|
|
1219
932
|
|
|
1220
933
|
You are the ${r} expert for this project. Apply best practices for the detected stack.
|
|
1221
|
-
`}function
|
|
1222
|
-
`).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
|
|
1223
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ds('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:ne(t)})}return e}async function an(r,e){try{return await oh.access($u.join(r,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:ne(t)}),!1}}async function ah(r){let e={fileCount:0,version:"0.0.0",name:$u.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ds('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){U.debug("File count failed",{path:r,error:ne(t)}),e.fileCount=0}try{let t=$u.join(r,"package.json"),n=JSON.parse(await oh.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await an(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:r,error:ne(t)})}return await an(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await an(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await an(r,"requirements.txt")||await an(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 ch(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 an(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await an(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 an(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 an(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 an(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}function lh(r,e){let t=hn(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function uh(r){return new fa(r).detect()}var ds,dh=y(()=>{"use strict";dn();da();Wn();rh();ds=Yx(Kx);l(ih,"analyzeGit");l(an,"fileExists");l(ah,"gatherStats");l(ch,"detectCommands");l(lh,"buildSources");l(uh,"detectStack")});import{exec as Xx}from"node:child_process";import Mu from"node:fs/promises";import ha from"node:path";import{promisify as Qx}from"node:util";var Zx,Ou,Fu,ph,mh=y(()=>{"use strict";Dt();_();Zx=Qx(Xx),Ou={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=ha.join(r,s);try{await Mu.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=ha.basename(r);try{await L.read(n)}catch(s){v(s)||t.push(`state: ${w(s)}`)}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=ha.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await Mu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Mu.readFile(ha.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!v(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Fu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.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=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Zx(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},ph=new Fu});import ya from"node:fs/promises";import wa from"node:path";var ka,ps,_u=y(()=>{"use strict";Bs();wf();xf();If();Rf();mu();dn();An();qe();me();pi();Tn();ye();Ms();Wr();hi();Os();Fs();_s();Nf();ie();Wn();Il();Al();Lf();Hf();Sl();th();dh();mh();ka=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await ma(e)).filter(i=>!wo.includes(i));s=[...wo,...o]}else t.aiTools[0]==="auto"?(s=await ma(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await Of("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=E.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Br(this.projectId);try{let N=await fi(this.projectId);N>0&&U.info("Swept legacy JSON files into SQLite",{swept:N})}catch(N){U.debug("Legacy JSON sweep failed (non-critical)",{error:ne(N)})}let[i,a,c,u]=await Promise.all([ih(this.projectPath),ah(this.projectPath),ch(this.projectPath),uh(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&Ef(this.projectId))try{let{diff:N,currentHashes:lt}=await hu(this.projectPath,this.projectId),Un=N.added.length+N.modified.length+N.deleted.length;if(Un===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let Er=vf(N,this.projectId);f=Pf(Er.allAffected);let zy=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=Er.allAffected.some(Hn=>{let Wy=Hn.substring(Hn.lastIndexOf("."));return zy.has(Wy)}),g=Er.directlyChanged.some(Hn=>Hn==="package.json"||Hn==="tsconfig.json"||Hn.includes("Dockerfile")||Hn.includes("docker-compose")),m={isIncremental:!0,filesChanged:Un,filesUnchanged:N.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}fu(this.projectId,lt)}catch(N){U.debug("Incremental detection failed, falling back to full sync",{error:ne(N)})}else try{let{currentHashes:N}=await hu(this.projectPath,this.projectId);fu(this.projectId,N)}catch(N){U.debug("Hash computation failed (non-critical)",{error:ne(N)})}if(p)try{await Promise.all([yf(this.projectPath,this.projectId),Cf(this.projectPath,this.projectId),Df(this.projectPath,this.projectId)])}catch(N){U.debug("File ranking index build failed (non-critical)",{error:ne(N)})}let k;if(g)try{let N=await L.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(k=N)}catch{}let S=g?await Yf(this.globalPath,u,a,k):await Xf(this.globalPath),x=Zf(S,this.projectId,this.globalPath),P=g?await eh(S):[],O=lh(a,c),F=await this.generateContextFiles(i,a,c,S,O),K={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:S.filter(N=>N.type==="workflow").map(N=>N.name),domain:S.filter(N=>N.type==="domain").map(N=>N.name)},sources:O},oe=await Ff(K,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let b=Date.now()-n,D=await this.recordSyncMetrics(a,F,S,b);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let ee;try{let N=await R.readConfig(this.projectPath);ee=await ph.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){U.debug("Verification failed (non-critical)",{error:ne(N)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:S,skills:x,skillsInstalled:P,contextFiles:F,aiTools:oe.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:D,verification:ee,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:ne(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>ya.mkdir(wa.join(this.globalPath,t),{recursive:!0})))}async generateContextFiles(e,t,n,s,o){return new ga({projectId:this.projectId,projectPath:this.projectPath,globalPath:this.globalPath}).generate(e,t,n,s,o)}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await L.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=C(),s.lastUpdated=C(),s.context={...s.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,s);try{await Uf.generate(this.projectPath,s)}catch(o){U.debug("Local state generation failed (optional)",{error:ne(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=wa.join(this.globalPath,m),g=await ya.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:ne(p)})}for(let m of n)try{let p=wa.join(this.globalPath,"agents",`${m.name}.md`),g=await ya.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:ne(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await mn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){U.debug("Failed to record sync metrics",{error:ne(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await tn.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:s??void 0})}catch(s){U.debug("Failed to save draft analysis (non-critical)",{error:ne(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([ot.archiveOldShipped(this.projectId).catch(()=>0),Be.markDormantIdeas(this.projectId).catch(()=>0),be.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),ft.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=Ct.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:ne(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Qn,n=await El.learnFromTaskHistory(this.projectId,e,t);try{let s=await Qm.getFeatureOutcomes(this.projectId);s.length>0&&await El.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:ne(e)})}}async getCliVersion(){try{let e=wa.join(__dirname,"..","..","package.json");return JSON.parse(await ya.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:ne(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:[]}}},ps=new ka});var Fn=y(()=>{"use strict";Dm();_m();Nm();Um();Gm();yl();Wm();Sl();bl();Bm();mf();gf();_u()});import wn from"chalk";function gh(r){return Math.ceil(r.length/eT)}function fh(r){let e=r.split(`
|
|
934
|
+
`}function Df(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Dt.writeFile(Ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{H.debug("Failed to write skills.json",{error:ne(o)})}),n}async function Rf(r){let e=[];try{let t=Ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Dt.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Ct.join(pP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Ct.join(a,d,"SKILL.md"),p=Ct.join(a,`${d}.md`),g=!1;try{await Dt.access(m),g=!0}catch{try{await Dt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),S;f.length===3?S=`${f[0]}/${f[1]}@${f[2]}`:S=c;let b=await Tf.install(S);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),H.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),H.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),H.debug(`Skill install error for ${d}`,{error:ne(f)})}}}catch(t){H.debug("Skill auto-installation failed (non-critical)",{error:ne(t)})}return e}var $f=y(()=>{"use strict";qn();cn();le();Ln();Ef();l(If,"generateAgents");l(Af,"loadExistingAgents");l(jf,"resolveTemplateIncludes");l(mP,"generateWorkflowAgent");l(gP,"generateDomainAgent");l(fP,"injectFeedbackSection");l(hP,"generateMinimalWorkflowAgent");l(yP,"generateMinimalDomainAgent");l(Df,"configureSkills");l(Rf,"autoInstallSkills")});import Mf from"node:fs/promises";import Of from"node:path";var ta,Ff=y(()=>{"use strict";ta=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 n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,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(s=>e[s])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(s=>e[s])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Of.join(this.projectPath,"package.json"),t=await Mf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Mf.access(Of.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as wP}from"node:child_process";import _f from"node:fs/promises";import hu from"node:path";import{promisify as SP}from"node:util";async function Nf(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await is("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await is("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await is("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await is("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
935
|
+
`).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 is('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
936
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await is('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:ne(t)})}return e}async function sn(r,e){try{return await _f.access(hu.join(r,e)),!0}catch(t){return H.debug("File not found",{filename:e,error:ne(t)}),!1}}async function Lf(r){let e={fileCount:0,version:"0.0.0",name:hu.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await is('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:r,error:ne(t)}),e.fileCount=0}try{let t=hu.join(r,"package.json"),n=JSON.parse(await _f.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await sn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:r,error:ne(t)})}return await sn(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await sn(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await sn(r,"requirements.txt")||await sn(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 Hf(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 sn(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await sn(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 sn(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 sn(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 sn(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}function Uf(r,e){let t=os(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Gf(r){return new ta(r).detect()}var is,zf=y(()=>{"use strict";cn();eu();Ln();Ff();is=SP(wP);l(Nf,"analyzeGit");l(sn,"fileExists");l(Lf,"gatherStats");l(Hf,"detectCommands");l(Uf,"buildSources");l(Gf,"detectStack")});import{exec as kP}from"node:child_process";import yu from"node:fs/promises";import na from"node:path";import{promisify as bP}from"node:util";var CP,wu,Su,Wf,Bf=y(()=>{"use strict";Ut();_();CP=bP(kP),wu={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=na.join(r,s);try{await yu.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=na.basename(r);try{await L.read(n)}catch(s){v(s)||t.push(`state: ${w(s)}`)}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=na.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await yu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await yu.readFile(na.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!v(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Su=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[wu.contextFilesExist(t),wu.jsonFilesValid(t),wu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(S=>S.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()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await CP(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Wf=new Su});import sa from"node:fs/promises";import ra from"node:path";var oa,as,ku=y(()=>{"use strict";Rs();Yg();sf();af();df();Yl();cn();xn();Ve();Ce();Ci();bn();he();Ar();zr();xi();jr();Dr();$r();yf();le();Ln();dl();pl();Sf();Yc();$f();zf();Bf();oa=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await ea(e)).filter(i=>!io.includes(i));s=[...io,...o]}else t.aiTools[0]==="auto"?(s=await ea(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await gf("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Wr(this.projectId);try{let N=await vi(this.projectId);N>0&&H.info("Swept legacy JSON files into SQLite",{swept:N})}catch(N){H.debug("Legacy JSON sweep failed (non-critical)",{error:ne(N)})}let[i,a,c,u]=await Promise.all([Nf(this.projectPath),Lf(this.projectPath),Hf(this.projectPath),Gf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&of(this.projectId))try{let{diff:N,currentHashes:it}=await Zl(this.projectPath,this.projectId),On=N.added.length+N.modified.length+N.deleted.length;if(On===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:N.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let gr=tf(N,this.projectId);f=nf(gr.allAffected);let by=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=gr.allAffected.some(Fn=>{let Cy=Fn.substring(Fn.lastIndexOf("."));return by.has(Cy)}),g=gr.directlyChanged.some(Fn=>Fn==="package.json"||Fn==="tsconfig.json"||Fn.includes("Dockerfile")||Fn.includes("docker-compose")),m={isIncremental:!0,filesChanged:On,filesUnchanged:N.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}Ql(this.projectId,it)}catch(N){H.debug("Incremental detection failed, falling back to full sync",{error:ne(N)})}else try{let{currentHashes:N}=await Zl(this.projectPath,this.projectId);Ql(this.projectId,N)}catch(N){H.debug("Hash computation failed (non-critical)",{error:ne(N)})}if(p)try{await Promise.all([Kg(this.projectPath,this.projectId),ef(this.projectPath,this.projectId),uf(this.projectPath,this.projectId)])}catch(N){H.debug("File ranking index build failed (non-critical)",{error:ne(N)})}let S;if(g)try{let N=await L.getAggregatedFeedback(this.projectId);(N.patternsDiscovered.length>0||N.knownGotchas.length>0||N.agentAccuracy.length>0)&&(S=N)}catch{}let b=g?await If(this.globalPath,u,a,S):await Af(this.globalPath),D=Df(b,this.projectId,this.globalPath),x=g?await Rf(b):[],O=Uf(a,c),F=[],K={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(N=>N.type==="workflow").map(N=>N.name),domain:b.filter(N=>N.type==="domain").map(N=>N.name)},sources:O},oe=await ff(K,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let k=Date.now()-n,j=await this.recordSyncMetrics(a,F,b,k);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let ee;try{let N=await R.readConfig(this.projectPath);ee=await Wf.verify(this.projectPath,this.globalPath,N?.verification)}catch(N){H.debug("Verification failed (non-critical)",{error:ne(N)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:x,contextFiles:F,aiTools:oe.map(N=>({toolId:N.toolId,outputFile:N.outputFile,success:N.success})),syncMetrics:j,verification:ee,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:ne(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>sa.mkdir(ra.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await L.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=C(),s.lastUpdated=C(),s.context={...s.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,s);try{await wf.generate(this.projectPath,s)}catch(o){H.debug("Local state generation failed (optional)",{error:ne(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=ra.join(this.globalPath,m),g=await sa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Context file not found for metrics",{file:m,error:ne(p)})}for(let m of n)try{let p=ra.join(this.globalPath,"agents",`${m.name}.md`),g=await sa.readFile(p,"utf-8");i+=g.length}catch(p){H.debug("Agent file not found for metrics",{agent:m.name,error:ne(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await un.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){H.debug("Failed to record sync metrics",{error:ne(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await Zt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:s??void 0})}catch(s){H.debug("Failed to save draft analysis (non-critical)",{error:ne(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Ye.markDormantIdeas(this.projectId).catch(()=>0),Pe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=St.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:ne(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Bn,n=await ul.learnFromTaskHistory(this.projectId,e,t);try{let s=await Dm.getFeatureOutcomes(this.projectId);s.length>0&&await ul.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&H.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){H.debug("Auto-learning failed (non-critical)",{error:ne(e)})}}async getCliVersion(){try{let e=ra.join(__dirname,"..","..","package.json");return JSON.parse(await sa.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:ne(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:[]}}},as=new oa});var Dn=y(()=>{"use strict";rm();um();dm();fm();ym();Jc();Sm();Yc();km();bm();Bg();Vg();ku()});import mn from"chalk";function Vf(r){return Math.ceil(r.length/vP)}function Jf(r){let e=r.split(`
|
|
1224
937
|
`),t=[],n=null;for(let s=0;s<e.length;s++){let o=e[s],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=s-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:s,endLine:s}):n&&(n.content+=`
|
|
1225
|
-
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function
|
|
1226
|
-
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
938
|
+
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function bu(r){return r.includes("<!-- prjct:preserve")}function qf(r,e){let t=Jf(r),n=Jf(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Vf(r),tokensAfter:Vf(e),tokenDelta:0};s.tokenDelta=s.tokensAfter-s.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)bu(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
939
|
+
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(bu(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
1227
940
|
`).length}),s.hasChanges=!0)):(s.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
1228
|
-
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
1229
|
-
`).length}),s.hasChanges=!0)}return s}function
|
|
941
|
+
`).length}),s.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!bu(a.content)&&(s.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
942
|
+
`).length}),s.hasChanges=!0)}return s}function Kf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?mn.green:p=>p,o=t?mn.red:p=>p,i=t?mn.yellow:p=>p,a=t?mn.dim:p=>p,c=t?mn.bold:p=>p;if(!r.hasChanges)return n.push(a("No changes detected (context is up to date)")),n.join(`
|
|
1230
943
|
`);if(n.push(""),n.push(c("\u{1F4CB} Changes to context files:")),n.push(""),r.added.length>0)for(let p of r.added)n.push(s(`+ \u2502 + ${p.name} (new)`));if(r.modified.length>0)for(let p of r.modified)n.push(i(`~ \u2502 ${p.name} (modified)`));if(r.removed.length>0)for(let p of r.removed)n.push(o(`- \u2502 - ${p.name} (removed)`));if(r.preserved.length>0){n.push(""),n.push(a(" ## Your Customizations"));for(let p of r.preserved)n.push(a(` \u2502 \u2713 ${p.name} (${p.lineCount} lines preserved)`))}n.push(""),n.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(s(`+${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`)),n.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",m=r.tokenDelta>=0?s:o;return n.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${m(d+r.tokenDelta.toLocaleString())})`),n.push(""),n.join(`
|
|
1231
|
-
`)}function
|
|
944
|
+
`)}function Yf(r,e={}){let{colorize:t=!0}=e,n=[],s=t?mn.green:c=>c,o=t?mn.red:c=>c,i=t?mn.cyan:c=>c,a=t?mn.dim:c=>c;for(let c of r.added){if(n.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
1232
945
|
`))n.push(s(`+ ${u}`));n.push("")}for(let c of r.modified){if(n.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
1233
946
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1234
947
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
@@ -1239,11 +952,11 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Nu(r){return r.incl
|
|
|
1239
952
|
`).slice(0,5))n.push(o(`- ${u}`));c.before.split(`
|
|
1240
953
|
`).length>5&&n.push(a(` ... ${c.before.split(`
|
|
1241
954
|
`).length-5} more lines`))}n.push("")}return n.join(`
|
|
1242
|
-
`)}var
|
|
1243
|
-
`));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return
|
|
1244
|
-
`)}function
|
|
955
|
+
`)}var vP,Xf=y(()=>{"use strict";vP=4;l(Vf,"estimateTokens");l(Jf,"parseMarkdownSections");l(bu,"isPreservedSection");l(qf,"generateSyncDiff");l(Kf,"formatDiffPreview");l(Yf,"formatFullDiff")});import xP from"node:path";async function Cu(r,e){let t=Date.now()-e,n=r.contextFiles.length+(r.aiTools?.filter(p=>p.success).length||0),s=r.agents.length,o=r.agents.filter(p=>p.type==="domain").length;await Ee.installGlobalConfig(),h.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let i=r.syncMetrics?.compressionRate?Math.round(r.syncMetrics.compressionRate*100):0,a=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",c=[`${r.stats.fileCount} files \u2192 ${n} context | ${s} agents${i>10?` | ${i}% reduction`:""}`,`Stack: ${r.stats.ecosystem}${a} | Branch: ${r.git.branch}`];h.box("Sync Summary",c.join(`
|
|
956
|
+
`));let u=[];r.contextFiles.length>0&&u.push(`${r.contextFiles.length} context files`);let d=r.aiTools?.filter(p=>p.success)||[];if(d.length>0&&u.push(`AI tools: ${d.map(p=>p.toolId).join(", ")}`),s>0){let p=o>0?`${s} agents (${o} domain)`:`${s} agents`;u.push(p)}if(r.skills.length>0){let p=r.skills.length===1?"skill":"skills";u.push(`${r.skills.length} ${p}`)}let m=r.skillsInstalled?.filter(p=>p.status==="installed")||[];if(m.length>0){let p=m.length===1?"skill":"skills";u.push(`${m.length} ${p} auto-installed`)}if(h.section("Generated"),h.list(u,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(h.warn("Uncommitted changes detected"),console.log("")),r.verification){let p=r.verification;if(p.passed){let g=p.checks.map(f=>`${f.name} (${f.durationMs}ms)`);h.section("Verified"),h.list(g,{bullet:"\u2713"})}else{h.section("Verification");let g=p.checks.map(f=>f.passed?`\u2713 ${f.name}`:`\u2717 ${f.name}${f.error?` \u2014 ${f.error}`:""}`);h.list(g),p.skippedCount>0&&h.warn(`${p.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return bt("sync"),{success:!0,data:r,metrics:{elapsed:t,contextFilesCount:n,agentCount:s,fileCount:r.stats.fileCount}}}async function Qf(r){try{let e=await mt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],n=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(n.length>=2){let u=n.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];s=B.formatDuration(d)}}let o=n.filter(u=>u.action==="task_completed").length,i=n.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of n)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:s,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function lo(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function vu(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Zf(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(s=>s.tokensSaved),n=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/n*(e.length-1)),e.length-1);return e[o]}).join("")}function eh(r,e,t,n,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${n}_`),i.push(""),s){if(i.push("## \u{1F3AF} Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let a=s.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## \u{1F9E0} Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## \u{1F4B0} Token Savings"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Total saved | ${lo(r.totalTokensSaved)} tokens |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Cost saved | ${ri(r.estimatedCostSaved)} |`),i.push(""),i.push("## \u26A1 Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${vu(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## \u{1F916} 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("## \u{1F4C8} 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${lo(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(`
|
|
957
|
+
`)}function th(r,e){let t=[];t.push(`# Repository Analysis
|
|
1245
958
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
1246
|
-
`);let n=
|
|
959
|
+
`);let n=xP.basename(e);if(t.push(`## Project: ${n}
|
|
1247
960
|
`),t.push(`## Stack Detected
|
|
1248
961
|
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
1249
962
|
`),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
|
|
@@ -1259,26 +972,26 @@ ${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Nu(r){return r.incl
|
|
|
1259
972
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1260
973
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1261
974
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1262
|
-
`)}var
|
|
1263
|
-
`),
|
|
975
|
+
`)}var nh=y(()=>{"use strict";xn();oi();Dn();Ns();Nt();rt();l(Cu,"showSyncResult");l(Qf,"getSessionActivity");l(lo,"formatTokens");l(vu,"formatDuration");l(Zf,"generateSparkline");l(eh,"generateStatsMarkdown");l(th,"generateAnalysisSummary")});var Wg={};ge(Wg,{AnalysisCommands:()=>cs});import xu from"node:fs/promises";import sh from"node:path";import rh from"prompts";var cs,qi=y(()=>{"use strict";Rs();Jp();xn();oi();Dn();Xf();Ci();he();zr();_();_s();Ns();Nt();nh();rt();cs=class extends ke{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
976
|
+
`),qe.init(t);let n=await ft.build(t,e),s={packageJson:await qe.readPackageJson(),cargoToml:await qe.readCargoToml(),goMod:await qe.readGoMod(),requirements:await qe.readRequirements(),directories:await qe.listDirectories(),fileCount:await qe.countFiles(),gitStats:await qe.getGitStats(),gitLog:await qe.getGitLog(20),hasDockerfile:await qe.fileExists("Dockerfile"),hasDockerCompose:await qe.fileExists("docker-compose.yml"),hasReadme:await qe.fileExists("README.md"),hasTsconfig:await qe.fileExists("tsconfig.json"),hasViteConfig:await qe.fileExists("vite.config.ts")||await qe.fileExists("vite.config.js"),hasNextConfig:await qe.fileExists("next.config.js")||await qe.fileExists("next.config.mjs")},o=th(s,t),i=await R.getProjectId(t),a=n.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await Ke.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:B.getTimestamp(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits});let u=await(Be(),xt(ut)).getActiveProvider(),d=await Ee.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1264
977
|
`),console.log("\u{1F4C4} Full report: analysis/repo-summary.md"),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1265
|
-
`),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:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=
|
|
1266
|
-
${wh(g)}`),!(await Th({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),Lu(m,i))}t.md||h.spin("Syncing project...");let d=await ps.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(S=>S.success).length||0),g=d.agents.length,f=_i("sync"),k=Ie(nn("Sync Complete",Bt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Dn("Uncommitted changes detected"):null,et(f.map(S=>({label:S.desc,command:S.cmd}))));return console.log(k),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Lu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await mn.getSummary(s),i=await mn.getDailyStats(s,30),a=await Sh(s),c=await Te.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await mn.read(s),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: ${bo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Gs(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Uu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=bh(i);if(console.log(` ${p} ${bo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=Ch(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=fo(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await tn.getStatus(s);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=xh.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)`);let g=Ie(`## Status: ${u}`,Bt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?it("Analysis",Wt(p),3):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)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await tn.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await tn.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await tn.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});var Sa,G,er=y(()=>{"use strict";qe();me();_();ie();Sa=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,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,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} 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,s)}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 n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.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 R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:E.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(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,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};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()}},G=new Sa});import nT from"node:path";var tr,Gu=y(()=>{"use strict";Fn();Dt();_();Ys();at();er();tr=class extends Ce{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=nT.basename(t),a=await L.getCurrentTask(o),c=await be.getActiveTasks(o),u=await ot.getRecent(o,5),d=await Be.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=B.getDaysAgo(m),g=[];try{let S=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",S).map(P=>({...JSON.parse(P.data),timestamp:P.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(S=>S.action==="task_completed").length,featuresShipped:g.filter(S=>S.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
978
|
+
`),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:s}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async sync(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(s),i=Date.now();if(t.package){let m=await A.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let p=m.packages.find(f=>f.name===t.package||f.relativePath===t.package);if(!p){let f=m.packages.map(S=>S.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${f}`}}let g=await as.sync(e,{aiTools:t.aiTools,packagePath:p.path,packageName:p.name});return t.json?console.log(JSON.stringify({success:g.success,package:p.name,path:p.relativePath})):t.md?console.log(en(`Synced package: ${p.name}`)):h.done(`Synced package: ${p.name}`),{success:g.success}}let a=sh.join(o,"context","CLAUDE.md"),c=null;try{c=await xu.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes){u||h.spin("Analyzing changes...");let m=await as.sync(e,{aiTools:t.aiTools,full:t.full});if(!m.success)return t.md?(console.log(Ie("## Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(h.fail(m.error||"Sync failed"),{success:!1,error:m.error});let p;try{p=await xu.readFile(a,"utf-8")}catch{p=""}let g=qf(c,p);if(u||h.stop(),!g.hasChanges)return t.md?(console.log(en("No changes detected","Context is up to date.")),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(h.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let f=l(async()=>{c!=null&&await xu.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await f();let b=[];for(let x of g.added)b.push(`Added: ${x.name} (${x.lineCount} lines)`);for(let x of g.modified)b.push(`Modified: ${x.name} (${x.lineCount} lines)`);for(let x of g.removed)b.push(`Removed: ${x.name} (${x.lineCount} lines)`);let D=Ie("## Sync Preview",b.length>0?st("Changes",Gt(b),3):"No section changes.",zt({"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(D),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await f();let b={added:g.added.map(D=>({name:D.name,lineCount:D.lineCount})),modified:g.modified.map(D=>({name:D.name,lineCount:D.lineCount})),removed:g.removed.map(D=>({name:D.name,lineCount:D.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:b,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(Kf(g)),t.preview)return await f(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await rh({type:"select",name:"action",message:"Apply these changes?",choices:[{title:"Yes, apply changes",value:"apply"},{title:"No, cancel",value:"cancel"},{title:"Show full diff",value:"diff"}]});return S.action==="cancel"||!S.action?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):S.action==="diff"&&(console.log(`
|
|
979
|
+
${Yf(g)}`),!(await rh({type:"confirm",name:"apply",message:"Apply these changes?",initial:!0})).apply)?(await f(),h.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}):(h.done("Changes applied"),Cu(m,i))}t.md||h.spin("Syncing project...");let d=await as.sync(e,{aiTools:t.aiTools,full:t.full});if(!d.success)return t.md?console.log(Ie("## Sync Failed",`> ${d.error||"Unknown error"}`)):h.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||h.stop(),t.md){let m=Date.now()-i,p=d.contextFiles.length+(d.aiTools?.filter(b=>b.success).length||0),g=d.agents.length,f=Pi("sync"),S=Ie(en("Sync Complete",zt({Duration:`${(m/1e3).toFixed(1)}s`,Agents:`${g} generated`,"Files indexed":d.stats.fileCount,"Context files":p})),d.git.hasChanges?Tn("Uncommitted changes detected"):null,Qe(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(S),{success:!0,data:d,metrics:{elapsed:m,contextFilesCount:p,agentCount:g,fileCount:d.stats.fileCount}}}return Cu(d,i)}catch(n){return t.md?console.log(Ie("## Sync Failed",`> ${w(n)}`)):h.fail(w(n)),{success:!1,error:w(n)}}}async stats(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await un.getSummary(s),i=await un.getDailyStats(s,30),a=await Qf(s),c=await Te.getPatternsSummary(s);if(t.json){let p={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(p,null,2)),{success:!0,data:p}}let u="Unknown";try{u=$.getDoc(s,"project")?.name||"Unknown"}catch{}let d=await un.read(s),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: ${lo(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${ri(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vu(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((g,f)=>g+f.usageCount,0);for(let g of o.topAgents){let f=p>0?(g.usageCount/p*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${f}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=Zf(i);if(console.log(` ${p} ${lo(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",f=o.trend>0?"+":"";console.log(` ${g} ${f}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=eh(o,i,u,m,a,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(n){return console.error("\u274C Error:",w(n)),{success:!1,error:w(n)}}}async status(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=so(e),i=await o.check(s),a=await o.getSessionInfo(s),c=await Zt.getStatus(s);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=sh.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)`);let g=Ie(`## Status: ${u}`,zt({Staleness:d,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),p.length>0?st("Analysis",Gt(p),3):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)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async seal(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Zt.seal(s);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(h.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(h.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return{success:!1,error:"No project ID found"};let o=await Zt.verify(s);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?h.done(o.message):h.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(n){let s=w(n);return h.fail(s),{success:!1,error:s}}}async semanticVerify(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):h.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=$.getDoc(s,"project")?.repoPath||e}catch{}let i=await Zt.semanticVerify(s,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(h.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(h.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(n){let s=w(n);return t.json?console.log(JSON.stringify({success:!1,error:s})):h.fail(s),{success:!1,error:s}}}}});var ia,G,Us=y(()=>{"use strict";Ve();Ce();_();le();ia=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,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,n,s){let o=t[n];if(typeof o!="function")throw new Error(`${String(n)} 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,s)}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 n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,c)=>n.indexOf(a)!==c);s.length>0&&e.push(`Duplicate command names: ${s.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 R.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:C()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:C()};else try{o=await this.buildContext(n)}catch(c){return{success:!1,error:w(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,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:C()};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()}},G=new ia});import PP from"node:path";var Gs,Pu=y(()=>{"use strict";Dn();Ut();_();_s();rt();Us();Gs=class extends ke{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=PP.basename(t),a=await L.getCurrentTask(o),c=await Pe.getActiveTasks(o),u=await pt.getRecent(o,5),d=await Ye.getPending(o);if(e==="compact"){let m=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",p=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return h.done(`${m} | ${p} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let m=e==="week"?7:30,p=B.getDaysAgo(m),g=[];try{let b=p.toISOString();g=$.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",b).map(x=>({...JSON.parse(x.data),timestamp:x.timestamp}))}catch{g=[]}let f={tasksCompleted:g.filter(b=>b.action==="task_completed").length,featuresShipped:g.filter(b=>b.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1267
980
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1268
|
-
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let
|
|
1269
|
-
Activity: ${
|
|
1270
|
-
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await
|
|
981
|
+
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${f.tasksCompleted}`),console.log(` Features shipped: ${f.featuresShipped}`),console.log(` Total actions: ${f.totalActions}`),console.log("\u2550".repeat(50));let S=this._generateSparkline(g,m);return console.log(`
|
|
982
|
+
Activity: ${S}
|
|
983
|
+
`),{success:!0,view:e,metrics:f}}if(e==="roadmap"){let m=await ft.build(t),p=await Ke.get("Read")(m.paths.roadmap);if(console.log(`
|
|
1271
984
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1272
985
|
`),console.log("\u2550".repeat(50)),!p||p.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1273
|
-
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,
|
|
1274
|
-
`)[0].trim();console.log(` ${
|
|
1275
|
-
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${B.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(
|
|
986
|
+
`);else{let g=p.split("##").filter(f=>f.trim()&&!f.includes("ROADMAP"));g.slice(0,5).forEach((f,S)=>{let b=f.split(`
|
|
987
|
+
`)[0].trim();console.log(` ${S+1}. ${b}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
988
|
+
`),{success:!0,view:"roadmap"}}if(n.md){let m=a?`${a.description}${a.startedAt?` (started ${B.calculateDuration(new Date(a.startedAt))} ago)`:""}`:"No active task",p=c.length>0?c.slice(0,5).map(S=>{let b=S.priority?` [${S.priority}]`:"";return`${S.description}${b}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(S=>{let b=S.shippedAt?new Date(S.shippedAt).toLocaleDateString():"";return`${S.name}${b?` (${b})`:""}`}):["Nothing shipped yet"],f=Ie(`## Dashboard: ${i}`,st("Current Focus",m,3),st(`Queue (${c.length})`,Gt(p,!0),3),st("Recent Ships",Gt(g),3),st("Ideas",`${d.length} pending`,3),Qe([{label:"Start task",command:"p. task"},{label:"Complete",command:"p. done"},{label:"Ship",command:"p. ship"}]));console.log(f)}else{console.log(`
|
|
1276
989
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1277
|
-
`),console.log("\u2550".repeat(50));let m=
|
|
990
|
+
`),console.log("\u2550".repeat(50));let m=so(t),p=await m.check(o),g=m.getWarning(p);if(g&&console.log(`
|
|
1278
991
|
${g}`),console.log(`
|
|
1279
992
|
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let f=B.calculateDuration(new Date(a.startedAt));console.log(` Started: ${f} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1280
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,
|
|
1281
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let
|
|
993
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((f,S)=>{let b=f.priority?`[${f.priority}]`:"";console.log(` ${S+1}. ${f.description.slice(0,40)} ${b}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
994
|
+
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(f=>{let S=f.shippedAt?new Date(f.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${f.name} ${S?`(${S})`:""}`)}),console.log(`
|
|
1282
995
|
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1283
996
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1284
997
|
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:B.getTimestamp()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
@@ -1296,7 +1009,7 @@ ${"\u2550".repeat(50)}
|
|
|
1296
1009
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1297
1010
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1298
1011
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1299
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);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=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import
|
|
1012
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}_generateSparkline(e,t){let n=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],s=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(s);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=>n[Math.floor(a/i*(n.length-1))]).join("")}}});import TP from"node:fs/promises";import EP from"node:path";var ls,MG,Tu=y(()=>{"use strict";Dl();Ve();Ce();Ut();_();ls=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd()){try{let n=(e||"").trim().split(/\s+/),s=n[0]||"task",o=n.slice(1).join(" "),i=await R.readConfig(t);if(!i||!i.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,agents:[],subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let a=i.projectId,c=A.getGlobalProjectPath(a),u=await L.read(a),d=u?.currentTask?{id:u.currentTask.id,description:u.currentTask.description,startedAt:u.currentTask.startedAt,subtasks:u.currentTask.subtasks?.map(f=>({id:f.id,description:f.description,status:f.status,domain:f.domain})),currentSubtaskIndex:u.currentTask.currentSubtaskIndex}:null,m=null;if(o)try{m=await Ni.execute(s,o,t)}catch(f){console.error(`Warning: Orchestrator failed: ${w(f)}`)}let p=await this.loadRepoAnalysis(c),g={projectId:a,globalPath:c,currentTask:d,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,agents:m?.agents.map(f=>({name:f.name,domain:f.domain,filePath:f.filePath,skills:f.skills,preview:f.content.substring(0,500)}))||[],subtasks:m?.subtasks?.map(f=>({id:f.id,description:f.description,domain:f.domain,agent:f.agent,status:f.status,order:f.order}))||null,repoAnalysis:{ecosystem:p?.ecosystem||"unknown",frameworks:p?.frameworks||[],hasTests:p?.hasTests||!1,technologies:p?.technologies||[]}};return console.log(JSON.stringify(g,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${w(n)}`}}}async loadRepoAnalysis(e){try{let t=EP.join(e,"analysis","repo-analysis.json"),n=await TP.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return v(t),null}}},MG=new ls});async function aa(r){let e=await R.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let s=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let o=s-500;V.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 ca(r){let e=await R.getProjectId(r);if(!e)return;let n=V.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let s=n-500;V.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",s)}}async function Eu(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){h.spin("cleaning memory...");let a=await aa(e);return h.done("memory cleaned"),a}h.spin("cleaning up...");let n=await R.getProjectId(e);if(!n)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let s=[],i=V.get(n,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;V.run(n,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),s.push(`Memory: ${a} old entries removed`)}else s.push("Memory: No cleanup needed");try{let a=await Ye.cleanup(n);a.removed>0?s.push(`Ideas: ${a.removed} old archived ideas removed`):s.push("Ideas: No cleanup needed")}catch(a){s.push(`Ideas: Error - ${w(a)}`)}try{let c=(await Pe.getActiveTasks(n)).filter(u=>u.completed).length;c>0?s.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):s.push("Queue: No completed tasks")}catch(a){s.push(`Queue: Error - ${w(a)}`)}return await ca(e),await mt.log(e,"cleanup_performed",{items:s.length,timestamp:B.getTimestamp()}),h.done(`${s.length} items cleaned`),{success:!0,cleaned:s}}catch(t){return h.fail(w(t)),{success:!1,error:w(t)}}}var Iu=y(()=>{"use strict";Dn();Ut();he();_();rt();l(aa,"cleanupMemory");l(ca,"cleanupMemoryInternal");l(Eu,"cleanup")});import oh from"node:path";async function Au(r=null,e={},t=process.cwd()){try{let n=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(n))return h.fail(`invalid type: ${n}`),{success:!1,error:"Invalid design type"};let o=r||"system";h.spin(`designing ${n}...`);let i=await R.getProjectId(t),a=oh.join(A.getGlobalProjectPath(i),"planning","designs");await ce.ensureDir(a);let c="";switch(n){case"architecture":c=`# Architecture Design: ${o}
|
|
1300
1013
|
|
|
1301
1014
|
*Use templates/design/architecture.md for full design*
|
|
1302
1015
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1311,12 +1024,12 @@ ${"\u2550".repeat(50)}
|
|
|
1311
1024
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1312
1025
|
|
|
1313
1026
|
*Use templates/design/flow.md for full design*
|
|
1314
|
-
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=
|
|
1027
|
+
`;break}let u=`${n}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=oh.join(a,u);return await ce.writeFile(d,c),await mt.log(t,"design_created",{type:n,target:o,timestamp:B.getTimestamp()}),h.done(`${n} design created`),{success:!0,designPath:d,type:n,target:o}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}var ju=y(()=>{"use strict";Dn();_();rt();l(Au,"design")});import zs from"node:path";async function Du(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};h.spin("checking for abandoned sessions...");let t=A.getFilePath(e,"progress","sessions/current.json"),n=null;try{let s=await ce.readFile(t);n=JSON.parse(s)}catch(s){if(v(s)||s instanceof SyntaxError)n=null;else throw s}if(!n||!n.task)return h.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1315
1028
|
Found abandoned session:
|
|
1316
1029
|
`),console.log(` Task: ${n.task}`),n.startedAt){let s=B.calculateDuration(new Date(n.startedAt));console.log(` Started: ${s} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1317
1030
|
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
|
|
1318
|
-
`),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function
|
|
1319
|
-
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await
|
|
1031
|
+
`),{success:!0,session:n}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Ru(r=process.cwd()){try{h.spin("creating undo point...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots");await ce.ensureDir(t);let{execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return h.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let i=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;n(`git stash push -m "${i}"`,{cwd:r,encoding:"utf-8"});let a=zs.join(t,"history.json"),c={snapshots:[],current:-1};try{let u=await ce.readFile(a);c=JSON.parse(u)}catch(u){if(!v(u)&&!(u instanceof SyntaxError))throw u}return c.snapshots.push({id:i,timestamp:new Date().toISOString(),message:i}),c.current=c.snapshots.length-1,await ce.writeFile(a,JSON.stringify(c,null,2)),await mt.log(r,"undo_performed",{snapshotId:i,timestamp:B.getTimestamp()}),h.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:i}}catch(s){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(s)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function $u(r=process.cwd()){try{h.spin("restoring changes...");let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots"),n=zs.join(t,"history.json"),s;try{let i=await ce.readFile(n);s=JSON.parse(i)}catch(i){if(v(i)||i instanceof SyntaxError)return h.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(s.snapshots.length===0)return h.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
|
|
1032
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),s.snapshots.pop(),s.current=Math.max(0,s.current-1),await ce.writeFile(n,JSON.stringify(s,null,2)),await mt.log(r,"redo_performed",{timestamp:B.getTimestamp()}),h.done("changes restored"),{success:!0}):(h.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(h.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return h.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:w(i)}}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}async function Mu(r=process.cwd()){try{let e=await R.getProjectId(r);if(!e)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=zs.join(A.getGlobalProjectPath(e),"snapshots"),n=zs.join(t,"history.json"),s;try{let o=await ce.readFile(n);s=JSON.parse(o)}catch(o){if(v(o)||o instanceof SyntaxError)return console.log(`
|
|
1320
1033
|
SNAPSHOT HISTORY
|
|
1321
1034
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1322
1035
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1324,32 +1037,32 @@ ${"\u2550".repeat(50)}
|
|
|
1324
1037
|
`),console.log("=".repeat(50)),s.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1325
1038
|
`)):(s.snapshots.forEach((o,i)=>{let a=i===s.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${s.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
|
|
1326
1039
|
`)),console.log(`${"=".repeat(50)}
|
|
1327
|
-
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var
|
|
1040
|
+
`),{success:!0,snapshots:s.snapshots,current:s.current}}catch(e){return h.fail(w(e)),{success:!1,error:w(e)}}}var Ou=y(()=>{"use strict";Dn();_();rt();l(Du,"recover");l(Ru,"undo");l($u,"redo");l(Mu,"history")});var Ws,Fu=y(()=>{"use strict";rt();Iu();ju();Ou();Iu();ju();Ou();Ws=class extends ke{static{l(this,"MaintenanceCommands")}_cleanupMemory=aa;_cleanupMemoryInternal=ca;async cleanup(e={},t=process.cwd()){let n=await this.ensureProjectInit(t);return n.success?Eu(e,t):n}async design(e=null,t={},n=process.cwd()){let s=await this.ensureProjectInit(n);return s.success?Au(e,t,n):s}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Du(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Ru(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?$u(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?Mu(e):t}}});import je from"chalk";function la(r,e,t){return t==="below"?r<=e?je.green("\u2713"):je.yellow("\u26A0"):r>=e?je.green("\u2713"):je.yellow("\u26A0")}var Rn,Bs,_u=y(()=>{"use strict";ei();_();rt();Rn={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};l(la,"statusIcon");Bs=class extends ke{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await zn.getReport(s,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1328
1041
|
${je.dim("No performance data yet.")}`),console.log(`${je.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1329
1042
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1330
|
-
${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=
|
|
1331
|
-
${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import
|
|
1043
|
+
${je.cyan("Performance Report")} ${je.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=la(i.startup.avg,Rn.startup.max,"below");console.log(` Startup: avg ${je.bold(`${i.startup.avg}ms`)} ${je.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${je.dim(`target: <${Rn.startup.max}ms`)}`)}if(i.memory){let c=la(i.memory.peakHeapMB,Rn.heapMB.max,"below");console.log(` Memory: avg ${je.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${je.dim(`target: <${Rn.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=la(i.contextCorrectness.rate,Rn.contextRate.min,"above");console.log(` Context: ${je.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${je.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${je.dim(`target: ${Rn.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=la(i.subtaskHandoff.rate,Rn.handoffRate.min,"above");console.log(` Handoff: ${je.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${je.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${je.dim(`target: ${Rn.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1044
|
+
${je.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${je.bold(`${u.avg}ms`)} ${je.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}}});import Nu from"node:fs/promises";import IP from"node:path";import ae from"chalk";var Vs,Lu=y(()=>{"use strict";xn();Ce();_();xe();dt();rt();Vs=class extends ke{static{l(this,"SetupCommands")}async start(){let t=await(Be(),xt(ut)).getActiveProvider();if(console.log(`\u{1F680} Setting up prjct for ${t.displayName}...
|
|
1332
1045
|
`),!(await Ee.checkInstallation()).claudeDetected)return{success:!1,message:`\u274C ${t.displayName} not detected.
|
|
1333
1046
|
|
|
1334
1047
|
Please install it first:
|
|
1335
1048
|
- ${t.displayName}: ${t.docsUrl}`};console.log("\u{1F4E6} Installing /p:* commands...");let s=await Ee.installCommands();if(!s.success)return{success:!1,message:`\u274C Installation failed: ${s.error}`};if(console.log(`
|
|
1336
1049
|
\u2705 Installed ${s.installed?.length??0} commands to:
|
|
1337
|
-
${
|
|
1050
|
+
${A.getDisplayPath(s.path||"")}`),(s.errors?.length??0)>0){console.log(`
|
|
1338
1051
|
\u26A0\uFE0F ${s.errors?.length??0} errors:`);for(let o of s.errors??[])console.log(` - ${o.file}: ${o.error}`)}return console.log(`
|
|
1339
1052
|
\u{1F389} Setup complete!`),console.log(`
|
|
1340
1053
|
Next steps:`),console.log(` 1. Open ${t.displayName}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: /p:init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
|
|
1341
1054
|
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Ee.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Ee.updateCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1342
1055
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1343
1056
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let a of t.errors??[])console.log(` - ${a.file}: ${a.error}`)}console.log(`
|
|
1344
|
-
\u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),s=n.path?
|
|
1057
|
+
\u{1F4DD} Installing global configuration...`);let n=await Ee.installGlobalConfig(),s=n.path?A.getDisplayPath(n.path):"global config";if(n.success?n.action==="created"?console.log(`\u2705 Created ${s}`):n.action==="updated"?console.log(`\u2705 Updated ${s}`):n.action==="appended"&&console.log(`\u2705 Added prjct config to ${s}`):console.log(`\u26A0\uFE0F ${n.error}`),(await(Be(),xt(ut)).getActiveProvider()).name==="claude"){console.log(`
|
|
1345
1058
|
\u26A1 Installing status line...`);let a=await this.installStatusLine();a.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${a.error}`)}return console.log(`
|
|
1346
1059
|
\u{1F389} Setup complete!
|
|
1347
|
-
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=
|
|
1060
|
+
`),this.showAsciiArt(),{success:!0,message:""}}async installStatusLine(){try{let e=A.getClaudeDir(),t=A.getClaudeSettingsPath(),n=IP.join(e,"prjct-statusline.sh"),s=`#!/bin/bash
|
|
1348
1061
|
# prjct Status Line for Claude Code
|
|
1349
1062
|
# Shows version update notifications and current task
|
|
1350
1063
|
|
|
1351
1064
|
# Current CLI version (embedded at install time)
|
|
1352
|
-
CLI_VERSION="${
|
|
1065
|
+
CLI_VERSION="${fe}"
|
|
1353
1066
|
|
|
1354
1067
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1355
1068
|
read -r json
|
|
@@ -1400,16 +1113,16 @@ fi
|
|
|
1400
1113
|
|
|
1401
1114
|
# Default: show prjct branding
|
|
1402
1115
|
echo "\u26A1 prjct"
|
|
1403
|
-
`;await
|
|
1404
|
-
${
|
|
1405
|
-
`)[0])),{success:!1,failed:o,output:c}}}async function
|
|
1116
|
+
`;await Nu.writeFile(n,s,{mode:493});let o={};if(await P(t))try{o=JSON.parse(await Nu.readFile(t,"utf8"))}catch{}return o.statusLine={type:"command",command:n},await Nu.writeFile(t,JSON.stringify(o,null,2)),{success:!0}}catch(e){return{success:!1,error:w(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${fe} 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 ht from"node:path";async function AP(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 P(ht.join(r,"pnpm-lock.yaml"))?"pnpm":await P(ht.join(r,"yarn.lock"))?"yarn":await P(ht.join(r,"bun.lockb"))||await P(ht.join(r,"bun.lock"))?"bun":(await P(ht.join(r,"package-lock.json")),"npm")}function ih(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function jP(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function Hu(r){let e=ht.join(r,"package.json"),t=await _n(e,null);if(t){let o=await AP(r,t),i=t.scripts||{},a={stack:"js",packageManager:o};return i.lint&&(a.lint={tool:o,command:ih(o,"lint")}),i.typecheck&&(a.typecheck={tool:o,command:ih(o,"typecheck")}),i.test&&(a.test={tool:o,command:jP(o)}),a}if(await P(ht.join(r,"pytest.ini")))return{stack:"python",test:{tool:"pytest",command:"pytest"}};let n=await fs(ht.join(r,"pyproject.toml"),"");return n.includes("[tool.pytest")||n.includes("pytest")?{stack:"python",test:{tool:"pytest",command:"pytest"}}:await P(ht.join(r,"Cargo.toml"))?{stack:"rust",test:{tool:"cargo",command:"cargo test"}}:await P(ht.join(r,"go.mod"))?{stack:"go",test:{tool:"go",command:"go test ./..."}}:(await hs(r)).some(o=>o.endsWith(".sln")||o.endsWith(".csproj")||o.endsWith(".fsproj"))?{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"}}:await P(ht.join(r,"pom.xml"))?{stack:"java",test:{tool:"maven",command:"mvn test"}}:await P(ht.join(r,"gradlew"))&&(await P(ht.join(r,"build.gradle"))||await P(ht.join(r,"build.gradle.kts")))?{stack:"java",test:{tool:"gradle",command:"./gradlew test"}}:{stack:"unknown"}}var ah=y(()=>{"use strict";xe();l(AP,"detectPackageManager");l(ih,"pmRun");l(jP,"pmTest");l(Hu,"detectProjectCommands")});import{exec as DP}from"node:child_process";import{promisify as RP}from"node:util";import Vt from"chalk";function uo(r,e){return`workflow:${r}_${e}`}async function ch(r,e){let t=uo(e.hook,e.command);switch(e.scope){case"permanent":await Te.recordDecision(r,t,e.action,"workflow");break;case"session":ua.set(t,e);break;case"once":Js.set(t,e);break}}async function MP(r,e){let t={};for(let n of["before","after","skip"]){let s=uo(n,e),o=Js.get(s);if(o){n==="skip"?t.skip=o.action==="true":t[n]=o.action;continue}let i=ua.get(s);if(i){n==="skip"?t.skip=i.action==="true":t[n]=i.action;continue}let a=await Te.getSmartDecision(r,s);a&&(n==="skip"?t.skip=a==="true":t[n]=a)}return t}async function $n(r,e,t,n={}){if(n.skipHooks)return{success:!0};let s=await MP(r,t);if(s.skip)return{success:!0,skipped:[t]};let o=s[e];if(!o)return{success:!0};let i=uo(e,t);Js.has(i)&&Js.delete(i),console.log(`
|
|
1117
|
+
${Vt.dim(`Running ${e}-${t}: ${o}`)}`);try{let a=Date.now();await $P(o,{timeout:6e4,cwd:n.projectPath||process.cwd(),env:{...process.env}});let c=Date.now()-a,u=c>1e3?`${(c/1e3).toFixed(1)}s`:`${c}ms`;return console.log(`${Vt.green("\u2713")} ${Vt.dim(`(${u})`)}`),{success:!0}}catch(a){console.log(Vt.red("\u2717 failed"));let c=w(a)||"Unknown error";return console.log(Vt.dim(c.split(`
|
|
1118
|
+
`)[0])),{success:!1,failed:o,output:c}}}async function Uu(r){let e=[],t=["task","done","ship","sync"],n=["before","after","skip"];for(let s of t)for(let o of n){let i=uo(o,s),a=Js.get(i);if(a){e.push({key:`${o} ${s}`,action:a.action,scope:"once"});continue}let c=ua.get(i);if(c){e.push({key:`${o} ${s}`,action:c.action,scope:"session"});continue}let u=await Te.getSmartDecision(r,i);u&&e.push({key:`${o} ${s}`,action:u,scope:"permanent"})}return e}async function lh(r,e,t){let n=uo(e,t);return Js.delete(n),ua.delete(n),await Te.recordDecision(r,n,"","workflow:remove"),!0}function uh(r){if(r.length===0)return`${Vt.dim(Ir.NO_PREFERENCES)}
|
|
1406
1119
|
|
|
1407
|
-
Set one: "${
|
|
1408
|
-
`)}var
|
|
1120
|
+
Set one: "${Ir.SET_EXAMPLE}"`;let e=["","WORKFLOW PREFERENCES","\u2500\u2500\u2500\u2500\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 t of r){let n=t.scope==="permanent"?Vt.green("permanent"):t.scope==="session"?Vt.yellow("session"):Vt.dim("once");e.push(` [${n}] ${t.key.padEnd(15)} \u2192 ${t.action}`)}return e.push(""),e.push(Vt.dim(`Modify: "${Ir.MODIFY_EXAMPLE}"`)),e.push(Vt.dim(`Remove: "${Ir.REMOVE_EXAMPLE}"`)),e.join(`
|
|
1121
|
+
`)}var $P,ua,Js,Gu=y(()=>{"use strict";Rs();_();ln();$P=RP(DP),ua=new Map,Js=new Map;l(uo,"prefKey");l(ch,"setWorkflowPreference");l(MP,"getWorkflowPreferences");l($n,"runWorkflowHooks");l(Uu,"listWorkflowPreferences");l(lh,"removeWorkflowPreference");l(uh,"formatWorkflowPreferences")});import dh from"node:path";var qs,zu=y(()=>{"use strict";Rs();Ut();_();_s();Ns();ah();Gu();rt();qs=class extends ke{static{l(this,"ShippingCommands")}async _runWithExitCode(e){let t=Ke.get("Bash"),s=`bash -lc "set +e; ${e.replace(/"/g,'\\"')} 2>&1; echo __EXIT:$?"`,o=await t(s),i=`${o.stdout}
|
|
1409
1122
|
${o.stderr}`.trim(),a=i.split(`
|
|
1410
1123
|
`),c;for(let m=a.length-1;m>=0;m--)if(a[m].startsWith("__EXIT:")){c=a[m];break}let u=c?Number(c.replace("__EXIT:","").trim()):1,d=i.split(`
|
|
1411
1124
|
`).filter(m=>!m.startsWith("__EXIT:")).join(`
|
|
1412
|
-
`).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await
|
|
1125
|
+
`).trim();return{exitCode:Number.isFinite(u)?u:1,output:d}}async ship(e,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e;i||(i=(await L.getCurrentTask(o))?.description||"current work");let a=await $n(o,"before","ship",{projectPath:t,skipHooks:n.skipHooks});if(!a.success)return{success:!1,error:`Hook failed: ${a.failed}`};n.md||h.step(1,5,`Linting ${i}...`);let c=await this._runLint(t);n.md||h.step(2,5,"Running tests...");let u=await this._runTests(t);n.md||h.step(3,5,"Updating version...");let d=await this._bumpVersion(t);await this._updateChangelog(i,d,t),n.md||h.step(4,5,"Committing...");let m=await this._createShipCommit(i,t),p="skipped";if(m.success){n.md||h.step(5,5,"Pushing...");let f=await this._gitPush(t);p=f.success?"pushed":f.message}if(await pt.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:B.getTimestamp()}),await Te.learnDecision(o,"commit_footer","prjct","ship"),u.success&&await Te.recordDecision(o,"test_before_ship","true","ship"),(!c.success||!u.success)&&await Te.recordWorkflow(o,"quick_ship",{description:"Ship without full checks",feature_type:i.toLowerCase().includes("doc")?"docs":"other"}),await $n(o,"after","ship",{projectPath:t,skipHooks:n.skipHooks}),n.md){let f=Pi("ship"),S=Ie(en(`Shipped: ${i}`,`Version: ${d}`),st("Results",Gt([`Lint: ${c.message}`,`Tests: ${u.message}`,`Commit: ${m.success?"created":m.message}`,`Push: ${p}`]),3),Qe(f.map(b=>({label:b.desc,command:b.cmd}))));console.log(S)}else h.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async _runLint(e){try{let t=await Hu(e);if(!t.lint)return{success:!0,message:"skipped (no lint detected)"};let{exitCode:n}=await this._runWithExitCode(t.lint.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (lint not found)"}:{success:!0,message:"skipped (lint detection failed)"}}}async _runTests(e){try{let t=await Hu(e);if(!t.test)return{success:!0,message:"skipped (no tests detected)"};let{exitCode:n}=await this._runWithExitCode(t.test.command);return{success:n===0,message:n===0?"passed":"failed"}}catch(t){return v(t)?{success:!0,message:"skipped (tests not found)"}:{success:!0,message:"skipped (test detection failed)"}}}async _bumpVersion(e){try{let t=dh.join(e,"package.json"),n=await ce.readJson(t,{version:"0.0.0"}),s=n?.version||"0.0.0",[o,i,a]=s.split(".").map(Number),c=`${o}.${i}.${a+1}`;return n&&(n.version=c,await ce.writeJson(t,n)),c}catch(t){if(v(t)||t instanceof SyntaxError)return"0.0.1";throw t}}async _updateChangelog(e,t,n){try{let s=dh.join(n,"CHANGELOG.md"),o=await ce.readFile(s,`# Changelog
|
|
1413
1126
|
|
|
1414
1127
|
`),i=`## [${t}] - ${B.formatDate(new Date)}
|
|
1415
1128
|
|
|
@@ -1420,36 +1133,36 @@ ${o.stderr}`.trim(),a=i.split(`
|
|
|
1420
1133
|
|
|
1421
1134
|
`,`# Changelog
|
|
1422
1135
|
|
|
1423
|
-
${i}`);await
|
|
1136
|
+
${i}`);await ce.writeFile(s,a)}catch(s){v(s)?console.error(" Warning: CHANGELOG.md not found"):console.error(" Warning: Could not update CHANGELOG")}}async _createShipCommit(e,t){try{await Ke.get("Bash")("git add .");let n=`feat: ${e}
|
|
1424
1137
|
|
|
1425
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1426
|
-
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${
|
|
1138
|
+
Generated with [p/](https://www.prjct.app/)`;return await Ke.get("Bash")(`git commit -m "${n.replace(/"/g,'\\"')}"`),{success:!0,message:"Committed"}}catch(n){return v(n)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await Ke.get("Bash")("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return v(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}}});import OP from"node:fs/promises";import FP from"node:path";import Ks from"chalk";var Ys,Wu=y(()=>{"use strict";Ve();Ce();xi();_();Nt();rt();Ys=class extends ke{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.all===!0;try{let o=s?await this.getAllProjectIds():await this.getCurrentProjectId(t);if(o.length===0)return h.warn("no projects found"),{success:!1,message:"No prjct projects found to update"};n&&console.log(Ks.dim(`[dry-run] Would update ${o.length} project(s)
|
|
1139
|
+
`));let i=0,a=0,c=0;for(let d of o){let m=`${d.slice(0,8)}...`;if(n){console.log(` ${Ks.dim("would update")} ${m}`);continue}try{let p=await Wr(d),g=await vi(d),f=p.migratedFiles.length;if(i+=f,a+=g,f>0||g>0?console.log(` ${Ks.green("\u2713")} ${m}: migrated ${f} files, swept ${g} leftovers`):console.log(` ${Ks.green("\u2713")} ${m}: already up to date`),p.errors.length>0){for(let S of p.errors)console.log(` ${Ks.yellow("\u26A0")} ${S.file}: ${S.error}`);c+=p.errors.length}}catch(p){console.log(` ${Ks.red("\u2717")} ${m}: ${w(p)}`),c++}}if(n)return h.done(`dry run complete (${o.length} projects)`),{success:!0,message:`Would update ${o.length} project(s)`};let u=[];return i>0&&u.push(`${i} files migrated`),a>0&&u.push(`${a} leftovers swept`),c>0&&u.push(`${c} errors`),u.length===0?h.done(`${o.length} project(s) already up to date`):h.done(`${o.length} project(s) updated: ${u.join(", ")}`),{success:c===0,message:`Updated ${o.length} project(s)`}}catch(o){return h.fail(w(o)),{success:!1,error:w(o)}}}async getCurrentProjectId(e){let t=await R.getProjectId(e);return t?[t]:[]}async getAllProjectIds(){let e=FP.join(A.getGlobalBasePath(),"projects");try{return(await OP.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});import De from"chalk";var Xs,Bu=y(()=>{"use strict";Cl();vs();rl();_();Xn();rt();Xs=class extends ke{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await gt.getAll(s);if(i.length===0)return console.log(`
|
|
1427
1140
|
${De.dim("No velocity data yet.")}`),console.log(`${De.dim("Complete tasks with estimates to build velocity history.")}
|
|
1428
|
-
`),{success:!0,message:"No data"};let a
|
|
1141
|
+
`),{success:!0,message:"No data"};let a=$i(i,o);await sl.saveMetrics(s,a),console.log(`
|
|
1429
1142
|
${De.cyan("Sprint Velocity")} ${De.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let m of c){let p=m.estimationAccuracy>=80?De.green:m.estimationAccuracy>=60?De.yellow:De.red;console.log(` Sprint ${String(m.sprintNumber).padStart(2)}: ${De.bold(`${m.pointsCompleted} pts`)} | ${m.tasksCompleted} tasks | accuracy: ${p(`${m.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?De.green("\u2191"):a.velocityTrend==="declining"?De.red("\u2193"):De.dim("\u2192");if(console.log(` Average: ${De.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${De.bold(`${a.estimationAccuracy}%`)} ${De.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1430
|
-
${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=
|
|
1431
|
-
${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...xn,...n.velocity}}catch{}return xn}}});var gT,fT,Oh,xa,Mh,Fh,_h=y(()=>{"use strict";ss();gT=[1,2,3,5,8,13,21],fT={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}},Oh=l(r=>gT.includes(r),"isValidPoint"),xa=l(r=>fT[r],"pointsToMinutes"),Mh=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"),Fh=l(r=>{let e=xa(r);return`${Mh(e.min)}\u2013${Mh(e.max)}`},"pointsToTimeRange")});function ld(){nt.clear(),Kt.clear(),dr.clear(),pr.clear()}function ud(){return{issues:nt.stats(),assignedIssues:Kt.stats(),teams:dr.stats(),projects:pr.stats()}}var Ta,nt,Kt,dr,pr,dd=y(()=>{"use strict";ri();Ta=300*1e3,nt=new Lt({ttl:Ta,maxSize:100}),Kt=new Lt({ttl:Ta,maxSize:10}),dr=new Lt({ttl:Ta,maxSize:5}),pr=new Lt({ttl:Ta,maxSize:5});l(ld,"clearLinearCache");l(ud,"getLinearCacheStats")});import{exec as hT}from"node:child_process";import{promisify as yT}from"node:util";async function Ea(r){if(process.platform!=="darwin")return Nh(r);try{let{stdout:e}=await wT(`security find-generic-password -s "${kT}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return Nh(r)}}function Nh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var wT,kT,pd=y(()=>{"use strict";_();wT=yT(hT),kT="prjct-cli";l(Ea,"getCredential");l(Nh,"getEnvFallback")});var ST,bT,Lh,Ia,kt,md=y(()=>{"use strict";_();pd();ST={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},bT={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},Lh={none:0,urgent:1,high:2,medium:3,low:4},Ia=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await Ea("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?Lh[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=Lh[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:ST[t?.type||"backlog"]||"backlog",priority:bT[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},kt=new Ia});var Aa,Ot,gd=y(()=>{"use strict";dd();md();Aa=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&kt.isConfigured()}async initialize(e){this.initialized||(await kt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Kt.get(t);if(n)return n;let s=await kt.fetchAssignedIssues(e);Kt.set(t,s);for(let o of s)nt.set(`issue:${o.id}`,o),nt.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Kt.get(n);if(s)return s;let o=await kt.fetchTeamIssues(e,t);Kt.set(n,o);for(let i of o)nt.set(`issue:${i.id}`,i),nt.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=nt.get(t);if(n)return n;let s=await kt.fetchIssue(e);return s&&(nt.set(`issue:${s.id}`,s),nt.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await kt.createIssue(e);return nt.set(`issue:${t.id}`,t),nt.set(`issue:${t.externalId}`,t),Kt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await kt.updateIssue(e,t);return nt.set(`issue:${n.id}`,n),nt.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await kt.markInProgress(e),nt.delete(`issue:${e}`),Kt.clear()}async markDone(e){this.ensureInitialized(),await kt.markDone(e),nt.delete(`issue:${e}`),Kt.clear()}async addComment(e,t){this.ensureInitialized(),await kt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=dr.get("teams");if(e)return e;let t=await kt.getTeams();return dr.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=pr.get("projects");if(e)return e;let t=await kt.getProjects();return pr.set("projects",t),t}clearCache(){ld()}getCacheStats(){return ud()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Ot=new Aa});var Uh,ja,CT,Hh=y(()=>{"use strict";gc();ye();_();gd();Uh=1800*1e3,ja=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Ot.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:Uh,issues:o};return $.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Ot.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Ot.markInProgress(t):n==="done"&&await Ot.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||Uh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=dp("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},CT=new ja});var Gh=y(()=>{"use strict";dd();md();gd();Hh()});import vT from"node:fs/promises";import PT from"node:os";import xT from"node:path";function TT(r){return xT.join(PT.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function Da(r){let e=TT(r);if(!await T(e))return{};try{return JSON.parse(await vT.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function fd(r){let e=await Da(r);return e.linear?.apiKey?e.linear.apiKey:Ea("linear-api-key")}var zh=y(()=>{"use strict";_();xe();pd();l(TT,"getCredentialsPath");l(Da,"getProjectCredentials");l(fd,"getLinearApiKey")});function Wh(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`}function ET(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}var mr,hd=y(()=>{"use strict";au();su();_h();Gh();Nt();Dt();_();Ys();Xs();zh();od();ss();at();mr=class extends Ce{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Nn(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=await sa.execute("task",{task:e},t);if(!a.success)return n.md||h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await Da(o),k=await fd(o);if(k&&f.linear?.teamId){await Ot.initializeFromApiKey(k,f.linear.teamId);let S=await Ot.fetchIssue(e);S&&(c=e,u=`${e}: ${S.title}`,await Ot.markInProgress(e))}}catch{}await L.startTask(o,{id:Se(),description:u,sessionId:Se(),linearId:c});let m=await nu.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;if(n.md){let f=a.subtasks||[],k=Cl({description:u,branch:a.branch,linearId:c,type:a.type}),S=f.length>0?vl(f,0):"",x=Vm(["All commits must include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"]),P=et([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(k,S,x,P))}else h.done(`${e}`,{agents:g>0?g:void 0}),so("working"),Pt("task");return await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:B.getTimestamp()}),await Nn(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:Oh,pointsToMinutes:xa,pointsToTimeRange:Fh,storeEstimate:l(async f=>{let k=xa(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:k.typical}),k},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Dn("No active task")):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?B.calculateDuration(new Date(i.startedAt)):void 0,c=Cl({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?vl(u,d):"",p=et([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){return n.md?console.log(`> Error: ${w(s)}`):h.fail(w(s)),{success:!1,error:w(s)}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(s);if(!o)return h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await Nn(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=B.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await ht.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Wh(d):"0m",actualDuration:c||"0m",variance:d?ET(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,k=d>0?Math.round((u-d)/d*100):0,S=f>=0?"+":"";p=` | est: ${m}pt (${Wh(d)}) \u2192 ${S}${k}%`}await L.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await Da(s),k=await fd(s);k&&f.linear?.teamId&&(await Ot.initializeFromApiKey(k,f.linear.teamId),await Ot.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(nn("Subtask Complete",`**Completed:** ${a}${f}`),Bt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),et([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),so("completed"),Pt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:B.getTimestamp()}),await Nn(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await be.getActiveTasks(s);if(o.length===0)return t.md?console.log(Dn("Queue is empty")):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(it("Queue",`${o.length} task${o.length!==1?"s":""}`),Wt(i,!0),et([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),Pt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Dn("No active task to pause")):h.warn("no active task to pause"),{success:!1,message:"No active task to pause"};let a="";if(i.startedAt&&(a=B.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(nn("Task Paused",`**Paused:** ${i.description}`),Bt({Reason:e||void 0,"Duration worked":a||void 0}),et([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),so("paused"),Pt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:B.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?console.log(Dn(`Already working on: ${i.description}`)):h.warn("already working on a task"),{success:!1,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(nn("Task Resumed",`**Resumed:** ${a.description}`),et([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),so("working"),Pt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:B.getTimestamp()}),{success:!0,task:a.description}):(n.md?console.log(Dn("No paused task found")):h.warn("no paused task to resume"),{success:!1,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await rd(s);return console.log(Rh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await jh(s,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await Dh(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>rd(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Wh,"formatMinutesToDuration");l(ET,"formatVariance")});var kn,MV,Bh=y(()=>{"use strict";ia();Gu();zu();Zu();ed();oa();nd();id();ad();cd();hd();kn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new mr,this.planning=new us,this.shipping=new ar,this.analytics=new tr,this.performanceCmds=new rr,this.maintenance=new sr,this.analysis=new ms,this.setupCmds=new or,this.updateCmds=new lr,this.velocityCmds=new ur,this.contextCmds=new gs,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async 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 seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},MV=new kn});var vo,gr,yd=y(()=>{"use strict";vo={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}},gr=[{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,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,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,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},{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,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},{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},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!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},{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},{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},{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,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,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,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,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!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,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{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,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{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,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},{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},{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},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!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},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!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},{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},{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},{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,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{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},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{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:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--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 Kh={};fe(Kh,{UninstallCommands:()=>xo,uninstall:()=>qh});import{execSync as Ra}from"node:child_process";import St from"node:fs/promises";import IT from"node:os";import Sn from"node:path";import AT from"node:readline";import ve from"chalk";async function wd(r){let e=0;try{let t=await St.readdir(r,{withFileTypes:!0});for(let n of t){let s=Sn.join(r,n.name);if(n.isDirectory())e+=await wd(s);else try{let o=await St.stat(s);e+=o.size}catch{}}}catch{}return e}function Vh(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 jT(r){try{return(await St.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function DT(){let r={homebrew:!1,npm:!1};try{Ra("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{Ra("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function RT(){let r=[],e=Em(),t=E.getGlobalBasePath(),n=await T(t),s=n?await jT(Sn.join(t,"projects")):0,o=n?await wd(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=Sn.join(e.claude.config,"CLAUDE.md"),a=await T(i),c=!1;if(a)try{let K=await St.readFile(i,"utf-8");c=K.includes($a)&&K.includes(Po)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await T(u),m=d?await wd(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await T(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=Sn.join(e.claude.config,"prjct-statusline.sh"),k=await T(f);r.push({path:f,type:"file",description:"Status line script",exists:k});let S=e.gemini.router,x=await T(S);r.push({path:S,type:"file",description:"Gemini router",exists:x});let P=Sn.join(e.gemini.config,"GEMINI.md"),O=await T(P),F=!1;if(O)try{let K=await St.readFile(P,"utf-8");F=K.includes($a)&&K.includes(Po)}catch{}return O&&F&&r.push({path:P,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function $T(r){try{let e=await St.readFile(r,"utf-8");if(!e.includes($a)||!e.includes(Po))return!1;let t=e.indexOf($a),n=e.indexOf(Po)+Po.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1432
|
-
|
|
1433
|
-
`).trim(),!s||s.trim().length===0?await
|
|
1434
|
-
`,"utf-8"),!0}catch{return!1}}async function
|
|
1435
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(
|
|
1436
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
1437
|
-
${a.length} errors:`));for(let c of a)console.log(
|
|
1438
|
-
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await
|
|
1143
|
+
${De.dim("Patterns:")}`);for(let m of a.underEstimated)console.log(` ${De.yellow("\u26A0")} ${m.category} tasks underestimated by avg ${De.bold(`${m.avgVariance}%`)}`);for(let m of a.overEstimated)console.log(` ${De.green("\u2713")} ${m.category} tasks estimated within ${De.bold(`${m.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let m=eg(d,a.averageVelocity,o),p=m.estimatedDate?new Date(m.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1144
|
+
${De.dim("Projection:")}`),console.log(` Backlog: ${De.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${m.sprints} sprints (${m.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${De.bold(p)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async loadVelocityConfig(e){try{let n=await R.readConfig(e);if(n?.velocity&&typeof n.velocity=="object")return{...kn,...n.velocity}}catch{}return kn}}});var _P,NP,mh,da,ph,gh,fh=y(()=>{"use strict";Xn();_P=[1,2,3,5,8,13,21],NP={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}},mh=l(r=>_P.includes(r),"isValidPoint"),da=l(r=>NP[r],"pointsToMinutes"),ph=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"),gh=l(r=>{let e=da(r);return`${ph(e.min)}\u2013${ph(e.max)}`},"pointsToTimeRange")});function Vu(){et.clear(),Jt.clear(),Qs.clear(),Zs.clear()}function Ju(){return{issues:et.stats(),assignedIssues:Jt.stats(),teams:Qs.stats(),projects:Zs.stats()}}var pa,et,Jt,Qs,Zs,qu=y(()=>{"use strict";Jo();pa=300*1e3,et=new Ft({ttl:pa,maxSize:100}),Jt=new Ft({ttl:pa,maxSize:10}),Qs=new Ft({ttl:pa,maxSize:5}),Zs=new Ft({ttl:pa,maxSize:5});l(Vu,"clearLinearCache");l(Ju,"getLinearCacheStats")});import{exec as LP}from"node:child_process";import{promisify as HP}from"node:util";async function ma(r){if(process.platform!=="darwin")return hh(r);try{let{stdout:e}=await UP(`security find-generic-password -s "${GP}" -a "${r}" -w 2>/dev/null`);return e.trim()||null}catch{return hh(r)}}function hh(r){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[r];return process.env[t]||null}var UP,GP,Ku=y(()=>{"use strict";_();UP=HP(LP),GP="prjct-cli";l(ma,"getCredential");l(hh,"getEnvFallback")});var zP,WP,yh,ga,yt,Yu=y(()=>{"use strict";_();Ku();zP={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},WP={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},yh={none:0,urgent:1,high:2,medium:3,low:4},ga=class{static{l(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ma("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:n}=await import("@linear/sdk");this.sdk=new n({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${w(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,n={};e?.includeCompleted||(n.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(n.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(n).length>0?n:void 0});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(o=>this.mapIssue(o)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let n=e.match(/^([A-Z]+)-(\d+)$/);if(!n)return null;let[,s,o]=n,i=parseInt(o,10),c=(await this.sdk.teams({first:50})).nodes.find(d=>d.key===s);if(!c)return null;let u=await c.issues({first:1,filter:{number:{eq:i}}});return u.nodes.length>0?this.mapIssue(u.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?yh[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=yh[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&n.team&&(s.labelIds=await this.resolveLabelIds(n.team.id,t.labels)),await this.sdk.updateIssue(n.id,s);let o=await this.fetchIssue(n.id);if(!o)throw new Error("Failed to fetch updated issue");return o}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="started");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let i=(await s.states()).nodes.find(a=>a.type==="completed");i&&await this.sdk.updateIssue(t.id,{stateId:i.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let n=await this.fetchIssue(e);if(!n)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:n.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,n=await e.assignee,s=await e.team,o=await e.project,i=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:zP[t?.type||"backlog"]||"backlog",priority:WP[e.priority]||"none",type:this.inferType(e.title,i.nodes.map(a=>a.name)),assignee:n?{id:n.id,name:n.name,email:n.email}:void 0,labels:i.nodes.map(a=>a.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:o?{id:o.id,name:o.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let n=e.toLowerCase(),s=t.map(o=>o.toLowerCase());return s.includes("bug")||n.includes("fix")||n.includes("bug")?"bug":s.includes("feature")||n.includes("add")||n.includes("implement")?"feature":s.includes("improvement")||n.includes("improve")||n.includes("enhance")?"improvement":s.includes("chore")||n.includes("chore")||n.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(o=>t.includes(o.name)).map(o=>o.id):[]}},yt=new ga});var fa,Rt,Xu=y(()=>{"use strict";qu();Yu();fa=class{static{l(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&yt.isConfigured()}async initialize(e){this.initialized||(await yt.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let n={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(n)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,n=Jt.get(t);if(n)return n;let s=await yt.fetchAssignedIssues(e);Jt.set(t,s);for(let o of s)et.set(`issue:${o.id}`,o),et.set(`issue:${o.externalId}`,o);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let n=`team:${e}`,s=Jt.get(n);if(s)return s;let o=await yt.fetchTeamIssues(e,t);Jt.set(n,o);for(let i of o)et.set(`issue:${i.id}`,i),et.set(`issue:${i.externalId}`,i);return o}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,n=et.get(t);if(n)return n;let s=await yt.fetchIssue(e);return s&&(et.set(`issue:${s.id}`,s),et.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await yt.createIssue(e);return et.set(`issue:${t.id}`,t),et.set(`issue:${t.externalId}`,t),Jt.clear(),t}async updateIssue(e,t){this.ensureInitialized();let n=await yt.updateIssue(e,t);return et.set(`issue:${n.id}`,n),et.set(`issue:${n.externalId}`,n),n}async markInProgress(e){this.ensureInitialized(),await yt.markInProgress(e),et.delete(`issue:${e}`),Jt.clear()}async markDone(e){this.ensureInitialized(),await yt.markDone(e),et.delete(`issue:${e}`),Jt.clear()}async addComment(e,t){this.ensureInitialized(),await yt.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=Qs.get("teams");if(e)return e;let t=await yt.getTeams();return Qs.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=Zs.get("projects");if(e)return e;let t=await yt.getProjects();return Zs.set("projects",t),t}clearCache(){Vu()}getCacheStats(){return Ju()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},Rt=new fa});var wh,ha,BP,Sh=y(()=>{"use strict";Za();he();_();Xu();wh=1800*1e3,ha=class{static{l(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),n=[];try{let s=await Rt.fetchAssignedIssues({limit:100}),o={};for(let a of s)try{o[a.externalId]=this.toCachedIssue(a,t)}catch(c){n.push({issueId:a.externalId||a.id,error:w(c)})}let i={provider:"linear",lastSync:t,staleAfter:wh,issues:o};return $.setDoc(e,"issues",i),{provider:"linear",fetched:s.length,updated:Object.keys(o).length,errors:n,timestamp:t}}catch(s){return n.push({issueId:"all",error:w(s)}),{provider:"linear",fetched:0,updated:0,errors:n,timestamp:t}}}async getIssue(e,t){let n=this.loadIssues(e);if(n?.issues[t]){let s=n.issues[t],o=new Date(s.fetchedAt).getTime(),i=Date.now(),a=600*1e3;if(i-o<a)return s}try{let s=await Rt.fetchIssue(t);if(!s)return null;let o=new Date().toISOString(),i=this.toCachedIssue(s,o);return this.updateIssueInCache(e,t,i),i}catch{return n?.issues[t]?n.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,n){n==="in_progress"?await Rt.markInProgress(t):n==="done"&&await Rt.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let o=n==="done"?"done":"in_progress";s.issues[t].status=o,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let n=new Date(t.lastSync).getTime(),s=Date.now(),o=t.staleAfter||wh;return s-n>o}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}loadIssues(e){try{return $.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){$.setDoc(e,"issues",t)}updateIssueInCache(e,t,n){let s=this.loadIssues(e);s||(s=Jd("linear")),s.issues[t]=n,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},BP=new ha});var kh=y(()=>{"use strict";qu();Yu();Xu();Sh()});import VP from"node:fs/promises";import JP from"node:os";import qP from"node:path";function KP(r){return qP.join(JP.homedir(),".prjct-cli","projects",r,"config","credentials.json")}async function ya(r){let e=KP(r);if(!await P(e))return{};try{return JSON.parse(await VP.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",w(t)),{}}}async function Qu(r){let e=await ya(r);return e.linear?.apiKey?e.linear.apiKey:ma("linear-api-key")}var bh=y(()=>{"use strict";_();xe();Ku();l(KP,"getCredentialsPath");l(ya,"getProjectCredentials");l(Qu,"getLinearApiKey")});function Ch(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`}function YP(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let n=Math.floor(t/60),s=t%60;return s>0?`${e}${n}h ${s}m`:`${e}${n}h`}return`${e}${t}m`}var er,Zu=y(()=>{"use strict";Wl();Hl();fh();kh();Ot();Ut();_();_s();Ns();bh();Gu();Xn();rt();er=class extends ke{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return n.md?console.log("> No project ID found. Run `prjct init` first."):h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await $n(o,"before","task",{projectPath:t,skipHooks:n.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=await Bi.execute("task",{task:e},t);if(!a.success)return n.md||h.fail(a.error||"Failed to execute task"),{success:!1,error:a.error};let c,u=e;if(/^[A-Z]+-\d+$/.test(e))try{let f=await ya(o),S=await Qu(o);if(S&&f.linear?.teamId){await Rt.initializeFromApiKey(S,f.linear.teamId);let b=await Rt.fetchIssue(e);b&&(c=e,u=`${e}: ${b.title}`,await Rt.markInProgress(e))}}catch{}await L.startTask(o,{id:Se(),description:u,sessionId:Se(),linearId:c});let m=await Ll.getAvailableAgents(t),p=m.length>0?m.join(", "):"none (run p. sync)",g=a.orchestratorContext?.agents?.length||m.length;if(n.md){let f=a.subtasks||[],S=ol({description:u,branch:a.branch,linearId:c,type:a.type}),b=f.length>0?il(f,0):"",D=Pm(["All commits must include footer: `Generated with [p/](https://www.prjct.app/)`","Never commit directly to main/master"]),x=Qe([{label:"Find relevant files",command:`prjct context files "${e}"`},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(S,b,D,x))}else h.done(`${e}`,{agents:g>0?g:void 0}),Vr("working"),bt("task");return await this.logToMemory(t,"task_started",{task:e,agenticMode:!0,availableAgents:m,orchestratorContext:a.orchestratorContext,timestamp:B.getTimestamp()}),await $n(o,"after","task",{projectPath:t,skipHooks:n.skipHooks}),{...a,success:!0,task:e,agenticMode:!0,availableAgents:m,fibonacci:{isValidPoint:mh,pointsToMinutes:da,pointsToTimeRange:gh,storeEstimate:l(async f=>{let S=da(f);return await L.updateCurrentTask(o,{estimatedPoints:f,estimatedMinutes:S.typical}),S},"storeEstimate")}}}else{let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Tn("No active task")):h.warn("no active task"),{success:!0,message:"No active task"};if(n.md){let a=i.startedAt?B.calculateDuration(new Date(i.startedAt)):void 0,c=ol({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?il(u,d):"",p=Qe([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(Ie(c,m,p))}else h.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(s){return n.md?console.log(`> Error: ${w(s)}`):h.fail(w(s)),{success:!1,error:w(s)}}}async done(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await L.getCurrentTask(s);if(!o)return h.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await $n(s,"before","done",{projectPath:e,skipHooks:t.skipHooks});if(!i.success)return{success:!1,error:`Hook failed: ${i.failed}`};let a=o.description,c="",u=0;if(o.startedAt){let f=new Date(o.startedAt);c=B.calculateDuration(f),u=Math.round((Date.now()-f.getTime())/6e4)}let d=o.estimatedMinutes,m=o.estimatedPoints;try{await gt.record(s,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:B.getTimestamp(),estimatedDuration:d?Ch(d):"0m",actualDuration:c||"0m",variance:d?YP(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[o.linearId].filter(Boolean)})}catch{}let p="";if(m&&d){let f=u-d,S=d>0?Math.round((u-d)/d*100):0,b=f>=0?"+":"";p=` | est: ${m}pt (${Ch(d)}) \u2192 ${b}${S}%`}await L.completeTask(s,t.feedback);let g=o.linearId;if(g)try{let f=await ya(s),S=await Qu(s);S&&f.linear?.teamId&&(await Rt.initializeFromApiKey(S,f.linear.teamId),await Rt.markDone(g))}catch{}if(t.md){let f=c?` (${c})`:"";console.log(Ie(en("Subtask Complete",`**Completed:** ${a}${f}`),zt({Duration:c||"unknown",...p?{Variance:p.replace(" | ","")}:{}}),Qe([{label:"Complete next subtask",command:"p. done"},{label:"Ship when ready",command:"p. ship"}])))}else{let f=c?` (${c}${p})`:"";g?h.done(`${a}${f} \u2192 Linear \u2713`):h.done(`${a}${f}`),Vr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:d,actualMinutes:u,timestamp:B.getTimestamp()}),await $n(s,"after","done",{projectPath:e,skipHooks:t.skipHooks}),{success:!0,task:a,duration:c}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async next(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await R.getProjectId(e);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await Pe.getActiveTasks(s);if(o.length===0)return t.md?console.log(Tn("Queue is empty")):h.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description}${c}${u}`});console.log(Ie(st("Queue",`${o.length} task${o.length!==1?"s":""}`),Gt(i,!0),Qe([{label:"Start working",command:`p. task "${o[0].description}"`}])))}else h.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}async pause(e="",t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(!i)return n.md?console.log(Tn("No active task to pause")):h.warn("no active task to pause"),{success:!1,message:"No active task to pause"};let a="";if(i.startedAt&&(a=B.calculateDuration(new Date(i.startedAt))),await L.pauseTask(o,e),n.md)console.log(Ie(en("Task Paused",`**Paused:** ${i.description}`),zt({Reason:e||void 0,"Duration worked":a||void 0}),Qe([{label:"Resume this task",command:"p. resume"},{label:"Start something new",command:"p. task"}])));else{let c=i.description.slice(0,40);h.done(`paused: ${c}${e?` (${e})`:""}`),Vr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:B.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async resume(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await R.getProjectId(t);if(!o)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await L.getCurrentTask(o);if(i)return n.md?console.log(Tn(`Already working on: ${i.description}`)):h.warn("already working on a task"),{success:!1,message:`Already working on: ${i.description}`};let a=await L.resumeTask(o);return a?(n.md?console.log(Ie(en("Task Resumed",`**Resumed:** ${a.description}`),Qe([{label:"Continue working, then finish",command:"p. done"}]))):(h.done(`resumed: ${a.description.slice(0,40)}`),Vr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:B.getTimestamp()}),{success:!0,task:a.description}):(n.md?console.log(Tn("No paused task found")):h.warn("no paused task to resume"),{success:!1,message:"No paused task found"})}catch(s){return h.fail(w(s)),{success:!1,error:w(s)}}}async workflow(e=null,t=process.cwd()){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let s=await R.getProjectId(t);if(!s)return h.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){let o=await Uu(s);return console.log(uh(o)),{success:!0,preferences:o}}return{success:!0,projectId:s,input:e,setWorkflowPreference:l(async o=>{await ch(s,{...o,createdAt:B.getTimestamp()})},"setWorkflowPreference"),removeWorkflowPreference:l(async(o,i)=>{await lh(s,o,i)},"removeWorkflowPreference"),listWorkflowPreferences:l(async()=>Uu(s),"listWorkflowPreferences")}}catch(n){return h.fail(w(n)),{success:!1,error:w(n)}}}};l(Ch,"formatMinutesToDuration");l(YP,"formatVariance")});var gn,TB,vh=y(()=>{"use strict";qi();Pu();Tu();Fu();_u();Ji();Lu();zu();Wu();Bu();Zu();gn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new er,this.planning=new rs,this.shipping=new qs,this.analytics=new Gs,this.performanceCmds=new Bs,this.maintenance=new Ws,this.analysis=new cs,this.setupCmds=new Vs,this.updateCmds=new Ys,this.velocityCmds=new Xs,this.contextCmds=new ls,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),n={}){return this.workflow.now(e,t,n)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),n={}){return this.workflow.pause(e,t,n)}async resume(e=null,t=process.cwd(),n={}){return this.workflow.resume(e,t,n)}async workflowPrefs(e=null,t=process.cwd()){return this.workflow.workflow(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),n={}){return this.planning.bug(e,t,n)}async idea(e,t=process.cwd(),n={}){return this.planning.idea(e,t,n)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),n={}){return this.shipping.ship(e,t,{...n})}async dash(e="default",t=process.cwd(),n={}){return this.analytics.dash(e,t,n)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async design(e=null,t={},n=process.cwd()){return this.maintenance.design(e,t,n)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async 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 seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async context(e=null,t=process.cwd()){return this.contextCmds.context(e,t)}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,n){return this.workflow.logToMemory(e,t,n)}},TB=new gn});var po,tr,ed=y(()=>{"use strict";po={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}},tr=[{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,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,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,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},{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,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},{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},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!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},{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},{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},{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,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,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,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,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!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,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{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,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{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,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},{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},{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},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!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},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!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},{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},{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},{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,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{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},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!0,requiresProject:!1},{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:"Migrate all projects from JSON to SQLite",usage:{claude:null,terminal:"prjct update [--all] [--dry-run]"},params:"[--all] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Migrates JSON storage files to SQLite","Sweeps leftover JSON files","--all flag processes all projects on machine","--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 Eh={};ge(Eh,{UninstallCommands:()=>go,uninstall:()=>Th});import{execSync as wa}from"node:child_process";import wt from"node:fs/promises";import XP from"node:os";import fn from"node:path";import QP from"node:readline";import be from"chalk";async function td(r){let e=0;try{let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=fn.join(r,n.name);if(n.isDirectory())e+=await td(s);else try{let o=await wt.stat(s);e+=o.size}catch{}}}catch{}return e}function xh(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 ZP(r){try{return(await wt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function eT(){let r={homebrew:!1,npm:!1};try{wa("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{wa("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function tT(){let r=[],e=Yp(),t=A.getGlobalBasePath(),n=await P(t),s=n?await ZP(fn.join(t,"projects")):0,o=n?await td(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=fn.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let K=await wt.readFile(i,"utf-8");c=K.includes(Sa)&&K.includes(mo)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.commands,d=await P(u),m=d?await td(u):0;r.push({path:u,type:"directory",description:"Claude commands",size:m,exists:d});let p=e.claude.router,g=await P(p);r.push({path:p,type:"file",description:"Claude router",exists:g});let f=fn.join(e.claude.config,"prjct-statusline.sh"),S=await P(f);r.push({path:f,type:"file",description:"Status line script",exists:S});let b=e.gemini.router,D=await P(b);r.push({path:b,type:"file",description:"Gemini router",exists:D});let x=fn.join(e.gemini.config,"GEMINI.md"),O=await P(x),F=!1;if(O)try{let K=await wt.readFile(x,"utf-8");F=K.includes(Sa)&&K.includes(mo)}catch{}return O&&F&&r.push({path:x,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function nT(r){try{let e=await wt.readFile(r,"utf-8");if(!e.includes(Sa)||!e.includes(mo))return!1;let t=e.indexOf(Sa),n=e.indexOf(mo)+mo.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
|
|
1145
|
+
|
|
1146
|
+
`).trim(),!s||s.trim().length===0?await wt.unlink(r):await wt.writeFile(r,`${s}
|
|
1147
|
+
`,"utf-8"),!0}catch{return!1}}async function sT(){let r=XP.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=fn.join(r,`.prjct-backup-${e}`);try{await wt.mkdir(t,{recursive:!0});let n=A.getGlobalBasePath();return await P(n)&&await Ph(n,fn.join(t,".prjct-cli")),t}catch{return null}}async function Ph(r,e){await wt.mkdir(e,{recursive:!0});let t=await wt.readdir(r,{withFileTypes:!0});for(let n of t){let s=fn.join(r,n.name),o=fn.join(e,n.name);n.isDirectory()?await Ph(s,o):await wt.copyFile(s,o)}}async function rT(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await nT(o.path)&&n.push(o.path):o.type==="directory"?(await wt.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await wt.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||wa(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||wa("npm uninstall -g prjct-cli",{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:n,errors:s}}async function oT(r){let e=QP.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}async function Th(r={},e=process.cwd()){let t=await tT(),n=eT(),s=t.filter(c=>c.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log(be.yellow(`
|
|
1148
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(be.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(be.white("The following will be permanently deleted:")),console.log("");for(let c of s){let u=A.getDisplayPath(c.path),d="";c.type==="section"?d=be.dim("(section only)"):c.size&&(d=be.dim(`(${xh(c.size)})`)),console.log(` ${be.cyan(u.padEnd(35))} ${d}`),console.log(` ${be.dim(c.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${be.cyan("Homebrew".padEnd(35))} ${be.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${be.cyan("npm global".padEnd(35))} ${be.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(be.dim(` Total size: ${xh(o)}`)),console.log("")),r.dryRun)return console.log(be.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log(be.blue("Creating backup..."));let c=await sT();c?(console.log(be.green(`Backup created: ${A.getDisplayPath(c)}`)),console.log("")):console.log(be.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log(be.yellow('Type "uninstall" to confirm:')),!await oT("> ")))return console.log(be.yellow(`
|
|
1149
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(be.blue("Removing prjct..."));let{deleted:i,errors:a}=await rT(t,n,r);if(console.log(""),i.length>0&&console.log(be.green(`Removed ${i.length} items`)),a.length>0){console.log(be.yellow(`
|
|
1150
|
+
${a.length} errors:`));for(let c of a)console.log(be.red(` - ${c}`))}return console.log(""),console.log(be.green("prjct has been uninstalled.")),console.log(be.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var Sa,mo,go,nd=y(()=>{"use strict";xn();Ce();_();xe();rt();Sa="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",mo="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";l(td,"getDirectorySize");l(xh,"formatSize");l(ZP,"countDirectoryItems");l(eT,"detectInstallation");l(tT,"gatherUninstallItems");l(nT,"removePrjctSection");l(sT,"createBackup");l(Ph,"copyDirectory");l(rT,"performUninstall");l(oT,"promptConfirmation");l(Th,"uninstall");go=class extends ke{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Th(e,t)}}});function pT(){for(let[r,e]of Object.entries(po))G.registerCategory(r,e)}function jh(){if(G.has("work"))return;pT();let r=l(e=>tr.find(t=>t.name===e),"getMeta");G.registerMethod("task",nr,"now",r("task")),G.registerMethod("done",nr,"done",r("done")),G.registerMethod("next",nr,"next",r("next")),G.registerMethod("pause",nr,"pause",r("pause")),G.registerMethod("resume",nr,"resume",r("resume")),G.registerMethod("workflow",nr,"workflow",r("workflow")),G.registerMethod("init",ka,"init",r("init")),G.registerMethod("bug",ka,"bug",r("bug")),G.registerMethod("idea",ka,"idea",r("idea")),G.registerMethod("spec",ka,"spec",r("spec")),G.registerMethod("ship",iT,"ship",r("ship")),G.registerMethod("dash",Ih,"dash",r("dash")),G.registerMethod("help",Ih,"help",r("help")),G.registerMethod("perf",aT,"perf",r("perf")),G.registerMethod("velocity",lT,"velocity",r("velocity")),G.registerMethod("cleanup",sr,"cleanup",r("cleanup")),G.registerMethod("design",sr,"design",r("design")),G.registerMethod("recover",sr,"recover",r("recover")),G.registerMethod("undo",sr,"undo",r("undo")),G.registerMethod("redo",sr,"redo",r("redo")),G.registerMethod("history",sr,"history",r("history")),G.registerMethod("analyze",rr,"analyze",r("analyze")),G.registerMethod("sync",rr,"sync",r("sync")),G.registerMethod("stats",rr,"stats",r("stats")),G.registerMethod("status",rr,"status",r("status")),G.registerMethod("seal",rr,"seal",r("seal")),G.registerMethod("verify",rr,"verify",r("verify")),G.registerMethod("start",Ah,"start",r("start")),G.registerMethod("setup",Ah,"setup",r("setup")),G.registerMethod("uninstall",uT,"uninstall",r("uninstall")),G.registerMethod("update",dT,"update",r("update")),G.registerMethod("context",cT,"context",r("context"))}var nr,ka,iT,Ih,aT,sr,rr,Ah,cT,lT,uT,dT,ba=y(()=>{"use strict";qi();Pu();ed();Tu();Fu();_u();Ji();Us();Lu();zu();nd();Wu();Bu();Zu();nr=new er,ka=new rs,iT=new qs,Ih=new Gs,aT=new Bs,sr=new Ws,rr=new cs,Ah=new Vs,cT=new ls,lT=new Xs,uT=new go,dT=new Ys;l(pT,"registerCategories");l(jh,"registerAllCommands");jh()});var sd=y(()=>{"use strict";ac();vh();ba();Us()});var Rh={};ge(Rh,{shutdown:()=>ir,startDaemon:()=>gT});import $t from"node:fs";import{createServer as mT}from"node:net";async function gT(r){let e=Ue.socket(),t=Ue.pid(),n=Ue.runDir();if($t.mkdirSync(n,{recursive:!0}),$t.existsSync(t)){let s=parseInt($t.readFileSync(t,"utf-8").trim(),10);ST(s)&&(console.error(`Daemon already running (PID ${s})`),process.exit(1)),$t.unlinkSync(t)}if($t.existsSync(e)&&$t.unlinkSync(e),We={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Ea,idleTimer:null},Le=new gn,or=mT(s=>fT(s)),or.listen(e,()=>{$t.chmodSync(e,384),$t.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),Dh()}),or.on("error",s=>{console.error("Daemon socket error:",s.message),ir(1)}),!r.noHttp)try{let s=process.cwd(),o=await R.getProjectId(s);if(o){let i=r.port||Yo;fo=Ko({port:i,projectId:o,projectPath:s,enableLogging:!1}),await fo.start()}}catch{}if(process.on("SIGTERM",()=>ir(0)),process.on("SIGINT",()=>ir(0)),process.on("SIGHUP",()=>{Le=new gn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function fT(r){let e="";r.on("data",async t=>{e+=t.toString();let n;for(;(n=e.indexOf(`
|
|
1151
|
+
`))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await hT(o);r.write(ds(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ds(i))}}}),r.on("error",()=>{})}async function hT(r){if(!We||!Le)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Dh(),We.commandsServed++,We.lastActivity=Date.now(),r.command==="daemon")return wT(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await yT(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1439
1152
|
`)||o.message||void 0,stderr:t.join(`
|
|
1440
|
-
`)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function
|
|
1153
|
+
`)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function yT(r){let e=r.args.join(" ")||null,t=r.options,n=t.md===!0;switch(r.command){case"sync":return Le.sync(r.cwd,{aiTools:t.agents?String(t.agents).split(","):void 0,preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:n,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return Le.status(r.cwd,{json:t.json===!0,md:n});case"stats":return Le.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"seal":return Le.seal(r.cwd,{json:t.json===!0});case"verify":return Le.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return Le.task(e,r.cwd,{md:n});case"done":return Le.done(r.cwd,{md:n});case"next":return Le.next(r.cwd,{md:n});case"pause":return Le.pause(e||"",r.cwd,{md:n});case"resume":return Le.resume(e,r.cwd,{md:n});case"bug":return Le.bug(e||"",r.cwd,{md:n});case"idea":return Le.idea(e||"",r.cwd,{md:n});case"ship":return Le.ship(e,r.cwd,{md:n});case"dash":return Le.dash(e||"default",r.cwd,{md:n});case"design":return Le.design(e||"",t);case"analyze":return Le.analyze(t);case"cleanup":return Le.cleanup(t);default:return G.execute(r.command,e,r.cwd)}}function wT(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Ue.socket(),uptime:We?Date.now()-We.startedAt:0,commandsServed:We?.commandsServed??0,lastActivity:We?new Date(We.lastActivity).toISOString():null,registeredCommands:G.list().length}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>ir(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}function Dh(){We&&(We.idleTimer&&clearTimeout(We.idleTimer),We.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${We.idleTimeoutMs/1e3/60} minutes, shutting down`),ir(0)},We.idleTimeoutMs),We.idleTimer.unref&&We.idleTimer.unref())}function ir(r){console.log("Daemon shutting down..."),We?.idleTimer&&clearTimeout(We.idleTimer),fo&&(fo.stop(),fo=null),or&&(or.close(),or=null);let e=Ue.socket(),t=Ue.pid();try{$t.existsSync(e)&&$t.unlinkSync(e)}catch{}try{$t.existsSync(t)&&$t.unlinkSync(t)}catch{}process.exit(r)}function ST(r){try{return process.kill(r,0),!0}catch{return!1}}var or,fo,Le,We,$h=y(()=>{"use strict";sd();Us();ba();Ve();wc();ho();or=null,fo=null,Le=null,We=null;l(gT,"startDaemon");l(fT,"handleConnection");l(hT,"handleRequest");l(yT,"executeCommand");l(wT,"handleDaemonCommand");l(Dh,"resetIdleTimer");l(ir,"shutdown");l(ST,"isProcessRunning")});var Oh={};ge(Oh,{runStart:()=>IT});import qt from"node:fs/promises";import rd from"node:os";import hn from"node:path";import W from"chalk";function CT(){console.clear(),console.log(kT),console.log(bT)}function Mh(r,e){console.log(`
|
|
1441
1154
|
${W.bold(" Select AI providers to configure:")}
|
|
1442
1155
|
`),console.log(` ${W.dim("(Use arrow keys to navigate, space to toggle, enter to confirm)")}
|
|
1443
|
-
`),r.forEach((t,n)=>{let s=n===e?W.cyan("\u276F"):" ",o=t.selected?W.green("[\u2713]"):W.dim("[ ]"),i=t.installed?W.green("(installed)"):W.yellow("(will install)"),a=n===e?W.bold(t.displayName):t.displayName;console.log(` ${s} ${o} ${a} ${i}`)}),console.log("")}async function
|
|
1156
|
+
`),r.forEach((t,n)=>{let s=n===e?W.cyan("\u276F"):" ",o=t.selected?W.green("[\u2713]"):W.dim("[ ]"),i=t.installed?W.green("(installed)"):W.yellow("(will install)"),a=n===e?W.bold(t.displayName):t.displayName;console.log(` ${s} ${o} ${a} ${i}`)}),console.log("")}async function vT(){let r=await an(),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}];return e.some(t=>t.selected)||(e[0].selected=!0),process.stdin.isTTY?new Promise(t=>{let n=0,s=l(()=>{process.stdout.write("\x1B[8A"),process.stdout.write("\x1B[0J"),Mh(e,n)},"render");Mh(e,n),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(`
|
|
1444
1157
|
Cancelled.
|
|
1445
1158
|
`),process.exit(0)),a==="\r"||a===`
|
|
1446
1159
|
`){o();let c=e.filter(u=>u.selected).map(u=>u.name);t(c.length>0?c:["claude"]);return}a==="\x1B[A"&&(n=Math.max(0,n-1),s()),a==="\x1B[B"&&(n=Math.min(e.length-1,n+1),s()),a===" "&&(e[n].selected=!e[n].selected,s())},"handleKey");process.stdin.on("data",i)}):(console.log(`
|
|
1447
1160
|
${W.bold(" Detected providers:")}
|
|
1448
|
-
`),e.forEach(t=>{t.installed&&console.log(` ${W.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function
|
|
1161
|
+
`),e.forEach(t=>{t.installed&&console.log(` ${W.green("\u2713")} ${t.displayName}`)}),console.log(""),e.filter(t=>t.selected).map(t=>t.name))}async function xT(r){let e=Fe[r];if(!e.configDir)return!1;try{let t=hn.join(e.configDir,"commands");await qt.mkdir(t,{recursive:!0});let{getPackageRoot:n}=await Promise.resolve().then(()=>(dt(),Ao)),s=n(),o=r==="claude"?"p.md":"p.toml",i=hn.join(s,"templates","commands",o),a=hn.join(t,o);return await P(i)?(await qt.copyFile(i,a),!0):!1}catch(t){return console.error(` ${W.yellow("\u26A0")} Failed to install ${r} router: ${w(t)}`),!1}}async function PT(r){let e=Fe[r];if(!e.configDir)return!1;try{await qt.mkdir(e.configDir,{recursive:!0});let{getPackageRoot:t}=await Promise.resolve().then(()=>(dt(),Ao)),n=t(),s=r==="claude"?"CLAUDE.md":"GEMINI.md",o=hn.join(n,"templates","global",s),i=hn.join(e.configDir,s);if(await P(o)){let a=await qt.readFile(o,"utf-8");if(await P(i)){let c=await qt.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 qt.writeFile(i,m+g+p)}else await qt.writeFile(i,`${c}
|
|
1449
1162
|
|
|
1450
|
-
${a}`)}else await
|
|
1163
|
+
${a}`)}else await qt.writeFile(i,a);return!0}return!1}catch(t){return console.error(` ${W.yellow("\u26A0")} Failed to install ${r} config: ${w(t)}`),!1}}async function TT(r){let e=hn.join(rd.homedir(),".prjct-cli","config");await qt.mkdir(e,{recursive:!0});let t=hn.join(e,"installed-editors.json"),n={version:fe,providers:r,editor:r[0],provider:r[0],lastInstall:new Date().toISOString(),path:hn.join(rd.homedir(),`.${r[0]}`,"commands")};await qt.writeFile(t,JSON.stringify(n,null,2))}function ET(r){console.log(`
|
|
1451
1164
|
${W.green.bold(" \u2713 Setup complete!")}
|
|
1452
|
-
`),console.log(` ${W.dim("Configured providers:")}`),r.forEach(e=>{let t=
|
|
1165
|
+
`),console.log(` ${W.dim("Configured providers:")}`),r.forEach(e=>{let t=Fe[e];console.log(` ${W.green("\u2713")} ${t.displayName}`)}),console.log(`
|
|
1453
1166
|
${W.bold("Next steps:")}
|
|
1454
1167
|
|
|
1455
1168
|
${W.cyan("1.")} Navigate to your project directory
|
|
@@ -1462,31 +1175,31 @@ ${W.green.bold(" \u2713 Setup complete!")}
|
|
|
1462
1175
|
${W.dim("\u2022")} Use ${W.bold("p. ship")} to create PRs
|
|
1463
1176
|
|
|
1464
1177
|
${W.dim("Learn more: https://prjct.app/docs")}
|
|
1465
|
-
`)}async function
|
|
1466
|
-
`),!process.argv.includes("--force")))return;let e=await
|
|
1178
|
+
`)}async function IT(){CT();let r=hn.join(rd.homedir(),".prjct-cli","config","installed-editors.json");if(await P(r)&&JSON.parse(await qt.readFile(r,"utf-8")).version===fe&&(console.log(` ${W.yellow("\u2139")} Already configured for v${fe}`),console.log(` ${W.dim("Run with --force to reconfigure")}
|
|
1179
|
+
`),!process.argv.includes("--force")))return;let e=await vT();console.log(`
|
|
1467
1180
|
${W.cyan("Setting up...")}
|
|
1468
|
-
`);for(let t of e){let n=
|
|
1181
|
+
`);for(let t of e){let n=Fe[t];process.stdout.write(` ${W.dim("\u2022")} ${n.displayName}... `);let s=await xT(t),o=await PT(t);console.log(s&&o?W.green("\u2713"):s||o?W.yellow("partial"):W.yellow("skipped"))}await TT(e),ET(e)}var ar,cr,lr,ur,dr,kT,bT,Fh=y(()=>{"use strict";Be();_();xe();dt();ar=W.rgb(0,255,255),cr=W.rgb(80,180,255),lr=W.rgb(140,120,255),ur=W.rgb(200,80,220),dr=W.rgb(255,80,180),kT=`
|
|
1469
1182
|
|
|
1470
|
-
${
|
|
1471
|
-
${
|
|
1472
|
-
${
|
|
1473
|
-
${
|
|
1474
|
-
${
|
|
1475
|
-
${
|
|
1183
|
+
${ar(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 ")}${lr(" \u2588\u2588\u2557")}${ur(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${dr("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
|
|
1184
|
+
${ar(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${cr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${lr(" \u2588\u2588\u2551")}${ur("\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")}${dr("\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
|
|
1185
|
+
${ar(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${cr(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${lr(" \u2588\u2588\u2551")}${ur("\u2588\u2588\u2551 ")}${dr(" \u2588\u2588\u2551 ")}
|
|
1186
|
+
${ar(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D ")}${cr(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")}${lr("\u2588\u2588 \u2588\u2588\u2551")}${ur("\u2588\u2588\u2551 ")}${dr(" \u2588\u2588\u2551 ")}
|
|
1187
|
+
${ar(" \u2588\u2588\u2551 ")}${cr(" \u2588\u2588\u2551 \u2588\u2588\u2551")}${lr("\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D")}${ur("\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}${dr(" \u2588\u2588\u2551 ")}
|
|
1188
|
+
${ar(" \u255A\u2550\u255D ")}${cr(" \u255A\u2550\u255D \u255A\u2550\u255D")}${lr(" \u255A\u2550\u2550\u2550\u2550\u255D ")}${ur(" \u255A\u2550\u2550\u2550\u2550\u2550\u255D")}${dr(" \u255A\u2550\u255D ")}
|
|
1476
1189
|
|
|
1477
|
-
`,
|
|
1190
|
+
`,bT=` ${W.white("Context Layer for AI Agents")} ${W.dim(`v${fe}`)}
|
|
1478
1191
|
|
|
1479
1192
|
${W.dim(`Project context layer for AI coding agents.
|
|
1480
1193
|
Works with Claude Code, Gemini CLI, and more.`)}
|
|
1481
1194
|
${W.cyan("https://prjct.app")}
|
|
1482
|
-
`;l(
|
|
1483
|
-
`).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function
|
|
1195
|
+
`;l(CT,"showBanner");l(Mh,"showProviderSelection");l(vT,"selectProviders");l(xT,"installRouter");l(PT,"installGlobalConfig");l(TT,"saveSetupConfig");l(ET,"showCompletion");l(IT,"runStart")});import{exec as AT}from"node:child_process";import Lh from"node:fs/promises";import rn from"node:path";import{promisify as jT}from"node:util";async function pr(r,e=process.cwd(),t={}){let n=rn.isAbsolute(r)?r:rn.join(e,r),s;try{s=await Lh.readFile(n,"utf-8")}catch(g){if(v(g))return{file:r,imports:[],importedBy:[],metrics:{totalImports:0,externalImports:0,internalImports:0,importedByCount:0}};throw g}let o=rn.extname(r).toLowerCase(),i=OT[o]||"unknown",a=MT[i]||[],c=await FT(s,a,n,e),u=[];t.reverse&&(u=await NT(r,e));let d;t.depth&&t.depth>0&&(d=await Hh(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 FT(r,e,t,n){let s=[],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 _T(c,t,n)),s.push({source:c,resolved:m,isExternal:d,importedNames:u,isDefault:i.isDefault,isNamespace:i.isNamespace})}}return s}async function _T(r,e,t){let n=rn.dirname(e);if(r.startsWith("@/")){let o=rn.join(t,"src",r.slice(2));return Nh(o,t)}let s=rn.resolve(n,r);return Nh(s,t)}async function Nh(r,e){let t=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"];for(let n of t){let s=r+n;try{if((await Lh.stat(s)).isFile())return rn.relative(e,s)}catch{}}return null}async function NT(r,e){let t=[],n=rn.basename(r,rn.extname(r)),s=rn.dirname(r);try{let i=[`from ['"].*${n}['"]`,`from ['"]\\./${n}['"]`,`import\\(['"'].*${n}['"]`,`require\\(['"'].*${n}['"]`].join("|"),{stdout:a}=await DT(`grep -r -l -E '${i}' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx' . 2>/dev/null || true`,{cwd:e,maxBuffer:10*1024*1024}),c=a.trim().split(`
|
|
1196
|
+
`).filter(Boolean).map(u=>u.replace(/^\.\//,"")).filter(u=>u!==r);for(let u of c)t.push({file:u})}catch{}return t}async function Hh(r,e,t,n=0,s=new Set){let o={file:r,imports:[],depth:n};if(n>=t||s.has(r))return o;s.add(r);let i=await pr(r,e,{reverse:!1,depth:0});for(let a of i.imports)if(!a.isExternal&&a.resolved){let c=await Hh(a.resolved,e,t,n+1,s);o.imports.push(c)}return o}var DT,_h,RT,$T,MT,OT,od=y(()=>{"use strict";_();DT=jT(AT),_h=[{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}],RT=[{pattern:/from\s+([\w.]+)\s+import\s+([^;\n]+)/g,sourceIndex:1,namesIndex:2},{pattern:/^import\s+([\w.]+)(?:\s+as\s+\w+)?$/gm,sourceIndex:1}],$T=[{pattern:/import\s*"([^"]+)"/g,sourceIndex:1},{pattern:/import\s*\([^)]*"([^"]+)"[^)]*\)/g,sourceIndex:1}],MT={typescript:_h,javascript:_h,python:RT,go:$T},OT={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".go":"go"};l(pr,"analyzeImports");l(FT,"extractImports");l(_T,"resolveImport");l(Nh,"tryResolve");l(NT,"findImportedBy");l(Hh,"buildDependencyTree")});import Uh from"node:fs/promises";import on from"node:path";async function Ca(r,e=process.cwd()){let t=on.isAbsolute(r)?r:on.join(e,r),n;try{n=await Uh.readFile(t,"utf-8")}catch(p){if(v(p))return{file:r,purpose:"File not found",publicAPI:[],dependencies:[],metrics:Qn("")};throw p}let s=on.extname(r).toLowerCase(),o=Gh[s]||"unknown",i=await An(r,e),a=await pr(r,e),c=HT(n,o),u=i.signatures.filter(p=>p.exported).map(p=>({name:p.name,type:p.type,signature:p.signature,description:p.docstring?UT(p.docstring):void 0})),d=a.imports.filter(p=>!p.isExternal&&p.resolved).map(p=>p.resolved).slice(0,10),m=GT(c,u,d);return{file:r,purpose:c,publicAPI:u,dependencies:d,metrics:Zr(n,m)}}async function id(r,e=process.cwd(),t={}){let n=on.isAbsolute(r)?r:on.join(e,r),s=[];async function o(i){let a=await Uh.readdir(i,{withFileTypes:!0});for(let c of a){let u=on.join(i,c.name),d=on.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=on.extname(c.name).toLowerCase();if(Gh[m]){let p=await Ca(d,e);s.push(p)}}}}return l(o,"processDir"),await o(n),s}function HT(r,e){let t=LT[e]||[],n=r.split(`
|
|
1484
1197
|
`);for(let o=0;o<Math.min(30,n.length);o++){let i=n[o].trim();for(let a of t)if(a.start.test(i)){if(a.singleLine){let c=[],u=o;for(;u<n.length&&a.start.test(n[u].trim());)c.push(n[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<n.length&&(c+=`${n[u]}
|
|
1485
1198
|
`,!a.end.test(n[u]));)u++;let d=c.replace(a.start,"").replace(a.end,"").split(`
|
|
1486
1199
|
`).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 s=r.split(`
|
|
1487
|
-
`)[0]||"";return`Module: ${
|
|
1488
|
-
`)[0].trim()}function
|
|
1489
|
-
`)}var
|
|
1200
|
+
`)[0]||"";return`Module: ${on.basename(s,on.extname(s))}`}function UT(r){return r.replace(/^\/\*\*\s*/,"").replace(/\*\/$/,"").replace(/^\/\/\/?\s*/,"").replace(/^#\s*/,"").replace(/^"""\s*/,"").replace(/"""\s*$/,"").trim().split(`
|
|
1201
|
+
`)[0].trim()}function GT(r,e,t){let n=[];if(n.push(`Purpose: ${r}`),n.push(""),e.length>0){n.push("Public API:");for(let s of e){let o=s.description?` - ${s.description}`:"";n.push(` ${s.type} ${s.name}: ${s.signature}${o}`)}n.push("")}return t.length>0&&n.push(`Dependencies: ${t.join(", ")}`),n.join(`
|
|
1202
|
+
`)}var LT,Gh,zh=y(()=>{"use strict";_();od();_i();eo();LT={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}]},Gh={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".py":"python",".go":"go",".rs":"rust"};l(Ca,"summarizeFile");l(id,"summarizeDirectory");l(HT,"extractFilePurpose");l(UT,"extractDescriptionFromDocstring");l(GT,"buildSummaryText")});var Wh=y(()=>{"use strict"});var Bh={};ge(Bh,{analyzeImports:()=>pr,combineMetrics:()=>Fi,countTokens:()=>Oi,extractDirectorySignatures:()=>El,extractSignatures:()=>An,findRelevantFiles:()=>Yr,formatCompressionRate:()=>av,formatCostSaved:()=>Tl,formatTokenCount:()=>iv,getRecentFiles:()=>Qr,measureCompression:()=>Zr,noCompression:()=>Qn,runContextTool:()=>zT,summarizeDirectory:()=>id,summarizeFile:()=>Ca});async function zT(r,e,t){let n=Date.now(),[s,...o]=r;try{let i;switch(s){case"files":i=await WT(o,t);break;case"signatures":i=await BT(o,t);break;case"imports":i=await VT(o,t);break;case"recent":i=await JT(o,t);break;case"summary":i=await qT(o,t);break;case"help":return{tool:"error",result:{error:QT(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${s}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}let a=Date.now()-n,c=KT(i),u=YT(i);return await XT(e,{tool:s,timestamp:C(),inputArgs:o.join(" "),tokensSaved:c,compressionRate:u,duration:a}),i}catch(i){return{tool:"error",result:{error:w(i),code:"EXECUTION_ERROR"}}}}async function WT(r,e){let t={},n=[];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:n.push(r[i]);let s=n.join(" ");return s?{tool:"files",result:await Yr(s,e,t)}:{tool:"error",result:{error:'Usage: prjct context files "<task description>"',code:"MISSING_ARG"}}}async function BT(r,e){let t=r[0];if(!t)return{tool:"error",result:{error:"Usage: prjct context signatures <file_or_directory>",code:"MISSING_ARG"}};let n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await El(t,e,{recursive:r.includes("--recursive")||r.includes("-r")}),u=Fi(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 An(t,e)}}async function VT(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 n={};for(let o=1;o<r.length;o++)r[o]==="--reverse"||r[o]==="-r"?n.reverse=!0:(r[o]==="--depth"||r[o]==="-d")&&r[o+1]&&(n.depth=parseInt(r[++o],10));return{tool:"imports",result:await pr(t,e,n)}}async function JT(r,e){let t={};for(let s=0;s<r.length;s++)r[s]==="--branch"||r[s]==="-b"?t.branch=!0:r[s]==="--max"&&r[s+1]?t.maxFiles=parseInt(r[++s],10):/^\d+$/.test(r[s])&&(t.commits=parseInt(r[s],10));return{tool:"recent",result:await Qr(e,t)}}async function qT(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 n=await import("node:fs/promises"),s=await import("node:path"),o=s.isAbsolute(t)?t:s.join(e,t);try{if((await n.stat(o)).isDirectory()){let c=await id(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:Fi(c.map(d=>d.metrics))}}}}catch{}return{tool:"summary",result:await Ca(t,e)}}function KT(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 YT(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 XT(r,e){try{await un.recordSync(r,{originalSize:e.tokensSaved+100,filteredSize:100,duration:e.duration,isWatch:!1,agents:[`context-${e.tool}`]})}catch{}}function QT(){return`
|
|
1490
1203
|
Context Tools - Smart context filtering for AI agents
|
|
1491
1204
|
|
|
1492
1205
|
USAGE:
|
|
@@ -1547,7 +1260,7 @@ TOOLS:
|
|
|
1547
1260
|
OUTPUT:
|
|
1548
1261
|
All tools output JSON for easy parsing by AI agents.
|
|
1549
1262
|
Each output includes metrics showing token savings.
|
|
1550
|
-
`.trim()}var
|
|
1263
|
+
`.trim()}var Vh=y(()=>{"use strict";zr();_();le();vl();od();xl();_i();zh();eo();eo();Wh();l(zT,"runContextTool");l(WT,"runFilesTool");l(BT,"runSignaturesTool");l(VT,"runImportsTool");l(JT,"runRecentTool");l(qT,"runSummaryTool");l(KT,"getTokensSaved");l(YT,"getCompressionRate");l(XT,"recordToolUsage");l(QT,"getHelpText")});var Yh={};ge(Yh,{hooksService:()=>oE});import He from"node:fs/promises";import Re from"node:path";import vt from"chalk";function qh(){return`#!/bin/sh
|
|
1551
1264
|
# prjct auto-sync hook (post-commit)
|
|
1552
1265
|
# Syncs project context after each commit
|
|
1553
1266
|
# Installed by: prjct hooks install
|
|
@@ -1568,7 +1281,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1568
1281
|
fi
|
|
1569
1282
|
|
|
1570
1283
|
exit 0
|
|
1571
|
-
`}function
|
|
1284
|
+
`}function Kh(){return`#!/bin/sh
|
|
1572
1285
|
# prjct auto-sync hook (post-checkout)
|
|
1573
1286
|
# Syncs project context after branch switch
|
|
1574
1287
|
# Installed by: prjct hooks install
|
|
@@ -1600,7 +1313,7 @@ if command -v prjct >/dev/null 2>&1; then
|
|
|
1600
1313
|
fi
|
|
1601
1314
|
|
|
1602
1315
|
exit 0
|
|
1603
|
-
`}async function
|
|
1316
|
+
`}async function ad(r){let e=[];return(await P(Re.join(r,"lefthook.yml"))||await P(Re.join(r,"lefthook.yaml")))&&e.push("lefthook"),(await P(Re.join(r,".husky"))||await P(Re.join(r,".husky","_")))&&e.push("husky"),await P(Re.join(r,".git"))&&e.push("direct"),e}function Jh(r){return r.includes("lefthook")?"lefthook":r.includes("husky")?"husky":"direct"}async function ZT(r,e){let t=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",n=Re.join(r,t),s=await He.readFile(n,"utf-8");for(let o of e){let i=o,a=`prjct-sync-${o}`;if(s.includes(a))continue;let c=`
|
|
1604
1317
|
${i}:
|
|
1605
1318
|
commands:
|
|
1606
1319
|
${a}:
|
|
@@ -1611,34 +1324,34 @@ ${i}:
|
|
|
1611
1324
|
${a}:
|
|
1612
1325
|
run: prjct sync --quiet --yes
|
|
1613
1326
|
fail_text: "prjct sync failed (non-blocking)"`):s=`${s.trimEnd()}
|
|
1614
|
-
${c}`}return await He.writeFile(n,s,"utf-8"),!0}async function
|
|
1327
|
+
${c}`}return await He.writeFile(n,s,"utf-8"),!0}async function eE(r,e){let t=Re.join(r,".husky");for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?qh():Kh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
|
|
1615
1328
|
# prjct auto-sync
|
|
1616
1329
|
prjct sync --quiet --yes &
|
|
1617
|
-
`)}else await He.writeFile(s,o,{mode:493})}return!0}async function
|
|
1330
|
+
`)}else await He.writeFile(s,o,{mode:493})}return!0}async function tE(r,e){let t=Re.join(r,".git","hooks");await P(t)||await He.mkdir(t,{recursive:!0});for(let n of e){let s=Re.join(t,n),o=n==="post-commit"?qh():Kh();if(await P(s)){if((await He.readFile(s,"utf-8")).includes("prjct sync"))continue;await He.appendFile(s,`
|
|
1618
1331
|
# prjct auto-sync
|
|
1619
1332
|
${o.split(`
|
|
1620
1333
|
`).slice(1).join(`
|
|
1621
|
-
`)}`)}else await He.writeFile(s,o,{mode:493})}return!0}async function
|
|
1622
|
-
`,"utf-8"),!0}async function
|
|
1334
|
+
`)}`)}else await He.writeFile(s,o,{mode:493})}return!0}async function nE(r){let e=await P(Re.join(r,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",t=Re.join(r,e);if(!await P(t))return!1;let n=await He.readFile(t,"utf-8");return n=n.replace(/\s*prjct-sync-[\w-]+:[\s\S]*?(?=\n\S|\n*$)/g,""),n=n.replace(/^(post-commit|post-checkout):\s*commands:\s*$/gm,""),await He.writeFile(t,`${n.trimEnd()}
|
|
1335
|
+
`,"utf-8"),!0}async function sE(r){let e=Re.join(r,".husky");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(!s.includes("prjct sync"))continue;let o=s.split(`
|
|
1623
1336
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1624
|
-
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await He.unlink(n):await He.writeFile(n,o,{mode:493})}return!0}async function
|
|
1337
|
+
`);o.trim()==="#!/bin/sh"||o.trim()==="#!/usr/bin/env sh"?await He.unlink(n):await He.writeFile(n,o,{mode:493})}return!0}async function rE(r){let e=Re.join(r,".git","hooks");for(let t of["post-commit","post-checkout"]){let n=Re.join(e,t);if(!await P(n))continue;let s=await He.readFile(n,"utf-8");if(s.includes("prjct sync"))if(s.includes("Installed by: prjct hooks install"))await He.unlink(n);else{let o=s.split(`
|
|
1625
1338
|
`).filter(i=>!i.includes("prjct sync")&&!i.includes("prjct auto-sync")).join(`
|
|
1626
|
-
`);await He.writeFile(n,o,{mode:493})}}return!0}var
|
|
1627
|
-
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.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}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${
|
|
1628
|
-
\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 n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(
|
|
1629
|
-
${
|
|
1630
|
-
`)}function
|
|
1631
|
-
`)}function
|
|
1632
|
-
`)}function
|
|
1339
|
+
`);await He.writeFile(n,o,{mode:493})}}return!0}var cd,oE,Xh=y(()=>{"use strict";Ve();he();_();xe();Nt();l(qh,"getPostCommitScript");l(Kh,"getPostCheckoutScript");l(ad,"detectHookManagers");l(Jh,"selectStrategy");l(ZT,"installLefthook");l(eE,"installHusky");l(tE,"installDirect");l(nE,"uninstallLefthook");l(sE,"uninstallHusky");l(rE,"uninstallDirect");cd=class{static{l(this,"HooksService")}async install(e,t={}){let n=t.hooks||["post-commit","post-checkout"],s=await ad(e);if(s.length===0)return{success:!1,strategy:"direct",hooksInstalled:[],error:'Not a git repository. Run "git init" first.'};let o=t.strategy||Jh(s);try{let i=!1;switch(o){case"lefthook":i=await ZT(e,n);break;case"husky":i=await eE(e,n);break;case"direct":i=await tE(e,n);break}return i&&await this.saveHookConfig(e,{enabled:!0,strategy:o,hooks:n,installedAt:new Date().toISOString()}),{success:i,strategy:o,hooksInstalled:i?n:[]}}catch(i){return{success:!1,strategy:o,hooksInstalled:[],error:w(i)}}}async uninstall(e){try{let n=(await this.getHookConfig(e))?.strategy||"direct",s=!1;switch(n){case"lefthook":s=await nE(e);break;case"husky":s=await sE(e);break;case"direct":s=await rE(e);break}return s&&await this.saveHookConfig(e,{enabled:!1,strategy:n,hooks:[]}),{success:s}}catch(t){return{success:!1,error:w(t)}}}async status(e){let t=await ad(e),n=await this.getHookConfig(e),s=["post-commit","post-checkout"],o=await Promise.all(s.map(async i=>({name:i,installed:await this.isHookInstalled(e,i,n?.strategy||null),path:await this.getHookPath(e,i,n?.strategy||null)})));return{installed:o.some(i=>i.installed),strategy:n?.strategy||null,hooks:o,detectedManagers:t}}async run(e,t){if(!await R.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){h.start(),h.section("Git Hooks Installation");let t=await ad(e),n=Jh(t);console.log(` Strategy: ${vt.cyan(n)}`),console.log(` Hooks: ${vt.dim("post-commit, post-checkout")}`),console.log("");let s=await this.install(e,{strategy:n});if(s.success){h.done(`Hooks installed via ${s.strategy}`),console.log("");for(let o of s.hooksInstalled)console.log(` ${vt.green("\u2713")} ${o}`);console.log(""),console.log(vt.dim(" Context will auto-sync on commit and branch switch.")),console.log(vt.dim(" Remove with: prjct hooks uninstall"))}else h.fail(s.error||"Failed to install hooks");return console.log(""),h.end(),s.success?0:1}async runUninstall(e){h.start(),h.section("Git Hooks Removal");let t=await this.uninstall(e);return t.success?h.done("Hooks removed"):h.fail(t.error||"Failed to remove hooks"),console.log(""),h.end(),t.success?0:1}async runStatus(e){h.start(),h.section("Git Hooks Status");let t=await this.status(e);t.installed?(console.log(` Status: ${vt.green("Active")}`),console.log(` Strategy: ${vt.cyan(t.strategy)}`)):console.log(` Status: ${vt.dim("Not installed")}`),console.log("");for(let n of t.hooks){let s=n.installed?vt.green("\u2713"):vt.dim("\u25CB"),o=n.installed?n.name:vt.dim(n.name);console.log(` ${s} ${o}`)}return t.detectedManagers.length>0&&(console.log(""),console.log(` ${vt.dim("Available managers:")} ${t.detectedManagers.join(", ")}`)),t.installed||(console.log(""),console.log(vt.dim(" Install with: prjct hooks install"))),console.log(""),h.end(),0}async isHookInstalled(e,t,n){if(n==="lefthook"){let o=await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml",i=Re.join(e,o);return await P(i)?(await He.readFile(i,"utf-8")).includes(`prjct-sync-${t}`):!1}if(n==="husky"){let o=Re.join(e,".husky",t);return await P(o)?(await He.readFile(o,"utf-8")).includes("prjct sync"):!1}let s=Re.join(e,".git","hooks",t);return await P(s)?(await He.readFile(s,"utf-8")).includes("prjct sync"):!1}async getHookPath(e,t,n){return n==="lefthook"?await P(Re.join(e,"lefthook.yml"))?"lefthook.yml":"lefthook.yaml":n==="husky"?`.husky/${t}`:`.git/hooks/${t}`}async getHookConfig(e){let t=await R.getProjectId(e);if(!t)return null;try{let n=$.getDoc(t,"project");return n&&n.hooks||null}catch{return null}}async saveHookConfig(e,t){let n=await R.getProjectId(e);if(n)try{let s=$.getDoc(n,"project")||{};s.hooks=t,$.setDoc(n,"project",s)}catch{}}},oE=new cd});var ey={};ge(ey,{DoctorService:()=>va,doctorService:()=>iE});import{execSync as ld}from"node:child_process";import Qh from"node:fs/promises";import Zh from"node:path";import Mn from"chalk";var va,iE,ty=y(()=>{"use strict";Ve();Ce();Ut();Nt();dt();va=class{static{l(this,"DoctorService")}projectPath="";projectId=null;globalPath="";async check(e=process.cwd()){this.projectPath=e,this.projectId=await R.getProjectId(e),this.projectId&&(this.globalPath=A.getGlobalProjectPath(this.projectId));let t=await this.checkTools(),n=await this.checkProject(),s=this.generateRecommendations(t,n),o=[...t,...n].some(a=>a.status==="error"&&!a.optional),i=[...t,...n].some(a=>a.status==="warn"||a.status==="error"&&a.optional);return{success:!o,tools:t,project:n,recommendations:s,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,n,s,o){try{let a=ld(t,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).match(n),c=a?a[1]:"unknown";return{name:e,status:"ok",version:c,optional:s}}catch{return{name:e,status:"error",message:o?`not found (${o})`:"not found",optional:s}}}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}async checkPrjctConfig(){let e=Zh.join(this.projectPath,".prjct","prjct.config.json");try{return await Qh.access(e),{name:"prjct config",status:"ok",message:"initialized"}}catch{return{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=Zh.join(this.globalPath,"context","CLAUDE.md");try{let t=await Qh.stat(e),n=Date.now()-t.mtimeMs,s=Math.floor(n/(1e3*60*60)),o=Math.floor(s/24),i;return o>0?i=`${o} day${o>1?"s":""} ago`:s>0?i=`${s} hour${s>1?"s":""} ago`:i="recently",s>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{ld("git rev-parse --git-dir",{cwd:this.projectPath,stdio:["pipe","pipe","pipe"]});let e=ld("git status --porcelain",{cwd:this.projectPath,encoding:"utf-8"});if(e.trim().length>0){let n=e.trim().split(`
|
|
1340
|
+
`).filter(Boolean);return{name:"git repo",status:"ok",message:`${n.length} uncommitted change${n.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}}}generateRecommendations(e,t){let n=[];e.find(c=>c.name==="gh"&&c.status==="error")&&n.push("Install GitHub CLI (gh) for PR commands: https://cli.github.com");let o=t.find(c=>c.name==="CLAUDE.md");o?.status==="warn"&&o.message?.includes("stale")&&n.push('Run "prjct sync" to update context');let i=t.find(c=>c.name==="prjct config");return i?.status==="error"&&n.push('Run "prjct init" to initialize this project'),t.find(c=>c.name==="CLAUDE.md"&&c.status==="error")&&!i?.status?.includes("error")&&n.push('Run "prjct sync" to generate context files'),n}printHeader(){h.section(`prjct doctor v${fe}`)}printSection(e,t){h.section(e);let n=t.map(s=>{let o=this.getStatusIcon(s.status,s.optional),i=s.name.padEnd(14),a=s.version||s.message||"",c=s.optional&&s.status==="error"?Mn.dim(" (optional)"):"";return`${o} ${i} ${Mn.dim(a)}${c}`});for(let s of n)console.log(` ${s}`)}printRecommendations(e){h.section("Recommendations"),h.list(e,{bullet:Mn.yellow("\u2022")})}printSummary(e){console.log(""),console.log(Mn.dim("\u2500".repeat(40))),e.hasErrors?h.fail("Some required checks failed"):e.hasWarnings?h.warn("All required checks passed (some warnings)"):h.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")}}},iE=new va});var ny={};ge(ny,{WatchService:()=>xa,watchService:()=>dE});import aE from"node:path";import tt from"chalk";import cE from"chokidar";var lE,uE,xa,dE,sy=y(()=>{"use strict";Ve();_();le();ku();lE=["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"],uE=["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/.next/**","**/.nuxt/**","**/coverage/**","**/*.log","**/*.tmp","**/CLAUDE.md","**/.cursorrules","**/.windsurfrules","**/.prjct/**","**/.prjct-cli/**"],xa=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 R.getProjectId(e),this.projectId?this.isRunning?{success:!1,error:"Watch mode is already running"}:(this.isRunning=!0,this.options.quiet||this.printStartup(),this.watcher=cE.watch(lE,{cwd:this.projectPath,ignored:uE,persistent:!0,ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:500,pollInterval:100}}),this.watcher.on("add",n=>this.handleChange("add",n)).on("change",n=>this.handleChange("change",n)).on("unlink",n=>this.handleChange("unlink",n)).on("error",n=>this.handleError(n)),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(tt.dim(`
|
|
1341
|
+
\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 n=e==="add"?"\u2795":e==="unlink"?"\u2796":"\u{1F4DD}";console.log(tt.dim(` ${n} ${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 n=this.options.minIntervalMs-t;this.options.verbose&&!this.options.quiet&&console.log(tt.dim(` \u23F3 Rate limited, waiting ${Math.round(n/1e3)}s...`)),this.debounceTimer=setTimeout(()=>this.performSync(),n);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=C().split("T")[1].split(".")[0];if(!this.options.quiet){let n=e.length===1?e[0]:`${e.length} files`;console.log(`
|
|
1342
|
+
${tt.dim(`[${t}]`)} ${tt.cyan("\u27F3")} ${n} changed \u2192 syncing...`)}try{let n=await as.sync(this.projectPath,{changedFiles:e});if(this.lastSyncTime=Date.now(),this.syncCount++,n.success){if(!this.options.quiet){let s=n.agents.filter(i=>i.type==="domain").map(i=>i.name),o=s.length>0?` [${s.join(", ")}]`:"";console.log(`${tt.dim(`[${t}]`)} ${tt.green("\u2713")} Synced${o}`)}}else console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Sync failed: ${n.error}`)}catch(n){console.error(`${tt.dim(`[${t}]`)} ${tt.red("\u2717")} Error: ${w(n)}`)}}handleError(e){console.error(tt.red(`Watch error: ${e.message}`))}printStartup(){console.log(""),console.log(tt.cyan("\u{1F441}\uFE0F Watching for changes...")),console.log(tt.dim(` Project: ${aE.basename(this.projectPath)}`)),console.log(tt.dim(` Debounce: ${this.options.debounceMs}ms`)),console.log(tt.dim(` Min interval: ${this.options.minIntervalMs/1e3}s`)),console.log(""),console.log(tt.dim(" Press Ctrl+C to stop")),console.log("")}},dE=new xa});var uy={};ge(uy,{formatAgentCommandHelp:()=>ay,formatCommandHelp:()=>cy,formatCommandList:()=>ly,formatMainHelp:()=>oy,formatTerminalCommandHelp:()=>iy,getHelp:()=>mE});import J from"chalk";function oy(){let r=[];r.push(""),r.push(`${J.cyan.bold("prjct")} v${fe} - Context layer for AI coding agents`),r.push(J.dim("Works with Claude Code, Gemini CLI, Cursor, Windsurf, and more.")),r.push(""),r.push(J.bold("QUICK START")),r.push(J.dim("\u2500".repeat(60))),r.push(` ${J.green("1.")} prjct start ${J.dim("# Configure AI providers")}`),r.push(` ${J.green("2.")} cd my-project && prjct init`),r.push(` ${J.green("3.")} Open in Claude Code / Gemini CLI / Cursor`),r.push(` ${J.green("4.")} p. sync ${J.dim("# Analyze project")}`),r.push(""),r.push(J.bold("TERMINAL COMMANDS")),r.push(J.dim("\u2500".repeat(60)));for(let t of ry){let n=`prjct ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(""),r.push(`${J.bold("AI AGENT COMMANDS")} ${J.dim("(inside Claude/Gemini/Cursor)")}`),r.push(J.dim("\u2500".repeat(60))),r.push(` ${"Command".padEnd(22)} Description`),r.push(` ${J.dim("\u2500".repeat(56))}`);let e=tr.filter(t=>t.group==="core"&&t.usage?.claude);for(let t of e.slice(0,10)){let n=`p. ${t.name}`.padEnd(22);r.push(` ${n} ${t.description}`)}r.push(` ${J.dim(`... and ${e.length-10} more (run 'prjct help commands')`)}`),r.push(""),r.push(J.bold("FLAGS")),r.push(J.dim("\u2500".repeat(60)));for(let t of pE)r.push(` ${t.flag.padEnd(22)} ${t.description}`);return r.push(""),r.push(J.bold("MORE INFO")),r.push(J.dim("\u2500".repeat(60))),r.push(` Documentation: ${J.cyan("https://prjct.app")}`),r.push(` GitHub: ${J.cyan("https://github.com/jlopezlira/prjct-cli")}`),r.push(" Per-command: prjct help <command>"),r.push(""),r.join(`
|
|
1343
|
+
`)}function iy(r){let e=ry.find(n=>n.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${J.cyan.bold(`prjct ${e.name}`)} - ${e.description}`),t.push(""),t.push(J.bold("USAGE")),t.push(` ${e.example}`),t.push(""),e.options){t.push(J.bold("OPTIONS"));for(let n of e.options)t.push(` ${n}`);t.push("")}if(e.subcommands){t.push(J.bold("SUBCOMMANDS"));for(let n of e.subcommands)t.push(` ${n}`);t.push("")}return t.join(`
|
|
1344
|
+
`)}function ay(r){let e=tr.find(s=>s.name===r);if(!e)return null;let t=[];if(t.push(""),t.push(`${J.cyan.bold(`p. ${e.name}`)} - ${e.description}`),t.push(""),t.push(J.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(J.bold("PARAMETERS")),t.push(` ${e.params}`),t.push("")),e.features&&e.features.length>0){t.push(J.bold("FEATURES"));for(let s of e.features)t.push(` \u2022 ${s}`);t.push("")}e.blockingRules&&(t.push(J.bold("REQUIREMENTS")),t.push(` ${J.yellow("\u26A0")} ${e.blockingRules.check}`),t.push(""));let n=po[e.group];return n&&(t.push(J.dim(`Category: ${n.title}`)),e.isOptional&&t.push(J.dim("This is an optional command.")),t.push("")),t.join(`
|
|
1345
|
+
`)}function cy(r){let e=iy(r);if(e)return e;let t=ay(r);return t||`
|
|
1633
1346
|
${J.yellow(`Command '${r}' not found.`)}
|
|
1634
1347
|
|
|
1635
1348
|
Run 'prjct help' to see all available commands.
|
|
1636
|
-
`}function
|
|
1637
|
-
`)}function
|
|
1349
|
+
`}function ly(){let r=[];r.push(""),r.push(J.cyan.bold("All Commands")),r.push("");let e=Object.entries(po).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let s=tr.filter(o=>o.group===t);if(s.length!==0){r.push(`${J.bold(n.title)} ${J.dim(`(${s.length} commands)`)}`),r.push(J.dim(n.description)),r.push("");for(let o of s){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(J.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
|
|
1350
|
+
`)}function mE(r){return r?r==="commands"||r==="all"?ly():cy(r):oy()}var ry,pE,dy=y(()=>{"use strict";ed();dt();ry=[{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:"linear",description:"Linear issue tracker CLI",example:"prjct linear list",subcommands:["list","get","create","update"]},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],pE=[{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(oy,"formatMainHelp");l(iy,"formatTerminalCommandHelp");l(ay,"formatAgentCommandHelp");l(cy,"formatCommandHelp");l(ly,"formatCommandList");l(mE,"getHelp")});var hy={};ge(hy,{installAntigravitySkill:()=>fy,needsAntigravityInstallation:()=>wE,run:()=>gy});import{execSync as gE}from"node:child_process";import q from"node:fs/promises";import us from"node:os";import re from"node:path";import me from"chalk";async function fE(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Fs.isAvailable("npm"))return console.log(`${me.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${me.dim(`Install ${r.displayName} using one of:`)}`),console.log(me.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(me.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(me.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(me.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),gE(`npm install -g ${e}`,{stdio:"inherit",timeout:Ts("NPM_INSTALL")}),console.log(""),console.log(`${me.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let n=t;return n.killed&&n.signal==="SIGTERM"?(console.log(me.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(me.dim("The npm install took too long. Try:")),console.log(me.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(me.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(me.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${n.message}`)),console.log(""),console.log(me.dim("Alternative installation methods:")),console.log(me.dim(` \u2022 npm: npm install -g ${e}`)),console.log(me.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(me.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(me.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function gy(){let r=await an(),e=await Oa(),t=Fe[e.provider],n={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},s=["claude","gemini"];for(let i of s){let a=Fe[i],c=r[i],u={provider:i,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!c.installed)if(i===e.provider)if(await fE(a))u.cliInstalled=!0,n.cliInstalled=!0;else throw new Error(`${a.displayName} installation failed`);else continue;if(i==="claude"){if(await Ee.detectClaude()){let m=await Ee.syncCommands();m.success&&(u.commandsAdded=m.added,u.commandsUpdated=m.updated,n.commandsAdded+=m.added,n.commandsUpdated+=m.updated);let p=await Ee.installGlobalConfig();p.success&&(u.configAction=p.action,n.configAction||(n.configAction=p.action)),await Ee.installDocs(),await kE(),await bE()}}else if(i==="gemini"){await hE()&&(u.commandsAdded=1,n.commandsAdded+=1);let m=await yE();m.success&&(u.configAction=m.action)}n.providers.push(u)}(await ws()).installed&&(await fy()).success&&console.log(` ${me.green("\u2713")} Antigravity skill installed`),await Ba.saveConfig(fe,await Ee.getInstallPath(),e.provider),await SE();for(let i of n.providers)CE(i,Fe[i.provider]);return n}async function hE(){try{let r=re.join(us.homedir(),".gemini","commands"),e=re.join(r,"p.toml");await q.mkdir(r,{recursive:!0});let t=ve("commands/p.toml");if(t)return await q.writeFile(e,t,"utf-8"),!0;let n=re.join(pe,"templates","commands","p.toml");return await P(n)?(await q.copyFile(n,e),!0):!1}catch(r){return H.warn(`Gemini router warning: ${w(r)}`),!1}}async function yE(){try{let r=re.join(us.homedir(),".gemini"),e=re.join(r,"GEMINI.md");await q.mkdir(r,{recursive:!0});let t=ve("global/GEMINI.md");if(!t){let p=re.join(pe,"templates","global","GEMINI.md");t=await q.readFile(p,"utf-8")}let n="",s=!1;try{n=await q.readFile(e,"utf-8"),s=!0}catch(p){if(v(p))s=!1;else throw p}if(!s)return await q.writeFile(e,t,"utf-8"),{success:!0,action:"created"};let o="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",i="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(!(n.includes(o)&&n.includes(i))){let p=`${n}
|
|
1638
1351
|
|
|
1639
|
-
${t}`;return await q.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await q.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return
|
|
1352
|
+
${t}`;return await q.writeFile(e,p,"utf-8"),{success:!0,action:"appended"}}let c=n.substring(0,n.indexOf(o)),u=n.substring(n.indexOf(i)+i.length),d=t.substring(t.indexOf(o),t.indexOf(i)+i.length),m=c+d+u;return await q.writeFile(e,m,"utf-8"),{success:!0,action:"updated"}}catch(r){return H.warn(`Gemini config warning: ${w(r)}`),{success:!1,action:null}}}async function fy(){try{let r=re.join(us.homedir(),".gemini","antigravity","skills"),e=re.join(r,"prjct"),t=re.join(e,"SKILL.md");await q.mkdir(e,{recursive:!0});let n=await P(t),s=ve("antigravity/SKILL.md");if(!s){let o=re.join(pe,"templates","antigravity","SKILL.md");if(!await P(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await q.readFile(o,"utf-8")}return await q.writeFile(t,s,"utf-8"),{success:!0,action:n?"updated":"created"}}catch(r){return H.warn(`Antigravity skill warning: ${w(r)}`),{success:!1,action:null}}}async function wE(){let r=await ws();return r.installed&&!r.skillInstalled}async function SE(){try{let r=re.join(us.homedir(),".prjct-cli","projects");if(!await P(r))return;let e=(await q.readdir(r,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name),t=0;for(let n of e)try{let s=$.getDoc(n,"project");if(!s)continue;s.cliVersion!==fe&&(s.cliVersion=fe,$.setDoc(n,"project",s),t++)}catch{}t>0&&console.log(` ${me.green("\u2713")} Updated ${t} project(s) to v${fe}`)}catch(r){v(r)||H.warn(`Migration warning: ${w(r)}`)}}async function py(r,e){let t={};if(await P(r))try{t=JSON.parse(await q.readFile(r,"utf8"))}catch(n){if(!(n instanceof SyntaxError))throw n}t.statusLine={type:"command",command:e},await q.writeFile(r,JSON.stringify(t,null,2))}async function kE(){try{let r=re.join(us.homedir(),".claude"),e=re.join(r,"settings.json"),t=re.join(r,"prjct-statusline.sh"),n=re.join(us.homedir(),".prjct-cli","statusline"),s=re.join(n,"statusline.sh"),o=re.join(n,"themes"),i=re.join(n,"lib"),a=re.join(n,"components"),c=re.join(n,"config.json"),u=re.join(pe,"assets","statusline"),d=re.join(u,"statusline.sh"),m=re.join(u,"themes"),p=re.join(u,"lib"),g=re.join(u,"components"),f=re.join(u,"default-config.json");if(await P(r)||await q.mkdir(r,{recursive:!0}),await P(n)||await q.mkdir(n,{recursive:!0}),await P(o)||await q.mkdir(o,{recursive:!0}),await P(i)||await q.mkdir(i,{recursive:!0}),await P(a)||await q.mkdir(a,{recursive:!0}),await P(s)){let S=await q.readFile(s,"utf8");if(S.includes("CLI_VERSION=")){let b=S.match(/CLI_VERSION="([^"]*)"/);if(b&&b[1]!==fe){let D=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${fe}"`);await q.writeFile(s,D,{mode:493})}await Pa(p,i),await Pa(g,a),await my(t,s),await py(e,t);return}}if(await P(d)){let S=await q.readFile(d,"utf8");if(S=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${fe}"`),await q.writeFile(s,S,{mode:493}),await Pa(p,i),await Pa(g,a),await P(m)){let b=await q.readdir(m);for(let D of b){let x=re.join(m,D),O=re.join(o,D);await q.copyFile(x,O)}}!await P(c)&&await P(f)&&await q.copyFile(f,c)}else{let S=`#!/bin/bash
|
|
1640
1353
|
# prjct Status Line for Claude Code
|
|
1641
|
-
CLI_VERSION="${
|
|
1354
|
+
CLI_VERSION="${fe}"
|
|
1642
1355
|
input=$(cat)
|
|
1643
1356
|
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
1644
1357
|
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
@@ -1667,14 +1380,14 @@ if [ -f "$CONFIG" ]; then
|
|
|
1667
1380
|
fi
|
|
1668
1381
|
fi
|
|
1669
1382
|
echo "prjct"
|
|
1670
|
-
`;await q.writeFile(s,
|
|
1383
|
+
`;await q.writeFile(s,S,{mode:493})}await my(t,s),await py(e,t)}catch(r){v(r)||H.warn(`Status line warning: ${w(r)}`)}}async function bE(){try{let r=re.join(us.homedir(),".claude"),e=re.join(r,"mcp.json");await P(r)||await q.mkdir(r,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await P(e)){let n=await q.readFile(e,"utf-8"),s=JSON.parse(n);if(s.mcpServers?.context7)return;s.mcpServers=s.mcpServers||{},s.mcpServers.context7=t.mcpServers.context7,await q.writeFile(e,JSON.stringify(s,null,2),"utf-8")}else await q.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(r){H.warn(`Context7 MCP setup warning: ${w(r)}`)}}async function Pa(r,e){if(!await P(r))return;let t=await q.readdir(r);for(let n of t)if(n.endsWith(".sh")){let s=re.join(r,n),o=re.join(e,n);await q.copyFile(s,o),await q.chmod(o,493)}}async function my(r,e){try{if(await P(r)){if((await q.lstat(r)).isSymbolicLink()&&await q.readlink(r)===e)return;await q.unlink(r)}await q.symlink(e,r)}catch{try{await P(e)&&(await q.copyFile(e,r),await q.chmod(r,493))}catch(n){v(n)||H.warn(`Symlink fallback warning: ${n.message}`)}}}function CE(r,e){if(console.log(""),r.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let n=[];r.commandsAdded>0&&n.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&n.push(`${r.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var vE,yy=y(()=>{"use strict";qn();ki();he();_();ln();xe();Ln();dt();Be();xn();Va();l(fE,"installAICLI");l(gy,"run");l(hE,"installGeminiRouter");l(yE,"installGeminiGlobalConfig");l(fy,"installAntigravitySkill");l(wE,"needsAntigravityInstallation");l(SE,"migrateProjectsCliVersion");l(py,"ensureStatusLineSettings");l(kE,"installStatusLine");l(bE,"installContext7MCP");l(Pa,"installStatusLineModules");l(my,"ensureStatusLineSymlink");l(CE,"showResults");vE=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");vE&&gy().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});var wy=Iy((qJ,xE)=>{xE.exports={name:"prjct-cli",version:"1.27.1",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:{"@hono/node-server":"^1.13.7","@linear/sdk":"^29.0.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",prompts:"^2.4.2",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7","@types/prompts":"^2.4.9",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:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk","prompts"]}});var RE={};import Sy from"node:os";import Ta from"node:path";import $e from"chalk";async function PE(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let t=await Promise.resolve().then(()=>Ay(wy()));await jE(t.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(DE(),process.exit(0)),h.start();try{let t=G.getByName(r);if(!t){let d=EE(r),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Gn("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${r}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:s}=AE(t,e),o=TE(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await R.getProjectId(process.cwd()),i&&(await vn.expireIfStale(i),await vn.touch(i))}catch{}let c=new gn,u;if(r==="design"){let d=n.join(" ");u=await c.design(d,s)}else if(r==="analyze")u=await c.analyze(s);else if(r==="cleanup")u=await c.cleanup(s);else if(r==="setup")u=await c.setup(s);else if(r==="update")u=await c.update(s);else{let d=n.join(" ")||null,m=s.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:s.json===!0,export:s.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:s.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:s.agents?String(s.agents).split(","):void 0,preview:s.preview===!0||s["dry-run"]===!0,yes:s.yes===!0,json:s.json===!0,md:m,package:s.package?String(s.package):void 0,full:s.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:s.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:s.json===!0,semantic:s.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[r];if(g)u=await g(d);else throw new Error(`Command '${r}' has no handler`)}if(i){let d=Date.now()-a;try{await vn.trackCommand(i,r,d)}catch{}try{await zn.recordTiming(i,"command_duration",d,{command:r});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await zn.recordTiming(i,"startup_time",p)}await zn.recordMemory(i,{command:r})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(wo(t)),h.end(),process.exit(1)}}function TE(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 n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return Gn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function EE(r){let e=G.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=IE(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function IE(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}function AE(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function jE(r){let e=await an(),t=Ta.join(Sy.homedir(),".claude","commands","p.md"),n=Ta.join(Sy.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([P(t),P(n),P(Ta.join(process.cwd(),".cursor","commands","sync.md")),P(Ta.join(process.cwd(),".cursor"))]),c=await ws();if(console.log(`
|
|
1671
1384
|
${$e.cyan("p/")} prjct v${r}
|
|
1672
1385
|
${$e.dim("Context layer for AI coding agents")}
|
|
1673
1386
|
|
|
1674
1387
|
${$e.dim("Providers:")}`),e.claude.installed){let u=s?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.claude.version?` (v${e.claude.version})`:"";console.log(` Claude Code ${u}${$e.dim(d)}`)}else console.log(` Claude Code ${$e.dim("\u25CB not installed")}`);if(e.gemini.installed){let u=o?$e.green("\u2713 ready"):$e.yellow("\u25CF installed"),d=e.gemini.version?` (v${e.gemini.version})`:"";console.log(` Gemini CLI ${u}${$e.dim(d)}`)}else console.log(` Gemini CLI ${$e.dim("\u25CB not installed")}`);if(c.installed){let u=c.skillInstalled?$e.green("\u2713 ready"):$e.yellow("\u25CF detected"),d=c.skillInstalled?"":` ${$e.dim("(run prjct start)")}`;console.log(` Antigravity ${u}${d}`)}else console.log(` Antigravity ${$e.dim("\u25CB not installed")}`);console.log(i?` Cursor IDE ${$e.green("\u2713 ready")} ${$e.dim("(use /sync, /task)")}`:a?` Cursor IDE ${$e.yellow("\u25CF detected")} ${$e.dim("(run prjct init)")}`:` Cursor IDE ${$e.dim("\u25CB no .cursor/ folder")}`),console.log(`
|
|
1675
1388
|
${$e.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
|
|
1676
1389
|
${$e.cyan("https://prjct.app")}
|
|
1677
|
-
`)}function
|
|
1390
|
+
`)}function DE(){console.log(`
|
|
1678
1391
|
prjct - Context layer for AI coding agents
|
|
1679
1392
|
Works with Claude Code, Gemini CLI, Antigravity, Cursor IDE, and more.
|
|
1680
1393
|
|
|
@@ -1733,15 +1446,15 @@ MORE INFO
|
|
|
1733
1446
|
---------
|
|
1734
1447
|
Documentation: https://prjct.app
|
|
1735
1448
|
GitHub: https://github.com/jlopezlira/prjct-cli
|
|
1736
|
-
`)}var
|
|
1449
|
+
`)}var ky=y(()=>{"use strict";sd();Us();ba();Be();Ve();ei();Zo();_();Or();xe();Nt();l(PE,"main");l(TE,"validateCommandParams");l(EE,"findClosestCommand");l(IE,"editDistance");l(AE,"parseCommandArgs");l(jE,"displayVersion");l(DE,"displayHelp");PE().catch(r=>{console.error("Fatal error:",w(r)),process.env.DEBUG&&console.error(wo(r)),process.exit(1)})});globalThis.__perfStartNs=process.hrtime.bigint();var mr=process.argv.slice(2),ud=mr.find(r=>!r.startsWith("--")&&!r.startsWith("-")),$E=new Set(["daemon","start","setup","dev","web","serve","context","hooks","doctor","uninstall","watch","linear","help","-h","--help","version","-v","--version"]);if(ud&&!$E.has(ud)&&process.env.PRJCT_NO_DAEMON!=="1"){let r=await import("node:fs"),{DAEMON_PATHS:e}=await Promise.resolve().then(()=>(ho(),md)),t=e.socket();if(r.existsSync(t)){let{sendRequest:n}=await Promise.resolve().then(()=>(ms(),ps)),s=await import("node:crypto"),o=[],i={};for(let a=0;a<mr.length;a++){let c=mr[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<mr.length&&!mr[a+1].startsWith("--")?i[u]=mr[++a]:i[u]=!0}else c.startsWith("-")&&c.length===2?i[c.slice(1)]=!0:a>0&&o.push(c)}try{let a=await n({id:s.randomUUID(),command:ud,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 ME(){let r=await import("node:os"),e=await import("node:path"),t=(await import("chalk")).default,{detectAllProviders:n}=await Promise.resolve().then(()=>(Be(),ut)),s=(await Promise.resolve().then(()=>(Ve(),_d))).default,o=(await Promise.resolve().then(()=>(Va(),Ld))).default,{DEFAULT_PORT:i,startServer:a}=await Promise.resolve().then(()=>(wc(),_p)),{fileExists:c}=await Promise.resolve().then(()=>(xe(),ce)),{invalidateProviderCache:u}=await Promise.resolve().then(()=>(Ra(),Td)),{VERSION:d}=await Promise.resolve().then(()=>(dt(),Ao));async function m(){let x=r.homedir(),O=await n();if(O.claude.installed){let F=e.join(x,".claude","commands","p.md");if(!await c(F))return!1}if(O.gemini.installed){let F=e.join(x,".gemini","commands","p.toml");if(!await c(F))return!1}return!O.claude.installed&&!O.gemini.installed,!0}l(m,"checkRoutersInstalled");let p=process.argv.slice(2),g=p.findIndex(x=>x==="--quiet"||x==="-q"),f=g!==-1;if(f){p.splice(g,1);let{setQuietMode:x}=await Promise.resolve().then(()=>(Nt(),Up));x(!0)}let S=p.indexOf("--refresh"),b=S!==-1;b&&(p.splice(S,1),await u());async function D(x){let O=Date.now();try{let F=await s.getProjectId(process.cwd());if(F){let{sessionTracker:K}=await Promise.resolve().then(()=>(Zo(),Wp));return await K.expireIfStale(F),await K.touch(F),()=>{let oe=Date.now()-O;K.trackCommand(F,x,oe).catch(()=>{}),Promise.resolve().then(()=>(ei(),Vp)).then(({performanceTracker:k})=>{k.recordTiming(F,"command_duration",oe,{command:x}).catch(()=>{}),k.recordMemory(F,{command:x}).catch(()=>{})}).catch(()=>{})}}}catch{}return()=>{}}if(l(D,"trackSession"),p[0]==="daemon"){let x=p[1]||"status";if(x==="start"){let{isDaemonRunning:O,spawnDaemon:F}=await Promise.resolve().then(()=>(ms(),ps));if(await O())console.log("Daemon is already running."),process.exitCode=0;else if(p.includes("--foreground")||p.includes("-f")){let{startDaemon:oe}=await Promise.resolve().then(()=>($h(),Rh)),k=parseInt(p.find(ee=>ee.startsWith("--port="))?.split("=")[1]||"",10)||void 0,j=p.includes("--no-http");await oe({port:k,noHttp:j,foreground:!0})}else await F()?console.log("Daemon started."):(console.error("Failed to start daemon."),process.exitCode=1)}else if(x==="stop"){let{isDaemonRunning:O,stopDaemon:F}=await Promise.resolve().then(()=>(ms(),ps));if(await O()){let K=await F();console.log(K?"Daemon stopped.":"Failed to stop daemon."),process.exitCode=K?0:1}else console.log("Daemon is not running."),process.exitCode=0}else if(x==="status"){let{getDaemonStatus:O}=await Promise.resolve().then(()=>(ms(),ps)),F=await O();if(F.running){let K=F.uptime?Math.round(F.uptime/1e3):0;console.log(`Daemon running (PID ${F.pid})`),console.log(` Uptime: ${K}s`),console.log(` Commands served: ${F.commandsServed??0}`),F.lastActivity&&console.log(` Last activity: ${F.lastActivity}`)}else console.log("Daemon is not running.");process.exitCode=0}else console.error(`Unknown daemon command: ${x}. Use: start, stop, status`),process.exitCode=1}else if(p[0]==="start"||p[0]==="setup"){let{runStart:x}=await Promise.resolve().then(()=>(Fh(),Oh));await x()}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 x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=parseInt(p[1],10)||i;await a(O,x,F)}}catch(x){console.error("Server error:",x.message),process.exitCode=1}else if(p[0]==="context"){let x=process.cwd(),O=await s.getProjectId(x);if(!O)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let F=await D("context"),{runContextTool:K}=await Promise.resolve().then(()=>(Vh(),Bh)),oe=await K(p.slice(1),O,x);console.log(JSON.stringify(oe,null,2)),process.exitCode=oe.tool==="error"?1:0,F()}}else if(p[0]==="hooks"){let x=await D("hooks"),{hooksService:O}=await Promise.resolve().then(()=>(Xh(),Yh)),F=p[1]||"status",K=await O.run(process.cwd(),F);process.exitCode=K,x()}else if(p[0]==="doctor"){let x=await D("doctor"),{doctorService:O}=await Promise.resolve().then(()=>(ty(),ey)),F=await O.run(process.cwd());process.exitCode=F,x()}else if(p[0]==="uninstall"){let{uninstall:x}=await Promise.resolve().then(()=>(nd(),Eh)),O=p.includes("--force")||p.includes("-f"),F=p.includes("--backup")||p.includes("-b"),K=p.includes("--dry-run")||p.includes("-n"),oe=p.includes("--keep-package"),k=await x({force:O,backup:F,dryRun:K,keepPackage:oe});process.exitCode=k.success?0:1}else if(p[0]==="watch"){let x=process.cwd();if(!await s.getProjectId(x))console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let{watchService:F}=await Promise.resolve().then(()=>(sy(),ny)),K=p.includes("--verbose")||p.includes("-v"),oe=p.find(it=>it.startsWith("--debounce=")),k=oe?parseInt(oe.split("=")[1],10):void 0,j=p.find(it=>it.startsWith("--interval=")),ee=j?parseInt(j.split("=")[1],10)*1e3:void 0,N=await F.start(x,{verbose:K,quiet:f,debounceMs:k,minIntervalMs:ee});N.success||(console.error(N.error),process.exitCode=1)}}else if(p[0]==="linear"){let{spawn:x}=await import("node:child_process"),O=await import("node:fs"),F=process.cwd(),K=await s.getProjectId(F);if(!K)console.error('No prjct project found. Run "prjct init" first.'),process.exitCode=1;else{let oe=e.join(__dirname,"..","core","cli","linear.ts"),k=e.join(__dirname,"..","dist","cli","linear.mjs"),j=e.join(__dirname,"..","cli","linear.mjs"),ee,N;if(O.existsSync(oe)?(ee=oe,N="bun"):O.existsSync(j)?(ee=j,N="node"):O.existsSync(k)?(ee=k,N="node"):(console.error('Linear CLI not found. Run "npm run build" first.'),process.exitCode=1,ee="",N=""),ee){let it=["--project",K,...p.slice(1)];x(N,[ee,...it],{stdio:"inherit",cwd:F}).on("close",gr=>{process.exitCode=gr||0})}}}else if(p[0]==="help"||p[0]==="-h"||p[0]==="--help"){let{getHelp:x}=await Promise.resolve().then(()=>(dy(),uy)),O=p[1];console.log(x(O)),process.exitCode=0}else if(p[0]==="version"||p[0]==="-v"||p[0]==="--version"){let x=await n(b),O=r.homedir(),F=process.cwd(),[K,oe,k,j,ee,N]=await Promise.all([c(e.join(O,".claude","commands","p.md")),c(e.join(O,".gemini","commands","p.toml")),c(e.join(F,".cursor")),c(e.join(F,".cursor","rules","prjct.mdc")),c(e.join(F,".windsurf")),c(e.join(F,".windsurf","rules","prjct.md"))]);if(console.log(`
|
|
1737
1450
|
${t.cyan("p/")} prjct v${d}
|
|
1738
1451
|
${t.dim("Context layer for AI coding agents")}
|
|
1739
1452
|
|
|
1740
|
-
${t.dim("Providers:")}`),
|
|
1453
|
+
${t.dim("Providers:")}`),x.claude.installed){let it=K?t.green("\u2713 ready"):t.yellow("\u25CF installed"),On=x.claude.version?` (v${x.claude.version})`:"";console.log(` Claude Code ${it}${t.dim(On)}`)}else console.log(` Claude Code ${t.dim("\u25CB not installed")}`);if(x.gemini.installed){let it=oe?t.green("\u2713 ready"):t.yellow("\u25CF installed"),On=x.gemini.version?` (v${x.gemini.version})`:"";console.log(` Gemini CLI ${it}${t.dim(On)}`)}else console.log(` Gemini CLI ${t.dim("\u25CB not installed")}`);if(k){let it=j?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Cursor IDE ${it}${t.dim(" (project)")}`)}else console.log(` Cursor IDE ${t.dim("\u25CB not detected")}`);if(ee){let it=N?t.green("\u2713 ready"):t.yellow("\u25CF detected");console.log(` Windsurf IDE ${it}${t.dim(" (project)")}`)}else console.log(` Windsurf IDE ${t.dim("\u25CB not detected")}`);console.log(`
|
|
1741
1454
|
${t.dim("Run 'prjct start' to configure (CLI providers)")}
|
|
1742
1455
|
${t.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
|
|
1743
1456
|
${t.cyan("https://prjct.app")}
|
|
1744
|
-
`)}else{let
|
|
1457
|
+
`)}else{let x=e.join(r.homedir(),".prjct-cli","config","installed-editors.json"),O=await m();if(!await c(x)||!O)console.log(`
|
|
1745
1458
|
${t.cyan.bold(" Welcome to prjct!")}
|
|
1746
1459
|
|
|
1747
1460
|
Run ${t.bold("prjct start")} to configure your AI providers.
|
|
@@ -1750,4 +1463,4 @@ ${t.cyan.bold(" Welcome to prjct!")}
|
|
|
1750
1463
|
Claude Code, Gemini CLI, or both.`)}
|
|
1751
1464
|
`),process.exitCode=0;else{try{let F=await o.getLastVersion();if(F&&F!==d){console.log(`
|
|
1752
1465
|
${t.yellow("\u2139")} Updating prjct v${F} \u2192 v${d}...
|
|
1753
|
-
`);let{default:K}=await Promise.resolve().then(()=>(
|
|
1466
|
+
`);let{default:K}=await Promise.resolve().then(()=>(yy(),hy));await K.run()}}catch{}p.length>0&&process.env.PRJCT_NO_DAEMON!=="1"&&Promise.resolve().then(()=>(ms(),ps)).then(({spawnDaemon:F})=>F()).catch(()=>{}),await Promise.resolve().then(()=>(ky(),RE))}}}l(ME,"main");ME().catch(r=>{console.error("Fatal error:",r.message),process.exit(1)});
|