prjct-cli 1.51.1 → 1.52.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -1
- package/dist/bin/prjct-core.mjs +664 -593
- package/dist/cli/jira.mjs +6 -6
- package/dist/cli/linear.mjs +7 -7
- package/dist/daemon/entry.mjs +518 -449
- package/dist/mcp/server.mjs +704 -0
- package/package.json +2 -1
package/dist/daemon/entry.mjs
CHANGED
|
@@ -5,11 +5,9 @@ import { dirname as __pathDirname } from 'path';
|
|
|
5
5
|
var require = __createRequire(import.meta.url);
|
|
6
6
|
var __filename = __fileURLToPath(import.meta.url);
|
|
7
7
|
var __dirname = __pathDirname(__filename);
|
|
8
|
-
var
|
|
9
|
-
`,"utf-8")}async function Qf(r,e){try{let t=await we.readFile(r,"utf-8");await we.writeFile(r,e+t,"utf-8")}catch(t){if(R(t))await we.writeFile(r,e,"utf-8");else throw t}}async function P(r){try{return await we.access(r),!0}catch(e){if(R(e))return!1;throw e}}async function es(r){try{return(await we.stat(r)).isDirectory()}catch(e){if(R(e))return!1;throw e}}async function Tt(r){await we.mkdir(r,{recursive:!0})}async function Zf(r){try{return await we.unlink(r),!0}catch(e){if(R(e))return!1;throw e}}async function eh(r){try{return await we.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(R(e))return!1;throw e}}async function ts(r,e={}){try{let s=await we.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(R(t))return[];throw t}}async function th(r){return(await we.stat(r)).size}async function sh(r){return(await we.stat(r)).mtime}async function nh(r,e){await we.copyFile(r,e)}async function rh(r,e){await we.rename(r,e)}async function oh(r){return(await it(r,"")).split(`
|
|
10
|
-
`)}async function
|
|
11
|
-
`);await Jt(r,t)}function ah(r){return Zt.extname(r)}function ch(r){return Zt.basename(r,Zt.extname(r))}var K=S(()=>{"use strict";Ni();au();W();l(Is,"walkDir");l($s,"batchProcess");l(xe,"readJson");l(le,"writeJson");l(it,"readFile");l(Jt,"writeFile");l(Xf,"atomicWrite");l(Yf,"appendToFile");l(Li,"appendLine");l(Qf,"prependToFile");l(P,"fileExists");l(es,"dirExists");l(Tt,"ensureDir");l(Zf,"deleteFile");l(eh,"deleteDir");l(ts,"listFiles");l(th,"getFileSize");l(sh,"getFileModifiedTime");l(nh,"copyFile");l(rh,"moveFile");l(oh,"readLines");l(ih,"writeLines");l(ah,"getFileExtension");l(ch,"getFileNameWithoutExtension")});var or=S(()=>{"use strict"});import{z as qt}from"zod";function cu(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var Uv,Hv,Gv,un,Wv,Jr=S(()=>{"use strict";Uv=qt.enum(["opus","sonnet","haiku"]),Hv=qt.enum(["2.5-pro","2.5-flash","2.0-flash"]),Gv=qt.string().min(1),un=qt.object({provider:qt.string(),model:qt.string(),cliVersion:qt.string().optional(),recordedAt:qt.string()}),Wv=qt.object({preferredModel:qt.string().optional(),lastAnalysisModel:un.optional()});l(cu,"compareSemver")});var uu={};Ot(uu,{execAsync:()=>O,execFileAsync:()=>Fi});import{exec as lh,execFile as uh}from"node:child_process";import{promisify as lu}from"node:util";var O,Fi,He=S(()=>{"use strict";O=lu(lh),Fi=lu(uh)});function fs(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var dn,Ms=S(()=>{"use strict";l(fs,"isExpired");dn=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import dh from"node:fs/promises";import ph from"node:os";import du from"node:path";async function mu(){try{let r=await dh.readFile(pu,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||fs(e.timestamp,gh)?null:e.detection}catch{return null}}async function gu(r){let e={timestamp:new Date().toISOString(),detection:r};await le(pu,e)}var mh,pu,gh,fu=S(()=>{"use strict";Ms();K();mh=du.join(ph.homedir(),".prjct-cli","cache"),pu=du.join(mh,"providers.json"),gh=600*1e3;l(mu,"readProviderCache");l(gu,"writeProviderCache")});var vt={};Ot(vt,{AntigravityProvider:()=>Hi,ClaudeProvider:()=>qr,CodexProvider:()=>Gi,CursorProvider:()=>yu,GeminiProvider:()=>Ui,Providers:()=>gt,WindsurfProvider:()=>wu,detectAllProviders:()=>ir,detectAntigravity:()=>Yr,detectCodex:()=>_s,detectCursorProject:()=>bu,detectProvider:()=>Kr,detectWindsurfProject:()=>Tu,getActiveProvider:()=>wh,getCapabilities:()=>hh,getCommandsDir:()=>Ph,getGlobalContextPath:()=>Th,getGlobalSettingsPath:()=>vh,getProjectCommandsPath:()=>Eh,getProviderBranding:()=>Xr,getSkillsPath:()=>Ch,hasProviderConfig:()=>kh,needsCursorRouterRegeneration:()=>Sh,needsWindsurfRouterRegeneration:()=>bh,selectProvider:()=>Wi,validateCliVersion:()=>Su});import hs from"node:os";import Ve from"node:path";function hh(r,e){return{...fh[r],...e}}async function ku(r){try{let{stdout:e}=await O(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function yh(r){try{let{stdout:e}=await O(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Kr(r){let e=gt[r];if(!e.cliCommand)return{installed:!1};let t=await ku(e.cliCommand);if(!t)return{installed:!1};let s=await yh(e.cliCommand),n=Su(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Su(r,e){let t=gt[r];return!t.minCliVersion||!e?null:cu(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function ir(r=!1){if(!r){let i=await mu();if(i)return i}let[e,t,s]=await Promise.all([Kr("claude"),Kr("gemini"),_s()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await gu(o).catch(()=>{}),o}async function wh(r){if(r&>[r])return gt[r];let e=await ir();return e.claude.installed&&!e.gemini.installed?qr:e.gemini.installed&&!e.claude.installed?Ui:qr}async function kh(r){let e=gt[r];return e.configDir?P(e.configDir):!1}function Xr(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function bu(r){let e=Ve.join(r,".cursor"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.mdc"),[n,o]=await Promise.all([P(e),P(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Sh(r){let e=await bu(r);return e.detected&&!e.routerInstalled}async function Tu(r){let e=Ve.join(r,".windsurf"),t=Ve.join(e,"rules"),s=Ve.join(t,"prjct.md"),[n,o]=await Promise.all([P(e),P(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function bh(r){let e=await Tu(r);return e.detected&&!e.routerInstalled}async function Yr(){let r=Hi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=Ve.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([P(r),P(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function _s(){let r=Gi.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await ku("codex"),t=Ve.join(r,"skills","prjct","SKILL.md"),s=await P(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Th(r){let e=gt[r];return e.configDir?Ve.join(e.configDir,e.contextFile):null}function vh(r){let e=gt[r];return!e.configDir||!e.settingsFile?null:Ve.join(e.configDir,e.settingsFile)}function Ch(r){return gt[r].skillsDir}function Ph(r){return gt[r].commandsDir}function Eh(r,e){let t=gt[r];return Ve.join(e,t.commandsDir)}async function Wi(){let r=await ir(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var fh,qr,Ui,Hi,yu,wu,Gi,gt,at=S(()=>{"use strict";or();Jr();He();K();fu();fh={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(hh,"getCapabilities");qr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:Ve.join(hs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:Ve.join(hs.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},Ui={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:Ve.join(hs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:Ve.join(hs.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},Hi={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:Ve.join(hs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:Ve.join(hs.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},yu={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},wu={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Gi={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:Ve.join(hs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:Ve.join(hs.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},gt={claude:qr,gemini:Ui,cursor:yu,antigravity:Hi,windsurf:wu,codex:Gi};l(ku,"whichCommand");l(yh,"getCliVersion");l(Kr,"detectProvider");l(Su,"validateCliVersion");l(ir,"detectAllProviders");l(wh,"getActiveProvider");l(kh,"hasProviderConfig");l(Xr,"getProviderBranding");l(bu,"detectCursorProject");l(Sh,"needsCursorRouterRegeneration");l(Tu,"detectWindsurfProject");l(bh,"needsWindsurfRouterRegeneration");l(Yr,"detectAntigravity");l(_s,"detectCodex");l(Th,"getGlobalContextPath");l(vh,"getGlobalSettingsPath");l(Ch,"getSkillsPath");l(Ph,"getCommandsDir");l(Eh,"getProjectCommandsPath");l(Wi,"selectProvider")});import xh from"node:crypto";import Kt from"node:fs/promises";import Vi from"node:os";import z from"node:path";import{globSync as Rh}from"glob";var Bi,Ah,A,Te=S(()=>{"use strict";ie();K();Bi=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(Vi.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return xh.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await es(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await P(t)}async ensureGlobalStructure(){await Tt(this.globalBaseDir),await Tt(this.globalProjectsDir),await Tt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await Tt(z.join(t,n));return await Tt(z.join(t,"planning","tasks")),await Tt(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Oi(t);return z.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await Tt(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Kt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await Kt.readdir(c,{withFileTypes:!0});for(let p of u){if(!p.isDirectory()||s&&p.name!==s.toString().padStart(2,"0"))continue;let m=z.join(c,p.name),d=await Kt.readdir(m,{withFileTypes:!0});for(let g of d)g.isDirectory()&&o.push({year:a.name,month:p.name,day:g.name,path:z.join(m,g.name),date:new Date(`${a.name}-${p.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Kt.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await es(t)}getDisplayPath(e){let t=Vi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(at(),ot(vt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(at(),ot(vt)).getActiveProvider();return(at(),ot(vt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(Vi.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=z.join(e,n.file);if(await P(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await P(n))try{let o=await Kt.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await Kt.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
12
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=z.join(e,"package.json"),i=await Kt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=z.join(e,"lerna.json");if(await P(c)){let u=await Kt.readFile(c,"utf-8"),p=JSON.parse(u);p.packages&&(n=p.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=z.join(e,"package.json"),i=await Kt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=Rh(o,{cwd:e,absolute:!1});for(let a of i){let c=z.join(e,a),u=z.join(c,"package.json");if(await P(u))try{let p=await Kt.readFile(u,"utf-8"),m=JSON.parse(p),d=z.join(c,"PRJCT.md");s.push({name:m.name||z.basename(a),path:c,relativePath:a,hasPrjctMd:await P(d)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=z.resolve(e);for(let n of t.packages){let o=z.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=z.resolve(e),s=z.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=z.dirname(t)}return null}},Ah=new Bi,A=Ah});function vu(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function zi(){if(vu()==="bun")return!0;try{let{execSync:r}=bt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function Os(){return vu()==="bun"}var ar=S(()=>{"use strict";l(vu,"detectRuntime");l(zi,"isBunAvailable");l(Os,"isBun")});var Zr={};Ot(Zr,{PrjctDatabase:()=>Qr,default:()=>N,prjctDb:()=>C});import Ji from"node:fs";import Cu from"node:path";function Dh(r){if(Os()){let{Database:n}=bt("bun:sqlite");return new n(r,{create:!0})}let e=bt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var jh,Ih,Qr,C,N,re=S(()=>{"use strict";Te();ar();l(Dh,"openDatabase");jh=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
8
|
+
var $r=Object.defineProperty;var Og=Object.getOwnPropertyDescriptor;var Ng=Object.getOwnPropertyNames;var Lg=Object.prototype.hasOwnProperty;var l=(r,e)=>$r(r,"name",{value:e,configurable:!0}),gt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var v=(r,e)=>()=>(r&&(e=r(r=0)),e);var Bt=(r,e)=>{for(var t in e)$r(r,t,{get:e[t],enumerable:!0})},Fg=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ng(e))!Lg.call(r,n)&&n!==t&&$r(r,n,{get:()=>e[n],enumerable:!(s=Og(e,n))||s.enumerable});return r};var ot=r=>Fg($r({},"__esModule",{value:!0}),r);import{z as ke}from"zod";function Ug(r){return r instanceof Zs}function oe(r){return Ug(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var en,Wb,Vb,Bb,Jb,zb,qb,Zs,Mr,_r,er,Jt=v(()=>{"use strict";en={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},Wb=en.create("FileError",ke.object({path:ke.string(),operation:ke.enum(["read","write","delete","create","copy"]),reason:ke.string().optional()})),Vb=en.create("ValidationError",ke.object({field:ke.string(),expected:ke.string(),received:ke.string().optional(),message:ke.string().optional()})),Bb=en.create("PermissionError",ke.object({action:ke.string(),resource:ke.string(),reason:ke.string().optional()})),Jb=en.create("TaskError",ke.object({taskId:ke.string().optional(),operation:ke.enum(["create","update","complete","pause","resume","delete"]),reason:ke.string()})),zb=en.create("SessionError",ke.object({sessionId:ke.string().optional(),reason:ke.string()})),qb=en.create("SyncError",ke.object({projectId:ke.string().optional(),operation:ke.enum(["push","pull","auth","connect"]),reason:ke.string()})),Zs=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)}},Mr=class r extends Zs{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")}},_r=class r extends Zs{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")}},er=class r extends Zs{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(Ug,"isPrjctError");l(oe,"getErrorMessage")});function Hg(r){return r instanceof Error&&"code"in r}function A(r){return Hg(r)&&r.code==="ENOENT"}function y(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var H=v(()=>{"use strict";l(Hg,"isNodeError");l(A,"isNotFoundError");l(y,"getErrorMessage")});import{formatDistanceToNowStrict as eT}from"date-fns";function Rl(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function Al(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function b(){return new Date().toISOString()}function is(r){let e=new Date;return e.setDate(e.getDate()-r),e}function it(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function zt(r,e=new Date){let t=e.getTime()-r.getTime();return it(t)}function tn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function ft(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var z=v(()=>{"use strict";l(Rl,"formatDate");l(Al,"getYearMonthDay");l(b,"getTimestamp");l(is,"getDaysAgo");l(it,"formatDuration");l(zt,"calculateDuration");l(tn,"parseVarianceMinutes");l(ft,"parseDurationMinutes")});var Dl,jl,Il,Ei=v(()=>{"use strict";Dl=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),jl=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Il=/(?:import|from)\s+['"]([^'"]+)['"]/g});import _l from"node:fs/promises";async function Ol(r,e){let t;try{t=await _l.readFile(r,"utf-8")}catch(o){if(A(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await $l(r,t),Ml(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await $l(r,t),Ml(r,Gg(n.error)),null)}async function $l(r,e){let t=`${r}.backup`;try{await _l.writeFile(t,e,"utf-8")}catch{}}function Ml(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 Gg(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Nl=v(()=>{"use strict";H();l(Ol,"safeRead");l($l,"createBackup");l(Ml,"logCorruption");l(Gg,"formatZodError")});import ht from"node:fs/promises";import tr from"node:path";async function sn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await ht.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(Dl.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=tr.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(tr.relative(r,d))}}return l(o,"walk"),await o(r),t}async function nn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function Ee(r,e=null,t){if(t)return await Ol(r,t)??e;try{let s=await ht.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(A(s))return e;throw s}}async function ce(r,e,t=2){let s=tr.dirname(r);await ht.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await ht.writeFile(r,n,"utf-8")}async function Ae(r,e=""){try{return await ht.readFile(r,"utf-8")}catch(t){if(A(t))return e;throw t}}async function yt(r,e){let t=tr.dirname(r);await ht.mkdir(t,{recursive:!0}),await ht.writeFile(r,e,"utf-8")}async function Ll(r,e){let t=tr.dirname(r);await ht.mkdir(t,{recursive:!0}),await ht.appendFile(r,`${e}
|
|
9
|
+
`,"utf-8")}async function x(r){try{return await ht.access(r),!0}catch(e){if(A(e))return!1;throw e}}async function as(r){try{return(await ht.stat(r)).isDirectory()}catch(e){if(A(e))return!1;throw e}}async function We(r){await ht.mkdir(r,{recursive:!0})}async function cs(r,e={}){try{let s=await ht.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(A(t))return[];throw t}}var J=v(()=>{"use strict";Ei();Nl();H();l(sn,"walkDir");l(nn,"batchProcess");l(Ee,"readJson");l(ce,"writeJson");l(Ae,"readFile");l(yt,"writeFile");l(Ll,"appendLine");l(x,"fileExists");l(as,"dirExists");l(We,"ensureDir");l(cs,"listFiles")});var Ri={};Bt(Ri,{PACKAGE_ROOT:()=>at,VERSION:()=>ve,compareVersions:()=>Fl,getPackageInfo:()=>Wg,getPackageRoot:()=>xi,getVersion:()=>vs,isCompatible:()=>Vg,needsMigration:()=>Bg});import Pi from"node:fs";import Nr from"node:path";function xi(){if(sr)return sr;let r=__dirname;for(let e=0;e<5;e++){let t=Nr.join(r,"package.json");if(Pi.existsSync(t))try{if(JSON.parse(Pi.readFileSync(t,"utf-8")).name==="prjct-cli")return sr=r,r}catch{}r=Nr.dirname(r)}return sr=Nr.join(__dirname,"..","..",".."),sr}function vs(){if(Or)return Or;try{let r=Nr.join(xi(),"package.json"),e=JSON.parse(Pi.readFileSync(r,"utf-8"));return Or=e.version,Ci=e,Or}catch(r){return console.error("Failed to read version from package.json:",y(r)),"0.0.0"}}function Wg(){return Ci||vs(),Ci}function Fl(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Vg(r){let e=vs(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function Bg(r,e=null){let t=e||vs();return Fl(r,t)<0}var Or,Ci,sr,ve,at,Pt=v(()=>{"use strict";H();Or=null,Ci=null,sr=null;l(xi,"getPackageRoot");l(vs,"getVersion");l(Wg,"getPackageInfo");l(Fl,"compareVersions");l(Vg,"isCompatible");l(Bg,"needsMigration");ve=vs(),at=xi()});var Hl={};Bt(Hl,{execAsync:()=>N,execFileAsync:()=>Es});import{exec as Jg,execFile as zg}from"node:child_process";import{promisify as Ul}from"node:util";var N,Es,Ue=v(()=>{"use strict";N=Ul(Jg),Es=Ul(zg)});async function Lr(r){try{let{stdout:e}=await N(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function qg(){let r=await Lr("gh api user --jq .login");return r.success&&r.output||(r=await Lr("git config --global github.user"),r.success&&r.output)?r.output:null}async function Kg(){let r=await Lr("git config user.name");return r.success&&r.output?r.output:null}async function Xg(){let r=await Lr("git config user.email");return r.success&&r.output?r.output:null}async function rn(){let[r,e,t]=await Promise.all([qg(),Kg(),Xg()]);return{github:r,email:t,name:e||r||"Unknown"}}var Fr=v(()=>{"use strict";Ue();l(Lr,"execCommand");l(qg,"detectGitHubUsername");l(Kg,"detectGitName");l(Xg,"detectGitEmail");l(rn,"detect")});var nr=v(()=>{"use strict"});import{z as Ht}from"zod";function Gl(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var vT,ET,PT,on,CT,Ur=v(()=>{"use strict";vT=Ht.enum(["opus","sonnet","haiku"]),ET=Ht.enum(["2.5-pro","2.5-flash","2.0-flash"]),PT=Ht.string().min(1),on=Ht.object({provider:Ht.string(),model:Ht.string(),cliVersion:Ht.string().optional(),recordedAt:Ht.string()}),CT=Ht.object({preferredModel:Ht.string().optional(),lastAnalysisModel:on.optional()});l(Gl,"compareSemver")});function ls(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var an,Ps=v(()=>{"use strict";l(ls,"isExpired");an=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import Yg from"node:fs/promises";import Qg from"node:os";import Wl from"node:path";async function Bl(){try{let r=await Yg.readFile(Vl,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||ls(e.timestamp,ef)?null:e.detection}catch{return null}}async function Jl(r){let e={timestamp:new Date().toISOString(),detection:r};await ce(Vl,e)}var Zg,Vl,ef,zl=v(()=>{"use strict";Ps();J();Zg=Wl.join(Qg.homedir(),".prjct-cli","cache"),Vl=Wl.join(Zg,"providers.json"),ef=600*1e3;l(Bl,"readProviderCache");l(Jl,"writeProviderCache")});var Ct={};Bt(Ct,{AntigravityProvider:()=>ji,ClaudeProvider:()=>Hr,CodexProvider:()=>Ii,CursorProvider:()=>Kl,GeminiProvider:()=>Di,Providers:()=>ct,WindsurfProvider:()=>Xl,detectAllProviders:()=>rr,detectAntigravity:()=>Vr,detectCodex:()=>Cs,detectCursorProject:()=>Zl,detectProvider:()=>Gr,detectWindsurfProject:()=>eu,getActiveProvider:()=>rf,getCapabilities:()=>sf,getCommandsDir:()=>mf,getGlobalContextPath:()=>lf,getGlobalSettingsPath:()=>uf,getProjectCommandsPath:()=>pf,getProviderBranding:()=>Wr,getSkillsPath:()=>df,hasProviderConfig:()=>of,needsCursorRouterRegeneration:()=>af,needsWindsurfRouterRegeneration:()=>cf,selectProvider:()=>$i,validateCliVersion:()=>Ql});import us from"node:os";import He from"node:path";function sf(r,e){return{...tf[r],...e}}async function Yl(r){try{let{stdout:e}=await N(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function nf(r){try{let{stdout:e}=await N(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Gr(r){let e=ct[r];if(!e.cliCommand)return{installed:!1};let t=await Yl(e.cliCommand);if(!t)return{installed:!1};let s=await nf(e.cliCommand),n=Ql(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function Ql(r,e){let t=ct[r];return!t.minCliVersion||!e?null:Gl(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 rr(r=!1){if(!r){let i=await Bl();if(i)return i}let[e,t,s]=await Promise.all([Gr("claude"),Gr("gemini"),Cs()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await Jl(o).catch(()=>{}),o}async function rf(r){if(r&&ct[r])return ct[r];let e=await rr();return e.claude.installed&&!e.gemini.installed?Hr:e.gemini.installed&&!e.claude.installed?Di:Hr}async function of(r){let e=ct[r];return e.configDir?x(e.configDir):!1}function Wr(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function Zl(r){let e=He.join(r,".cursor"),t=He.join(e,"rules"),s=He.join(t,"prjct.mdc"),[n,o]=await Promise.all([x(e),x(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function af(r){let e=await Zl(r);return e.detected&&!e.routerInstalled}async function eu(r){let e=He.join(r,".windsurf"),t=He.join(e,"rules"),s=He.join(t,"prjct.md"),[n,o]=await Promise.all([x(e),x(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function cf(r){let e=await eu(r);return e.detected&&!e.routerInstalled}async function Vr(){let r=ji.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=He.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([x(r),x(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function Cs(){let r=Ii.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await Yl("codex"),t=He.join(r,"skills","prjct","SKILL.md"),s=await x(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function lf(r){let e=ct[r];return e.configDir?He.join(e.configDir,e.contextFile):null}function uf(r){let e=ct[r];return!e.configDir||!e.settingsFile?null:He.join(e.configDir,e.settingsFile)}function df(r){return ct[r].skillsDir}function mf(r){return ct[r].commandsDir}function pf(r,e){let t=ct[r];return He.join(e,t.commandsDir)}async function $i(){let r=await rr(),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 tf,Hr,Di,ji,Kl,Xl,Ii,ct,lt=v(()=>{"use strict";nr();Ur();Ue();J();zl();tf={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(sf,"getCapabilities");Hr={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:He.join(us.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:He.join(us.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},Di={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:He.join(us.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:He.join(us.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},ji={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:He.join(us.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:He.join(us.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Kl={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Xl={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Ii={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:He.join(us.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:He.join(us.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},ct={claude:Hr,gemini:Di,cursor:Kl,antigravity:ji,windsurf:Xl,codex:Ii};l(Yl,"whichCommand");l(nf,"getCliVersion");l(Gr,"detectProvider");l(Ql,"validateCliVersion");l(rr,"detectAllProviders");l(rf,"getActiveProvider");l(of,"hasProviderConfig");l(Wr,"getProviderBranding");l(Zl,"detectCursorProject");l(af,"needsCursorRouterRegeneration");l(eu,"detectWindsurfProject");l(cf,"needsWindsurfRouterRegeneration");l(Vr,"detectAntigravity");l(Cs,"detectCodex");l(lf,"getGlobalContextPath");l(uf,"getGlobalSettingsPath");l(df,"getSkillsPath");l(mf,"getCommandsDir");l(pf,"getProjectCommandsPath");l($i,"selectProvider")});import gf from"node:crypto";import Gt from"node:fs/promises";import Mi from"node:os";import B from"node:path";import{globSync as ff}from"glob";var _i,hf,R,fe=v(()=>{"use strict";z();J();_i=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?B.resolve(e):B.join(Mi.homedir(),".prjct-cli"),this.globalProjectsDir=B.join(this.globalBaseDir,"projects"),this.globalConfigDir=B.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=B.resolve(e),this.globalProjectsDir=B.join(this.globalBaseDir,"projects"),this.globalConfigDir=B.join(this.globalBaseDir,"config")}generateProjectId(e){return gf.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return B.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return B.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return B.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return B.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await as(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await x(t)}async ensureGlobalStructure(){await We(this.globalBaseDir),await We(this.globalProjectsDir),await We(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await We(B.join(t,n));return await We(B.join(t,"planning","tasks")),await We(B.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=Al(t);return B.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await We(s),s}async listSessions(e,t=null,s=null){let n=B.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Gt.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=B.join(n,a.name),u=await Gt.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=B.join(c,d.name),m=await Gt.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:B.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return B.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Gt.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 as(t)}getDisplayPath(e){let t=Mi.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return B.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return B.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return B.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return B.join(this.globalBaseDir,".running")}getDocsPath(){return B.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(lt(),ot(Ct)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),ot(Ct)).getActiveProvider();return(lt(),ot(Ct)).getGlobalSettingsPath(e.name)}getClaudeDir(){return B.join(Mi.homedir(),".claude")}getClaudeSettingsPath(){return B.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return B.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return B.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=B.join(e,n.file);if(await x(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=B.join(e,"package.json");if(await x(n))try{let o=await Gt.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await Gt.readFile(B.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
|
|
10
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=B.join(e,"package.json"),i=await Gt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?n=a.workspaces:a.workspaces?.packages&&(n=a.workspaces.packages),t==="lerna"){let c=B.join(e,"lerna.json");if(await x(c)){let u=await Gt.readFile(c,"utf-8"),d=JSON.parse(u);d.packages&&(n=d.packages)}}}else if(t==="nx")n=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=B.join(e,"package.json"),i=await Gt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(n=a.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let o of n){if(o.startsWith("!"))continue;let i=ff(o,{cwd:e,absolute:!1});for(let a of i){let c=B.join(e,a),u=B.join(c,"package.json");if(await x(u))try{let d=await Gt.readFile(u,"utf-8"),p=JSON.parse(d),m=B.join(c,"PRJCT.md");s.push({name:p.name||B.basename(a),path:c,relativePath:a,hasPrjctMd:await x(m)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=B.resolve(e);for(let n of t.packages){let o=B.resolve(n.path);if(s.startsWith(o))return n}return null}async findMonorepoRoot(e){let t=B.resolve(e),s=B.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=B.dirname(t)}return null}},hf=new _i,R=hf});import Oi from"node:fs/promises";import yf from"node:path";import*as Br from"jsonc-parser";function tu(r){let e=[],t=Br.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${Br.printParseErrorCode(s.error)}`)}return t}var Ni,wf,M,De=v(()=>{"use strict";Jt();H();z();J();Pt();Fr();fe();l(tu,"parseJsonc");Ni=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=R.getLocalConfigPath(e),s=await Oi.readFile(t,"utf-8");return tu(s)}catch(t){return A(t)||console.warn(`Warning: Could not read config at ${e}: ${oe(t)}`),null}}async writeConfig(e,t){let s=R.getLocalConfigPath(e);await ce(s,t)}async readGlobalConfig(e){try{let t=R.getGlobalProjectConfigPath(e),s=await Oi.readFile(t,"utf-8");return tu(s)}catch(t){return A(t)||console.warn(`Warning: Could not read global config for ${e}: ${oe(t)}`),null}}async writeGlobalConfig(e,t){let s=R.getGlobalProjectConfigPath(e);await ce(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=b();t={projectId:e,authors:[],version:ve,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=R.generateProjectId(e),n=R.getGlobalProjectPath(s),o=R.getDisplayPath(n),i=b(),a={projectId:s,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:s,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:ve,created:i,lastSync:i};return await this.writeGlobalConfig(s,c),a}async updateLastSync(e){let t=await this.getProjectId(e),s=await this.readGlobalConfig(t);s&&(s.lastSync=b(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await R.hasLegacyStructure(e))return!1;if(!await R.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=R.getGlobalProjectPath(n.projectId);try{return(await Oi.readdir(yf.join(o,"core"))).length===0}catch(i){return A(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:R.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=b();s.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),s.lastSync=o,await this.writeGlobalConfig(e,s)}async updateAuthorActivity(e,t){let s=await this.readGlobalConfig(e);if(!s||!s.authors)return;let n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=b(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await rn(),s=await this.getProjectId(e);return await this.addAuthor(s,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let s=await this.readConfig(e);s&&(s.showMetrics=t,await this.writeConfig(e,s))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let s=R.generateProjectId(e);return{projectId:s,dataPath:R.getDisplayPath(R.getGlobalProjectPath(s))}}},wf=new Ni,M=wf});import Jr from"node:fs/promises";var Li,kf,xs,zr=v(()=>{"use strict";De();fe();H();Ps();J();Li=class{static{l(this,"ContextBuilder")}_cache;_currentProjectId;constructor(){this._cache=new an({ttl:5e3,maxSize:200}),this._currentProjectId=null}async build(e,t={}){let s=await M.getProjectId(e),n=R.getGlobalProjectPath(s);return this._currentProjectId!==null&&this._currentProjectId!==s&&this._cache.clear(),this._currentProjectId=s,{projectId:s,projectPath:e,globalPath:n,paths:{now:R.getFilePath(s,"core","now.md"),next:R.getFilePath(s,"core","next.md"),context:R.getFilePath(s,"core","context.md"),shipped:R.getFilePath(s,"progress","shipped.md"),metrics:R.getFilePath(s,"progress","metrics.md"),ideas:R.getFilePath(s,"planning","ideas.md"),roadmap:R.getFilePath(s,"planning","roadmap.md"),specs:R.getFilePath(s,"planning","specs"),memory:R.getFilePath(s,"memory","context.jsonl"),patterns:R.getFilePath(s,"memory","patterns.json"),analysis:R.getFilePath(s,"analysis","repo-summary.md"),codePatterns:R.getFilePath(s,"analysis","patterns.md")},params:t,timestamp:new Date().toISOString(),date:new Date().toISOString().split("T")[0]}}async loadState(e,t=null){let s={},n=Object.entries(e.paths),o=t?n.filter(([a])=>t.includes(a)):n;for(let[,a]of o){let c=this._cache.get(a);if(c!==null)try{let u=await Jr.stat(a);(!c.mtime||u.mtimeMs>c.mtime)&&this._cache.delete(a)}catch(u){if(A(u))this._cache.delete(a);else throw u}}let i=[];for(let[a,c]of o){let u=this._cache.get(c);u!==null?s[a]=u.content:i.push([a,c])}if(i.length>0){let a=i.map(async([u,d])=>{try{let[p,m]=await Promise.all([Jr.readFile(d,"utf-8"),Jr.stat(d)]);return{key:u,filePath:d,content:p,mtime:m.mtimeMs}}catch(p){if(A(p))return{key:u,filePath:d,content:null,mtime:null};throw p}}),c=await Promise.all(a);for(let{key:u,filePath:d,content:p,mtime:m}of c)s[u]=p,this._cache.set(d,{content:p,mtime:m})}return s}async loadStateForCommand(e,t){let s={now:["now","next","analysis","codePatterns"],done:["now","next","metrics","analysis"],next:["next","analysis"],ship:["now","shipped","metrics","analysis"],recap:["shipped","metrics","now","analysis"],progress:["shipped","metrics","analysis"],idea:["ideas","next","analysis"],feature:["roadmap","next","ideas","analysis","codePatterns"],roadmap:["roadmap","analysis"],spec:["roadmap","next","specs","analysis","codePatterns"],analyze:["analysis","context","codePatterns"],sync:["analysis","context","now","codePatterns"],work:["now","next","analysis","context","codePatterns"],build:["now","next","analysis","context","codePatterns"],design:["analysis","context","codePatterns"],cleanup:["analysis","context","codePatterns"],fix:["analysis","context","codePatterns"],test:["analysis","context","codePatterns"],default:["analysis","codePatterns"]},n=s[t]||s.default;return this.loadState(e,n)}async batchRead(e){let t=new Map,s=[];for(let n of e){let o=this._cache.get(n);o!==null?t.set(n,o.content):s.push(n)}if(s.length>0){let n=s.map(async i=>{try{let a=await Jr.readFile(i,"utf-8");return{filePath:i,content:a}}catch(a){if(A(a))return{filePath:i,content:null};throw a}}),o=await Promise.all(n);for(let{filePath:i,content:a}of o)t.set(i,a),this._cache.set(i,{content:a,mtime:null})}return t}invalidateCache(e){this._cache.delete(e)}clearCache(){this._cache.clear(),this._currentProjectId=null}async fileExists(e){return x(e)}getCacheStats(){return this._cache.stats()}},kf=new Li,xs=kf});function su(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Fi(){if(su()==="bun")return!0;try{let{execSync:r}=gt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}function Rs(){return su()==="bun"}var or=v(()=>{"use strict";l(su,"detectRuntime");l(Fi,"isBunAvailable");l(Rs,"isBun")});var Kr={};Bt(Kr,{PrjctDatabase:()=>qr,default:()=>I,prjctDb:()=>P});import Ui from"node:fs";import nu from"node:path";function Sf(r){if(Rs()){let{Database:n}=gt("bun:sqlite");return new n(r,{create:!0})}let e=gt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var bf,Tf,qr,P,I,ee=v(()=>{"use strict";fe();or();l(Sf,"openDatabase");bf=[{version:1,name:"initial-schema",up:l(r=>{r.run(`
|
|
13
11
|
-- =======================================================================
|
|
14
12
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
15
13
|
-- =======================================================================
|
|
@@ -373,22 +371,133 @@ var zr=Object.defineProperty;var If=Object.getOwnPropertyDescriptor;var $f=Objec
|
|
|
373
371
|
);
|
|
374
372
|
|
|
375
373
|
CREATE INDEX idx_cc_project ON context_compactions(project_id);
|
|
376
|
-
`)},"up")}
|
|
374
|
+
`)},"up")},{version:10,name:"fts5-memories",up:l(r=>{r.run(`
|
|
375
|
+
-- =======================================================================
|
|
376
|
+
-- Memories: Tagged, searchable memory store (replaces memories.json)
|
|
377
|
+
-- =======================================================================
|
|
378
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
379
|
+
id TEXT PRIMARY KEY,
|
|
380
|
+
project_id TEXT NOT NULL,
|
|
381
|
+
title TEXT NOT NULL,
|
|
382
|
+
content TEXT NOT NULL,
|
|
383
|
+
tags TEXT,
|
|
384
|
+
topic_key TEXT,
|
|
385
|
+
content_hash TEXT,
|
|
386
|
+
user_triggered INTEGER NOT NULL DEFAULT 0,
|
|
387
|
+
revision_count INTEGER NOT NULL DEFAULT 1,
|
|
388
|
+
confidence TEXT,
|
|
389
|
+
observation_count INTEGER DEFAULT 0,
|
|
390
|
+
created_at TEXT NOT NULL,
|
|
391
|
+
updated_at TEXT NOT NULL,
|
|
392
|
+
deleted_at TEXT
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
CREATE INDEX IF NOT EXISTS idx_memories_project ON memories(project_id);
|
|
396
|
+
CREATE INDEX IF NOT EXISTS idx_memories_topic ON memories(topic_key);
|
|
397
|
+
CREATE INDEX IF NOT EXISTS idx_memories_hash ON memories(content_hash);
|
|
398
|
+
CREATE INDEX IF NOT EXISTS idx_memories_deleted ON memories(deleted_at);
|
|
399
|
+
|
|
400
|
+
-- FTS5 virtual table for full-text search with BM25 ranking
|
|
401
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
402
|
+
title, content, tags,
|
|
403
|
+
content='memories', content_rowid='rowid'
|
|
404
|
+
);
|
|
405
|
+
|
|
406
|
+
-- Triggers to keep FTS index in sync
|
|
407
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
408
|
+
INSERT INTO memories_fts(rowid, title, content, tags)
|
|
409
|
+
VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
|
|
410
|
+
END;
|
|
411
|
+
|
|
412
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
413
|
+
INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
|
|
414
|
+
VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
|
|
415
|
+
END;
|
|
416
|
+
|
|
417
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
418
|
+
INSERT INTO memories_fts(memories_fts, rowid, title, content, tags)
|
|
419
|
+
VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
|
|
420
|
+
INSERT INTO memories_fts(rowid, title, content, tags)
|
|
421
|
+
VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
|
|
422
|
+
END;
|
|
423
|
+
`);try{let e=r.prepare("SELECT data FROM kv_store WHERE key = 'memory:memories'").get();if(e){let t=JSON.parse(e.data);if(t.memories&&t.memories.length>0){let s=r.prepare(`
|
|
424
|
+
INSERT OR IGNORE INTO memories
|
|
425
|
+
(id, project_id, title, content, tags, content_hash, user_triggered, confidence, observation_count, created_at, updated_at)
|
|
426
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
427
|
+
`);for(let n of t.memories)s.run(n.id,"_migrated",n.title,n.content,(n.tags||[]).join(","),null,n.userTriggered?1:0,n.confidence??null,n.observationCount??0,n.createdAt,n.updatedAt)}}}catch{}},"up")},{version:11,name:"agent-sessions",up:l(r=>{r.run(`
|
|
428
|
+
-- =======================================================================
|
|
429
|
+
-- Agent Sessions: Track AI agent work sessions across compactions
|
|
430
|
+
-- =======================================================================
|
|
431
|
+
CREATE TABLE IF NOT EXISTS agent_sessions (
|
|
432
|
+
id TEXT PRIMARY KEY,
|
|
433
|
+
project_id TEXT NOT NULL,
|
|
434
|
+
directory TEXT,
|
|
435
|
+
task_id TEXT,
|
|
436
|
+
goal TEXT,
|
|
437
|
+
started_at TEXT NOT NULL,
|
|
438
|
+
ended_at TEXT,
|
|
439
|
+
summary TEXT,
|
|
440
|
+
files_touched TEXT,
|
|
441
|
+
created_at TEXT NOT NULL
|
|
442
|
+
);
|
|
443
|
+
|
|
444
|
+
CREATE INDEX IF NOT EXISTS idx_agent_sessions_project ON agent_sessions(project_id);
|
|
445
|
+
CREATE INDEX IF NOT EXISTS idx_agent_sessions_task ON agent_sessions(task_id);
|
|
446
|
+
|
|
447
|
+
-- =======================================================================
|
|
448
|
+
-- User Prompts: Capture what the user asked (intent tracking)
|
|
449
|
+
-- =======================================================================
|
|
450
|
+
CREATE TABLE IF NOT EXISTS user_prompts (
|
|
451
|
+
id TEXT PRIMARY KEY,
|
|
452
|
+
project_id TEXT NOT NULL,
|
|
453
|
+
session_id TEXT,
|
|
454
|
+
content TEXT NOT NULL,
|
|
455
|
+
created_at TEXT NOT NULL
|
|
456
|
+
);
|
|
457
|
+
|
|
458
|
+
CREATE INDEX IF NOT EXISTS idx_user_prompts_project ON user_prompts(project_id);
|
|
459
|
+
CREATE INDEX IF NOT EXISTS idx_user_prompts_session ON user_prompts(session_id);
|
|
460
|
+
`);try{r.run("ALTER TABLE memories ADD COLUMN session_id TEXT")}catch{}},"up")}],Tf=3,qr=class{static{l(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return nu.join(R.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Tf&&this.evictLru();let s=this.getDbPath(e),n=nu.dirname(s);Ui.existsSync(n)||Ui.mkdirSync(n,{recursive:!0});let o=Sf(s);return o.run("PRAGMA journal_mode = WAL"),o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(s=>s!==e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{t.run("PRAGMA wal_checkpoint(TRUNCATE)")}catch{}}exists(e){return Ui.existsSync(this.getDbPath(e))}getDoc(e,t){let n=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setDoc(e,t,s){let n=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,s,n){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,n??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let n=this.getDb(e);return t?n.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):n.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(s)}query(e,t,...s){return this.getDb(e).prepare(t).all(...s)}run(e,t,...s){this.getDb(e).prepare(t).run(...s)}get(e,t,...s){return this.getDb(e).prepare(t).get(...s)??null}transaction(e,t){let s=this.getDb(e);return s.transaction(t)(s)}runMigrations(e){e.run(`
|
|
377
461
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
378
462
|
version INTEGER PRIMARY KEY,
|
|
379
463
|
name TEXT NOT NULL,
|
|
380
464
|
applied_at TEXT NOT NULL
|
|
381
465
|
)
|
|
382
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of jh)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},C=new Qr,N=C});function eo(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var H,cr=S(()=>{"use strict";H={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"};l(eo,"calculateConfidence")});var Ns,lr,ur,dr=S(()=>{"use strict";re();cr();ie();Ns=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),s=N.getDoc(e,t);return s!==null?(this._data=s,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();N.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},lr=class{static{l(this,"SessionStore")}_sessionMemory=new Map;setSession(e,t){this._sessionMemory.set(e,{value:t,timestamp:Date.now()})}getSession(e){return this._sessionMemory.get(e)?.value}clearSession(){this._sessionMemory.clear()}},ur=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:T(),...t,type:t.type};N.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return N.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var pr,qi=S(()=>{"use strict";re();cr();ie();dr();pr=class r extends Ns{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=T();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=eo(c.count,c.userConfirmed)):(c.value=s,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=T(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=T();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=eo(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=T(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:T(),confidence:eo(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=T(),await this.save(e),!0):!1}async getPreference(e,t,s=null){return(await this.load(e)).preferences[t]?.value??s}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(s=>s.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=N.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return N.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import $h from"node:crypto";import{homedir as Mh}from"node:os";import{join as _h}from"node:path";function ye(){return $h.randomUUID()}var GC,It=S(()=>{"use strict";l(ye,"generateUUID");GC=_h(Mh(),".prjct-cli","projects")});var Ls,Ki=S(()=>{"use strict";It();cr();ie();dr();Ls=class extends Ns{static{l(this,"SemanticMemories")}getFilename(){return"memories.json"}getDefault(){return{version:1,memories:[],index:this._createEmptyIndex()}}afterLoad(e){this._normalizeIndex(e)}_createEmptyIndex(){let e=Object.values(H),t={};for(let s of e)t[s]=[];return t}_normalizeIndex(e){let t=Object.values(H);for(let s of t)e.index[s]||(e.index[s]=[])}_coerceTags(e){let t=new Set(Object.values(H));return e.filter(s=>t.has(s))}async loadMemories(e){return this.load(e)}async saveMemories(e){return this.save(e)}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1}){let i=await this.load(e),a=this._coerceTags(n),c=T(),u={id:ye(),title:t,content:s,tags:a,userTriggered:o,createdAt:c,updatedAt:c};i.memories.push(u);for(let p of a)i.index[p].push(u.id);return await this.save(e),u.id}async updateMemory(e,t,s){let n=await this.load(e),o=n.memories.findIndex(c=>c.id===t);if(o===-1)return!1;let i=n.memories[o],a=i.tags||[];if(s.title&&(i.title=s.title),s.content&&(i.content=s.content),s.tags){let c=this._coerceTags(s.tags);for(let u of a)n.index[u]=n.index[u].filter(p=>p!==t);for(let u of c)n.index[u].push(t);i.tags=c}return i.updatedAt=T(),await this.save(e),!0}async deleteMemory(e,t){let s=await this.load(e),n=s.memories.findIndex(i=>i.id===t);if(n===-1)return!1;let o=s.memories[n];for(let i of o.tags||[])s.index[i]&&(s.index[i]=s.index[i].filter(a=>a!==t));return s.memories.splice(n,1),await this.save(e),!0}async findByTags(e,t,s=!1){let n=await this.load(e),o=this._coerceTags(t);if(s)return n.memories.filter(i=>o.every(a=>(i.tags||[]).includes(a)));{let i=new Set;for(let a of o){let c=n.index[a];for(let u of c)i.add(u)}return n.memories.filter(a=>i.has(a.id))}}async searchMemories(e,t){let s=await this.load(e),n=t.toLowerCase();return s.memories.filter(o=>o.title.toLowerCase().includes(n)||o.content.toLowerCase().includes(n))}async getRelevantMemories(e,t,s=5){return(await this.load(e)).memories.map(i=>{let a=0,c=this._extractContextTags(t);for(let d of i.tags||[])c.includes(d)&&(a+=10);let p=(Date.now()-new Date(i.updatedAt).getTime())/(1e3*60*60*24);a+=Math.max(0,5-p),i.userTriggered&&(a+=5);let m=this._extractKeywords(t);for(let d of m)i.content.toLowerCase().includes(d)&&(a+=2),i.title.toLowerCase().includes(d)&&(a+=3);return{...i,_score:a}}).filter(i=>i._score>0).sort((i,a)=>a._score-i._score).slice(0,s).map(({_score:i,...a})=>a)}async getRelevantMemoriesWithMetrics(e,t){let s=await this.load(e),n=s.memories.length;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i=t.minRelevance??10,c=s.memories.map(d=>{let g={domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:0,userTriggered:0};if(t.taskDomain&&(g.domainMatch=this._getSemanticDomainScore(t.taskDomain,d.tags||[])),t.commandName){let v=this._getCommandTags(t.commandName),D=(d.tags||[]).filter(U=>v.includes(U));g.tagMatch=Math.min(20,D.length*8)}let k=(Date.now()-new Date(d.updatedAt).getTime())/(1e3*60*60*24);if(g.recency=Math.max(0,Math.round(15-k*.5)),d.confidence?g.confidence=d.confidence==="high"?20:d.confidence==="medium"?12:5:d.observationCount&&(g.confidence=Math.min(20,d.observationCount*3)),t.taskDescription){let v=this._extractKeywordsFromText(t.taskDescription),D=0;for(let U of v)d.content.toLowerCase().includes(U)&&(D+=2),d.title.toLowerCase().includes(U)&&(D+=3);g.keywords=Math.min(15,D)}d.userTriggered&&(g.userTriggered=5);let y=g.domainMatch+g.tagMatch+g.recency+g.confidence+g.keywords+g.userTriggered;return{...d,relevanceScore:y,scoreBreakdown:g}}).filter(d=>d.relevanceScore>=i),p=c.sort((d,g)=>g.relevanceScore-d.relevanceScore).slice(0,o),m=p.length>0?Math.round(p.reduce((d,g)=>d+g.relevanceScore,0)/p.length):0;return{memories:p,metrics:{totalMemories:n,memoriesConsidered:c.length,memoriesReturned:p.length,filteringRatio:n>0?p.length/n:0,avgRelevanceScore:m}}}_getSemanticDomainScore(e,t){return 0}_getCommandTags(e){return{ship:[H.COMMIT_STYLE,H.SHIP_WORKFLOW,H.TEST_BEHAVIOR],feature:[H.ARCHITECTURE,H.CODE_STYLE],done:[H.SHIP_WORKFLOW],analyze:[H.TECH_STACK,H.ARCHITECTURE],spec:[H.ARCHITECTURE,H.CODE_STYLE],task:[H.BRANCH_NAMING,H.CODE_STYLE],sync:[H.TECH_STACK,H.ARCHITECTURE,H.DEPENDENCIES],test:[H.TEST_BEHAVIOR],bug:[H.CODE_STYLE,H.TEST_BEHAVIOR]}[e]||[]}_extractKeywordsFromText(e){let t=e.toLowerCase().split(/\s+/),s=new Set(["the","a","an","is","are","to","for","and","or","in","on","at","by","with","from","as","it","this","that","be","have","has"]);return t.filter(n=>n.length>2&&!s.has(n))}_extractContextTags(e){let t=[],s={ship:[H.COMMIT_STYLE,H.SHIP_WORKFLOW,H.TEST_BEHAVIOR],feature:[H.ARCHITECTURE,H.CODE_STYLE],done:[H.SHIP_WORKFLOW],analyze:[H.TECH_STACK,H.ARCHITECTURE],spec:[H.ARCHITECTURE,H.CODE_STYLE]};return e.commandName&&s[e.commandName]&&t.push(...s[e.commandName]),t}_extractKeywords(e){let t=[];e.params?.description&&t.push(...e.params.description.toLowerCase().split(/\s+/)),e.params?.feature&&t.push(...e.params.feature.toLowerCase().split(/\s+/));let s=["the","a","an","is","are","to","for","and","or","in"];return t.filter(n=>n.length>2&&!s.includes(n))}async autoRemember(e,t,s,n=""){let i={commit_footer:[H.COMMIT_STYLE],branch_naming:[H.BRANCH_NAMING],test_before_ship:[H.TEST_BEHAVIOR,H.SHIP_WORKFLOW],preferred_agent:[H.AGENT_PREFERENCE],code_style:[H.CODE_STYLE],verbosity:[H.OUTPUT_VERBOSITY]}[t]||[],a=await this.searchMemories(e,t);a.length>0?await this.updateMemory(e,a[0].id,{content:`${t}: ${s}`,tags:i}):await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
466
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of bf)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},P=new qr,I=P});function Xr(r,e=!1){return e||r>=6?"high":r>=3?"medium":"low"}var Ne,ir=v(()=>{"use strict";Ne={CODE_STYLE:"code_style",NAMING_CONVENTION:"naming_convention",FILE_STRUCTURE:"file_structure",COMMIT_STYLE:"commit_style",BRANCH_NAMING:"branch_naming",TEST_BEHAVIOR:"test_behavior",SHIP_WORKFLOW:"ship_workflow",TECH_STACK:"tech_stack",ARCHITECTURE:"architecture",DEPENDENCIES:"dependencies",OUTPUT_VERBOSITY:"output_verbosity",CONFIRMATION_LEVEL:"confirmation_level",AGENT_PREFERENCE:"agent_preference"};l(Xr,"calculateConfidence")});var Yr,Qr,Zr,Hi=v(()=>{"use strict";ee();ir();z();Yr=class{static{l(this,"CachedStore")}_data=null;_loaded=!1;_projectId=null;getSubdirectory(){return null}getStoreKey(){let e=this.getFilename().replace(".json",""),t=this.getSubdirectory();return t?`memory:${t}:${e}`:`memory:${e}`}async load(e){if(this._loaded&&this._data&&this._projectId===e)return this._data;let t=this.getStoreKey(),s=I.getDoc(e,t);return s!==null?(this._data=s,this.afterLoad(this._data)):this._data=this.getDefault(),this._loaded=!0,this._projectId=e,this._data}afterLoad(e){}async save(e){if(!this._data)return;let t=this.getStoreKey();I.setDoc(e,t,this._data)}getData(){return this._data}setData(e){this._data=e}async update(e,t){let s=await this.load(e),n=t(s);return this._data=n,await this.save(e),n}isLoaded(e){return e?this._loaded&&this._projectId===e:this._loaded}reset(){this._data=null,this._loaded=!1,this._projectId=null}},Qr=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()}},Zr=class{static{l(this,"HistoryStore")}async appendHistory(e,t){let s={ts:b(),...t,type:t.type};I.appendEvent(e,`history.${t.type}`,s)}async getRecentHistory(e,t=20){return I.query(e,"SELECT data, timestamp FROM events WHERE type LIKE 'history.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>JSON.parse(n.data))}}});var eo,ru=v(()=>{"use strict";ee();ir();z();Hi();eo=class r extends Yr{static{l(this,"PatternStore")}static MAX_CONTEXTS=20;static ARCHIVE_AGE_DAYS=90;getFilename(){return"patterns.json"}getDefault(){return{version:1,decisions:{},preferences:{},workflows:{},counters:{}}}afterLoad(e){for(let t of Object.values(e.decisions))Array.isArray(t.contexts)||(t.contexts=[]),t.contexts.length>r.MAX_CONTEXTS&&(t.contexts=t.contexts.slice(-r.MAX_CONTEXTS))}async loadPatterns(e){return this.load(e)}async savePatterns(e){return this.save(e)}async recordDecision(e,t,s,n="",o={}){let i=await this.load(e),a=b();if(!i.decisions[t])i.decisions[t]={value:s,count:1,firstSeen:a,lastSeen:a,confidence:o.userConfirmed?"high":"low",contexts:[n].filter(Boolean),userConfirmed:o.userConfirmed||!1};else{let c=i.decisions[t];c.value===s?(c.count++,c.lastSeen=a,n&&!c.contexts.includes(n)&&(c.contexts.push(n),c.contexts.length>r.MAX_CONTEXTS&&(c.contexts=c.contexts.slice(-r.MAX_CONTEXTS))),o.userConfirmed&&(c.userConfirmed=!0),c.confidence=Xr(c.count,c.userConfirmed)):(c.value=s,c.count=1,c.lastSeen=a,c.userConfirmed=o.userConfirmed||!1,c.confidence=o.userConfirmed?"high":"low")}await this.save(e)}async confirmDecision(e,t){let n=(await this.load(e)).decisions[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=b(),await this.save(e),!0):!1}async getDecision(e,t){let n=(await this.load(e)).decisions[t];return!n||n.confidence==="low"?null:{value:n.value,confidence:n.confidence}}async hasPattern(e,t){return await this.getDecision(e,t)!==null}async recordWorkflow(e,t,s){let n=await this.load(e),o=b();if(!n.workflows[t])n.workflows[t]={...s,count:1,firstSeen:o,lastSeen:o,confidence:"low",userConfirmed:!1};else{let i=n.workflows[t];i.count++,i.lastSeen=o,i.confidence=Xr(i.count,i.userConfirmed)}await this.save(e)}async confirmWorkflow(e,t){let n=(await this.load(e)).workflows[t];return n?(n.userConfirmed=!0,n.confidence="high",n.lastSeen=b(),await this.save(e),!0):!1}async getWorkflow(e,t){let n=(await this.load(e)).workflows[t];return!n||n.count<3?null:n}async setPreference(e,t,s,n={}){let o=await this.load(e),i=o.preferences[t],a=i?i.observationCount+1:1,c=n.userConfirmed||i?.userConfirmed||!1;o.preferences[t]={value:s,updatedAt:b(),confidence:Xr(a,c),observationCount:a,userConfirmed:c},await this.save(e)}async confirmPreference(e,t){let n=(await this.load(e)).preferences[t];return n?(n.userConfirmed=!0,n.confidence="high",n.updatedAt=b(),await this.save(e),!0):!1}async getPreference(e,t,s=null){return(await this.load(e)).preferences[t]?.value??s}async getPatternsSummary(e){let t=await this.load(e);return{decisions:Object.keys(t.decisions).length,learnedDecisions:Object.values(t.decisions).filter(s=>s.confidence!=="low").length,workflows:Object.keys(t.workflows).length,preferences:Object.keys(t.preferences).length}}async getPatternsSummaryDetailed(e){let t=await this.load(e),s={};for(let[i,a]of Object.entries(t.decisions))s[i]={value:a.value,confidence:a.confidence,count:a.count};let n={};for(let[i,a]of Object.entries(t.preferences))n[i]={value:a.value,confidence:a.confidence};let o={};for(let[i,a]of Object.entries(t.workflows))o[i]={confidence:a.confidence??"low",count:a.count};return{decisions:s,preferences:n,workflows:o}}async archiveStaleDecisions(e){let t=await this.load(e),s=Date.now(),n=r.ARCHIVE_AGE_DAYS*24*60*60*1e3,o=[];for(let[a,c]of Object.entries(t.decisions)){let u=new Date(c.lastSeen).getTime();s-u>n&&o.push(a)}if(o.length===0)return 0;let i=I.getDoc(e,"memory:patterns-archive")??{};for(let a of o)i[a]=t.decisions[a],delete t.decisions[a];return I.setDoc(e,"memory:patterns-archive",i),await this.save(e),o.length}}});import vf from"node:crypto";import{homedir as Ef}from"node:os";import{join as Pf}from"node:path";function pe(){return vf.randomUUID()}var Hv,xt=v(()=>{"use strict";l(pe,"generateUUID");Hv=Pf(Ef(),".prjct-cli","projects")});import{createHash as ou}from"node:crypto";function ar(r){return ou("sha256").update(r).digest("hex")}function As(r){return ar(r).slice(0,16)}function iu(r){return ou("md5").update(r).digest("hex")}var Ds=v(()=>{"use strict";l(ar,"sha256");l(As,"sha256Short");l(iu,"md5")});function qt(r){return{id:r.id,title:r.title,content:r.content,tags:r.tags?r.tags.split(",").filter(Boolean):[],userTriggered:r.user_triggered===1,createdAt:r.created_at,updatedAt:r.updated_at,confidence:r.confidence,observationCount:r.observation_count||void 0}}var cn,Gi=v(()=>{"use strict";xt();ee();ir();z();Ds();l(qt,"rowToMemory");cn=class{static{l(this,"SemanticMemories")}_coerceTags(e){let t=new Set(Object.values(Ne));return e.filter(s=>t.has(s))}async createMemory(e,{title:t,content:s,tags:n=[],userTriggered:o=!1,topicKey:i}){let c=this._coerceTags(n).join(","),u=b(),d=As(s),p=I.get(e,"SELECT id FROM memories WHERE project_id = ? AND content_hash = ? AND deleted_at IS NULL",e,d);if(p)return p.id;if(i){let g=I.get(e,"SELECT * FROM memories WHERE project_id = ? AND topic_key = ? AND deleted_at IS NULL",e,i);if(g)return I.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
467
|
+
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,t,s,c,d,u,g.id),g.id}let m=pe();return I.run(e,`INSERT INTO memories
|
|
468
|
+
(id, project_id, title, content, tags, topic_key, content_hash, user_triggered, created_at, updated_at)
|
|
469
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,m,e,t,s,c,i??null,d,o?1:0,u,u),m}async updateMemory(e,t,s){let n=I.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);if(!n)return!1;let o=s.title??n.title,i=s.content??n.content,a=s.tags?this._coerceTags(s.tags).join(","):n.tags,c=s.content?As(i):n.content_hash;return I.run(e,`UPDATE memories SET title = ?, content = ?, tags = ?, content_hash = ?,
|
|
470
|
+
revision_count = revision_count + 1, updated_at = ? WHERE id = ?`,o,i,a,c,b(),t),!0}async deleteMemory(e,t){return I.get(e,"SELECT id FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e)?(I.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",b(),t),!0):!1}async findByTags(e,t,s=!1){let n=this._coerceTags(t);if(n.length===0)return[];let o=n.map(()=>"(tags = ? OR tags LIKE ? OR tags LIKE ? OR tags LIKE ?)"),i=s?" AND ":" OR ",a=o.join(i),c=[e];for(let d of n)c.push(d,`${d},%`,`%,${d},%`,`%,${d}`);return I.query(e,`SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL
|
|
471
|
+
AND (${a}) ORDER BY updated_at DESC`,...c).map(qt)}async searchMemories(e,t,s=20,n=0){try{return I.query(e,`SELECT m.* FROM memories m
|
|
472
|
+
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
473
|
+
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
474
|
+
ORDER BY bm25(memories_fts) LIMIT ? OFFSET ?`,t,e,s,n).map(qt)}catch{let o=`%${t}%`;return I.query(e,`SELECT * FROM memories
|
|
475
|
+
WHERE project_id = ? AND deleted_at IS NULL
|
|
476
|
+
AND (title LIKE ? OR content LIKE ?)
|
|
477
|
+
ORDER BY updated_at DESC LIMIT ? OFFSET ?`,e,o,o,s,n).map(qt)}}async getRelevantMemories(e,t,s=5){let n=[];if(t.commandName&&n.push(t.commandName),t.params?.description&&n.push(String(t.params.description)),t.params?.task&&n.push(String(t.params.task)),t.params?.feature&&n.push(String(t.params.feature)),n.length===0)return I.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(qt);let o=n.join(" ");try{return I.query(e,`SELECT m.* FROM memories m
|
|
478
|
+
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
479
|
+
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL
|
|
480
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,o,e,s).map(qt)}catch{return I.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC LIMIT ?",e,s).map(qt)}}async getRelevantMemoriesWithMetrics(e,t){let n=I.get(e,"SELECT COUNT(*) as count FROM memories WHERE project_id = ? AND deleted_at IS NULL",e)?.count??0;if(n===0)return{memories:[],metrics:{totalMemories:0,memoriesConsidered:0,memoriesReturned:0,filteringRatio:0,avgRelevanceScore:0}};let o=t.maxResults??10,i={};t.commandName&&(i.commandName=t.commandName),t.taskDescription&&(i.params={description:t.taskDescription});let c=(await this.getRelevantMemories(e,i,o)).map((d,p)=>({...d,relevanceScore:Math.max(10,100-p*10),scoreBreakdown:{domainMatch:0,tagMatch:0,recency:0,confidence:0,keywords:Math.max(10,100-p*10),userTriggered:d.userTriggered?5:0}})),u=c.length>0?Math.round(c.reduce((d,p)=>d+p.relevanceScore,0)/c.length):0;return{memories:c,metrics:{totalMemories:n,memoriesConsidered:n,memoriesReturned:c.length,filteringRatio:n>0?c.length/n:0,avgRelevanceScore:u}}}async autoRemember(e,t,s,n=""){let i={commit_footer:[Ne.COMMIT_STYLE],branch_naming:[Ne.BRANCH_NAMING],test_before_ship:[Ne.TEST_BEHAVIOR,Ne.SHIP_WORKFLOW],preferred_agent:[Ne.AGENT_PREFERENCE],code_style:[Ne.CODE_STYLE],verbosity:[Ne.OUTPUT_VERBOSITY]}[t]||[];await this.createMemory(e,{title:`Preference: ${t}`,content:`${t}: ${s}${n?`
|
|
481
|
+
Context: ${n}`:""}`,tags:i,userTriggered:!0,topicKey:`preference:${t}`})}async findSimilar(e,t,s=5){let n=await this.getMemoryById(e,t);if(!n)return[];let o=n.title.split(/\s+/).filter(a=>a.length>2).slice(0,8);if(o.length===0)return[];let i=o.join(" OR ");try{return I.query(e,`SELECT m.* FROM memories m
|
|
482
|
+
JOIN memories_fts fts ON m.rowid = fts.rowid
|
|
483
|
+
WHERE memories_fts MATCH ? AND m.project_id = ? AND m.deleted_at IS NULL AND m.id != ?
|
|
484
|
+
ORDER BY bm25(memories_fts) LIMIT ?`,i,e,t,s).map(qt)}catch{return[]}}async consolidateMemories(e){let t={merged:0,groups:[]},s=I.query(e,`SELECT title, COUNT(*) as cnt FROM memories
|
|
485
|
+
WHERE project_id = ? AND deleted_at IS NULL
|
|
486
|
+
GROUP BY title HAVING cnt > 1`,e),n=b();for(let o of s){let i=I.query(e,`SELECT * FROM memories
|
|
487
|
+
WHERE project_id = ? AND title = ? AND deleted_at IS NULL
|
|
488
|
+
ORDER BY updated_at DESC`,e,o.title);if(i.length<2)continue;let[a,...c]=i,u=[a.content,...c.filter(m=>m.content!==a.content).map(m=>m.content)].filter((m,g,h)=>h.indexOf(m)===g).join(`
|
|
489
|
+
|
|
490
|
+
---
|
|
387
491
|
|
|
388
|
-
|
|
492
|
+
`),d=new Set;for(let m of i)if(m.tags)for(let g of m.tags.split(",").filter(Boolean))d.add(g);(u!==a.content||d.size>0)&&I.run(e,"UPDATE memories SET content = ?, tags = ?, revision_count = revision_count + 1, updated_at = ? WHERE id = ?",u,Array.from(d).join(","),n,a.id);let p=[];for(let m of c)I.run(e,"UPDATE memories SET deleted_at = ? WHERE id = ?",n,m.id),p.push(m.id);t.merged+=c.length,t.groups.push({kept:a.id,merged:p})}return t}async getMemoryById(e,t){let s=I.get(e,"SELECT * FROM memories WHERE id = ? AND project_id = ? AND deleted_at IS NULL",t,e);return s?qt(s):null}async getAllMemories(e){return I.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL ORDER BY updated_at DESC",e).map(qt)}async getMemoryStats(e){let t=I.query(e,"SELECT * FROM memories WHERE project_id = ? AND deleted_at IS NULL",e),s={};for(let n of t){let o=n.tags?n.tags.split(",").filter(Boolean):[];for(let i of o)s[i]=(s[i]||0)+1}return{totalMemories:t.length,userTriggered:t.filter(n=>n.user_triggered===1).length,tagCounts:s,oldestMemory:t[t.length-1]?.created_at,newestMemory:t[0]?.created_at}}async loadMemories(e){return{version:1,memories:await this.getAllMemories(e),index:{}}}async saveMemories(e){}reset(){}}});var Wi,Cf,Ze,to=v(()=>{"use strict";Hi();ru();Gi();Wi=class{static{l(this,"MemorySystem")}_semanticMemories;_patternStore;_historyStore;_sessionStore;constructor(){this._semanticMemories=new cn,this._patternStore=new eo,this._historyStore=new Zr,this._sessionStore=new Qr}loadMemories(e){return this._semanticMemories.loadMemories(e)}saveMemories(e){return this._semanticMemories.saveMemories(e)}createMemory(e,t){return this._semanticMemories.createMemory(e,t)}updateMemory(e,t,s){return this._semanticMemories.updateMemory(e,t,s)}deleteMemory(e,t){return this._semanticMemories.deleteMemory(e,t)}findByTags(e,t,s){return this._semanticMemories.findByTags(e,t,s)}searchMemories(e,t){return this._semanticMemories.searchMemories(e,t)}getRelevantMemories(e,t,s){return this._semanticMemories.getRelevantMemories(e,t,s)}autoRemember(e,t,s,n){return this._semanticMemories.autoRemember(e,t,s,n)}getAllMemories(e){return this._semanticMemories.getAllMemories(e)}findSimilar(e,t,s){return this._semanticMemories.findSimilar(e,t,s)}consolidateMemories(e){return this._semanticMemories.consolidateMemories(e)}getMemoryStats(e){return this._semanticMemories.getMemoryStats(e)}getRelevantMemoriesWithMetrics(e,t){return this._semanticMemories.getRelevantMemoriesWithMetrics(e,t)}setSession(e,t){this._sessionStore.setSession(e,t)}getSession(e){return this._sessionStore.getSession(e)}clearSession(){this._sessionStore.clearSession()}loadPatterns(e){return this._patternStore.loadPatterns(e)}savePatterns(e){return this._patternStore.savePatterns(e)}recordDecision(e,t,s,n){return this._patternStore.recordDecision(e,t,s,n)}getDecision(e,t){return this._patternStore.getDecision(e,t)}hasPattern(e,t){return this._patternStore.hasPattern(e,t)}recordWorkflow(e,t,s){return this._patternStore.recordWorkflow(e,t,s)}getWorkflow(e,t){return this._patternStore.getWorkflow(e,t)}setPreference(e,t,s,n){return this._patternStore.setPreference(e,t,s,n)}getPreference(e,t,s){return this._patternStore.getPreference(e,t,s)}confirmPreference(e,t){return this._patternStore.confirmPreference(e,t)}confirmDecision(e,t){return this._patternStore.confirmDecision(e,t)}confirmWorkflow(e,t){return this._patternStore.confirmWorkflow(e,t)}getPatternsSummary(e){return this._patternStore.getPatternsSummary(e)}getPatternsSummaryDetailed(e){return this._patternStore.getPatternsSummaryDetailed(e)}archiveStaleDecisions(e){return this._patternStore.archiveStaleDecisions(e)}appendHistory(e,t){return this._historyStore.appendHistory(e,t)}getRecentHistory(e,t){return this._historyStore.getRecentHistory(e,t)}async getSmartDecision(e,t){let s=this.getSession(`decision:${t}`);if(s!==void 0)return s;let n=await this.getDecision(e,t);return n?n.value:null}async learnDecision(e,t,s,n=""){this.setSession(`decision:${t}`,s),await this.recordDecision(e,t,s,n),await this.appendHistory(e,{type:"decision",key:t,value:s,context:n})}resetState(){this._sessionStore.clearSession(),this._semanticMemories.reset(),this._patternStore.reset()}},Cf=new Wi,Ze=Cf});import Rt from"node:fs/promises";import $t from"node:path";var Vi,xf,Ve,au=v(()=>{"use strict";H();Ue();J();Vi=class{static{l(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=$t.join(this.projectPath,"package.json"),t=await Rt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(A(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=$t.join(this.projectPath,"Cargo.toml");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readRequirements(){try{let e=$t.join(this.projectPath,"requirements.txt");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readGoMod(){try{let e=$t.join(this.projectPath,"go.mod");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readGemfile(){try{let e=$t.join(this.projectPath,"Gemfile");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readMixExs(){try{let e=$t.join(this.projectPath,"mix.exs");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readPomXml(){try{let e=$t.join(this.projectPath,"pom.xml");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async readComposerJson(){try{let e=$t.join(this.projectPath,"composer.json"),t=await Rt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(A(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=$t.join(this.projectPath,"pyproject.toml");return await Rt.readFile(e,"utf-8")}catch(e){if(A(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await N('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(`
|
|
493
|
+
`).filter(Boolean).forEach(s=>{let n=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);n&&(t[n[2]]=parseInt(n[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Rt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(s=>t.some(n=>n.test(s)))}catch(e){if(A(e))return[];throw e}}async listDirectories(){try{return(await Rt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(A(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await N(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await N("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await N('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await N('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:s.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await N('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return x($t.join(this.projectPath,e))}async readFile(e){try{let t=$t.join(this.projectPath,e);return await Rt.readFile(t,"utf-8")}catch(t){if(A(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await N(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
494
|
+
`).filter(Boolean)}catch{return[]}}},xf=new Vi,Ve=xf});import Ji from"node:fs";import Rf from"node:fs/promises";import so from"node:path";function zi(){if(cu)return Bi;cu=!0;let r=so.join(at,"dist","templates.json");try{let e=Ji.readFileSync(r,"utf-8");return Bi=JSON.parse(e),Bi}catch{return null}}function Df(r){let e=js.indexOf(r);e>-1&&js.splice(e,1),js.push(r)}function jf(){for(;ln.size>=Af&&js.length>0;){let r=js.shift();r&&ln.delete(r)}}function lu(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,s,n]=t,o={};return s.split(`
|
|
495
|
+
`).forEach(i=>{let[a,...c]=i.split(":");if(a&&c.length>0){let u=c.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:n.trim()}}async function uu(r){if(ln.has(r))return Df(r),ln.get(r);let e,t=zi();if(t){let n=`commands/${r}.md`;e=t[n]}if(!e){let n=so.join(at,"templates","commands",`${r}.md`);try{e=await Rf.readFile(n,"utf-8")}catch{throw _r.notFound(r)}}let s=lu(e);return jf(),ln.set(r,s),js.push(r),s}async function If(r){return(await uu(r)).frontmatter["allowed-tools"]||[]}function $f(){ln.clear(),js.length=0}function dt(r){let e=zi();if(e?.[r])return e[r];let t=so.join(at,"templates",r);try{return Ji.readFileSync(t,"utf-8")}catch{return null}}function un(r){let e=zi();if(e)return Object.keys(e).filter(s=>s.startsWith(r));let t=so.join(at,"templates",r);try{return Ji.readdirSync(t).map(n=>`${r}${n}`)}catch{return[]}}var Af,ln,js,Bi,cu,Mf,du,Is=v(()=>{"use strict";Jt();Pt();Af=50,ln=new Map,js=[],Bi=null,cu=!1;l(zi,"loadBundle");l(Df,"updateLruOrder");l(jf,"evictLru");l(lu,"parseFrontmatter");l(uu,"load");l(If,"getAllowedTools");l($f,"clearCache");l(dt,"getTemplateContent");l(un,"listTemplates");Mf={load:uu,parseFrontmatter:lu,getAllowedTools:If,clearCache:$f,getTemplateContent:dt,listTemplates:un},du=Mf});function Of(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(_f.has(r)||r.includes("prjct"))return{level:dn.debug,name:"debug"};let e=dn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function no(r,e,t){return mu>=r?(...s)=>console[t](e,...s):Lf}var dn,_f,mu,Nf,Lf,Ff,G,Kt=v(()=>{"use strict";dn={error:0,warn:1,info:2,debug:3},_f=new Set(["1","true","*"]);l(Of,"getLogLevel");({level:mu,name:Nf}=Of()),Lf=l(()=>{},"noop");l(no,"createLogMethod");Ff={error:no(dn.error,"[prjct:error]","error"),warn:no(dn.warn,"[prjct:warn]","warn"),info:no(dn.info,"[prjct:info]","log"),debug:no(dn.debug,"[prjct:debug]","log"),isEnabled:l(()=>mu>=0,"isEnabled"),level:l(()=>Nf,"level")},G=Ff});function ro(r,e,t,s){if(!r)return{content:e,action:"created"};if(!(r.includes(t)&&r.includes(s)))return{content:`${r}
|
|
496
|
+
|
|
497
|
+
${e}`,action:"appended"};let o=r.substring(0,r.indexOf(t)),i=r.substring(r.indexOf(s)+s.length),a;return e.includes(t)&&e.includes(s)?a=e.substring(e.indexOf(t),e.indexOf(s)+s.length):a=e,{content:o+a+i,action:"updated"}}var qi=v(()=>{"use strict";Is();H();J();Kt();Pt();l(ro,"mergeWithMarkers")});import Ke from"node:fs/promises";import oo from"node:os";import ye from"node:path";async function Uf(){try{let r=ye.join(oo.homedir(),".prjct-cli","docs");await Ke.mkdir(r,{recursive:!0});let e=un("global/docs/");if(e.length>0){for(let n of e)if(n.endsWith(".md")){let o=dt(n);if(o){let i=ye.basename(n);await Ke.writeFile(ye.join(r,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(Pt(),ot(Ri)),s=ye.join(t,"templates/global/docs");try{let n=await Ke.readdir(s);for(let o of n)if(o.endsWith(".md")){let i=ye.join(s,o),a=ye.join(r,o),c=await Ke.readFile(i,"utf-8");await Ke.writeFile(a,c,"utf-8")}}catch{}return{success:!0}}catch(r){return{success:!1,error:y(r)}}}async function Hf(){let r=(lt(),ot(Ct)),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 Ke.mkdir(e.configDir,{recursive:!0});let n=ye.join(e.configDir,e.contextFile),o=pu;if(t!=="claude"){let g=dt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:h}=(Pt(),ot(Ri)),S=ye.join(h,"templates","global",e.contextFile);try{o=await Ke.readFile(S,"utf-8")}catch{t==="gemini"&&(o=pu.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await Ke.readFile(n,"utf-8"),a=!0}catch(g){if(A(g))a=!1;else throw g}let c="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(c)&&i.includes(u)){let g=i.substring(0,i.indexOf(c)),h=i.substring(i.indexOf(u)+u.length);i=`${(g+h).replace(/\n{3,}/g,`
|
|
389
498
|
|
|
390
499
|
`).trim()}
|
|
391
|
-
`}let
|
|
500
|
+
`}let m=ro(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Ke.writeFile(n,m.content,"utf-8"),{success:!0,action:m.action,path:n}}catch(n){return{success:!1,error:y(n),action:"failed"}}}function gu(){let r=oo.homedir();return{claude:{commands:ye.join(r,".claude","commands"),config:ye.join(r,".claude"),router:ye.join(r,".claude","commands","p.md")},gemini:{commands:ye.join(r,".gemini","commands"),config:ye.join(r,".gemini"),router:ye.join(r,".gemini","commands","p.toml")}}}var pu,Xt,Gf,Pe,Yt=v(()=>{"use strict";Is();H();J();qi();pu=`<!-- prjct:start - DO NOT REMOVE THIS MARKER -->
|
|
392
501
|
# p/ \u2014 Context layer for AI agents
|
|
393
502
|
|
|
394
503
|
Skills auto-activate for: task, done, pause, resume, ship, next, sync, bug, workflow, enrich, linear, jira, plan, velocity, tokens
|
|
@@ -404,22 +513,22 @@ Data:
|
|
|
404
513
|
|
|
405
514
|
**Auto-managed by prjct-cli** | https://prjct.app
|
|
406
515
|
<!-- prjct:end - DO NOT REMOVE THIS MARKER -->
|
|
407
|
-
`;l(
|
|
516
|
+
`;l(Uf,"installDocs");l(Hf,"installGlobalConfig");Xt=class{static{l(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=oo.homedir()}async ensureInit(){if(this._initialized)return;let t=await(lt(),ot(Ct)).getActiveProvider();this.commandsPath=ye.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),x(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(lt(),ot(Ct)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=ye.join(this.commandsPath,t);try{await Ke.unlink(s),e.push(t)}catch(n){if(n.code!=="ENOENT")return{success:!1,error:y(n)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:y(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:y(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=ye.join(this.commandsPath,t);try{await Ke.unlink(s),e=!0}catch(n){n.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=ye.join(this.commandsPath,"p");try{if((await Ke.stat(e).catch(()=>null))?.isDirectory())return await Ke.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Hf()}async cleanupAllLegacy(){let e=oo.homedir(),t=[],s=[ye.join(e,".claude","commands","p.md"),ye.join(e,".claude","commands","p.toml"),ye.join(e,".gemini","commands","p.md"),ye.join(e,".gemini","commands","p.toml")];for(let i of s)try{await Ke.unlink(i),t.push(i)}catch{}let n=[ye.join(e,".claude","commands","p"),ye.join(e,".gemini","commands","p")];for(let i of n)try{(await Ke.stat(i).catch(()=>null))?.isDirectory()&&(await Ke.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[ye.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await Ke.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Uf()}};l(gu,"getProviderPaths");Gf=new Xt,Pe=Gf});import{z as je}from"zod";function wu(r,e="default"){let t=fu[e]||fu.default;return r/1e3*t}function io(r){return r<.01?`$${(r*100).toFixed(2)}\xA2`:`$${r.toFixed(2)}`}var Wf,Vf,hu,yu,fu,ao=v(()=>{"use strict";Wf=je.object({date:je.string(),tokensSaved:je.number(),syncs:je.number(),avgCompressionRate:je.number(),totalDuration:je.number()}),Vf=je.object({agentName:je.string(),usageCount:je.number(),tokensSaved:je.number()}),hu=je.object({totalTokensSaved:je.number(),avgCompressionRate:je.number(),syncCount:je.number(),watchTriggers:je.number(),avgSyncDuration:je.number(),totalSyncDuration:je.number(),agentUsage:je.array(Vf),dailyStats:je.array(Wf),firstSync:je.string(),lastUpdated:je.string()}),yu={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},fu={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};l(wu,"estimateCostSaved");l(io,"formatCost")});function ku(r,e){let t=[];cr("Languages",r.languages,e.languages,t),cr("Frameworks",r.frameworks,e.frameworks,t),(r.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:r.packageManager??"(none)",after:e.packageManager??"(none)"}),(r.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:r.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(r.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:r.testDir??"(none)",after:e.testDir??"(none)"}),cr("Config files",r.configFiles,e.configFiles,t),r.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(r.fileCount),after:String(e.fileCount)});let s=r.patterns.map(d=>d.name),n=e.patterns.map(d=>d.name);cr("Patterns",s,n,t);let o=r.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);cr("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,c=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:a,removed:c,changed:u},beforeCommit:r.commitHash??null,afterCommit:e.commitHash??null}}function Ki(r){if(!r.hasChanges)return`## Analysis Diff
|
|
408
517
|
|
|
409
518
|
No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r.afterCommit)&&e.push(`> \`${r.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${r.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of r.items){let n=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${n} | ${s.field} | ${o} |`)}e.push("");let t=[];return r.summary.added>0&&t.push(`${r.summary.added} added`),r.summary.removed>0&&t.push(`${r.summary.removed} removed`),r.summary.changed>0&&t.push(`${r.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
|
|
410
|
-
`)}function
|
|
411
|
-
`)}function hr(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var ca=S(()=>{"use strict";l(Nu,"generateAnalysisDiff");l(aa,"formatAnalysisDiffMd");l(Lu,"formatAnalysisDiffText");l(hr,"diffStringArray")});var la,ua,Fu,yr=S(()=>{"use strict";la=[1,2,3,5,8,13,21],ua={1:{min:5,max:15,typical:10},2:{min:15,max:30,typical:20},3:{min:30,max:60,typical:45},5:{min:60,max:120,typical:90},8:{min:120,max:240,typical:180},13:{min:240,max:480,typical:360},21:{min:480,max:960,typical:720}},Fu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import oy from"node:fs/promises";import iy from"node:path";function yn(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function ay(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let d of s)t.push(...yn(d));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let d of n){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...yn(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let d of o){let g;for(;(g=d.exec(r))!==null;)g[1]&&t.push(...yn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let d=a[1];if(d.startsWith(".")||d.startsWith("@/"))t.push(...yn(d));else{let g=d.startsWith("@")?d.split("/").slice(0,2).join("/"):d.split("/")[0];t.push(...yn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let d=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...d)}let p=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=p.exec(r))!==null;){let d=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...d)}return t.filter(d=>d.length>1&&!Gu.has(d)&&/^[a-z][a-z0-9]*$/.test(d))}function cy(r){return r.split(/\s+/).flatMap(e=>yn(e)).filter(e=>e.length>1&&!Gu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function ly(r){let e=await Is(r),t={},s={},n=0,o=await $s(e,50,async a=>{try{let c=await oy.readFile(iy.join(r,a),"utf-8"),u=ay(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let p of c)u.set(p,(u.get(p)||0)+1);for(let[p,m]of u)s[p]||(s[p]=[]),s[p].push({path:a,tf:m})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function uy(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function dy(r,e){let t=cy(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=uy(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let p=c*(1.2+1),m=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),d=i*(p/m);s.set(a,(s.get(a)||0)+d)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function py(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};N.setDoc(r,Wu,t)}function po(r){let e=N.getDoc(r,Wu);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Vu(r,e){let t=await ly(r);return py(e,t),t}function Bu(r,e,t=15){let s=po(r);return s?dy(e,s).slice(0,t):[]}var Gu,Wu,da=S(()=>{"use strict";yr();re();K();Gu=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);l(yn,"splitIdentifier");l(ay,"tokenizeFile");l(cy,"tokenizeQuery");l(ly,"buildIndex");l(uy,"idf");l(dy,"score");Wu="bm25-index";l(py,"saveIndex");l(po,"loadIndex");l(Vu,"indexProject");l(Bu,"queryFiles")});import pa from"node:fs/promises";import ys from"node:path";import{z as X}from"zod";async function yy(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=ys.join(e,"package.json"),n=await pa.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let p=u.toLowerCase();Object.keys(i).some(d=>d.toLowerCase().includes(p))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return R(s)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function wy(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await Ty(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=hy[a];if(!c)continue;c.some(p=>n.has(p))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ky(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=ys.join(e,a);await P(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function Sy(r,e){let t=Date.now();try{let s=await vy(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function by(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=ys.join(e,o.file);await P(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function zu(r,e){let t=Date.now(),s=await Promise.all([yy(r,e),wy(r,e),ky(r,e),Sy(r,e),by(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function Ty(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await pa.readdir(n,{withFileTypes:!0});for(let i of o){let a=ys.join(n,i.name),c=ys.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=ys.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function vy(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await pa.readdir(n,{withFileTypes:!0});for(let i of o){let a=ys.join(n,i.name),c=ys.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var my,gy,fy,ma,hE,hy,Ju=S(()=>{"use strict";W();K();Jr();my=X.enum(["draft","verified","sealed"]),gy=X.object({name:X.string(),description:X.string(),location:X.string().optional(),severity:X.enum(["low","medium","high"]).optional(),language:X.string().optional(),framework:X.string().optional(),source:X.enum(["baseline","repo","context7","feedback"]).optional(),confidence:X.number().min(0).max(1).optional()}),fy=X.object({issue:X.string(),file:X.string(),suggestion:X.string(),severity:X.enum(["low","medium","high"]).optional(),language:X.string().optional(),framework:X.string().optional(),source:X.enum(["baseline","repo","context7","feedback"]).optional(),confidence:X.number().min(0).max(1).optional()}),ma=X.object({projectId:X.string(),languages:X.array(X.string()),frameworks:X.array(X.string()),packageManager:X.string().optional(),sourceDir:X.string().optional(),testDir:X.string().optional(),configFiles:X.array(X.string()),fileCount:X.number(),patterns:X.array(gy),antiPatterns:X.array(fy),analyzedAt:X.string(),modelMetadata:un.optional(),status:my.default("draft"),commitHash:X.string().optional(),signature:X.string().optional(),sealedAt:X.string().optional(),verifiedAt:X.string().optional()}),hE={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},hy={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};l(yy,"verifyFrameworks");l(wy,"verifyLanguages");l(ky,"verifyPatternLocations");l(Sy,"verifyFileCount");l(by,"verifyAntiPatternFiles");l(zu,"semanticVerify");l(Ty,"getProjectExtensions");l(vy,"countProjectFiles")});import{createHash as qu}from"node:crypto";function wr(r){return qu("sha256").update(r).digest("hex")}function mo(r){return wr(r).slice(0,16)}function Ku(r){return qu("md5").update(r).digest("hex")}var wn=S(()=>{"use strict";l(wr,"sha256");l(mo,"sha256Short");l(Ku,"md5")});var ga,ws,fa=S(()=>{"use strict";Te();ie();K();ga=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await xe(t,[])??[];s.push(e),await le(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await xe(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await le(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:T(),success:!0};await le(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await xe(t,null)}},ws=new ga});var qe,is=S(()=>{"use strict";fa();Ms();ie();re();qe=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new dn({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=C.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){C.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:T(),projectId:e};await ws.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:T()};await this.publishEvent(e,o,i)}async exists(e){try{return C.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var ha,Ke,kn=S(()=>{"use strict";Ju();ca();ie();wn();is();ha=class extends qe{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};ma.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:T()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let s=this.computeSignature(t.draft),n=T(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return ma.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=T();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Nu(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await zu(n,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return wr(JSON.stringify(t))}},Ke=new ha});var ya,Cy,Lt,kr=S(()=>{"use strict";ie();re();ya=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=C.getDb(e),n=T();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=C.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?C.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return C.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},Cy=new ya,Lt=Cy});import{z as b}from"zod";var Py,go,Ey,xy,Ry,wa,Yu,Qu,Zu,ed,Xu,Ay,Dy,td,sd,nd,jy,Iy,BE,ka=S(()=>{"use strict";Jr();Py=b.enum(["low","medium","high","critical"]),go=b.enum(["feature","bug","improvement","chore"]),Ey=b.enum(["active","backlog","previously_active"]),xy=b.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ry=b.enum(["task_completed","feature_shipped","idea_captured","session_started"]),wa=b.object({title:b.string(),description:b.string(),filesChanged:b.array(b.object({path:b.string(),action:b.enum(["created","modified","deleted"])})),whatWasDone:b.array(b.string()).min(1),outputForNextAgent:b.string().min(1),notes:b.string().optional()}),Yu=b.object({output:b.string().min(1,"Subtask output is required"),summary:wa}),Qu=b.object({id:b.string(),description:b.string(),domain:b.string(),agent:b.string(),status:xy,dependsOn:b.array(b.string()),startedAt:b.string().optional(),completedAt:b.string().optional(),output:b.string().optional(),summary:wa.optional(),skipReason:b.string().optional(),blockReason:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional()}),Zu=b.object({completed:b.number(),total:b.number(),percentage:b.number()}),ed=b.object({id:b.string(),description:b.string(),type:go.optional(),startedAt:b.string(),sessionId:b.string(),featureId:b.string().optional(),subtasks:b.array(Qu).optional(),currentSubtaskIndex:b.number().optional(),subtaskProgress:Zu.optional(),linearId:b.string().optional(),linearUuid:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional(),modelMetadata:un.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional(),parentDescription:b.string().optional(),branch:b.string().optional(),prUrl:b.string().optional()}),Xu=b.object({id:b.string(),description:b.string(),status:b.literal("paused"),startedAt:b.string(),pausedAt:b.string(),pauseReason:b.string().optional(),type:go.optional(),sessionId:b.string().optional(),featureId:b.string().optional(),subtasks:b.array(Qu).optional(),currentSubtaskIndex:b.number().optional(),subtaskProgress:Zu.optional(),linearId:b.string().optional(),linearUuid:b.string().optional(),estimatedPoints:b.number().optional(),estimatedMinutes:b.number().optional(),modelMetadata:un.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional()}),Ay=b.object({stackConfirmed:b.array(b.string()).optional(),patternsDiscovered:b.array(b.string()).optional(),agentAccuracy:b.array(b.object({agent:b.string(),rating:b.enum(["helpful","neutral","inaccurate"]),note:b.string().optional()})).optional(),issuesEncountered:b.array(b.string()).optional()}),Dy=b.object({taskId:b.string(),title:b.string(),classification:go,startedAt:b.string(),completedAt:b.string(),subtaskCount:b.number(),subtaskSummaries:b.array(wa),outcome:b.string(),branchName:b.string(),linearId:b.string().optional(),linearUuid:b.string().optional(),prUrl:b.string().optional(),feedback:Ay.optional(),tokensIn:b.number().optional(),tokensOut:b.number().optional()}),td=b.object({currentTask:ed.nullable(),previousTask:Xu.nullable().optional(),pausedTasks:b.array(Xu).optional(),taskHistory:b.array(Dy).optional(),lastUpdated:b.string()}),sd=b.object({id:b.string(),description:b.string(),priority:Py,type:go,featureId:b.string().optional(),originFeature:b.string().optional(),completed:b.boolean(),completedAt:b.string().optional(),createdAt:b.string(),section:Ey,agent:b.string().optional(),groupName:b.string().optional(),groupId:b.string().optional()}),nd=b.object({tasks:b.array(sd),lastUpdated:b.string()}),jy=b.object({tasksToday:b.number(),tasksThisWeek:b.number(),streak:b.number(),velocity:b.string(),avgDuration:b.string()}),Iy=b.object({type:Ry,description:b.string(),timestamp:b.string(),duration:b.string().optional()}),BE=b.object({projectId:b.string(),currentTask:ed.nullable(),queue:b.array(sd),stats:jy,recentActivity:b.array(Iy),lastSync:b.string()})});var Sr,Sa,Gs,ba=S(()=>{"use strict";Sr={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},Sa=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let s=Sr[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return Sr[e]}getPrompt(e){return Sr[e].prompt}getValidCommands(e){return Sr[e].transitions}formatNextSteps(e){return Sr[e].transitions.map(s=>{switch(s){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${s}`}})}},Gs=new Sa});var as,Ta,Mt,Ws=S(()=>{"use strict";It();ie();re();as={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Ta=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=ye(),n=T();return C.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=T();return C.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(ye(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?C.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):C.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=C.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=C.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(C.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);C.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return C.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Mt=new Ta});var va,_,Pt=S(()=>{"use strict";It();ka();ie();ba();Ws();is();va=class extends qe{static{l(this,"StateStorage")}constructor(){super("state.json",td)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=Gs.getCurrentState(e),n=Gs.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:T()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:T()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:T()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=T(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:T(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:T()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,h)=>h!==o),{status:c,pausedAt:u,pauseReason:p,...m}=i,d={...m,startedAt:T(),sessionId:i.sessionId??ye()};return await this.update(e,g=>({...g,currentTask:d,previousTask:null,pausedTasks:a,lastUpdated:T()})),await this.publishEvent(e,"task.resumed",{taskId:d.id,description:d.description,resumedAt:d.startedAt,remainingPaused:a.length}),d}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Mt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:T()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],lastUpdated:T()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(d=>d.feedback),n=[],o=[],i=[],a=[];for(let d of s){let g=d.feedback;g.stackConfirmed&&n.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],p=new Map;for(let d of a)p.set(d,(p.get(d)||0)+1);let m=[...p.entries()].filter(([d,g])=>g>=2).map(([d])=>d);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:T()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?T():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:T()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=Yu.safeParse(t);if(!s.success){let h=s.error.issues.map(k=>`${k.path.join(".")}: ${k.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
519
|
+
`)}function Su(r){if(!r.hasChanges)return"No changes between analysis runs.";let e=[];(r.beforeCommit||r.afterCommit)&&(e.push(` ${r.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${r.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of r.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
|
|
520
|
+
`)}function cr(r,e,t,s){let n=new Set(e),o=new Set(t);for(let i of t)n.has(i)||s.push({field:r,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:r,type:"removed",before:i})}var Xi=v(()=>{"use strict";l(ku,"generateAnalysisDiff");l(Ki,"formatAnalysisDiffMd");l(Su,"formatAnalysisDiffText");l(cr,"diffStringArray")});var Yi,Qi,bu,lr=v(()=>{"use strict";Yi=[1,2,3,5,8,13,21],Qi={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}},bu={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6}});import Bf from"node:fs/promises";import Jf from"node:path";function mn(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 zf(r,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of s)t.push(...mn(m));let n=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of n){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...mn(g[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let g;for(;(g=m.exec(r))!==null;)g[1]&&t.push(...mn(g[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...mn(m));else{let g=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...mn(g))}}let c=/\/\/\s*(.+)/g,u;for(;(u=c.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(g=>g.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(g=>g.length>2&&/^[a-z]+$/.test(g));t.push(...m)}return t.filter(m=>m.length>1&&!Eu.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function qf(r){return r.split(/\s+/).flatMap(e=>mn(e)).filter(e=>e.length>1&&!Eu.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Kf(r){let e=await sn(r),t={},s={},n=0,o=await nn(e,50,async a=>{try{let c=await Bf.readFile(Jf.join(r,a),"utf-8"),u=zf(c,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:c}of o){t[a]={tokens:c,length:c.length},n+=c.length;let u=new Map;for(let d of c)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?n/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Xf(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function Yf(r,e){let t=qf(r);if(t.length===0)return[];let s=new Map;for(let n of t){let o=e.invertedIndex[n];if(!o)continue;let i=Xf(o.length,e.totalDocs);for(let{path:a,tf:c}of o){let u=e.documents[a];if(!u)continue;let d=c*(1.2+1),p=c+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);s.set(a,(s.get(a)||0)+m)}}return Array.from(s.entries()).map(([n,o])=>({path:n,score:o})).sort((n,o)=>o.score-n.score)}function Qf(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,n])=>[s,n.length]))};I.setDoc(r,Pu,t)}function co(r){let e=I.getDoc(r,Pu);if(!e)return null;let t={};for(let[s,n]of Object.entries(e.docLengths))t[s]={tokens:[],length:n};return{documents:t,invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt}}async function Cu(r,e){let t=await Kf(r);return Qf(e,t),t}function xu(r,e,t=15){let s=co(r);return s?Yf(e,s).slice(0,t):[]}var Eu,Pu,Zi=v(()=>{"use strict";lr();ee();J();Eu=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);l(mn,"splitIdentifier");l(zf,"tokenizeFile");l(qf,"tokenizeQuery");l(Kf,"buildIndex");l(Xf,"idf");l(Yf,"score");Pu="bm25-index";l(Qf,"saveIndex");l(co,"loadIndex");l(Cu,"indexProject");l(xu,"queryFiles")});import ea from"node:fs/promises";import ds from"node:path";import{z as q}from"zod";async function nh(r,e){let t=Date.now();if(r.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=ds.join(e,"package.json"),n=await ea.readFile(s,"utf-8"),o=JSON.parse(n),i={...o.dependencies,...o.devDependencies},a=[],c=[];for(let u of r.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?c.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${c.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${a.join(", ")}`,durationMs:Date.now()-t}}catch(s){return A(s)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function rh(r,e){let t=Date.now();if(r.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await ch(e),n=new Set(s),o=[],i=[];for(let a of r.languages){let c=sh[a];if(!c)continue;c.some(d=>n.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function oh(r,e){let t=Date.now(),s=r.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let n=[],o=[];for(let i of s){let a=i.location,c=ds.join(e,a);await x(c)?o.push(a):n.push(`${i.name} (${a})`)}return n.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${n.join(", ")}`,durationMs:Date.now()-t}}async function ih(r,e){let t=Date.now();try{let s=await lh(e),n=r.fileCount,o=.1,i=Math.abs(s-n),a=n*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${n}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${n}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ah(r,e){let t=Date.now();if(r.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],n=[];for(let o of r.antiPatterns){let i=ds.join(e,o.file);await x(i)?n.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${n.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function Ru(r,e){let t=Date.now(),s=await Promise.all([nh(r,e),rh(r,e),oh(r,e),ih(r,e),ah(r,e)]),n=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:n===0,checks:s,totalMs:Date.now()-t,failedCount:n,passedCount:o}}async function ch(r){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await ea.readdir(n,{withFileTypes:!0});for(let i of o){let a=ds.join(n,i.name),c=ds.relative(r,a);if(!t.some(u=>u.test(c))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=ds.extname(i.name);u&&e.add(u)}}}}catch{}}return l(s,"scanDir"),await s(r),Array.from(e)}async function lh(r){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(n){try{let o=await ea.readdir(n,{withFileTypes:!0});for(let i of o){let a=ds.join(n,i.name),c=ds.relative(r,a);t.some(u=>u.test(c))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return l(s,"scanDir"),await s(r),e}var Zf,eh,th,ta,sP,sh,Au=v(()=>{"use strict";H();J();Ur();Zf=q.enum(["draft","verified","sealed"]),eh=q.object({name:q.string(),description:q.string(),location:q.string().optional(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),th=q.object({issue:q.string(),file:q.string(),suggestion:q.string(),severity:q.enum(["low","medium","high"]).optional(),language:q.string().optional(),framework:q.string().optional(),source:q.enum(["baseline","repo","context7","feedback"]).optional(),confidence:q.number().min(0).max(1).optional()}),ta=q.object({projectId:q.string(),languages:q.array(q.string()),frameworks:q.array(q.string()),packageManager:q.string().optional(),sourceDir:q.string().optional(),testDir:q.string().optional(),configFiles:q.array(q.string()),fileCount:q.number(),patterns:q.array(eh),antiPatterns:q.array(th),analyzedAt:q.string(),modelMetadata:on.optional(),status:Zf.default("draft"),commitHash:q.string().optional(),signature:q.string().optional(),sealedAt:q.string().optional(),verifiedAt:q.string().optional()}),sP={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"},sh={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(nh,"verifyFrameworks");l(rh,"verifyLanguages");l(oh,"verifyPatternLocations");l(ih,"verifyFileCount");l(ah,"verifyAntiPatternFiles");l(Ru,"semanticVerify");l(ch,"getProjectExtensions");l(lh,"countProjectFiles")});var sa,ms,na=v(()=>{"use strict";fe();z();J();sa=class{static{l(this,"SyncEventBus")}async publish(e){let t=R.getSyncPendingPath(e.projectId),s=await Ee(t,[])??[];s.push(e),await ce(t,s)}async getPending(e){let t=R.getSyncPendingPath(e);return await Ee(t,[])??[]}async clearPending(e){let t=R.getSyncPendingPath(e);await ce(t,[])}async updateLastSync(e){let t=R.getLastSyncPath(e),s={timestamp:b(),success:!0};await ce(t,s)}async getLastSync(e){let t=R.getLastSyncPath(e);return await Ee(t,null)}},ms=new sa});var Be,Qt=v(()=>{"use strict";na();Ps();z();ee();Be=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new an({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=P.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){P.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:b(),projectId:e};await ms.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return P.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var ra,Je,pn=v(()=>{"use strict";Au();Xi();z();Ds();Qt();ra=class extends Be{static{l(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let s={...t,status:"draft"};ta.parse(s),await this.update(e,n=>({...n,draft:s,lastUpdated:b()})),await this.publishEntityEvent(e,"analysis","drafted",{commitHash:s.commitHash,fileCount:s.fileCount})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let s=this.computeSignature(t.draft),n=b(),o={...t.draft,status:"sealed",signature:s,sealedAt:n};return ta.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:n}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=b();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:s}),await this.publishEntityEvent(e,"analysis","rolled_back",{restoredCommit:t.previousSealed.commitHash,restoredSignature:t.previousSealed.signature}),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:ku(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),n=s.sealed??s.draft;return n?await Ru(n,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return ar(JSON.stringify(t))}},Je=new ra});var oa,uh,Mt,ur=v(()=>{"use strict";z();ee();oa=class{static{l(this,"LLMAnalysisStorage")}save(e,t){let s=P.getDb(e),n=b();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(n),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=P.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?P.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getHistory(e,t=10){return P.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(n=>{let o=JSON.parse(n.analysis);return{id:n.id,commitHash:n.commit_hash,status:n.status,analyzedAt:n.analyzed_at,patternCount:o.patterns.length}})}},uh=new oa,Mt=uh});import{z as T}from"zod";var dh,lo,mh,ph,gh,ia,ju,Iu,$u,Mu,Du,fh,hh,_u,Ou,Nu,yh,wh,RP,aa=v(()=>{"use strict";Ur();dh=T.enum(["low","medium","high","critical"]),lo=T.enum(["feature","bug","improvement","chore"]),mh=T.enum(["active","backlog","previously_active"]),ph=T.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),gh=T.enum(["task_completed","feature_shipped","idea_captured","session_started"]),ia=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()}),ju=T.object({output:T.string().min(1,"Subtask output is required"),summary:ia}),Iu=T.object({id:T.string(),description:T.string(),domain:T.string(),agent:T.string(),status:ph,dependsOn:T.array(T.string()),startedAt:T.string().optional(),completedAt:T.string().optional(),output:T.string().optional(),summary:ia.optional(),skipReason:T.string().optional(),blockReason:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional()}),$u=T.object({completed:T.number(),total:T.number(),percentage:T.number()}),Mu=T.object({id:T.string(),description:T.string(),type:lo.optional(),startedAt:T.string(),sessionId:T.string(),featureId:T.string().optional(),subtasks:T.array(Iu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:$u.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:on.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional(),parentDescription:T.string().optional(),branch:T.string().optional(),prUrl:T.string().optional()}),Du=T.object({id:T.string(),description:T.string(),status:T.literal("paused"),startedAt:T.string(),pausedAt:T.string(),pauseReason:T.string().optional(),type:lo.optional(),sessionId:T.string().optional(),featureId:T.string().optional(),subtasks:T.array(Iu).optional(),currentSubtaskIndex:T.number().optional(),subtaskProgress:$u.optional(),linearId:T.string().optional(),linearUuid:T.string().optional(),estimatedPoints:T.number().optional(),estimatedMinutes:T.number().optional(),modelMetadata:on.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),fh=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()}),hh=T.object({taskId:T.string(),title:T.string(),classification:lo,startedAt:T.string(),completedAt:T.string(),subtaskCount:T.number(),subtaskSummaries:T.array(ia),outcome:T.string(),branchName:T.string(),linearId:T.string().optional(),linearUuid:T.string().optional(),prUrl:T.string().optional(),feedback:fh.optional(),tokensIn:T.number().optional(),tokensOut:T.number().optional()}),_u=T.object({currentTask:Mu.nullable(),previousTask:Du.nullable().optional(),pausedTasks:T.array(Du).optional(),taskHistory:T.array(hh).optional(),lastUpdated:T.string()}),Ou=T.object({id:T.string(),description:T.string(),priority:dh,type:lo,featureId:T.string().optional(),originFeature:T.string().optional(),completed:T.boolean(),completedAt:T.string().optional(),createdAt:T.string(),section:mh,agent:T.string().optional(),groupName:T.string().optional(),groupId:T.string().optional()}),Nu=T.object({tasks:T.array(Ou),lastUpdated:T.string()}),yh=T.object({tasksToday:T.number(),tasksThisWeek:T.number(),streak:T.number(),velocity:T.string(),avgDuration:T.string()}),wh=T.object({type:gh,description:T.string(),timestamp:T.string(),duration:T.string().optional()}),RP=T.object({projectId:T.string(),currentTask:Mu.nullable(),queue:T.array(Ou),stats:yh,recentActivity:T.array(wh),lastSync:T.string()})});var dr,ca,$s,la=v(()=>{"use strict";dr={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},ca=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e){let t=e?.currentTask;if(!t)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return t?"working":"idle"}}canTransition(e,t){let s=dr[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return dr[e]}getPrompt(e){return dr[e].prompt}getValidCommands(e){return dr[e].transitions}formatNextSteps(e){return dr[e].transitions.map(s=>{switch(s){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${s}`}})}},$s=new ca});var Zt,ua,At,Ms=v(()=>{"use strict";xt();z();ee();Zt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ua=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=pe(),n=b();return P.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=b();return P.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(pe(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?P.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):P.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=P.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=P.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(P.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);P.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return P.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},At=new ua});var da,_,wt=v(()=>{"use strict";xt();aa();z();la();Ms();Qt();da=class extends Be{static{l(this,"StateStorage")}constructor(){super("state.json",_u)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=$s.getCurrentState(e),n=$s.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:b()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=b(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,h)=>h!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:b(),sessionId:i.sessionId??pe()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];At.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:b()}));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:b()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;g.stackConfirmed&&n.push(...g.stackConfirmed),g.patternsDiscovered&&o.push(...g.patternsDiscovered),g.agentAccuracy&&i.push(...g.agentAccuracy),g.issuesEncountered&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:b()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?b():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=ju.safeParse(t);if(!s.success){let h=s.error.issues.map(S=>`${S.path.join(".")}: ${S.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
412
521
|
${h.join(`
|
|
413
|
-
`)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:
|
|
414
|
-
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,
|
|
522
|
+
`)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:b(),output:n,summary:o};let d=u.filter(h=>h.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:b()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},_=new da});import Lu from"node:fs/promises";import Fu from"node:path";async function pa(r,e,t,s){let[n,o,i,a]=await Promise.all([bh(r,e,s),Th(r),vh(r),Eh(r)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,kh).map(c=>({message:c.message,date:c.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:n,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function bh(r,e,t){let s=[],n=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=xu(r,n,ma*2);for(let a of o){if(s.length>=ma)break;try{let c=Fu.join(e,a.path),u=await Lu.readFile(c,"utf-8");u.length>uo*3?s.push({path:a.path,content:`${u.slice(0,uo)}
|
|
523
|
+
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,uo),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(s.length>=ma)break;if(!s.some(c=>c.path===a))try{let c=Fu.join(e,a),u=await Lu.readFile(c,"utf-8");s.push({path:a,content:u.slice(0,uo),reason:"entry point"})}catch{}}return s}async function Th(r){try{let e=await Je.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function vh(r){try{return(await _.getTaskHistory(r)).slice(0,Sh).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Eh(r){try{let e=Mt.getActiveSummary(r);return Promise.resolve(e)}catch(e){return G.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var uo,ma,kh,Sh,Uu=v(()=>{"use strict";Zi();pn();ur();wt();Kt();uo=3e3,ma=15,kh=15,Sh=10;l(pa,"buildAnalysisPayload");l(bh,"selectCodeSamples");l(Th,"getExistingPatterns");l(vh,"getTaskHistory");l(Eh,"getPreviousAnalysisSummary")});var mo=v(()=>{"use strict"});import es from"chalk";function Hu(r){return Math.ceil(r.length/4)}function Gu(r){let e=r.split(`
|
|
415
524
|
`),t=[],s=null;for(let n=0;n<e.length;n++){let o=e[n],i=o.match(/^(#{1,3})\s+(.+)$/);i?(s&&(s.endLine=n-1,t.push(s)),s={name:i[2].trim(),content:o,startLine:n,endLine:n}):s&&(s.content+=`
|
|
416
|
-
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function
|
|
417
|
-
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(
|
|
525
|
+
${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function ga(r){return r.includes("<!-- prjct:preserve")}function Wu(r,e){let t=Gu(r),s=Gu(e),n={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Hu(r),tokensAfter:Hu(e),tokenDelta:0};n.tokenDelta=n.tokensAfter-n.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(s.map(a=>[a.name.toLowerCase(),a]));for(let a of t)ga(a.content)&&n.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
526
|
+
`).length});for(let a of s){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(ga(u.content)||(n.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
418
527
|
`).length}),n.hasChanges=!0)):(n.added.push({name:a.name,type:"added",after:a.content,lineCount:a.content.split(`
|
|
419
|
-
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!
|
|
420
|
-
`).length}),n.hasChanges=!0)}return n}function
|
|
421
|
-
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let
|
|
422
|
-
`)}function
|
|
528
|
+
`).length}),n.hasChanges=!0)}for(let a of t){let c=a.name.toLowerCase();!i.has(c)&&!ga(a.content)&&(n.removed.push({name:a.name,type:"removed",before:a.content,lineCount:a.content.split(`
|
|
529
|
+
`).length}),n.hasChanges=!0)}return n}function Vu(r,e={}){let{colorize:t=!0}=e,s=[],n=t?es.green:m=>m,o=t?es.red:m=>m,i=t?es.yellow:m=>m,a=t?es.dim:m=>m,c=t?es.bold:m=>m;if(!r.hasChanges)return s.push(a("No changes detected (context is up to date)")),s.join(`
|
|
530
|
+
`);if(s.push(""),s.push(c("\u{1F4CB} Changes to context files:")),s.push(""),r.added.length>0)for(let m of r.added)s.push(n(`+ \u2502 + ${m.name} (new)`));if(r.modified.length>0)for(let m of r.modified)s.push(i(`~ \u2502 ${m.name} (modified)`));if(r.removed.length>0)for(let m of r.removed)s.push(o(`- \u2502 - ${m.name} (removed)`));if(r.preserved.length>0){s.push(""),s.push(a(" ## Your Customizations"));for(let m of r.preserved)s.push(a(` \u2502 \u2713 ${m.name} (${m.lineCount} lines preserved)`))}s.push(""),s.push(a("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let u=[];r.added.length>0&&u.push(n(`+${r.added.length} added`)),r.modified.length>0&&u.push(i(`~${r.modified.length} modified`)),r.removed.length>0&&u.push(o(`-${r.removed.length} removed`)),s.push(`Summary: ${u.join(", ")||"no changes"}`);let d=r.tokenDelta>=0?"+":"",p=r.tokenDelta>=0?n:o;return s.push(`Tokens: ${r.tokensBefore.toLocaleString()} \u2192 ${r.tokensAfter.toLocaleString()} (${p(d+r.tokenDelta.toLocaleString())})`),s.push(""),s.join(`
|
|
531
|
+
`)}function Bu(r,e={}){let{colorize:t=!0}=e,s=[],n=t?es.green:c=>c,o=t?es.red:c=>c,i=t?es.cyan:c=>c,a=t?es.dim:c=>c;for(let c of r.added){if(s.push(i(`@@ +${c.name} @@`)),c.after)for(let u of c.after.split(`
|
|
423
532
|
`))s.push(n(`+ ${u}`));s.push("")}for(let c of r.modified){if(s.push(i(`@@ ${c.name} @@`)),c.before){for(let u of c.before.split(`
|
|
424
533
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
425
534
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
@@ -430,19 +539,19 @@ ${o}`)}return s&&(s.endLine=e.length-1,t.push(s)),t}function Pa(r){return r.incl
|
|
|
430
539
|
`).slice(0,5))s.push(o(`- ${u}`));c.before.split(`
|
|
431
540
|
`).length>5&&s.push(a(` ... ${c.before.split(`
|
|
432
541
|
`).length-5} more lines`))}s.push("")}return s.join(`
|
|
433
|
-
`)}var
|
|
434
|
-
`).filter(Boolean):[],n){let c=new Date(n),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(s){return t.reason=`Error checking staleness: ${
|
|
435
|
-
`)}async getSessionInfo(e){return
|
|
542
|
+
`)}var Ju=v(()=>{"use strict";mo();l(Hu,"estimateTokens");l(Gu,"parseMarkdownSections");l(ga,"isPreservedSection");l(Wu,"generateSyncDiff");l(Vu,"formatDiffPreview");l(Bu,"formatFullDiff")});var zu,qu,fa,Ku,Xu=v(()=>{"use strict";nr();ee();Ps();z();zu=50,qu=200,fa=class{static{l(this,"SessionTracker")}async read(e){try{return P.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){P.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return ls(e.lastActivity,t)}async touch(e){let t=await this.read(e),s=b();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=s,await this.write(e,t),t.current;let n={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:s,lastActivity:s,commands:[],files:[]};return t.current=n,await this.write(e,t),n}async trackCommand(e,t,s){let n=await this.read(e);if(!n.current)return;let o=b();n.current.lastActivity=o,n.current.commands.push({command:t,timestamp:o,durationMs:s}),n.current.commands.length>zu&&(n.current.commands=n.current.commands.slice(-zu)),await this.write(e,n)}async trackFile(e,t,s){let n=await this.read(e);if(!n.current)return;let o=b();n.current.lastActivity=o,n.current.files.push({path:t,operation:s,timestamp:o}),n.current.files.length>qu&&(n.current.files=n.current.files.slice(-qu)),await this.write(e,n)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let s=t.current,n=Date.now(),o=new Date(s.createdAt).getTime(),i=new Date(s.lastActivity).getTime(),a=n-i,c=t.config.idleTimeoutMs,u=Math.max(0,c-a),d=s.commands.map(g=>g.command),p=new Set(s.files.filter(g=>g.operation==="read").map(g=>g.path)).size,m=new Set(s.files.filter(g=>g.operation==="write").map(g=>g.path)).size;return{active:!0,id:s.id,duration:it(n-o),idleSince:s.lastActivity,idleMs:a,expiresIn:it(u),commandCount:s.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Ku=new fa});var Ch,ha,po,ya=v(()=>{"use strict";ee();H();Ue();Xu();Ch={commitThreshold:10,dayThreshold:3,significantFiles:["package.json","tsconfig.json","Cargo.toml","go.mod","requirements.txt","pyproject.toml",".env.example","docker-compose.yml","Dockerfile"]},ha=class{static{l(this,"StalenessChecker")}projectPath;config;constructor(e,t={}){this.projectPath=e,this.config={...Ch,...t}}async check(e){let t={isStale:!1,reason:null,lastSyncCommit:null,currentCommit:null,commitsSinceSync:0,daysSinceSync:0,changedFiles:[],significantChanges:[]};try{let s={};try{let c=P.getDoc(e,"project");if(!c)return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t;s=c}catch{return t.isStale=!0,t.reason="No sync history found. Run `prjct sync` to initialize.",t}t.lastSyncCommit=s.lastSyncCommit||null;let n=s.lastSync;try{let{stdout:c}=await N("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([N(`git rev-list --count ${t.lastSyncCommit}..HEAD`,{cwd:o}).catch(()=>null),N(`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(`
|
|
543
|
+
`).filter(Boolean):[],n){let c=new Date(n),u=new Date;t.daysSinceSync=Math.floor((u.getTime()-c.getTime())/(1e3*60*60*24))}return t.significantChanges=t.changedFiles.filter(c=>this.config.significantFiles.some(u=>c.endsWith(u)||c.includes(u))),t.commitsSinceSync>=this.config.commitThreshold?(t.isStale=!0,t.reason=`${t.commitsSinceSync} commits since last sync (threshold: ${this.config.commitThreshold})`):t.daysSinceSync>=this.config.dayThreshold?(t.isStale=!0,t.reason=`${t.daysSinceSync} days since last sync (threshold: ${this.config.dayThreshold})`):t.significantChanges.length>0?(t.isStale=!0,t.reason=`Significant files changed: ${t.significantChanges.join(", ")}`):t.commitsSinceSync>0?t.reason=`${t.commitsSinceSync} commits since sync (threshold: ${this.config.commitThreshold})`:t.reason="Context is up to date",t}catch(s){return t.reason=`Error checking staleness: ${y(s)}`,t}}formatStatus(e){let t=[];e.isStale?t.push("CLAUDE.md status: \u26A0\uFE0F STALE"):t.push("CLAUDE.md status: \u2713 Fresh");let s=[];if(e.lastSyncCommit&&s.push(`Last sync: ${e.lastSyncCommit}`),e.currentCommit&&s.push(`Current: ${e.currentCommit}`),e.commitsSinceSync>0&&s.push(`Commits since: ${e.commitsSinceSync}`),e.daysSinceSync>0&&s.push(`Days since: ${e.daysSinceSync}`),e.changedFiles.length>0&&s.push(`Files changed: ${e.changedFiles.length}`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}if(e.significantChanges.length>0){t.push(""),t.push("Significant changes:");for(let n of e.significantChanges.slice(0,5))t.push(` \u2022 ${n}`);e.significantChanges.length>5&&t.push(` ... and ${e.significantChanges.length-5} more`)}return e.reason&&(t.push(""),t.push(e.reason)),e.isStale&&(t.push(""),t.push("Run `prjct sync` to update context")),t.join(`
|
|
544
|
+
`)}async getSessionInfo(e){return Ku.getInfo(e)}formatSessionInfo(e){let t=[];if(!e.active)return t.push("Session: \u25CB No active session"),t.join(`
|
|
436
545
|
`);t.push(`Session: \u25B6 Active (${e.duration})`);let s=[];if(e.commandCount>0){let n=new Set,o=[];for(let i of e.commands)n.has(i)||(n.add(i),o.push(i));s.push(`Commands: ${o.join(" \u2192 ")} (${e.commandCount} total)`)}if((e.filesRead>0||e.filesWritten>0)&&s.push(`Files: ${e.filesRead} read, ${e.filesWritten} written`),s.push(`Idle: ${e.expiresIn} until timeout`),s.length>0){let n=Math.max(...s.map(i=>i.length)),o="\u2500".repeat(n+2);t.push(`\u250C${o}\u2510`);for(let i of s)t.push(`\u2502 ${i.padEnd(n)} \u2502`);t.push(`\u2514${o}\u2518`)}return t.join(`
|
|
437
|
-
`)}getWarning(e){return e.isStale?e.commitsSinceSync>0?`\u26A0\uFE0F Context stale (${e.commitsSinceSync} commits behind). Run \`prjct sync\``:e.daysSinceSync>0?`\u26A0\uFE0F Context stale (${e.daysSinceSync} days old). Run \`prjct sync\``:"\u26A0\uFE0F Context may be stale. Run `prjct sync`":null}},
|
|
438
|
-
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&Qy(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function Qy(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function Zy(r,e=100){let t=await Yy(r,e),s=new Map,n=new Map;for(let i of t){let a=Array.from(i);for(let c of a)s.set(c,(s.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let p=ew(a[c],a[u]);n.set(p,(n.get(p)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),p=s.get(c)||0,m=s.get(u)||0;if(p<2||m<2)continue;let d=p+m-a,g=d>0?a/d:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function ew(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function tw(r,e){N.setDoc(r,Ad,e)}function Dd(r){return N.getDoc(r,Ad)}async function jd(r,e,t=100){let s=await Zy(r,t);return tw(e,s),s}var Ad,Id=S(()=>{"use strict";yr();re();He();l(Yy,"parseGitLog");l(Qy,"isSourceFile");l(Zy,"buildMatrix");l(ew,"pairKey");Ad="cochange-index";l(tw,"saveMatrix");l(Dd,"loadMatrix");l(jd,"indexCoChanges")});async function ko(r){try{let{stdout:e}=await O(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function sw(){let r=await ko("gh api user --jq .login");return r.success&&r.output||(r=await ko("git config --global github.user"),r.success&&r.output)?r.output:null}async function nw(){let r=await ko("git config user.name");return r.success&&r.output?r.output:null}async function rw(){let r=await ko("git config user.email");return r.success&&r.output?r.output:null}async function Tn(){let[r,e,t]=await Promise.all([sw(),nw(),rw()]);return{github:r,email:t,name:e||r||"Unknown"}}var So=S(()=>{"use strict";He();l(ko,"execCommand");l(sw,"detectGitHubUsername");l(nw,"detectGitName");l(rw,"detectGitEmail");l(Tn,"detect")});import $a from"node:fs/promises";import ow from"node:path";import*as bo from"jsonc-parser";function $d(r){let e=[],t=bo.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${bo.printParseErrorCode(s.error)}`)}return t}var Ma,iw,$,Et=S(()=>{"use strict";ss();W();ie();K();Ct();So();Te();l($d,"parseJsonc");Ma=class{static{l(this,"ConfigManager")}async readConfig(e){try{let t=A.getLocalConfigPath(e),s=await $a.readFile(t,"utf-8");return $d(s)}catch(t){return R(t)||console.warn(`Warning: Could not read config at ${e}: ${ue(t)}`),null}}async writeConfig(e,t){let s=A.getLocalConfigPath(e);await le(s,t)}async readGlobalConfig(e){try{let t=A.getGlobalProjectConfigPath(e),s=await $a.readFile(t,"utf-8");return $d(s)}catch(t){return R(t)||console.warn(`Warning: Could not read global config for ${e}: ${ue(t)}`),null}}async writeGlobalConfig(e,t){let s=A.getGlobalProjectConfigPath(e);await le(s,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let s=T();t={projectId:e,authors:[],version:Ae,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=A.generateProjectId(e),n=A.getGlobalProjectPath(s),o=A.getDisplayPath(n),i=T(),a={projectId:s,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let c={projectId:s,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Ae,created:i,lastSync:i};return await this.writeGlobalConfig(s,c),a}async updateLastSync(e){let t=await this.getProjectId(e),s=await this.readGlobalConfig(t);s&&(s.lastSync=T(),await this.writeGlobalConfig(t,s))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await A.hasLegacyStructure(e))return!1;if(!await A.hasConfig(e))return!0;let n=await this.readConfig(e);if(!n||!n.projectId)return!0;let o=A.getGlobalProjectPath(n.projectId);try{return(await $a.readdir(ow.join(o,"core"))).length===0}catch(i){return R(i),!0}}async getProjectId(e){let t=await this.readConfig(e);return t?.projectId?t.projectId:A.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(n=>n.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=T();s.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),s.lastSync=o,await this.writeGlobalConfig(e,s)}async updateAuthorActivity(e,t){let s=await this.readGlobalConfig(e);if(!s||!s.authors)return;let n=s.authors.find(o=>o.github===t);n&&(n.lastActivity=T(),s.lastSync=n.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Tn(),s=await this.getProjectId(e);return await this.addAuthor(s,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let s=await this.readConfig(e);s&&(s.showMetrics=t,await this.writeConfig(e,s))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let s=A.generateProjectId(e);return{projectId:s,dataPath:A.getDisplayPath(A.getGlobalProjectPath(s))}}},iw=new Ma,$=iw});import Nd from"node:fs/promises";import Md from"node:os";import _a from"node:path";function cw(){let r=wt("mcp-config.json");if(!r)return{mcpServers:{context7:Oa}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Oa}}}}function Ld(){return cw().mcpServers?.context7||Oa}function _d(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?_a.join(Md.tmpdir(),"prjct-context7-test","mcp.json"):_a.join(Md.homedir(),".claude","mcp.json")}async function Od(r){try{let e=await Nd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(R(e))return{};throw e}}async function lw(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Ld(),e=[...r.args||[],"--help"];await Fi(r.command||"npx",e,{timeout:15e3})}var Oa,vn,Na,uw,ls,br=S(()=>{"use strict";Hs();or();W();He();K();Oa={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},vn=null;l(cw,"parseTemplateConfig");l(Ld,"getContext7Config");l(_d,"getConfigPath");l(Od,"readConfig");l(lw,"runSmokeCheck");Na=class{static{l(this,"Context7Service")}async install(){let e=_d(),t=_a.dirname(e);await Nd.mkdir(t,{recursive:!0});let s=await Od(e),n=s.mcpServers||{};return n.context7=Ld(),s.mcpServers=n,await le(e,s),vn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(vn&&Date.now()-vn.at<3e5)return vn.status;let e=_d(),n=((await Od(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await lw();let o={installed:!0,verified:!0,configPath:e};return vn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${w(o)}`};return vn={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},uw=new Na,ls=uw});var To,La=S(()=>{"use strict";To={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function Fa(r,e){return{...To[r],...e}}function vo(r,e,t){return{message:r,hint:e,...t}}var Co=S(()=>{"use strict";La();La();l(Fa,"getError");l(vo,"createError")});import{execSync as Ua}from"node:child_process";var Po,Ha,Eo,Fd,Ud=S(()=>{"use strict";Ms();Co();Po={git:{name:"git",command:"git --version",versionRegex:/git version ([\d.]+)/,required:!0,installHint:"Install Git: https://git-scm.com/downloads",docs:"https://git-scm.com/doc"},node:{name:"node",command:"node --version",versionRegex:/v([\d.]+)/,required:!0,installHint:"Install Node.js: https://nodejs.org",docs:"https://nodejs.org/docs"},bun:{name:"bun",command:"bun --version",versionRegex:/([\d.]+)/,required:!1,installHint:"Install Bun: curl -fsSL https://bun.sh/install | bash",docs:"https://bun.sh/docs"},gh:{name:"gh",command:"gh --version",versionRegex:/gh version ([\d.]+)/,required:!1,installHint:"Install GitHub CLI: https://cli.github.com",docs:"https://cli.github.com/manual"},npm:{name:"npm",command:"npm --version",versionRegex:/([\d.]+)/,required:!1,installHint:"npm comes with Node.js: https://nodejs.org"},claude:{name:"claude",command:"claude --version",versionRegex:/claude ([\d.]+)/,required:!1,installHint:"Install Claude Code: npm install -g @anthropic-ai/claude-code",docs:"https://docs.anthropic.com/claude-code"},gemini:{name:"gemini",command:"gemini --version",versionRegex:/gemini ([\d.]+)/,required:!1,installHint:"Install Gemini CLI: npm install -g @google/gemini-cli",docs:"https://ai.google.dev/gemini-api/docs"}},Ha=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let s=Po[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=Po[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Eo(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=Po[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
|
|
439
|
-
`);throw new
|
|
440
|
-
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(
|
|
546
|
+
`)}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}},po=l((r,e)=>new ha(r,e),"createStalenessChecker")});import Yu from"node:fs/promises";import fn from"node:path";function xh(r){let e=[],t,s=new RegExp(Il.source,"g");for(;(t=s.exec(r))!==null;){let n=t[1];(n.startsWith(".")||n.startsWith("@/"))&&e.push(n)}return e}async function Rh(r,e,t){let s;if(r.startsWith("@/"))s=fn.join(t,"src",r.slice(2));else{let n=fn.dirname(fn.join(t,e));s=fn.resolve(n,r)}for(let n of jl){let o=s+n;try{if((await Yu.stat(o)).isFile())return fn.relative(t,o)}catch{}}return null}async function Ah(r){let e=await sn(r),t={},s={},n=0,o=await nn(e,50,async i=>{try{let a=await Yu.readFile(fn.join(r,i),"utf-8"),c=xh(a),u=[];for(let d of c){let p=await Rh(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,n+=a.length;for(let c of a)s[c]||(s[c]=[]),s[c].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:n,builtAt:new Date().toISOString()}}function Dh(r,e){I.setDoc(r,Qu,e)}function go(r){return I.getDoc(r,Qu)}async function Zu(r,e){let t=await Ah(r);return Dh(e,t),t}var Qu,wa=v(()=>{"use strict";Ei();ee();J();l(xh,"extractImportSources");l(Rh,"resolveImport");l(Ah,"buildGraph");Qu="import-graph";l(Dh,"saveGraph");l(go,"loadGraph");l(Zu,"indexImports")});function ed(r,e){let t=[...r.added,...r.modified],s=new Set(t),n=new Set,o=go(e);if(o)for(let c of t){let u=o.reverse[c];if(u)for(let d of u)s.has(d)||n.add(d)}let i=Array.from(n),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:r.deleted,allAffected:a}}function td(r){let e=new Set;for(let t of r){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}var sd=v(()=>{"use strict";wa();l(ed,"propagateChanges");l(td,"affectedDomains")});import nd from"node:fs/promises";import jh from"node:path";function Ih(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 $h(r){let e=await sn(r,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await nn(e,100,async n=>{try{let o=jh.join(r,n),[i,a]=await Promise.all([nd.readFile(o,"utf-8"),nd.stat(o)]);return{path:n,hash:Ih(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let n of s)t.set(n.path,n);return t}function Mh(r,e){let t=[],s=[],n=[];for(let[i,a]of r){let c=e.get(i);c?c.hash!==a.hash?s.push(i):n.push(i):t.push(i)}let o=[];for(let i of e.keys())r.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:n}}function ka(r,e){let t=I.getDb(r);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,n]of e)s.run(n.path,n.hash,n.size,n.mtime)})(),I.setDoc(r,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function _h(r){let e=new Map;try{let t=I.query(r,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}async function Sa(r,e){let[t,s]=await Promise.all([$h(r),Promise.resolve(_h(e))]);return{diff:Mh(t,s),currentHashes:t}}function rd(r){return I.hasDoc(r,"file-hashes-meta")}var od=v(()=>{"use strict";ee();J();l(Ih,"hashContent");l($h,"computeHashes");l(Mh,"diffHashes");l(ka,"saveHashes");l(_h,"loadHashes");l(Sa,"detectChanges");l(rd,"hasHashRegistry")});async function Nh(r,e=100){try{let{stdout:t}=await N(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),s=[],n=null;for(let o of t.split(`
|
|
547
|
+
`)){let i=o.trim();i==="---COMMIT---"?(n&&n.size>0&&n.size<=30&&s.push(n),n=new Set):i&&n&&Lh(i)&&n.add(i)}return n&&n.size>0&&n.size<=30&&s.push(n),s}catch{return[]}}function Lh(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 Fh(r,e=100){let t=await Nh(r,e),s=new Map,n=new Map;for(let i of t){let a=Array.from(i);for(let c of a)s.set(c,(s.get(c)||0)+1);for(let c=0;c<a.length;c++)for(let u=c+1;u<a.length;u++){let d=Uh(a[c],a[u]);n.set(d,(n.get(d)||0)+1)}}let o={};for(let[i,a]of n){let[c,u]=i.split("\0"),d=s.get(c)||0,p=s.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(o[c]||(o[c]={}),o[u]||(o[u]={}),o[c][u]=g,o[u][c]=g)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function Uh(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function Hh(r,e){I.setDoc(r,cd,e)}function ld(r){return I.getDoc(r,cd)}async function ud(r,e,t=100){let s=await Fh(r,t);return Hh(e,s),s}var cd,dd=v(()=>{"use strict";lr();ee();Ue();l(Nh,"parseGitLog");l(Lh,"isSourceFile");l(Fh,"buildMatrix");l(Uh,"pairKey");cd="cochange-index";l(Hh,"saveMatrix");l(ld,"loadMatrix");l(ud,"indexCoChanges")});import fd from"node:fs/promises";import md from"node:os";import ba from"node:path";function Wh(){let r=dt("mcp-config.json");if(!r)return{mcpServers:{context7:Ta}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Ta}}}}function hd(){return Wh().mcpServers?.context7||Ta}function pd(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?ba.join(md.tmpdir(),"prjct-context7-test","mcp.json"):ba.join(md.homedir(),".claude","mcp.json")}async function gd(r){try{let e=await fd.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(A(e))return{};throw e}}async function Vh(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=hd(),e=[...r.args||[],"--help"];await Es(r.command||"npx",e,{timeout:15e3})}var Ta,hn,va,Bh,ts,mr=v(()=>{"use strict";Is();nr();H();Ue();J();Ta={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},hn=null;l(Wh,"parseTemplateConfig");l(hd,"getContext7Config");l(pd,"getConfigPath");l(gd,"readConfig");l(Vh,"runSmokeCheck");va=class{static{l(this,"Context7Service")}async install(){let e=pd(),t=ba.dirname(e);await fd.mkdir(t,{recursive:!0});let s=await gd(e),n=s.mcpServers||{};return n.context7=hd(),s.mcpServers=n,await ce(e,s),hn=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(hn&&Date.now()-hn.at<3e5)return hn.status;let e=pd(),n=((await gd(e)).mcpServers||{}).context7;if(!n?.command||!Array.isArray(n.args)||n.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await Vh();let o={installed:!0,verified:!0,configPath:e};return hn={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return hn={at:Date.now(),status:i},i}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let t=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(t)}return e}},Bh=new va,ts=Bh});var fo,Ea=v(()=>{"use strict";fo={NO_PROJECT:{message:"No prjct project found in this directory",hint:"Run 'prjct init' to set up a new project",file:".prjct/prjct.config.json"},NO_PROJECT_ID:{message:"Project ID not found",hint:"Run 'prjct init' or check .prjct/prjct.config.json",file:".prjct/prjct.config.json"},CONFIG_NOT_FOUND:{message:"Configuration file not found",hint:"Run 'prjct init' to create project configuration",file:".prjct/prjct.config.json"},CONFIG_INVALID:{message:"Invalid configuration file",hint:"Check JSON syntax or delete .prjct/ and run init again",file:".prjct/prjct.config.json"},GIT_NOT_FOUND:{message:"Git repository not detected",hint:"Run 'git init' first, then 'prjct init'"},GIT_NO_COMMITS:{message:"No commits in repository",hint:"Make an initial commit before using prjct"},GIT_DIRTY:{message:"Working directory has uncommitted changes",hint:"Commit or stash changes, or use '--force' to override"},GIT_ON_MAIN:{message:"Cannot ship from main/master branch",hint:"Create a feature branch first: git checkout -b feature/your-feature"},GIT_OPERATION_FAILED:{message:"Git operation failed",hint:"Check git status and resolve any conflicts"},GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",hint:"Run 'gh auth login' to authenticate",docs:"https://cli.github.com/manual/gh_auth_login"},LINEAR_NOT_CONFIGURED:{message:"Linear integration not configured",hint:"Run 'prjct linear setup' to configure Linear MCP"},LINEAR_API_ERROR:{message:"Linear API error",hint:"Check your API key or network connection"},NO_ACTIVE_TASK:{message:"No active task",hint:`Start a task with 'p. task "description"'`},TASK_ALREADY_ACTIVE:{message:"A task is already in progress",hint:"Complete it with 'p. done' or pause with 'p. pause'"},SYNC_FAILED:{message:"Project sync failed",hint:"Check file permissions and try again"},NOTHING_TO_SHIP:{message:"Nothing to ship",hint:"Make some changes first, then run ship"},PR_CREATE_FAILED:{message:"Failed to create pull request",hint:"Check GitHub auth and remote configuration"},NO_AI_PROVIDER:{message:"No AI provider detected",hint:"Install Claude Code or Gemini CLI, then run 'prjct start'",docs:"https://prjct.app/docs"},PROVIDER_NOT_CONFIGURED:{message:"AI provider not configured for prjct",hint:"Run 'prjct start' to configure your provider"},UNKNOWN_COMMAND:{message:"Unknown command",hint:"Run 'prjct --help' to see available commands"},MISSING_PARAM:{message:"Missing required parameter",hint:"Check command usage below"},UNKNOWN:{message:"An unexpected error occurred",hint:"Check the error details and try again"}}});function Pa(r,e){return{...fo[r],...e}}function pr(r,e,t){return{message:r,hint:e,...t}}var ho=v(()=>{"use strict";Ea();Ea();l(Pa,"getError");l(pr,"createError")});import{execFileSync as yd,execSync as Jh}from"node:child_process";var yo,Ca,wo,wd,kd=v(()=>{"use strict";Ps();ho();yo={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"}},Ca=class{static{l(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let s=yo[e];if(!s)return this.checkUnknownTool(e);let n=this.executeCheck(s);return this.setCache(e,n),n}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=yo[e],n=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new wo(n)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(n=>{let o=yo[n];return o?` ${n}: ${o.installHint}`:` ${n}: Install and try again`}).join(`
|
|
548
|
+
`);throw new wo({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
549
|
+
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(yo),s=new Map;for(let n of t)s.set(n,this.checkTool(n));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=Jh(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let n=t.match(e.versionRegex);s=n?n[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:pr(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:pr(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return yd(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return yd(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:pr(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?ls(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())}},wo=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}},wd=new Ca});function yn(r){let e=`PRJCT_TIMEOUT_${r}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return zh[r]}var ne,xa,Ra,ko,zh,_t,Sd,_s=v(()=>{"use strict";ne={GATHERING:"gathering",ANALYZING:"analyzing",PROPOSING:"proposing",PENDING_APPROVAL:"awaiting_approval",APPROVED:"approved",REJECTED:"rejected",EXECUTING:"executing",COMPLETED:"completed",ABORTED:"aborted"},xa=["feature","spec","design","refactor","migrate"],Ra=["ship","cleanup","git","migrate"],ko=["Read","Glob","Grep","GetTimestamp","GetDate","GetDateTime"],zh={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};l(yn,"getTimeout");_t={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80},Sd={HISTORY_MAX:100}});import Aa from"node:fs/promises";import qh from"node:os";import bd from"node:path";var Da,Kh,So,ja=v(()=>{"use strict";H();J();Da=class{static{l(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=qh.homedir(),this.configDir=bd.join(this.homeDir,".prjct-cli","config"),this.configFile=bd.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Aa.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Aa.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let n={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await ce(this.configFile,n),!0}catch(n){return console.error("[editors-config] Error saving config:",y(n)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await ce(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){return x(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Aa.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},Kh=new Da,So=Kh});var $a={};Bt($a,{installAntigravitySkill:()=>Cd,installCodexSkill:()=>Ia,needsAntigravityInstallation:()=>ey,run:()=>Pd,verifyCodexPRouterReady:()=>To});import{execFileSync as Xh}from"node:child_process";import Y from"node:fs/promises";import Os from"node:os";import re from"node:path";import de from"chalk";async function Yh(r){let e=r.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!wd.isAvailable("npm"))return console.log(`${de.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${de.dim(`Install ${r.displayName} using one of:`)}`),console.log(de.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(de.dim(` \u2022 Use Homebrew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(de.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(de.yellow(`\u{1F4E6} ${r.displayName} not found. Installing...`)),console.log(""),Xh("npm",["install","-g",e],{stdio:"inherit",timeout:yn("NPM_INSTALL")}),console.log(""),console.log(`${de.green("\u2713")} ${r.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(de.yellow(`\u26A0\uFE0F Installation timed out for ${r.displayName}`)),console.log(""),console.log(de.dim("The npm install took too long. Try:")),console.log(de.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(de.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(de.yellow(`\u26A0\uFE0F Failed to install ${r.displayName}: ${s.message}`)),console.log(""),console.log(de.dim("Alternative installation methods:")),console.log(de.dim(` \u2022 npm: npm install -g ${e}`)),console.log(de.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(de.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(de.dim(` \u2022 brew: brew install ${r.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function Pd(){let r=await rr(),e=await $i(),t=ct[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},n=["claude","gemini"];for(let a of n){let c=ct[a],u=r[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await Yh(c))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${c.displayName} installation failed`);else continue;if(a==="claude"){if(await Pe.detectActiveProvider()){let m=await Pe.syncCommands();m.success&&(d.commandsAdded=m.added,d.commandsUpdated=m.updated,s.commandsAdded+=m.added,s.commandsUpdated+=m.updated);let g=await Pe.installGlobalConfig();g.success&&(d.configAction=g.action,s.configAction||(s.configAction=g.action)),await Pe.installDocs(),await ry(),await ts.ensureReady()}}else if(a==="gemini"){await Qh()&&(d.commandsAdded=1,s.commandsAdded+=1);let m=await Zh();m.success&&(d.configAction=m.action)}s.providers.push(d)}if((await Vr()).installed&&(await Cd()).success&&console.log(` ${de.green("\u2713")} Antigravity skill installed`),(await Cs()).installed){if(!(await Ia()).success)throw new Error("Codex skill installation failed");let c=await To({autoRepair:!0});if(!c.verified)throw new Error(c.message||"Codex p. router verification failed");console.log(` ${de.green("\u2713")} Codex skill installed`),console.log(` ${de.green("\u2713")} Codex p. router ready`)}await So.saveConfig(ve,await Pe.getInstallPath(),e.provider),await ny();for(let a of s.providers)oy(a,ct[a.provider]);return s}async function Qh(){try{let r=re.join(Os.homedir(),".gemini","commands"),e=re.join(r,"p.toml");try{return await Y.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(r){return G.warn(`Gemini router cleanup warning: ${y(r)}`),!1}}async function Zh(){try{let r=re.join(Os.homedir(),".gemini"),e=re.join(r,"GEMINI.md");await Y.mkdir(r,{recursive:!0});let t=dt("global/GEMINI.md");if(!t){let c=re.join(at,"templates","global","GEMINI.md");t=await Y.readFile(c,"utf-8")}let s="",n=!1;try{s=await Y.readFile(e,"utf-8"),n=!0}catch(c){if(A(c))n=!1;else throw c}let a=ro(n?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Y.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(r){return G.warn(`Gemini config warning: ${y(r)}`),{success:!1,action:null}}}async function Cd(){try{let r=re.join(Os.homedir(),".gemini","antigravity","skills"),e=re.join(r,"prjct"),t=re.join(e,"SKILL.md");await Y.mkdir(e,{recursive:!0});let s=await x(t),n=dt("antigravity/SKILL.md");if(!n){let o=re.join(at,"templates","antigravity","SKILL.md");if(!await x(o))return G.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};n=await Y.readFile(o,"utf-8")}return await Y.writeFile(t,n,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(r){return G.warn(`Antigravity skill warning: ${y(r)}`),{success:!1,action:null}}}async function ey(){let r=await Vr();return r.installed&&!r.skillInstalled}function Rd(){return re.join(Os.homedir(),".codex","skills","prjct","SKILL.md")}function ty(r){return`<!-- ${xd}: ${JSON.stringify({version:ve,templateHash:r})} -->`}function Td(r){let e=r.match(new RegExp(`<!--\\s*${xd}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function sy(r){return ar(r)}async function Ad(){let r=dt("codex/SKILL.md");if(r)return r;let e=re.join(at,"templates","codex","SKILL.md");return await x(e)?Y.readFile(e,"utf-8"):null}function Dd(r){let e=r.trimEnd(),t=sy(e),s=ty(t);return{content:`${e}
|
|
441
550
|
|
|
442
551
|
${s}
|
|
443
|
-
`,templateHash:t}}async function
|
|
552
|
+
`,templateHash:t}}async function Ia(){try{let r=Rd(),e=re.dirname(r);await Y.mkdir(e,{recursive:!0});let t=await x(r),s=await Ad();if(!s)return G.warn("Codex SKILL.md template not found"),{success:!1,action:null};let n=Dd(s);return t&&await Y.readFile(r,"utf-8").catch(()=>"")===n.content?{success:!0,action:"unchanged"}:(await Y.writeFile(r,n.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(r){return G.warn(`Codex skill warning: ${y(r)}`),{success:!1,action:null}}}async function To(r={}){let e=Rd();if(!(await Cs()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await Ad();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let n=Dd(s),o=l(async()=>r.autoRepair?(await Ia()).success:!1,"maybeRepair"),i="";if(!await x(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await Y.readFile(e,"utf-8").catch(()=>"");let a=Td(i);if(!(a?.version===ve&&a?.templateHash===n.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await Y.readFile(e,"utf-8").catch(()=>""),a=Td(i),!(a?.version===ve&&a?.templateHash===n.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:n.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:n.templateHash,message:"Codex p. router ready"}}async function ny(){try{let r=re.join(Os.homedir(),".prjct-cli","projects");if(!await x(r))return;let e=(await Y.readdir(r,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let n=P.getDoc(s,"project");if(!n)continue;n.cliVersion!==ve&&(n.cliVersion=ve,P.setDoc(s,"project",n),t++)}catch{}t>0&&console.log(` ${de.green("\u2713")} Updated ${t} project(s) to v${ve}`)}catch(r){A(r)||G.warn(`Migration warning: ${y(r)}`)}}async function vd(r,e){let t={};if(await x(r))try{t=await Ee(r)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await ce(r,t)}async function ry(){try{let r=re.join(Os.homedir(),".claude"),e=re.join(r,"settings.json"),t=re.join(r,"prjct-statusline.sh"),s=re.join(Os.homedir(),".prjct-cli","statusline"),n=re.join(s,"statusline.sh"),o=re.join(s,"themes"),i=re.join(s,"lib"),a=re.join(s,"components"),c=re.join(s,"config.json"),u=re.join(at,"assets","statusline"),d=re.join(u,"statusline.sh"),p=re.join(u,"themes"),m=re.join(u,"lib"),g=re.join(u,"components"),h=re.join(u,"default-config.json");if(await x(r)||await Y.mkdir(r,{recursive:!0}),await x(s)||await Y.mkdir(s,{recursive:!0}),await x(o)||await Y.mkdir(o,{recursive:!0}),await x(i)||await Y.mkdir(i,{recursive:!0}),await x(a)||await Y.mkdir(a,{recursive:!0}),await x(n)){let S=await Y.readFile(n,"utf8");if(S.includes("CLI_VERSION=")){let w=S.match(/CLI_VERSION="([^"]*)"/);if(w&&w[1]!==ve){let E=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ve}"`);await Y.writeFile(n,E,{mode:493})}await bo(m,i),await bo(g,a),await Ed(t,n),await vd(e,t);return}}if(await x(d)){let S=await Y.readFile(d,"utf8");if(S=S.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${ve}"`),await Y.writeFile(n,S,{mode:493}),await bo(m,i),await bo(g,a),await x(p)){let w=await Y.readdir(p);for(let E of w){let D=re.join(p,E),V=re.join(o,E);await Y.copyFile(D,V)}}!await x(c)&&await x(h)&&await Y.copyFile(h,c)}else{let S=`#!/bin/bash
|
|
444
553
|
# prjct Status Line for Claude Code
|
|
445
|
-
CLI_VERSION="${
|
|
554
|
+
CLI_VERSION="${ve}"
|
|
446
555
|
input=$(cat)
|
|
447
556
|
CWD=$(echo "$input" | jq -r '.workspace.current_dir // "~"' 2>/dev/null)
|
|
448
557
|
CONFIG="$CWD/.prjct/prjct.config.json"
|
|
@@ -471,7 +580,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
471
580
|
fi
|
|
472
581
|
fi
|
|
473
582
|
echo "prjct"
|
|
474
|
-
`;await Z.writeFile(n,k,{mode:493})}await Bd(t,n),await Vd(e,t)}catch(r){R(r)||V.warn(`Status line warning: ${w(r)}`)}}async function Ao(r,e){if(!await P(r))return;let t=await Z.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=ce.join(r,s),o=ce.join(e,s);await Z.copyFile(n,o),await Z.chmod(o,493)}}async function Bd(r,e){try{if(await P(r)){if((await Z.lstat(r)).isSymbolicLink()&&await Z.readlink(r)===e)return;await Z.unlink(r)}await Z.symlink(e,r)}catch{try{await P(e)&&(await Z.copyFile(e,r),await Z.chmod(r,493))}catch(s){R(s)||V.warn(`Symlink fallback warning: ${s.message}`)}}}function vw(r,e){if(console.log(""),r.cliInstalled?console.log(` ${fe.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${fe.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${fe.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${fe.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${fe.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${fe.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${fe.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var qd,Cw,jo=S(()=>{"use strict";Hs();br();Ud();re();W();Vs();K();wn();ns();Ct();at();os();za();ia();l(fw,"installAICLI");l(zd,"run");l(hw,"installGeminiRouter");l(yw,"installGeminiGlobalConfig");l(Jd,"installAntigravitySkill");l(ww,"needsAntigravityInstallation");qd="prjct-codex-router";l(Kd,"getCodexSkillPath");l(kw,"getCodexSkillMetadata");l(Wd,"parseCodexSkillMetadata");l(Sw,"hashContent");l(Xd,"loadCodexSkillTemplate");l(Yd,"buildCodexSkillContent");l(Ja,"installCodexSkill");l(Do,"verifyCodexPRouterReady");l(bw,"migrateProjectsCliVersion");l(Vd,"ensureStatusLineSettings");l(Tw,"installStatusLine");l(Ao,"installStatusLineModules");l(Bd,"ensureStatusLineSymlink");l(vw,"showResults");Cw=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");Cw&&zd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as B}from"zod";var Pw,Ew,Qd,xw,Rw,Aw,Dw,jw,Zd,uA,ep=S(()=>{"use strict";Pw=B.enum(["low","medium","high"]),Ew=B.enum(["pending","converted","completed","archived","dormant"]),Qd=B.enum(["high","medium","low"]),xw=B.object({impact:Qd,effort:Qd}),Rw=B.object({frontend:B.string().optional(),backend:B.string().optional(),payments:B.string().optional(),ai:B.string().optional(),deploy:B.string().optional(),other:B.array(B.string()).optional()}),Aw=B.object({name:B.string(),description:B.string()}),Dw=B.object({name:B.string(),description:B.string().optional()}),jw=B.object({id:B.string(),text:B.string(),details:B.string().optional(),priority:Pw,status:Ew,tags:B.array(B.string()),addedAt:B.string(),completedAt:B.string().optional(),convertedTo:B.string().optional(),source:B.string().optional(),sourceFiles:B.array(B.string()).optional(),painPoints:B.array(B.string()).optional(),solutions:B.array(B.string()).optional(),filesAffected:B.array(B.string()).optional(),impactEffort:xw.optional(),implementationNotes:B.string().optional(),stack:Rw.optional(),modules:B.array(Aw).optional(),roles:B.array(Dw).optional(),risks:B.array(B.string()).optional(),risksCount:B.number().optional()}),Zd=B.object({ideas:B.array(jw),lastUpdated:B.string()}),uA={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var Ka,Ge,ks=S(()=>{"use strict";ep();It();ie();Ws();is();Ka=class extends qe{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Zd)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:ye(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:T()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:T()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:T()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:T()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:T()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:T()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:T()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:T()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=gs(as.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Mt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:T()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Ge=new Ka});var Xa,Pn,Ya=S(()=>{"use strict";uo();ie();is();Xa=class extends qe{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",Mu)}getDefault(){return{..._u}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,p=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,m=[...i.dailyStats],d=m.findIndex(v=>v.date===o);if(d>=0){let v=m[d];m[d]={...v,tokensSaved:v.tokensSaved+s,syncs:v.syncs+1,avgCompressionRate:(v.avgCompressionRate*v.syncs+n)/(v.syncs+1),totalDuration:v.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let h=g.toISOString().split("T")[0],k=m.filter(v=>v.date>=h),y=[...i.agentUsage];if(t.agents)for(let v of t.agents){let D=y.findIndex(U=>U.agentName===v);D>=0?y[D]={...y[D],usageCount:y[D].usageCount+1,tokensSaved:y[D].tokensSaved+Math.floor(s/t.agents.length)}:y.push({agentName:v,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:p,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:y,dailyStats:k,firstSync:i.firstSync||T(),lastUpdated:T()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Ou(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},Pn=new Xa});import ee from"node:fs/promises";import Y from"node:path";async function Io(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(C.exists(r)&&C.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=A.getGlobalProjectPath(r),n=Y.join(s,"storage"),o=Y.join(s,"index"),i=Y.join(s,"memory");t.backupDir=await Iw(n,o,i),C.getDb(r);for(let{filename:c,key:u}of ec){let p=Y.join(n,c),m=await Ut(p);if(m===null){t.skippedFiles.push(c);continue}try{C.setDoc(r,u,m),tp(r,u,m),t.migratedFiles.push(c)}catch(d){t.errors.push({file:c,error:String(d)})}}for(let{filename:c,key:u}of Za){let p=Y.join(o,c),m=await Ut(p);if(m===null){t.skippedFiles.push(`index/${c}`);continue}try{C.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),sp(r,u,m),t.migratedFiles.push(`index/${c}`)}catch(d){t.errors.push({file:`index/${c}`,error:String(d)})}}await Uw(r,o,t),await Hw(r,o,t),await Gw(r,i,t),await Ww(r,i,t);let a=Y.join(s,"sessions");return await Vw(r,a,t),t.errors.length===0&&await Bw(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function Iw(r,e,t){let s=Y.join(r,"backup");return await ee.mkdir(s,{recursive:!0}),await ee.mkdir(Y.join(s,"index"),{recursive:!0}),await ee.mkdir(Y.join(s,"memory"),{recursive:!0}),await Qa(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Qa(e,Y.join(s,"index")),await Qa(t,Y.join(s,"memory")),s}async function Qa(r,e,t){try{let s=await ee.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=Y.join(r,n.name),i=Y.join(e,n.name);await ee.copyFile(o,i)}}catch(s){if(!R(s))throw s}}function tp(r,e,t){switch(e){case"state":$w(r,t);break;case"queue":Mw(r,t);break;case"ideas":_w(r,t);break;case"shipped":Ow(r,t);break;case"metrics":Nw(r,t);break;case"analysis":Lw(r,t);break}}function $w(r,e){let t=C.getDb(r),s=t.prepare(`
|
|
583
|
+
`;await Y.writeFile(n,S,{mode:493})}await Ed(t,n),await vd(e,t)}catch(r){A(r)||G.warn(`Status line warning: ${y(r)}`)}}async function bo(r,e){if(!await x(r))return;let t=await Y.readdir(r);for(let s of t)if(s.endsWith(".sh")){let n=re.join(r,s),o=re.join(e,s);await Y.copyFile(n,o),await Y.chmod(o,493)}}async function Ed(r,e){try{if(await x(r)){if((await Y.lstat(r)).isSymbolicLink()&&await Y.readlink(r)===e)return;await Y.unlink(r)}await Y.symlink(e,r)}catch{try{await x(e)&&(await Y.copyFile(e,r),await Y.chmod(r,493))}catch(s){A(s)||G.warn(`Symlink fallback warning: ${s.message}`)}}}function oy(r,e){if(console.log(""),r.cliInstalled?console.log(` ${de.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${de.green("\u2713")} ${e.displayName} CLI found`),r.commandsAdded+r.commandsUpdated>0){let s=[];r.commandsAdded>0&&s.push(`${r.commandsAdded} new`),r.commandsUpdated>0&&s.push(`${r.commandsUpdated} updated`),console.log(` ${de.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${de.green("\u2713")} Commands up to date`);r.configAction==="created"?console.log(` ${de.green("\u2713")} Global config created (${e.contextFile})`):r.configAction==="updated"?console.log(` ${de.green("\u2713")} Global config updated (${e.contextFile})`):r.configAction==="appended"&&console.log(` ${de.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var xd,iy,vo=v(()=>{"use strict";Is();mr();kd();ee();H();_s();J();Ds();Kt();Pt();lt();Yt();ja();qi();l(Yh,"installAICLI");l(Pd,"run");l(Qh,"installGeminiRouter");l(Zh,"installGeminiGlobalConfig");l(Cd,"installAntigravitySkill");l(ey,"needsAntigravityInstallation");xd="prjct-codex-router";l(Rd,"getCodexSkillPath");l(ty,"getCodexSkillMetadata");l(Td,"parseCodexSkillMetadata");l(sy,"hashContent");l(Ad,"loadCodexSkillTemplate");l(Dd,"buildCodexSkillContent");l(Ia,"installCodexSkill");l(To,"verifyCodexPRouterReady");l(ny,"migrateProjectsCliVersion");l(vd,"ensureStatusLineSettings");l(ry,"installStatusLine");l(bo,"installStatusLineModules");l(Ed,"ensureStatusLineSymlink");l(oy,"showResults");iy=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");iy&&Pd().catch(r=>{console.error("Setup error:",r.message),process.exit(1)})});import{z as W}from"zod";var ay,cy,jd,ly,uy,dy,my,py,Id,_x,$d=v(()=>{"use strict";ay=W.enum(["low","medium","high"]),cy=W.enum(["pending","converted","completed","archived","dormant"]),jd=W.enum(["high","medium","low"]),ly=W.object({impact:jd,effort:jd}),uy=W.object({frontend:W.string().optional(),backend:W.string().optional(),payments:W.string().optional(),ai:W.string().optional(),deploy:W.string().optional(),other:W.array(W.string()).optional()}),dy=W.object({name:W.string(),description:W.string()}),my=W.object({name:W.string(),description:W.string().optional()}),py=W.object({id:W.string(),text:W.string(),details:W.string().optional(),priority:ay,status:cy,tags:W.array(W.string()),addedAt:W.string(),completedAt:W.string().optional(),convertedTo:W.string().optional(),source:W.string().optional(),sourceFiles:W.array(W.string()).optional(),painPoints:W.array(W.string()).optional(),solutions:W.array(W.string()).optional(),filesAffected:W.array(W.string()).optional(),impactEffort:ly.optional(),implementationNotes:W.string().optional(),stack:uy.optional(),modules:W.array(dy).optional(),roles:W.array(my).optional(),risks:W.array(W.string()).optional(),risksCount:W.number().optional()}),Id=W.object({ideas:W.array(py),lastUpdated:W.string()}),_x={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});var Ma,Le,ps=v(()=>{"use strict";$d();xt();z();Ms();Qt();Ma=class extends Be{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",Id)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:pe(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:b()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=is(Zt.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;At.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},Le=new Ma});var _a,wn,Oa=v(()=>{"use strict";ao();z();Qt();_a=class extends Be{static{l(this,"MetricsStorage")}constructor(){super("metrics.json",hu)}getDefault(){return{...yu}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),n=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,c=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?n:(i.avgCompressionRate*i.syncCount+n)/a,p=[...i.dailyStats],m=p.findIndex(E=>E.date===o);if(m>=0){let E=p[m];p[m]={...E,tokensSaved:E.tokensSaved+s,syncs:E.syncs+1,avgCompressionRate:(E.avgCompressionRate*E.syncs+n)/(E.syncs+1),totalDuration:E.totalDuration+t.duration}}else p.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:n,totalDuration:t.duration});let g=new Date;g.setDate(g.getDate()-90);let h=g.toISOString().split("T")[0],S=p.filter(E=>E.date>=h),w=[...i.agentUsage];if(t.agents)for(let E of t.agents){let D=w.findIndex(V=>V.agentName===E);D>=0?w[D]={...w[D],usageCount:w[D].usageCount+1,tokensSaved:w[D].tokensSaved+Math.floor(s/t.agents.length)}:w.push({agentName:E,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:c,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:w,dailyStats:S,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),n=this.getPrev30Days(t.dailyStats),o=s.reduce((c,u)=>c+u.tokensSaved,0),i=n.reduce((c,u)=>c+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:wu(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((c,u)=>u.usageCount-c.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),n=new Date;n.setDate(n.getDate()-t);let o=n.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(n=>n.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let n=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=n&&i.date<o)}},wn=new _a});import Q from"node:fs/promises";import K from"node:path";async function Eo(r){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(P.exists(r)&&P.hasDoc(r,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=R.getGlobalProjectPath(r),n=K.join(s,"storage"),o=K.join(s,"index"),i=K.join(s,"memory");t.backupDir=await gy(n,o,i),P.getDb(r);for(let{filename:c,key:u}of Fa){let d=K.join(n,c),p=await Ot(d);if(p===null){t.skippedFiles.push(c);continue}try{P.setDoc(r,u,p),Md(r,u,p),t.migratedFiles.push(c)}catch(m){t.errors.push({file:c,error:String(m)})}}for(let{filename:c,key:u}of La){let d=K.join(o,c),p=await Ot(d);if(p===null){t.skippedFiles.push(`index/${c}`);continue}try{P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(p),new Date().toISOString()),_d(r,u,p),t.migratedFiles.push(`index/${c}`)}catch(m){t.errors.push({file:`index/${c}`,error:String(m)})}}await Ty(r,o,t),await vy(r,o,t),await Ey(r,i,t),await Py(r,i,t);let a=K.join(s,"sessions");return await Cy(r,a,t),t.errors.length===0&&await xy(n,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function gy(r,e,t){let s=K.join(r,"backup");return await Q.mkdir(s,{recursive:!0}),await Q.mkdir(K.join(s,"index"),{recursive:!0}),await Q.mkdir(K.join(s,"memory"),{recursive:!0}),await Na(r,s,n=>n.endsWith(".json")||n.endsWith(".jsonl")),await Na(e,K.join(s,"index")),await Na(t,K.join(s,"memory")),s}async function Na(r,e,t){try{let s=await Q.readdir(r,{withFileTypes:!0});for(let n of s){if(!n.isFile()||t&&!t(n.name))continue;let o=K.join(r,n.name),i=K.join(e,n.name);await Q.copyFile(o,i)}}catch(s){if(!A(s))throw s}}function Md(r,e,t){switch(e){case"state":fy(r,t);break;case"queue":hy(r,t);break;case"ideas":yy(r,t);break;case"shipped":wy(r,t);break;case"metrics":ky(r,t);break;case"analysis":Sy(r,t);break}}function fy(r,e){let t=P.getDb(r),s=t.prepare(`
|
|
475
584
|
INSERT OR REPLACE INTO tasks
|
|
476
585
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
477
586
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -482,92 +591,92 @@ echo "prjct"
|
|
|
482
591
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
483
592
|
depends_on, started_at, completed_at, output, summary)
|
|
484
593
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
485
|
-
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(
|
|
594
|
+
`),o=l((a,c)=>{if(!a||!a.id)return;s.run(j(a.id)??`task-${Date.now()}`,j(a.description??a.parentDescription)??"",j(a.type),j(c??a.status)??"unknown",j(a.parentDescription),j(a.branch),j(a.linearId),j(a.linearUuid),j(a.sessionId),j(a.featureId),j(a.startedAt)??new Date().toISOString(),j(a.completedAt),j(a.shippedAt),j(a.pausedAt),j(a.pauseReason),j(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let p=u[d];n.run(j(p.id)??`subtask-${d}`,j(a.id),j(p.description)??"",j(p.status)??"pending",j(p.domain),j(p.agent),d,p.dependsOn?JSON.stringify(p.dependsOn):null,j(p.startedAt),j(p.completedAt),j(p.output),p.summary?JSON.stringify(p.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function hy(r,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
486
595
|
INSERT OR REPLACE INTO queue_tasks
|
|
487
596
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
488
597
|
feature_id, feature_name)
|
|
489
598
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
490
|
-
`);for(let o of t)n.run(
|
|
599
|
+
`);for(let o of t)n.run(j(o.id)??`queue-${Date.now()}`,j(o.description)??"",j(o.type),j(o.priority),j(o.section),j(o.createdAt)??new Date().toISOString(),o.completed?1:0,j(o.completedAt),j(o.featureId),j(o.featureName))}function yy(r,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
491
600
|
INSERT OR REPLACE INTO ideas
|
|
492
601
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
493
602
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
494
|
-
`);for(let o of t)n.run(
|
|
603
|
+
`);for(let o of t)n.run(j(o.id)??`idea-${Date.now()}`,j(o.text)??"",j(o.status)??"pending",j(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,j(o.addedAt)??new Date().toISOString(),j(o.convertedTo),j(o.details),JSON.stringify(o))}function wy(r,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
495
604
|
INSERT OR REPLACE INTO shipped_features
|
|
496
605
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
497
606
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
498
|
-
`);for(let o of t)n.run(
|
|
607
|
+
`);for(let o of t)n.run(j(o.id)??`ship-${Date.now()}`,j(o.name)??"",j(o.shippedAt)??new Date().toISOString(),j(o.version)??"0.0.0",j(o.description),j(o.type),j(o.duration),JSON.stringify(o))}function ky(r,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
499
608
|
INSERT OR REPLACE INTO metrics_daily
|
|
500
609
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
501
610
|
VALUES (?, ?, ?, ?, ?)
|
|
502
|
-
`);for(let o of t)n.run(
|
|
611
|
+
`);for(let o of t)n.run(j(o.date)??new Date().toISOString().slice(0,10),gs(o.tokensSaved)??0,gs(o.syncs)??0,gs(o.avgCompressionRate)??0,gs(o.totalDuration)??0)}function Sy(r,e){let s=P.getDb(r).prepare(`
|
|
503
612
|
INSERT OR REPLACE INTO analysis
|
|
504
613
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
505
614
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
506
|
-
`),n=l((o,i)=>{o&&s.run(i,
|
|
615
|
+
`),n=l((o,i)=>{o&&s.run(i,j(o.status)??"unknown",j(o.commitHash),j(o.signature),j(o.sealedAt),j(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&n(e.draft,"draft"),e.sealed&&n(e.sealed,"sealed")}function _d(r,e,t){e==="categories-cache"&&by(r,t)}function by(r,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let n=P.getDb(r).prepare(`
|
|
507
616
|
INSERT OR REPLACE INTO index_files
|
|
508
617
|
(path, categories, domain, score, size, mtime, language)
|
|
509
618
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
510
|
-
`);for(let o of t){let i=
|
|
619
|
+
`);for(let o of t){let i=j(o.path);i&&n.run(i,o.categories?JSON.stringify(o.categories):null,j(o.primaryDomain),i)}}async function Ty(r,e,t){let s=K.join(e,"checksums.json"),n=await Ot(s);if(n===null){t.skippedFiles.push("index/checksums.json");return}try{let o=n.checksums;if(!o)return;let i=P.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[c,u]of Object.entries(o))a.run(c,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function vy(r,e,t){let s=K.join(e,"file-scores.json"),n=await Ot(s);if(n===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=n.scores;if(!o||!Array.isArray(o))return;let i=P.getDb(r),a=i.prepare(`
|
|
511
620
|
INSERT OR REPLACE INTO index_files
|
|
512
621
|
(path, score, size, mtime, language, categories, domain)
|
|
513
622
|
VALUES (?, ?, ?, ?, NULL,
|
|
514
623
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
515
624
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
516
|
-
`);i.transaction(()=>{for(let c of o){let u=
|
|
517
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=
|
|
518
|
-
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=
|
|
625
|
+
`);i.transaction(()=>{for(let c of o){let u=j(c.path);u&&a.run(u,gs(c.score)??0,gs(c.size),j(c.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Ey(r,e,t){let s=K.join(e,"events.jsonl");try{let o=(await Q.readFile(s,"utf-8")).split(`
|
|
626
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=P.getDb(r),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=j(u.type??u.action)??"unknown",p=j(u.taskId??u.task_id),m=j(u.timestamp??u.ts)??new Date().toISOString();a.run(d,p,c,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(n){A(n)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(n)})}}async function Py(r,e,t){let s=K.join(e,"learnings.jsonl");try{let o=(await Q.readFile(s,"utf-8")).split(`
|
|
627
|
+
`).filter(c=>c.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=P.getDb(r),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let c of o)try{let u=JSON.parse(c),d=`learning:${j(u.taskId??u.timestamp)??Date.now()}`,p=u.tags,m=p&&p.length>0?j(p[0]):null;a.run(d,m,c,1,j(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(n){A(n)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(n)})}}async function Cy(r,e,t){let n=P.getDb(r).prepare(`
|
|
519
628
|
INSERT OR IGNORE INTO sessions
|
|
520
629
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
521
630
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
522
|
-
`),o=l(u=>{!u||!u.id||n.run(
|
|
523
|
-
`).filter(
|
|
631
|
+
`),o=l(u=>{!u||!u.id||n.run(j(u.id),j(u.projectId)??r,j(u.task)??"",j(u.status)??"completed",j(u.startedAt)??new Date().toISOString(),j(u.pausedAt),j(u.completedAt),gs(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=K.join(e,"current.json"),a=await Ot(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await Q.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let c=K.join(e,"archive");try{let u=await Q.readdir(c);for(let p of u){let m=K.join(c,p);try{if(!(await Q.stat(m)).isDirectory())continue;let h=await Q.readdir(m);for(let w of h){if(!w.endsWith(".json"))continue;let E=K.join(m,w),D=await Ot(E);if(D!==null)try{o(D),t.migratedFiles.push(`sessions/archive/${p}/${w}`),await Q.unlink(E).catch(()=>{})}catch(V){t.errors.push({file:`sessions/archive/${p}/${w}`,error:String(V)})}}(await Q.readdir(m)).length===0&&await Q.rmdir(m).catch(()=>{})}catch{}}(await Q.readdir(c).catch(()=>[])).length===0&&await Q.rmdir(c).catch(()=>{})}catch{}try{(await Q.readdir(e)).length===0&&await Q.rmdir(e).catch(()=>{})}catch{}}async function xy(r,e,t,s){let n=l(async(i,a)=>{try{await Q.unlink(i)}catch(c){A(c)||s.errors.push({file:a,error:`cleanup: ${String(c)}`})}},"deleteFile");for(let{filename:i}of Fa)await n(K.join(r,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await n(K.join(e,i),`cleanup:index/${i}`);await n(K.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await n(K.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function j(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function gs(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function Ot(r){try{let e=await Q.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(A(e)||e instanceof SyntaxError)return null;throw e}}async function Po(r){let e=R.getGlobalProjectPath(r),t=K.join(e,"storage"),s=0;P.getDb(r);for(let{filename:h,key:S}of Fa){let w=K.join(t,h),E=await Ot(w);if(E!==null){P.setDoc(r,S,E),Md(r,S,E);try{await Q.unlink(w)}catch{}s++}}let n=K.join(e,"project.json"),o=await Ot(n);if(o!==null){P.setDoc(r,"project",o);try{await Q.unlink(n)}catch{}s++}let i=K.join(e,"memory");for(let h of["events.jsonl","learnings.jsonl"]){let S=K.join(i,h);try{let E=(await Q.readFile(S,"utf-8")).split(`
|
|
632
|
+
`).filter(V=>V.trim());if(E.length===0){await Q.unlink(S),s++;continue}let D=P.getDb(r);if(h==="events.jsonl"){let V=D.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");D.transaction(()=>{for(let F of E)try{let k=JSON.parse(F);V.run(j(k.type??k.action)??"unknown",j(k.taskId??k.task_id),F,j(k.timestamp??k.ts)??new Date().toISOString())}catch{}})()}else{let V=D.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");D.transaction(()=>{for(let F of E)try{let k=JSON.parse(F),$=`learning:${j(k.taskId??k.timestamp)??Date.now()}`,O=k.tags;V.run($,j(O?.[0]),F,1,j(k.timestamp)??new Date().toISOString())}catch{}})()}await Q.unlink(S),s++}catch{}}let a=K.join(e,"sessions"),c=l(h=>{if(!h||!h.id)return;P.getDb(r).prepare(`
|
|
524
633
|
INSERT OR IGNORE INTO sessions
|
|
525
634
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
526
635
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
527
|
-
`).run(I(h.id),I(h.projectId)??r,I(h.task)??"",I(h.status)??"completed",I(h.startedAt)??new Date().toISOString(),I(h.pausedAt),I(h.completedAt),Ss(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=Y.join(a,"current.json"),p=await Ut(u);p!==null&&(c(p),await ee.unlink(u).catch(()=>{}),s++);let m=Y.join(a,"archive");try{let h=await ee.readdir(m);for(let y of h){let v=Y.join(m,y);try{if(!(await ee.stat(v)).isDirectory())continue;let U=await ee.readdir(v);for(let j of U){if(!j.endsWith(".json"))continue;let E=await Ut(Y.join(v,j));E!==null&&(c(E),await ee.unlink(Y.join(v,j)).catch(()=>{}),s++)}(await ee.readdir(v)).length===0&&await ee.rmdir(v).catch(()=>{})}catch{}}(await ee.readdir(m).catch(()=>[])).length===0&&await ee.rmdir(m).catch(()=>{})}catch{}try{(await ee.readdir(a)).length===0&&await ee.rmdir(a).catch(()=>{})}catch{}let d=Y.join(e,"index"),g=[...Za.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let k=Y.join(d,h),y=await Ut(k);if(y===null)continue;let v=Za.find(D=>D.filename===h);v&&(C.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",v.key,JSON.stringify(y),new Date().toISOString()),sp(r,v.key,y));try{await ee.unlink(k)}catch{}s++}return s}var ec,Za,tc=S(()=>{"use strict";Te();W();re();ec=[{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"}],Za=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Io,"migrateJsonToSqlite");l(Iw,"createBackup");l(Qa,"copyFiles");l(tp,"populateNormalized");l($w,"populateTasksFromState");l(Mw,"populateQueueTasks");l(_w,"populateIdeas");l(Ow,"populateShippedFeatures");l(Nw,"populateMetricsDaily");l(Lw,"populateAnalysis");l(sp,"populateIndexTables");l(Fw,"populateCategoriesIndex");l(Uw,"migrateChecksums");l(Hw,"migrateFileScores");l(Gw,"migrateEventsJsonl");l(Ww,"migrateLearningsJsonl");l(Vw,"migrateSessionFiles");l(Bw,"cleanupJsonFiles");l(I,"toStr");l(Ss,"toNum");l(Ut,"readJsonSafe");l($o,"sweepLegacyJson")});function op(r){return[...r].sort((e,t)=>{let s=rp[e.section]-rp[t.section];return s!==0?s:np[e.priority]-np[t.priority]})}function Tr(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var np,rp,Mo=S(()=>{"use strict";np={critical:0,high:1,medium:2,low:3},rp={active:0,previously_active:1,backlog:2};l(op,"sortBySectionAndPriority");l(Tr,"uniqueBy")});var sc,be,Xt=S(()=>{"use strict";It();ka();Mo();ie();Ws();is();sc=class extends qe{static{l(this,"QueueStorage")}constructor(){super("queue.json",nd)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return op(t)[0]||null}async addTask(e,t){let s={...t,id:ye(),createdAt:T(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:T()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=T(),n=t.map(o=>({...o,id:ye(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:T()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:T()},s):i),lastUpdated:T()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:T()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:T()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:T()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=gs(as.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Mt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:T()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},be=new sc});import{z as te}from"zod";var zw,ip,Jw,qw,Kw,Xw,Yw,Qw,Zw,ap,cp=S(()=>{"use strict";zw=te.enum(["feature","fix","improvement","refactor"]),ip=te.enum(["pass","warning","fail","skipped"]),Jw=te.enum(["added","changed","fixed","removed"]),qw=te.object({hours:te.number(),minutes:te.number(),totalMinutes:te.number()}),Kw=te.object({filesChanged:te.number().nullable().optional(),linesAdded:te.number().nullable().optional(),linesRemoved:te.number().nullable().optional(),commits:te.number().nullable().optional()}),Xw=te.object({description:te.string(),type:Jw.optional()}),Yw=te.object({lintStatus:ip.nullable().optional(),lintDetails:te.string().optional(),testStatus:ip.nullable().optional(),testDetails:te.string().optional()}),Qw=te.object({hash:te.string().optional(),message:te.string().optional(),branch:te.string().optional()}),Zw=te.object({id:te.string(),name:te.string(),version:te.string().nullable().optional(),type:zw,agent:te.string().optional(),description:te.string().optional(),changes:te.array(Xw).optional(),codeSnippets:te.array(te.string()).optional(),commit:Qw.optional(),codeMetrics:Kw.optional(),qualityMetrics:Yw.optional(),quantitativeImpact:te.string().optional(),duration:qw.optional(),tasksCompleted:te.number().nullable().optional(),shippedAt:te.string(),featureId:te.string().optional()}),ap=te.object({shipped:te.array(Zw),lastUpdated:te.string()})});var nc,tt,zs=S(()=>{"use strict";It();cp();ie();Ws();is();nc=class extends qe{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",ap)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:ye(),shippedAt:T()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:T()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=gs(as.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Mt.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:T()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},tt=new nc});import{z as me}from"zod";var ek,tk,lp,ZA,eD,tD,bs,up,vr=S(()=>{"use strict";ek=me.enum(["improving","stable","declining"]),tk=me.object({sprintNumber:me.number(),startDate:me.string(),endDate:me.string(),pointsCompleted:me.number(),tasksCompleted:me.number(),avgVariance:me.number(),estimationAccuracy:me.number()}),lp=me.object({category:me.string(),avgVariance:me.number(),taskCount:me.number()}),ZA=me.object({totalPoints:me.number(),sprints:me.number(),estimatedDate:me.string()}),eD=me.object({sprints:me.array(tk),averageVelocity:me.number(),velocityTrend:ek,estimationAccuracy:me.number(),overEstimated:me.array(lp),underEstimated:me.array(lp),lastUpdated:me.string()}),tD=me.object({sprintLengthDays:me.number().min(1).max(90).default(7),startDay:me.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:me.number().min(1).max(52).default(6),accuracyTolerance:me.number().min(0).max(100).default(20)}),bs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},up={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var rc,_o,oc=S(()=>{"use strict";vr();is();rc=class extends qe{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:up,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},_o=new rc});var Cr,ic,ac,dp=S(()=>{"use strict";cr();ie();Cr=3,ic=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Cr){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Cr} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=Cr){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${Cr} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,p=t.get(u)||{count:0,tasks:[]};p.count++,p.tasks.push(n.taskId),t.set(u,p)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of n)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=Cr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((s,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[H.FILE_STRUCTURE,H.ARCHITECTURE],tech_stack:[H.TECH_STACK],architecture:[H.ARCHITECTURE,H.CODE_STYLE],estimation:[H.SHIP_WORKFLOW],workflow:[H.SHIP_WORKFLOW,H.CODE_STYLE],gotcha:[H.TEST_BEHAVIOR,H.ARCHITECTURE]}[e]||[]}getTitleForPattern(e){return`${{file_cochange:"File coupling",tech_stack:"Tech stack",architecture:"Architecture pattern",estimation:"Estimation insight",workflow:"Workflow pattern",gotcha:"Known gotcha"}[e.category]}: ${e.pattern.slice(0,80)}`}formatPatternContent(e){let t=["source: auto-learned",`pattern: ${e.pattern}`,`occurrences: ${e.occurrences}`,`confidence: ${e.confidence}`,`category: ${e.category}`,`last_updated: ${T()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
528
|
-
`)}},
|
|
529
|
-
`)}},
|
|
530
|
-
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function
|
|
636
|
+
`).run(j(h.id),j(h.projectId)??r,j(h.task)??"",j(h.status)??"completed",j(h.startedAt)??new Date().toISOString(),j(h.pausedAt),j(h.completedAt),gs(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=K.join(a,"current.json"),d=await Ot(u);d!==null&&(c(d),await Q.unlink(u).catch(()=>{}),s++);let p=K.join(a,"archive");try{let h=await Q.readdir(p);for(let w of h){let E=K.join(p,w);try{if(!(await Q.stat(E)).isDirectory())continue;let V=await Q.readdir(E);for(let k of V){if(!k.endsWith(".json"))continue;let $=await Ot(K.join(E,k));$!==null&&(c($),await Q.unlink(K.join(E,k)).catch(()=>{}),s++)}(await Q.readdir(E)).length===0&&await Q.rmdir(E).catch(()=>{})}catch{}}(await Q.readdir(p).catch(()=>[])).length===0&&await Q.rmdir(p).catch(()=>{})}catch{}try{(await Q.readdir(a)).length===0&&await Q.rmdir(a).catch(()=>{})}catch{}let m=K.join(e,"index"),g=[...La.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of g){let S=K.join(m,h),w=await Ot(S);if(w===null)continue;let E=La.find(D=>D.filename===h);E&&(P.run(r,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",E.key,JSON.stringify(w),new Date().toISOString()),_d(r,E.key,w));try{await Q.unlink(S)}catch{}s++}return s}var Fa,La,Ua=v(()=>{"use strict";fe();H();ee();Fa=[{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"}],La=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];l(Eo,"migrateJsonToSqlite");l(gy,"createBackup");l(Na,"copyFiles");l(Md,"populateNormalized");l(fy,"populateTasksFromState");l(hy,"populateQueueTasks");l(yy,"populateIdeas");l(wy,"populateShippedFeatures");l(ky,"populateMetricsDaily");l(Sy,"populateAnalysis");l(_d,"populateIndexTables");l(by,"populateCategoriesIndex");l(Ty,"migrateChecksums");l(vy,"migrateFileScores");l(Ey,"migrateEventsJsonl");l(Py,"migrateLearningsJsonl");l(Cy,"migrateSessionFiles");l(xy,"cleanupJsonFiles");l(j,"toStr");l(gs,"toNum");l(Ot,"readJsonSafe");l(Po,"sweepLegacyJson")});function Ld(r){return[...r].sort((e,t)=>{let s=Nd[e.section]-Nd[t.section];return s!==0?s:Od[e.priority]-Od[t.priority]})}function Ha(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Od,Nd,Ga=v(()=>{"use strict";Od={critical:0,high:1,medium:2,low:3},Nd={active:0,previously_active:1,backlog:2};l(Ld,"sortBySectionAndPriority");l(Ha,"uniqueBy")});var Wa,we,Wt=v(()=>{"use strict";xt();aa();Ga();z();Ms();Qt();Wa=class extends Be{static{l(this,"QueueStorage")}constructor(){super("queue.json",Nu)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return Ld(t)[0]||null}async addTask(e,t){let s={...t,id:pe(),createdAt:b(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:b()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=b(),n=t.map(o=>({...o,id:pe(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:b()},s):i),lastUpdated:b()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:b()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:b()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=is(Zt.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;At.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},we=new Wa});import{z as Z}from"zod";var Ry,Fd,Ay,Dy,jy,Iy,$y,My,_y,Ud,Hd=v(()=>{"use strict";Ry=Z.enum(["feature","fix","improvement","refactor"]),Fd=Z.enum(["pass","warning","fail","skipped"]),Ay=Z.enum(["added","changed","fixed","removed"]),Dy=Z.object({hours:Z.number(),minutes:Z.number(),totalMinutes:Z.number()}),jy=Z.object({filesChanged:Z.number().nullable().optional(),linesAdded:Z.number().nullable().optional(),linesRemoved:Z.number().nullable().optional(),commits:Z.number().nullable().optional()}),Iy=Z.object({description:Z.string(),type:Ay.optional()}),$y=Z.object({lintStatus:Fd.nullable().optional(),lintDetails:Z.string().optional(),testStatus:Fd.nullable().optional(),testDetails:Z.string().optional()}),My=Z.object({hash:Z.string().optional(),message:Z.string().optional(),branch:Z.string().optional()}),_y=Z.object({id:Z.string(),name:Z.string(),version:Z.string().nullable().optional(),type:Ry,agent:Z.string().optional(),description:Z.string().optional(),changes:Z.array(Iy).optional(),codeSnippets:Z.array(Z.string()).optional(),commit:My.optional(),codeMetrics:jy.optional(),qualityMetrics:$y.optional(),quantitativeImpact:Z.string().optional(),duration:Dy.optional(),tasksCompleted:Z.number().nullable().optional(),shippedAt:Z.string(),featureId:Z.string().optional()}),Ud=Z.object({shipped:Z.array(_y),lastUpdated:Z.string()})});var Va,Xe,Ns=v(()=>{"use strict";xt();Hd();z();Ms();Qt();Va=class extends Be{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",Ud)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:pe(),shippedAt:b()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:b()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-10080*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=is(Zt.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;At.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},Xe=new Va});import{z as le}from"zod";var Oy,Ny,Gd,ER,PR,CR,fs,Wd,gr=v(()=>{"use strict";Oy=le.enum(["improving","stable","declining"]),Ny=le.object({sprintNumber:le.number(),startDate:le.string(),endDate:le.string(),pointsCompleted:le.number(),tasksCompleted:le.number(),avgVariance:le.number(),estimationAccuracy:le.number()}),Gd=le.object({category:le.string(),avgVariance:le.number(),taskCount:le.number()}),ER=le.object({totalPoints:le.number(),sprints:le.number(),estimatedDate:le.string()}),PR=le.object({sprints:le.array(Ny),averageVelocity:le.number(),velocityTrend:Oy,estimationAccuracy:le.number(),overEstimated:le.array(Gd),underEstimated:le.array(Gd),lastUpdated:le.string()}),CR=le.object({sprintLengthDays:le.number().min(1).max(90).default(7),startDay:le.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:le.number().min(1).max(52).default(6),accuracyTolerance:le.number().min(0).max(100).default(20)}),fs={sprintLengthDays:7,startDay:"monday",windowSize:6,accuracyTolerance:20},Wd={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Ba,Co,Ja=v(()=>{"use strict";gr();Qt();Ba=class extends Be{static{l(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Wd,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}},Co=new Ba});var fr,za,qa,Vd=v(()=>{"use strict";ir();z();fr=3,za=class{static{l(this,"OutcomeMemoryLearner")}async learnFromTaskHistory(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=[...this.extractFileCochangePatterns(t),...this.extractStackPatterns(t),...this.extractArchitecturePatterns(t),...this.extractGotchaPatterns(t)];n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=fr){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${fr} occurrences needed`});return n}async learnFromOutcomes(e,t,s){let n={patternsExtracted:0,patternsQualified:0,memoriesInjected:0,patternsSkipped:0,details:[]};if(t.length===0)return n;let o=this.extractOutcomePatterns(t);n.patternsExtracted=o.length;for(let i of o)if(i.occurrences>=fr){n.patternsQualified++;let a=await this.injectIntoMemory(e,i,s);a&&(n.memoriesInjected++,n.details.push({pattern:i.pattern,action:a.action,confidence:i.confidence}))}else n.patternsSkipped++,n.details.push({pattern:i.pattern,action:"skipped",confidence:i.confidence,reason:`${i.occurrences}/${fr} occurrences needed`});return n}extractFileCochangePatterns(e){let t=new Map;for(let n of e){if(!n.subtaskSummaries)continue;let o=new Set;for(let a of n.subtaskSummaries)if(a.filesChanged)for(let c of a.filesChanged)o.add(c.path);let i=Array.from(o).sort();for(let a=0;a<i.length;a++)for(let c=a+1;c<i.length;c++){let u=`${i[a]}|${i[c]}`,d=t.get(u)||{count:0,tasks:[]};d.count++,d.tasks.push(n.taskId),t.set(u,d)}}let s=[];for(let[n,{count:o,tasks:i}]of t)if(o>=2){let[a,c]=n.split("|");s.push({pattern:`Files "${a}" and "${c}" frequently change together (${o} tasks)`,occurrences:o,confidence:this.calculateConfidence(o),category:"file_cochange",sourceTasks:i})}return s.sort((n,o)=>o.occurrences-n.occurrences)}extractStackPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.stackConfirmed)for(let n of s.feedback.stackConfirmed){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:`Project uses ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"tech_stack",sourceTasks:o}))}extractArchitecturePatterns(e){let t=new Map;for(let s of e)if(s.feedback?.patternsDiscovered)for(let n of s.feedback.patternsDiscovered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).map(([s,{count:n,tasks:o}])=>({pattern:s,occurrences:n,confidence:this.calculateConfidence(n),category:"architecture",sourceTasks:o}))}extractGotchaPatterns(e){let t=new Map;for(let s of e)if(s.feedback?.issuesEncountered)for(let n of s.feedback.issuesEncountered){let o=t.get(n)||{count:0,tasks:[]};o.count++,o.tasks.push(s.taskId),t.set(n,o)}return Array.from(t.entries()).filter(([s,{count:n}])=>n>=2).map(([s,{count:n,tasks:o}])=>({pattern:`Known gotcha: ${s}`,occurrences:n,confidence:this.calculateConfidence(n),category:"gotcha",sourceTasks:o}))}extractOutcomePatterns(e){let t=[],s=new Map,n=new Map;for(let i of e){for(let a of i.learnings.whatWorked){let c=s.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),s.set(a,c)}for(let a of i.learnings.whatDidnt){let c=n.get(a)||{count:0,ids:[]};c.count++,c.ids.push(i.id),n.set(a,c)}}for(let[i,{count:a,ids:c}]of s)t.push({pattern:`What works: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"workflow",sourceTasks:c});for(let[i,{count:a,ids:c}]of n)t.push({pattern:`Known issue: ${i}`,occurrences:a,confidence:this.calculateConfidence(a),category:"gotcha",sourceTasks:c});let o=e.filter(i=>i.effort.variance.percentage>30);return o.length>=fr&&t.push({pattern:`Tasks are frequently underestimated (${o.length}/${e.length} over 30% variance)`,occurrences:o.length,confidence:this.calculateConfidence(o.length),category:"estimation",sourceTasks:o.map(i=>i.id)}),t}getAllPatterns(e,t=[]){return[...this.extractFileCochangePatterns(e),...this.extractStackPatterns(e),...this.extractArchitecturePatterns(e),...this.extractGotchaPatterns(e),...this.extractOutcomePatterns(t)].sort((s,n)=>n.occurrences-s.occurrences)}async injectIntoMemory(e,t,s){let n=this.getTagsForCategory(t.category),o=`[auto-learned] ${this.getTitleForPattern(t)}`,i=this.formatPatternContent(t),c=(await s.searchMemories(e,t.pattern)).find(u=>u.title.startsWith("[auto-learned]")&&u.content.includes(t.pattern));return c?(await s.updateMemory(e,c.id,{content:i,tags:n}),{action:"updated"}):(await s.createMemory(e,{title:o,content:i,tags:n,userTriggered:!1}),{action:"created"})}calculateConfidence(e){return e>=5?"high":e>=3?"medium":"low"}getTagsForCategory(e){return{file_cochange:[Ne.FILE_STRUCTURE,Ne.ARCHITECTURE],tech_stack:[Ne.TECH_STACK],architecture:[Ne.ARCHITECTURE,Ne.CODE_STYLE],estimation:[Ne.SHIP_WORKFLOW],workflow:[Ne.SHIP_WORKFLOW,Ne.CODE_STYLE],gotcha:[Ne.TEST_BEHAVIOR,Ne.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: ${b()}`];return e.sourceTasks.length>0&&t.push(`source_tasks: ${e.sourceTasks.slice(0,5).join(", ")}`),t.join(`
|
|
637
|
+
`)}},qa=new za});import{z as C}from"zod";var Bd,Ly,Fy,Jd,Uy,Hy,Gy,Wy,Vy,By,Jy,zd,zy,qy,LR,qd,Kd,Xd,Yd,Ky,xo,Qd=v(()=>{"use strict";Bd=C.number().min(1).max(5),Ly=C.enum(["exceeded","met","partial","failed"]),Fy=C.enum(["definitely","probably","maybe","no"]),Jd=C.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),Uy=C.object({estimated:C.object({hours:C.number(),confidence:C.enum(["low","medium","high"]).optional(),source:C.enum(["prd","manual","historical"]).optional()}),actual:C.object({hours:C.number(),commits:C.number().optional(),linesAdded:C.number().optional(),linesRemoved:C.number().optional(),sessions:C.number().optional()}),variance:C.object({hours:C.number(),percentage:C.number(),reason:Jd.optional(),explanation:C.string().optional()})}),Hy=C.object({name:C.string(),baseline:C.number().nullable(),target:C.number(),actual:C.number(),unit:C.string(),achieved:C.boolean(),percentOfTarget:C.number()}),Gy=C.object({criteria:C.string(),met:C.boolean(),notes:C.string().optional()}),Wy=C.object({metrics:C.array(Hy),acceptanceCriteria:C.array(Gy),overallSuccess:Ly,successScore:C.number().min(0).max(100)}),Vy=C.object({category:C.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:C.string(),actionable:C.boolean(),action:C.string().optional()}),By=C.object({whatWorked:C.array(C.string()),whatDidnt:C.array(C.string()),surprises:C.array(C.string()),recommendations:C.array(Vy)}),Jy=C.object({valueDelivered:C.number().min(1).max(10),userImpact:C.enum(["none","low","medium","high","critical"]),businessImpact:C.enum(["none","low","medium","high","critical"]),roiScore:C.number(),worthIt:Fy,worthItReason:C.string().optional(),alternativeConsidered:C.string().optional(),betterAlternativeExists:C.boolean().optional()}),zd=C.object({id:C.string(),taskId:C.string(),description:C.string(),estimatedMinutes:C.number().optional(),actualMinutes:C.number(),completedAsPlanned:C.boolean(),qualityScore:Bd,blockers:C.array(C.string()),agentUsed:C.string().optional(),skillsUsed:C.array(C.string()).optional(),startedAt:C.string(),completedAt:C.string()}),zy=C.object({id:C.string(),featureId:C.string(),featureName:C.string(),prdId:C.string().nullable(),version:C.string().optional(),branch:C.string().optional(),prUrl:C.string().optional(),effort:Uy,success:Wy.optional(),learnings:By,roi:Jy,rating:Bd,taskOutcomes:C.array(zd).optional(),startedAt:C.string(),shippedAt:C.string(),reviewedAt:C.string().optional(),reviewedBy:C.string().optional(),legacy:C.boolean().optional()}),qy=C.object({totalFeatures:C.number(),averageEstimationAccuracy:C.number(),averageSuccessRate:C.number(),averageROI:C.number(),bySuccessLevel:C.object({exceeded:C.number(),met:C.number(),partial:C.number(),failed:C.number()}),variancePatterns:C.array(C.object({reason:Jd,count:C.number(),averageVariance:C.number()})),topLearnings:C.array(C.object({insight:C.string(),frequency:C.number()}))}),LR=C.object({outcomes:C.array(zy),taskOutcomes:C.array(zd).optional(),aggregates:qy.optional(),lastUpdated:C.string(),lastAggregated:C.string().optional()}),qd={outcomes:[],taskOutcomes:[],lastUpdated:""},Kd=l((r,e)=>{let t=e-r,s=r>0?(e-r)/r*100:0;return{hours:t,percentage:Math.round(s*10)/10}},"calculateVariance"),Xd=l((r,e)=>e<=0?r*10:Math.round(r*10/e*100)/100,"calculateROIScore"),Yd=l(r=>r>=100?"exceeded":r>=80?"met":r>=50?"partial":"failed","determineSuccessLevel"),Ky=l(r=>Math.max(0,100-Math.abs(r)),"calculateEstimationAccuracy"),xo=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=>Ky(d.effort.variance.percentage)),t=r.filter(d=>d.success).map(d=>d.success.successScore),s=r.map(d=>d.roi.roiScore),n={exceeded:r.filter(d=>d.success?.overallSuccess==="exceeded").length,met:r.filter(d=>d.success?.overallSuccess==="met").length,partial:r.filter(d=>d.success?.overallSuccess==="partial").length,failed:r.filter(d=>d.success?.overallSuccess==="failed").length},o=r.filter(d=>d.effort.variance.reason).reduce((d,p)=>{let m=p.effort.variance.reason;return d[m]||(d[m]={count:0,totalVariance:0}),d[m].count++,d[m].totalVariance+=p.effort.variance.percentage,d},{}),i=Object.entries(o).map(([d,p])=>({reason:d,count:p.count,averageVariance:Math.round(p.totalVariance/p.count)})),c=r.flatMap(d=>[...d.learnings.whatWorked,...d.learnings.whatDidnt]).reduce((d,p)=>(d[p]=(d[p]||0)+1,d),{}),u=Object.entries(c).sort((d,p)=>p[1]-d[1]).slice(0,10).map(([d,p])=>({insight:d,frequency:p}));return{totalFeatures:r.length,averageEstimationAccuracy:Math.round(e.reduce((d,p)=>d+p,0)/e.length),averageSuccessRate:t.length>0?Math.round(t.reduce((d,p)=>d+p,0)/t.length):0,averageROI:Math.round(s.reduce((d,p)=>d+p,0)/s.length*100)/100,bySuccessLevel:n,variancePatterns:i,topLearnings:u}},"aggregateOutcomes")});var Ka,Zd,em=v(()=>{"use strict";Qd();Qt();z();Ka=class extends Be{static{l(this,"OutcomeStorage")}constructor(){super("outcomes.json")}getDefault(){return{...qd,lastUpdated:""}}getEventType(e){return`outcomes.${e}d`}async addFeatureOutcome(e,t){await this.update(e,s=>({...s,outcomes:[t,...s.outcomes],aggregates:xo([t,...s.outcomes]),lastUpdated:b()})),await this.publishEvent(e,"outcome.recorded",{outcomeId:t.id,featureName:t.featureName,success:t.success?.overallSuccess})}async addTaskOutcome(e,t){await this.update(e,s=>({...s,taskOutcomes:[t,...s.taskOutcomes||[]],lastUpdated:b()}))}async getFeatureOutcomes(e){return(await this.read(e)).outcomes}async getRecentOutcomes(e,t=10){return(await this.read(e)).outcomes.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async getTaskOutcomes(e,t){let s=await this.read(e),n=s.taskOutcomes||[];return t?s.outcomes.find(i=>i.featureId===t)?.taskOutcomes||[]:n}async getAggregates(e){let t=await this.read(e);return!t.aggregates&&t.outcomes.length>0?xo(t.outcomes):t.aggregates}async reaggregate(e){await this.update(e,t=>({...t,aggregates:xo(t.outcomes),lastAggregated:b(),lastUpdated:b()}))}migrateFromShipped(e){return e.shipped.map(t=>this.convertShippedToOutcome(t))}convertShippedToOutcome(e){let t=e.duration&&ft(e.duration)||60,s=t/60,n=t/60,o=Kd(s,n),i={whatWorked:[],whatDidnt:[],surprises:[],recommendations:[]},a=100,c=Xd(5,n);return{id:`out_feat_${e.id}`,featureId:e.featureId||e.id,featureName:e.name,prdId:null,version:e.version||void 0,branch:e.commit?.branch||void 0,prUrl:void 0,effort:{estimated:{hours:s,confidence:"low",source:"manual"},actual:{hours:n,commits:e.codeMetrics?.commits||void 0,linesAdded:e.codeMetrics?.linesAdded||void 0,linesRemoved:e.codeMetrics?.linesRemoved||void 0},variance:o},success:{metrics:[],acceptanceCriteria:[],overallSuccess:Yd(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}}},Zd=new Ka});import Xa from"node:fs/promises";import Ro from"node:path";var Ya,Qa,tm,sm=v(()=>{"use strict";H();J();Ya=".prjct/.prjct-state.md",Qa=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let s=Ro.join(e,Ya);await Xa.mkdir(Ro.dirname(s),{recursive:!0});let n=this.toMarkdown(t);await Xa.writeFile(s,n,"utf-8")}async remove(e){try{await Xa.unlink(Ro.join(e,Ya))}catch(t){if(!A(t))throw t}}async exists(e){let t=Ro.join(e,Ya);return x(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let s=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Started: ${s.startedAt}`),s.linearId&&t.push(`- Linear: ${s.linearId}`),s.branch&&t.push(`- Branch: ${s.branch}`),t.push(`- Status: ${s.status||"active"}`),t.push(""),s.subtasks&&s.subtasks.length>0){t.push("### Subtasks"),t.push(""),s.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let n=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(n/o*100);t.push(`**Progress**: ${n}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
638
|
+
`)}},tm=new Qa});var Za,kt,Ls=v(()=>{"use strict";De();Ms();ee();Za=class{static{l(this,"MemoryService")}async log(e,t,s,n){try{let o=await M.getProjectId(e);if(!o)return;I.appendEvent(o,`memory.${t}`,{...s,author:n})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await M.getProjectId(e);return s?I.query(s,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(o=>{let i=JSON.parse(o.data),{author:a,...c}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:c,author:a}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async search(e,t,s=50){let n=await this.getRecent(e,1e3),o=t.toLowerCase();return n.filter(i=>{let a=i.action.toLowerCase().includes(o),c=JSON.stringify(i.data).toLowerCase().includes(o);return a||c}).slice(-s)}async getByAction(e,t,s=50){try{let n=await M.getProjectId(e);return n?I.query(n,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,s).reverse().map(i=>{let a=JSON.parse(i.data),{author:c,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:c}}):[]}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async clear(e){try{let t=await M.getProjectId(e);if(!t)return;I.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 I.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(n=>{let o=JSON.parse(n.data);return{timestamp:n.timestamp,action:n.type.replace("memory.",""),...o}})}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async capEntries(e){try{let s=I.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=Zt.MEMORY_MAX_ENTRIES)return 0;let n=s-Zt.MEMORY_MAX_ENTRIES,o=I.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",n);At.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&&I.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),n}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},kt=new Za});import Xy from"node:path";function Yy(r){return As(Xy.resolve(r))}function hr(r){return r.toLowerCase().replace(/[^a-z0-9]+/g,"")}function Qy(r){return Ha(r,e=>`${hr(e.name)}::${hr(e.source)}`)}function Zy(r){return Ha(r,e=>`${hr(e.issue)}::${hr(e.file)}::${hr(e.source)}`)}var ec,ew,nm,rm=v(()=>{"use strict";ee();Ga();Ds();l(Yy,"repoHash");l(hr,"normalizeKey");l(Qy,"dedupePatterns");l(Zy,"dedupeAntiPatterns");ec=class{static{l(this,"PatternExtractor")}async extract(e){let t=Yy(e.projectPath),s=[];if(e.context7Verified)for(let u of e.frameworks)s.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let n=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=Qy([...s,...n]),a=Zy([...o]),c=`analysis:derived-rules:${t}`;return P.setDoc(e.projectId,c,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},ew=new ec,nm=ew});import yr from"node:fs/promises";import tw from"node:os";import wr from"node:path";function sw(r){return`# ${r.projectName}
|
|
639
|
+
${r.stack} | ${r.fileCount} files | v${r.version} | Branch: ${r.branch}`}function nw(r){return r.patterns.length===0?"":`
|
|
531
640
|
## Patterns
|
|
532
641
|
${r.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
|
|
533
642
|
`)}
|
|
534
|
-
`}function
|
|
643
|
+
`}function rw(r){if(r.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
|
|
535
644
|
## Anti-Patterns
|
|
536
645
|
${r.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
|
|
537
646
|
`)}
|
|
538
|
-
`}function
|
|
647
|
+
`}function ow(r){return r.knownGotchas.length===0?"":`
|
|
539
648
|
## Known Gotchas
|
|
540
649
|
${r.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
|
|
541
650
|
`)}
|
|
542
|
-
`}function
|
|
651
|
+
`}function iw(r){return r.recentShipped.length===0?"":`
|
|
543
652
|
## Recent Deliveries
|
|
544
653
|
${r.recentShipped.slice(0,5).map(t=>{let s=[`"${t.name}"`,t.type];return t.duration&&s.push(t.duration),t.filesChanged&&s.push(`${t.filesChanged} files`),`- ${s.join(" \u2014 ")}`}).join(`
|
|
545
654
|
`)}
|
|
546
|
-
`}function
|
|
655
|
+
`}function aw(r){if(!r.velocity)return"";let e=[];return r.velocity.avgPoints!=null&&e.push(`${r.velocity.avgPoints} pts/sprint`),r.velocity.trend&&e.push(r.velocity.trend),r.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${r.velocity.accuracy}%`),e.length===0?"":`
|
|
547
656
|
## Velocity
|
|
548
657
|
${e.join(" | ")}
|
|
549
|
-
`}function
|
|
658
|
+
`}function cw(r){let e=[["Build",r.build],["Test",r.test],["Lint",r.lint],["Dev",r.dev],["Format",r.format]].filter(([t,s])=>s);return e.length===0?"":`
|
|
550
659
|
## Commands
|
|
551
660
|
| Action | Command |
|
|
552
661
|
|--------|---------|
|
|
553
662
|
${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
|
|
554
663
|
`)}
|
|
555
|
-
`}function
|
|
664
|
+
`}function lw(r){let e=[];if(r.hasActiveTask&&e.push(`Active task: **${r.activeTaskDescription}**`),r.pausedTasks.length>0)for(let s of r.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(r.backlogCount>0){let s=r.topBacklog.slice(0,3).map(n=>`${n.description} [${n.priority}]`).join(", ");e.push(`Backlog: ${r.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return r.ideasCount>0&&t.push(`Ideas: ${r.ideasCount} pending`),r.shippedCount>0&&t.push(`Shipped: ${r.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
|
|
556
665
|
## State
|
|
557
666
|
${e.join(`
|
|
558
667
|
`)}
|
|
559
|
-
`}function
|
|
668
|
+
`}function uw(r){return r.userPatterns.length===0?"":`
|
|
560
669
|
## User Patterns
|
|
561
670
|
${r.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
|
|
562
671
|
`)}
|
|
563
|
-
`}function
|
|
672
|
+
`}function dw(r){return[nw(r),rw(r),ow(r),iw(r),aw(r),cw(r.commands),lw(r),uw(r)].filter(Boolean).join("")}function mw(r,e){let t=r.userInvocable!==!1;return`---
|
|
564
673
|
description: "${r.description} (${e.projectName}, ${e.stack})"
|
|
565
674
|
allowed-tools: [${r.allowedTools.map(s=>`"${s}"`).join(", ")}]
|
|
566
675
|
user-invocable: ${t}
|
|
567
|
-
---`}function
|
|
676
|
+
---`}function pw(r,e){return`${mw(r,e)}
|
|
568
677
|
|
|
569
|
-
${r.body(e)}`}var
|
|
570
|
-
${
|
|
678
|
+
${r.body(e)}`}var tc,sc,om,im=v(()=>{"use strict";Jt();Kt();l(sw,"formatProjectHeader");l(nw,"formatPatterns");l(rw,"formatAntiPatterns");l(ow,"formatGotchas");l(iw,"formatRecentShipped");l(aw,"formatVelocity");l(cw,"formatCommands");l(lw,"formatState");l(uw,"formatUserPatterns");l(dw,"formatRichContext");tc=[{name:"prjct-context",description:"Project context with state and user patterns",allowedTools:[],userInvocable:!1,condition:l(()=>!0,"condition"),body:l(r=>`${sw(r)}
|
|
679
|
+
${dw(r)}`,"body")},{name:"prjct-task",description:"Start a task with full project context",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>'## Workflow\n\n### Register Task\n```bash\nprjct task "$ARGUMENTS" --md\n```\nRead the Context Contract from CLI output \u2014 it has file paths, subtasks, and scope.\nIf CLI output is JSON with `options`, present choices to user.\n\n### Execute\n- Create feature branch if on main: `git checkout -b {type}/{slug}`\n- Work through subtasks; mark each done: `prjct done --md`\n### Ship\nWhen complete: `p. ship` or `prjct ship --md`\n',"body")},{name:"prjct-done",description:'Marks the current task as complete and feeds the feedback loop. Use when the user says "done", "finished", "ship it", or wants to complete current work. Completion data flows to sync \u2192 skill regeneration.',allowedTools:["Bash","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>{let e=["## Workflow"];return r.hasActiveTask&&e.push(`
|
|
571
680
|
Active task: **${r.activeTaskDescription}**`),e.push('\n```bash\nprjct done "$ARGUMENTS" --md\n```\nRead CLI output for completion summary and next steps.\n'),e.join(`
|
|
572
681
|
`)},"body")},{name:"prjct-ship",description:"Ship feature: PR, version bump, changelog. Auto-completes active task if one exists before shipping.",allowedTools:["Bash","Read","AskUserQuestion"],condition:l(()=>!0,"condition"),body:l(r=>`## Workflow
|
|
573
682
|
|
|
@@ -650,47 +759,81 @@ prjct tokens <input_tokens> <output_tokens>
|
|
|
650
759
|
|
|
651
760
|
Tokens accumulate \u2014 call multiple times during a task and they add up.
|
|
652
761
|
Token totals are saved to task history on completion for cost comparison across tasks.
|
|
653
|
-
`,"body")}];l(
|
|
654
|
-
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let
|
|
655
|
-
`).filter(Boolean).map(u=>{let[p,m,d]=u.split("|");return{hash:p,message:m,date:d}});let{stdout:c}=await O('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){V.debug("Git analysis failed (not a git repo?)",{error:ue(t)})}return e}async function Ht(r,e){let t=await P(hc.join(r,e));return t||V.debug("File not found",{filename:e}),t}async function Ip(r){let e={fileCount:0,version:"0.0.0",name:hc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await O('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){V.debug("File count failed",{path:r,error:ue(t)}),e.fileCount=0}try{let t=hc.join(r,"package.json"),s=await xe(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await Ht(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){V.debug("No package.json found",{path:r,error:ue(t)})}return await Ht(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Ht(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Ht(r,"requirements.txt")||await Ht(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function $p(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Ht(r,"bun.lockb")||await Ht(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Ht(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Ht(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Ht(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Ht(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Mp(r){return new Lo(r).detect()}var _p=S(()=>{"use strict";ss();Rp();He();K();ns();Dp();l(jp,"analyzeGit");l(Ht,"fileExistsInProject");l(Ip,"gatherStats");l($p,"detectCommands");l(Mp,"detectStack")});import Op from"node:fs/promises";import Fo from"node:path";var yc,wc,Np,Lp=S(()=>{"use strict";Pt();W();He();K();yc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Fo.join(r,n);await P(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Fo.basename(r);try{await _.read(s)}catch(n){R(n)||t.push(`state: ${w(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Fo.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await Op.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Op.readFile(Fo.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!R(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},wc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[yc.contextFilesExist(t),yc.jsonFilesValid(t),yc.noSensitiveData(t)];for(let d of c){let g=await d;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(d=>d.passed))&&s?.checks)for(let d of s.checks){if(d.enabled===!1){a++;continue}let g=await this.runCustomCheck(d,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(d)+1);a+=h.filter(k=>k.enabled!==!1).length;break}}let p=o.filter(d=>!d.passed).length,m=o.filter(d=>d.passed).length;return{passed:p===0,checks:o,totalMs:Date.now()-n,failedCount:p,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await O(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},Np=new wc});import Fp from"node:fs/promises";import kc from"node:path";var Sc,qs,bc=S(()=>{"use strict";mr();da();vd();Ed();Id();Aa();ss();at();os();Et();Te();jo();kn();Ws();re();ks();kr();Ya();tc();Xt();zs();Pt();oc();ie();K();ns();dp();bp();br();vp();Js();Pp();xp();_p();Lp();Sc=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await $.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=A.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Fp.rm(kc.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await _s()).installed){let j=await Do({autoRepair:!0});j.verified||V.warn(`Codex p. router not ready: ${j.message||"verification failed"}`)}try{n=await ls.ensureReady()}catch(j){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:ue(j)},error:`Context7 MCP is required but not ready: ${ue(j)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Io(this.projectId);try{let j=await $o(this.projectId);j>0&&V.info("Swept legacy JSON files into SQLite",{swept:j})}catch(j){V.debug("Legacy JSON sweep failed (non-critical)",{error:ue(j)})}let[a,c,u,p]=await Promise.all([jp(this.projectPath),Ip(this.projectPath),$p(this.projectPath),Mp(this.projectPath)]),m=t.full===!0,d,g=!0,h=new Set;if(!m&&Pd(this.projectId))try{let{diff:j,currentHashes:E}=await ja(this.projectPath,this.projectId),M=j.added.length+j.modified.length+j.deleted.length;if(M===0&&!t.changedFiles?.length)g=!1,d={isIncremental:!0,filesChanged:0,filesUnchanged:j.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let se=bd(j,this.projectId);h=Td(se.allAffected);let Me=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=se.allAffected.some(mt=>{let ms=mt.substring(mt.lastIndexOf("."));return Me.has(ms)}),d={isIncremental:!0,filesChanged:M,filesUnchanged:j.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}Da(this.projectId,E)}catch(j){V.debug("Incremental detection failed, falling back to full sync",{error:ue(j)})}else try{let{currentHashes:j}=await ja(this.projectPath,this.projectId);Da(this.projectId,j)}catch(j){V.debug("Hash computation failed (non-critical)",{error:ue(j)})}if(g)try{await Promise.all([Vu(this.projectPath,this.projectId),Sd(this.projectPath,this.projectId),jd(this.projectPath,this.projectId)])}catch(j){V.debug("File ranking index build failed (non-critical)",{error:ue(j)})}let k;try{let[j,E,M,se,Me,q,mt,ms,nr,Ii,$i]=await Promise.all([Promise.resolve(Lt.getActive(this.projectId)).catch(()=>null),Ke.getActive(this.projectId).catch(()=>null),tt.getRecent(this.projectId,3).catch(()=>[]),_o.getMetrics(this.projectId).catch(()=>null),be.getBacklog(this.projectId).catch(()=>[]),_.getTaskHistory(this.projectId).catch(()=>[]),_.getAllPausedTasks(this.projectId).catch(()=>[]),_.getAggregatedFeedback(this.projectId).catch(()=>null),_.getCurrentTask(this.projectId).catch(()=>null),Ge.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),tt.getCount(this.projectId).catch(()=>0)]),Mi={backlogCount:Me.length,completedTaskCount:q.length,pausedTaskCount:mt.length,hasActiveTask:!!nr},_i=j?j.patterns.map(oe=>({name:oe.name,description:oe.description,location:oe.locations?.[0]})):(E?.patterns??[]).filter(oe=>oe.source!=="repo").map(oe=>({name:oe.name,description:oe.description,location:oe.location})),Ue=j?j.antiPatterns.map(oe=>({issue:oe.issue,file:oe.files?.[0]??"multiple",suggestion:oe.suggestion,severity:oe.severity??"medium"})):(E?.antiPatterns??[]).filter(oe=>oe.source!=="repo").map(oe=>({issue:oe.issue,file:oe.file,suggestion:oe.suggestion,severity:oe.severity??"medium"})),_t=j?.commands?{install:j.commands.install??u.install,run:u.run,test:j.commands.test??u.test,build:j.commands.build??u.build,dev:j.commands.dev??u.dev,lint:j.commands.lint??u.lint,format:j.commands.format??u.format}:u,rr={version:c.version,fileCount:c.fileCount,patterns:_i,antiPatterns:Ue,recentShipped:M.map(oe=>({name:oe.name,type:oe.type??"feature",duration:oe.duration,filesChanged:oe.changes?.length})),velocity:se?{avgPoints:se.averageVelocity,trend:se.velocityTrend,accuracy:se.estimationAccuracy}:null,backlogCount:Me.length,completedTaskCount:q.length,pausedTaskCount:mt.length,knownGotchas:ms?.knownGotchas??[],userPatterns:ms?.patternsDiscovered??[],hasActiveTask:!!nr,activeTaskDescription:nr?.description??"",pausedTasks:mt.map(oe=>({description:oe.description,pausedAt:oe.pausedAt??""})),topBacklog:Me.slice(0,3).map(oe=>({description:oe.description,priority:oe.priority??"medium"})),ideasCount:Ii?.pending??0,shippedCount:$i};k=await Ep.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:_t,stack:p},Mi,rr)}catch(j){V.debug("Native skill generation failed (non-critical)",{error:ue(j)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,p),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,p,n.verified)]);let y=await Ke.getActive(this.projectId),v={patterns:y?.patterns?.length||0,antiPatterns:y?.antiPatterns?.length||0,criticalAntiPatterns:y?.antiPatterns?.filter(j=>j.severity==="high").length||0},D=Date.now()-s,U=await this.recordSyncMetrics(c,D);await this.archiveStaleData(),await this.autoLearnFromHistory(),await De.installGlobalConfig(),await De.syncCommands();let F;try{let j=await $.readConfig(this.projectPath);F=await Np.verify(this.projectPath,this.globalPath,j?.verification)}catch(j){V.debug("Verification failed (non-critical)",{error:ue(j)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:p,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:v,syncMetrics:U,verification:F,incremental:d,generatedSkills:k}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:ue(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Fp.mkdir(kc.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=C.getDoc(this.projectId,"project")||{},n={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||T(),lastSync:T(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};C.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await _.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=T(),n.lastUpdated=T(),n.context={...n.context||{},lastSession:T(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,n);try{await Tp.generate(this.projectPath,n)}catch(o){V.debug("Local state generation failed (optional)",{error:ue(o)})}}async logToMemory(e,t){C.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=po(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){V.debug("Could not load BM25 index for metrics",{error:ue(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await Pn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){V.debug("Failed to record sync metrics",{error:ue(a)})}let i={};try{let a=po(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=wo(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=Dd(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){V.debug("Could not load index stats",{error:ue(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Cp.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await Ke.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:T(),status:"draft",commitHash:o??void 0})}catch(o){V.debug("Failed to save draft analysis (non-critical)",{error:ue(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([tt.archiveOldShipped(this.projectId).catch(()=>0),Ge.markDormantIdeas(this.projectId).catch(()=>0),be.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),xt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){V.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=Mt.getStats(this.projectId);V.debug("Archive stats",a)}}catch(e){V.debug("Archival failed (non-critical)",{error:ue(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new Ls,s=await ac.learnFromTaskHistory(this.projectId,e,t);try{let n=await Sp.getFeatureOutcomes(this.projectId);n.length>0&&await ac.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&V.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){V.debug("Auto-learning failed (non-critical)",{error:ue(e)})}}async getCliVersion(){try{let e=kc.join(__dirname,"..","..","package.json");return(await xe(e))?.version||"0.0.0"}catch(e){return V.debug("Failed to read CLI version",{error:ue(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},qs=new Sc});function $k(){return"---"}function Mk(){return`---
|
|
656
|
-
prjct v${
|
|
657
|
-
`)}function
|
|
762
|
+
`,"body")}];l(mw,"buildFrontmatter");l(pw,"buildSkillContent");sc=class{static{l(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let n={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:s?.version??e.stats.version??"0.0.0",fileCount:s?.fileCount??e.stats.fileCount??0,patterns:s?.patterns??[],antiPatterns:s?.antiPatterns??[],recentShipped:s?.recentShipped??[],velocity:s?.velocity??null,backlogCount:s?.backlogCount??t.backlogCount,completedTaskCount:s?.completedTaskCount??t.completedTaskCount,pausedTaskCount:s?.pausedTaskCount??t.pausedTaskCount,knownGotchas:s?.knownGotchas??[],hasActiveTask:s?.hasActiveTask??t.hasActiveTask,activeTaskDescription:s?.activeTaskDescription??"",pausedTasks:s?.pausedTasks??[],topBacklog:s?.topBacklog??[],ideasCount:s?.ideasCount??0,shippedCount:s?.shippedCount??0,userPatterns:s?.userPatterns??[]},i=wr.join(tw.homedir(),".claude","skills");for(let c of tc){if(!c.condition(t)){n.skipped.push({name:c.name,reason:"condition not met"}),await yr.rm(wr.join(i,c.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=pw(c,o),d=wr.join(i,c.name),p=wr.join(d,"SKILL.md");await yr.mkdir(d,{recursive:!0}),await yr.writeFile(p,u,"utf-8"),n.generated.push({name:c.name,path:p})}catch(u){G.debug(`Failed to generate skill ${c.name}`,{error:oe(u)}),n.skipped.push({name:c.name,reason:oe(u)})}}let a=new Set(tc.map(c=>c.name));try{let c=await yr.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of c)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await yr.rm(wr.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return n.generated.length>0&&G.info("Generated native workflow skills",{count:n.generated.length,skills:n.generated.map(c=>c.name)}),n}getDefinitions(){return tc}},om=new sc});var am=v(()=>{"use strict"});import gw from"node:fs/promises";import cm from"node:path";var Ao,lm=v(()=>{"use strict";J();Ao=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let s={...t.dependencies,...t.devDependencies};this.detectFrontend(s,e),this.detectBackend(s,e),this.detectDatabase(s,e),this.detectTesting(s,t,e),this.collectFrameworks(s,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(n=>e[n])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(n=>e[n])&&(t.hasDatabase=!0)}detectTesting(e,t,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(s.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=cm.join(this.projectPath,"package.json"),t=await gw.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return x(cm.join(this.projectPath,e))}}});import nc from"node:path";async function um(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await N("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:s}=await N("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(s.trim(),10)||0;let{stdout:n}=await N("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(n.trim(),10)||0;let{stdout:o}=await N("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
763
|
+
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),p=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(p):d.includes("M")?e.modifiedFiles.push(p):d.startsWith("??")&&e.untrackedFiles.push(p)}let{stdout:a}=await N('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
764
|
+
`).filter(Boolean).map(u=>{let[d,p,m]=u.split("|");return{hash:d,message:p,date:m}});let{stdout:c}=await N('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){G.debug("Git analysis failed (not a git repo?)",{error:oe(t)})}return e}async function Nt(r,e){let t=await x(nc.join(r,e));return t||G.debug("File not found",{filename:e}),t}async function dm(r){let e={fileCount:0,version:"0.0.0",name:nc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await N('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){G.debug("File count failed",{path:r,error:oe(t)}),e.fileCount=0}try{let t=nc.join(r,"package.json"),s=await Ee(t);if(!s)throw new Error("No package.json found");e.version=s.version||"0.0.0",e.name=s.name||e.name,e.ecosystem="JavaScript",s.devDependencies?.typescript||await Nt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){G.debug("No package.json found",{path:r,error:oe(t)})}return await Nt(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await Nt(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await Nt(r,"requirements.txt")||await Nt(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 mm(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 Nt(r,"bun.lockb")||await Nt(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Nt(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 Nt(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 Nt(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 Nt(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function pm(r){return new Ao(r).detect()}var gm=v(()=>{"use strict";Jt();am();Ue();J();Kt();lm();l(um,"analyzeGit");l(Nt,"fileExistsInProject");l(dm,"gatherStats");l(mm,"detectCommands");l(pm,"detectStack")});import fm from"node:fs/promises";import Do from"node:path";var rc,oc,hm,ym=v(()=>{"use strict";wt();H();Ue();J();rc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],s=[];for(let n of t){let o=Do.join(r,n);await x(o)||s.push(n)}return{name:"Context files exist",passed:s.length===0,output:s.length===0?`${t.length} files verified`:void 0,error:s.length>0?`Missing: ${s.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],s=Do.basename(r);try{await _.read(s)}catch(n){A(n)||t.push(`state: ${y(n)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Do.join(r,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],n=[];try{let o=await fm.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await fm.readFile(Do.join(t,i),"utf-8");for(let c of s)if(c.test(a)){n.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!A(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:n.length===0,output:n.length===0?"No sensitive patterns found":void 0,error:n.length>0?n.join("; "):void 0,durationMs:Date.now()-e}}},oc=class{static{l(this,"SyncVerifier")}async verify(e,t,s){let n=Date.now(),o=[],i=s?.failFast??!1,a=0,c=[rc.contextFilesExist(t),rc.jsonFilesValid(t),rc.noSensitiveData(t)];for(let m of c){let g=await m;if(o.push(g),!g.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&s?.checks)for(let m of s.checks){if(m.enabled===!1){a++;continue}let g=await this.runCustomCheck(m,e);if(o.push(g),!g.passed&&i){let h=s.checks.slice(s.checks.indexOf(m)+1);a+=h.filter(S=>S.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-n,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),n=e.command||(e.script?`sh ${e.script}`:null);if(!n)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await N(n,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},hm=new oc});import wm from"node:fs/promises";import ic from"node:path";var ac,Fs,cc=v(()=>{"use strict";Gi();Zi();sd();od();dd();wa();Jt();lt();Yt();De();fe();vo();pn();Ms();ee();ps();ur();Oa();Ua();Wt();Ns();wt();Ja();z();J();Kt();Vd();em();mr();sm();Ls();rm();im();gm();ym();ac=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),n={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await M.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=R.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await wm.rm(ic.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Cs()).installed){let k=await To({autoRepair:!0});k.verified||G.warn(`Codex p. router not ready: ${k.message||"verification failed"}`)}try{n=await ts.ensureReady()}catch(k){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:!1,message:oe(k)},error:`Context7 MCP is required but not ready: ${oe(k)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Eo(this.projectId);try{let k=await Po(this.projectId);k>0&&G.info("Swept legacy JSON files into SQLite",{swept:k})}catch(k){G.debug("Legacy JSON sweep failed (non-critical)",{error:oe(k)})}let[a,c,u,d]=await Promise.all([um(this.projectPath),dm(this.projectPath),mm(this.projectPath),pm(this.projectPath)]),p=t.full===!0,m,g=!0,h=new Set;if(!p&&rd(this.projectId))try{let{diff:k,currentHashes:$}=await Sa(this.projectPath,this.projectId),O=k.added.length+k.modified.length+k.deleted.length;if(O===0&&!t.changedFiles?.length)g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:k.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let ge=ed(k,this.projectId);h=td(ge.allAffected);let rt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);g=ge.allAffected.some(os=>{let Qs=os.substring(os.lastIndexOf("."));return rt.has(Qs)}),m={isIncremental:!0,filesChanged:O,filesUnchanged:k.unchanged.length,indexesRebuilt:g,affectedDomains:Array.from(h)}}ka(this.projectId,$)}catch(k){G.debug("Incremental detection failed, falling back to full sync",{error:oe(k)})}else try{let{currentHashes:k}=await Sa(this.projectPath,this.projectId);ka(this.projectId,k)}catch(k){G.debug("Hash computation failed (non-critical)",{error:oe(k)})}if(g)try{await Promise.all([Cu(this.projectPath,this.projectId),Zu(this.projectPath,this.projectId),ud(this.projectPath,this.projectId)])}catch(k){G.debug("File ranking index build failed (non-critical)",{error:oe(k)})}let S;try{let[k,$,O,ge,rt,Ts,os,Qs,Qn,Si,bi]=await Promise.all([Promise.resolve(Mt.getActive(this.projectId)).catch(()=>null),Je.getActive(this.projectId).catch(()=>null),Xe.getRecent(this.projectId,3).catch(()=>[]),Co.getMetrics(this.projectId).catch(()=>null),we.getBacklog(this.projectId).catch(()=>[]),_.getTaskHistory(this.projectId).catch(()=>[]),_.getAllPausedTasks(this.projectId).catch(()=>[]),_.getAggregatedFeedback(this.projectId).catch(()=>null),_.getCurrentTask(this.projectId).catch(()=>null),Le.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),Xe.getCount(this.projectId).catch(()=>0)]),Ti={backlogCount:rt.length,completedTaskCount:Ts.length,pausedTaskCount:os.length,hasActiveTask:!!Qn},vi=k?k.patterns.map(se=>({name:se.name,description:se.description,location:se.locations?.[0]})):($?.patterns??[]).filter(se=>se.source!=="repo").map(se=>({name:se.name,description:se.description,location:se.location})),Oe=k?k.antiPatterns.map(se=>({issue:se.issue,file:se.files?.[0]??"multiple",suggestion:se.suggestion,severity:se.severity??"medium"})):($?.antiPatterns??[]).filter(se=>se.source!=="repo").map(se=>({issue:se.issue,file:se.file,suggestion:se.suggestion,severity:se.severity??"medium"})),jt=k?.commands?{install:k.commands.install??u.install,run:u.run,test:k.commands.test??u.test,build:k.commands.build??u.build,dev:k.commands.dev??u.dev,lint:k.commands.lint??u.lint,format:k.commands.format??u.format}:u,Zn={version:c.version,fileCount:c.fileCount,patterns:vi,antiPatterns:Oe,recentShipped:O.map(se=>({name:se.name,type:se.type??"feature",duration:se.duration,filesChanged:se.changes?.length})),velocity:ge?{avgPoints:ge.averageVelocity,trend:ge.velocityTrend,accuracy:ge.estimationAccuracy}:null,backlogCount:rt.length,completedTaskCount:Ts.length,pausedTaskCount:os.length,knownGotchas:Qs?.knownGotchas??[],userPatterns:Qs?.patternsDiscovered??[],hasActiveTask:!!Qn,activeTaskDescription:Qn?.description??"",pausedTasks:os.map(se=>({description:se.description,pausedAt:se.pausedAt??""})),topBacklog:rt.slice(0,3).map(se=>({description:se.description,priority:se.priority??"medium"})),ideasCount:Si?.pending??0,shippedCount:bi};S=await om.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:jt,stack:d},Ti,Zn)}catch(k){G.debug("Native skill generation failed (non-critical)",{error:oe(k)})}await Promise.all([this.updateProjectJson(a,c),this.updateStateJson(c,d),this.logToMemory(a,c),this.saveDraftAnalysis(a,c,d,n.verified)]);let w=await Je.getActive(this.projectId),E={patterns:w?.patterns?.length||0,antiPatterns:w?.antiPatterns?.length||0,criticalAntiPatterns:w?.antiPatterns?.filter(k=>k.severity==="high").length||0},D=Date.now()-s,V=await this.recordSyncMetrics(c,D);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Pe.installGlobalConfig(),await Pe.syncCommands();let F;try{let k=await M.readConfig(this.projectPath);F=await hm.verify(this.projectPath,this.globalPath,k?.verification)}catch(k){G.debug("Verification failed (non-critical)",{error:oe(k)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:c,commands:u,stack:d,context7:{installed:n.installed,verified:n.verified,message:n.message},analysisSummary:E,syncMetrics:V,verification:F,incremental:m,generatedSkills:S}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:n.installed,verified:n.verified,message:n.message},error:oe(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>wm.mkdir(ic.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=P.getDoc(this.projectId,"project")||{},n={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};P.setDoc(this.projectId,"project",n)}async updateStateJson(e,t){let n={...await _.read(this.projectId)};n.projectId=this.projectId,n.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},n.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},n.projectType=e.projectType,n.metrics={totalFiles:e.fileCount},n.lastSync=b(),n.lastUpdated=b(),n.context={...n.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await _.write(this.projectId,n);try{await tm.generate(this.projectPath,n)}catch(o){G.debug("Local state generation failed (optional)",{error:oe(o)})}}async logToMemory(e,t){P.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t){let s=0;try{let a=co(this.projectId);if(a)for(let c of Object.values(a.documents))s+=c.length}catch(a){G.debug("Could not load BM25 index for metrics",{error:oe(a)})}s===0&&(s=e.fileCount*200);let n=0,o=s>0?Math.max(0,(s-n)/s):0;try{await wn.recordSync(this.projectId,{originalSize:s,filteredSize:n,duration:t,isWatch:!1})}catch(a){G.debug("Failed to record sync metrics",{error:oe(a)})}let i={};try{let a=co(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let c=go(this.projectId);c&&(i.importEdges=c.edgeCount,i.importFiles=c.fileCount);let u=ld(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){G.debug("Could not load index stats",{error:oe(a)})}return{duration:t,originalSize:s,filteredSize:n,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,n){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],c;try{c=await _.getAggregatedFeedback(this.projectId),c.patternsDiscovered.length>0&&(i=c.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),c.knownGotchas.length>0&&(a=c.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await nm.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:c,context7Verified:n});i=u.patterns,a=u.antiPatterns,await Je.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:i,antiPatterns:a,analyzedAt:b(),status:"draft",commitHash:o??void 0})}catch(o){G.debug("Failed to save draft analysis (non-critical)",{error:oe(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,n,o]=await Promise.all([Xe.archiveOldShipped(this.projectId).catch(()=>0),Le.markDormantIdeas(this.projectId).catch(()=>0),we.removeStaleCompleted(this.projectId).catch(()=>0),_.archiveStalePausedTasks(this.projectId).catch(()=>[]),kt.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+n.length+o;if(i>0){G.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:n.length,memoryCapped:o,total:i});let a=At.getStats(this.projectId);G.debug("Archive stats",a)}}catch(e){G.debug("Archival failed (non-critical)",{error:oe(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await _.getTaskHistory(this.projectId);if(e.length===0)return;let t=new cn,s=await qa.learnFromTaskHistory(this.projectId,e,t);try{let n=await Zd.getFeatureOutcomes(this.projectId);n.length>0&&await qa.learnFromOutcomes(this.projectId,n,t)}catch{}s.memoriesInjected>0&&G.info("Auto-learned from task history",{patternsExtracted:s.patternsExtracted,memoriesInjected:s.memoriesInjected,patternsSkipped:s.patternsSkipped})}catch(e){G.debug("Auto-learning failed (non-critical)",{error:oe(e)})}}async getCliVersion(){try{let e=ic.join(__dirname,"..","..","package.json");return(await Ee(e))?.version||"0.0.0"}catch(e){return G.debug("Failed to read CLI version",{error:oe(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:[]}}},Fs=new ac});function fw(){return"---"}function hw(){return`---
|
|
765
|
+
prjct v${vs()}`}function L(...r){return dc(fw(),...r.filter(Boolean),hw())}function kr(r,e){let t=`| ${r.join(" | ")} |`,s=`|${r.map(()=>"---").join("|")}|`,n=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...n].join(`
|
|
766
|
+
`)}function km(r,e=""){return`\`\`\`${e}
|
|
658
767
|
${r}
|
|
659
|
-
\`\`\``}function
|
|
660
|
-
${e}`}function
|
|
661
|
-
`)}function
|
|
662
|
-
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function
|
|
663
|
-
${
|
|
768
|
+
\`\`\``}function lc(r,e){return`**${r}**: \`${e}\``}function uc(r,e){return`> **${{success:"OK",warn:"WARNING",error:"ERROR",info:"INFO"}[r]}:** ${e}`}function X(r,e,t=3){return`### ${r}
|
|
769
|
+
${e}`}function Ie(r,e=!1){return r.map((t,s)=>e?`${s+1}. ${t}`:`- ${t}`).join(`
|
|
770
|
+
`)}function Sr(r){let e=[];r.branch&&e.push(`Branch: \`${r.branch}\``),r.linearId&&e.push(`Linear: \`${r.linearId}\``),r.type&&e.push(`Type: ${r.type}`),r.estimatedPoints&&e.push(`~${r.estimatedPoints}pts`),r.estimatedMinutes&&e.push(`~${r.estimatedMinutes}min`),r.domains&&r.domains.length>0&&e.push(`Domains: ${r.domains.join(", ")}`),r.duration&&e.push(`Duration: ${r.duration}`),r.status&&e.push(`Status: ${r.status}`);let t=e.length>0?`
|
|
771
|
+
> ${e.join(" | ")}`:"";return`## ${r.description}${t}`}function Sm(r,e){let t=["#","Status","Description"],s=r.map((n,o)=>{let i=String(o+1),a;n.status==="completed"?a="done":o===e?a="current":a="pending";let c=o===e?" **<- current**":"";return[i,a,`${n.description}${c}`]});return`### Subtasks
|
|
772
|
+
${kr(t,s)}`}function bm(r){return r.length===0?"":`### Relevant Files
|
|
664
773
|
${r.map(t=>{let s=t.lineRange?`:${t.lineRange}`:"",n=t.description?` \u2014 ${t.description}`:"";return`- \`${t.path}${s}\`${n}`}).join(`
|
|
665
|
-
`)}`}function
|
|
666
|
-
${
|
|
667
|
-
> ${e}`:`## ${r}`}function
|
|
668
|
-
|
|
669
|
-
`)}function
|
|
670
|
-
`))}var
|
|
671
|
-
Next:`));for(let o of n){let i=
|
|
672
|
-
`),this))},done(r,e){if(this.stop(),!
|
|
673
|
-
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(
|
|
674
|
-
${
|
|
675
|
-
`),this)},progress(r,e,t){if(
|
|
676
|
-
`),this)}},f=
|
|
774
|
+
`)}`}function ue(r){let e=["Command","Action"],t=r.map(s=>[`\`${s.command}\``,s.label]);return`### Next
|
|
775
|
+
${kr(e,t)}`}function et(r){let e=Object.entries(r).filter(([,n])=>n!=null);if(e.length===0)return"";let t=["Metric","Value"],s=e.map(([n,o])=>[n,String(o)]);return kr(t,s)}function he(r,e){return e?`## ${r}
|
|
776
|
+
> ${e}`:`## ${r}`}function Tm(r){return`> **WARNING:** ${r}`}function dc(...r){return r.filter(Boolean).join(`
|
|
777
|
+
|
|
778
|
+
`)}function St(r,e,t,s){let n=e.replace(/_/g," "),o=[`> **${r}**: ${n}`];if(s)for(let[i,a]of Object.entries(s))o.push(`> ${i}: ${a}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
|
|
779
|
+
`))}var Us=v(()=>{"use strict";Pt();l(fw,"mdHeader");l(hw,"mdFooter");l(L,"mdOutput");l(kr,"mdTable");l(km,"mdCodeBlock");l(lc,"mdBadge");l(uc,"mdCallout");l(X,"mdSection");l(Ie,"mdList");l(Sr,"mdTaskHeader");l(Sm,"mdSubtasks");l(bm,"mdRelevantFiles");l(ue,"mdNextSteps");l(et,"mdStats");l(he,"mdDone");l(Tm,"mdWarn");l(dc,"mdJoin");l(St,"mdActionRequired")});import br from"chalk";function bt(r,e={}){if(e.quiet)return;let t=Em[r]||"idle",s=$s.getValidCommands(t);if(s.length===0)return;let n=s.map(o=>({cmd:`p. ${o}`,desc:vm[o]||o}));console.log(br.dim(`
|
|
780
|
+
Next:`));for(let o of n){let i=br.cyan(o.cmd.padEnd(12));console.log(br.dim(` ${i} \u2192 ${o.desc}`))}}function jo(r,e=!1){let t=Em[r]||"idle";return $s.getValidCommands(t).map(n=>({cmd:e?`prjct ${n} --md`:`p. ${n}`,desc:vm[n]||n}))}function Tr(r){let e=$s.getStateInfo(r);console.log(br.dim(`\u{1F4CD} State: ${br.white(r.toUpperCase())} - ${e.description}`))}var vm,Em,kn=v(()=>{"use strict";la();vm={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(jo,"getNextSteps");l(Tr,"showStateInfo")});import Hs from"chalk";var Pm,yw,ww,Lt,Cm=v(()=>{"use strict";lt();Pm=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],yw=80,ww={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Pm,speed:yw},cli:{header:l(()=>`${Hs.cyan.bold("\u26A1")} ${Hs.cyan("prjct")}`,"header"),footer:l(()=>Hs.dim("\u26A1 prjct"),"footer"),spin:l((r,e)=>`${Hs.cyan("\u26A1")} ${Hs.cyan("prjct")} ${Hs.cyan(Pm[r%10])} ${Hs.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")=>Wr(r).commitFooter,"getCommitFooter"),getSignature:l((r="claude")=>Wr(r).signature,"getSignature")},Lt=ww});import ie from"chalk";function bw(){return kw[Sw]}var UD,mc,kw,Sw,Gs,Sn,pc,Tt,hs,Tw,vw,f,tt=v(()=>{"use strict";Cm();_s();ho();ho();UD=Lt.spinner.frames,mc=Lt.spinner.speed,kw={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}},Sw="compact";l(bw,"getTierConfig");Gs={success:ie.green("\u2713"),fail:ie.red("\u2717"),warn:ie.yellow("\u26A0"),info:ie.blue("\u2139"),debug:ie.dim("\u{1F527}"),bullet:ie.dim("\u2022"),arrow:ie.dim("\u2192"),check:ie.green("\u2713"),cross:ie.red("\u2717"),spinner:ie.cyan("\u25D0")},Sn=null,pc=0,Tt=!1,hs=l((r,e)=>{let t=e??(bw().maxCharsPerLine||_t.FALLBACK_TRUNCATE);return r&&r.length>t?`${r.slice(0,t-1)}\u2026`:r||""},"truncate"),Tw=l(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(_t.CLEAR_WIDTH)}\r`):!0,"clear"),vw={start(){return Tt||console.log(Lt.cli.header()),this},end(){return Tt||console.log(Lt.cli.footer()),this},spin(r){return Tt?this:(this.stop(),process.stdout.isTTY?(Sn=setInterval(()=>{process.stdout.write(`\r${Lt.cli.spin(pc++,hs(r,_t.SPINNER_MSG))}`)},mc),this):(process.stdout.write(`${Lt.cli.spin(0,hs(r,_t.SPINNER_MSG))}
|
|
781
|
+
`),this))},done(r,e){if(this.stop(),!Tt){let t="";if(e){let s=[];e.agents!==void 0&&s.push(`${e.agents}a`),e.reduction!==void 0&&s.push(`${e.reduction}%`),e.tokens!==void 0&&s.push(`${Math.round(e.tokens)}K`),s.length>0&&(t=ie.dim(` [${s.join(" | ")}]`))}console.log(`${Gs.success} ${hs(r,_t.DONE_MSG)}${t}`)}return this},fail(r){return this.stop(),console.error(`${Gs.fail} ${hs(r,_t.FAIL_MSG)}`),this},failWithHint(r){this.stop();let e=typeof r=="string"?Pa(r):r;return console.error(),console.error(`${Gs.fail} ${e.message}`),e.file&&console.error(ie.dim(` File: ${e.file}`)),e.hint&&console.error(ie.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(ie.dim(` Docs: ${e.docs}`)),console.error(),this},warn(r){return this.stop(),Tt||console.log(`${Gs.warn} ${hs(r,_t.WARN_MSG)}`),this},info(r){return this.stop(),Tt||console.log(`${Gs.info} ${r}`),this},debug(r){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!Tt&&e&&console.log(`${Gs.debug} ${ie.dim(r)}`),this},success(r,e){return this.done(r,e)},list(r,e={}){if(this.stop(),Tt)return this;let t=e.bullet||Gs.bullet,s=" ".repeat(e.indent||0);for(let n of r)console.log(`${s}${t} ${n}`);return this},table(r,e={}){if(this.stop(),Tt||r.length===0)return this;let t=Object.keys(r[0]),s={};for(let n of t){s[n]=n.length;for(let o of r){let i=String(o[n]??"");i.length>s[n]&&(s[n]=i.length)}}if(e.header!==!1){let n=t.map(o=>o.padEnd(s[o])).join(" ");console.log(ie.dim(n)),console.log(ie.dim("\u2500".repeat(n.length)))}for(let n of r){let o=t.map(i=>String(n[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(r,e){if(this.stop(),Tt)return this;let t=e.split(`
|
|
782
|
+
`),s=Math.max(r.length,...t.map(o=>o.length)),n="\u2500".repeat(s+2);console.log(ie.dim(`\u250C${n}\u2510`)),console.log(`${ie.dim("\u2502")} ${ie.bold(r.padEnd(s))} ${ie.dim("\u2502")}`),console.log(ie.dim(`\u251C${n}\u2524`));for(let o of t)console.log(`${ie.dim("\u2502")} ${o.padEnd(s)} ${ie.dim("\u2502")}`);return console.log(ie.dim(`\u2514${n}\u2518`)),this},section(r){return this.stop(),Tt?this:(console.log(`
|
|
783
|
+
${ie.bold(r)}`),console.log(ie.dim("\u2500".repeat(r.length))),this)},stop(){return Sn&&(clearInterval(Sn),Sn=null,Tw()),this},step(r,e,t){if(Tt)return this;this.stop();let s=ie.dim(`[${r}/${e}]`);return process.stdout.isTTY?(Sn=setInterval(()=>{process.stdout.write(`\r${Lt.cli.spin(pc++,`${s} ${hs(t,_t.STEP_MSG)}`)}`)},mc),this):(process.stdout.write(`${Lt.cli.spin(0,`${s} ${hs(t,_t.STEP_MSG)}`)}
|
|
784
|
+
`),this)},progress(r,e,t){if(Tt)return this;this.stop();let s=Math.round(r/e*100),n=Math.round(s/10),o=10-n,i=ie.cyan("\u2588".repeat(n))+ie.dim("\u2591".repeat(o)),a=t?` ${hs(t,_t.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Sn=setInterval(()=>{process.stdout.write(`\r${Lt.cli.spin(pc++,`[${i}] ${s}%${a}`)}`)},mc),this):(process.stdout.write(`${Lt.cli.spin(0,`[${i}] ${s}%${a}`)}
|
|
785
|
+
`),this)}},f=vw});import Ew from"node:path";async function gc(r,e){let t=Date.now()-e;await Pe.installGlobalConfig(),f.done(`Synced ${r.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=r.stats.frameworks.length>0?` (${r.stats.frameworks[0]})`:"",n=r.syncMetrics?.indexes,o=[`${r.stats.fileCount} files indexed`,`Stack: ${r.stats.ecosystem}${s} | Branch: ${r.git.branch}`];if(n?.bm25Files){let a=n.bm25Files*(n.bm25AvgTokens||0);o.push(`Index: ${bn(a)} tokens | ${n.bm25VocabSize||0} terms | ${n.importEdges||0} imports`)}f.box("Sync Summary",o.join(`
|
|
786
|
+
`));let i=[];if(r.generatedSkills?.generated&&r.generatedSkills.generated.length>0){let a=r.generatedSkills.generated.length,c=a===1?"skill":"skills";i.push(`${a} ${c} generated`)}if(r.context7&&i.push(`Context7: ${r.context7.verified?"verified":`not ready${r.context7.message?` (${r.context7.message})`:""}`}`),r.analysisSummary&&i.push(`Analysis: ${r.analysisSummary.patterns} patterns | ${r.analysisSummary.antiPatterns} anti-patterns (${r.analysisSummary.criticalAntiPatterns} critical)`),f.section("Generated"),f.list(i,{bullet:"\u2713"}),console.log(""),r.git.hasChanges&&(f.warn("Uncommitted changes detected"),console.log("")),r.verification){let a=r.verification;if(a.passed){let c=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);f.section("Verified"),f.list(c,{bullet:"\u2713"})}else{f.section("Verification");let c=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);f.list(c),a.skippedCount>0&&f.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return bt("sync"),{success:!0,data:r,metrics:{elapsed:t,fileCount:r.stats.fileCount}}}async function xm(r){try{let e=await kt.getRecentEvents(r,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),n=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];n=it(d)}}let o=s.filter(u=>u.action==="task_completed").length,i=s.filter(u=>u.action==="feature_shipped").length,a=new Map;for(let u of s)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)a.set(d,(a.get(d)||0)+1);let c=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:n,tasksCompleted:o,featuresShipped:i,agentsUsed:c}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function bn(r){return r>=1e6?`${(r/1e6).toFixed(1)}M`:r>=1e3?`${(r/1e3).toFixed(1)}K`:r.toLocaleString()}function fc(r){return r<1e3?`${Math.round(r)}ms`:`${(r/1e3).toFixed(1)}s`}function Rm(r){if(r.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=r.map(n=>n.tokensSaved),s=Math.max(...t,1);return t.map(n=>{let o=Math.min(Math.floor(n/s*(e.length-1)),e.length-1);return e[o]}).join("")}function Am(r,e,t,s,n,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),n){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),n.sessionDuration&&i.push(`| Duration | ${n.sessionDuration} |`),i.push(`| Tasks completed | ${n.tasksCompleted} |`),i.push(`| Features shipped | ${n.featuresShipped} |`),n.agentsUsed.length>0){let a=n.agentsUsed.slice(0,3).map(c=>`${c.name} (${c.count}\xD7)`).join(", ");i.push(`| Agents used | ${a} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${bn(r.totalTokensSaved)} |`),i.push(`| Compression | ${(r.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${io(r.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${r.syncCount} |`),i.push(`| Avg time | ${fc(r.avgSyncDuration)} |`),i.push(""),r.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=r.topAgents.reduce((c,u)=>c+u.usageCount,0);for(let c of r.topAgents){let u=a>0?(c.usageCount/a*100).toFixed(0):0;i.push(`| ${c.agentName} | ${u}% (${c.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${bn(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(`
|
|
787
|
+
`)}function Dm(r,e){let t=[];t.push(`# Repository Analysis
|
|
788
|
+
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
789
|
+
`);let s=Ew.basename(e);if(t.push(`## Project: ${s}
|
|
790
|
+
`),t.push(`## Stack Detected
|
|
791
|
+
`),r.packageJson){let i=r.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
792
|
+
`),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
|
|
793
|
+
`),t.push("- **Package Manager**: Cargo"),t.push(`- **Language**: Rust
|
|
794
|
+
`)),r.goMod&&(t.push(`### Go
|
|
795
|
+
`),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
|
|
796
|
+
`)),r.requirements&&(t.push(`### Python
|
|
797
|
+
`),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
|
|
798
|
+
`));let n=r.directories;t.push(`## Structure
|
|
799
|
+
`),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${n?.slice(0,15).join(", ")||"none"}${(n?.length||0)>15?` (+${(n?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
|
|
800
|
+
`),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
|
|
801
|
+
`),r.gitLog.split(`
|
|
802
|
+
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,d]=a.split("|");t.push(`- \`${c}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
803
|
+
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
804
|
+
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
805
|
+
`)}var jm=v(()=>{"use strict";Yt();ao();Ls();z();kn();tt();l(gc,"showSyncResult");l(xm,"getSessionActivity");l(bn,"formatTokens");l(fc,"formatDuration");l(Rm,"generateSparkline");l(Am,"generateStatsMarkdown");l(Dm,"generateAnalysisSummary")});var Im,$m,Mm=v(()=>{"use strict";Im=["task","done","ship","resume","bug","enrich"],$m=["init","sync","pause","next","dash","history","undo","redo"]});import Vt from"chalk";function Pw(r){return _m[r.toLowerCase()]||_m.default}var _m,hc,Om,Nm=v(()=>{"use strict";_m={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(Pw,"getIcon");hc=class{static{l(this,"AgentStream")}currentAgent=null;startTime=0;quiet=!1;setQuiet(e){this.quiet=e}orchestrate(e){this.quiet||console.log(Vt.cyan(`
|
|
677
806
|
\u{1F3AF} Orchestrating: ${e.join(", ")} domains detected
|
|
678
|
-
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=
|
|
679
|
-
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
`).filter(Boolean).length,s.hasUncommittedChanges&&(e.push(`${s.uncommittedFiles} uncommitted file(s)`),t.push("Commit changes before shipping"))}catch{s.gitAvailable=!1}let n=Cs.join(r.projectPath,"package.json");try{let i=await Be.readFile(n,"utf-8"),a=JSON.parse(i);s.currentVersion=a.version,s.hasPackageJson=!0}catch(i){if(R(i))s.hasPackageJson=!1;else if(i instanceof SyntaxError)s.hasPackageJson=!1,e.push("package.json has invalid JSON");else throw i}let o=r.paths.shipped;try{let i=await Be.readFile(o,"utf-8");s.shippedExists=!0;let a=r.params.feature||r.params.description;if(a){let c=new Date().toISOString().split("T")[0];new RegExp(`${c}.*${Ic(a)}`,"i").test(i)&&(e.push(`Feature "${a}" already shipped today`),t.push("Use a different feature name or skip /p:ship"))}}catch(i){if(R(i))s.shippedExists=!1;else throw i}if(s.hasPackageJson)try{let i=await Be.readFile(n,"utf-8"),a=JSON.parse(i);s.hasTestScript=!!a.scripts?.test}catch(i){if(R(i)||i instanceof SyntaxError)s.hasTestScript=!1;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function im(r){let e=[],t=[],s={},n=r.paths.next;try{let a=await Be.readFile(n,"utf-8");s.nextExists=!0;let c=a.match(/- \[[ x]\]/g)||[];s.taskCount=c.length,s.pendingTasks=(a.match(/- \[ \]/g)||[]).length,s.taskCount>=90&&(e.push(`Queue nearly full (${s.taskCount}/100 tasks)`),t.push("Complete some tasks before adding more"))}catch(a){if(R(a))s.nextExists=!1,s.taskCount=0;else throw a}let o=r.paths.roadmap;try{let a=await Be.readFile(o,"utf-8");s.roadmapExists=!0;let c=r.params.description||r.params.feature;c&&new RegExp(Ic(c),"i").test(a)&&(e.push(`Feature "${c}" may already exist in roadmap`),t.push("Check roadmap for duplicates with /p:roadmap"))}catch(a){if(R(a))s.roadmapExists=!1;else throw a}let i=r.paths.now;try{let a=await Be.readFile(i,"utf-8");s.hasActiveTask=a.trim().length>0&&!a.includes("No current task"),s.hasActiveTask&&t.push("Consider completing current task first with /p:done")}catch(a){if(R(a))s.hasActiveTask=!1;else throw a}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function am(r){let e=[],t=[],s={},n=r.paths.now;try{let i=await Be.readFile(n,"utf-8");s.nowExists=!0,s.nowContent=i.trim();let a=i.trim().length>0&&!i.includes("No current task")&&!i.match(/^#\s*NOW\s*$/m);if(s.hasActiveTask=a,a&&r.params.task){let c=i.substring(0,50).replace(/\n/g," ");e.push(`Replacing existing task: "${c}..."`),t.push("Use /p:done first to track completion")}}catch(i){if(R(i))s.nowExists=!1,s.hasActiveTask=!1;else throw i}let o=r.paths.next;try{let a=((await Be.readFile(o,"utf-8")).match(/- \[ \]/g)||[]).length;s.pendingTasks=a,!r.params.task&&a>0&&t.push(`${a} tasks available in queue`)}catch(i){if(R(i))s.pendingTasks=0;else throw i}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function cm(r){let e=[],t=[],s={},n=Cs.join(r.projectPath,".prjct/prjct.config.json");try{let i=await Be.readFile(n,"utf-8");s.alreadyInitialized=!0,s.existingConfig=JSON.parse(i),e.push("Project already initialized"),t.push("Use /p:analyze to refresh analysis or delete .prjct/ to reinitialize")}catch(i){if(R(i))s.alreadyInitialized=!1;else if(i instanceof SyntaxError)s.alreadyInitialized=!1,e.push("Existing config has invalid JSON");else throw i}let o=Cs.join(nm.homedir(),".prjct-cli");try{await Be.access(o,Be.constants.W_OK),s.globalPathWritable=!0}catch(i){if(R(i))try{await Be.mkdir(o,{recursive:!0}),s.globalPathWritable=!0,s.globalPathCreated=!0}catch{s.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}else s.globalPathWritable=!1,e.push("Cannot write to ~/.prjct-cli"),t.push("Check directory permissions")}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function lm(r){let e=[],t=[],s={},n=Cs.join(r.projectPath,".prjct/prjct.config.json");try{let a=await Be.readFile(n,"utf-8");s.hasConfig=!0,s.config=JSON.parse(a)}catch(a){if(R(a))return s.hasConfig=!1,e.push("Project not initialized"),t.push("Run /p:init first"),{verified:!1,actual:s,warnings:e,recommendations:t};if(a instanceof SyntaxError)return s.hasConfig=!1,e.push("Config file has invalid JSON"),t.push("Delete .prjct/ and run /p:init"),{verified:!1,actual:s,warnings:e,recommendations:t};throw a}let o=s.config?.projectId,i=Cs.join(nm.homedir(),".prjct-cli/projects",o||"");return await P(i)?s.globalStorageExists=!0:(s.globalStorageExists=!1,e.push("Global storage missing"),t.push("Run /p:init to recreate")),{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function um(r){let e=[],t=[],s={},n=["package.json","Cargo.toml","go.mod","requirements.txt","Gemfile","pom.xml"];s.detectedFiles=[];for(let i of n)await P(Cs.join(r.projectPath,i))&&s.detectedFiles.push(i);s.detectedFiles.length===0&&(e.push("No recognizable project files detected"),t.push("Analysis may be limited without package.json or similar"));let o=["src","lib","app","core","components"];s.detectedSrcDirs=[];for(let i of o)try{(await Be.stat(Cs.join(r.projectPath,i))).isDirectory()&&s.detectedSrcDirs.push(i)}catch(a){if(!R(a))throw a}return{verified:!0,actual:s,warnings:e,recommendations:t}}async function dm(r){let e=[],t=[],s={},n=r.paths.specs;if(await P(n)){s.specsExists=!0;let i=await Be.readdir(n);s.existingSpecs=i.filter(a=>a.endsWith(".md")),s.specCount=s.existingSpecs.length}else s.specsExists=!1,s.specCount=0;let o=r.params.feature||r.params.name||r.params.description;if(o&&s.existingSpecs){let i=o.toLowerCase().replace(/\s+/g,"-");s.existingSpecs.includes(`${i}.md`)&&(e.push(`Spec "${o}" already exists`),t.push("Use a different name or edit existing spec"))}return{verified:e.length===0,actual:s,warnings:e,recommendations:t}}async function mm(r,e,t){let s=pm[r];if(!s)return{verified:!0,actual:{},warnings:[],recommendations:[]};try{return await s(e,t)}catch(n){return{verified:!1,actual:{},warnings:[`Verification error: ${w(n)}`],recommendations:["Check file permissions and project configuration"]}}}async function Qk(r,e,t){let s=await mm(r,e,t);return{...e,groundTruth:{...s,verifiedAt:new Date().toISOString(),command:r}}}function Zk(r){return["done","ship","feature","spec","now","init","sync","analyze"].includes(r)}var pm,eS,Wo,gm=S(()=>{"use strict";W();He();K();ie();l(Ic,"escapeRegex");l(Yk,"formatWarnings");l(rm,"verifyDone");l(om,"verifyShip");l(im,"verifyFeature");l(am,"verifyNow");l(cm,"verifyInit");l(lm,"verifySync");l(um,"verifyAnalyze");l(dm,"verifySpec");pm={done:rm,ship:om,feature:im,now:am,init:cm,sync:lm,analyze:um,spec:dm};l(mm,"verify");l(Qk,"prepareCommand");l(Zk,"requiresVerification");eS={verify:mm,prepareCommand:Qk,requiresVerification:Zk,verifiers:pm,formatWarnings:Yk,formatDuration:ht,escapeRegex:Ic,verifyDone:rm,verifyShip:om,verifyFeature:im,verifyNow:am,verifyInit:cm,verifySync:lm,verifyAnalyze:um,verifySpec:dm},Wo=eS});function sS(r){return{contradiction:"Verify file/resource state before reporting. Use Read tool to check actual state.",state:"Check current task state from now.md before assuming completion.",invented:"Verify prerequisites exist (package.json, git remote) before claiming actions."}[r]||"Verify actual state before proceeding."}function nS(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of tS)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:sS(t)};return{detected:!1}}function rS(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function oS(r){if(!r||r.length===0)return{type:"unknown",description:"No error information"};let e=r[r.length-1]?.message?.toLowerCase()||"";return e.includes("permission")||e.includes("access denied")?{type:"permission",description:"File or directory permission issue"}:e.includes("not found")||e.includes("no such file")?{type:"not_found",description:"File or resource not found"}:e.includes("syntax")||e.includes("parse")?{type:"syntax",description:"Syntax or parsing error"}:e.includes("timeout")||e.includes("timed out")?{type:"timeout",description:"Operation timed out"}:e.includes("network")||e.includes("connection")?{type:"network",description:"Network or connection issue"}:e.includes("config")||e.includes("configuration")?{type:"config",description:"Configuration issue"}:e.includes("validation")||e.includes("invalid")?{type:"validation",description:"Validation failed"}:{type:"unknown",description:"Unrecognized error pattern"}}function iS(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function aS(r){let e={permission:"Check file permissions. Try: chmod -R u+w ~/.prjct-cli/",not_found:"Verify the file path exists. Run /p:init if project not initialized.",syntax:"Check the file format. There may be invalid JSON or markdown.",timeout:"Check your network connection or try again in a moment.",network:"Verify internet connection and try again.",validation:"Review the input parameters and try with different values.",config:"Check .prjct/prjct.config.json for issues. Try /p:init to reinitialize.",unknown:"Can you check the issue manually and provide more context?"};return e[r.type]||e.unknown}var tS,$c,cS,Rn,fm=S(()=>{"use strict";tS=[{pattern:/file.*not found.*created/i,type:"contradiction",description:"Claims file created but also not found"},{pattern:/created.*but.*error/i,type:"contradiction",description:"Claims success but also error"},{pattern:/successfully.*failed/i,type:"contradiction",description:"Contradictory success/failure"},{pattern:/already.*completed.*completing/i,type:"state",description:"Completing already-completed task"},{pattern:/no task.*marking complete/i,type:"state",description:"Completing non-existent task"},{pattern:/no.*active.*done with/i,type:"state",description:"Finishing task that doesnt exist"},{pattern:/version.*updated.*no package/i,type:"invented",description:"Version update without package.json"},{pattern:/committed.*nothing to commit/i,type:"invented",description:"Commit without changes"},{pattern:/pushed.*no remote/i,type:"invented",description:"Push without remote"}];l(sS,"getHallucinationSuggestion");l(nS,"detectHallucination");l(rS,"isSimilarError");l(oS,"analyzeErrorPattern");l(iS,"generateEscalationMessage");l(aS,"generateSuggestion");$c=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>rS(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=oS(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:iS(e,o,this.maxAttempts),suggestion:aS(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return nS(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},cS=new $c,Rn=cS});function Mc(r,e){let t=Ir(e),s=Fu[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function lS(r,e){let t=Ir(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function uS(r,e,t){let s=Ir(t),n=Mc(r,t),o=Mc(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Vo(r,e=bs){let t=Ir(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=dS(r,e),n=pS(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=fS(o),a=mS(o),c=gS(r,t.accuracyTolerance),{overEstimated:u,underEstimated:p}=hS(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:p,lastUpdated:new Date().toISOString()}}function ym(r,e,t=bs){let s=Ir(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function dS(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=uS(i,n,e);if(!t.has(a)){let c=Mc(i,e),u=lS(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function pS(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,p)=>u+yS(p),0),o=s.outcomes.filter(u=>u.variance).map(u=>_c(u)),i=o.length>0?Math.round(o.reduce((u,p)=>u+p,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function mS(r){if(r.length<3)return"stable";let e=r.map(p=>p.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let p=0;p<t;p++)s+=p,n+=e[p],o+=p*e[p],i+=p*p;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function gS(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=_c(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function fS(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function hS(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=_c(n),i=n.tags&&n.tags.length>0?n.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],s=[];for(let[n,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function _c(r){if(!r.variance)return 0;let e=yt(r.estimatedDuration),t=yt(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function wm(r){if(r.sprints.length===0)return"No velocity data available yet.";let e=[];e.push(`Project velocity: ${r.averageVelocity} pts/sprint (trend: ${r.velocityTrend})`),e.push(`Estimation accuracy: ${r.estimationAccuracy}%`);for(let t of r.underEstimated)e.push(`\u26A0 "${t.category}" tasks historically take ${t.avgVariance}% longer than estimated`);for(let t of r.overEstimated)e.push(`"${t.category}" tasks typically finish ${t.avgVariance}% faster than estimated`);return e.join(`
|
|
688
|
-
|
|
807
|
+
`))}startAgent(e,t,s){if(this.quiet)return;this.currentAgent=e,this.startTime=Date.now();let n=Pw(t);console.log(Vt.cyan(`\u250C\u2500 ${n} ${e} (${t})`)),s&&console.log(Vt.dim(`\u2502 ${s}`))}progress(e){this.quiet||!this.currentAgent||console.log(Vt.dim(`\u2502 \u2514\u2500\u2500 ${e}`))}progressList(e){if(!(this.quiet||!this.currentAgent))for(let t of e)console.log(Vt.dim(`\u2502 \u2514\u2500\u2500 ${t}`))}endAgent(e=!0){if(this.quiet||!this.currentAgent)return;let t=Date.now()-this.startTime,s=this.formatDuration(t),n=e?Vt.green("\u2713"):Vt.red("\u2717");console.log(`\u2514\u2500 ${n} ${e?"Complete":"Failed"} ${Vt.dim(`(${s})`)}
|
|
808
|
+
`),this.currentAgent=null}status(e,t){this.quiet||console.log(`${e} ${t}`)}complete(e,t){if(this.quiet)return;let s=t?` ${Vt.dim(`[${this.formatDuration(t)}]`)}`:"";console.log(Vt.green(`\u2705 ${e}${s}`))}formatDuration(e){return e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}},Om=new hc});import Lm from"node:fs";import Io from"node:path";function Cw(r){if(Rs()){let{Database:n}=gt("bun:sqlite");return new n(r,{create:!0})}let e=gt("better-sqlite3"),t=new e(r),s=t.exec.bind(t);return t.run=n=>s(n),t}var yc,xw,Fm=v(()=>{"use strict";or();l(Cw,"openDatabase");yc=class{static{l(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?Io.resolve(e):Io.join(gt("node:os").homedir(),".prjct-cli");this.dbPath=Io.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=Io.dirname(this.dbPath);Lm.existsSync(e)||Lm.mkdirSync(e,{recursive:!0});let t=Cw(this.dbPath);return t.run("PRAGMA journal_mode = WAL"),t.run("PRAGMA synchronous = NORMAL"),t.run("PRAGMA cache_size = -1000"),t.run("PRAGMA temp_store = MEMORY"),this.runMigrations(t),this.db=t,t}runMigrations(e){e.run(`
|
|
809
|
+
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
810
|
+
version INTEGER PRIMARY KEY,
|
|
811
|
+
name TEXT NOT NULL,
|
|
812
|
+
applied_at TEXT NOT NULL
|
|
813
|
+
)
|
|
814
|
+
`);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(n=>n.version)),s=[{version:1,name:"mcp-health-table",up:l(n=>{n.run(`
|
|
815
|
+
CREATE TABLE mcp_health (
|
|
816
|
+
provider TEXT PRIMARY KEY,
|
|
817
|
+
status TEXT NOT NULL,
|
|
818
|
+
last_checked TEXT NOT NULL,
|
|
819
|
+
last_error TEXT,
|
|
820
|
+
token_version TEXT,
|
|
821
|
+
config_valid INTEGER NOT NULL DEFAULT 0,
|
|
822
|
+
oauth_valid INTEGER NOT NULL DEFAULT 0,
|
|
823
|
+
updated_at TEXT NOT NULL
|
|
824
|
+
)
|
|
825
|
+
`)},"up")}];for(let n of s)t.has(n.version)||(n.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString()))}getMcpHealth(e){return this.getDb().prepare("SELECT * FROM mcp_health WHERE provider = ?").get(e)??null}setMcpHealth(e,t){let s=this.getDb(),n=new Date().toISOString();s.prepare(`
|
|
826
|
+
INSERT OR REPLACE INTO mcp_health
|
|
827
|
+
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
828
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
829
|
+
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},xw=new yc});import Rw from"node:fs/promises";import Um from"node:os";import $o from"node:path";function Aw(){try{let r=$o.dirname(gt.resolve("prjct-cli/package.json"));return{command:"node",args:[$o.join(r,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}function ss(){return process.env.PRJCT_TEST_MODE==="1"?$o.join(Um.tmpdir(),"prjct-context7-test","mcp.json"):$o.join(Um.homedir(),".claude","mcp.json")}async function Hm(r=ss()){try{let e=await Rw.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=y(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${y(e)}`)}}async function Dw(r,e=ss()){await ce(e,r)}async function kc(r,e,t=ss()){let s=await Hm(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await Dw(s,t),{path:t,changed:i}}async function Ws(r,e=ss()){return!!(await Hm(e)).mcpServers?.[r]}var Mo,wc,p0,_o=v(()=>{"use strict";Fm();H();J();Mo="mcp-remote@0.1.38";l(Aw,"getPrjctMcpConfig");wc={prjct:Aw(),linear:{command:"npx",args:["-y",Mo,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Mo,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},p0={linear:`npx -y ${Mo} https://mcp.linear.app/mcp`,jira:`npx -y ${Mo} https://mcp.atlassian.com/v1/mcp`};l(ss,"getClaudeMcpConfigPath");l(Hm,"readMcpConfig");l(Dw,"writeMcpConfig");l(kc,"upsertMcpServer");l(Ws,"hasMcpServer")});import Ye from"chalk";function jw(r){let e=0;for(let s of r)e=(e<<5)-e+s.charCodeAt(0),e=e&e;let t=Math.abs(e)%Gm.length;return Gm[t]}function Iw(r,e,t="\u25B6"){let s=Ye.dim(String(r+1).padStart(2)),o=jw(e.domain)(e.domain.padEnd(10)),i=e.description.length>32?`${e.description.slice(0,29)}...`:e.description.padEnd(32),a;switch(e.status){case"completed":a=Ye.green("\u2713 Complete");break;case"in_progress":a=Ye.yellow(`${t} Working...`);break;case"pending":a=Ye.gray("\u25CB Pending");break;case"failed":a=Ye.red("\u2717 Failed");break;case"blocked":a=Ye.gray("\u2298 Blocked");break;default:a=Ye.gray(`\u25CB ${e.status}`)}return` ${s} ${o} ${i} ${a}`}function $w(r){if(r.length===0)return"";let e=[];e.push(""),e.push(` ${Ye.bold.white("SUBTASK PROGRESS")}`),e.push(` ${Ye.dim("\u2500".repeat(58))}`);for(let t=0;t<r.length;t++)e.push(Iw(t,r[t]));return e.push(""),e.join(`
|
|
830
|
+
`)}function Wm(r){console.log($w(r))}var Gm,Vm=v(()=>{"use strict";Gm=[Ye.cyan,Ye.magenta,Ye.yellow,Ye.blue,Ye.green,Ye.redBright,Ye.magentaBright,Ye.cyanBright];l(jw,"getDomainColor");l(Iw,"formatSubtaskLine");l($w,"renderSubtaskProgress");l(Wm,"printSubtaskProgress")});function _w(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 Ow(r){if(!r||typeof r!="string")return{detected:!1};for(let{pattern:e,type:t,description:s}of Mw)if(e.test(r))return{detected:!0,type:t,pattern:e.source,description:s,message:`Potential hallucination detected: ${s}`,suggestion:_w(t)};return{detected:!1}}function Nw(r,e){if(!r||!e)return!1;let t=l(s=>s.toLowerCase().replace(/[0-9]+/g,"N").replace(/['"`]/g,"").replace(/\s+/g," ").trim(),"normalize");return t(r)===t(e)}function Lw(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 Fw(r,e,t){let s={permission:`I've tried ${r} ${t} times but keep hitting permission issues.`,not_found:`After ${t} attempts, I still can't find the required file or resource.`,syntax:`I'm encountering repeated syntax errors with ${r}.`,timeout:`The operation keeps timing out after ${t} attempts.`,network:`Network issues are preventing ${r} from completing.`,validation:`Validation keeps failing for ${r}.`,config:`There seems to be a configuration issue affecting ${r}.`,unknown:`I've tried ${r} ${t} times without success.`};return s[e.type]||s.unknown}function Uw(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 Mw,Sc,Hw,Tn,Bm=v(()=>{"use strict";Mw=[{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(_w,"getHallucinationSuggestion");l(Ow,"detectHallucination");l(Nw,"isSimilarError");l(Lw,"analyzeErrorPattern");l(Fw,"generateEscalationMessage");l(Uw,"generateSuggestion");Sc=class{static{l(this,"LoopDetector")}_attempts;_errorPatterns;maxAttempts;sessionTimeout;constructor(){this._attempts=new Map,this._errorPatterns=new Map,this.maxAttempts=3,this.sessionTimeout=300*1e3}_getKey(e,t=""){return`${e}:${t}`.toLowerCase()}recordAttempt(e,t="",s={}){let n=this._getKey(e,t),o=Date.now(),i=this._attempts.get(n);return(!i||o-i.lastAttempt>this.sessionTimeout)&&(i={command:e,context:t,attempts:0,errors:[],firstAttempt:o,lastAttempt:o,success:!1}),i.attempts++,i.lastAttempt=o,i.success=s.success||!1,s.error&&i.errors.push({message:s.error,timestamp:o}),this._attempts.set(n,i),{attemptNumber:i.attempts,isLooping:this.isLooping(e,t),shouldEscalate:this.shouldEscalate(e,t)}}isLooping(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return!1;if(n.attempts>=2&&!n.success){let o=n.errors.slice(-3);if(o.length>=2){let i=o[0]?.message||"";return o.every(c=>Nw(c.message,i))}}return!1}shouldEscalate(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);return n?n.attempts>=this.maxAttempts&&!n.success:!1}getEscalationInfo(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);if(!n)return null;let o=Lw(n.errors);return{status:"BLOCKED",command:e,context:t,attempts:n.attempts,duration:n.lastAttempt-n.firstAttempt,errorPattern:o,message:Fw(e,o,this.maxAttempts),suggestion:Uw(o),lastError:n.errors[n.errors.length-1]?.message||null}}recordSuccess(e,t=""){let s=this._getKey(e,t),n=this._attempts.get(s);n&&(n.success=!0,n.attempts=0,n.errors=[],this._attempts.set(s,n))}clearTracking(e,t=""){let s=this._getKey(e,t);this._attempts.delete(s)}clearAll(){this._attempts.clear(),this._errorPatterns.clear()}getStats(){let e={activeTracking:this._attempts.size,commands:{}};for(let[t,s]of this._attempts)e.commands[t]={attempts:s.attempts,success:s.success,errorCount:s.errors.length};return e}detectHallucination(e){return Ow(e)}analyzeOutput(e,t){let s=this.detectHallucination(t);return s.detected?(this.recordAttempt(e,"hallucination",{success:!1,error:`HALLUCINATION: ${s.description}`}),{...s,shouldBlock:!0,action:"VERIFY_STATE"}):{detected:!1,shouldBlock:!1}}},Hw=new Sc,Tn=Hw});function bc(r,e){let t=vr(e),s=bu[t.startDay],n=new Date(r);n.setHours(0,0,0,0);let i=(n.getDay()-s+7)%7;return n.setDate(n.getDate()-i),n}function Gw(r,e){let t=vr(e),s=new Date(r);return s.setDate(s.getDate()+t.sprintLengthDays-1),s.setHours(23,59,59,999),s}function Ww(r,e,t){let s=vr(t),n=bc(r,t),o=bc(e,t),i=n.getTime()-o.getTime(),a=Math.round(i/(1e3*60*60*24));return Math.floor(a/s.sprintLengthDays)+1}function Oo(r,e=fs){let t=vr(e);if(r.length===0)return{sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:new Date().toISOString()};let s=Vw(r,e),n=Bw(s,t.accuracyTolerance),o=n.slice(-t.windowSize),i=qw(o),a=Jw(o),c=zw(r,t.accuracyTolerance),{overEstimated:u,underEstimated:d}=Kw(r);return{sprints:n,averageVelocity:i,velocityTrend:a,estimationAccuracy:c,overEstimated:u,underEstimated:d,lastUpdated:new Date().toISOString()}}function zm(r,e,t=fs){let s=vr(t);if(e<=0)return{totalPoints:r,sprints:0,estimatedDate:""};let n=Math.ceil(r/e),o=n*s.sprintLengthDays,i=new Date;return i.setDate(i.getDate()+o),{totalPoints:r,sprints:n,estimatedDate:i.toISOString()}}function Vw(r,e){let t=new Map,s=r.map(o=>new Date(o.completedAt)),n=new Date(Math.min(...s.map(o=>o.getTime())));for(let o of r){let i=new Date(o.completedAt),a=Ww(i,n,e);if(!t.has(a)){let c=bc(i,e),u=Gw(c,e);t.set(a,{sprintNumber:a,startDate:c,endDate:u,outcomes:[]})}t.get(a).outcomes.push(o)}return t}function Bw(r,e){let t=[];for(let[,s]of r){let n=s.outcomes.reduce((u,d)=>u+Xw(d),0),o=s.outcomes.filter(u=>u.variance).map(u=>Tc(u)),i=o.length>0?Math.round(o.reduce((u,d)=>u+d,0)/o.length):0,a=o.filter(u=>Math.abs(u)<=e).length,c=o.length>0?Math.round(a/o.length*100):0;t.push({sprintNumber:s.sprintNumber,startDate:s.startDate.toISOString(),endDate:s.endDate.toISOString(),pointsCompleted:n,tasksCompleted:s.outcomes.length,avgVariance:i,estimationAccuracy:c})}return t.sort((s,n)=>s.sprintNumber-n.sprintNumber)}function Jw(r){if(r.length<3)return"stable";let e=r.map(d=>d.pointsCompleted),t=e.length,s=0,n=0,o=0,i=0;for(let d=0;d<t;d++)s+=d,n+=e[d],o+=d*e[d],i+=d*d;let a=(t*o-s*n)/(t*i-s*s),c=n/t;if(c===0)return"stable";let u=a/c;return u>.1?"improving":u<-.1?"declining":"stable"}function zw(r,e){let t=r.filter(n=>n.variance);if(t.length===0)return 0;let s=t.filter(n=>{let o=Tc(n);return Math.abs(o)<=e});return Math.round(s.length/t.length*100)}function qw(r){if(r.length===0)return 0;let e=r.reduce((t,s)=>t+s.pointsCompleted,0);return Math.round(e/r.length*10)/10}function Kw(r){let e=new Map;for(let n of r){if(!n.variance)continue;let o=Tc(n),i=n.tags&&n.tags.length>0?n.tags:["uncategorized"];for(let a of i){e.has(a)||e.set(a,{variances:[],count:0});let c=e.get(a);c.variances.push(o),c.count++}}let t=[],s=[];for(let[n,o]of e){if(o.count<2)continue;let i=Math.round(o.variances.reduce((a,c)=>a+c,0)/o.variances.length);i>10?s.push({category:n,avgVariance:i,taskCount:o.count}):i<-10&&t.push({category:n,avgVariance:Math.abs(i),taskCount:o.count})}return t.sort((n,o)=>o.avgVariance-n.avgVariance),s.sort((n,o)=>o.avgVariance-n.avgVariance),{overEstimated:t,underEstimated:s}}function Tc(r){if(!r.variance)return 0;let e=ft(r.estimatedDuration),t=ft(r.actualDuration);return e<=0?0:Math.round((t-e)/e*100)}function qm(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(`
|
|
831
|
+
`)}function Xw(r){if(!r.estimatedDuration)return 0;let e=ft(r.estimatedDuration);if(e<=0)return 0;let t=Jm[0],s=Number.POSITIVE_INFINITY;for(let n of Jm){let o=Math.abs(n.typical-e);o<s&&(s=o,t=n)}return t.points}function vr(r){return{sprintLengthDays:r.sprintLengthDays??7,startDay:r.startDay??"monday",windowSize:r.windowSize??6,accuracyTolerance:r.accuracyTolerance??20}}var Jm,vc=v(()=>{"use strict";lr();gr();z();l(bc,"getSprintStart");l(Gw,"getSprintEnd");l(Ww,"getSprintNumber");l(Oo,"calculateVelocity");l(zm,"projectCompletion");l(Vw,"bucketBySprint");l(Bw,"buildSprintVelocities");l(Jw,"detectTrend");l(zw,"calculateOverallAccuracy");l(qw,"calculateAverageVelocity");l(Kw,"detectEstimationPatterns");l(Tc,"parseVariancePercent");l(qm,"formatVelocityContext");Jm=[{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(Xw,"derivePoints");l(vr,"resolveConfig")});import Yw from"node:fs/promises";import No from"node:path";async function vn(r,e,t={}){let s=Date.now(),n=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=Ec(r),c=await tk(e),u=await sk(e),d=[];for(let m of c){if(!i&&rk(m))continue;let g=nk(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,n);return{files:p,metrics:{filesScanned:c.length,filesReturned:p.length,scanDuration:Date.now()-s}}}function Ec(r){let e=r.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean),t=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"]);return e.filter(s=>!t.has(s)&&s.length>2)}async function tk(r){let e=[];async function t(s,n=""){try{let o=await Yw.readdir(s,{withFileTypes:!0});for(let i of o){let a=No.join(s,i.name),c=No.join(n,i.name);if(i.isDirectory()){if(ek.has(i.name)||i.name.startsWith("."))continue;await t(a,c)}else if(i.isFile()){let u=No.extname(i.name).toLowerCase();Zw.has(u)&&e.push(c)}}}catch(o){A(o)}}return l(t,"walk"),await t(r),e}async function sk(r){let e=new Map;try{let{stdout:t}=await N(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
689
832
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
690
833
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
691
834
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
692
835
|
'`,{cwd:r,maxBuffer:10485760}),s=Math.floor(Date.now()/1e3),n=t.trim().split(`
|
|
693
|
-
`).filter(Boolean);for(let o of n){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],
|
|
836
|
+
`).filter(Boolean);for(let o of n){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),c=parseInt(i[2],10),u=i[3],d=Math.floor((s-c)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function nk(r,e,t,s){let n=[],o=0,i=0,a=0,c=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let w of e){d.includes(w)&&(o+=.3,n.push(`keyword:${w}`));for(let E of p)if(E.includes(w)||w.includes(E)){o+=.15;break}}o=Math.min(1,o);for(let[w,E]of Object.entries(Qw))for(let D of E)if(d.includes(D)&&e.some(F=>E.includes(F)||F.includes(w)||w.includes(F))){i+=.4,n.push(`domain:${w}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,n.push("recent:1d")):m.daysAgo<=3?(a=.8,n.push("recent:3d")):m.daysAgo<=7?(a=.6,n.push("recent:1w")):m.daysAgo<=30&&(a=.3,n.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let g=No.basename(r).toLowerCase();if((g.includes("index")||g.includes("main")||g.includes("app")||g.includes("entry"))&&(c=.5,n.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(c=Math.max(c,.3),n.some(w=>w.startsWith("import:"))||n.push("import:1")),s){let w=s.get(r);w!==void 0&&(u=(w+1)/2,w>0?n.push("history:boosted"):w<0&&n.push("history:penalized"))}let S=s&&s.size>0?o*.54+i*.18+a*.13+c*.05+u*.1:o*.6+i*.2+a*.15+c*.05;return{path:r,score:Math.min(1,S),reasons:[...new Set(n)]}}function rk(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 Qw,Zw,ek,Lo=v(()=>{"use strict";H();Ue();Qw={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"]},Zw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),ek=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]);l(vn,"findRelevantFiles");l(Ec,"extractKeywords");l(tk,"getAllCodeFiles");l(sk,"getGitRecency");l(nk,"scoreFile");l(rk,"isTestFile")});async function Km(r=process.cwd(),e={}){let t=e.commits??30,s=e.maxFiles??50,n=e.branch??!1;try{let o=[],i=[],a=`${t} commits`;if(n){let c=await ak(r);o=c.hotFiles,i=c.branchOnlyFiles,a=c.analysisWindow}else o=await ik(r,t);return o=o.filter(c=>!ck(c.path)).slice(0,s),{hotFiles:o,branchOnlyFiles:i,metrics:{commitsAnalyzed:t,totalFilesChanged:o.length,filesReturned:Math.min(o.length,s),analysisWindow:a}}}catch{return{hotFiles:[],branchOnlyFiles:[],metrics:{commitsAnalyzed:0,totalFilesChanged:0,filesReturned:0,analysisWindow:"N/A (git error)"}}}}async function ik(r,e){let{stdout:t}=await N(`git log -${e} --pretty=format:"%ct" --name-only | awk '
|
|
694
837
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
695
838
|
NF {
|
|
696
839
|
count[$0]++
|
|
@@ -700,8 +843,8 @@ Recommendations:
|
|
|
700
843
|
for (f in count) print count[f], lastmod[f], f
|
|
701
844
|
}
|
|
702
845
|
' | sort -rn`,{cwd:r,maxBuffer:10485760}),s=[],n=t.trim().split(`
|
|
703
|
-
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),
|
|
704
|
-
`).filter(Boolean),{stdout:n}=await
|
|
846
|
+
`).filter(Boolean),o=Math.floor(Date.now()/1e3),i=1;for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(c){let u=parseInt(c[1],10);u>i&&(i=u)}}for(let a of n){let c=a.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!c)continue;let u=parseInt(c[1],10),d=parseInt(c[2],10),p=c[3],m=o-d,g=Math.floor(m/86400),h=Math.floor(m/3600),S=Math.max(0,1-g/30),w=u/i,E=S*.6+w*.4,D;h<1?D="just now":h<24?D=`${h}h ago`:g<7?D=`${g}d ago`:g<30?D=`${Math.floor(g/7)}w ago`:D=`${Math.floor(g/30)}mo ago`,s.push({path:p,changes:u,heatScore:Math.round(E*100)/100,lastChanged:D,lastChangedAt:new Date(d*1e3).toISOString()})}return s.sort((a,c)=>c.heatScore-a.heatScore)}async function ak(r){let e="main";try{await N("git rev-parse --verify main",{cwd:r})}catch{e="master"}let{stdout:t}=await N(`git diff --name-only ${e}...HEAD`,{cwd:r}),s=t.trim().split(`
|
|
847
|
+
`).filter(Boolean),{stdout:n}=await N(`git log ${e}..HEAD --pretty=format:"%ct" --name-only | awk '
|
|
705
848
|
/^[0-9]+$/ { timestamp=$1; next }
|
|
706
849
|
NF {
|
|
707
850
|
count[$0]++
|
|
@@ -711,22 +854,15 @@ Recommendations:
|
|
|
711
854
|
for (f in count) print count[f], lastmod[f], f
|
|
712
855
|
}
|
|
713
856
|
'`,{cwd:r,maxBuffer:10*1024*1024}),o=[],i=n.trim().split(`
|
|
714
|
-
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let
|
|
715
|
-
`);return{file:r,language:
|
|
716
|
-
`),n=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(n.has(c))continue;n.add(c);let u=i.index,
|
|
717
|
-
`).length,
|
|
718
|
-
`).filter(
|
|
719
|
-
`);return{
|
|
720
|
-
`)
|
|
721
|
-
`)
|
|
722
|
-
`);let t=[];
|
|
723
|
-
Context: ${r.fileCount} files in project.`),e.join(`
|
|
724
|
-
`)}var f$,Um=S(()=>{"use strict";Kc();f$=Xe.object({projectPath:Xe.string(),language:Xe.string().optional(),framework:Xe.string().optional(),techStack:Xe.array(Xe.string()).default([]),domains:Xe.object({hasFrontend:Xe.boolean().default(!1),hasBackend:Xe.boolean().default(!1),hasDatabase:Xe.boolean().default(!1),hasTesting:Xe.boolean().default(!1),hasDocker:Xe.boolean().default(!1)}).optional(),fileCount:Xe.number().optional(),analysisLanguages:Xe.array(Xe.string()).default([]),analysisFrameworks:Xe.array(Xe.string()).default([]),analysisPackageManager:Xe.string().optional()});l(Fm,"buildAntiHallucinationBlock")});import{z as Vt}from"zod";var rb,Hm,Gm=S(()=>{"use strict";rb=Vt.object({agents:Vt.boolean(),patterns:Vt.boolean(),checklist:Vt.boolean(),modules:Vt.array(Vt.string())}),Hm=Vt.object({version:Vt.string(),description:Vt.string().optional(),commands:Vt.record(Vt.string(),rb).refine(r=>"*"in r,{message:'Config must include a "*" wildcard entry for unknown commands'})})});function Wm(r,e){return{agents:!0,patterns:!0,checklist:!1,modules:[]}}var Vm=S(()=>{"use strict";l(Wm,"classifyCommand")});import Xc from"node:fs/promises";import ob from"node:path";async function zm(){if($r)return $r;let r=await Xc.readFile(Yc,"utf-8"),e=JSON.parse(r);return $r=Hm.parse(e),$r}function ib(r){return Jm.get(r)}function ab(r,e){Jm.set(r,e)}function lb(r,e){let t=r,s=Bm.get(t);return s&&db(s.entry,e)?(s.count++,s.count>=cb):(Bm.set(t,{entry:e,count:1}),!1)}async function ub(r,e){let t=await Xc.readFile(Yc,"utf-8"),s=JSON.parse(t);s.commands[r]=e,await Xc.writeFile(Yc,`${JSON.stringify(s,null,2)}
|
|
725
|
-
`,"utf-8"),$r=null}function db(r,e){return r.agents===e.agents&&r.patterns===e.patterns&&r.checklist===e.checklist&&r.modules.length===e.modules.length&&r.modules.every((t,s)=>t===e.modules[s])}function qm(r,e,t){if(e in r.commands&&e!=="*")return{entry:r.commands[e],source:"config"};let s=ib(e);if(s)return{entry:s,source:"cache"};if(t){let n=Wm(e,t);return ab(e,n),lb(e,n)&&ub(e,n).catch(()=>{}),{entry:n,source:"classified"}}return{entry:r.commands["*"],source:"wildcard"}}var Yc,$r,Jm,Bm,cb,Km=S(()=>{"use strict";Gm();Ct();Vm();Yc=ob.join(Ze,"core/config/command-context.config.json"),$r=null;l(zm,"loadCommandContextConfig");Jm=new Map;l(ib,"getCachedClassification");l(ab,"cacheClassification");Bm=new Map,cb=3;l(lb,"trackClassification");l(ub,"persistClassification");l(db,"isSameEntry");l(qm,"resolveCommandContextFull")});import pb from"node:os";import{z as Qt}from"zod";function mb(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function gb(r){return{darwin:"macOS",linux:"Linux",win32:"Windows",freebsd:"FreeBSD"}[r]??r}function Xm(r){let e=r.platform??pb.platform(),t=r.runtime??mb(),s=r.date??new Date().toISOString().split("T")[0];return`<env>
|
|
726
|
-
${[["project",r.projectName],["path",r.projectPath],["git",r.isGitRepo?"true":"false"],["branch",r.gitBranch],["platform",gb(e)],["runtime",t],["date",s],["model",r.model],["provider",r.provider]].filter(([,i])=>i!==void 0).map(([i,a])=>`${i}: ${a}`).join(`
|
|
727
|
-
`)}
|
|
728
|
-
</env>`}var j$,Ym=S(()=>{"use strict";j$=Qt.object({projectName:Qt.string(),projectPath:Qt.string(),isGitRepo:Qt.boolean().default(!0),gitBranch:Qt.string().optional(),platform:Qt.string().optional(),runtime:Qt.string().optional(),date:Qt.string().optional(),model:Qt.string().optional(),provider:Qt.string().optional()});l(mb,"detectRuntime");l(gb,"normalizePlatform");l(Xm,"buildEnvironmentBlock")});function Zm(r){let e=r.getAllocationFor("injection");return{...Qo,totalPrompt:e}}function Mr(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
|
|
729
|
-
... (truncated to ~${e} tokens)`}function Qm(r){return Math.ceil(r.length/4)}var Qo,Yo,eg=S(()=>{"use strict";ho();Qo={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Zm,"budgetsFromCoordinator");l(Mr,"truncateToTokenBudget");l(Qm,"estimateTokens");Yo=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Qo,...e}}addSection(e,t){let s=Mr(e,t),n=Qm(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Mr(s,o);return this.used+=Qm(i),i}return this.used+=n,s}get remaining(){return Math.max(0,this.budgets.totalPrompt-this.used)}get totalUsed(){return this.used}get config(){return this.budgets}}});var og={};Ot(og,{AgentAssignmentSchema:()=>tg,OUTPUT_SCHEMAS:()=>ng,SubtaskBreakdownSchema:()=>sg,TaskClassificationSchema:()=>jn,renderSchemaForPrompt:()=>fb});import{z as Ye}from"zod";function fb(r){let e=ng[r];return e?`## OUTPUT FORMAT
|
|
857
|
+
`).filter(Boolean),a=Math.floor(Date.now()/1e3),c=1;for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(d){let p=parseInt(d[1],10);p>c&&(c=p)}}for(let u of i){let d=u.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(!d)continue;let p=parseInt(d[1],10),m=parseInt(d[2],10),g=d[3],h=a-m,S=Math.floor(h/86400),w=Math.floor(h/3600),E=Math.max(0,1-S/14),D=p/c,V=E*.5+D*.5,F;w<1?F="just now":w<24?F=`${w}h ago`:F=`${S}d ago`,o.push({path:g,changes:p,heatScore:Math.round(V*100)/100,lastChanged:F,lastChangedAt:new Date(m*1e3).toISOString()})}return{hotFiles:o.sort((u,d)=>d.heatScore-u.heatScore),branchOnlyFiles:s,analysisWindow:`${e}..HEAD`}}function ck(r){let e=r.split("/").pop()||"";for(let t of ok)if(t.startsWith("*.")){if(e.endsWith(t.slice(1)))return!0}else if(e===t)return!0;return!1}var ok,Xm=v(()=>{"use strict";Ue();ok=["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lockb",".gitignore",".env",".env.local","*.md","CHANGELOG.md","LICENSE"];l(Km,"getRecentFiles");l(ik,"getHotFilesFromCommits");l(ak,"getBranchOnlyFiles");l(ck,"shouldIgnore")});function Pc(r){return!r||r.length===0?0:Math.ceil(r.length/4)}function Ym(r,e){let t=lk[e],s=r/1e3*t.input,n=r/1e3*t.output*.3;return{inputSaved:s,outputPotential:n,total:s+n}}function dk(r){return r<.001?"<$0.01":r<.01?`$${r.toFixed(3)}`:`$${r.toFixed(2)}`}function Zm(r,e){let t=Pc(r),s=Pc(e),n=Math.max(0,t-s),o=t>0?(t-s)/t:0,i=Ym(n,uk),a=Qm.map(c=>({model:c,...Ym(n,c)}));return{tokens:{original:t,filtered:s,saved:n},compression:Math.max(0,Math.min(1,o)),cost:{saved:i.total,formatted:dk(i.total),byModel:a}}}function Fo(r){let e=Pc(r);return{tokens:{original:e,filtered:e,saved:0},compression:0,cost:{saved:0,formatted:"$0.00",byModel:Qm.map(t=>({model:t,inputSaved:0,outputPotential:0,total:0}))}}}var lk,uk,Qm,ep=v(()=>{"use strict";mo();lk={"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}},uk="claude-sonnet-4.5";l(Pc,"countTokens");Qm=["claude-sonnet-4.5","claude-opus-4.5","claude-opus-4-6","gpt-4o","gemini-1.5-pro"];l(Ym,"calculateModelCost");l(dk,"formatCostSaved");l(Zm,"measureCompression");l(Fo,"noCompression")});import mk from"node:fs/promises";import En from"node:path";async function np(r,e=process.cwd()){let t=En.isAbsolute(r)?r:En.join(e,r),s=En.resolve(e),n=En.resolve(t);if(!n.startsWith(s+En.sep)&&n!==s)return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"Path traversal denied: file is outside project directory",metrics:Fo("")};let o;try{o=await mk.readFile(t,"utf-8")}catch(p){if(A(p))return{file:r,language:"unknown",signatures:[],fallback:!0,fallbackReason:"File not found",metrics:Fo("")};throw p}let i=En.extname(r).toLowerCase(),a=pk[i]||"unknown",c=yk[a];if(!c||c.length===0)return{file:r,language:a,signatures:[],fallback:!0,fallbackReason:`No extraction patterns for ${a}`,metrics:Fo(o)};let u=wk(o,c),d=u.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
|
|
858
|
+
`);return{file:r,language:a,signatures:u,fallback:!1,metrics:Zm(o,d)}}function wk(r,e){let t=[],s=r.split(`
|
|
859
|
+
`),n=new Set;for(let o of e){o.pattern.lastIndex=0;let i;for(;(i=o.pattern.exec(r))!==null;){let a=i[o.nameIndex];if(!a)continue;let c=`${o.type}:${a}`;if(n.has(c))continue;n.add(c);let u=i.index,d=r.substring(0,u).split(`
|
|
860
|
+
`).length,p=i[0].trim(),m;if(d>1){let g=s[d-2]?.trim();(g?.startsWith("/**")||g?.startsWith("///")||g?.startsWith("#"))&&(m=g)}t.push({type:o.type,name:a,signature:kk(p),exported:o.exported||!1,line:d,docstring:m})}}return t.sort((o,i)=>o.line-i.line)}function kk(r){return r.replace(/\{$/,"").replace(/\s+/g," ").trim()}var pk,tp,gk,fk,hk,sp,yk,rp=v(()=>{"use strict";H();ep();pk={".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"},tp=[{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}],gk=[{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}],fk=[{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}],hk=[{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}],sp=[{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}],yk={typescript:tp,javascript:tp,python:gk,go:fk,rust:hk,java:sp,csharp:sp,php:[],ruby:[],unknown:[]};l(np,"extractSignatures");l(wk,"extractFromContent");l(kk,"cleanSignature")});import Cc from"node:path";var Sk,bk,xc,Tk,mt,Pn=v(()=>{"use strict";fe();xt();z();J();Sk="outcomes",bk="outcomes.jsonl",xc=class{static{l(this,"OutcomeRecorder")}_cache=new Map;getOutcomesDir(e){let t=R.getGlobalProjectPath(e);return Cc.join(t,Sk)}getOutcomesPath(e){return Cc.join(this.getOutcomesDir(e),bk)}async record(e,t){let s={...t,id:pe()},n=this.getOutcomesPath(e);return await We(Cc.dirname(n)),await Ll(n,JSON.stringify(s)),this._cache.delete(e),s}async getAll(e){let t=this.getOutcomesPath(e);if(!await x(t))return[];try{let{statSync:s}=await import("node:fs"),o=s(t).mtimeMs,i=this._cache.get(e);if(i&&i.mtime===o)return i.outcomes;let a=await Ae(t);if(!a.trim())return[];let c=a.trim().split(`
|
|
861
|
+
`).filter(u=>u.trim()).map(u=>JSON.parse(u));return this._cache.set(e,{outcomes:c,mtime:o}),c}catch{let s=await Ae(t);return s.trim()?s.trim().split(`
|
|
862
|
+
`).filter(n=>n.trim()).map(n=>JSON.parse(n)):[]}}async filter(e,t){return(await this.getAll(e)).filter(n=>{if(t.sessionId&&n.sessionId!==t.sessionId||t.command&&n.command!==t.command||t.agent&&n.agentUsed!==t.agent||t.fromDate&&n.startedAt<t.fromDate||t.toDate&&n.completedAt>t.toDate||t.minQuality&&n.qualityScore<t.minQuality)return!1;if(t.tags&&t.tags.length>0){let o=n.tags||[];if(!t.tags.some(i=>o.includes(i)))return!1}return!0})}async getRecent(e,t=10){return(await this.getAll(e)).slice(-t)}async getByCommand(e,t){return this.filter(e,{command:t})}async getByAgent(e,t){return this.filter(e,{agent:t})}async getEstimateAccuracy(e){let t=await this.getAll(e);if(t.length===0)return 0;let s=t.filter(n=>{if(!n.variance)return!1;let o=tn(n.variance),i=ft(n.estimatedDuration);return i===0?!1:Math.abs(o)/i<=.2});return Math.round(s.length/t.length*100)}},Tk=new xc,mt=Tk});import{z as $e}from"zod";var Uo,Cn,vk,Y0,Rc,op,Ho=v(()=>{"use strict";Uo=$e.string(),Cn=$e.object({primaryDomain:Uo,secondaryDomains:$e.array(Uo),confidence:$e.number().min(0).max(1),filePatterns:$e.array($e.string()),relevantAgents:$e.array($e.string())}),vk=$e.object({classification:Cn,classifiedAt:$e.string(),source:$e.enum(["cache","history","llm","heuristic"]),descriptionHash:$e.string(),projectId:$e.string()}),Y0=$e.object({entries:$e.record($e.string(),vk),confirmedPatterns:$e.array($e.object({descriptionHash:$e.string(),classification:Cn,confirmedAt:$e.string(),taskDescription:$e.string()}))}),Rc={entries:{},confirmedPatterns:[]},op={primaryDomain:"general",secondaryDomains:[],confidence:.3,filePatterns:["**/*.ts","**/*.js"],relevantAgents:[]}});import Pk from"node:fs/promises";import cp from"node:path";function ip(r){return As(r.toLowerCase().trim())}async function ap(r){try{let e=cp.join(r,"storage","classification-cache.json"),t=await Pk.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return A(e)?Rc:(console.warn("[classifier] Failed to load cache:",y(e)),Rc)}}async function Ck(r,e){try{let t=cp.join(r,"storage","classification-cache.json");await ce(t,e)}catch(t){console.warn("[classifier] Failed to save cache:",y(t))}}function xk(r,e,t){let s=r.entries[e];return!s||s.projectId!==t||ls(s.classifiedAt,36e5)?null:s.classification}function Rk(r,e){return r.confirmedPatterns.find(s=>s.descriptionHash===e)?.classification??null}var Ac,Ak,lp,up=v(()=>{"use strict";nr();Ho();H();Ps();J();Ds();l(ip,"hashDescription");l(ap,"loadCache");l(Ck,"saveCache");l(xk,"lookupCache");l(Rk,"lookupPatterns");Ac=class{static{l(this,"DomainClassifier")}async classify(e,t,s){let n=ip(e),o=await ap(s),i=xk(o,n,t);if(i)return{classification:i,source:"cache"};let a=Rk(o,n);return a?{classification:a,source:"history"}:{classification:op,source:"heuristic"}}async confirmClassification(e,t,s){let n=ip(e),o=await ap(s);o.confirmedPatterns.some(i=>i.descriptionHash===n)||(o.confirmedPatterns.push({descriptionHash:n,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Ck(s,o))}},Ak=new Ac,lp=Ak});import Dk from"node:fs/promises";import jk from"node:path";var Dc,Ik,Go,jc=v(()=>{"use strict";vc();De();fe();gr();pn();ur();wt();Lo();Xm();rp();H();Ue();Pn();up();Dc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,s){let n=await M.getProjectId(s),o=R.getGlobalProjectPath(n),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,n,i),u=await Promise.allSettled([this.gatherRealContext(t,s),this.loadSealedAnalysis(n),this.loadVelocityContext(n)]),d=["realContext","sealedAnalysis","velocity"],p=[],m=u.map((F,k)=>{if(F.status==="fulfilled")return F.value;p.push(d[k]),console.warn(`Context tool "${d[k]}" failed: ${y(F.reason)}`)}),[g,h,S]=m,w={level:p.length===0?"full":p.length>=2?"minimal":"partial",failedTools:p},E=this.shouldFragment(a,t),D=null;E&&e==="task"&&(D=await this.createSubtasks(t,a,[],n));let V=this.resolveRpiPhase(n);return{detectedDomains:a,primaryDomain:c,requiresFragmentation:E,subtasks:D,project:{id:n,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:g,sealedAnalysis:h??null,velocityContext:S??null,contextDegradation:w,rpiContext:V}}resolveRpiPhase(e){try{let{prjctDb:t}=(ee(),ot(Kr)),s=t.getDoc(e,"rpi:current:research"),n=t.getDoc(e,"rpi:current:plan");if(!s)return{phase:"research"};if(!n)return{phase:"plan",researchDoc:s};let o=this.extractScopedFilesFromPlan(n);return{phase:"implement",researchDoc:s,planDoc:n,scopedFiles:o}}catch{return null}}extractScopedFilesFromPlan(e){let t=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,s=new Set;for(let n of e.matchAll(t))s.add(n[1]);return[...s].slice(0,20)}async gatherRealContext(e,t){try{let[s,n,o]=await Promise.all([this.getGitState(t),vn(e,t,{maxFiles:10,minScore:.15}),Km(t,{commits:10,maxFiles:10})]),i=n.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await np(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(p=>`${p.exported?"export ":""}${p.type} ${p.name}: ${p.signature}`).join(`
|
|
863
|
+
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:s.branch,gitStatus:s.status,relevantFiles:n.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,s]=await Promise.all([N("git branch --show-current",{cwd:e}),N("git status --porcelain",{cwd:e})]),n=t.stdout.trim()||"main",o=s.stdout.trim().split(`
|
|
864
|
+
`).filter(Boolean),i=0,a=0,c=0;for(let p of o){let m=p.substring(0,2);m.startsWith("??")?a++:m[0]!==" "&&m[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:n,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=Mt.getActive(e);if(t){let s=t.conventions.find(o=>o.category==="file-structure"&&/source|src/i.test(o.rule)),n=t.conventions.find(o=>o.category==="file-structure"&&/test/i.test(o.rule));return{languages:t.stack?.languages??[],frameworks:t.stack?.frameworks??[],packageManager:t.stack?.packageManager,sourceDir:s?.example,testDir:n?.example,fileCount:0,patterns:t.patterns.map(o=>({name:o.name,description:o.description,location:o.locations?.[0]})),antiPatterns:t.antiPatterns.map(o=>({issue:o.issue,file:o.files?.[0]??"multiple",suggestion:o.suggestion})),status:"sealed",commitHash:t.commitHash??void 0}}return this.loadHeuristicAnalysis(e)}catch{return null}}async loadHeuristicAnalysis(e){try{let t=await Je.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await mt.getAll(e);if(t.length===0)return null;let s=Oo(t,fs);return s.sprints.length===0?null:qm(s)}catch{return null}}async loadRepoAnalysis(e){try{let t=jk.join(e,"analysis","repo-analysis.json"),s=await Dk.readFile(t,"utf-8");return JSON.parse(s)}catch(t){return A(t)||console.warn("Failed to load repo-analysis.json:",y(t)),null}}async detectDomains(e,t,s){let n=R.getGlobalProjectPath(t),{classification:o}=await lp.classify(e,t,n),i=[o.primaryDomain,...o.secondaryDomains||[]];return i.length===0?{domains:["general"],primary:"general"}:{domains:i,primary:i[0]}}shouldFragment(e,t){if(e.length>=3)return!0;let s=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],n=t.toLowerCase();for(let i of s)if(n.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,s,n){let o=[...t],i=o.map((a,c)=>{let u=`${a}.md`,d=o.slice(0,c).map((p,m)=>`subtask-${m+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:u,status:c===0?"in_progress":"pending",dependsOn:d,order:c+1}});return await _.createSubtasks(n,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){return`[${t.toUpperCase()}] Handle ${t} aspects for: ${e.substring(0,80)}${e.length>80?"...":""}`}},Ik=new Dc,Go=Ik});function $k(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 Ic,Mk,Fe,dp=v(()=>{"use strict";xt();z();_s();_s();l($k,"generateApprovalPrompt");Ic=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return xa.includes(e)}isDestructive(e){return Ra.includes(e)}isToolAllowedInPlanning(e){return ko.includes(e)}getAllowedTools(e,t){return e?t.filter(s=>ko.includes(s)):t}startPlanning(e,t,s){let n={id:pe(),projectId:e,command:t,params:s,status:ne.GATHERING,startedAt:b(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,n),n}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[ne.GATHERING,ne.ANALYZING,ne.PROPOSING,ne.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let s=this.getActivePlan(e);s&&s.gatheredInfo.push({...t,gatheredAt:b()})}updateStatus(e,t){let s=this.getActivePlan(e);s&&(s.status=t,t===ne.APPROVED?s.approvedAt=b():t===ne.EXECUTING?s.executionStartedAt=b():(t===ne.COMPLETED||t===ne.ABORTED)&&(s.completedAt=b()))}setAnalysis(e,t){let s=this.getActivePlan(e);s&&(s.analysis=t,s.status=ne.ANALYZING)}proposePlan(e,t){let s=this.getActivePlan(e);return s?(s.proposedPlan=t,s.status=ne.PENDING_APPROVAL,this.formatPlanForApproval(s)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let s=this.getActivePlan(e);return!s||s.status!==ne.PENDING_APPROVAL?null:(s.userFeedback=t,s.status=ne.APPROVED,s.approvedAt=b(),s.steps=(s.proposedPlan?.steps||[]).map((n,o)=>({index:o,description:typeof n=="string"?n:n.description||"",status:"pending",tool:typeof n=="string"?void 0:n.tool,args:typeof n=="string"?void 0:n.args})),{approved:!0,planId:s.id,steps:s.steps,message:`Plan approved. ${s.steps.length} steps to execute.`})}rejectPlan(e,t=null){let s=this.getActivePlan(e);return s?(s.status=ne.REJECTED,s.userFeedback=t,s.completedAt=b(),this.activePlans.delete(e),{rejected:!0,planId:s.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==ne.APPROVED?null:(t.status=ne.EXECUTING,t.executionStartedAt=b(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==ne.EXECUTING)return null;let s=t.steps[t.currentStep];return s?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:s,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let s=this.getActivePlan(e);return!s||s.status!==ne.EXECUTING?null:(s.steps[s.currentStep].status="completed",s.steps[s.currentStep].result=t,s.steps[s.currentStep].completedAt=b(),s.currentStep++,this.getNextStep(e))}failStep(e,t){let s=this.getActivePlan(e);return s?(s.steps[s.currentStep].status="failed",s.steps[s.currentStep].error=t,{failed:!0,step:s.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=ne.COMPLETED,t.completedAt=b();let s={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(n=>n.status==="completed").length,failedSteps:t.steps.filter(n=>n.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),s}abortPlan(e,t="User requested"){let s=this.getActivePlan(e);if(!s)return null;s.status=ne.ABORTED,s.completedAt=b(),s.abortReason=t;let n={aborted:!0,planId:s.id,reason:t,completedSteps:s.steps.filter(o=>o.status==="completed").length,totalSteps:s.steps.length};return this.activePlans.delete(e),n}generateApprovalPrompt(e,t){return $k(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let n=[`${{[ne.GATHERING]:"\u{1F50D}",[ne.ANALYZING]:"\u{1F9E0}",[ne.PROPOSING]:"\u{1F4DD}",[ne.PENDING_APPROVAL]:"\u23F3",[ne.APPROVED]:"\u2705",[ne.EXECUTING]:"\u26A1",[ne.COMPLETED]:"\u{1F389}",[ne.REJECTED]:"\u274C",[ne.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===ne.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);n.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return n.join(`
|
|
865
|
+
`)}_calculateDuration(e,t){if(!e||!t)return null;let s=new Date(t).getTime()-new Date(e).getTime(),n=Math.floor(s/1e3),o=Math.floor(n/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${n%60}s`:`${n}s`}},Mk=new Ic,Fe=Mk});var $c,_k,mp,pp=v(()=>{"use strict";z();Pn();$c=class{static{l(this,"OutcomeAnalyzer")}async summarize(e){let t=await mt.getAll(e);if(t.length===0)return{totalOutcomes:0,avgQualityScore:0,estimateAccuracy:0,topBlockers:[],topAgents:[],patternsDetected:[]};let s=t.reduce((p,m)=>p+m.qualityScore,0)/t.length,n=await mt.getEstimateAccuracy(e),o=new Map;for(let p of t)for(let m of p.blockers||[])o.set(m,(o.get(m)||0)+1);let i=[...o.entries()].sort((p,m)=>m[1]-p[1]).slice(0,5).map(([p])=>p),c=(await this.getAgentMetrics(e)).sort((p,m)=>m.successRate-p.successRate).slice(0,3).map(p=>p.agent),d=(await this.detectPatterns(e)).map(p=>p.description);return{totalOutcomes:t.length,avgQualityScore:Math.round(s*10)/10,estimateAccuracy:n,topBlockers:i,topAgents:c,patternsDetected:d}}async getAgentMetrics(e){let t=await mt.getAll(e),s=new Map;for(let o of t){let i=o.agentUsed||"unknown";s.has(i)||s.set(i,[]),s.get(i).push(o)}let n=[];for(let[o,i]of s){let a=i.length,c=i.filter(S=>S.completedAsPlanned),u=Math.round(c.length/a*100),d=i.reduce((S,w)=>S+w.qualityScore,0)/a,p=i.filter(S=>{if(!S.variance)return!1;let w=tn(S.variance),E=ft(S.estimatedDuration);return E===0?!1:Math.abs(w)/E<=.2}),m=Math.round(p.length/a*100),g=new Map;for(let S of i.filter(w=>w.completedAsPlanned))for(let w of S.tags||[])g.set(w,(g.get(w)||0)+1);let h=[...g.entries()].sort((S,w)=>w[1]-S[1]).slice(0,3).map(([S])=>S);n.push({agent:o,tasksCompleted:a,successRate:u,avgQualityScore:Math.round(d*10)/10,estimateAccuracy:m,bestFor:h})}return n}async detectPatterns(e){let t=await mt.getAll(e),s=[];if(t.length<3)return s;let n=t.filter(c=>tn(c.variance)>0);n.length/t.length>.6&&s.push({description:"Tasks consistently take longer than estimated",confidence:n.length/t.length,occurrences:n.length,suggestedAction:"Add 30% buffer to estimates"});let o=t.filter(c=>tn(c.variance)<0);o.length/t.length>.6&&s.push({description:"Tasks consistently finish faster than estimated",confidence:o.length/t.length,occurrences:o.length,suggestedAction:"Reduce estimates by 20%"});let i=new Map;for(let c of t)for(let u of c.blockers||[])i.set(u,(i.get(u)||0)+1);for(let[c,u]of i)u>=3&&s.push({description:`Recurring blocker: ${c}`,confidence:u/t.length,occurrences:u,suggestedAction:`Address root cause of "${c}"`});let a=await this.getAgentMetrics(e);for(let c of a)c.tasksCompleted>=5&&c.successRate>90&&s.push({description:`${c.agent} has high success rate (${c.successRate}%)`,confidence:.9,occurrences:c.tasksCompleted,suggestedAction:`Prefer ${c.agent} for similar tasks`});return s.sort((c,u)=>u.confidence-c.confidence)}async suggestEstimate(e,t){let n=(await mt.getAll(e)).filter(a=>a.tags?.includes(t));if(n.length<2)return null;let o=n.reduce((a,c)=>a+ft(c.actualDuration),0),i=Math.round(o/n.length);if(i>=60){let a=Math.floor(i/60),c=i%60;return c>0?`${a}h ${c}m`:`${a}h`}return`${i}m`}async suggestAgent(e,t){let n=(await this.getAgentMetrics(e)).filter(o=>o.bestFor.includes(t));return n.length===0?null:n.sort((o,i)=>i.successRate-o.successRate)[0].agent}},_k=new $c,mp=_k});var wp={};Bt(wp,{AgentAssignmentSchema:()=>gp,OUTPUT_SCHEMAS:()=>hp,SubtaskBreakdownSchema:()=>fp,TaskClassificationSchema:()=>Cn,renderSchemaForPrompt:()=>Ok});import{z as ze}from"zod";function Ok(r){let e=hp[r];return e?`## OUTPUT FORMAT
|
|
730
866
|
|
|
731
867
|
Return ONLY valid JSON matching this schema (no markdown, no explanation):
|
|
732
868
|
|
|
@@ -735,163 +871,175 @@ ${e.example}
|
|
|
735
871
|
\`\`\`
|
|
736
872
|
|
|
737
873
|
Fields:
|
|
738
|
-
${
|
|
739
|
-
`)}return"(see example above)"}function
|
|
740
|
-
`)
|
|
741
|
-
`),n.
|
|
742
|
-
`),n.
|
|
743
|
-
`),
|
|
874
|
+
${Nk(e.schema)}`:null}function Nk(r){if(r instanceof ze.ZodObject){let e=r.shape;return Object.entries(e).map(([t,s])=>`- \`${t}\`: ${yp(s)}`).join(`
|
|
875
|
+
`)}return"(see example above)"}function yp(r){return r instanceof ze.ZodString?"string":r instanceof ze.ZodNumber?"number":r instanceof ze.ZodEnum?`one of: ${r.options.join(", ")}`:r instanceof ze.ZodArray?`array of ${yp(r.element)}`:r instanceof ze.ZodObject?"object":"any"}var gp,fp,hp,kp=v(()=>{"use strict";Ho();Ho();gp=ze.object({agentName:ze.string(),reasoning:ze.string(),confidence:ze.number().min(0).max(1)}),fp=ze.object({subtasks:ze.array(ze.object({description:ze.string(),domain:Uo,agent:ze.string(),dependsOn:ze.array(ze.number())})),effort:ze.enum(["low","medium","high"])}),hp={classification:{schema:Cn,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:gp,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:fp,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(Ok,"renderSchemaForPrompt");l(Nk,"describeSchema");l(yp,"describeField")});import Sp from"node:fs/promises";import xn from"node:path";function Wo(r,e){let t=e*4;return r.length<=t?r:`${r.substring(0,t)}
|
|
876
|
+
... (truncated to ~${e} tokens)`}function bp(r){return Math.ceil(r.length/4)}var Mc,_c,Oc,Lk,Tp,vp=v(()=>{"use strict";mo();Wt();wt();H();J();Pt();pp();Is();Mc={autoContext:500,stateData:1e3,memories:600,totalPrompt:8e3};l(Wo,"truncateToTokenBudget");l(bp,"estimateTokens");_c=class{static{l(this,"InjectionBudgetTracker")}used=0;budgets;constructor(e={}){this.budgets={...Mc,...e}}addSection(e,t){let s=Wo(e,t),n=bp(s);if(this.used+n>this.budgets.totalPrompt){let o=this.budgets.totalPrompt-this.used;if(o<=0)return"";let i=Wo(s,o);return this.used+=bp(i),i}return this.used+=n,s}},Oc=class{static{l(this,"PromptBuilder")}_checklistsCache=null;_checklistsCacheTime=0;_checklistRoutingCache=null;_checklistRoutingCacheTime=0;_stateCache=new Map;_stateCacheTTL=5e3;_templateCache=new Map;TEMPLATE_CACHE_TTL_MS=6e4;async getTemplate(e){let t=this._templateCache.get(e),s=Date.now();if(t&&s-t.loadedAt<this.TEMPLATE_CACHE_TTL_MS)return t.content;try{if(await x(e)){let n=await Sp.readFile(e,"utf-8");return this._templateCache.set(e,{content:n,loadedAt:s}),n}}catch(n){A(n)||console.error(`Template loading warning: ${y(n)}`)}return null}clearTemplateCache(){this._templateCache.clear(),this._checklistsCache=null,this._checklistsCacheTime=0,this._checklistRoutingCache=null,this._checklistRoutingCacheTime=0}resetContext(){}setContext(e){}async loadModule(e){let t=dt(`global/modules/${e}`);if(t)return t;let s=xn.join(at,"templates/global/modules",e);return this.getTemplate(s)}async loadChecklists(){let e=Date.now();if(this._checklistsCache&&e-this._checklistsCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistsCache;let t={};try{let s=un("checklists/");if(s.length>0){for(let n of s)if(n.endsWith(".md")){let o=dt(n);if(o){let i=xn.basename(n,".md");t[i]=o}}}else{let n=xn.join(at,"templates","checklists");if(await x(n)){let o=(await Sp.readdir(n)).filter(i=>i.endsWith(".md"));for(let i of o){let a=i.replace(".md",""),c=xn.join(n,i),u=await this.getTemplate(c);u&&(t[a]=u)}}}}catch(s){A(s)||console.error(`Checklist loading warning: ${y(s)}`)}return this._checklistsCache=t,this._checklistsCacheTime=e,t}async getProjectState(e){if(!e)return null;let t=this._stateCache.get(e);if(t&&Date.now()-t.timestamp<this._stateCacheTTL)return t.state;try{let[s,n]=await Promise.all([_.read(e),we.read(e)]),o={projectId:e,currentTask:s.currentTask,queue:n.tasks};return this._stateCache.set(e,{state:o,timestamp:Date.now()}),o}catch(s){if(A(s)||s instanceof SyntaxError)return null;throw s}}async buildInjectedContext(e){if(!e)return null;let t=await this.getProjectState(e);if(!t)return null;let s=[];if(s.push("## AUTO-INJECTED CONTEXT"),s.push(""),t.currentTask){let o=this.calculateElapsed(t.currentTask.startedAt);s.push(`**Current Task**: ${t.currentTask.description}`),s.push(`- Started: ${o} ago`)}else s.push("**Current Task**: None");if(s.push(""),t.queue.length>0){s.push(`**Queue**: ${t.queue.length} tasks pending`);let o=t.queue.slice(0,3);for(let i of o)s.push(`- [${i.priority}] ${i.description}`);t.queue.length>3&&s.push(`- ... and ${t.queue.length-3} more`)}s.push("");try{let o=await mp.detectPatterns(e);if(o.length>0){s.push("**Project Conventions**");for(let i of o.slice(0,3))s.push(`- ${i.description}`),i.suggestedAction&&s.push(` \u2192 ${i.suggestedAction}`);s.push("")}}catch(o){!A(o)&&!(o instanceof SyntaxError)&&console.error(`Outcome detection warning: ${y(o)}`)}s.push("---"),s.push("");let n=s.join(`
|
|
877
|
+
`);return Wo(n,Mc.autoContext)}calculateElapsed(e){let t=new Date(e).getTime(),n=Date.now()-t,o=Math.floor(n/6e4),i=Math.floor(o/60),a=Math.floor(i/24);return a>0?`${a}d ${i%24}h`:i>0?`${i}h ${o%60}m`:`${o}m`}async loadChecklistRouting(){let e=Date.now();if(this._checklistRoutingCache&&e-this._checklistRoutingCacheTime<this.TEMPLATE_CACHE_TTL_MS)return this._checklistRoutingCache;let t=xn.join(__dirname,"..","..","templates","agentic","checklist-routing.md"),s=await this.getTemplate(t);return s&&(this._checklistRoutingCache=s,this._checklistRoutingCacheTime=e),this._checklistRoutingCache||null}async buildWithInjection(e,t,s,n=null,o=null,i=null,a=null,c=null){let u=[];if(t.projectId){let p=await this.buildInjectedContext(t.projectId);p&&u.push(p)}let d=await this.build(e,t,s,n,o,i,a,c);return u.push(d),u.join("")}async build(e,t,s,n=null,o=null,i=null,a=null,c=null,u=null,d){let p=d?.skipNativeContext??!1,m=d?.mcpActive??!1,g=[],h=e.frontmatter?.name?.replace("p:","")||"",S={agents:!0,patterns:!0,checklist:!1,modules:[]};n&&S.agents&&(g.push(`# AGENT: ${n.name}
|
|
878
|
+
`),n.role&&g.push(`Role: ${n.role}
|
|
879
|
+
`),n.skills?.length&&g.push(`Skills: ${n.skills.join(", ")}
|
|
880
|
+
`),g.push(`
|
|
744
881
|
Apply specialized expertise. Read agent file for details if needed.
|
|
745
882
|
|
|
746
|
-
`)),
|
|
747
|
-
`),e.frontmatter["allowed-tools"]&&
|
|
748
|
-
`);let
|
|
749
|
-
`);let
|
|
750
|
-
|
|
751
|
-
|
|
883
|
+
`)),g.push(`TASK: ${e.frontmatter.description}
|
|
884
|
+
`),e.frontmatter["allowed-tools"]&&g.push(`TOOLS: ${e.frontmatter["allowed-tools"].join(", ")}
|
|
885
|
+
`);let w=t;(w.params?.task||w.params?.description)&&g.push(`INPUT: ${w.params.task||w.params.description}
|
|
886
|
+
`);let E=t.projectPath;if(E){let $=[`project: ${xn.basename(E)}`,`path: ${E}`,"git: true"];u?.realContext?.gitBranch&&$.push(`branch: ${u.realContext.gitBranch}`),$.push(`date: ${new Date().toISOString().split("T")[0]}`),g.push(`
|
|
887
|
+
<env>
|
|
888
|
+
${$.join(`
|
|
889
|
+
`)}
|
|
890
|
+
</env>
|
|
891
|
+
`)}if(u){let k=u.sealedAnalysis;if(g.push(`
|
|
752
892
|
## PROJECT ANALYSIS (Sealed)
|
|
753
|
-
`),
|
|
754
|
-
`),
|
|
755
|
-
`),
|
|
756
|
-
`),
|
|
757
|
-
`),
|
|
758
|
-
`),
|
|
759
|
-
`),
|
|
760
|
-
`),
|
|
761
|
-
`),
|
|
762
|
-
`),
|
|
763
|
-
`),!
|
|
893
|
+
`),g.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
894
|
+
`),g.push(`**Primary Domain**: ${u.primaryDomain}
|
|
895
|
+
`),g.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
896
|
+
`),k&&(k.languages?.length>0&&g.push(`**Languages**: ${k.languages.join(", ")}
|
|
897
|
+
`),k.frameworks?.length>0&&g.push(`**Frameworks**: ${k.frameworks.join(", ")}
|
|
898
|
+
`),k.packageManager&&g.push(`**Package Manager**: ${k.packageManager}
|
|
899
|
+
`),k.sourceDir&&g.push(`**Source Dir**: ${k.sourceDir}
|
|
900
|
+
`),k.testDir&&g.push(`**Test Dir**: ${k.testDir}
|
|
901
|
+
`),g.push(`**Files Analyzed**: ${k.fileCount}
|
|
902
|
+
`),g.push(`**Analysis Status**: ${k.status}${k.commitHash?` (commit: ${k.commitHash.slice(0,8)})`:""}
|
|
903
|
+
`),!p)){if(k.patterns?.length>0){g.push(`
|
|
764
904
|
### Code Patterns (Follow These)
|
|
765
|
-
`);for(let
|
|
766
|
-
`)}if(
|
|
905
|
+
`);for(let $ of k.patterns)g.push(`- **${$.name}**: ${$.description}${$.location?` (${$.location})`:""}
|
|
906
|
+
`)}if(k.antiPatterns?.length>0){g.push(`
|
|
767
907
|
### Anti-Patterns (Avoid These)
|
|
768
|
-
`);for(let
|
|
769
|
-
`)}}
|
|
770
|
-
`)}if(!
|
|
771
|
-
`),
|
|
908
|
+
`);for(let $ of k.antiPatterns)g.push(`- **${$.issue}** in \`${$.file}\` \u2014 ${$.suggestion}
|
|
909
|
+
`)}}g.push(`
|
|
910
|
+
`)}if(!p){let k=s?.codePatterns||"";if(S.patterns&&k&&k.trim()){let O=this.extractPatternSummary(k);O&&(g.push(`## CODE PATTERNS
|
|
911
|
+
`),g.push(O),g.push(`
|
|
772
912
|
Full patterns: Read analysis/patterns.md
|
|
773
|
-
`))}let
|
|
913
|
+
`))}let $=s?.analysis||"";if(S.patterns&&$&&$.trim()){let O=$.match(/Stack[:\s]+([^\n]+)/i)||$.match(/Technology[:\s]+([^\n]+)/i),ge=O?O[1].trim():"detected";g.push(`
|
|
774
914
|
## STACK
|
|
775
|
-
Stack: ${
|
|
776
|
-
`),
|
|
777
|
-
`)}}
|
|
778
|
-
`),
|
|
915
|
+
Stack: ${ge}
|
|
916
|
+
`),k||g.push(`Read analysis/repo-summary.md + similar files before coding. Match patterns exactly.
|
|
917
|
+
`)}}if(S.modules.length>0)for(let k of S.modules){let $=await this.loadModule(k);$&&(g.push(`
|
|
918
|
+
`),g.push($))}if(c?.isPlanning&&(g.push(`
|
|
779
919
|
## PLAN MODE
|
|
780
920
|
Read-only. Gather info \u2192 Analyze \u2192 Propose plan \u2192 Wait for approval.
|
|
781
|
-
`),c.allowedTools&&
|
|
782
|
-
`)),c?.requiresApproval&&
|
|
921
|
+
`),c.allowedTools&&g.push(`Tools: ${c.allowedTools.join(", ")}
|
|
922
|
+
`)),c?.requiresApproval&&g.push(`
|
|
783
923
|
## APPROVAL REQUIRED
|
|
784
924
|
Show changes, list affected files, ask for confirmation.
|
|
785
|
-
`),
|
|
786
|
-
|
|
787
|
-
|
|
925
|
+
`),E){g.push(`
|
|
926
|
+
## CONSTRAINTS
|
|
927
|
+
SCOPE: Only files in \`${E}\` are accessible.
|
|
928
|
+
`);let k=u?.sealedAnalysis;if(k){let $=[...k.languages||[],...k.frameworks||[]].filter(Boolean);$.length>0&&g.push(`AVAILABLE: ${$.join(", ")}
|
|
929
|
+
`),k.packageManager&&g.push(`PACKAGE MANAGER: ${k.packageManager}
|
|
930
|
+
`)}}if(u?.contextDegradation?.level!=="full"&&u?.contextDegradation){let k=u.contextDegradation;g.push(`
|
|
788
931
|
### CONTEXT DEGRADATION NOTICE
|
|
789
932
|
|
|
790
|
-
`),
|
|
791
|
-
`),
|
|
792
|
-
`),
|
|
933
|
+
`),g.push(`**Level**: ${k.level}
|
|
934
|
+
`),g.push(`**Unavailable**: ${k.failedTools.join(", ")}
|
|
935
|
+
`),g.push(`Some context tools failed. Explore the codebase manually for missing context.
|
|
793
936
|
|
|
794
|
-
`)}if(u?.realContext){let
|
|
937
|
+
`)}if(u?.realContext){let k=u.realContext;if(g.push(`
|
|
795
938
|
### CODEBASE CONTEXT
|
|
796
939
|
|
|
797
|
-
`),
|
|
798
|
-
|
|
799
|
-
`),
|
|
800
|
-
`),
|
|
801
|
-
`),
|
|
802
|
-
`);for(let
|
|
803
|
-
`);
|
|
804
|
-
`)}if(
|
|
805
|
-
`);for(let
|
|
806
|
-
// ${
|
|
807
|
-
${
|
|
940
|
+
`),g.push(`**Git State**: Branch \`${k.gitBranch}\` | ${k.gitStatus}
|
|
941
|
+
|
|
942
|
+
`),k.relevantFiles.length>0){g.push(`**Relevant Files** (scored by task relevance):
|
|
943
|
+
`),g.push(`| Score | File | Why |
|
|
944
|
+
`),g.push(`|-------|------|-----|
|
|
945
|
+
`);for(let $ of k.relevantFiles.slice(0,8))g.push(`| ${$.score} | ${$.path} | ${$.reason} |
|
|
946
|
+
`);g.push(`
|
|
947
|
+
`)}if(k.signatures.length>0){g.push(`**Code Signatures** (top files):
|
|
948
|
+
`);for(let $ of k.signatures)g.push(`\`\`\`typescript
|
|
949
|
+
// ${$.path}
|
|
950
|
+
${$.content}
|
|
808
951
|
\`\`\`
|
|
809
|
-
`);
|
|
810
|
-
`)}if(
|
|
952
|
+
`);g.push(`
|
|
953
|
+
`)}if(k.recentFiles.length>0){g.push("**Recently Changed**: ");let $=k.recentFiles.slice(0,5).map(O=>`${O.path} (${O.lastChanged})`).join(", ");g.push(`${$}
|
|
811
954
|
|
|
812
|
-
`)}}let
|
|
813
|
-
## FILES: ${
|
|
814
|
-
`),
|
|
955
|
+
`)}}let D=t.files||[];if(D.length>0){let k=D.slice(0,5).join(", ");g.push(`
|
|
956
|
+
## FILES: ${D.length} available. Top: ${k}
|
|
957
|
+
`),g.push(`Read BEFORE modifying. Use Glob/Grep to find more.
|
|
815
958
|
|
|
816
|
-
`)}else
|
|
817
|
-
## PROJECT: ${
|
|
959
|
+
`)}else E&&g.push(`
|
|
960
|
+
## PROJECT: ${E}
|
|
818
961
|
Read files before modifying.
|
|
819
962
|
|
|
820
|
-
`);let
|
|
963
|
+
`);let V=this.filterRelevantState(s);if(V&&(g.push(`
|
|
821
964
|
## PRJCT STATE (Project Management Data)
|
|
822
|
-
`),
|
|
823
|
-
`)),u?.velocityContext&&(
|
|
965
|
+
`),g.push(V),g.push(`
|
|
966
|
+
`)),u?.velocityContext&&(g.push(`
|
|
824
967
|
### VELOCITY (Historical Estimation Data)
|
|
825
968
|
|
|
826
|
-
`),
|
|
969
|
+
`),g.push(u.velocityContext),g.push(`
|
|
827
970
|
|
|
828
|
-
`)),o&&Object.keys(o).some(
|
|
971
|
+
`)),o&&Object.keys(o).some(k=>o[k])){g.push(`
|
|
829
972
|
## PROJECT DEFAULTS (apply automatically)
|
|
830
|
-
`);for(let[
|
|
831
|
-
`)}if(i?.plan&&i.plan.length>0){if(
|
|
973
|
+
`);for(let[k,$]of Object.entries(o))$&&g.push(`- ${k}: ${$}
|
|
974
|
+
`)}if(i?.plan&&i.plan.length>0){if(g.push(`
|
|
832
975
|
## THINK FIRST (reasoning from analysis)
|
|
833
|
-
`),i.conclusions&&i.conclusions.length>0){
|
|
834
|
-
`);for(let
|
|
835
|
-
`)}
|
|
836
|
-
`);for(let
|
|
837
|
-
`);
|
|
838
|
-
`)}if(a&&a.length>0){
|
|
976
|
+
`),i.conclusions&&i.conclusions.length>0){g.push(`Conclusions:
|
|
977
|
+
`);for(let k of i.conclusions)g.push(` \u2192 ${k}
|
|
978
|
+
`)}g.push(`Plan:
|
|
979
|
+
`);for(let k=0;k<i.plan.length;k++)g.push(` ${k+1}. ${i.plan[k]}
|
|
980
|
+
`);g.push(`Confidence: ${Math.round((i.confidence||.5)*100)}%
|
|
981
|
+
`)}if(!m&&a&&a.length>0){g.push(`
|
|
839
982
|
## CONTEXT (apply these)
|
|
840
|
-
`);for(let
|
|
841
|
-
`),
|
|
842
|
-
`)}if(u?.rpiContext){let
|
|
983
|
+
`);for(let k of a)g.push(`- **${k.title}**: ${k.content}
|
|
984
|
+
`),k.tags&&k.tags.length>0&&g.push(` Tags: ${k.tags.join(", ")}
|
|
985
|
+
`)}if(u?.rpiContext){let k=u.rpiContext;switch(g.push(`
|
|
843
986
|
### RPI PHASE
|
|
844
987
|
|
|
845
|
-
`),
|
|
846
|
-
`);break;case"plan":
|
|
847
|
-
`),
|
|
988
|
+
`),k.phase){case"research":g.push(`**Phase: RESEARCH** \u2014 Explore the codebase. Produce a truth snapshot: exact files + lines, function call chains, test locations. Use sub-agents for broad exploration.
|
|
989
|
+
`);break;case"plan":g.push(`**Phase: PLAN** \u2014 Create an implementation plan with real code snippets. Reference exact files and line numbers from research.
|
|
990
|
+
`),k.researchDoc&&g.push(`
|
|
848
991
|
<research-context>
|
|
849
|
-
${
|
|
992
|
+
${k.researchDoc}
|
|
850
993
|
</research-context>
|
|
851
|
-
`);break;case"implement":
|
|
852
|
-
`),
|
|
994
|
+
`);break;case"implement":g.push(`**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration. Work only with the scoped files below.
|
|
995
|
+
`),k.planDoc&&g.push(`
|
|
853
996
|
<plan-context>
|
|
854
|
-
${
|
|
997
|
+
${k.planDoc}
|
|
855
998
|
</plan-context>
|
|
856
|
-
`),
|
|
857
|
-
**Scoped Files**: ${
|
|
858
|
-
`);break}
|
|
859
|
-
`)}if(
|
|
999
|
+
`),k.scopedFiles&&k.scopedFiles.length>0&&g.push(`
|
|
1000
|
+
**Scoped Files**: ${k.scopedFiles.map($=>`\`${$}\``).join(", ")}
|
|
1001
|
+
`);break}g.push(`
|
|
1002
|
+
`)}if(g.push(`
|
|
860
1003
|
---
|
|
861
|
-
`),
|
|
1004
|
+
`),g.push(e.content),u?.requiresFragmentation&&u.subtasks){g.push(`
|
|
862
1005
|
### SUBTASKS (Execute in Order)
|
|
863
1006
|
|
|
864
|
-
`),
|
|
865
|
-
`),
|
|
866
|
-
`);for(let
|
|
867
|
-
`)}let
|
|
868
|
-
**FOCUS ON SUBTASK #${
|
|
869
|
-
`),
|
|
870
|
-
`),
|
|
871
|
-
`),
|
|
1007
|
+
`),g.push("**IMPORTANT**: Focus on the CURRENT subtask. Use `p. done` when complete to advance.\n\n"),g.push(`| # | Domain | Description | Status |
|
|
1008
|
+
`),g.push(`|---|--------|-------------|--------|
|
|
1009
|
+
`);for(let $ of u.subtasks){let O=$.status==="in_progress"?"\u25B6\uFE0F **CURRENT**":$.status==="completed"?"\u2705 Done":$.status==="failed"?"\u274C Failed":"\u23F3 Pending";g.push(`| ${$.order} | ${$.domain} | ${$.description} | ${O} |
|
|
1010
|
+
`)}let k=u.subtasks.find($=>$.status==="in_progress");if(k&&(g.push(`
|
|
1011
|
+
**FOCUS ON SUBTASK #${k.order}**: ${k.description}
|
|
1012
|
+
`),g.push(`Agent: ${k.agent} | Domain: ${k.domain}
|
|
1013
|
+
`),k.dependsOn.length>0&&g.push(`Dependencies: ${k.dependsOn.join(", ")}
|
|
1014
|
+
`),k.handoff)){let $=k.handoff;g.push(`
|
|
872
1015
|
### Previous Subtask Handoff
|
|
873
1016
|
|
|
874
|
-
`),
|
|
1017
|
+
`),g.push(`**From:** ${$.fromSubtask}
|
|
875
1018
|
|
|
876
|
-
`),
|
|
877
|
-
`);for(let
|
|
878
|
-
`);if(
|
|
1019
|
+
`),g.push(`**What was done:**
|
|
1020
|
+
`);for(let O of $.whatWasDone)g.push(`- ${O}
|
|
1021
|
+
`);if($.filesChanged.length>0){g.push(`
|
|
879
1022
|
**Files changed:**
|
|
880
|
-
`);for(let
|
|
881
|
-
`)}
|
|
1023
|
+
`);for(let O of $.filesChanged)g.push(`- \`${O.path}\` (${O.action})
|
|
1024
|
+
`)}g.push(`
|
|
882
1025
|
**Context for this subtask:**
|
|
883
|
-
${
|
|
884
|
-
`)}
|
|
885
|
-
`)}let
|
|
886
|
-
${
|
|
887
|
-
`)}if(
|
|
1026
|
+
${$.outputForNextAgent}
|
|
1027
|
+
`)}g.push(`
|
|
1028
|
+
`)}let F=this.getSchemaTypeForCommand(h);if(F){let{renderSchemaForPrompt:k}=await Promise.resolve().then(()=>(kp(),wp)),$=k(F);$&&g.push(`
|
|
1029
|
+
${$}
|
|
1030
|
+
`)}if(S.checklist){let k=await this.loadChecklistRouting(),$=await this.loadChecklists();k&&Object.keys($).length>0&&(g.push(`
|
|
888
1031
|
## QUALITY CHECKLISTS
|
|
889
|
-
`),
|
|
890
|
-
`),
|
|
891
|
-
`),
|
|
892
|
-
`),
|
|
893
|
-
`))}return
|
|
894
|
-
|
|
1032
|
+
`),g.push(`Apply relevant checklists based on task. Read checklist-routing.md for guidance.
|
|
1033
|
+
`),g.push(`Available: ${Object.keys($).join(", ")}
|
|
1034
|
+
`),g.push(`Path: templates/checklists/{name}.md
|
|
1035
|
+
`),g.push(`Use Read tool to load checklists you determine are relevant.
|
|
1036
|
+
`))}return g.push(`
|
|
1037
|
+
## EFFICIENCY
|
|
1038
|
+
`),g.push(`- Be concise. No preamble, no filler.
|
|
1039
|
+
`),g.push(`- Use sub-agents for exploration that produces >5 file reads.
|
|
1040
|
+
`),g.push(`- Prefer file:line references over dumping full file contents.
|
|
1041
|
+
`),g.join("")}filterRelevantState(e){if(!e||Object.keys(e).length===0)return null;let t=new _c({totalPrompt:Mc.stateData}),s=["now","next","context","analysis","codePatterns"],n=[];for(let[o,i]of Object.entries(e))if(i&&i.trim()){let a=s.includes(o)?500:250,c=t.addSection(`### ${o}
|
|
1042
|
+
${i}`,a);c&&n.push(c)}return n.length>0?n.join(`
|
|
895
1043
|
|
|
896
1044
|
`):null}buildAnalysis(e,t){let s=[];return s.push(`# Analyze: ${e}
|
|
897
1045
|
|
|
@@ -907,52 +1055,13 @@ ${a}`,c);u&&o.push(u)}return o.length>0?o.join(`
|
|
|
907
1055
|
`);a&&t.push(a)}let n=e.match(/### High Priority[\s\S]*?(?=###|##|$)/i);if(n){let a=n[0].substring(0,300);t.push(`
|
|
908
1056
|
Avoid:
|
|
909
1057
|
${a}`)}let o=t.join(`
|
|
910
|
-
`);return
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
`):t.zone==="dumb"&&e.push(`
|
|
918
|
-
**CONTEXT CRITICAL** (${Math.round(t.usagePercent)}% used): STOP expanding context. Work only with referenced files. Compact now.
|
|
919
|
-
`),this._healthMonitor.checkTransition()}return e.join("")}extractDomains(e){if(!e)return;let t=e;if(t.domains&&typeof t.domains=="object"){let s=t.domains;return{hasFrontend:s.hasFrontend??!1,hasBackend:s.hasBackend??!1,hasDatabase:s.hasDatabase??!1,hasTesting:s.hasTesting??!1,hasDocker:s.hasDocker??!1}}}},yb=new Qc,cg=yb});import Ps from"node:path";var Zc,wb,Zo,ug=S(()=>{"use strict";Ac();Et();Te();Zc=class{static{l(this,"TemplateExecutor")}async getNpmRoot(){return Ps.dirname(bt.resolve("prjct-cli/package.json"))}async getProjectId(e){return $.getProjectId(e)}async buildContext(e,t,s){let n=await this.getProjectId(s),o=A.getGlobalProjectPath(n),a=await(at(),ot(vt)).getActiveProvider(),c;try{let u=await this.getNpmRoot();c=Ps.join(u,"templates")}catch{c=Ps.join(__dirname,"..","..","templates")}return{projectPath:s,projectId:n,globalPath:o,command:e,args:t,agentName:a.displayName,agentSettingsPath:await A.getAgentSettingsPath(),paths:{orchestrator:Ps.join(c,"agentic","orchestrator.md"),taskFragmentation:Ps.join(c,"agentic","task-fragmentation.md"),commandTemplate:Ps.join(c,"commands",`${e}.md`),repoAnalysis:Ps.join(o,"analysis","repo-analysis.json"),skillsDir:a.skillsDir,stateJson:Ps.join(o,"storage","state.json")}}}requiresOrchestration(e){return em.includes(e)?!0:!tm.includes(e)}buildAgenticPrompt(e){let t=this.requiresOrchestration(e.command);return{prompt:`
|
|
920
|
-
## Agentic Execution Mode
|
|
921
|
-
|
|
922
|
-
You are executing a prjct command as ${e.agentName}. Follow the template-first approach.
|
|
923
|
-
|
|
924
|
-
### Context
|
|
925
|
-
- Command: ${e.command}
|
|
926
|
-
- Args: ${e.args}
|
|
927
|
-
- Project: ${e.projectPath}
|
|
928
|
-
- Project ID: ${e.projectId}
|
|
929
|
-
|
|
930
|
-
### Paths (Read as needed)
|
|
931
|
-
- Command Template: ${e.paths.commandTemplate}
|
|
932
|
-
- Repo Analysis: ${e.paths.repoAnalysis}
|
|
933
|
-
- Skills Directory: ${e.paths.skillsDir}
|
|
934
|
-
- State JSON: ${e.paths.stateJson}
|
|
935
|
-
|
|
936
|
-
### Instructions
|
|
937
|
-
|
|
938
|
-
1. **Read the command template** (${e.paths.commandTemplate})
|
|
939
|
-
${t?`
|
|
940
|
-
2. **Orchestration:**
|
|
941
|
-
- Read: ${e.paths.repoAnalysis} to understand project technologies
|
|
942
|
-
- Analyze the task: "${e.args}"
|
|
943
|
-
- Determine which domains are relevant
|
|
944
|
-
- Check if task should be fragmented into subtasks
|
|
945
|
-
`:`
|
|
946
|
-
2. **Execute the command template directly**
|
|
947
|
-
`}
|
|
948
|
-
3. **Return results**
|
|
949
|
-
`,context:e,requiresOrchestration:t}}},wb=new Zc,Zo=wb});function _r(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&kb.has(e.code))return!0;if(e.code&&pg.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function ti(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&pg.has(e.code))}function dg(r,e,t){let s=Es.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Es.delete(r),!1):!0:!1}function el(r,e){let t=Es.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Es.set(r,t)}function Sb(r){Es.delete(r)}var kb,pg,Es,ei,mg,si,tl=S(()=>{"use strict";kb=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),pg=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(_r,"isTransientError");l(ti,"isPermanentError");Es=new Map;l(dg,"isCircuitOpen");l(el,"recordFailure");l(Sb,"recordSuccess");ei=class{static{l(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(dg(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return Sb(t),o}catch(o){if(s=o,n++,ti(o))throw el(t,this.options.circuitBreakerThreshold),o;if(!(_r(o)&&n<this.options.maxAttempts))throw el(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw el(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return _r(e)}isCircuitOpen(e){return dg(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Es.get(e)}resetCircuit(e){Es.delete(e)}resetAllCircuits(){Es.clear()}},mg=new ei({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),si=new ei({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});import gg from"node:fs/promises";var Zs,nt,sl=S(()=>{"use strict";He();tl();Zs={tools:new Map,register(r,e){this.tools.set(r,e)},get(r){return this.tools.get(r)},isAllowed(r,e){return!e||e.length===0?!0:e.some(t=>t.endsWith("*")?r.startsWith(t.slice(0,-1)):r===t)},list(){return Array.from(this.tools.keys())}};Zs.register("Read",async r=>{try{return await si.execute(async()=>await gg.readFile(r,"utf-8"),`read-${r}`)}catch(e){return ti(e)||_r(e),null}});Zs.register("Write",async(r,e)=>{try{return await si.execute(async()=>await gg.writeFile(r,e,"utf-8"),`write-${r}`),!0}catch(t){return ti(t)||_r(t),!1}});Zs.register("Bash",async r=>{try{return await si.execute(async()=>await O(r),`bash-${r}`)}catch(e){let t=e;return{stdout:t.stdout||"",stderr:t.stderr||t.message||"Command failed"}}});Zs.register("GetTimestamp",async()=>new Date().toISOString());Zs.register("GetDate",async()=>new Date().toISOString().split("T")[0]);Zs.register("GetDateTime",async()=>new Date().toISOString());nt=Zs});import nl from"node:fs/promises";import bb from"node:os";import rl from"node:path";function fg(){let r=process.env.PRJCT_CLI_HOME?.trim()||rl.join(bb.homedir(),".prjct-cli");return rl.join(r,".running")}async function Tb(r){try{let e=fg(),t=rl.dirname(e);await P(t)||await nl.mkdir(t,{recursive:!0}),await nl.writeFile(e,`/p:${r}`)}catch{}}async function vb(){try{let r=fg();await P(r)&&await nl.unlink(r)}catch{}}var ol,Cb,ni,il=S(()=>{"use strict";W();Xp();K();Zp();sm();jc();gm();fm();mr();zc();Om();lg();ug();Hs();sl();l(fg,"getRunningFilePath");l(Tb,"signalStart");l(vb,"signalEnd");ol=class{static{l(this,"CommandExecutor")}async signalStart(e){await Tb(e)}async signalEnd(){await vb()}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Rn.shouldEscalate(e,n)){let o=Rn.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await oa.load(e),i=await Wt.build(s,t),a=We.requiresPlanning(e),c=We.isDestructive(e),u=We.isInPlanningMode(i.projectId),p=null;a&&!u&&!t.skipPlanning?p=We.startPlanning(i.projectId,e,t):u&&(p=We.getActivePlan(i.projectId));let m=null;if(Wo.requiresVerification(e)){let q=await Wt.loadStateForCommand(i,e);m=await Wo.verify(e,i,q),!m.verified&&m.warnings.length>0&&console.log(Wo.formatWarnings(m))}let d=null;if(Ho.requiresReasoning(e)){let q=await Wt.loadStateForCommand(i,e);d=await Ho.reason(e,i,q),d.reasoning&&!d.reasoning.allPassed&&(console.log("\u26A0\uFE0F Chain of Thought detected issues:"),console.log(Ho.formatPlan(d)))}let g=t.task||t.description||"",h=await Zo.buildContext(e,g,s),k=Zo.buildAgenticPrompt(h),y=null;if(Zo.requiresOrchestration(e)&&g)try{if(y=await Ko.execute(e,g,s),y.detectedDomains.length>0&&Kp.orchestrate(y.detectedDomains),y.requiresFragmentation&&y.subtasks){let q=y.subtasks.map(mt=>({id:mt.id,domain:mt.domain,description:mt.description,status:mt.status}));Qp(q)}}catch(q){console.warn(`\u26A0\uFE0F Orchestrator warning: ${w(q)}`)}let v={...i,orchestratorPath:h.paths.orchestrator,taskFragmentationPath:h.paths.taskFragmentation,agenticDelegation:!0,agenticMode:!0},D=await Wt.loadState(i),U=null,F=null;i.projectId&&(U={commit_footer:await ct.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await ct.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await ct.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await ct.getSmartDecision(i.projectId,`preferred_agent_${e}`)},F=await ct.getRelevantMemories(i.projectId,{commandName:e,params:t},5));let j={isPlanning:a||u,requiresApproval:c&&!t.approved,active:p,allowedTools:We.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},se=(await(at(),ot(vt)).getActiveProvider()).name==="claude",Me=await cg.build(o,v,D,null,U,null,F,j,y,{skipNativeContext:se});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),k.requiresOrchestration&&console.log(` \u2192 Orchestration: ${h.paths.orchestrator}`),Rn.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:v,state:D,prompt:Me,agenticDelegation:!0,agenticMode:!0,agenticExecContext:h,agenticPrompt:k.prompt,requiresOrchestration:k.requiresOrchestration,orchestratorPath:h.paths.orchestrator,taskFragmentationPath:h.paths.taskFragmentation,reasoning:d,groundTruth:m,learnedPatterns:U,relevantMemories:F,orchestratorContext:y,memory:{create:l(q=>ct.createMemory(i.projectId,q),"create"),autoRemember:l((q,mt,ms)=>ct.autoRemember(i.projectId,q,mt,ms),"autoRemember"),search:l(q=>ct.searchMemories(i.projectId,q),"search"),findByTags:l(q=>ct.findByTags(i.projectId,q),"findByTags"),getStats:l(()=>ct.getMemoryStats(i.projectId),"getStats")},plan:{active:p,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(q=>We.recordGatheredInfo(i.projectId,q),"recordInfo"),setAnalysis:l(q=>We.setAnalysis(i.projectId,q),"setAnalysis"),propose:l(q=>We.proposePlan(i.projectId,q),"propose"),approve:l(q=>We.approvePlan(i.projectId,q),"approve"),reject:l(q=>We.rejectPlan(i.projectId,q),"reject"),getApprovalPrompt:l(()=>We.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>We.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>We.getNextStep(i.projectId),"getNextStep"),completeStep:l(q=>We.completeStep(i.projectId,q),"completeStep"),failStep:l(q=>We.failStep(i.projectId,q),"failStep"),abort:l(q=>We.abortPlan(i.projectId,q),"abort"),getStatus:l(()=>We.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>We.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Rn.recordAttempt(e,n,{success:!1,error:w(o)});if(i.shouldEscalate){let a=Rn.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:w(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}async executeTool(e,t,s){if(!nt.isAllowed(e,s))throw new Error(`Tool ${e} not allowed for this command`);let n=nt.get(e);if(!n)throw new Error(`Tool ${e} not found`);return await n(...t)}async executeSimple(e,t,s){try{let o=(await oa.load(e)).frontmatter["allowed-tools"]||[],i=await Wt.build(s);return{success:!0,result:await t({read:l(async u=>this.executeTool("Read",[u],o),"read"),write:l(async(u,p)=>this.executeTool("Write",[u,p],o),"write"),bash:l(async u=>this.executeTool("Bash",[u],o),"bash")},i)}}catch(n){return{success:!1,error:w(n)}}}},Cb=new ol,ni=Cb});import Pb from"node:https";import Eb from"node:os";import al from"node:path";import Bt from"chalk";var cl,ri,ll=S(()=>{"use strict";W();K();cl=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=al.join(Eb.homedir(),".prjct-cli","config"),this.cacheFile=al.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=al.join(__dirname,"..","..","package.json");return(await xe(e))?.version??null}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},n=Pb.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await P(this.cacheFile))return await xe(this.cacheFile)}catch{}return null}async writeCache(e){try{await le(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),s=Date.now();if(t?.lastCheck&&s-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
950
|
-
`+Bt.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")+`
|
|
951
|
-
`+Bt.yellow("\u2502")+" "+Bt.bold("Update available!")+" "+Bt.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Bt.yellow("\u2502")+`
|
|
952
|
-
`+Bt.yellow("\u2502")+" "+Bt.yellow("\u2502")+`
|
|
953
|
-
`+Bt.yellow("\u2502")+" Run: "+Bt.cyan("npm update -g prjct-cli")+" "+Bt.yellow("\u2502")+`
|
|
954
|
-
`+Bt.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")+`
|
|
955
|
-
`}},ri=cl});import hg from"node:path";async function Ab(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await P(hg.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await P(hg.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Db(){return{...xb}}function jb(){return{...Rb}}async function yg(){return oi||(oi=await Ab()?Db():jb(),oi)}var oi,xb,Rb,wg=S(()=>{"use strict";K();oi=null,xb={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},Rb={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(Ab,"isClaudeEnvironment");l(Db,"getClaudeAgent");l(jb,"getTerminalAgent");l(yg,"detect")});import ii from"node:fs/promises";var ul,kg,Sg=S(()=>{"use strict";W();K();ul=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let s={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${s[t]||s.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${w(t)}`)}return await ii.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(s){console.warn(`MCP writeFile failed, falling back to fs: ${w(s)}`)}await ii.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${w(t)}`)}return await ii.readdir(e)}async fileExists(e){return P(e)}async createDirectory(e){await ii.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
1058
|
+
`);return Wo(o,200)||null}getSchemaTypeForCommand(e){return{task:"subtaskBreakdown",bug:"classification"}[e]??null}},Lk=new Oc,Tp=Lk});import Nc from"node:fs/promises";import Fk from"node:os";import Lc from"node:path";function Ep(){let r=process.env.PRJCT_CLI_HOME?.trim()||Lc.join(Fk.homedir(),".prjct-cli");return Lc.join(r,".running")}async function Uk(r){try{let e=Ep(),t=Lc.dirname(e);await x(t)||await Nc.mkdir(t,{recursive:!0}),await Nc.writeFile(e,`/p:${r}`)}catch{}}async function Hk(){try{let r=Ep();await x(r)&&await Nc.unlink(r)}catch{}}var Fc,Gk,Vo,Uc=v(()=>{"use strict";Mm();H();Nm();J();_o();Vm();zr();Bm();to();jc();dp();vp();Is();l(Ep,"getRunningFilePath");l(Uk,"signalStart");l(Hk,"signalEnd");Fc=class{static{l(this,"CommandExecutor")}async signalStart(e){await Uk(e)}async signalEnd(){await Hk()}requiresOrchestration(e){return Im.includes(e)?!0:!$m.includes(e)}async execute(e,t,s){await this.signalStart(e);let n=t.task||t.description||"";if(Tn.shouldEscalate(e,n)){let o=Tn.getEscalationInfo(e,n);return await this.signalEnd(),{success:!1,error:o?.message,escalation:o,isLoopDetected:!0,suggestion:o?.suggestion}}try{let o=await du.load(e),i=await xs.build(s,t),a=Fe.requiresPlanning(e),c=Fe.isDestructive(e),u=Fe.isInPlanningMode(i.projectId),d=null;a&&!u&&!t.skipPlanning?d=Fe.startPlanning(i.projectId,e,t):u&&(d=Fe.getActivePlan(i.projectId));let p=t.task||t.description||"",m=null;if(this.requiresOrchestration(e)&&p)try{if(m=await Go.execute(e,p,s),m.detectedDomains.length>0&&Om.orchestrate(m.detectedDomains),m.requiresFragmentation&&m.subtasks){let O=m.subtasks.map(ge=>({id:ge.id,domain:ge.domain,description:ge.description,status:ge.status}));Wm(O)}}catch(O){console.warn(`\u26A0\uFE0F Orchestrator warning: ${y(O)}`)}let g={...i,agenticDelegation:!0,agenticMode:!0},h=await xs.loadState(i),S=await Ws("prjct"),w=null,E=null;i.projectId&&(w={commit_footer:await Ze.getSmartDecision(i.projectId,"commit_footer"),branch_naming:await Ze.getSmartDecision(i.projectId,"branch_naming"),test_before_ship:await Ze.getSmartDecision(i.projectId,"test_before_ship"),preferred_agent:await Ze.getSmartDecision(i.projectId,`preferred_agent_${e}`)},S||(E=await Ze.getRelevantMemories(i.projectId,{commandName:e,params:t},5)));let D={isPlanning:a||u,requiresApproval:c&&!t.approved,active:d,allowedTools:Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[])},k=(await(lt(),ot(Ct)).getActiveProvider()).name==="claude",$=await Tp.build(o,g,h,null,w,null,E,D,m,{skipNativeContext:k,mcpActive:S});return console.log("\u{1F916} Template-first execution: Claude reads templates and decides"),Tn.recordSuccess(e,n),await this.signalEnd(),{success:!0,template:o,context:g,state:h,prompt:$,agenticDelegation:!0,agenticMode:!0,learnedPatterns:w,relevantMemories:E,orchestratorContext:m,memory:{create:l(O=>Ze.createMemory(i.projectId,O),"create"),autoRemember:l((O,ge,rt)=>Ze.autoRemember(i.projectId,O,ge,rt),"autoRemember"),search:l(O=>Ze.searchMemories(i.projectId,O),"search"),findByTags:l(O=>Ze.findByTags(i.projectId,O),"findByTags"),getStats:l(()=>Ze.getMemoryStats(i.projectId),"getStats")},plan:{active:d,isPlanning:a||u,isDestructive:c,requiresApproval:c&&!t.approved,recordInfo:l(O=>Fe.recordGatheredInfo(i.projectId,O),"recordInfo"),setAnalysis:l(O=>Fe.setAnalysis(i.projectId,O),"setAnalysis"),propose:l(O=>Fe.proposePlan(i.projectId,O),"propose"),approve:l(O=>Fe.approvePlan(i.projectId,O),"approve"),reject:l(O=>Fe.rejectPlan(i.projectId,O),"reject"),getApprovalPrompt:l(()=>Fe.generateApprovalPrompt(e,{changedFiles:[],filesToDelete:[],operation:e==="ship"?"git_push":e==="cleanup"?"delete_files":"run_command",warnings:[]}),"getApprovalPrompt"),startExecution:l(()=>Fe.startExecution(i.projectId),"startExecution"),getNextStep:l(()=>Fe.getNextStep(i.projectId),"getNextStep"),completeStep:l(O=>Fe.completeStep(i.projectId,O),"completeStep"),failStep:l(O=>Fe.failStep(i.projectId,O),"failStep"),abort:l(O=>Fe.abortPlan(i.projectId,O),"abort"),getStatus:l(()=>Fe.formatStatus(i.projectId),"getStatus"),getAllowedTools:l(()=>Fe.getAllowedTools(u,o.frontmatter["allowed-tools"]||[]),"getAllowedTools")}}}catch(o){await this.signalEnd();let i=Tn.recordAttempt(e,n,{success:!1,error:y(o)});if(i.shouldEscalate){let a=Tn.getEscalationInfo(e,n);return{success:!1,error:a?.message,escalation:a,isLoopDetected:!0,suggestion:a?.suggestion}}return{success:!1,error:y(o),attemptNumber:i.attemptNumber,isLooping:i.isLooping}}}},Gk=new Fc,Vo=Gk});import Wk from"node:https";import Vk from"node:os";import Hc from"node:path";import Ft from"chalk";var Gc,Bo,Wc=v(()=>{"use strict";H();J();Gc=class{static{l(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=Hc.join(Vk.homedir(),".prjct-cli","config"),this.cacheFile=Hc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Hc.join(__dirname,"..","..","package.json");return(await Ee(e))?.version??null}catch(e){return console.error("Error reading package version:",y(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},n=Wk.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});n.on("error",o=>{t(o)}),n.setTimeout(5e3,()=>{n.destroy(),t(new Error("Request timeout"))}),n.end()})}compareVersions(e,t){let s=e.split(".").map(Number),n=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=n[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await x(this.cacheFile))return await Ee(this.cacheFile)}catch{}return null}async writeCache(e){try{await ce(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),s=Date.now();if(t?.lastCheck&&s-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let n=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:n}),{updateAvailable:this.compareVersions(n,e)>0,currentVersion:e,latestVersion:n}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:`
|
|
1059
|
+
`+Ft.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")+`
|
|
1060
|
+
`+Ft.yellow("\u2502")+" "+Ft.bold("Update available!")+" "+Ft.dim(`${e.currentVersion} \u2192 ${e.latestVersion}`)+" "+Ft.yellow("\u2502")+`
|
|
1061
|
+
`+Ft.yellow("\u2502")+" "+Ft.yellow("\u2502")+`
|
|
1062
|
+
`+Ft.yellow("\u2502")+" Run: "+Ft.cyan("npm update -g prjct-cli")+" "+Ft.yellow("\u2502")+`
|
|
1063
|
+
`+Ft.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")+`
|
|
1064
|
+
`}},Bo=Gc});import Pp from"node:path";async function zk(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await x(Pp.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await x(Pp.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function qk(){return{...Bk}}function Kk(){return{...Jk}}async function Cp(){return Jo||(Jo=await zk()?qk():Kk(),Jo)}var Jo,Bk,Jk,xp=v(()=>{"use strict";J();Jo=null,Bk={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},Jk={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};l(zk,"isClaudeEnvironment");l(qk,"getClaudeAgent");l(Kk,"getTerminalAgent");l(Cp,"detect")});import zo from"node:fs/promises";var Vc,Rp,Ap=v(()=>{"use strict";H();J();Vc=class{static{l(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let s={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${s[t]||s.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${y(t)}`)}return await zo.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(s){console.warn(`MCP writeFile failed, falling back to fs: ${y(s)}`)}await zo.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${y(t)}`)}return await zo.readdir(e)}async fileExists(e){return x(e)}async createDirectory(e){await zo.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
956
1065
|
${e.map((t,s)=>`${s+1}. ${t}`).join(`
|
|
957
1066
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
958
1067
|
|
|
@@ -997,10 +1106,10 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
997
1106
|
|
|
998
1107
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
999
1108
|
|
|
1000
|
-
Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},
|
|
1001
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=
|
|
1002
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),
|
|
1003
|
-
`);
|
|
1109
|
+
Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},Rp=Vc});function Dp(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&Yk.has(e.code))return!0;if(e.code&&Ip.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 Qk(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&Ip.has(e.code))}function jp(r,e,t){let s=ys.get(r);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(ys.delete(r),!1):!0:!1}function Bc(r,e){let t=ys.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),ys.set(r,t)}function Zk(r){ys.delete(r)}var Yk,Ip,ys,qo,$p,$I,Mp=v(()=>{"use strict";Yk=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Ip=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);l(Dp,"isTransientError");l(Qk,"isPermanentError");ys=new Map;l(jp,"isCircuitOpen");l(Bc,"recordFailure");l(Zk,"recordSuccess");qo=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(jp(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,n=0;for(;n<this.options.maxAttempts;)try{let o=await e();return Zk(t),o}catch(o){if(s=o,n++,Qk(o))throw Bc(t,this.options.circuitBreakerThreshold),o;if(!(Dp(o)&&n<this.options.maxAttempts))throw Bc(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(n-1),this.options.maxDelayMs);await new Promise(c=>setTimeout(c,a))}throw Bc(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return Dp(e)}isCircuitOpen(e){return jp(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return ys.get(e)}resetCircuit(e){ys.delete(e)}resetAllCircuits(){ys.clear()}},$p=new qo({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),$I=new qo({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var eS,Jc,Ko,_p=v(()=>{"use strict";Jt();xp();Ap();Mp();eS=["claude"],Jc=class{static{l(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await $p.execute(async()=>{if(this.agentInfo=await Cp(),!this.agentInfo?.isSupported)throw er.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!eS.includes(e))throw er.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Rp,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Ko=new Jc});var zc,Rn,qc=v(()=>{"use strict";zc=class{static{l(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Rn=new zc});var Kc,Qe,Xc=v(()=>{"use strict";ee();Kc=class{static{l(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();I.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
1110
|
+
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let n=I.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!n)throw new Error(`Failed to create workflow: ${t.name}`);return n.id}getWorkflow(e,t){let s=I.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return s?this.rowToWorkflow(s):null}getAllWorkflows(e,t=!1){let s=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return I.query(e,s).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,s){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],a=[];return s.description!==void 0&&(i.push("description = ?"),a.push(s.description)),s.enabled!==void 0&&(i.push("enabled = ?"),a.push(s.enabled?1:0)),s.metadata!==void 0&&(i.push("metadata = ?"),a.push(JSON.stringify(s.metadata))),i.length===0?!1:(i.push("updated_at = ?"),a.push(o),a.push(t),I.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...a),!0)}deleteWorkflow(e,t){let s=this.getWorkflow(e,t);if(!s)return!1;if(s.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return I.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],s=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||s.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},Qe=new Kc});function Yc(r){return{id:r.id,type:r.type,command:r.command,position:r.position,action:r.action,description:r.description,enabled:r.enabled===1,timeoutMs:r.timeout_ms,createdAt:r.created_at,sortOrder:r.sort_order}}var Qc,Ce,Xo=v(()=>{"use strict";Xc();ee();l(Yc,"rowToRule");Qc=class{static{l(this,"WorkflowRuleStorage")}addRule(e,t){let s=P.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),n=t.sortOrder||(s?.m??-1)+1;return P.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order)
|
|
1111
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,n),P.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return P.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(P.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!P.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:l(c=>c?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"}},i=[],a=[];for(let[c,u]of Object.entries(s)){let d=o[c];if(!d)continue;i.push(`${d.column} = ?`);let p=u;a.push(d.transform?d.transform(p):p)}return i.length===0||(a.push(t),P.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=P.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?Yc(s):null}getRulesForCommand(e,t){let s=Qe.getWorkflow(e,t);return!s||!s.enabled?[]:P.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(Yc)}getAllRules(e){return P.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(Yc)}resetRules(e){let t=P.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return P.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Ce=new Qc});import st from"node:path";async function tS(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 x(st.join(r,"pnpm-lock.yaml"))?"pnpm":await x(st.join(r,"yarn.lock"))?"yarn":await x(st.join(r,"bun.lockb"))||await x(st.join(r,"bun.lock"))?"bun":(await x(st.join(r,"package-lock.json")),"npm")}function Op(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function sS(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function An(r,e){for(let n of nS)if(await x(st.join(r,n)))return n;let s=(e??await cs(r)).find(n=>n.endsWith(rS));if(s)return s}async function ns(r){for(let e of oS)if(await x(st.join(r,e)))return e}async function Yo(r){let e=st.join(r,"package.json"),t=await Ee(e,null);if(t){let a=await tS(r,t),c=t.scripts||{},u={stack:"js",packageManager:a};return c.lint&&(u.lint={tool:a,command:Op(a,"lint")}),c.typecheck&&(u.typecheck={tool:a,command:Op(a,"typecheck")}),c.test&&(u.test={tool:a,command:sS(a)}),u.versionFile=await An(r),u.changelogFile=await ns(r),u}if(await x(st.join(r,"pytest.ini"))){let a=await An(r),c=await ns(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}let s=await Ae(st.join(r,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await An(r),c=await ns(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:c}}if(await x(st.join(r,"Cargo.toml"))){let a=await ns(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await x(st.join(r,"go.mod"))){let a=await An(r),c=await ns(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:c}}let n=await cs(r);if(n.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await An(r,n),c=await ns(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:c}}if(await x(st.join(r,"pom.xml"))){let a=await ns(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await x(st.join(r,"gradlew"))&&(await x(st.join(r,"build.gradle"))||await x(st.join(r,"build.gradle.kts")))){let a=await ns(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await An(r),i=await ns(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var nS,rS,oS,Zc=v(()=>{"use strict";J();l(tS,"detectPackageManager");l(Op,"pmRun");l(sS,"pmTest");nS=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],rS=".csproj",oS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];l(An,"detectVersionFile");l(ns,"detectChangelogFile");l(Yo,"detectProjectCommands")});import*as ae from"@clack/prompts";import Vs from"chalk";var Qo,Np,Er,Lp=v(()=>{"use strict";J();tt();Qo=[{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."}],Np=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}],Er=class{static{l(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){ae.intro(Vs.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:l(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:l(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:l(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:l(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:l(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return ae.outro(Vs.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){f.spin("Auto-detecting project configuration..."),this.detectedType=await this.detectProjectType(),this.confirmedType=this.detectedType;let e=await this.detectInstalledAgents();return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await this.detectStack(),this.confirmedStack=this.detectedStack,f.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=Qo.findIndex(s=>s.value===this.detectedType),t=await ae.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Qo.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?Qo[e].value:void 0});return ae.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ae.multiselect({message:"Which AI agents do you use?",options:Np.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ae.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await this.detectStack();let e=this.formatStackDisplay(this.detectedStack);ae.note(e,"Detected stack");let t=await ae.confirm({message:"Is this stack correct?",initialValue:!0});if(ae.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ae.group({language:l(()=>ae.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:l(()=>ae.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:s.language||this.detectedStack.language,framework:s.framework||void 0}}return!0}async stepPreferences(){let e=await ae.group({verbosity:l(()=>ae.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:l(()=>ae.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:l(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Vs.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Vs.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${Vs.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Vs.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Vs.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1112
|
+
`);ae.note(e,"Configuration Summary");let t=await ae.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ae.isCancel(t)||!t?(ae.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let n=t.join(this.projectPath,"package.json"),o=await e.readFile(n,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:path"),t=await import("node:os"),s=[];await as(e.join(t.homedir(),".claude"))&&s.push("claude"),await x(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await x(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await x(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await as(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:n}=await Promise.resolve().then(()=>(Ue(),Hl));await n("which codex"),s.push("codex")}catch{await as(e.join(t.homedir(),".codex"))&&s.push("codex")}return s.length>0?s:["claude"]}async detectStack(){let e=await import("node:fs/promises"),t=await import("node:path"),s={language:"Unknown",technologies:[]};try{let n=await e.readdir(this.projectPath);if(n.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),c={...a.dependencies,...a.devDependencies};s.language=c.typescript?"TypeScript":"JavaScript",c.next?s.framework="Next.js":c.nuxt?s.framework="Nuxt":c.react?s.framework="React":c.vue?s.framework="Vue":c["@angular/core"]?s.framework="Angular":c.express?s.framework="Express":c.hono?s.framework="Hono":c.fastify?s.framework="Fastify":(c.nestjs||c["@nestjs/core"])&&(s.framework="NestJS"),c.bun||c["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",n.includes("bun.lockb")?s.packageManager="Bun":n.includes("pnpm-lock.yaml")?s.packageManager="pnpm":n.includes("yarn.lock")?s.packageManager="Yarn":n.includes("package-lock.json")&&(s.packageManager="npm"),(c.prisma||c["@prisma/client"])&&s.technologies.push("Prisma"),(c.drizzle||c["drizzle-orm"])&&s.technologies.push("Drizzle"),c.tailwindcss&&s.technologies.push("Tailwind CSS"),c.zod&&s.technologies.push("Zod"),(c.trpc||c["@trpc/server"])&&s.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?s.language="Python":n.includes("go.mod")?s.language="Go":n.includes("Cargo.toml")?s.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,ae.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Qo.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Np.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});var Fp={};Bt(Fp,{PlanningCommands:()=>Js});import Zo from"node:fs/promises";import Bs from"node:path";async function iS(){if(!el){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(ti(),Up));el=new r}return el}var el,Js,ei=v(()=>{"use strict";Fr();Yt();De();fe();xt();ps();Wt();Xo();H();z();J();Us();kn();tt();Zc();Lp();Dt();el=null;l(iS,"getAnalysisCommands");Js=class extends Se{static{l(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let s={};if(typeof e=="string"||e===null?s={idea:e}:s=e,await this.initializeAgent(),await M.isConfigured(t))return f.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=s.yes||!o||process.env.CI==="true",a=null;if(i)o&&s.yes&&(a=await new Er(t).runNonInteractive());else if(a=await new Er(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};f.step(1,4,"Detecting author...");let c=await rn(),u={name:c.name||void 0,email:c.email||void 0,github:c.github||void 0},p=(await M.createConfig(t,u)).projectId;f.step(2,4,"Creating structure..."),await R.ensureProjectStructure(p);let m=R.getGlobalProjectPath(p);await this._seedShipWorkflow(p,t);let g={"core/now.md":`# NOW
|
|
1004
1113
|
|
|
1005
1114
|
No current task. Use \`/p:now\` to set focus.
|
|
1006
1115
|
`,"core/next.md":`# NEXT
|
|
@@ -1020,29 +1129,29 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
1020
1129
|
`,"planning/roadmap.md":`# ROADMAP
|
|
1021
1130
|
|
|
1022
1131
|
`,"planning/specs/.gitkeep":`# Specs directory - created by /p:spec
|
|
1023
|
-
`,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[
|
|
1132
|
+
`,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(g["config/wizard.json"]=JSON.stringify({projectType:a.projectType,agents:a.agents,stack:a.stack,preferences:a.preferences,createdAt:new Date().toISOString()},null,2));for(let[E,D]of Object.entries(g))await Zo.writeFile(Bs.join(m,E),D);let h=await this._detectEmptyDirectory(t),S=await this._detectExistingCode(t);if(S||!h){f.step(3,4,"Analyzing project...");let E=await iS();if((await E.analyze({},t)).success)return f.step(4,4,"Generating agents..."),await E.sync(t),f.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let w=s.idea;if(h&&!S){if(!w)return f.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};f.spin("architect mode...");let E=Bs.join(m,"planning","architect-session.md"),D=`# Architect Session
|
|
1024
1133
|
|
|
1025
1134
|
## Idea
|
|
1026
|
-
${
|
|
1135
|
+
${w}
|
|
1027
1136
|
|
|
1028
1137
|
## Status
|
|
1029
1138
|
Initialized - awaiting stack recommendation
|
|
1030
1139
|
|
|
1031
1140
|
Generated: ${new Date().toLocaleString()}
|
|
1032
|
-
`;return await
|
|
1033
|
-
`);let n=await this.getGlobalProjectPath(t),o=
|
|
1141
|
+
`;return await Zo.writeFile(E,D),await Pe.installGlobalConfig(),f.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:w,wizard:a}}return await Pe.installGlobalConfig(),f.done("initialized"),this._printNextSteps(a),{success:!0,projectId:p,wizard:a}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}_printNextSteps(e){if(console.log(""),console.log(" Quick start:"),console.log(" prjct sync Update context after changes"),console.log(" prjct task Start working on a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e){let t=e.agents.map(s=>{switch(s){case"claude":return"CLAUDE.md";case"cursor":return".cursorrules";case"windsurf":return".windsurfrules";case"copilot":return".github/copilot-instructions.md";case"gemini":return"GEMINI.md";case"codex":return"AGENTS.md";default:return null}}).filter(Boolean);t.length>0&&(console.log(` Generated: ${t.join(", ")}`),console.log(""))}console.log(" Docs: https://prjct.app/docs"),console.log("")}async feature(e,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return f.fail("description required"),{success:!1,error:"Description required"};let n=await M.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin(`planning ${e}...`);let o=this._breakdownFeatureTasks(e),i=pe();return await we.addTasks(n,o.map(a=>({description:a,priority:"medium",type:"feature",section:"active",featureId:i,originFeature:e}))),await this.logToMemory(t,"feature_planned",{feature:e,featureId:i,tasks:o.length,timestamp:b()}),f.done(`${o.length} tasks planned`),{success:!0,feature:e,featureId:i,tasks:o}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async bug(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("bug description required"),{success:!1,error:"Description required"};let o=await M.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};s.md||f.spin("tracking bug...");let i=this._detectBugSeverity(e),c={critical:"critical",high:"high",medium:"medium",low:"low"}[i]||"medium";return await we.addTask(o,{description:e,priority:c,type:"bug",section:"active"}),await this.logToMemory(t,"bug_reported",{bug:e,severity:i,priority:c,timestamp:b()}),s.md?console.log(L(X("Bug Reported",e),et({Severity:i,Priority:c}),ue([{label:"Fix now",command:`prjct task "fix: ${e}" --md`},{label:"View queue",command:"prjct next --md"}]))):(f.done(`bug [${i}] [${c}]`),bt("bug")),{success:!0,bug:e,severity:i}}catch(n){return s.md||f.fail(y(n)),{success:!1,error:y(n)}}}async architect(e="execute",t=process.cwd()){if(e!=="execute")return{success:!1,message:"\u274C Invalid action. Use: /p:architect execute"};try{let s=await this.ensureProjectInit(t);if(!s.success)return s;console.log(`\u{1F3D7}\uFE0F Architect Mode - Code Generation
|
|
1142
|
+
`);let n=await this.getGlobalProjectPath(t),o=Bs.join(n,"planning","architect-session.md"),i;try{i=await Ae(o)}catch{return{success:!1,message:`\u274C No architect plan found.
|
|
1034
1143
|
|
|
1035
1144
|
Create a plan first:
|
|
1036
1145
|
1. Run /p:init in an empty directory
|
|
1037
1146
|
2. Answer the discovery questions
|
|
1038
1147
|
3. Plan will be auto-generated
|
|
1039
1148
|
4. Then run /p:architect execute`}}if(!i||i.trim()==="")return{success:!1,message:"\u274C Architect plan is empty"};console.log(`\u{1F4CB} Reading architect plan...
|
|
1040
|
-
`);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),u=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),
|
|
1041
|
-
`)[0].trim():"Unknown project",
|
|
1149
|
+
`);let a=i.match(/## Project Idea\n(.+)/s),c=i.match(/\*\*Stack:\*\*\n([\s\S]+?)\n\n/),u=i.match(/\*\*Implementation Steps:\*\*\n([\s\S]+?)\n\n/),d=a?a[1].split(`
|
|
1150
|
+
`)[0].trim():"Unknown project",p=c?c[1]:"Not specified",m=u?u[1]:"Not specified";return console.log(`\u{1F4DD} Project: ${d}`),console.log(`
|
|
1042
1151
|
\u{1F527} Stack:
|
|
1043
|
-
${
|
|
1152
|
+
${p}`),console.log(`
|
|
1044
1153
|
\u{1F4CB} Implementation Steps:
|
|
1045
|
-
${
|
|
1154
|
+
${m}`),console.log(`
|
|
1046
1155
|
${"=".repeat(60)}`),console.log("\u{1F916} READY TO GENERATE CODE"),console.log("=".repeat(60)),console.log(`
|
|
1047
1156
|
The architect plan is ready. Claude will now:
|
|
1048
1157
|
1. Read the architectural plan
|
|
@@ -1051,7 +1160,7 @@ The architect plan is ready. Claude will now:
|
|
|
1051
1160
|
4. Create starter files with boilerplate
|
|
1052
1161
|
`),console.log(`
|
|
1053
1162
|
\u{1F4A1} This command shows the plan.`),console.log(" For code generation, Claude Code will read this plan"),console.log(` and generate the structure automatically.
|
|
1054
|
-
`),await this.logToMemory(t,"architect_executed",{timestamp:
|
|
1163
|
+
`),await this.logToMemory(t,"architect_executed",{timestamp:b(),idea:d}),{success:!0,plan:i,idea:d}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async idea(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;if(!e)return s.md||f.fail("idea description required"),{success:!1,error:"Idea description required"};let o=await M.getProjectId(t);if(!o)return s.md||f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e.split(/\s+/).length>20||e.includes("with")||e.includes("that")){s.md||f.spin("analyzing idea...");let c=R.getGlobalProjectPath(o),u=Bs.join(c,"planning","architect-session.md"),d=`# Architect Session
|
|
1055
1164
|
|
|
1056
1165
|
## Idea
|
|
1057
1166
|
${e}
|
|
@@ -1066,14 +1175,14 @@ Initialized - awaiting architecture design
|
|
|
1066
1175
|
4. Generate roadmap
|
|
1067
1176
|
|
|
1068
1177
|
Generated: ${new Date().toLocaleString()}
|
|
1069
|
-
`;return await
|
|
1178
|
+
`;return await Zo.writeFile(u,d),await this.logToMemory(t,"idea_architecture_started",{idea:e,timestamp:b()}),s.md?console.log(L(X("Idea Captured",e),et({Mode:"architecture"}),ue([{label:"Continue planning",command:"prjct architect execute"}]))):(f.done("architecture session created"),console.log(`
|
|
1070
1179
|
\u{1F4A1} Use /p:architect execute to continue planning
|
|
1071
|
-
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await
|
|
1180
|
+
`)),{success:!0,mode:"architecture",idea:e}}else return s.md||f.spin("capturing idea..."),await Le.addIdea(o,e),await this.logToMemory(t,"idea_captured",{idea:e,timestamp:b()}),s.md?console.log(L(X("Idea Captured",e),et({Mode:"capture"}),ue([{label:"Start working on it",command:`prjct task "${e}" --md`},{label:"View ideas",command:"prjct dash ideas"}]))):(f.done(`idea captured: ${e.slice(0,40)}`),bt("idea")),{success:!0,mode:"capture",idea:e}}catch(n){return s.md||f.fail(y(n)),{success:!1,error:y(n)}}}async spec(e=null,t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await M.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e){f.spin("loading specs...");let d=R.getGlobalProjectPath(n),p=Bs.join(d,"planning","specs");try{let h=(await(await import("node:fs/promises")).readdir(p)).filter(S=>S.endsWith(".md")&&S!==".gitkeep");return h.length===0?(f.warn("no specs yet"),console.log(`
|
|
1072
1181
|
\u{1F4A1} Create one with /p:spec "feature name"
|
|
1073
1182
|
`),{success:!0,specs:[]}):(console.log(`
|
|
1074
1183
|
\u{1F4CB} SPECIFICATIONS
|
|
1075
|
-
`),console.log("\u2550".repeat(50)),h.forEach((
|
|
1076
|
-
`),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=
|
|
1184
|
+
`),console.log("\u2550".repeat(50)),h.forEach((S,w)=>{let E=S.replace(".md","").replace(/-/g," ");console.log(` ${w+1}. ${E}`)}),console.log(`${"\u2550".repeat(50)}
|
|
1185
|
+
`),{success:!0,specs:h})}catch{return f.warn("no specs directory"),{success:!0,specs:[]}}}f.spin("creating spec...");let o=R.getGlobalProjectPath(n),i=Bs.join(o,"planning","specs");await We(i);let a=e.toLowerCase().replace(/\s+/g,"-"),c=Bs.join(i,`${a}.md`),u=`# Specification: ${e}
|
|
1077
1186
|
|
|
1078
1187
|
## Overview
|
|
1079
1188
|
[Brief description of the feature]
|
|
@@ -1103,64 +1212,45 @@ Generated: ${new Date().toLocaleString()}
|
|
|
1103
1212
|
---
|
|
1104
1213
|
Created: ${new Date().toLocaleString()}
|
|
1105
1214
|
Status: Draft
|
|
1106
|
-
`;return await
|
|
1215
|
+
`;return await Zo.writeFile(c,u),await this.logToMemory(t,"spec_created",{feature:e,timestamp:b()}),f.done(`spec created: ${a}.md`),console.log(`
|
|
1107
1216
|
\u{1F4DD} Edit: ~/.prjct-cli/projects/${n}/planning/specs/${a}.md`),console.log(`\u{1F4A1} When ready, use /p:feature to add tasks to queue
|
|
1108
|
-
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(
|
|
1109
|
-
`)
|
|
1110
|
-
`)}
|
|
1111
|
-
`),t.push(`
|
|
1112
|
-
`);let
|
|
1113
|
-
`),t.push(`## Stack Detected
|
|
1114
|
-
`),r.
|
|
1115
|
-
`)
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
`),t.push("- **Package Manager**: Go modules"),t.push(`- **Language**: Go
|
|
1119
|
-
`)),r.requirements&&(t.push(`### Python
|
|
1120
|
-
`),t.push("- **Package Manager**: pip"),t.push(`- **Language**: Python
|
|
1121
|
-
`));let n=r.directories;t.push(`## Structure
|
|
1122
|
-
`),t.push(`- **Total Files**: ${r.fileCount}`),t.push(`- **Directories**: ${n?.slice(0,15).join(", ")||"none"}${(n?.length||0)>15?` (+${(n?.length||0)-15} more)`:""}`),r.hasDockerfile&&t.push("- **Docker**: Detected"),r.hasDockerCompose&&t.push("- **Docker Compose**: Detected"),r.hasReadme&&t.push("- **Documentation**: README.md found"),t.push("");let o=r.gitStats;return t.push(`## Git Statistics
|
|
1123
|
-
`),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),r.gitLog&&(t.push(`## Recent Activity
|
|
1124
|
-
`),r.gitLog.split(`
|
|
1125
|
-
`).slice(0,5).forEach(a=>{if(a.trim()){let[c,,u,p]=a.split("|");t.push(`- \`${c}\` ${p} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1126
|
-
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
1127
|
-
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
1128
|
-
`)}var Ig=S(()=>{"use strict";os();uo();Js();En();vs();dt();l(bl,"showSyncResult");l(Rg,"getSessionActivity");l(Mn,"formatTokens");l(Tl,"formatDuration");l(Ag,"generateSparkline");l(Dg,"generateStatsMarkdown");l(jg,"generateAnalysisSummary")});var Eg={};Ot(Eg,{AnalysisCommands:()=>on});import vl from"node:fs/promises";import $g from"node:path";import*as rn from"@clack/prompts";var on,pi=S(()=>{"use strict";mr();Pu();os();uo();ca();ad();md();Ra();bc();kn();re();kr();Ya();W();Ks();En();vs();Ig();dt();on=class extends Ce{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1129
|
-
`),Je.init(t);let s=await Wt.build(t,e),n={packageJson:await Je.readPackageJson(),cargoToml:await Je.readCargoToml(),goMod:await Je.readGoMod(),requirements:await Je.readRequirements(),directories:await Je.listDirectories(),fileCount:await Je.countFiles(),gitStats:await Je.getGitStats(),gitLog:await Je.getGitLog(20),hasDockerfile:await Je.fileExists("Dockerfile"),hasDockerCompose:await Je.fileExists("docker-compose.yml"),hasReadme:await Je.fileExists("README.md"),hasTsconfig:await Je.fileExists("tsconfig.json"),hasViteConfig:await Je.fileExists("vite.config.ts")||await Je.fileExists("vite.config.js"),hasNextConfig:await Je.fileExists("next.config.js")||await Je.fileExists("next.config.mjs")},o=jg(n,t),i=await $.getProjectId(t),a=s.paths.analysis||A.getFilePath(i,"analysis","repo-summary.md");await nt.get("Write")(a,o),await this.logToMemory(t,"repository_analyzed",{timestamp:J.getTimestamp(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(at(),ot(vt)).getActiveProvider(),p=await De.installGlobalConfig();return p.success&&console.log(`\u{1F4DD} Updated ${A.getDisplayPath(p.path)}`),console.log(`\u2705 Analysis complete!
|
|
1130
|
-
`),console.log(`\u{1F4C4} Full report: ${A.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1131
|
-
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:n}}catch(s){return console.error("\u274C Error:",w(s)),{success:!1,error:w(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=A.getGlobalProjectPath(n),i=Date.now();if(t.package){let m=await A.detectMonorepo(e);if(!m.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let d=m.packages.find(h=>h.name===t.package||h.relativePath===t.package);if(!d){let h=m.packages.map(k=>k.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${h}`}}let g=await qs.sync(e,{packagePath:d.path,packageName:d.name});return t.json?console.log(JSON.stringify({success:g.success,package:d.name,path:d.relativePath})):t.md?console.log(L(ke(`Synced package: ${d.name}`))):f.done(`Synced package: ${d.name}`),{success:g.success}}let a=$g.join(o,"context","CLAUDE.md"),c=null;try{c=await vl.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let m=await qs.sync(e,{full:t.full});if(!m.success)return t.md?(console.log(L("## Sync Failed",`> ${m.error||"Unknown error"}`)),{success:!1,error:m.error}):u?(console.log(JSON.stringify({success:!1,error:m.error||"Sync failed"})),{success:!1,error:m.error}):(f.fail(m.error||"Sync failed"),{success:!1,error:m.error});let d;try{d=await vl.readFile(a,"utf-8")}catch{d=""}let g=ud(c,d);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(L(ke("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let h=l(async()=>{c!=null&&await vl.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await h();let y=[];for(let D of g.added)y.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)y.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)y.push(`Removed: ${D.name} (${D.lineCount} lines)`);let v=L("## Sync Preview",y.length>0?Q("Changes",Oe(y)):"No section changes.",lt({"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(v),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await h();let y={added:g.added.map(v=>({name:v.name,lineCount:v.lineCount})),modified:g.modified.map(v=>({name:v.name,lineCount:v.lineCount})),removed:g.removed.map(v=>({name:v.name,lineCount:v.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:y,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(dd(g)),t.preview)return await h(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let k=await rn.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(rn.isCancel(k)||k==="cancel")return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(k==="diff"){console.log(`
|
|
1132
|
-
${pd(g)}`);let y=await rn.confirm({message:"Apply these changes?",initialValue:!0});if(rn.isCancel(y)||!y)return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),bl(m,i)}t.md||f.spin("Syncing project...");let p=await qs.sync(e,{full:t.full});if(!p.success)return t.md?console.log(L("## Sync Failed",`> ${p.error||"Unknown error"}`)):f.fail(p.error||"Sync failed"),{success:!1,error:p.error};if(t.md||f.stop(),t.md){let m=Date.now()-i,d=p.generatedSkills?.generated?.length??0,g=null;try{let j=await Ke.diff(n);j?.hasChanges&&(g=aa(j))}catch{}let h=p.git.recentCommits[0]?.hash??null,y=h&&Lt.isCurrent(n,h)?null:"### Next: Run `prjct analysis-payload --md` to update project analysis",v=Uo("sync",!0),D=p.syncMetrics?.indexes,U={Duration:`${(m/1e3).toFixed(1)}s`,Skills:`${d} generated`,"Files indexed":p.stats.fileCount};if(D?.bm25Files){let j=D.bm25Files*(D.bm25AvgTokens||0);U["Tokens indexed"]=`${Math.round(j/1e3)}K`,U["Import edges"]=D.importEdges||0,U["Co-change commits"]=D.cochangeCommits||0}let F=L(ke("Sync Complete"),lt(U),g,p.git.hasChanges?Wp("Uncommitted changes detected"):null,y,ge(v.map(j=>({label:j.desc,command:j.cmd}))));return console.log(F),{success:!0,data:p,metrics:{elapsed:m,skillCount:d,fileCount:p.stats.fileCount}}}return bl(p,i)}catch(s){return t.md?console.log(L("## Sync Failed",`> ${w(s)}`)):f.fail(w(s)),{success:!1,error:w(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await qs.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Lt.isCurrent(n,i))return t.md?console.log(L(ke("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await id(n,e,o.git,o.stats);return t.md?console.log(L("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:w(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Lt.save(o,i),s.md?console.log(L(ke("LLM Analysis Saved"),lt({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:w(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Lt.getActive(n);if(!o)return t.md?console.log(L("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[ke(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(Q("Architecture Insights",Oe(o.architecture.insights))),o.patterns.length>0&&i.push(Q("Patterns",Oe(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(Q("Anti-Patterns",Oe(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(Q("Tech Debt",Oe(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(Q("Conventions",Oe(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:w(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Pn.getSummary(n),i=await Pn.getDailyStats(n,30),a=await Rg(n),c=await ct.getPatternsSummary(n);if(t.json){let d={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(d,null,2)),{success:!0,data:d}}let u="Unknown";try{u=C.getDoc(n,"project")?.name||"Unknown"}catch{}let p=await Pn.read(n),m=p.firstSync?new Date(p.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let d=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${d}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Mn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${lo(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Tl(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let d=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=d>0?(g.usageCount/d*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${h}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let d=Ag(i);if(console.log(` ${d} ${Mn(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${g} ${h}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let d=Dg(o,i,u,m,a,c);return console.log(d),{success:!0,data:{markdown:d}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",w(s)),{success:!1,error:w(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=yo(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await Ke.getStatus(n);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=$g.basename(e),p=i.isStale?"stale":"fresh",m=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",d=[];c.hasSealed&&d.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&d.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&d.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,lt({Staleness:p,"Last sync":m,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),d.length>0?Q("Analysis",Oe(d)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ke.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(L("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(L(aa(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Lu(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ke.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Ke.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(L(ke("Analysis Rolled Back"),lt({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(L("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Ke.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=w(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=C.getDoc(n,"project")?.repoPath||e}catch{}let i=await Ke.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let n=w(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});function Vn(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1133
|
-
`)}var Le,Qg,Zg,Hl=S(()=>{"use strict";Le={runDir:l(()=>`${process.env.HOME||bt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Le.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Le.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Le.runDir()}/daemon.log`,"log")},Qg=1800*1e3,Zg=1024*1024;l(Vn,"encodeMessage")});var sf={};Ot(sf,{executeViaDaemon:()=>gT,forceKillDaemon:()=>hT,getDaemonStatus:()=>mT,isDaemonRunning:()=>ef,sendRequest:()=>Fr,spawnDaemon:()=>tf,stopDaemon:()=>fT});import Ti from"node:crypto";import Qe from"node:fs";import{connect as pT}from"node:net";async function ef(){let r=Le.socket();if(!Qe.existsSync(r))return!1;try{return(await Fr({id:Ti.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Qe.unlinkSync(r)}catch{}return!1}}async function mT(){let r=Le.socket(),e=Le.pid();if(!Qe.existsSync(r))return{running:!1};try{let t=await Fr({id:Ti.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Qe.existsSync(e)?{running:!1,pid:parseInt(Qe.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Fr(r){return new Promise((e,t)=>{let s=Le.socket(),n=pT(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(Vn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
1134
|
-
`);if(u!==-1){let p=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(p);i=!0,clearTimeout(a),n.end(),e(m)}catch(m){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function gT(r,e,t,s,n,o=!0){let i=Le.socket();if(!Qe.existsSync(i))return o&&tf().catch(()=>{}),null;try{return await Fr({id:Ti.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function fT(){try{return(await Fr({id:Ti.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function hT(){let r=Le.pid(),e=Le.socket(),t=!1;if(Qe.existsSync(r)){let s=parseInt(Qe.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Qe.existsSync(r)&&Qe.unlinkSync(r)}catch{}try{Qe.existsSync(e)&&Qe.unlinkSync(e)}catch{}return t}async function tf(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Qe.existsSync(t))o=t,i="bun";else if(Qe.existsSync(s))o=s,i=zi()?"bun":"node";else if(Qe.existsSync(n))o=n,i=zi()?"bun":"node";else return!1;let a=Le.runDir();Qe.mkdirSync(a,{recursive:!0});let c=Le.log(),u=Qe.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Qe.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(d=>setTimeout(d,300)),await ef())return!0;return!1}var nf=S(()=>{"use strict";ar();Hl();l(ef,"isDaemonRunning");l(mT,"getDaemonStatus");l(Fr,"sendRequest");l(gT,"executeViaDaemon");l(fT,"stopDaemon");l(hT,"forceKillDaemon");l(tf,"spawnDaemon")});import Fe from"node:fs";import{createServer as lv}from"node:net";pi();Ra();import Hb from"node:path";re();var Cl=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){C.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
|
|
1135
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){C.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
|
|
1136
|
-
VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return C.query(e,"SELECT * FROM context_zone_events WHERE project_id = ? ORDER BY id DESC LIMIT ?",e,t).map(n=>({from:n.zone_from,to:n.zone_to,usagePercent:n.usage_percent,timestamp:n.timestamp,action:n.action}))}getSummary(e,t=7){let s=new Date(Date.now()-t*864e5).toISOString(),n=C.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
|
|
1217
|
+
`),{success:!0,feature:e,specPath:c}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async _seedShipWorkflow(e,t){let s=await Yo(t),n=0;Ce.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:n++,createdAt:new Date().toISOString()}),s.lint&&Ce.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:n++,createdAt:new Date().toISOString()}),s.test&&Ce.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:n++,createdAt:new Date().toISOString()})}}});var tl,zs,Hp=v(()=>{"use strict";Jt();Fr();De();fe();H();J();tt();tl=class{static{l(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await M.isConfigured(e))return{success:!0};f.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ei(),Fp)),n=await new t().init(null,e);return n.success?{success:!0}:n}async getProjectId(e){let t=await M.getProjectId(e);if(!t)throw Mr.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await R.ensureProjectStructure(t),R.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await rn();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await cs(e)).filter(n=>!n.startsWith(".")&&n!=="node_modules"&&n!=="package.json"&&n!=="package-lock.json"&&n!=="README.md").length===0}catch(t){return A(t)||console.error(`Directory check error: ${y(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await cs(e)).some(n=>t.includes(n))}catch(t){return A(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await M.isConfigured(e)}async needsMigration(e){return await M.needsMigration(e)}},zs=new tl});var Se,Dt=v(()=>{"use strict";Uc();Wc();_p();qc();Ls();Hp();Se=class{static{l(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;commandExecutor;constructor(){this.prjctDir=".prjct",this.updateChecker=new Bo,this.updateNotificationShown=!1,this.commandExecutor=Vo}get agent(){return Ko.getAgent()}get agentInfo(){return Ko.getInfo()}get currentAuthor(){return zs.getCurrentAuthor()}async initializeAgent(){return Ko.initialize()}async ensureProjectInit(e){return zs.ensureInit(e)}async ensureAuthor(){return zs.ensureAuthor()}async getGlobalProjectPath(e){return zs.getGlobalPath(e)}async logToMemory(e,t,s){let n=await this.ensureAuthor();return kt.log(e,t,s,n.name)}async _detectEmptyDirectory(e){return zs.isEmptyDirectory(e)}async _detectExistingCode(e){return zs.hasExistingCode(e)}_breakdownFeatureTasks(e){return Rn.breakdownFeature(e)}_detectBugSeverity(e){return Rn.detectBugSeverity(e)}}});var Up={};Bt(Up,{AnalysisCommands:()=>Ks});import si from"node:fs/promises";import Gp from"node:path";import*as qs from"@clack/prompts";var Ks,ti=v(()=>{"use strict";zr();to();au();Yt();De();fe();ao();Xi();Uu();Ju();ya();cc();pn();ee();ur();Oa();H();z();Us();kn();tt();jm();Dt();Ks=class extends Se{static{l(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1218
|
+
`),Ve.init(t);let s=await xs.build(t,e),n={packageJson:await Ve.readPackageJson(),cargoToml:await Ve.readCargoToml(),goMod:await Ve.readGoMod(),requirements:await Ve.readRequirements(),directories:await Ve.listDirectories(),fileCount:await Ve.countFiles(),gitStats:await Ve.getGitStats(),gitLog:await Ve.getGitLog(20),hasDockerfile:await Ve.fileExists("Dockerfile"),hasDockerCompose:await Ve.fileExists("docker-compose.yml"),hasReadme:await Ve.fileExists("README.md"),hasTsconfig:await Ve.fileExists("tsconfig.json"),hasViteConfig:await Ve.fileExists("vite.config.ts")||await Ve.fileExists("vite.config.js"),hasNextConfig:await Ve.fileExists("next.config.js")||await Ve.fileExists("next.config.mjs")},o=Dm(n,t),i=await M.getProjectId(t),a=s.paths.analysis||R.getFilePath(i,"analysis","repo-summary.md");await si.writeFile(a,o,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:b(),fileCount:n.fileCount,gitCommits:n.gitStats.totalCommits});let u=await(lt(),ot(Ct)).getActiveProvider(),d=await Pe.installGlobalConfig();return d.success&&console.log(`\u{1F4DD} Updated ${R.getDisplayPath(d.path)}`),console.log(`\u2705 Analysis complete!
|
|
1219
|
+
`),console.log(`\u{1F4C4} Full report: ${R.getDisplayPath(a)}`),console.log(`\u{1F4DD} Context: ~/.prjct-cli/projects/${i}/${u.contextFile}
|
|
1220
|
+
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:n}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=R.getGlobalProjectPath(n),i=Date.now();if(t.package){let p=await R.detectMonorepo(e);if(!p.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let m=p.packages.find(h=>h.name===t.package||h.relativePath===t.package);if(!m){let h=p.packages.map(S=>S.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${h}`}}let g=await Fs.sync(e,{packagePath:m.path,packageName:m.name});return t.json?console.log(JSON.stringify({success:g.success,package:m.name,path:m.relativePath})):t.md?console.log(L(he(`Synced package: ${m.name}`))):f.done(`Synced package: ${m.name}`),{success:g.success}}let a=Gp.join(o,"context","CLAUDE.md"),c=null;try{c=await si.readFile(a,"utf-8")}catch{}let u=!process.stdin.isTTY||t.json||t.md;if(c&&!t.yes&&!u){u||f.spin("Analyzing changes...");let p=await Fs.sync(e,{full:t.full});if(!p.success)return t.md?(console.log(L("## Sync Failed",`> ${p.error||"Unknown error"}`)),{success:!1,error:p.error}):u?(console.log(JSON.stringify({success:!1,error:p.error||"Sync failed"})),{success:!1,error:p.error}):(f.fail(p.error||"Sync failed"),{success:!1,error:p.error});let m;try{m=await si.readFile(a,"utf-8")}catch{m=""}let g=Wu(c,m);if(u||f.stop(),!g.hasChanges)return t.md?(console.log(L(he("No changes detected","Context is up to date."))),{success:!0,message:"No changes"}):u?(console.log(JSON.stringify({success:!0,action:"no_changes",message:"No changes detected (context is up to date)"})),{success:!0,message:"No changes"}):(f.done("No changes detected (context is up to date)"),{success:!0,message:"No changes"});let h=l(async()=>{c!=null&&await si.writeFile(a,c,"utf-8")},"restoreOriginal");if(t.md){await h();let w=[];for(let D of g.added)w.push(`Added: ${D.name} (${D.lineCount} lines)`);for(let D of g.modified)w.push(`Modified: ${D.name} (${D.lineCount} lines)`);for(let D of g.removed)w.push(`Removed: ${D.name} (${D.lineCount} lines)`);let E=L("## Sync Preview",w.length>0?X("Changes",Ie(w)):"No section changes.",et({"Tokens before":g.tokensBefore,"Tokens after":g.tokensAfter,"Token delta":g.tokenDelta>0?`+${g.tokenDelta}`:String(g.tokenDelta)}),"> Run `prjct sync --yes` to apply changes.");return console.log(E),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(u){await h();let w={added:g.added.map(E=>({name:E.name,lineCount:E.lineCount})),modified:g.modified.map(E=>({name:E.name,lineCount:E.lineCount})),removed:g.removed.map(E=>({name:E.name,lineCount:E.lineCount})),preserved:g.preserved,tokensBefore:g.tokensBefore,tokensAfter:g.tokensAfter,tokenDelta:g.tokenDelta};return console.log(JSON.stringify({success:!0,action:"confirm_required",message:"Changes detected. Confirmation required to apply.",diff:w,fullDiff:t.preview?{added:g.added,modified:g.modified,removed:g.removed}:void 0,hint:"Run `prjct sync --yes` to apply changes"})),{success:!0,isPreview:!0,diff:g,message:"Preview complete (awaiting confirmation)"}}if(console.log(Vu(g)),t.preview)return await h(),{success:!0,isPreview:!0,diff:g,message:"Preview complete (no changes applied)"};let S=await qs.select({message:"Apply these changes?",options:[{label:"Yes, apply changes",value:"apply"},{label:"No, cancel",value:"cancel"},{label:"Show full diff",value:"diff"}]});if(qs.isCancel(S)||S==="cancel")return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"};if(S==="diff"){console.log(`
|
|
1221
|
+
${Bu(g)}`);let w=await qs.confirm({message:"Apply these changes?",initialValue:!0});if(qs.isCancel(w)||!w)return await h(),f.warn("Sync cancelled \u2014 no changes applied"),{success:!1,message:"Cancelled by user"}}return f.done("Changes applied"),gc(p,i)}t.md||f.spin("Syncing project...");let d=await Fs.sync(e,{full:t.full});if(!d.success)return t.md?console.log(L("## Sync Failed",`> ${d.error||"Unknown error"}`)):f.fail(d.error||"Sync failed"),{success:!1,error:d.error};if(t.md||f.stop(),t.md){let p=Date.now()-i,m=d.generatedSkills?.generated?.length??0,g=null;try{let k=await Je.diff(n);k?.hasChanges&&(g=Ki(k))}catch{}let h=d.git.recentCommits[0]?.hash??null,S=h&&Mt.isCurrent(n,h),w=null;if(!S)try{let k=await pa(n,e,d.git,d.stats);w=["## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(k,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`"].join(`
|
|
1222
|
+
`)}catch{w="### Next: Run `prjct analysis-payload --md` to update project analysis"}let E=jo("sync",!0),D=d.syncMetrics?.indexes,V={Duration:`${(p/1e3).toFixed(1)}s`,Skills:`${m} generated`,"Files indexed":d.stats.fileCount};if(D?.bm25Files){let k=D.bm25Files*(D.bm25AvgTokens||0);V["Tokens indexed"]=`${Math.round(k/1e3)}K`,V["Import edges"]=D.importEdges||0,V["Co-change commits"]=D.cochangeCommits||0}let F=L(he("Sync Complete"),et(V),g,d.git.hasChanges?Tm("Uncommitted changes detected"):null,w,ue(E.map(k=>({label:k.desc,command:k.cmd}))));return console.log(F),{success:!0,data:d,metrics:{elapsed:p,skillCount:m,fileCount:d.stats.fileCount}}}return gc(d,i)}catch(s){return t.md?console.log(L("## Sync Failed",`> ${y(s)}`)):f.fail(y(s)),{success:!1,error:y(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Fs.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&Mt.isCurrent(n,i))return t.md?console.log(L(he("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await pa(n,e,o.git,o.stats);return t.md?console.log(L("## Analysis Payload","> Analyze this data and return a JSON object matching the schema below.","### Expected output schema","```json",JSON.stringify({version:1,commitHash:"string (from git data)",analyzedAt:"ISO timestamp",architecture:{style:"monolith|monorepo|microservices|modular-monolith",insights:["string"],domains:["string"]},patterns:[{name:"",description:"",locations:["file paths"],confidence:0,category:"architecture|data-flow|error-handling|testing"}],antiPatterns:[{issue:"",reasoning:"",files:[],suggestion:"",severity:"low|medium|high",confidence:0}],techDebt:[{description:"",area:"",effort:"small|medium|large",impact:"",priority:"low|medium|high"}],riskAreas:[{path:"",reason:"",risk:"",severity:"low|medium|high"}],refactorSuggestions:[{description:"",files:[],benefit:"",effort:"small|medium|large"}],projectInsights:["string"],conventions:[{category:"naming|file-structure|imports|error-handling",rule:"",example:""}],commands:{build:"",test:"",lint:"",dev:"",format:"",install:""},stack:{languages:["string"],frameworks:["string"],packageManager:"detected from project"}},null,2),"```","### Project data","```json",JSON.stringify(a,null,2),"```","> Save result: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:y(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);return!i.version||!i.architecture||!i.patterns?{success:!1,error:"Invalid LLM analysis format. Missing required fields."}:(Mt.save(o,i),s.md?console.log(L(he("LLM Analysis Saved"),et({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0})}catch(n){return{success:!1,error:y(n)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=Mt.getActive(n);if(!o)return t.md?console.log(L("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[he(`LLM Analysis (${o.architecture.style})`),""];o.architecture.insights.length>0&&i.push(X("Architecture Insights",Ie(o.architecture.insights))),o.patterns.length>0&&i.push(X("Patterns",Ie(o.patterns.map(a=>`**${a.name}** \u2014 ${a.description} (${a.category})`)))),o.antiPatterns.length>0&&i.push(X("Anti-Patterns",Ie(o.antiPatterns.map(a=>`[${a.severity}] ${a.issue} \u2014 ${a.suggestion}`)))),o.techDebt.length>0&&i.push(X("Tech Debt",Ie(o.techDebt.map(a=>`[${a.priority}/${a.effort}] ${a.description}`)))),o.conventions.length>0&&i.push(X("Conventions",Ie(o.conventions.map(a=>`**${a.category}**: ${a.rule}`)))),console.log(L(...i))}else console.log(JSON.stringify({success:!0,analysis:o}));return{success:!0,data:o}}catch(s){return{success:!1,error:y(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await wn.getSummary(n),i=await wn.getDailyStats(n,30),a=await xm(n),c=await Ze.getPatternsSummary(n);if(t.json){let m={session:a,patterns:c,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents,last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i};return console.log(JSON.stringify(m,null,2)),{success:!0,data:m}}let u="Unknown";try{u=P.getDoc(n,"project")?.name||"Unknown"}catch{}let d=await wn.read(n),p=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${p.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let m=a.agentsUsed.slice(0,3).map(g=>`${g.name} (${g.count}\xD7)`).join(", ");console.log(` Agents used: ${m}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${bn(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${io(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${fc(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let m=o.topAgents.reduce((g,h)=>g+h.usageCount,0);for(let g of o.topAgents){let h=m>0?(g.usageCount/m*100).toFixed(0):0;console.log(` ${g.agentName.padEnd(12)}: ${h}% (${g.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let m=Rm(i);if(console.log(` ${m} ${bn(o.last30DaysTokens)} tokens saved`),o.trend!==0){let g=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${g} ${h}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let m=Am(o,i,u,p,a,c);return console.log(m),{success:!0,data:{markdown:m}}}return{success:!0,data:{...o,session:a,patterns:c}}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async status(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=po(e),i=await o.check(n),a=await o.getSessionInfo(n),c=await Je.getStatus(n);if(t.json)return console.log(JSON.stringify({success:!0,...i,session:a,analysis:c})),{success:!0,data:{...i,session:a,analysis:c}};if(t.md){let u=Gp.basename(e),d=i.isStale?"stale":"fresh",p=i.daysSinceSync>0?`${i.daysSinceSync} day${i.daysSinceSync!==1?"s":""} ago`:"today",m=[];c.hasSealed&&m.push(`Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&m.push(`Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&m.push(`Previous: ${c.previousSealedCommit} (rollback available)`);let g=L(`## Status: ${u}`,et({Staleness:d,"Last sync":p,"Commits since sync":i.commitsSinceSync,Reason:i.reason}),m.length>0?X("Analysis",Ie(m)):null);return console.log(g),{success:!0,data:{...i,session:a,analysis:c}}}return console.log(""),console.log(o.formatStatus(i)),console.log(""),console.log(o.formatSessionInfo(a)),(c.hasSealed||c.hasDraft)&&(console.log(""),console.log("Analysis:"),c.hasSealed&&console.log(` Sealed: ${c.sealedCommit} (${c.sealedAt})`),c.hasDraft&&console.log(` Draft: ${c.draftCommit} (pending seal)`),c.hasPreviousSealed&&console.log(` Previous: ${c.previousSealedCommit} (rollback available)`)),console.log(""),{success:!0,data:{...i,session:a,analysis:c}}}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Je.diff(n);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(L("## Analysis Diff",`> ${i}`)):f.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(L(Ki(o))),{success:!0,data:o};if(!o.hasChanges)f.done("No changes between draft and sealed analysis");else{f.section("Analysis Diff"),console.log(Su(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),f.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## Diff Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Je.seal(n);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(f.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(f.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Je.rollback(n);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(L(he("Analysis Rolled Back"),et({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(L("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(f.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(f.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):t.md?console.log(L("## Rollback Failed",`> ${n}`)):f.fail(n),{success:!1,error:n}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return{success:!1,error:"No project ID found"};let o=await Je.verify(n);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?f.done(o.message):f.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let n=y(s);return f.fail(n),{success:!1,error:n}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):f.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=P.getDoc(n,"project")?.repoPath||e}catch{}let i=await Je.semanticVerify(n,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(f.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(f.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let c=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${c} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let n=y(s);return t.json?console.log(JSON.stringify({success:!1,error:n})):f.fail(n),{success:!1,error:n}}}}});function Fn(r){return Buffer.from(`${JSON.stringify(r)}
|
|
1223
|
+
`)}var Me,ng,rg,hl=v(()=>{"use strict";Me={runDir:l(()=>`${process.env.HOME||gt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Me.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Me.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Me.runDir()}/daemon.log`,"log")},ng=1800*1e3,rg=1024*1024;l(Fn,"encodeMessage")});var ag={};Bt(ag,{executeViaDaemon:()=>IS,forceKillDaemon:()=>MS,getDaemonStatus:()=>jS,isDaemonRunning:()=>og,sendRequest:()=>Cr,spawnDaemon:()=>ig,stopDaemon:()=>$S});import ui from"node:crypto";import qe from"node:fs";import{connect as DS}from"node:net";async function og(){let r=Me.socket();if(!qe.existsSync(r))return!1;try{return(await Cr({id:ui.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{qe.unlinkSync(r)}catch{}return!1}}async function jS(){let r=Me.socket(),e=Me.pid();if(!qe.existsSync(r))return{running:!1};try{let t=await Cr({id:ui.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return qe.existsSync(e)?{running:!1,pid:parseInt(qe.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function Cr(r){return new Promise((e,t)=>{let s=Me.socket(),n=DS(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(Fn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
|
|
1224
|
+
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function IS(r,e,t,s,n,o=!0){let i=Me.socket();if(!qe.existsSync(i))return o&&ig().catch(()=>{}),null;try{return await Cr({id:ui.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function $S(){try{return(await Cr({id:ui.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function MS(){let r=Me.pid(),e=Me.socket(),t=!1;if(qe.existsSync(r)){let s=parseInt(qe.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{qe.existsSync(r)&&qe.unlinkSync(r)}catch{}try{qe.existsSync(e)&&qe.unlinkSync(e)}catch{}return t}async function ig(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(qe.existsSync(t))o=t,i="bun";else if(qe.existsSync(s))o=s,i=Fi()?"bun":"node";else if(qe.existsSync(n))o=n,i=Fi()?"bun":"node";else return!1;let a=Me.runDir();qe.mkdirSync(a,{recursive:!0});let c=Me.log(),u=qe.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),qe.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await og())return!0;return!1}var cg=v(()=>{"use strict";or();hl();l(og,"isDaemonRunning");l(jS,"getDaemonStatus");l(Cr,"sendRequest");l(IS,"executeViaDaemon");l($S,"stopDaemon");l(MS,"forceKillDaemon");l(ig,"spawnDaemon")});import _e from"node:fs";import{createServer as Rb}from"node:net";ti();zr();De();ya();import aS from"node:fs/promises";import cS from"node:path";ee();var sl=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){P.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
|
|
1225
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`,e,s??null,t.from,t.to,t.usagePercent,t.action??null,t.timestamp)}recordCompaction(e,t,s,n){P.run(e,`INSERT INTO context_compactions (project_id, format, original_turns, files_count, timestamp)
|
|
1226
|
+
VALUES (?, ?, ?, ?, ?)`,e,t,s,n,new Date().toISOString())}getTransitions(e,t=20){return P.query(e,"SELECT * FROM context_zone_events WHERE project_id = ? ORDER BY id DESC LIMIT ?",e,t).map(n=>({from:n.zone_from,to:n.zone_to,usagePercent:n.usage_percent,timestamp:n.timestamp,action:n.action}))}getSummary(e,t=7){let s=new Date(Date.now()-t*864e5).toISOString(),n=P.query(e,`SELECT zone_to, COUNT(*) as cnt FROM context_zone_events
|
|
1137
1227
|
WHERE project_id = ? AND timestamp >= ?
|
|
1138
|
-
GROUP BY zone_to`,e,s),o={smart:0,warning:0,dumb:0},i=0;for(let u of n)o[u.zone_to]=u.cnt,i+=u.cnt;let c=
|
|
1139
|
-
WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},
|
|
1228
|
+
GROUP BY zone_to`,e,s),o={smart:0,warning:0,dumb:0},i=0;for(let u of n)o[u.zone_to]=u.cnt,i+=u.cnt;let c=P.query(e,`SELECT COUNT(*) as cnt FROM context_compactions
|
|
1229
|
+
WHERE project_id = ? AND timestamp >= ?`,e,s)[0]?.cnt??0;return i===0?{smartPercent:100,warningPercent:0,dumbPercent:0,compactions:c}:{smartPercent:Math.round(o.smart/i*100),warningPercent:Math.round(o.warning/i*100),dumbPercent:Math.round(o.dumb/i*100),compactions:c}}},Wp=new sl;ee();ps();Wt();Ns();wt();H();z();Us();tt();Dt();De();fe();H();z();var nl=class{static{l(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll","sessions"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,s,n){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} is not a function`);let i=l(async(a,c)=>a!=null?o.call(t,a,c.projectPath):o.call(t,c.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,n)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let s of this.categories.keys())t[s]=e.filter(n=>n.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),n=s.filter((a,c)=>s.indexOf(a)!==c);n.length>0&&e.push(`Duplicate command names: ${n.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(c=>!i.includes(c.group));a.length>0&&e.push(`Invalid categories: ${a.map(c=>`${c.name}:${c.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await M.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:R.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,s=process.cwd()){let n=this.metadata.get(e),o;if(n?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:b()};else try{o=await this.buildContext(s)}catch(c){return{success:!1,error:y(c)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let n=this.handlers.get(e);if(n){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return n.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};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()}},U=new nl;var Dn=class extends Se{static{l(this,"AnalyticsCommands")}async dash(e="default",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=cS.basename(t),a=await _.getCurrentTask(o),c=await we.getActiveTasks(o),u=await Xe.getRecent(o,5),d=await Le.getPending(o);if(e==="compact"){let p=a?`\u{1F3AF} ${a.description.slice(0,30)}`:"\u{1F4A4} idle",m=`\u{1F4CB} ${c.length}`,g=`\u{1F680} ${u.length}`;return f.done(`${p} | ${m} | ${g}`),{success:!0,view:"compact"}}if(e==="week"||e==="month"){let p=e==="week"?7:30,m=is(p),g=[];try{let w=m.toISOString();g=P.query(o,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","memory.%",w).map(D=>({...JSON.parse(D.data),timestamp:D.timestamp}))}catch{g=[]}let h={tasksCompleted:g.filter(w=>w.action==="task_completed").length,featuresShipped:g.filter(w=>w.action==="feature_shipped").length,totalActions:g.length};console.log(`
|
|
1140
1230
|
\u{1F4CA} ${e.toUpperCase()} PROGRESS - ${i}
|
|
1141
|
-
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${h.tasksCompleted}`),console.log(` Features shipped: ${h.featuresShipped}`),console.log(` Total actions: ${h.totalActions}`),console.log("\u2550".repeat(50));let
|
|
1142
|
-
Activity: ${
|
|
1143
|
-
`),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let
|
|
1231
|
+
`),console.log("\u2550".repeat(50)),console.log(` Tasks completed: ${h.tasksCompleted}`),console.log(` Features shipped: ${h.featuresShipped}`),console.log(` Total actions: ${h.totalActions}`),console.log("\u2550".repeat(50));let S=this._generateSparkline(g,p);return console.log(`
|
|
1232
|
+
Activity: ${S}
|
|
1233
|
+
`),{success:!0,view:e,metrics:h}}if(e==="roadmap"){let p=await xs.build(t),m=null;try{m=await aS.readFile(p.paths.roadmap,"utf-8")}catch{m=null}if(console.log(`
|
|
1144
1234
|
\u{1F5FA}\uFE0F ROADMAP - ${i}
|
|
1145
|
-
`),console.log("\u2550".repeat(50)),!
|
|
1146
|
-
`);else{let g=
|
|
1147
|
-
`)[0].trim();console.log(` ${
|
|
1148
|
-
`),{success:!0,view:"roadmap"}}if(s.md){let
|
|
1149
|
-
`+
|
|
1235
|
+
`),console.log("\u2550".repeat(50)),!m||m.trim()==="# ROADMAP")console.log(" No features planned yet."),console.log(` Use /p:feature to add features.
|
|
1236
|
+
`);else{let g=m.split("##").filter(h=>h.trim()&&!h.includes("ROADMAP"));g.slice(0,5).forEach((h,S)=>{let w=h.split(`
|
|
1237
|
+
`)[0].trim();console.log(` ${S+1}. ${w}`)}),g.length>5&&console.log(` ... and ${g.length-5} more`)}return console.log(`${"\u2550".repeat(50)}
|
|
1238
|
+
`),{success:!0,view:"roadmap"}}if(s.md){let p=a?`${a.description}${a.startedAt?` (started ${zt(new Date(a.startedAt))} ago)`:""}`:"No active task",m=c.length>0?c.slice(0,5).map(w=>{let E=w.priority?` [${w.priority}]`:"";return`${w.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${E}`}):["Queue is empty"],g=u.length>0?u.slice(0,5).map(w=>{let E=w.shippedAt?new Date(w.shippedAt).toLocaleDateString():"";return`${w.name}${E?` (${E})`:""}`}):["Nothing shipped yet"],h=null;try{let w=Wp.getSummary(o,7);(w.smartPercent<100||w.compactions>0)&&(h=`### Context Health (7d)
|
|
1239
|
+
`+kr(["Zone","%"],[["Smart",`${w.smartPercent}%`],["Warning",`${w.warningPercent}%`],["Dumb",`${w.dumbPercent}%`],["Compactions",`${w.compactions}`]]))}catch{}let S=L(`## Dashboard: ${i}`,X("Current Focus",p),X(`Queue (${c.length})`,Ie(m,!0)),X("Recent Ships",Ie(g)),X("Ideas",`${d.length} pending`),h,ue([{label:"Start task",command:'prjct task "..." --md'},{label:"Complete",command:"prjct done --md"},{label:"Ship",command:"prjct ship --md"}]));console.log(S)}else{console.log(`
|
|
1150
1240
|
\u{1F4CA} DASHBOARD - ${i}
|
|
1151
|
-
`),console.log("\u2550".repeat(50));let
|
|
1241
|
+
`),console.log("\u2550".repeat(50));let p=po(t),m=await p.check(o),g=p.getWarning(m);if(g&&console.log(`
|
|
1152
1242
|
${g}`),console.log(`
|
|
1153
|
-
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=
|
|
1154
|
-
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,
|
|
1155
|
-
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(h=>{let
|
|
1156
|
-
\u{1F4A1} IDEAS`),console.log(` ${
|
|
1243
|
+
\u{1F3AF} CURRENT FOCUS`),a){if(console.log(` ${a.description}`),a.startedAt){let h=zt(new Date(a.startedAt));console.log(` Started: ${h} ago`)}}else console.log(" No active task. Use /p:work to start.");console.log(`
|
|
1244
|
+
\u{1F4CB} QUEUE`),c.length===0?console.log(" Queue is empty"):(c.slice(0,3).forEach((h,S)=>{let w=h.priority?`[${h.priority}]`:"";console.log(` ${S+1}. ${h.description.slice(0,40)} ${w}`)}),c.length>3&&console.log(` ... and ${c.length-3} more`)),console.log(`
|
|
1245
|
+
\u{1F680} RECENT SHIPS`),u.length===0?console.log(" Nothing shipped yet"):u.slice(0,3).forEach(h=>{let S=h.shippedAt?new Date(h.shippedAt).toLocaleDateString():"";console.log(` \u2022 ${h.name} ${S?`(${S})`:""}`)}),console.log(`
|
|
1246
|
+
\u{1F4A1} IDEAS`),console.log(` ${d.length} pending ideas`),console.log(`
|
|
1157
1247
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} /p:work to start | /p:done to complete | /p:ship to ship
|
|
1158
|
-
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:
|
|
1248
|
+
`)}return await this.logToMemory(t,"dash_viewed",{view:e,timestamp:b()}),{success:!0,view:"default",stats:{currentTask:a?.description||null,queueCount:c.length,shippedCount:u.length,ideasCount:d.length}}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async help(e="",t=process.cwd()){try{if(!e){console.log(`
|
|
1159
1249
|
PRJCT COMMANDS
|
|
1160
|
-
`),console.log("=".repeat(50));let i=
|
|
1161
|
-
${
|
|
1250
|
+
`),console.log("=".repeat(50));let i=U.getAllCategories(),a=U.getAll(),c={};return a.forEach(u=>{u.deprecated||(c[u.group]||(c[u.group]=[]),c[u.group].push(u))}),Object.entries(c).forEach(([u,d])=>{let p=i.get(u);console.log(`
|
|
1251
|
+
${p?.title||u}:`),d.forEach(m=>{let g=m.params?` ${m.params}`:"";console.log(` ${m.name}${g}`),console.log(` ${m.description}`)})}),console.log(`
|
|
1162
1252
|
${"\u2550".repeat(50)}`),console.log(`\u{1F4A1} Use /p:help <command> for detailed help
|
|
1163
|
-
`),{success:!0,topic:"overview"}}let s=
|
|
1253
|
+
`),{success:!0,topic:"overview"}}let s=U.getByName(e);if(s){if(console.log(`
|
|
1164
1254
|
\u{1F4DA} HELP: /p:${s.name}
|
|
1165
1255
|
`),console.log("\u2550".repeat(50)),console.log(`Description: ${s.description}`),s.params&&console.log(`Parameters: ${s.params}`),s.usage&&(console.log(`
|
|
1166
1256
|
Usage:`),s.usage.claude&&console.log(` Claude: ${s.usage.claude}`),s.usage.terminal&&console.log(` Terminal: ${s.usage.terminal}`)),s.features){console.log(`
|
|
@@ -1170,9 +1260,9 @@ ${"\u2550".repeat(50)}
|
|
|
1170
1260
|
\u{1F4A1} Did you mean /p:${a.command}?`),console.log(` ${a.hint}
|
|
1171
1261
|
`),{success:!0,topic:e,suggestion:a.command};return console.log(`
|
|
1172
1262
|
\u2753 Unknown topic: ${e}`),console.log(` Use /p:help to see all commands
|
|
1173
|
-
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(
|
|
1174
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(
|
|
1175
|
-
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(
|
|
1263
|
+
`),{success:!1,error:`Unknown topic: ${e}`}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}_generateSparkline(e,t){let s=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"],n=new Date,o=[];for(let a=t-1;a>=0;a--){let c=new Date(n);c.setDate(c.getDate()-a);let u=new Date(c.setHours(0,0,0,0)),d=new Date(c.setHours(23,59,59,999)),p=e.filter(m=>{let g=new Date(m.timestamp);return g>=u&&g<=d}).length;o.push(p)}let i=Math.max(...o,1);return o.map(a=>s[Math.floor(a/i*(s.length-1))]).join("")}};jc();De();fe();wt();H();Us();import lS from"node:fs/promises";import uS from"node:path";var Xs=class{static{l(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let n=(e||"").trim().split(/\s+/),o=n[0]||"task",i=n.slice(1).join(" "),a=await M.readConfig(t);if(!a||!a.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}},null,2)),{success:!1,message:"No prjct project. Run `p. init` first."};let c=a.projectId,u=R.getGlobalProjectPath(c),d=await _.read(c),p=d?.currentTask?{id:d.currentTask.id,description:d.currentTask.description,startedAt:d.currentTask.startedAt,subtasks:d.currentTask.subtasks?.map(S=>({id:S.id,description:S.description,status:S.status,domain:S.domain})),currentSubtaskIndex:d.currentTask.currentSubtaskIndex}:null,m=null;if(i)try{m=await Go.execute(o,i,t)}catch(S){console.error(`Warning: Orchestrator failed: ${y(S)}`)}let g=await this.loadRepoAnalysis(u),h={projectId:c,globalPath:u,currentTask:p,domains:m?.detectedDomains||[],primaryDomain:m?.primaryDomain||null,subtasks:m?.subtasks?.map(S=>({id:S.id,description:S.description,domain:S.domain,agent:S.agent,status:S.status,order:S.order}))||null,repoAnalysis:{ecosystem:g?.ecosystem||"unknown",frameworks:g?.frameworks||[],hasTests:g?.hasTests||!1,technologies:g?.technologies||[]}};return s.md?console.log(this.formatContextMd(h)):console.log(JSON.stringify(h,null,2)),{success:!0,message:""}}catch(n){return{success:!1,message:`Context error: ${y(n)}`}}}formatContextMd(e){let t=[];if(t.push(X("Project",dc(lc("ID",e.projectId),lc("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push(Sr({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let n=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(n.join(`
|
|
1264
|
+
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(X("Stack",et({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),L(...t)}async loadRepoAnalysis(e){try{let t=uS.join(e,"analysis","repo-analysis.json"),s=await lS.readFile(t,"utf-8"),n=JSON.parse(s);return{ecosystem:n.ecosystem||"unknown",frameworks:n.frameworks||[],hasTests:n.hasTests??!1,technologies:n.technologies||[]}}catch(t){return A(t),null}}},GM=new Xs;Lo();Dt();De();fe();Ls();ee();ps();Wt();H();z();tt();import rl from"node:fs";import Vp from"node:path";async function ni(r){let e=await M.getProjectId(r),t={rotated:[],totalSize:0,freedSpace:0};if(!e)return{success:!0,results:t};let n=I.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(n>500){let o=n-500;I.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",o),t.rotated.push("memory-events"),t.freedSpace=o}return{success:!0,results:t}}l(ni,"cleanupMemory");async function ri(r){let e=await M.getProjectId(r);if(!e)return;let s=I.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s>500){let n=s-500;I.run(e,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",n)}}l(ri,"cleanupMemoryInternal");async function ol(r={},e=process.cwd()){try{if(r.memory===!0||r.type==="memory"){f.spin("cleaning memory...");let a=await ni(e);return f.done("memory cleaned"),a}f.spin("cleaning up...");let s=await M.getProjectId(e);if(!s)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let n=[],i=I.get(s,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(i>100){let a=i-100;I.run(s,"DELETE FROM events WHERE id IN (SELECT id FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?)",a),n.push(`Memory: ${a} old entries removed`)}else n.push("Memory: No cleanup needed");try{let a=await Le.cleanup(s);a.removed>0?n.push(`Ideas: ${a.removed} old archived ideas removed`):n.push("Ideas: No cleanup needed")}catch(a){n.push(`Ideas: Error - ${y(a)}`)}try{let c=(await we.getActiveTasks(s)).filter(u=>u.completed).length;c>0?n.push(`Queue: ${c} completed tasks found (not removed - use /p:done to clear)`):n.push("Queue: No completed tasks")}catch(a){n.push(`Queue: Error - ${y(a)}`)}return await ri(e),await kt.log(e,"cleanup_performed",{items:n.length,timestamp:b()}),f.done(`${n.length} items cleaned`),{success:!0,cleaned:n}}catch(t){return f.fail(y(t)),{success:!1,error:y(t)}}}l(ol,"cleanup");var dS=[/^qa-/,/^nonexistent-/,/^test-/];async function Bp(r){let e=R.getGlobalBasePath(),t=Vp.join(e,"projects");if(!rl.existsSync(t))return{success:!0,message:"No projects directory found"};let s=rl.readdirSync(t,{withFileTypes:!0}),n=[],o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name,c=Vp.join(t,a);if(!dS.some(d=>d.test(a))){o.push(a);continue}if(r.dryRun){n.push(a);continue}try{I.close(a),rl.rmSync(c,{recursive:!0,force:!0}),n.push(a)}catch{o.push(a)}}if(r.md){let i=[`## ${r.dryRun?"Dry Run: ":""}Project Cleanup`,"","| Metric | Value |","|---|---|",`| Removed | ${n.length} |`,`| Kept | ${o.length} |`];return n.length>0&&i.push("","### Removed",...n.map(a=>`- \`${a}\``)),{success:!0,message:i.join(`
|
|
1265
|
+
`)}}return{success:!0,message:`Cleaned ${n.length} stale project(s), kept ${o.length}`,removed:n,kept:o.length}}l(Bp,"cleanupProjects");De();fe();Ls();H();z();J();tt();import Jp from"node:path";async function il(r=null,e={},t=process.cwd()){try{let s=e.type||"architecture";if(!["architecture","api","component","database","flow"].includes(s))return f.fail(`invalid type: ${s}`),{success:!1,error:"Invalid design type"};let o=r||"system";f.spin(`designing ${s}...`);let i=await M.getProjectId(t),a=Jp.join(R.getGlobalProjectPath(i),"planning","designs");await We(a);let c="";switch(s){case"architecture":c=`# Architecture Design: ${o}
|
|
1176
1266
|
|
|
1177
1267
|
*Use templates/design/architecture.md for full design*
|
|
1178
1268
|
`;break;case"api":c=`# API Design: ${o}
|
|
@@ -1187,14 +1277,14 @@ ${"\u2550".repeat(50)}
|
|
|
1187
1277
|
`;break;case"flow":c=`# Flow Design: ${o}
|
|
1188
1278
|
|
|
1189
1279
|
*Use templates/design/flow.md for full design*
|
|
1190
|
-
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,
|
|
1191
|
-
`),c=(i[i.length-2]||"").match(/(\d+) files? changed(?:, (\d+) insertions?)?(?:, (\d+) deletions?)?/);c&&(t.filesChanged=parseInt(c[1],10)||0,t.linesAdded=parseInt(c[2],10)||0,t.linesRemoved=parseInt(c[3],10)||0)}catch(s){
|
|
1192
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),
|
|
1280
|
+
`;break}let u=`${s}-${o.toLowerCase().replace(/\s+/g,"-")}.md`,d=Jp.join(a,u);return await yt(d,c),await kt.log(t,"design_created",{type:s,target:o,timestamp:b()}),f.done(`${s} design created`),{success:!0,designPath:d,type:s,target:o}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}l(il,"design");De();fe();Ls();import jn from"node:path";Jt();ee();var Ge={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"};_s();Kt();var al=class{static{l(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=Sd.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let s=this.onceListeners.get(e);s&&s.delete(t)}}off(e,t){let s=this.listeners.get(e);s&&s.delete(t)}async emit(e,t={}){let s=new Date().toISOString(),n={type:e,timestamp:s,projectId:this.projectId,...t};this.history.push(n),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(n);let o=this.getMatchingListeners(e);(await Promise.allSettled(o.map(u=>this.executeCallback(u,n)))).forEach(u=>{u.status==="rejected"&&G.error(`Event listener error for ${e}:`,u.reason)});let a=this.onceListeners.get(e);if(a){for(let u of a)await this.executeCallback(u,n);this.onceListeners.delete(e)}let c=this.onceListeners.get(Ge.ALL);if(c)for(let u of c)await this.executeCallback(u,n)}getMatchingListeners(e){let t=[],s=this.listeners.get(e);s&&t.push(...s);let n=this.listeners.get(Ge.ALL);n&&t.push(...n);let o=e.split(".")[0],i=this.listeners.get(`${o}.*`);return i&&t.push(...i),t}async executeCallback(e,t){try{let s=e(t);s instanceof Promise&&await s}catch(s){throw G.error("Event callback error:",s),s}}async logEvent(e){try{P.appendEvent(this.projectId,e.type,e)}catch(t){G.debug("Failed to log event:",oe(t))}}getHistory(e=10,t=null){let s=this.history;return t&&(s=s.filter(n=>n.type===t||n.type.startsWith(t))),s.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},nt=new al,Pr={sessionStarted:l(r=>nt.emit(Ge.SESSION_STARTED,r),"sessionStarted"),sessionPaused:l(r=>nt.emit(Ge.SESSION_PAUSED,r),"sessionPaused"),sessionResumed:l(r=>nt.emit(Ge.SESSION_RESUMED,r),"sessionResumed"),sessionCompleted:l(r=>nt.emit(Ge.SESSION_COMPLETED,r),"sessionCompleted"),taskCreated:l(r=>nt.emit(Ge.TASK_CREATED,r),"taskCreated"),taskCompleted:l(r=>nt.emit(Ge.TASK_COMPLETED,r),"taskCompleted"),featureAdded:l(r=>nt.emit(Ge.FEATURE_ADDED,r),"featureAdded"),featureShipped:l(r=>nt.emit(Ge.FEATURE_SHIPPED,r),"featureShipped"),ideaCaptured:l(r=>nt.emit(Ge.IDEA_CAPTURED,r),"ideaCaptured"),snapshotCreated:l(r=>nt.emit(Ge.SNAPSHOT_CREATED,r),"snapshotCreated"),snapshotRestored:l(r=>nt.emit(Ge.SNAPSHOT_RESTORED,r),"snapshotRestored"),commitCreated:l(r=>nt.emit(Ge.COMMIT_CREATED,r),"commitCreated"),pushCompleted:l(r=>nt.emit(Ge.PUSH_COMPLETED,r),"pushCompleted"),projectInitialized:l(r=>nt.emit(Ge.PROJECT_INITIALIZED,r),"projectInitialized"),projectSynced:l(r=>nt.emit(Ge.PROJECT_SYNCED,r),"projectSynced"),analysisCompleted:l(r=>nt.emit(Ge.ANALYSIS_COMPLETED,r),"analysisCompleted")};De();ee();H();Ue();xt();z();var zp=pe;function oi(r){let e=0,t=null;for(let s of r.timeline)s.type==="start"||s.type==="resume"?t=new Date(s.at):(s.type==="pause"||s.type==="complete")&&t&&(e+=new Date(s.at).getTime()-t.getTime(),t=null);return t&&r.status==="active"&&(e+=Date.now()-t.getTime()),Math.round(e/1e3)}l(oi,"calculateDuration");function qp(r){return it(r*1e3)}l(qp,"formatDuration");function Kp(r){return{id:r.id,projectId:r.project_id,task:r.task,status:r.status,startedAt:r.started_at,pausedAt:r.paused_at,completedAt:r.completed_at,duration:r.duration,metrics:JSON.parse(r.metrics),timeline:JSON.parse(r.timeline)}}l(Kp,"rowToSession");var ii=class{static{l(this,"TaskSessionManager")}projectPath;projectId;initialized;constructor(e){this.projectPath=e,this.projectId=null,this.initialized=!1}async initialize(){if(this.projectId=await M.getProjectId(this.projectPath),!this.projectId)throw new Error("No prjct project found. Run /p:init first.");P.getDb(this.projectId),this.initialized=!0}generateId(){return zp()}async getCurrent(){this.initialized||await this.initialize();let e=P.get(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status IN ('active', 'paused') ORDER BY started_at DESC LIMIT 1",this.projectId);return e?Kp(e):null}async create(e){this.initialized||await this.initialize();let t=await this.getCurrent();if(t&&t.status==="active")throw new Error(`Session already active: "${t.task}". Use /p:done or /p:pause first.`);let s=new Date().toISOString(),n={id:this.generateId(),projectId:this.projectId,task:e,status:"active",startedAt:s,pausedAt:null,completedAt:null,duration:0,metrics:{filesCreated:0,filesChanged:0,filesModified:0,linesAdded:0,linesRemoved:0,commits:0,snapshots:[]},timeline:[{type:"start",at:s}]};return this.saveSession(n),await this.logEvent("session_started",{sessionId:n.id,task:e}),await Pr.sessionStarted({sessionId:n.id,task:e,projectId:this.projectId}),n}async resume(e=null){this.initialized||await this.initialize();let t=await this.getCurrent();if(e&&(!t||t.task!==e))return this.create(e);if(!t){if(!e)throw new Error("No active session. Provide a task to start one.");return this.create(e)}if(t.status==="active")return t;let s=new Date().toISOString();return t.status="active",t.timeline.push({type:"resume",at:s}),this.saveSession(t),await this.logEvent("session_resumed",{sessionId:t.id}),await Pr.sessionResumed({sessionId:t.id,task:t.task,projectId:this.projectId}),t}async pause(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to pause.");if(e.status==="paused")return e;let t=new Date().toISOString();return e.status="paused",e.pausedAt=t,e.duration=oi(e),e.timeline.push({type:"pause",at:t}),this.saveSession(e),await this.logEvent("session_paused",{sessionId:e.id,duration:e.duration}),await Pr.sessionPaused({sessionId:e.id,task:e.task,duration:e.duration,projectId:this.projectId}),e}async complete(){this.initialized||await this.initialize();let e=await this.getCurrent();if(!e)throw new Error("No active session to complete.");let t=new Date().toISOString();return e.status="completed",e.completedAt=t,e.duration=oi(e),e.metrics=await this.calculateMetrics(e),e.timeline.push({type:"complete",at:t}),this.saveSession(e),await this.logEvent("session_completed",{sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics}),await Pr.sessionCompleted({sessionId:e.id,task:e.task,duration:e.duration,metrics:e.metrics,projectId:this.projectId}),e}calculateDuration(e){return oi(e)}async calculateMetrics(e){let t={...e.metrics};try{let s=e.startedAt.split("T")[0],{stdout:n}=await N(`git rev-list --count --since="${s}" HEAD 2>/dev/null || echo "0"`,{cwd:this.projectPath});t.commits=parseInt(n.trim(),10)||0;let{stdout:o}=await N(`git diff --stat HEAD~${Math.max(t.commits,1)} 2>/dev/null || echo ""`,{cwd:this.projectPath}),i=o.split(`
|
|
1281
|
+
`),c=(i[i.length-2]||"").match(/(\d+) files? changed(?:, (\d+) insertions?)?(?:, (\d+) deletions?)?/);c&&(t.filesChanged=parseInt(c[1],10)||0,t.linesAdded=parseInt(c[2],10)||0,t.linesRemoved=parseInt(c[3],10)||0)}catch(s){A(s)||console.error(`Metrics calculation warning: ${y(s)}`)}return t}saveSession(e){P.run(this.projectId,`INSERT OR REPLACE INTO sessions (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
1282
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,e.id,e.projectId,e.task,e.status,e.startedAt,e.pausedAt??null,e.completedAt??null,e.duration,JSON.stringify(e.metrics),JSON.stringify(e.timeline))}async getHistory(e=10){return this.initialized||await this.initialize(),P.query(this.projectId,"SELECT * FROM sessions WHERE project_id = ? AND status = 'completed' ORDER BY completed_at DESC LIMIT ?",this.projectId,e).map(Kp)}async logEvent(e,t){try{P.appendEvent(this.projectId,`session.${e}`,t)}catch{}}static formatDuration(e){return qp(e)}};H();z();J();tt();async function cl(r=process.cwd()){try{if(!await M.getProjectId(r))return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};f.spin("checking for abandoned sessions...");let s=await new ii(r).getCurrent(),n=s?{task:s.task,startedAt:s.startedAt}:null;if(!n||!n.task)return f.warn("no abandoned session found"),{success:!0,message:"No abandoned session found"};if(console.log(`
|
|
1193
1283
|
Found abandoned session:
|
|
1194
|
-
`),console.log(` Task: ${n.task}`),n.startedAt){let o=
|
|
1284
|
+
`),console.log(` Task: ${n.task}`),n.startedAt){let o=zt(new Date(n.startedAt));console.log(` Started: ${o} ago`)}return n.context&&console.log(` Context: ${n.context.slice(0,100)}...`),console.log(`
|
|
1195
1285
|
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
|
|
1196
|
-
`),{success:!0,session:n}}catch(e){return f.fail(
|
|
1197
|
-
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await
|
|
1286
|
+
`),{success:!0,session:n}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(cl,"recover");async function ll(r=process.cwd()){try{f.spin("creating undo point...");let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jn.join(R.getGlobalProjectPath(e),"snapshots");await We(t);let{execFileSync:s,execSync:n}=await import("node:child_process");try{if(!n("git status --porcelain",{cwd:r,encoding:"utf-8"}).trim())return f.warn("nothing to undo (no changes)"),{success:!0,message:"No changes to undo"};let a=`prjct-undo-${new Date().toISOString().replace(/[:.]/g,"-")}`;s("git",["stash","push","-m",a],{cwd:r,encoding:"utf-8"});let c=jn.join(t,"history.json"),u={snapshots:[],current:-1};try{let d=await Ae(c);u=JSON.parse(d)}catch(d){if(!A(d)&&!(d instanceof SyntaxError))throw d}return u.snapshots.push({id:a,timestamp:new Date().toISOString(),message:a}),u.current=u.snapshots.length-1,await yt(c,JSON.stringify(u,null,2)),await kt.log(r,"undo_performed",{snapshotId:a,timestamp:b()}),f.done("changes stashed (use /p:redo to restore)"),{success:!0,snapshotId:a}}catch(o){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(o)}}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(ll,"undo");async function ul(r=process.cwd()){try{f.spin("restoring changes...");let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jn.join(R.getGlobalProjectPath(e),"snapshots"),s=jn.join(t,"history.json"),n;try{let i=await Ae(s);n=JSON.parse(i)}catch(i){if(A(i)||i instanceof SyntaxError)return f.warn("no undo history found"),{success:!1,message:"No undo history found"};throw i}if(n.snapshots.length===0)return f.warn("nothing to redo"),{success:!1,message:"Nothing to redo"};let{execSync:o}=await import("node:child_process");try{let i=o("git stash list",{cwd:r,encoding:"utf-8"}).trim();return i?i.split(`
|
|
1287
|
+
`).find(c=>c.includes("prjct-undo-"))?(o("git stash pop",{cwd:r,encoding:"utf-8"}),n.snapshots.pop(),n.current=Math.max(0,n.current-1),await yt(s,JSON.stringify(n,null,2)),await kt.log(r,"redo_performed",{timestamp:b()}),f.done("changes restored"),{success:!0}):(f.warn("no prjct undo point found"),{success:!1,message:"No prjct undo point found"}):(f.warn("no stashed changes"),{success:!1,message:"No stashed changes found"})}catch(i){return f.failWithHint("GIT_OPERATION_FAILED"),{success:!1,error:y(i)}}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(ul,"redo");async function dl(r=process.cwd()){try{let e=await M.getProjectId(r);if(!e)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let t=jn.join(R.getGlobalProjectPath(e),"snapshots"),s=jn.join(t,"history.json"),n;try{let o=await Ae(s);n=JSON.parse(o)}catch(o){if(A(o)||o instanceof SyntaxError)return console.log(`
|
|
1198
1288
|
SNAPSHOT HISTORY
|
|
1199
1289
|
`),console.log("=".repeat(50)),console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1200
1290
|
`),{success:!0,snapshots:[]};throw o}return console.log(`
|
|
@@ -1202,56 +1292,35 @@ ${"\u2550".repeat(50)}
|
|
|
1202
1292
|
`),console.log("=".repeat(50)),n.snapshots.length===0?(console.log(" No snapshots yet."),console.log(` Use /p:undo to create a snapshot.
|
|
1203
1293
|
`)):(n.snapshots.forEach((o,i)=>{let a=i===n.current?">":" ",c=new Date(o.timestamp).toLocaleString();console.log(` ${a} ${i+1}. ${c}`)}),console.log(""),console.log(` ${n.snapshots.length} snapshot(s) available`),console.log(` Use /p:redo to restore the latest
|
|
1204
1294
|
`)),console.log(`${"=".repeat(50)}
|
|
1205
|
-
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(
|
|
1206
|
-
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};import
|
|
1207
|
-
${
|
|
1295
|
+
`),{success:!0,snapshots:n.snapshots,current:n.current}}catch(e){return f.fail(y(e)),{success:!1,error:y(e)}}}l(dl,"history");var In=class extends Se{static{l(this,"MaintenanceCommands")}_cleanupMemory=ni;_cleanupMemoryInternal=ri;async cleanup(e={},t=process.cwd()){let s=await this.ensureProjectInit(t);return s.success?ol(e,t):s}async cleanupProjects(e={}){return Bp(e)}async design(e=null,t={},s=process.cwd()){let n=await this.ensureProjectInit(s);return n.success?il(e,t,s):n}async recover(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?cl(e):t}async undo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ll(e):t}async redo(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?ul(e):t}async history(e=process.cwd()){let t=await this.ensureProjectInit(e);return t.success?dl(e):t}async enrich(e=null,t=process.cwd(),s={}){let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=e?.trim();if(!o)return{success:!1,error:"Missing issue ID or description",message:'Usage: prjct enrich "<issue-id-or-description>" --md'};let i=o.match(/\b[A-Z]+-\d+\b/)?.[0]||null,a=await vn(o,t,{maxFiles:10,minScore:.1,includeTests:!0}),c={success:!0,mode:"mcp",issueId:i,query:o,files:a.files.map(u=>({path:u.path,score:Number(u.score.toFixed(3)),reasons:u.reasons})),publish:{linear:"Use your AI client Linear MCP tools to update description/comment.",jira:"Use your AI client Jira MCP tools to update description/comment."}};if(s.json)return console.log(JSON.stringify(c,null,2)),{success:!0};if(s.md){let u=[];if(u.push("## Enrichment Context"),u.push(""),u.push(`- Query: ${o}`),i&&u.push(`- Issue ID: ${i}`),u.push(`- Candidate files: ${c.files.length}`),u.push(""),u.push("### Suggested Files"),u.push(""),c.files.length===0)u.push("- No relevant files found.");else for(let d of c.files)u.push(`- \`${d.path}\` (${d.score})`);return u.push(""),u.push("### Publish"),u.push(""),u.push("- Update description via MCP"),u.push("- Add enrichment as comment via MCP"),u.push("- Or keep local only"),console.log(u.join(`
|
|
1296
|
+
`)),{success:!0}}return{success:!0,message:`Prepared enrichment context (${c.files.length} files).`}}};De();import xe from"chalk";ee();var mS=BigInt(300*1e9),ml=class{static{l(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let s=process.hrtime.bigint();return this.marks.delete(e),Number(s-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,s]of this.marks)e-s>mS&&this.marks.delete(t)}recordTiming(e,t,s,n){I.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(s*100)/100,unit:"ms",context:n})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let s=this.snapshotMemory(),n=[{metric:"heap_used",value:s.heapUsed,unit:"bytes"},{metric:"heap_total",value:s.heapTotal,unit:"bytes"},{metric:"rss",value:s.rss,unit:"bytes"},{metric:"external_memory",value:s.external,unit:"bytes"}];for(let o of n)I.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return s}recordContextCorrectness(e,t){I.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){I.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let s=t.toISOString();return I.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",s).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let s=new Date;s.setDate(s.getDate()-t),s.setHours(0,0,0,0);let n=this.getMetrics(e,s),o={period:`${t}d`},i=n.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(g=>g.value);o.startup={avg:Math.round(m.reduce((g,h)=>g+h,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=n.filter(m=>"metric"in m&&m.metric==="heap_used"),c=n.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=l(S=>Math.round(S/1048576*10)/10,"toMB"),g=a.map(S=>S.value),h=c.map(S=>S.value);o.memory={avgHeapMB:m(g.reduce((S,w)=>S+w,0)/g.length),peakHeapMB:m(Math.max(...g)),avgRssMB:h.length>0?m(h.reduce((S,w)=>S+w,0)/h.length):0}}let u=n.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(g=>g.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=n.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(g=>g.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=n.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let g of p){let h=g.context?.command||"unknown";m[h]||(m[h]=[]),m[h].push(g.value)}o.commandDurations={};for(let[g,h]of Object.entries(m))o.commandDurations[g]={avg:Math.round(h.reduce((S,w)=>S+w,0)/h.length),min:Math.min(...h),max:Math.max(...h),count:h.length,unit:"ms"}}return o}},pS=new ml,Xp=pS;H();tt();Dt();var ws={startup:{max:500,unit:"ms"},heapMB:{max:80,unit:"MB"},contextRate:{min:100,unit:"%"},handoffRate:{min:100,unit:"%"}};function ai(r,e,t){return t==="below"?r<=e?xe.green("\u2713"):xe.yellow("\u26A0"):r>=e?xe.green("\u2713"):xe.yellow("\u26A0")}l(ai,"statusIcon");var $n=class extends Se{static{l(this,"PerformanceCommands")}async perf(e="7",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await M.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=parseInt(e,10)||7,i=await Xp.getReport(n,o);if(!(i.startup||i.memory||i.contextCorrectness||i.subtaskHandoff||i.commandDurations))return console.log(`
|
|
1297
|
+
${xe.dim("No performance data yet.")}`),console.log(`${xe.dim("Metrics are collected automatically as you use the CLI.")}
|
|
1208
1298
|
`),{success:!0,message:"No data"};if(console.log(`
|
|
1209
|
-
${
|
|
1210
|
-
${
|
|
1211
|
-
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
1212
|
-
version INTEGER PRIMARY KEY,
|
|
1213
|
-
name TEXT NOT NULL,
|
|
1214
|
-
applied_at TEXT NOT NULL
|
|
1215
|
-
)
|
|
1216
|
-
`);let t=new Set(e.prepare("SELECT version FROM _system_migrations").all().map(n=>n.version)),s=[{version:1,name:"mcp-health-table",up:l(n=>{n.run(`
|
|
1217
|
-
CREATE TABLE mcp_health (
|
|
1218
|
-
provider TEXT PRIMARY KEY,
|
|
1219
|
-
status TEXT NOT NULL,
|
|
1220
|
-
last_checked TEXT NOT NULL,
|
|
1221
|
-
last_error TEXT,
|
|
1222
|
-
token_version TEXT,
|
|
1223
|
-
config_valid INTEGER NOT NULL DEFAULT 0,
|
|
1224
|
-
oauth_valid INTEGER NOT NULL DEFAULT 0,
|
|
1225
|
-
updated_at TEXT NOT NULL
|
|
1226
|
-
)
|
|
1227
|
-
`)},"up")}];for(let n of s)t.has(n.version)||(n.up(e),e.prepare("INSERT INTO _system_migrations (version, name, applied_at) VALUES (?, ?, ?)").run(n.version,n.name,new Date().toISOString()))}getMcpHealth(e){return this.getDb().prepare("SELECT * FROM mcp_health WHERE provider = ?").get(e)??null}setMcpHealth(e,t){let s=this.getDb(),n=new Date().toISOString();s.prepare(`
|
|
1228
|
-
INSERT OR REPLACE INTO mcp_health
|
|
1229
|
-
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
1230
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
1231
|
-
`).run(e,t.status,n,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,n)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},tT=new Ll;W();K();var ki="mcp-remote@0.1.38",Fl={linear:{command:"npx",args:["-y",ki,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",ki,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},KL={linear:`npx -y ${ki} https://mcp.linear.app/mcp`,jira:`npx -y ${ki} https://mcp.atlassian.com/v1/mcp`};function ds(){return process.env.PRJCT_TEST_MODE==="1"?qg.join(Jg.tmpdir(),"prjct-context7-test","mcp.json"):qg.join(Jg.homedir(),".claude","mcp.json")}l(ds,"getClaudeMcpConfigPath");async function Kg(r=ds()){try{let e=await sT.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=w(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${w(e)}`)}}l(Kg,"readMcpConfig");async function nT(r,e=ds()){await le(e,r)}l(nT,"writeMcpConfig");async function Ul(r,e,t=ds()){let s=await Kg(t),n={...s.mcpServers||{}},o=n[r];n[r]=e,s.mcpServers=n;let i=JSON.stringify(o)!==JSON.stringify(e);return await nT(s,t),{path:t,changed:i}}l(Ul,"upsertMcpServer");async function Lr(r,e=ds()){return!!(await Kg(e)).mcpServers?.[r]}l(Lr,"hasMcpServer");vs();Ct();dt();var Un=class extends Ce{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await ft.write({apiKey:o,...i?{apiUrl:i}:{}}),await Fn.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(ne.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
|
|
1299
|
+
${xe.cyan("Performance Report")} ${xe.dim(`(last ${o} days)`)}`),console.log("\u2550".repeat(55)),i.startup){let c=ai(i.startup.avg,ws.startup.max,"below");console.log(` Startup: avg ${xe.bold(`${i.startup.avg}ms`)} ${xe.dim(`(min ${i.startup.min}, max ${i.startup.max}, n=${i.startup.count})`)} ${c} ${xe.dim(`target: <${ws.startup.max}ms`)}`)}if(i.memory){let c=ai(i.memory.peakHeapMB,ws.heapMB.max,"below");console.log(` Memory: avg ${xe.bold(`${i.memory.avgHeapMB}MB`)} heap, peak ${i.memory.peakHeapMB}MB, rss ${i.memory.avgRssMB}MB ${c} ${xe.dim(`target: <${ws.heapMB.max}MB`)}`)}if(i.contextCorrectness){let c=ai(i.contextCorrectness.rate,ws.contextRate.min,"above");console.log(` Context: ${xe.bold(`${i.contextCorrectness.rate}%`)} tasks received sync ${xe.dim(`(${i.contextCorrectness.receivedSync}/${i.contextCorrectness.total})`)} ${c} ${xe.dim(`target: ${ws.contextRate.min}%`)}`)}if(i.subtaskHandoff){let c=ai(i.subtaskHandoff.rate,ws.handoffRate.min,"above");console.log(` Handoff: ${xe.bold(`${i.subtaskHandoff.rate}%`)} subtasks with output ${xe.dim(`(${i.subtaskHandoff.outputPopulated}/${i.subtaskHandoff.total})`)} ${c} ${xe.dim(`target: ${ws.handoffRate.min}%`)}`)}if(i.commandDurations&&Object.keys(i.commandDurations).length>0){console.log(`
|
|
1300
|
+
${xe.dim("Command Durations:")}`);for(let[c,u]of Object.entries(i.commandDurations))console.log(` ${c.padEnd(12)} avg ${xe.bold(`${u.avg}ms`)} ${xe.dim(`(min ${u.min}, max ${u.max}, n=${u.count})`)}`)}return console.log("\u2550".repeat(55)),console.log(""),{success:!0}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}};ei();Yt();De();fe();mr();import TS from"node:fs/promises";import vS from"node:http";import ES from"node:path";import te from"chalk";fe();J();import gS from"node:fs/promises";import fS from"node:path";var Qp="https://api.prjct.app",Yp={apiKey:null,apiUrl:Qp,userId:null,email:null,lastAuth:null},pl=class{static{l(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=R.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Ee(this.configPath);return this.cachedConfig=e??{...Yp},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await We(fS.dirname(this.configPath)),await ce(this.configPath,s),await gS.chmod(this.configPath,384),this.cachedConfig=s}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||Qp}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...Yp},await ce(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},hS=new pl,ut=hS;_s();var yS={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function wS(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}l(wS,"camelToSnake");function kS(r){let e={};for(let[t,s]of Object.entries(r))e[wS(t)]=s;return e}l(kS,"snakeCaseKeys");function SS(r,e){let[t,s]=e.type.split("."),n=yS[t];if(!n)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},c=kS(a),u=c.id||a.id||"";return{event_type:i,entity_type:n,entity_id:u,data:{...c,project_id:r},project_id:r}}l(SS,"mapCliEventToWebFormat");function Zp(r,e){return e.map(t=>SS(r,t)).filter(t=>t!==null)}l(Zp,"mapCliEventsToWebFormat");var gl=class{static{l(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=Zp(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,events:o})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async pullEvents(e,t){let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":n},body:JSON.stringify({projectId:e,since:t})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async getStatus(e){let{apiUrl:t,apiKey:s}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let n=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!n.ok)throw await this.parseErrorResponse(n);return await n.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),yn("API_REQUEST"));try{let{apiUrl:s,apiKey:n}=await this.getAuthHeaders();if(!n)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":n},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await ut.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([ut.getApiUrl(),ut.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let n=new AbortController,o=setTimeout(()=>n.abort(),yn("API_REQUEST"));try{let i=await fetch(e,{...t,signal:n.signal});if(clearTimeout(o),i.status>=500&&s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}return i}catch(i){if(clearTimeout(o),i instanceof Error&&i.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${yn("API_REQUEST")}ms)`);if(s<this.retryConfig.maxRetries){let a=Math.min(this.retryConfig.baseDelayMs*2**s,this.retryConfig.maxDelayMs);return await this.sleep(a),this.fetchWithRetry(e,t,s+1)}throw this.createError("NETWORK_ERROR",i instanceof Error?i.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),s=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",s,e.status):this.createError("API_ERROR",s,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,s){return{code:e,message:t,status:s}}sleep(e){return new Promise(t=>setTimeout(t,e))}},Mn=new gl;na();ps();Wt();Ns();wt();var fl=class{static{l(this,"SyncManager")}async hasAuth(){return await ut.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await Mn.getStatus(e)}catch{return null}}async sync(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let t={success:!0,skipped:!1},s=await this.push(e);s.success&&!s.skipped&&(t.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let n=await this.pull(e);return n.success&&!n.skipped&&(t.pulled={count:n.count||0,syncedAt:n.syncedAt||new Date().toISOString()}),(!s.success||!n.success)&&(t.success=!1,t.error=s.error||n.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await ms.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),n=s?[s,...t]:t,o=await Mn.pushEvents(e,n);if(o.success)return await ms.clearPending(e),await ms.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,c=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${c}`}}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let s=(await ms.getLastSync(e))?.timestamp,n=await Mn.pullEvents(e,s);if(n.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:n.syncedAt};let o=await this.applyPulledEvents(e,n.events);return await ms.updateLastSync(e),{success:!0,skipped:!1,count:n.events.length,applied:o,syncedAt:n.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:t instanceof Error?t.message:"Unknown error"}}}async applyPulledEvents(e,t){let s=0;for(let n of t)try{await this.applyEvent(e,n),s++}catch(o){let i=n.entity_type||n.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,n,o;if(t.entity_type)s=t.entity_type,n=t.event_type,o=t.data||{};else{let[i,a]=(t.type||"").split(".");s={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects"}[i]||i,n=a==="deleted"?"delete":"upsert",o=t.data||{}}if(n!=="delete")switch(s){case"tasks":await this.applyTaskUpsert(e,o);break;case"ideas":await this.applyIdeaUpsert(e,o);break;case"shipped_items":await this.applyShippedUpsert(e,o);break;case"queue_tasks":await this.applyQueueUpsert(e,o);break;case"roadmap_features":break;case"projects":break}}async applyTaskUpsert(e,t){let s=t.status||"";s==="active"||t.started_at||t.startedAt?await _.update(e,n=>!n.currentTask||t.id!==n.currentTask.id?{...n,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:n):s==="completed"?await _.update(e,n=>n.currentTask?.id===t.id?{...n,currentTask:null}:n):await we.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Le.update(e,n=>({...n,ideas:n.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Le.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await Xe.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await we.addTask(e,{description:t.description||"",priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"})}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},bS=new fl,eg=bS;H();Ue();J();_o();tt();Pt();Dt();var _n=class extends Se{static{l(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",n=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=n[0];if(!o)return t.md||f.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=n.indexOf("--url");return a!==-1&&n[a+1]&&(i=n[a+1]),await ut.write({apiKey:o,...i?{apiUrl:i}:{}}),await Mn.testConnection()?(t.md||(f.done("Connected! API key saved"),f.info(te.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
|
|
1232
1301
|
- **Status**: Connected
|
|
1233
1302
|
- **Key**: \`${o.substring(0,12)}...\`
|
|
1234
|
-
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(
|
|
1303
|
+
- **API**: ${i||"default"}`:""}):(t.md||(f.warn("API key saved, but server is unreachable"),f.info(te.dim(`Key: ${o.substring(0,12)}...`)),f.info(te.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
|
|
1235
1304
|
- **Status**: Key saved (server unreachable)
|
|
1236
|
-
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await
|
|
1237
|
-
- **Status**: Logged out`:""};default:{let o=await
|
|
1305
|
+
- **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await ut.clearAuth(),t.md||f.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
|
|
1306
|
+
- **Status**: Logged out`:""};default:{let o=await ut.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
|
|
1238
1307
|
- **Authenticated**: Yes
|
|
1239
1308
|
- **Email**: ${o.email||"N/A"}
|
|
1240
1309
|
- **Key**: \`${o.apiKeyPrefix}\`
|
|
1241
1310
|
- **Last auth**: ${o.lastAuth||"N/A"}`:"## Auth Status\n- **Authenticated**: No\n- Run `prjct login` to connect"}:(o.authenticated?f.box("Auth Status",`Email: ${o.email||"N/A"}
|
|
1242
1311
|
Key: ${o.apiKeyPrefix}
|
|
1243
|
-
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${
|
|
1244
|
-
Key: ${t.apiKeyPrefix}`),f.info(`Run ${
|
|
1312
|
+
Since: ${o.lastAuth||"N/A"}`):(f.info("Not authenticated"),f.info(`Run ${te.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await ut.getStatus();if(t.authenticated)return e.md||(f.box("Already Authenticated",`Email: ${t.email}
|
|
1313
|
+
Key: ${t.apiKeyPrefix}`),f.info(`Run ${te.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
|
|
1245
1314
|
- **Email**: ${t.email}
|
|
1246
1315
|
- **Key**: \`${t.apiKeyPrefix}\`
|
|
1247
1316
|
|
|
1248
|
-
Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=
|
|
1317
|
+
Run \`prjct logout\` first to re-authenticate.`:""};let s=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(n=>{let o=vS.createServer(async(i,a)=>{let c=new URL(i.url||"/","http://127.0.0.1");if(c.pathname==="/callback"){let u=c.searchParams.get("key"),d=c.searchParams.get("email"),p=c.searchParams.get("user_id");if(u){await ut.saveAuth(u,p||"",d||"");let m=`${s}/api`;await ut.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(f.step(3,3,"Connected"),f.stop(),f.box("Authentication Complete",`Email: ${d}
|
|
1249
1318
|
Key: ${u.substring(0,12)}...
|
|
1250
1319
|
Status: Connected`)),await this.autoSync(),n({success:!0,message:e.md?`## Authenticated
|
|
1251
|
-
- **Email**: ${
|
|
1320
|
+
- **Email**: ${d}
|
|
1252
1321
|
- **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||f.fail("Authentication failed: no API key received"),n({success:!1,message:e.md?`## Error
|
|
1253
1322
|
Authentication failed: no API key received`:""}));return}a.writeHead(404),a.end("Not found")});o.listen(0,"127.0.0.1",async()=>{let i=o.address();if(!i||typeof i=="string"){o.close(),e.md||f.fail("Failed to start callback server"),n({success:!1,message:e.md?`## Error
|
|
1254
|
-
Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(
|
|
1323
|
+
Failed to start callback server`:""});return}let a=i.port,c=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;f.step(1,3,"Opening browser..."),f.stop(),f.info(te.dim(c));let u=process.platform,d=u==="darwin"?`open "${c}"`:u==="win32"?`start "${c}"`:`xdg-open "${c}"`;try{await N(d)}catch{f.warn("Could not open browser automatically"),f.info(`Visit: ${c}`)}f.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),f.stop(),e.md||(f.fail("Authentication timed out"),f.info(`Run ${te.cyan("prjct login")} to try again`)),n({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return(await ut.getStatus()).authenticated?(await ut.clearAuth(),f.done("Logged out"),{success:!0,message:""}):(f.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await M.getProjectId(process.cwd());if(!e)return;f.spin("Syncing project...");let t=await eg.sync(e);if(f.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,n=t.pulled?.count||0;s>0||n>0?f.done(`Synced (${s} pushed, ${n} pulled)`):f.done("Synced \u2014 everything up to date")}}catch{f.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
|
|
1255
1324
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
1256
1325
|
<title>prjct CLI Connected</title>
|
|
1257
1326
|
<style>
|
|
@@ -1306,31 +1375,31 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
|
|
|
1306
1375
|
<h1>Authentication Failed</h1>
|
|
1307
1376
|
<div class="msg">${e}</div>
|
|
1308
1377
|
<p class="hint">Return to your terminal and try again.</p>
|
|
1309
|
-
</div></body></html>`}async start(){let e=await
|
|
1378
|
+
</div></body></html>`}async start(){let e=await Pe.checkInstallation(),t=(lt(),ot(Ct)),s=await t.detectCodex(),n=e.providerDetected,o=n?await t.getActiveProvider():null,i=n?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
|
|
1310
1379
|
`),!n&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1311
1380
|
|
|
1312
1381
|
Please install one first:
|
|
1313
1382
|
- Claude Code: https://docs.anthropic.com/claude-code
|
|
1314
1383
|
- Gemini CLI: https://geminicli.com/docs
|
|
1315
|
-
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await
|
|
1384
|
+
- OpenAI Codex: https://github.com/openai/codex`};if(n){console.log("\u{1F4E6} Installing /p:* commands...");let a=await Pe.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
|
|
1316
1385
|
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1317
|
-
${
|
|
1318
|
-
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(
|
|
1386
|
+
${R.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
1387
|
+
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let c of a.errors??[])console.log(` - ${c.file}: ${c.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:c}=await Promise.resolve().then(()=>(vo(),$a));await a();let u=await c({autoRepair:!0});u.verified?(console.log("\u2705 Installed Codex skill: ~/.codex/skills/prjct/SKILL.md"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${u.message||"router verification failed"}`),console.log(" Run `prjct setup` to retry Codex configuration."))}catch(a){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(a)}`)}return await this.setupMcpServers(),console.log(`
|
|
1319
1388
|
\u{1F389} Setup complete!`),console.log(`
|
|
1320
1389
|
Next steps:`),console.log(` 1. Open ${i}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: prjct init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
|
|
1321
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1390
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await Pe.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await Pe.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1322
1391
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1323
1392
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let c of t.errors??[])console.log(` - ${c.file}: ${c.error}`)}console.log(`
|
|
1324
|
-
\u{1F4DD} Installing global configuration...`);let s=await
|
|
1325
|
-
\u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(
|
|
1393
|
+
\u{1F4DD} Installing global configuration...`);let s=await Pe.installGlobalConfig(),n=s.path?R.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${n}`):s.action==="updated"?console.log(`\u2705 Updated ${n}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${n}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(lt(),ot(Ct)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
|
|
1394
|
+
\u26A1 Installing status line...`);let c=await this.installStatusLine();c.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${c.error}`)}if(a.installed)try{let{installCodexSkill:c,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(vo(),$a));await c();let d=await u({autoRepair:!0});d.verified?(console.log("\u2705 Codex skill installed"),console.log("\u2705 Codex p. router ready")):(console.log(`\u26A0\uFE0F Codex skill setup incomplete: ${d.message||"router verification failed"}`),console.log(" Run `prjct setup` again to retry Codex configuration."))}catch(c){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(c)}`)}return await this.setupMcpServers(),console.log(`
|
|
1326
1395
|
\u{1F389} Setup complete!
|
|
1327
1396
|
`),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
|
|
1328
|
-
\u{1F50C} Configuring MCP servers...`);try{await
|
|
1397
|
+
\u{1F50C} Configuring MCP servers...`);try{await ts.install();let e=await ts.verify();e.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e.message||""}`),console.log(" It will activate on the next time you open your AI client."))}catch(e){console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${y(e)}`),console.log(" Run `prjct start` again to retry.")}try{let e=ss();await Ws("linear",e)?console.log("\u2705 Linear MCP already configured"):(await kc("linear",wc.linear),console.log("\u2705 Linear MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Linear command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Linear MCP setup failed: ${y(e)}`),console.log(" Run `prjct linear setup` to configure manually.")}try{let e=ss();await Ws("jira",e)?console.log("\u2705 Jira MCP already configured"):(await kc("jira",wc.jira),console.log("\u2705 Jira MCP added to mcp.json"),console.log(" \u2192 Open your AI client and run any Jira command to complete OAuth."))}catch(e){console.log(`\u26A0\uFE0F Jira MCP setup failed: ${y(e)}`),console.log(" Run `prjct jira setup` to configure manually.")}}async installStatusLine(){try{let e=R.getClaudeDir(),t=R.getClaudeSettingsPath(),s=ES.join(e,"prjct-statusline.sh"),n=`#!/bin/bash
|
|
1329
1398
|
# prjct Status Line for Claude Code
|
|
1330
1399
|
# Shows version update notifications and current task
|
|
1331
1400
|
|
|
1332
1401
|
# Current CLI version (embedded at install time)
|
|
1333
|
-
CLI_VERSION="${
|
|
1402
|
+
CLI_VERSION="${ve}"
|
|
1334
1403
|
|
|
1335
1404
|
# Read JSON context from stdin (provided by Claude Code)
|
|
1336
1405
|
read -r json
|
|
@@ -1381,14 +1450,14 @@ fi
|
|
|
1381
1450
|
|
|
1382
1451
|
# Default: show prjct branding
|
|
1383
1452
|
echo "\u26A1 prjct"
|
|
1384
|
-
`;await
|
|
1453
|
+
`;await TS.writeFile(s,n,{mode:493});let o={};if(await x(t))try{o=await Ee(t)??{}}catch{}return o.statusLine={type:"command",command:s},await ce(t,o),{success:!0}}catch(e){return{success:!1,error:y(e)}}}showAsciiArt(){console.log(te.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(te.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(te.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(te.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(te.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(te.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(te.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(` ${te.bold.cyan("prjct")}${te.magenta("/")}${te.green("cli")} ${te.dim.white(`v${ve} installed`)}`),console.log(""),console.log(` ${te.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${te.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${te.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(te.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(te.bold.cyan("\u{1F680} Quick Start")),console.log(te.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(` ${te.bold("1.")} Initialize your project:`),console.log(` ${te.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${te.bold("2.")} Start your first task:`),console.log(` ${te.green('prjct task "build auth"')}`),console.log(""),console.log(` ${te.bold("3.")} Ship & celebrate:`),console.log(` ${te.green('prjct ship "user login"')}`),console.log(""),console.log(te.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(` ${te.dim("Documentation:")} ${te.cyan("https://prjct.app")}`),console.log(` ${te.dim("Report issues:")} ${te.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(te.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};to();De();z();J();import tg from"node:path";var PS=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],CS=`# Changelog
|
|
1385
1454
|
|
|
1386
1455
|
All notable changes to this project will be documented in this file.
|
|
1387
1456
|
|
|
1388
1457
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
1389
1458
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
1390
|
-
`,
|
|
1391
|
-
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await
|
|
1459
|
+
`,ci=class{static{l(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of PS){let n=tg.join(this.projectPath,s);if(await x(n)){let o=await Ae(n),i=this.detectFormat(o);return{filePath:n,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=tg.join(this.projectPath,e);return await yt(t,`${CS}
|
|
1460
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await Ae(t.filePath),n=e.date||Rl(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,n):o=this.insertMarkdownEntry(s,e,n),await yt(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,s){let n=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+n}
|
|
1392
1461
|
${a}`}return`${e.trimEnd()}
|
|
1393
1462
|
|
|
1394
1463
|
${n}`}insertMarkdownEntry(e,t,s){let n=this.formatMarkdownEntry(t,s),o=e.indexOf(`
|
|
@@ -1398,31 +1467,31 @@ ${a}`}return`${n}
|
|
|
1398
1467
|
|
|
1399
1468
|
${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push("### Added"),s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1400
1469
|
`)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[n,o]of Object.entries(e.sections)){s.push(`### ${n}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
1401
|
-
`)}};
|
|
1402
|
-
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(
|
|
1403
|
-
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await
|
|
1404
|
-
`);break}}async writeJsonVersion(e,t){let s=await
|
|
1405
|
-
${
|
|
1406
|
-
${
|
|
1407
|
-
`,n}}let c=i.filter(
|
|
1408
|
-
${
|
|
1409
|
-
${
|
|
1410
|
-
${
|
|
1411
|
-
`}}let
|
|
1412
|
-
${
|
|
1413
|
-
${
|
|
1414
|
-
`,n}}return n}l(
|
|
1415
|
-
|
|
1416
|
-
Generated with [p/](https://www.prjct.app/)`;return await
|
|
1470
|
+
`)}};cc();Ue();J();import On from"node:path";var li=class{static{l(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let s=await t();if(s)return s}return this.createFallbackVersion()}async bump(){let e=await this.detect();return await this.writeVersion(e),e.next}async fromPackageJson(){let e=On.join(this.projectPath,"package.json"),t=await Ee(e,null);return t?.version?{current:t.version,next:Nn(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=On.join(this.projectPath,"Cargo.toml"),t=await Ae(e,"");if(!t)return null;let s=xS(t);return s?{current:s,next:Nn(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=On.join(this.projectPath,"pyproject.toml"),t=await Ae(e,"");if(!t)return null;let s=RS(t);return s?{current:s,next:Nn(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await cs(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=On.join(this.projectPath,e[0]),s=await Ae(t,"");if(!s)return null;let n=AS(s);return n?{current:n,next:Nn(n),file:t,format:"xml"}:null}async fromVersionFile(e){let t=On.join(this.projectPath,e),s=await Ae(t,"");if(!s)return null;let n=s.trim();return sg(n)?{current:n,next:Nn(n),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await N("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
1471
|
+
`);for(let s of t){let n=s.trim().replace(/^v/,"");if(sg(n))return{current:n,next:Nn(n),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=On.join(this.projectPath,"VERSION");return await yt(e,`0.1.0
|
|
1472
|
+
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Es("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await yt(e.file,`${e.next}
|
|
1473
|
+
`);break}}async writeJsonVersion(e,t){let s=await Ee(e,{});s&&(s.version=t,await ce(e,s))}async writeTomlVersion(e,t){let s=await Ae(e,"");if(!s)return;let n=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await yt(e,n)}async writeXmlVersion(e,t){let s=await Ae(e,"");if(!s)return;let n=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await yt(e,n)}};function sg(r){return/^\d+\.\d+\.\d+/.test(r)}l(sg,"isSemver");function Nn(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);if(!e)return r;let[,t,s,n]=e;return`${t}.${s}.${Number(n)+1}`}l(Nn,"bumpPatch");function xS(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}l(xS,"parseTomlVersion");function RS(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}l(RS,"parsePyprojectVersion");function AS(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}l(AS,"parseCsprojVersion");Ns();wt();H();z();Ue();Us();kn();tt();Xo();H();Ue();import vt from"chalk";async function Ut(r,e,t,s={}){let n={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return n;let i=Ce.getRulesForCommand(r,e).filter(p=>p.position===t),a=i.filter(p=>p.type==="gate");for(let p of a){let m=p.description||p.action;console.log(`
|
|
1474
|
+
${vt.dim(`[gate] ${t}-${e}: ${p.action}`)}`);try{let g=Date.now();await N(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let h=Date.now()-g,S=h>1e3?`${(h/1e3).toFixed(1)}s`:`${h}ms`;console.log(`${vt.green("\u2713")} ${vt.dim(`gate passed (${S})`)}`)}catch(g){return console.log(`${vt.red("\u2717")} gate failed: ${m}`),n.gatesFailed.push(m),n.success=!1,n.output+=`Gate failed: ${m}
|
|
1475
|
+
${y(g)}
|
|
1476
|
+
`,n}}let c=i.filter(p=>p.type==="instruction");for(let p of c){let m=p.description||p.action;console.log(`
|
|
1477
|
+
${vt.dim(`[instruction] ${t}-${e}: ${m}`)}`),n.instructions.push(p.action)}let u=i.filter(p=>p.type==="hook");for(let p of u){console.log(`
|
|
1478
|
+
${vt.dim(`[hook] ${t}-${e}: ${p.action}`)}`);try{let m=Date.now();await N(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${vt.green("\u2713")} ${vt.dim(`(${h})`)}`)}catch(m){console.log(`${vt.yellow("\u26A0")} hook failed (non-blocking): ${p.action}`),n.hooksFailed.push(p.description||p.action),n.output+=`Hook failed: ${p.action}
|
|
1479
|
+
${y(m)}
|
|
1480
|
+
`}}let d=i.filter(p=>p.type==="step");for(let p of d){console.log(`
|
|
1481
|
+
${vt.dim(`[step] ${e}: ${p.action}`)}`);try{let m=Date.now();await N(p.action,{timeout:p.timeoutMs,cwd:s.projectPath||process.cwd(),env:{...process.env}});let g=Date.now()-m,h=g>1e3?`${(g/1e3).toFixed(1)}s`:`${g}ms`;console.log(`${vt.green("\u2713")} ${vt.dim(`step passed (${h})`)}`),n.stepsRun.push(p.description||p.action)}catch(m){return console.log(`${vt.red("\u2717")} step failed: ${p.action}`),n.gatesFailed.push(p.description||p.action),n.success=!1,n.output+=`Step failed: ${p.action}
|
|
1482
|
+
${y(m)}
|
|
1483
|
+
`,n}}return n}l(Ut,"executeWorkflowRules");Dt();var Ln=class extends Se{static{l(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await _.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await _.completeTask(o)),i||(i="current work");let c=await Ut(o,"ship","before",{projectPath:t,skipRules:s.skipHooks});if(!c.success)return{success:!1,error:c.gatesFailed.length>0?`Blocked: ${c.gatesFailed.join(", ")}`:`Step failed: ${c.gatesFailed.join(", ")}`};s.md||f.step(1,4,"Bumping version...");let d=await new li(t).bump();s.md||f.step(2,4,"Updating changelog..."),await new ci(t).addFeature(d,i),s.md||f.step(3,4,"Committing...");let m=await this._createShipCommit(i,t),g="skipped";if(m.success){let w=await this._gitPush(t);g=w.success?"pushed":w.message}await Xe.addShipped(o,{name:i,version:d}),await this.logToMemory(t,"feature_shipped",{feature:i,version:d,timestamp:b()}),await Ze.learnDecision(o,"commit_footer","prjct","ship"),await Ze.recordWorkflow(o,"ship_completed",{description:"Ship with workflow rules",feature:i,version:d});let h=await Ut(o,"ship","after",{projectPath:t,skipRules:s.skipHooks}),S=[...c.instructions,...h.instructions];try{s.md||f.step(4,4,"Updating AI context..."),await Fs.sync(t),s.md||f.done("\u2713 AI context updated")}catch(w){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(w))}if(s.md){let w=jo("ship",!0),E=L(he(`Shipped: ${i}`,`Version: ${d}`),X("Results",Ie([`Version: ${d}`,`Commit: ${m.success?"created":m.message}`,`Push: ${g}`,`Workflow steps: ${c.stepsRun.length>0?c.stepsRun.join(", "):"none"}`])),S.length>0?X("Agent Instructions",Ie(S)):null,ue(w.map(D=>({label:D.desc,command:D.cmd}))));console.log(E)}else f.done(`v${d} shipped`),bt("ship");return{success:!0,feature:i,version:d}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async _createShipCommit(e,t){try{await N("git add .");let s=`feat: ${e}
|
|
1484
|
+
|
|
1485
|
+
Generated with [p/](https://www.prjct.app/)`;return await Es("git",["commit","-m",s]),{success:!0,message:"Committed"}}catch(s){return A(s)?{success:!1,message:"Git not found"}:{success:!1,message:"No changes to commit"}}}async _gitPush(e){try{return await N("git push"),{success:!0,message:"Pushed to remote"}}catch(t){return A(t)?{success:!1,message:"Git not found"}:{success:!1,message:"Push failed (no remote or auth issue)"}}}};Yt();ja();fe();Wc();Ua();H();tt();Pt();Dt();import{execSync as Rr}from"node:child_process";import di from"node:fs/promises";import xr from"node:path";import Un from"chalk";function lg(){try{return!!Rr("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}l(lg,"isHomebrewInstall");function ug(){try{let e=Rr("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).match(/prjct-cli@([\d.]+)/);return e?e[1]:null}catch{return null}}l(ug,"getCurrentVersion");var Hn=class extends Se{static{l(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,n=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(n||f.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),n||f.stop(),n||f.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),n||f.stop(),n||f.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),n||f.stop(),!s){try{await So.updateVersion(ve)}catch{}try{await new Bo().writeCache({lastCheck:0,latestVersion:""})}catch{}}return n?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return n||f.stop(),f.fail(y(i)),{success:!1,error:y(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=ug();if(e)return lg()?(t.details.push("Would uninstall homebrew formula"),t.details.push("Would install via npm: npm install -g prjct-cli")):t.details.push("Would run: npm update -g prjct-cli"),t;try{if(lg()){try{Rr("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}Rr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("Installed via npm")}else Rr("npm install -g prjct-cli@latest",{stdio:"pipe"}),t.details.push("npm install complete");let o=ug();s&&o&&s!==o?t.details.push(`${s} \u2192 ${o}`):o&&t.details.push(`v${o} (already latest)`)}catch(n){t.success=!1,t.errors.push(y(n))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},s=await this.getAllProjectIds();if(s.length===0)t.details.push("No projects found");else{let n=0,o=0;for(let i of s)if(!e)try{let a=await Eo(i),c=await Po(i);if(n+=a.migratedFiles.length,o+=c,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${y(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];n>0&&i.push(`${n} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would clean all legacy artifacts"),t.details.push("Would reinstall editor commands"),t.details.push("Would reinstall global config (all providers)");else{try{let o=await new Xt().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(n){t.errors.push(`Legacy cleanup: ${y(n)}`)}try{let o=await new Xt().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(n){t.errors.push(`Commands: ${y(n)}`)}try{await new Xt().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(n){t.errors.push(`Global config: ${y(n)}`)}try{let{detectAllProviders:n}=await Promise.resolve().then(()=>(lt(),Ct)),o=await n(),i=xr.join(gt("node:os").homedir());if(o.gemini.installed){let a=xr.join(i,".gemini","GEMINI.md");try{let c=await di.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(c.includes(u)&&c.includes(d)){let p=xr.join(xr.dirname(gt.resolve("../../package.json")),"templates","global","GEMINI.md"),m=await di.readFile(p,"utf-8"),g=m.substring(m.indexOf(u),m.indexOf(d)+d.length),h=c.substring(0,c.indexOf(u)),S=c.substring(c.indexOf(d)+d.length),w=h+g+S,E="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",D="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(w.includes(E)&&w.includes(D)){let V=w.substring(0,w.indexOf(E)),F=w.substring(w.indexOf(D)+D.length);w=`${(V+F).replace(/\n{3,}/g,`
|
|
1417
1486
|
|
|
1418
1487
|
`).trim()}
|
|
1419
|
-
`}await
|
|
1420
|
-
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=
|
|
1421
|
-
${
|
|
1422
|
-
`),{success:!0,message:"No data"};let a=
|
|
1423
|
-
${
|
|
1424
|
-
${
|
|
1425
|
-
${
|
|
1488
|
+
`}await di.writeFile(a,w,"utf-8"),t.details.push("Gemini global config updated")}}catch{}}}catch{}}return t.errors.length>0&&(t.success=!1),t}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:s,stopDaemon:n,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(cg(),ag));await s()?(await n()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(s){t.success=!1,t.errors.push(y(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?Un.green("\u2713"):c?Un.red("\u2717"):Un.yellow("\u26A0");console.log(` ${u} ${Un.bold(i)}`);for(let d of a.details)console.log(` ${Un.dim(d)}`);for(let d of a.errors)console.log(` ${Un.yellow("\u26A0")} ${d}`)}return console.log(""),t?f.done("Dry run complete \u2014 no changes made"):s?f.done("System updated"):f.warn(`Updated with ${n.length} error(s)`),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}formatMdOutput(e,t){let s=e.phase1.success&&e.phase2.success,n=[];n.push(t?"# Update (Dry Run)":"# System Update"),n.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:c}of o){let u=a.success?"OK":c?"FAILED":"WARNING";n.push(`## ${i} (${u})`);for(let d of a.details)n.push(`- ${d}`);for(let d of a.errors)n.push(`- WARNING: ${d}`);n.push("")}return t||n.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
|
|
1489
|
+
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}async getAllProjectIds(){let e=xr.join(R.getGlobalBasePath(),"projects");try{return(await di.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};vc();De();gr();Ja();H();tt();Pn();Dt();import Re from"chalk";var Gn=class extends Se{static{l(this,"VelocityCommands")}async velocity(e="0",t=process.cwd()){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let n=await M.getProjectId(t);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await this.loadVelocityConfig(t),i=await mt.getAll(n);if(i.length===0)return console.log(`
|
|
1490
|
+
${Re.dim("No velocity data yet.")}`),console.log(`${Re.dim("Complete tasks with estimates to build velocity history.")}
|
|
1491
|
+
`),{success:!0,message:"No data"};let a=Oo(i,o);await Co.saveMetrics(n,a),console.log(`
|
|
1492
|
+
${Re.cyan("Sprint Velocity")} ${Re.dim(`(last ${o.windowSize??6} sprints)`)}`),console.log("\u2550".repeat(60));let c=a.sprints.slice(-(o.windowSize??6));for(let p of c){let m=p.estimationAccuracy>=80?Re.green:p.estimationAccuracy>=60?Re.yellow:Re.red;console.log(` Sprint ${String(p.sprintNumber).padStart(2)}: ${Re.bold(`${p.pointsCompleted} pts`)} | ${p.tasksCompleted} tasks | accuracy: ${m(`${p.estimationAccuracy}%`)}`)}console.log("");let u=a.velocityTrend==="improving"?Re.green("\u2191"):a.velocityTrend==="declining"?Re.red("\u2193"):Re.dim("\u2192");if(console.log(` Average: ${Re.bold(`${a.averageVelocity} pts/sprint`)} | Trend: ${u} ${a.velocityTrend}`),console.log(` Estimation accuracy: ${Re.bold(`${a.estimationAccuracy}%`)} ${Re.dim(`(\xB1${o.accuracyTolerance??20}% tolerance)`)}`),a.underEstimated.length>0||a.overEstimated.length>0){console.log(`
|
|
1493
|
+
${Re.dim("Patterns:")}`);for(let p of a.underEstimated)console.log(` ${Re.yellow("\u26A0")} ${p.category} tasks underestimated by avg ${Re.bold(`${p.avgVariance}%`)}`);for(let p of a.overEstimated)console.log(` ${Re.green("\u2713")} ${p.category} tasks estimated within ${Re.bold(`${p.avgVariance}%`)}`)}let d=parseInt(e,10);if(d>0&&a.averageVelocity>0){let p=zm(d,a.averageVelocity,o),m=p.estimatedDate?new Date(p.estimatedDate).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"unknown";console.log(`
|
|
1494
|
+
${Re.dim("Projection:")}`),console.log(` Backlog: ${Re.bold(`${d} pts`)} remaining`),console.log(` At current velocity: ~${p.sprints} sprints (${p.sprints*(o.sprintLengthDays??7)} days)`),console.log(` Estimated completion: ${Re.bold(m)}`)}return console.log("\u2550".repeat(60)),console.log(""),{success:!0}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async loadVelocityConfig(e){try{let s=await M.readConfig(e);if(s?.velocity&&typeof s.velocity=="object")return{...fs,...s.velocity}}catch{}return fs}};Uc();import HS from"node:fs/promises";import GS from"node:path";lr();z();Pn();var mg=l(r=>Yi.includes(r),"isValidPoint"),Ys=l(r=>Qi[r],"pointsToMinutes"),dg=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"),pg=l(r=>{let e=Ys(r);return`${dg(e.min)}\u2013${dg(e.max)}`},"pointsToTimeRange"),gg=l(async(r,e)=>{let s=(await mt.getAll(r)).filter(a=>a.tags?.includes(e));if(s.length<3)return null;let o=s.reduce((a,c)=>a+ft(c.actualDuration),0)/s.length;return{points:_S(o),basedOn:s.length}},"suggestFromHistory"),_S=l(r=>{let e=1,t=Number.POSITIVE_INFINITY;for(let s of Yi){let n=Math.abs(Qi[s].typical-r);n<t&&(t=n,e=s)}return e},"findClosestPoint");De();fe();H();J();import yl from"node:fs/promises";import OS from"node:os";import mi from"node:path";var wl=class{static{l(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=mi.join(OS.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await yl.mkdir(this.commandsPath,{recursive:!0});let s=mi.join(this.commandsPath,`${e}.md`),n=this.buildTemplateContent(e,t);return await yl.writeFile(s,n,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:y(s)}}}async deleteWorkflowTemplate(e){try{let t=mi.join(this.commandsPath,`${e}.md`);return await yl.unlink(t),{success:!0}}catch(t){return A(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){let t=mi.join(this.commandsPath,`${e}.md`);return x(t)}buildTemplateContent(e,t){return`---
|
|
1426
1495
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1427
1496
|
---
|
|
1428
1497
|
|
|
@@ -1458,46 +1527,46 @@ Suggest relevant actions based on the workflow results:
|
|
|
1458
1527
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1459
1528
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1460
1529
|
- Run again: \`p. ${e}\`
|
|
1461
|
-
`}},
|
|
1462
|
-
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(
|
|
1463
|
-
`)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${
|
|
1464
|
-
VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=
|
|
1530
|
+
`}},kl=new wl;xt();mr();qc();function NS(r){switch(r){case"low":return 2;case"medium":return 5;case"high":return 8}}l(NS,"complexityToPoints");async function LS(r,e){let t=Rn.detectTaskType(e),s=await gg(r,t);if(s){let a=Ys(s.points);return{taskType:t,estimatedPoints:s.points,estimatedMinutes:a.typical,source:"history"}}let n=Rn.estimateComplexity(e),o=NS(n.level),i=Ys(o);return{taskType:t,estimatedPoints:o,estimatedMinutes:i.typical,source:"heuristic"}}l(LS,"estimateTaskForStart");var Sl=LS;Ue();async function pi(r){try{let{stdout:e}=await N("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}l(pi,"getGitBranch");async function fg(r,e=20){try{let{stdout:t}=await N("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
|
|
1531
|
+
`).filter(s=>s.length>0).slice(0,e)}catch{return[]}}l(fg,"getModifiedFiles");fe();ee();z();var Wn="session-snapshot",FS=30,bl=class{static{l(this,"SessionSnapshotManager")}async capture(e,t,s){let n=await pi(t),o=await fg(t),i=s.startedAt?Math.round((Date.now()-new Date(s.startedAt).getTime())/1e3):void 0,a=t.split("/").pop()||t,c=this.generateResumeHint(s,i),u={sessionId:s.sessionId,projectId:e,projectPath:t,projectName:a,taskDescription:s.taskDescription,taskStatus:s.taskStatus,activeSubtaskIndex:s.activeSubtaskIndex,subtaskCount:s.subtaskCount,branch:n,linearId:s.linearId,filesModified:o,durationWorkedSec:i,timestamp:b(),resumeHint:c};return P.setDoc(e,Wn,u),u}getSnapshot(e){try{return P.getDoc(e,Wn)}catch{return null}}clearSnapshot(e){try{P.deleteDoc(e,Wn)}catch{}}async listAllSnapshots(){let e=await R.listProjects(),t=[];for(let s of e)try{if(!P.exists(s))continue;let n=P.getDoc(s,Wn);n&&t.push(n)}catch{}return t.sort((s,n)=>new Date(n.timestamp).getTime()-new Date(s.timestamp).getTime()),t}async cleanup(e=FS){let t=await R.listProjects(),s=Date.now()-e*24*60*60*1e3,n=0;for(let o of t)try{if(!P.exists(o))continue;let i=P.getDoc(o,Wn);i&&new Date(i.timestamp).getTime()<s&&(P.deleteDoc(o,Wn),n++)}catch{}return n}formatContinuityContext(e){let s=["Session Continuity",`- Last session: ${it(Date.now()-new Date(e.timestamp).getTime())} ago`,`- Task: ${e.taskDescription}`,`- Status: ${e.taskStatus}`];if(e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`- Progress: subtask ${e.activeSubtaskIndex+1}/${e.subtaskCount}`),e.branch&&s.push(`- Branch: ${e.branch}`),e.filesModified&&e.filesModified.length>0){let n=e.filesModified.slice(0,5).join(", "),o=e.filesModified.length>5?` (+${e.filesModified.length-5} more)`:"";s.push(`- Modified files: ${n}${o}`)}return e.durationWorkedSec&&s.push(`- Time worked: ${it(e.durationWorkedSec*1e3)}`),s.push(`- Resume hint: ${e.resumeHint}`),s.join(`
|
|
1532
|
+
`)}generateResumeHint(e,t){let s=[];return e.taskStatus==="paused"?s.push("Task was paused"):s.push("Task was in progress"),e.subtaskCount&&e.activeSubtaskIndex!==void 0&&s.push(`on subtask ${e.activeSubtaskIndex+1} of ${e.subtaskCount}`),t&&t>60&&s.push(`after ${it(t*1e3)} of work`),s.join(" ")}},ks=new bl;pn();ee();var Tl=class{static{l(this,"ContextFeedbackStorage")}recordSuggestions(e,t,s,n){P.run(e,`INSERT INTO context_feedback (task_id, keywords, suggested_files, created_at)
|
|
1533
|
+
VALUES (?, ?, ?, ?)`,t,JSON.stringify(s),JSON.stringify(n),new Date().toISOString())}completeFeedback(e,t,s){let n=P.get(e,"SELECT * FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);if(!n)return;let o=new Set(JSON.parse(n.suggested_files)),i=new Set(s),a=[...o].filter(d=>i.has(d)).length,c=o.size>0?a/o.size:0,u=i.size>0?a/i.size:0;P.run(e,`UPDATE context_feedback
|
|
1465
1534
|
SET actual_files = ?, precision = ?, recall = ?, completed_at = ?
|
|
1466
|
-
WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=
|
|
1535
|
+
WHERE id = ?`,JSON.stringify(s),c,u,new Date().toISOString(),n.id)}getFeedback(e,t){let s=P.get(e,"SELECT precision, recall FROM context_feedback WHERE task_id = ? ORDER BY id DESC LIMIT 1",t);return s?{precision:s.precision,recall:s.recall}:null}getHistoricalBoosts(e,t){let s=new Map;if(t.length===0)return s;let n=P.query(e,`SELECT * FROM context_feedback
|
|
1467
1536
|
WHERE actual_files IS NOT NULL
|
|
1468
|
-
ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),
|
|
1537
|
+
ORDER BY id DESC LIMIT 50`);if(n.length===0)return s;let o=new Set(t),i=new Map;for(let c of n){let u=JSON.parse(c.keywords),d=new Set(u),p=[...o].filter(w=>d.has(w)).length,m=new Set([...o,...d]).size,g=m>0?p/m:0;if(g===0)continue;let h=new Set(JSON.parse(c.suggested_files)),S=new Set(JSON.parse(c.actual_files));for(let w of S){let E=i.get(w)??0;i.set(w,E+g)}for(let w of h)if(!S.has(w)){let E=i.get(w)??0;i.set(w,E-g*.5)}}if(i.size===0)return s;let a=Math.max(...[...i.values()].map(Math.abs),1);for(let[c,u]of i)s.set(c,u/a);return s}},Ar=new Tl;Xc();Wt();wt();Xo();Lo();H();z();_o();Us();kn();tt();Zc();Pn();Dt();fe();H();z();Ds();ee();import gi from"node:fs/promises";import hg from"node:path";var Vn="1.0.0";function US(){return{version:Vn,lastUpdated:"",checksums:{}}}l(US,"getDefaultChecksums");var vl=class{static{l(this,"IndexStorage")}getIndexPath(e){return hg.join(R.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!==Vn?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 US()}async writeChecksums(e,t){this.setIndexMeta(e,"checksums",t)}async calculateChecksum(e){try{let t=await gi.readFile(e);return iu(t)}catch{return""}}async detectChangedFiles(e,t){let n=(await this.readChecksums(e)).checksums,o=[],i=[],a=[];for(let[c,u]of t)c in n?n[c]!==u&&i.push(c):o.push(c);for(let c of Object.keys(n))t.has(c)||a.push(c);return{added:o,modified:i,deleted:a}}async readScores(e){try{let t=this.getIndexMeta(e,"file-scores");if(t!==null)return t.scores||[]}catch{}return[]}async writeScores(e,t){let s={version:Vn,lastUpdated:b(),scores:t};this.setIndexMeta(e,"file-scores",s)}async clearIndex(e){try{P.getDb(e).prepare("DELETE FROM index_meta").run()}catch{}let t=this.getIndexPath(e);try{let s=await gi.readdir(t);await Promise.all(s.map(n=>gi.unlink(hg.join(t,n))))}catch(s){if(!A(s))throw s}}async getIndexAge(e){let t=await this.readIndex(e);if(!t||!t.lastFullScan)return 1/0;let s=new Date(t.lastFullScan);return(new Date().getTime()-s.getTime())/(1e3*60*60)}async readDomains(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null)return t.version!==Vn?null:t}catch{}return null}readDomainsSync(e){try{let t=this.getIndexMeta(e,"domains");if(t!==null&&t.version===Vn)return t}catch{}return null}async writeDomains(e,t){this.setIndexMeta(e,"domains",t)}async readCategories(e){try{let t=this.getIndexMeta(e,"categories-cache");if(t!==null)return t.version!==Vn?null:t}catch{}return null}async writeCategories(e,t){this.setIndexMeta(e,"categories-cache",t)}async getFileCategories(e,t){let s=await this.readCategories(e),n=new Map;if(!s)return n;let o=new Set(t);for(let i of s.fileCategories)o.has(i.path)&&n.set(i.path,i.categories);return n}async getFilesByDomain(e,t){let s=await this.readCategories(e);return s?s.domainIndex[t]||[]:[]}getIndexMeta(e,t){let n=P.getDb(e).prepare("SELECT data FROM index_meta WHERE key = ?").get(t);return n?JSON.parse(n.data):null}setIndexMeta(e,t,s){let n=P.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();n.prepare("INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}},yg=new vl;function wg(r,e,t,s){if(r.length===0)return[];let n=new Set((e?.frameworks||[]).map(a=>a.toLowerCase())),o=new Set((e?.languages||[]).map(a=>a.toLowerCase())),i=r.map(a=>{let c=0;return a.source==="repo"?c+=100:a.source==="context7"?c+=60:a.source==="feedback"?c+=50:a.source==="baseline"&&(c+=10),a.framework&&n.has(a.framework.toLowerCase())&&(c+=40),a.language&&o.has(a.language.toLowerCase())&&(c+=20),typeof a.confidence=="number"&&(c+=Math.round(a.confidence*30)),a.location&&t.length>0&&a.location.toLowerCase().replace(/\*+/g,"").split(/[/,\s]+/).filter(Boolean).some(d=>t.some(p=>p.toLowerCase().includes(d)))&&(c+=25),{pattern:a,score:c}});return i.sort((a,c)=>c.score-a.score),i.slice(0,s).map(a=>a.pattern)}l(wg,"rankPatterns");function kg(r,e){let t=r.toLowerCase(),s=new Set;if(e)try{let n=yg.readDomainsSync(e);if(n?.domains)for(let o of n.domains){if(t.includes(o.name.toLowerCase())){s.add(o.name);continue}for(let i of o.keywords)if(t.includes(i.toLowerCase())){s.add(o.name);break}}}catch{}return s.size>0?[...s]:["general"]}l(kg,"detectDomainsFromTask");function El(r,e){if(!r)return null;let t=r.patterns,s=r.antiPatterns;if(!Array.isArray(t)||t.length===0)return null;let n=wg(t,r,e,5),o=new Set;return`### Pattern Briefing (for this task)
|
|
1469
1538
|
|
|
1470
|
-
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",
|
|
1539
|
+
${n.map((a,c)=>{let u=a.source?` [${a.source}]`:"",d=a.location?` (\`${a.location}\`)`:"",p=a.name.toLowerCase().split(/[\s\-_/]+/).filter(h=>h.length>2),m;if(Array.isArray(s))for(let h=0;h<s.length;h++){if(o.has(h))continue;let S=`${s[h].issue} ${s[h].suggestion}`.toLowerCase();if(p.some(w=>S.includes(w))){m=s[h],o.add(h);break}}let g=[`**${c+1}. ${a.name}**${u}`,` ${a.description}${d}`];return m&&g.push(` - VIOLATION: ${m.issue} \u2014 ${m.suggestion}`),g.join(`
|
|
1471
1540
|
`)}).join(`
|
|
1472
1541
|
|
|
1473
|
-
`)}`}l(
|
|
1474
|
-
`)}l(
|
|
1475
|
-
${
|
|
1476
|
-
${
|
|
1542
|
+
`)}`}l(El,"buildPatternBriefing");function Pl(r,e){let t=r.slice(0,6).map(i=>`\`${i.path}\``),n=["### Context Contract",`- **Key files**: ${t.length>0?t.join(", "):"Run `prjct sync` to improve file targeting"}`],o=e?.antiPatterns||[];if(Array.isArray(o)){let i=o.filter(a=>a.severity==="high");if(i.length>0){n.push(""),n.push("#### Avoid (high-severity)");for(let a of i.slice(0,3))n.push(`- ${a.suggestion}`)}}return n.join(`
|
|
1543
|
+
`)}l(Pl,"buildContextContract");var WS=[{type:"help",patterns:/^(?:help|ayuda|c[oó]mo|how)\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|crear|new|nuevo)\b/i},{type:"list",patterns:/^(?:list|listar|show all|mostrar todos)\b/i},{type:"delete",patterns:/^(?:delete|borrar|remove workflow)\b/i},{type:"run",patterns:/^run\b/i},{type:"view",patterns:/^(?:muestra|show|ver|display|mostrar)\b/i},{type:"add",patterns:/^(?:a[nñ]ade|agrega|pon|nueva?)\b/i},{type:"remove",patterns:/^(?:quita|remove|elimina|borra|borrar)\b/i},{type:"disable",patterns:/^(?:deshabilita|disable|no\s+corras|apaga|turn\s+off|desactiva)\b/i},{type:"gate",patterns:/^(?:bloquea|block|protect|protege)\b/i}],Bn=class extends Se{static{l(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(e){let i=await Ut(o,"task","before",{projectPath:t,skipRules:s.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a,c=e;if(/^[A-Z]+-\d+$/.test(e)&&(a=e),s.md){try{await ts.ensureReady()}catch(Oe){return St("blocked","context7_not_ready",[{label:"Fix Context7 now",command:"prjct start"},{label:"Retry task after fix",command:`prjct task "${c}" --md`},{label:"Cancel"}],{error:y(Oe)}),{success:!1,error:y(Oe)}}let m=await Sl(o,c),g=await _.getCurrentTask(o);if(g)return St("blocked","task_already_active",[{label:"Complete current task first",command:"prjct done --md"},{label:"Pause current and start this one",command:"prjct pause --md"},{label:"Cancel"}],{current_task:g.description,requested_task:c}),{success:!0,message:"Task already active",currentTask:g};await _.startTask(o,{id:pe(),description:c,sessionId:pe(),linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes});let h=R.getGlobalProjectPath(o),S=Ec(c),w;try{w=Ar.getHistoricalBoosts(o,S),w.size===0&&(w=void 0)}catch{}let D=({bug:30,chore:40,improvement:80,feature:100}[m.taskType]??80)>=80?15:10,[V,F,,k]=await Promise.all([pi(t),Je.getActive(o).catch(()=>null),JS(h),vn(c,t,{maxFiles:D,minScore:.15,historicalBoosts:w}).catch(()=>({files:[],metrics:{filesScanned:0,filesReturned:0,scanDuration:0}}))]),$=null;try{let Oe=ks.getSnapshot(o);Oe&&($=ks.formatContinuityContext(Oe),ks.clearSnapshot(o))}catch{}let O=null;if(F?.analyzedAt){let Oe=new Date(F.analyzedAt),jt=Math.floor((Date.now()-Oe.getTime())/(1e3*60*60*24));jt>7&&(O=uc("warn",`Analysis is ${jt} days old. Run \`p. sync\` to refresh patterns and file index.`))}else F||(O=uc("info","No project analysis found. Run `p. sync` for better context targeting."));let ge=null;if(w&&w.size>0){let Oe=[...w.entries()].filter(([,jt])=>jt>.3).sort((jt,Zn)=>Zn[1]-jt[1]).slice(0,5);Oe.length>0&&(ge=`### Previously Useful Files
|
|
1544
|
+
${Oe.map(([Zn])=>`\`${Zn}\``).join(", ")}`)}let rt=kg(c,o),Ts=Sr({description:c,branch:V,linearId:a,type:m.taskType,estimatedPoints:m.estimatedPoints,estimatedMinutes:m.estimatedMinutes,estimateSource:m.source,domains:rt}),os=bm(k.files.map(Oe=>({path:Oe.path,description:Oe.reasons.join(", ")}))),Qs=k.files.map(Oe=>Oe.path),Qn=El(F,Qs),Si=Pl(k.files,F),bi=ue([{label:"Find relevant files",command:'prjct context files "..."'},{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]),Ti=VS(),vi=BS(o);console.log(L($,O,Ts,Si,os,ge,Qn,vi,Ti,bi));try{let Oe=await _.getCurrentTask(o);Oe&&Ar.recordSuggestions(o,Oe.id,S,k.files.map(jt=>jt.path))}catch{}return await this.logToMemory(t,"task_started",{task:e,timestamp:b()}),await Ut(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{success:!0,task:e,taskDescription:c}}let d=await Vo.execute("task",{task:e},t);if(!d.success)return f.fail(d.error||"Failed to execute task"),{success:!1,error:d.error};let p=await Sl(o,c);return await _.startTask(o,{id:pe(),description:c,sessionId:pe(),linearId:a,type:p.taskType,estimatedPoints:p.estimatedPoints,estimatedMinutes:p.estimatedMinutes}),f.done(`${e}`),Tr("working"),bt("task"),await this.logToMemory(t,"task_started",{task:e,orchestratorContext:d.orchestratorContext,timestamp:b()}),await Ut(o,"task","after",{projectPath:t,skipRules:s.skipHooks}),{...d,success:!0,task:e,fibonacci:{isValidPoint:mg,pointsToMinutes:Ys,pointsToTimeRange:pg,storeEstimate:l(async m=>{let g=Ys(m);return await _.updateCurrentTask(o,{estimatedPoints:m,estimatedMinutes:g.typical}),g},"storeEstimate")}}}else{let i=await _.getCurrentTask(o);if(!i)return s.md?St("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task"};if(s.md){let a=i.startedAt?zt(new Date(i.startedAt)):void 0,c=Sr({description:i.description,status:"active",branch:i.branch,linearId:i.linearId,type:i.type,duration:a}),u=i.subtasks||[],d=i.currentSubtaskIndex,p=u.length>0?Sm(u,d):"",m=ue([{label:"Complete subtask",command:"prjct done --md"},{label:"Pause task",command:"prjct pause --md"}]);console.log(L(c,p,m))}else f.done(`working on: ${i.description}`);return{success:!0,task:i.description,currentTask:i}}}catch(n){let o=y(n);return s.md?o.includes("Cannot run")||o.includes("working state")?St("blocked","state_conflict",[{label:"Complete current task",command:"prjct done --md"},{label:"Pause current task",command:"prjct pause --md"}],{error:o.split(".")[0]}):console.log(JSON.stringify({status:"error",error:o})):f.fail(o),{success:!1,error:o}}}async done(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await _.getCurrentTask(n);if(!o)return t.md?St("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'},{label:"Check queue",command:"prjct next --md"}]):f.warn("no active task"),{success:!0,message:"No active task to complete"};let i=await Ut(n,"done","before",{projectPath:e,skipRules:t.skipHooks});if(!i.success)return{success:!1,error:i.gatesFailed.length>0?`Blocked: ${i.gatesFailed.join(", ")}`:`Hook failed: ${i.hooksFailed.join(", ")}`};let a=o.description,c="",u=0;if(o.startedAt){let F=new Date(o.startedAt);c=zt(F),u=Math.round((Date.now()-F.getTime())/6e4)}let d=o.estimatedMinutes,p=o.estimatedPoints,m=o.type||"feature",g=o.linearId;try{await mt.record(n,{sessionId:o.sessionId,command:"done",task:a,startedAt:o.startedAt,completedAt:b(),estimatedDuration:d?Sg(d):"0m",actualDuration:c||"0m",variance:d?KS(u-d):"+0m",completedAsPlanned:!0,qualityScore:3,tags:[m,g].filter(Boolean)})}catch{}let h="";if(p&&d){let F=u-d,k=d>0?Math.round((u-d)/d*100):0,$=F>=0?"+":"";h=` | est: ${p}pt (${Sg(d)}) \u2192 ${$}${k}%`}let S=[],w=null,E=null;try{if(S=await qS(e,o.startedAt),S.length>0){Ar.completeFeedback(n,o.id,S);let F=Ar.getFeedback(n,o.id);F&&(w=F.precision,E=F.recall)}}catch{}await _.completeTask(n,t.feedback);try{ks.clearSnapshot(n)}catch{}let D=o.linearId,V=D!=null?await Ws("linear",ss()).catch(()=>!1):!1;if(t.md){let F=c?` (${c})`:"",k=null;if(S.length>0){let ge=S.slice(0,20).map(rt=>`\`${rt}\``);k=`### Files Modified (${S.length})
|
|
1545
|
+
${ge.join(", ")}`}let $=null;if(w!==null&&E!==null){let ge=Math.round(w*100),rt=Math.round(E*100);$=`### Context Accuracy
|
|
1477
1546
|
| Metric | Value |
|
|
1478
1547
|
|--------|-------|
|
|
1479
|
-
| Precision | ${
|
|
1480
|
-
| Recall | ${
|
|
1481
|
-
Research is available. Create your implementation plan next.`):M="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(ke("Completed",`${a}${F}`),lt({Duration:c||"unknown",...h?{Variance:h.replace(" | ","")}:{}}),j,E,M,ge([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let F=c?` (${c}${h})`:"";D&&U?f.done(`${a}${F} \u2192 Linear linked (update via MCP)`):f.done(`${a}${F}`),jr("completed"),At("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:m,estimatedMinutes:p,actualMinutes:u,timestamp:J.getTimestamp()}),await zt(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return f.fail(w(s)),{success:!1,error:w(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await $.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await be.getActiveTasks(n);if(o.length===0)return t.md?Rt("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(L(Q("Queue",`${o.length} task${o.length!==1?"s":""}`),Oe(i,!0),ge([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),At("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(w(s)),{success:!1,error:w(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return s.md?Rt("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=J.calculateDuration(new Date(i.startedAt))),await _.pauseTask(o,e);try{await Rs.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(s.md)console.log(L(ke("Task Paused",`**Paused:** ${i.description}`),lt({Reason:e||void 0,"Duration worked":a||void 0}),ge([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),jr("paused"),At("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:J.getTimestamp()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(w(n)),{success:!1,error:w(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return s.md?Rt("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(s.md?console.log(L(ke("Task Resumed",`**Resumed:** ${a.description}`),ge([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),jr("working"),At("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:J.getTimestamp()}),{success:!0,task:a.description}):(s.md?Rt("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(w(n)),{success:!1,error:w(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${w(n)}`):f.fail(w(n)),{success:!1,error:w(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of PT){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let u=rt.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let d=rt.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${d}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let p=je.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(ke("Rule Added",`#${p} [hook] ${a} ${c} \u2192 \`${n}\``),ge([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):f.done(`rule #${p} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:p}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=rt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=rt.getAllWorkflows(t).map(g=>g.name).join(", "),d=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let p='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=je.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(ke("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ge([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=rt.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=rt.getAllWorkflows(t).map(y=>y.name).join(", "),k=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${k}`):f.warn(k),{success:!1,error:k}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),p=a.slice(c[0].length).trim(),[m]=this._parseAction(p);if(!m){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=je.addRule(t,{type:"instruction",command:o,position:u,action:m,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(ke("Instruction Added",`#${d} [instruction] ${u} ${o} \u2192 \`${m}\``),ge([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`instruction #${d} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:d}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!je.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(L(ke("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=je.resetRules(e);return t.md?console.log(L(ke("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let c=je.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return je.updateRule(t,o,{enabled:!1}),s.md?console.log(L(ke("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ge([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=je.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return je.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(ke("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(L(Q("Multiple matches",`${a.length} rules match "${n}"`),Oe(c),ge(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(L(Q("Workflow Help","Manage hooks, gates, and steps for your workflow"),Q("Commands",Oe(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),Q("Natural Language (EN/ES)",Oe(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=je.getRulesForCommand(t,e):o=je.getAllRules(t),o.length===0)return s.md?console.log(L(Q("Workflow Rules","No rules configured"),ge([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let p of i){let m=o.filter(d=>d.command===p);m.length!==0&&a.push(AT(p,m))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(Q(c,u),a.length>0?Up(a.join(`
|
|
1482
|
-
|
|
1483
|
-
`),""):null,
|
|
1484
|
-
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:
|
|
1485
|
-
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(
|
|
1486
|
-
`)))}console.log(L(...i,
|
|
1548
|
+
| Precision | ${ge}% of suggested files were used |
|
|
1549
|
+
| Recall | ${rt}% of modified files were suggested |`}let O=null;try{let{prjctDb:ge}=(ee(),ot(Kr)),rt=ge.getDoc(n,"rpi:current:research"),Ts=ge.getDoc(n,"rpi:current:plan");rt?Ts||(O=`### RPI Phase: Plan Ready
|
|
1550
|
+
Research is available. Create your implementation plan next.`):O="### RPI Phase: Research Complete\nSave your research findings with `prjct compact --md` before planning."}catch{}console.log(L(he("Completed",`${a}${F}`),et({Duration:c||"unknown",...h?{Variance:h.replace(" | ","")}:{}}),k,$,O,ue([{label:"Complete next subtask",command:"prjct done --md"},{label:"Ship when ready",command:"prjct ship --md"}])))}else{let F=c?` (${c}${h})`:"";D&&V?f.done(`${a}${F} \u2192 Linear linked (update via MCP)`):f.done(`${a}${F}`),Tr("completed"),bt("done")}return await this.logToMemory(e,"task_completed",{task:a,duration:c,estimatedPoints:p,estimatedMinutes:d,actualMinutes:u,timestamp:b()}),await Ut(n,"done","after",{projectPath:e,skipRules:t.skipHooks}),{success:!0,task:a,duration:c}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async next(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let n=await M.getProjectId(e);if(!n)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=await we.getActiveTasks(n);if(o.length===0)return t.md?St("empty","queue_empty",[{label:"Add a task",command:'prjct task "description" --md'},{label:"Add a bug",command:'prjct bug "description" --md'}]):f.warn("queue empty"),{success:!0,message:"Queue is empty"};if(t.md){let i=o.map(a=>{let c=a.type?` [${a.type}]`:"",u=a.priority?` ${a.priority}`:"";return`${a.description.replace(/^[\u{1F300}-\u{1F9FF}]\s*/u,"")}${c}${u}`});console.log(L(X("Queue",`${o.length} task${o.length!==1?"s":""}`),Ie(i,!0),ue([{label:"Start top task",command:'prjct task "..." --md'}])))}else f.done(`${o.length} task${o.length!==1?"s":""} queued`),bt("next");return{success:!0,tasks:o,count:o.length}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async pause(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return s.md?St("idle","no_active_task",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no active task to pause"),{success:!0,message:"No active task to pause"};let a="";i.startedAt&&(a=zt(new Date(i.startedAt))),await _.pauseTask(o,e);try{await ks.capture(o,t,{taskDescription:i.description,taskStatus:"paused",sessionId:i.sessionId,activeSubtaskIndex:i.currentSubtaskIndex,subtaskCount:i.subtasks?.length,linearId:i.linearId,startedAt:i.startedAt})}catch{}if(s.md)console.log(L(he("Task Paused",`**Paused:** ${i.description}`),et({Reason:e||void 0,"Duration worked":a||void 0}),ue([{label:"Resume this task",command:"prjct resume --md"},{label:"Start something new",command:'prjct task "..." --md'}])));else{let c=i.description.slice(0,40);f.done(`paused: ${c}${e?` (${e})`:""}`),Tr("paused"),bt("pause")}return await this.logToMemory(t,"task_paused",{task:i.description,reason:e,timestamp:b()}),{success:!0,task:i.description,reason:e}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async resume(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(i)return s.md?St("blocked","task_already_active",[{label:"Continue working",command:"prjct done --md"},{label:"Pause and switch",command:"prjct pause --md"}],{current_task:i.description}):f.warn("already working on a task"),{success:!0,message:`Already working on: ${i.description}`};let a=await _.resumeTask(o);return a?(s.md?console.log(L(he("Task Resumed",`**Resumed:** ${a.description}`),ue([{label:"Continue working, then finish",command:"prjct done --md"}]))):(f.done(`resumed: ${a.description.slice(0,40)}`),Tr("working"),bt("resume")),await this.logToMemory(t,"task_resumed",{task:a.description,timestamp:b()}),{success:!0,task:a.description}):(s.md?St("idle","no_paused_task",[{label:"Start a new task",command:'prjct task "description" --md'}]):f.warn("no paused task to resume"),{success:!0,message:"No paused task found"})}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}async workflow(e=null,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(n){return s.md?console.log(`> Error: ${y(n)}`):f.fail(y(n)),{success:!1,error:y(n)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:n}of WS){let o=t.match(n);if(o){let i=o[0],a=t.slice(i.length).trim(),c=/^(?:add|gate|rm|reset|init|help)\b/i.test(i);return{type:s,args:a,confidence:c?"exact":"fuzzy"}}}return{type:"view",args:t,confidence:"fuzzy"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(n=>n.action.toLowerCase().includes(s)||(n.description?.toLowerCase().includes(s)??!1)||n.command.toLowerCase().includes(s)||String(n.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let n=t.indexOf('"',1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}if(t.startsWith("'")){let n=t.indexOf("'",1);return n===-1?[t.slice(1),""]:[t.slice(1,n),t.slice(n+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[n,o]=this._parseAction(e);if(!n||!o){let p='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),c=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let p='Position must be "before" or "after"';return s.md?console.log(`> ${p}`):f.warn(p),{success:!1,error:p}}let u=Qe.getWorkflow(t,c||"");if(!c||!u||!u.enabled){let m=Qe.getAllWorkflows(t).map(h=>h.name).join(", "),g=`Workflow '${c}' not found. Available: ${m}`;return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let d=Ce.addRule(t,{type:"hook",command:c,position:a,action:n,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(he("Rule Added",`#${d} [hook] ${a} ${c} \u2192 \`${n}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):f.done(`rule #${d} added: [hook] ${a} ${c} \u2192 ${n}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Qe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let p=Qe.getAllWorkflows(t).map(g=>g.name).join(", "),m=`Workflow '${o}' not found. Available: ${p}`;return s.md?console.log(`> ${m}`):f.warn(m),{success:!1,error:m}}let a=e.slice(e.indexOf(o)+o.length).trim(),[c]=this._parseAction(a);if(!c){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):f.warn(d),{success:!1,error:d}}let u=Ce.addRule(t,{type:"gate",command:o,position:"before",action:c,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(he("Gate Added",`#${u} [gate] before ${o} \u2192 \`${c}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):f.done(`gate #${u} added: before ${o} \u2192 ${c}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=Qe.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=Qe.getAllWorkflows(t).map(w=>w.name).join(", "),S=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${S}`):f.warn(S),{success:!1,error:S}}let a=e.slice(e.indexOf(o)+o.length).trim(),c=a.match(/^(before|after)\s+/i);if(!c){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let u=c[1].toLowerCase(),d=a.slice(c[0].length).trim(),[p]=this._parseAction(d);if(!p){let g='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${g}`):f.warn(g),{success:!1,error:g}}let m=Ce.addRule(t,{type:"instruction",command:o,position:u,action:p,description:null,enabled:!0,timeoutMs:0,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(L(he("Instruction Added",`#${m} [instruction] ${u} ${o} \u2192 \`${p}\``),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${m} --md`}]))):f.done(`instruction #${m} added: ${u} ${o} \u2192 ${p}`),{success:!0,ruleId:m}}async _workflowRm(e,t,s){let n=parseInt(e.trim(),10);if(Number.isNaN(n)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}if(!Ce.removeRule(t,n)){let i=`Rule #${n} not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return s.md?console.log(L(he("Rule Removed",`Removed rule #${n}`))):f.done(`removed rule #${n}`),{success:!0}}async _workflowReset(e,t){let s=Ce.resetRules(e);return t.md?console.log(L(he("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):f.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let n=e.trim(),o=parseInt(n,10);if(!Number.isNaN(o)){let c=Ce.getRuleById(t,o);if(!c){let u=`Rule #${o} not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(!c.enabled){let u=`Rule #${o} is already disabled`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!0,message:u}}return Ce.updateRule(t,o,{enabled:!1}),s.md?console.log(L(he("Rule Disabled",`#${o} [${c.type}] ${c.action}`),ue([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):f.done(`disabled rule #${o}: ${c.action}`),{success:!0,ruleId:o}}let i=Ce.getAllRules(t),a=this._searchRules(i,n);if(a.length===0){let c=`No rules matching "${n}"`;return s.md?console.log(`> ${c}`):f.warn(c),{success:!1,error:c}}if(a.length===1){let c=a[0];return Ce.updateRule(t,c.id,{enabled:!1}),s.md?console.log(L(he("Rule Disabled",`#${c.id} [${c.type}] ${c.action}`))):f.done(`disabled rule #${c.id}: ${c.action}`),{success:!0,ruleId:c.id}}if(s.md){let c=a.map(u=>`#${u.id} [${u.type}] ${u.position} ${u.command} -> \`${u.action}\``);console.log(L(X("Multiple matches",`${a.length} rules match "${n}"`),Ie(c),ue(a.map(u=>({label:`Disable #${u.id}`,command:`prjct workflow disable ${u.id} --md`})))))}else{f.warn(`${a.length} rules match "${n}" \u2014 specify an ID:`);for(let c of a)console.log(` #${c.id} [${c.type}] ${c.position} ${c.command} -> ${c.action}`)}return{success:!0,matches:a.map(c=>c.id)}}async _workflowHelp(e){return e.md?console.log(L(X("Workflow Help","Manage hooks, gates, and steps for your workflow"),X("Commands",Ie(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),X("Natural Language (EN/ES)",Ie(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let n=["task","done","ship","sync"],o;if(e&&n.includes(e)?o=Ce.getRulesForCommand(t,e):o=Ce.getAllRules(t),o.length===0)return s.md?console.log(L(X("Workflow Rules","No rules configured"),ue([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(f.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:n,a=[];for(let d of i){let p=o.filter(m=>m.command===d);p.length!==0&&a.push(zS(d,p))}let c=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(L(X(c,u),a.length>0?km(a.join(`
|
|
1551
|
+
|
|
1552
|
+
`),""):null,ue([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let i=e?`WORKFLOW RULES: ${e.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(i),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let a of o){let c=a.enabled?"":" (disabled)";console.log(` #${a.id} [${a.type}] ${a.position.padEnd(6)} ${a.command.padEnd(5)} \u2192 ${a.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o}}async _workflowInit(e,t,s){let n=Ce.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(n.length>0){let u=`Ship workflow already has ${n.length} rule${n.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let o=await Yo(t),i=0,a=[],c=Ce.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:i++,createdAt:new Date().toISOString()});if(a.push(`#${c} [gate] prevent main branch`),o.lint){let u=Ce.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] lint \u2192 ${o.lint.command}`)}if(o.test){let u=Ce.addRule(e,{type:"step",command:"ship",position:"before",action:`${o.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:i++,createdAt:new Date().toISOString()});a.push(`#${u} [step] test \u2192 ${o.test.command}`)}if(s.md)console.log(L(he("Workflow Initialized",`Added ${a.length} default ship rules`),Ie(a),ue([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{f.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,n){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!Qe.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Qe.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}if(Qe.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return n.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}try{let u=Qe.createWorkflow(t,{name:i,description:a}),d=await kl.generateWorkflowTemplate(i,a);if(!d.success){Qe.deleteWorkflow(t,i);let p=`Failed to generate template: ${d.error}`;return n.md?console.log(`> Error: ${p}`):f.fail(p),{success:!1,error:p}}return n.md?console.log(L(he("Workflow Created",`Created workflow: ${i}`),X("Description",a),X("Template",`Installed at ${d.path}`),ue([{label:"Add rules",command:`prjct workflow add "action" before ${i} --md`},{label:"View workflow",command:`prjct workflow ${i} --md`},{label:"Run workflow",command:`p. ${i}`}]))):(f.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
|
|
1553
|
+
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return n.md?console.log(`> Error: ${d}`):f.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=Qe.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):f.warn(i),{success:!0,workflows:[]}}let n=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(n.length>0){let a=n.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(X("Built-in Workflows",a.join(`
|
|
1554
|
+
`)))}if(o.length>0){let a=o.map(c=>`- **${c.name}** \u2014 ${c.description}`);i.push(X("Custom Workflows",a.join(`
|
|
1555
|
+
`)))}console.log(L(...i,ue([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(f.done(`${s.length} workflow${s.length!==1?"s":""}`),n.length>0){console.log(`
|
|
1487
1556
|
Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1488
|
-
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!
|
|
1489
|
-
`)}l(
|
|
1490
|
-
`)}catch{return null}}l(
|
|
1491
|
-
`)}l(
|
|
1557
|
+
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let n=e.trim();if(!n){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):f.warn(o),{success:!1,error:o}}try{if(!Qe.deleteWorkflow(t,n)){let i=`Workflow '${n}' not found`;return s.md?console.log(`> ${i}`):f.warn(i),{success:!1,error:i}}return await kl.deleteWorkflowTemplate(n),s.md?console.log(L(he("Workflow Deleted",`Deleted workflow: ${n}`))):f.done(`deleted workflow: ${n}`),{success:!0}}catch(o){let i=y(o);return s.md?console.log(`> Error: ${i}`):f.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let a=Qe.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):f.warn(u),{success:!1,error:u}}let c=await Ut(o,i,"before",{projectPath:t});if(!c.success){if(s.md)St("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(f.fail("Workflow gates failed"),c.gatesFailed)for(let u of c.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:c.gatesFailed}}return await Ut(o,i,"after",{projectPath:t}),s.md?console.log(L(he(`Workflow: ${i}`,a.description||""),ue([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):f.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(n){let o=y(n);return s.md?console.log(`> Error: ${o}`):f.fail(o),{success:!1,error:o}}}async sessions(e=process.cwd(),t={}){try{if(t.cleanup){let n=await ks.cleanup();return t.md?console.log(he("Cleanup",`Removed ${n} stale snapshot${n!==1?"s":""}`)):f.done(`cleaned ${n} stale snapshot${n!==1?"s":""}`),{success:!0,cleaned:n}}let s=await ks.listAllSnapshots();if(s.length===0)return t.md?St("empty","no_sessions",[{label:"Start a task",command:'prjct task "description" --md'}]):f.warn("no recent sessions found"),{success:!0,message:"No recent sessions"};if(t.md){let n=s.map(o=>{let i=it(Date.now()-new Date(o.timestamp).getTime()),a=o.projectName||o.projectId.slice(0,8),c=o.subtaskCount&&o.activeSubtaskIndex!==void 0?` (${o.activeSubtaskIndex+1}/${o.subtaskCount})`:"";return`[${o.taskStatus}] **${a}** \u2014 ${o.taskDescription}${c} (${i} ago)`});console.log(L(X("Recent Sessions",`${s.length} session${s.length!==1?"s":""} across projects`),Ie(n),ue([{label:"Resume a session",command:"prjct resume --md"},{label:"Clean old sessions",command:"prjct sessions --cleanup --md"}])))}else{f.done(`${s.length} recent session${s.length!==1?"s":""}`);for(let n of s){let o=it(Date.now()-new Date(n.timestamp).getTime()),i=n.projectName||n.projectId.slice(0,8);console.log(` [${n.taskStatus}] ${i} \u2014 ${n.taskDescription} (${o} ago)`)}}return{success:!0,snapshots:s,count:s.length}}catch(s){return f.fail(y(s)),{success:!1,error:y(s)}}}async tokens(e="",t=process.cwd(),s={}){try{let n=await this.ensureProjectInit(t);if(!n.success)return n;let o=await M.getProjectId(t);if(!o)return f.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=await _.getCurrentTask(o);if(!i)return s.md?St("idle","no_active_task",[{label:"Start a task first",command:'prjct task "description" --md'}]):f.warn("no active task \u2014 start one first to track tokens"),{success:!1,error:"No active task"};let a=e.trim().split(/\s+/),c=parseInt(a[0],10),u=parseInt(a[1],10);if(Number.isNaN(c)||Number.isNaN(u)){let p="Usage: prjct tokens <input_tokens> <output_tokens>";return s.md?console.log(L(X("Tokens",p))):f.fail(p),{success:!1,error:p}}let d=await _.addTokens(o,c,u);return d?(s.md?console.log(L(X("Tokens Recorded",`+${c.toLocaleString()} in / +${u.toLocaleString()} out`),et({"Total In":d.tokensIn.toLocaleString(),"Total Out":d.tokensOut.toLocaleString(),Total:(d.tokensIn+d.tokensOut).toLocaleString(),Task:i.description}))):f.done(`tokens recorded: ${d.tokensIn.toLocaleString()} in / ${d.tokensOut.toLocaleString()} out`),{success:!0,tokensIn:d.tokensIn,tokensOut:d.tokensOut}):{success:!1,error:"Failed to record tokens"}}catch(n){return f.fail(y(n)),{success:!1,error:y(n)}}}};function VS(){return["### Efficiency","- Be concise. No preamble, no filler.","- **Use sub-agents (Agent tool) for exploration that produces >5 file reads.** Sub-agents isolate context and prevent the main conversation from bloating.","- Prefer `file:line` references over dumping full file contents.","- When context grows large, use `prjct compact --md` to create a truth snapshot."].join(`
|
|
1558
|
+
`)}l(VS,"buildEfficiencySection");function BS(r){try{let{prjctDb:e}=(ee(),ot(Kr)),t=e.getDoc(r,"rpi:current:research"),s=e.getDoc(r,"rpi:current:plan"),n;t?s?n={phase:"implement",researchDoc:t,planDoc:s}:n={phase:"plan",researchDoc:t}:n={phase:"research"};let o=["### RPI Phase"];switch(n.phase){case"research":o.push("**Phase: RESEARCH** \u2014 Explore the codebase first. Use the **Agent tool** (sub-agents) for broad exploration.","Produce a truth snapshot: exact files + lines, function call chains, test locations.","Save findings with `prjct compact --md` when done exploring.");break;case"plan":o.push("**Phase: PLAN** \u2014 Create an implementation plan with real code snippets.","Reference exact files and line numbers from research.","Use sub-agents to verify assumptions if needed."),n.researchDoc&&o.push("","<research-context>",n.researchDoc,"</research-context>");break;case"implement":if(o.push("**Phase: IMPLEMENT** \u2014 Execute the plan. Minimal exploration.","Work only with the scoped files. Avoid reading new files unless absolutely necessary."),n.planDoc){let i=/`([a-zA-Z0-9_\-./]+\.[a-zA-Z]{1,6})`/g,a=new Set;for(let c of n.planDoc.matchAll(i))a.add(c[1]);a.size>0&&o.push(`**Scoped Files**: ${[...a].slice(0,20).map(c=>`\`${c}\``).join(", ")}`)}break}return o.join(`
|
|
1559
|
+
`)}catch{return null}}l(BS,"buildRpiSection");function Sg(r){if(r<60)return`${r}m`;let e=Math.floor(r/60),t=r%60;return t>0?`${e}h ${t}m`:`${e}h`}l(Sg,"formatMinutesToDuration");async function JS(r){try{let e=GS.join(r,"analysis","repo-analysis.json"),t=await HS.readFile(e,"utf-8");return JSON.parse(t)}catch(e){return A(e),null}}l(JS,"loadRepoAnalysis");function zS(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),s=e.filter(m=>m.type==="instruction"&&m.position==="before"),n=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),c=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=l((m,g,h)=>{let S=g.map(V=>` ${V.enabled?h:"o"} #${V.id} ${V.action}`),w=[m,...S],D=Math.max(...w.map(V=>V.length))+2;u.push(`+${"-".repeat(D)}+`);for(let V of w)u.push(`| ${V.padEnd(D-1)}|`);u.push(`+${"-".repeat(D)}+`)},"drawBox"),p=l(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),p(u)),n.length>0&&(d("HOOKS (before)",n,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),c.length>0&&(p(u),d("STEPS (after)",c,">")),u.join(`
|
|
1560
|
+
`)}l(zS,"buildFlowDiagram");async function qS(r,e){let{execSync:t}=await import("node:child_process"),s=new Set,n={cwd:r,encoding:"utf-8"};try{let o=t(`git log --since="${e}" --name-only --pretty=format:""`,n);for(let i of o.split(`
|
|
1492
1561
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --cached --name-only",n);for(let i of o.split(`
|
|
1493
1562
|
`)){let a=i.trim();a&&s.add(a)}}catch{}try{let o=t("git diff --name-only",n);for(let i of o.split(`
|
|
1494
|
-
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(DT,"getFilesModifiedSinceTaskStart");function jT(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}l(jT,"formatVariance");var Yn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Xn,this.planning=new sn,this.shipping=new Wn,this.analytics=new _n,this.performanceCmds=new Ln,this.maintenance=new Nn,this.analysis=new on,this.setupCmds=new Un,this.updateCmds=new zn,this.velocityCmds=new Jn,this.contextCmds=new an,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},X1=new Yn;pi();var yf={core:{title:"Core Workflow",description:"13 essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},wf=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];di();os();Te();W();K();dt();import{execSync as xi}from"node:child_process";import St from"node:fs/promises";import IT from"node:os";import ps from"node:path";import $T from"node:readline";import Pe from"chalk";var Ri="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Wr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Sf(r){let e=0;try{let t=await St.readdir(r,{withFileTypes:!0});for(let s of t){let n=ps.join(r,s.name);if(s.isDirectory())e+=await Sf(n);else try{let o=await St.stat(n);e+=o.size}catch{}}}catch{}return e}l(Sf,"getDirectorySize");function kf(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(kf,"formatSize");async function MT(r){try{return(await St.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(MT,"countDirectoryItems");function _T(){let r={homebrew:!1,npm:!1};try{xi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{xi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(_T,"detectInstallation");async function OT(){let r=[],e=Iu(),t=A.getGlobalBasePath(),s=await P(t),n=s?await MT(ps.join(t,"projects")):0,o=s?await Sf(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=ps.join(e.claude.config,"CLAUDE.md"),a=await P(i),c=!1;if(a)try{let D=await St.readFile(i,"utf-8");c=D.includes(Ri)&&D.includes(Wr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,p=await P(u);r.push({path:u,type:"file",description:"Claude router",exists:p});let m=ps.join(e.claude.config,"prjct-statusline.sh"),d=await P(m);r.push({path:m,type:"file",description:"Status line script",exists:d});let g=e.gemini.router,h=await P(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let k=ps.join(e.gemini.config,"GEMINI.md"),y=await P(k),v=!1;if(y)try{let D=await St.readFile(k,"utf-8");v=D.includes(Ri)&&D.includes(Wr)}catch{}return y&&v&&r.push({path:k,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(OT,"gatherUninstallItems");async function NT(r){try{let e=await St.readFile(r,"utf-8");if(!e.includes(Ri)||!e.includes(Wr))return!1;let t=e.indexOf(Ri),s=e.indexOf(Wr)+Wr.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1495
|
-
|
|
1496
|
-
`).trim(),!n||n.trim().length===0?await
|
|
1497
|
-
`,"utf-8"),!0}catch{return!1}}l(
|
|
1498
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(
|
|
1499
|
-
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(
|
|
1500
|
-
${a.length} errors:`));for(let c of a)console.log(Pe.red(` - ${c}`))}return console.log(""),console.log(Pe.green("prjct has been uninstalled.")),console.log(Pe.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}l(HT,"uninstall");var Ai=class extends Ce{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return HT(e,t)}};var As=new Xn,Di=new sn,GT=new Wn,Tf=new _n,WT=new Ln,Ds=new Nn,Qn=new on,Vr=new Un,VT=new an,BT=new Jn,zT=new Ai,JT=new zn;function qT(){for(let[r,e]of Object.entries(yf))G.registerCategory(r,e)}l(qT,"registerCategories");function KT(){if(G.has("work"))return;qT();let r=l(e=>wf.find(t=>t.name===e),"getMeta");G.registerMethod("task",As,"now",r("task")),G.registerMethod("done",As,"done",r("done")),G.registerMethod("next",As,"next",r("next")),G.registerMethod("pause",As,"pause",r("pause")),G.registerMethod("resume",As,"resume",r("resume")),G.registerMethod("workflow",As,"workflow",r("workflow")),G.registerMethod("tokens",As,"tokens",r("tokens")),G.registerMethod("sessions",As,"sessions",r("sessions")),G.registerMethod("init",Di,"init",r("init")),G.registerMethod("bug",Di,"bug",r("bug")),G.registerMethod("idea",Di,"idea",r("idea")),G.registerMethod("spec",Di,"spec",r("spec")),G.registerMethod("ship",GT,"ship",r("ship")),G.registerMethod("dash",Tf,"dash",r("dash")),G.registerMethod("help",Tf,"help",r("help")),G.registerMethod("perf",WT,"perf",r("perf")),G.registerMethod("velocity",BT,"velocity",r("velocity")),G.registerMethod("cleanup",Ds,"cleanup",r("cleanup")),G.registerMethod("cleanup-projects",Ds,"cleanupProjects",r("cleanup-projects")),G.registerMethod("design",Ds,"design",r("design")),G.registerMethod("recover",Ds,"recover",r("recover")),G.registerMethod("undo",Ds,"undo",r("undo")),G.registerMethod("redo",Ds,"redo",r("redo")),G.registerMethod("history",Ds,"history",r("history")),G.registerMethod("enrich",Ds,"enrich",r("enrich")),G.registerMethod("analyze",Qn,"analyze",r("analyze")),G.registerMethod("sync",Qn,"sync",r("sync")),G.registerMethod("stats",Qn,"stats",r("stats")),G.registerMethod("status",Qn,"status",r("status")),G.registerMethod("seal",Qn,"seal",r("seal")),G.registerMethod("verify",Qn,"verify",r("verify")),G.registerMethod("start",Vr,"start",r("start")),G.registerMethod("setup",Vr,"setup",r("setup")),G.registerMethod("login",Vr,"login",r("login")),G.registerMethod("logout",Vr,"logout",r("logout")),G.registerMethod("auth",Vr,"auth",r("auth")),G.registerMethod("uninstall",zT,"uninstall",r("uninstall")),G.registerMethod("update",JT,"update",r("update")),G.registerMethod("context",VT,"context",r("context"))}l(KT,"registerAllCommands");KT();Et();ar();Ct();import{Hono as iv}from"hono";import{cors as av}from"hono/cors";import{logger as cv}from"hono/logger";Te();re();ks();Xt();zs();Pt();W();ns();import XT from"node:fs/promises";import YT from"node:path";import{Hono as QT}from"hono";function ZT(r){return A.getGlobalProjectPath(r)}l(ZT,"getProjectDataPath");function vf(r,e){let t=new QT,s=ZT(r);return t.get("/state",async n=>{let o=await _.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await be.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Ge.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=C.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await tt.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([_.read(r),be.read(r),Ge.read(r),tt.read(r)]),u=C.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();return await _.write(r,o),n.json({success:!0})}catch(o){return n.json({success:!1,error:String(o)},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=YT.join(s,"context",`${o}.md`),c=await XT.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return R(a)||V.error(`Context read error: ${w(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(vf,"createRoutes");Te();re();ks();Xt();zs();Pt();import Zn from"node:fs/promises";import ev from"node:path";import{Hono as tv}from"hono";var sv=A.getGlobalBasePath(),er=ev.join(sv,"projects");function ji(r){return C.getDoc(r,"project")}l(ji,"getProjectConfig");async function Yl(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}l(Yl,"calculateDuration");function Cf(){let r=new tv;return r.get("/projects",async e=>{try{await Zn.mkdir(er,{recursive:!0});let s=(await Zn.readdir(er,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=ji(o),a=await _.read(o),c=await be.read(o),u=await Ge.read(o),p=await tt.read(o),m=a?.currentTask,d=await Yl(m?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:m?{...m,duration:d}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:p?.shipped?.length||0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch(t){return e.json({projects:[],error:String(t)},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(ji(t)),_.read(t),be.read(t),Ge.read(t),tt.read(t)]),c=C.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Yl(n.currentTask.startedAt));let u=new Date,p=new Date(u.getFullYear(),u.getMonth(),u.getDate()),m=new Date(p);m.setDate(m.getDate()-m.getDay());let d=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=p)?.length||0,g=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=m)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:d,tasksThisWeek:g,queueCount:o?.tasks?.filter(h=>!h.completed)?.length||0,ideasCount:i?.ideas?.filter(h=>h.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch(s){return e.json({error:String(s)},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await _.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let n=(await e.req.json().catch(()=>({}))).reason,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await _.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n)return e.json({success:!1,error:"taskId required"},400);let[o,i]=await Promise.all([_.read(t),be.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(p=>p.id===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n)return e.json({success:!1,error:"text required"},400);let a=await Ge.addIdea(t,n,{priority:o||"medium",tags:i});return e.json({success:!0,idea:a,message:`Captured: ${n.slice(0,50)}...`})}catch(s){return e.json({success:!1,error:String(s)},500)}}),r.get("/stats/global",async e=>{try{await Zn.mkdir(er,{recursive:!0});let s=(await Zn.readdir(er,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await _.read(c),p=await be.read(c),m=await Ge.read(c),d=await tt.read(c);u?.currentTask&&a++,n+=p?.tasks?.filter(g=>!g.completed)?.length||0,o+=m?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=d?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await Zn.mkdir(er,{recursive:!0});let n=(await Zn.readdir(er,{withFileTypes:!0})).filter(p=>p.isDirectory()).map(p=>p.name),o=null;if(t)for(let p of n){let m=ji(p),d=m?.repoPath||m?.path;if(d&&t.startsWith(d)){o=p;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let p of u){let m=await _.read(p),d=ji(p);if(m?.currentTask){i={id:p,name:d?.name||p,path:d?.repoPath||d?.path},a={...m.currentTask,duration:await Yl(m.currentTask.startedAt)};break}m?.previousTask&&!c&&(i={id:p,name:d?.name||p,path:d?.repoPath||d?.path},c=m.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch(t){return e.json({error:String(t)},500)}}),r}l(Cf,"createExtendedRoutes");import{streamSSE as nv}from"hono/streaming";var Pf=3600*1e3,rv=300*1e3,ov=3e4;function Ef(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Pf&&t(i)},rv),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return nv(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,p={id:a,connectedAt:c,send:l((g,h)=>{i.writeSSE({event:g,data:JSON.stringify(h)})},"send"),close:l(()=>{t(a)},"close")},m=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},ov),d=setTimeout(()=>{t(a)},Pf);typeof m=="object"&&"unref"in m&&m.unref(),typeof d=="object"&&"unref"in d&&d.unref(),r.set(a,{client:p,heartbeatInterval:m,ttlTimeout:d,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}l(Ef,"createSSEManager");function xf(r){let e=new iv,t=Ef();r.enableCors!==!1&&e.use("*",av({origin:"*",allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization"]})),r.enableLogging!==!1&&e.use("*",cv()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:Ae,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=vf(r.projectId,r.projectPath);e.route("/api",s);let n=Cf();e.route("/api",n),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(Os())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${Os()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(xf,"createServer");var Rf=3478;re();Hl();var uv=50,tr=null,Br=null,he=null,Ee=null;async function Af(r){let e=Le.socket(),t=Le.pid(),s=Le.runDir();if(Fe.mkdirSync(s,{recursive:!0}),Fe.existsSync(t)){let i=parseInt(Fe.readFileSync(t,"utf-8").trim(),10);fv(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Fe.unlinkSync(t)}Fe.existsSync(e)&&Fe.unlinkSync(e),wv();let n=hv(),o=null;if(n)try{o=Fe.statSync(n).mtimeMs}catch{}if(Ee={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:Qg,idleTimer:null,entryPath:n,entryMtime:o},he=new Yn,tr=lv(i=>dv(i)),tr.listen(e,()=>{Fe.chmodSync(e,384),Fe.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Df()}),tr.on("error",i=>{console.error("Daemon socket error:",i.message),sr(1)}),!r.noHttp)try{let i=process.cwd(),a=await $.getProjectId(i);if(a){let c=r.port||Rf;Br=xf({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Br.start()}}catch{}if(process.on("SIGTERM",()=>sr(0)),process.on("SIGINT",()=>sr(0)),process.on("SIGHUP",()=>{he=new Yn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l(Af,"startDaemon");function dv(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>Zg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Vn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1501
|
-
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await
|
|
1563
|
+
`)){let a=i.trim();a&&s.add(a)}}catch{}return[...s]}l(qS,"getFilesModifiedSinceTaskStart");function KS(r){let e=r>=0?"+":"-",t=Math.abs(r);if(t>=60){let s=Math.floor(t/60),n=t%60;return n>0?`${e}${s}h ${n}m`:`${e}${s}h`}return`${e}${t}m`}l(KS,"formatVariance");var Jn=class{static{l(this,"PrjctCommands")}workflow;planning;shipping;analytics;performanceCmds;maintenance;analysis;setupCmds;updateCmds;velocityCmds;contextCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new Bn,this.planning=new Js,this.shipping=new Ln,this.analytics=new Dn,this.performanceCmds=new $n,this.maintenance=new In,this.analysis=new Ks,this.setupCmds=new _n,this.updateCmds=new Hn,this.velocityCmds=new Gn,this.contextCmds=new Xs,this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),s={}){return this.workflow.now(e,t,s)}async done(e=process.cwd(),t={}){return this.workflow.done(e,t)}async next(e=process.cwd(),t={}){return this.workflow.next(e,t)}async pause(e="",t=process.cwd(),s={}){return this.workflow.pause(e,t,s)}async resume(e=null,t=process.cwd(),s={}){return this.workflow.resume(e,t,s)}async workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async sessions(e=process.cwd(),t={}){return this.workflow.sessions(e,t)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async bug(e,t=process.cwd(),s={}){return this.planning.bug(e,t,s)}async idea(e,t=process.cwd(),s={}){return this.planning.idea(e,t,s)}async spec(e=null,t=process.cwd()){return this.planning.spec(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(e,t,{...s})}async dash(e="default",t=process.cwd(),s={}){return this.analytics.dash(e,t,s)}async help(e="",t=process.cwd()){return this.analytics.help(e,t)}async perf(e="7",t=process.cwd()){return this.performanceCmds.perf(e,t)}async velocity(e="0",t=process.cwd()){return this.velocityCmds.velocity(e,t)}async cleanup(e={},t=process.cwd()){return this.maintenance.cleanup(e,t)}async cleanupProjects(e={}){return this.maintenance.cleanupProjects(e)}async design(e=null,t={},s=process.cwd()){return this.maintenance.design(e,t,s)}async recover(e=process.cwd()){return this.maintenance.recover(e)}async undo(e=process.cwd()){return this.maintenance.undo(e)}async redo(e=process.cwd()){return this.maintenance.redo(e)}async history(e=process.cwd()){return this.maintenance.history(e)}async enrich(e=null,t=process.cwd(),s={}){return this.maintenance.enrich(e,t,s)}async analyze(e={},t=process.cwd()){return this.analysis.analyze(e,t)}async sync(e=process.cwd(),t={}){return this.analysis.sync(e,t)}async stats(e=process.cwd(),t={}){return this.analysis.stats(e,t)}async status(e=process.cwd(),t={}){return this.analysis.status(e,t)}async diff(e=process.cwd(),t={}){return this.analysis.diff(e,t)}async seal(e=process.cwd(),t={}){return this.analysis.seal(e,t)}async rollback(e=process.cwd(),t={}){return this.analysis.rollback(e,t)}async verify(e=process.cwd(),t={}){return this.analysis.verify(e,t)}async analysisPayload(e=process.cwd(),t={}){return this.analysis.analysisPayload(e,t)}async saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async getLlmAnalysis(e=process.cwd(),t={}){return this.analysis.getLlmAnalysis(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async auth(e=null,t={}){return this.setupCmds.auth(e,t)}async login(e={}){return this.setupCmds.login(e)}async logout(){return this.setupCmds.logout()}async start(){return this.setupCmds.start()}async setup(e={}){return this.setupCmds.setup(e)}async update(e={},t=process.cwd()){return this.updateCmds.update(e,t)}async installStatusLine(){return this.setupCmds.installStatusLine()}showAsciiArt(){this.setupCmds.showAsciiArt()}async initializeAgent(){return this.workflow.initializeAgent()}async ensureProjectInit(e){return this.workflow.ensureProjectInit(e)}async ensureAuthor(){return this.workflow.ensureAuthor()}async getGlobalProjectPath(e){return this.workflow.getGlobalProjectPath(e)}async logToMemory(e,t,s){return this.workflow.logToMemory(e,t,s)}},$F=new Jn;ti();var bg={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}},Tg=[{name:"init",group:"core",description:"Deep project analysis and initialization",usage:{claude:'/p:init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"idea",group:"core",description:"Transform ideas into complete technical architectures",usage:{claude:'/p:idea "build a CRM"',terminal:'prjct idea "build a CRM"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Simple ideas -> Quick capture","Complex ideas -> Full architecture"]},{name:"task",group:"core",description:"Start task with agentic classification and 7-phase workflow",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Agentic type classification","7-phase workflow","Git branch management","Task breakdown"]},{name:"spec",group:"core",description:"Create detailed specifications for complex features",usage:{claude:'/p:spec "Dark Mode"',terminal:'prjct spec "Dark Mode"'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"pause",group:"core",description:"Pause active task to handle interruption",usage:{claude:'/p:pause ["reason"]',terminal:'prjct pause ["reason"]'},params:"[reason]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,blockingRules:{check:"Active task exists",message:"No active task to pause"}},{name:"resume",group:"core",description:"Resume paused task or recover abandoned session",usage:{claude:"/p:resume",terminal:"prjct resume"},params:"[task_id]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"next",group:"core",description:"Show priority queue or roadmap view",usage:{claude:"/p:next",terminal:"prjct next"},params:"[roadmap]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"done",group:"core",description:"Mark current task as complete",usage:{claude:"/p:done",terminal:"prjct done"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"ship",group:"core",description:"Commit, push, and celebrate shipped feature",usage:{claude:'/p:ship "feature"',terminal:'prjct ship "feature"'},params:"<feature>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"bug",group:"core",description:"Report and track bugs with priority",usage:{claude:'/p:bug "description"',terminal:'prjct bug "description"'},params:"<description>",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"dash",group:"core",description:"Unified dashboard - status, progress, and roadmap",usage:{claude:"/p:dash [view]",terminal:"prjct dash [view]"},params:"[week|month|roadmap|compact]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"stats",group:"core",description:"Value dashboard - token savings, performance, and impact",usage:{claude:"/p:stats",terminal:"prjct stats"},params:"[--json] [--export]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Token savings tracking","Compression metrics","Cost estimates","30-day trends"]},{name:"sync",group:"core",description:"Sync project state and update workflow agents",usage:{claude:"/p:sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"perf",group:"core",description:"Performance dashboard - startup, memory, context, and handoff metrics",usage:{claude:"/p:perf",terminal:"prjct perf [days]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Startup time tracking","Memory usage snapshots","Context correctness rate","Subtask handoff rate","Command duration breakdown"]},{name:"velocity",group:"core",description:"Sprint-based velocity dashboard with trend detection and projections",usage:{claude:"/p:velocity",terminal:"prjct velocity [backlogPoints]"},params:"[backlogPoints]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Sprint-by-sprint velocity breakdown","Trend detection (improving/stable/declining)","Estimation accuracy tracking","Over/under estimation pattern detection","Completion projections for backlog"]},{name:"tokens",group:"core",description:"Record token usage (input + output) on the active task",usage:{claude:"/p:tokens",terminal:"prjct tokens <in> <out>"},params:"<input_tokens> <output_tokens>",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Accumulates tokens per task","Persisted to task history on completion","Enables cost comparison across tasks"]},{name:"sessions",group:"core",description:"Show recent sessions across all projects with resume context",usage:{claude:"/p:sessions",terminal:"prjct sessions [--cleanup]"},params:"[--cleanup]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!0,features:["Cross-project session listing","Resume context with LLM hints","Auto-cleanup of stale snapshots"]},{name:"suggest",group:"core",description:"Smart recommendations based on project state",usage:{claude:"/p:suggest",terminal:"prjct suggest"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"status",group:"core",description:"Check if CLAUDE.md context is stale and needs resync",usage:{claude:"/p:status",terminal:"prjct status"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares current HEAD with last sync commit","Counts commits and days since sync","Detects significant file changes","Configurable staleness thresholds"]},{name:"diff",group:"core",description:"Show diff between draft and sealed analysis runs",usage:{claude:"/p:diff",terminal:"prjct diff"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Compares draft vs sealed analysis field-by-field","Shows languages, frameworks, patterns, file count changes","Markdown and JSON output modes"]},{name:"seal",group:"core",description:"Seal the current draft analysis with a commit-hash signature",usage:{claude:"/p:seal",terminal:"prjct seal"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Locks draft analysis with SHA-256 signature","Only sealed analysis feeds task context","Detects staleness when HEAD moves past sealed commit"]},{name:"rollback",group:"core",description:"Rollback to the previous sealed analysis version",usage:{claude:"/p:rollback",terminal:"prjct rollback"},params:"[--json] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Restores previous sealed version as active","Current sealed moves to draft (recoverable)","One level of rollback supported"]},{name:"verify",group:"core",description:"Verify integrity of sealed analysis",usage:{claude:"/p:verify",terminal:"prjct verify"},params:"[--json]",implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!0,features:["Recomputes SHA-256 signature and compares","Detects if sealed analysis was modified"]},{name:"help",group:"core",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"design",group:"optional",description:"Design system architecture, APIs, and components",usage:{claude:"/p:design [target]",terminal:"prjct design [target]"},params:"[target] --type architecture|api|component",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup",group:"optional",description:"Clean up temp files and old entries",usage:{claude:"/p:cleanup",terminal:"prjct cleanup"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"cleanup-projects",group:"optional",description:"Remove stale/test project directories",usage:{claude:"/p:cleanup-projects",terminal:"prjct cleanup-projects [--dry-run]"},params:"[--dry-run] [--md]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0},{name:"analyze",group:"optional",description:"Analyze repository and sync tasks",usage:{claude:"/p:analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"enrich",group:"optional",description:"Build enrichment context for an issue or request",usage:{claude:'/p:enrich "<issue-or-description>"',terminal:'prjct enrich "<input>"'},params:"<issue_or_description>",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"undo",group:"optional",description:"Revert to previous snapshot",usage:{claude:"/p:undo",terminal:"prjct undo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Git-based snapshots","Preserves redo history"]},{name:"redo",group:"optional",description:"Redo previously undone changes",usage:{claude:"/p:redo",terminal:"prjct redo"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"history",group:"optional",description:"View snapshot history",usage:{claude:"/p:history",terminal:"prjct history"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"recover",group:"optional",description:"Recover abandoned session with context",usage:{claude:"/p:recover",terminal:"prjct recover"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"git",group:"optional",description:"Smart git operations with context",usage:{claude:"/p:git [op]",terminal:"prjct git [op]"},params:"[operation]",implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"test",group:"optional",description:"Run tests with auto-fix",usage:{claude:"/p:test",terminal:"prjct test"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"workflow",group:"optional",description:"Configure workflow hooks via natural language",usage:{claude:'/p:workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"linear",group:"optional",description:"Linear integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:linear [command]",terminal:"prjct linear [command]"},params:"[setup|status|sync|list|get|create|update|start|done|comment|teams|projects]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"jira",group:"optional",description:"Jira integration via MCP (setup/status + delegated operations)",usage:{claude:"/p:jira [command]",terminal:"prjct jira [command]"},params:"[setup|status|sync|list|get|create|update|start|done|transition|comment|projects|boards]",implemented:!0,hasTemplate:!0,requiresProject:!1,isOptional:!0,requiresLlm:!0},{name:"start",group:"setup",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",description:"Reconfigure editor installations",usage:{claude:"/p:setup",terminal:"prjct setup"},params:"[--force] [--editor <name>]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"migrate",group:"setup",description:"Migrate project to UUID format + sync",usage:{claude:"/p:migrate",terminal:null},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0},{name:"login",group:"setup",description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login [--url <webUrl>]"},params:"[--url <webUrl>]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",description:"Manage cloud authentication",usage:{claude:"/p:auth [action]",terminal:"prjct auth [action]"},params:"[login|logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"update",group:"setup",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]}];ei();Yt();fe();H();J();Dt();import{execSync as fi}from"node:child_process";import pt from"node:fs/promises";import XS from"node:os";import rs from"node:path";import YS from"node:readline";import be from"chalk";var hi="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Dr="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Eg(r){let e=0;try{let t=await pt.readdir(r,{withFileTypes:!0});for(let s of t){let n=rs.join(r,s.name);if(s.isDirectory())e+=await Eg(n);else try{let o=await pt.stat(n);e+=o.size}catch{}}}catch{}return e}l(Eg,"getDirectorySize");function vg(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}l(vg,"formatSize");async function QS(r){try{return(await pt.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}l(QS,"countDirectoryItems");function ZS(){let r={homebrew:!1,npm:!1};try{fi("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{fi("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}l(ZS,"detectInstallation");async function eb(){let r=[],e=gu(),t=R.getGlobalBasePath(),s=await x(t),n=s?await QS(rs.join(t,"projects")):0,o=s?await Eg(t):0;r.push({path:t,type:"directory",description:`All project data${n>0?`, ${n} project${n>1?"s":""}`:""}`,size:o,count:n,exists:s});let i=rs.join(e.claude.config,"CLAUDE.md"),a=await x(i),c=!1;if(a)try{let D=await pt.readFile(i,"utf-8");c=D.includes(hi)&&D.includes(Dr)}catch{}r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&c});let u=e.claude.router,d=await x(u);r.push({path:u,type:"file",description:"Claude router",exists:d});let p=rs.join(e.claude.config,"prjct-statusline.sh"),m=await x(p);r.push({path:p,type:"file",description:"Status line script",exists:m});let g=e.gemini.router,h=await x(g);r.push({path:g,type:"file",description:"Gemini router",exists:h});let S=rs.join(e.gemini.config,"GEMINI.md"),w=await x(S),E=!1;if(w)try{let D=await pt.readFile(S,"utf-8");E=D.includes(hi)&&D.includes(Dr)}catch{}return w&&E&&r.push({path:S,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}l(eb,"gatherUninstallItems");async function tb(r){try{let e=await pt.readFile(r,"utf-8");if(!e.includes(hi)||!e.includes(Dr))return!1;let t=e.indexOf(hi),s=e.indexOf(Dr)+Dr.length,n=e.substring(0,t)+e.substring(s);return n=n.replace(/\n{3,}/g,`
|
|
1564
|
+
|
|
1565
|
+
`).trim(),!n||n.trim().length===0?await pt.unlink(r):await pt.writeFile(r,`${n}
|
|
1566
|
+
`,"utf-8"),!0}catch{return!1}}l(tb,"removePrjctSection");async function sb(){let r=XS.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=rs.join(r,`.prjct-backup-${e}`);try{await pt.mkdir(t,{recursive:!0});let s=R.getGlobalBasePath();return await x(s)&&await Pg(s,rs.join(t,".prjct-cli")),t}catch{return null}}l(sb,"createBackup");async function Pg(r,e){await pt.mkdir(e,{recursive:!0});let t=await pt.readdir(r,{withFileTypes:!0});for(let s of t){let n=rs.join(r,s.name),o=rs.join(e,s.name);s.isDirectory()?await Pg(n,o):await pt.copyFile(n,o)}}l(Pg,"copyDirectory");async function nb(r,e,t){let s=[],n=[];for(let o of r)if(o.exists)try{o.type==="section"?await tb(o.path)&&s.push(o.path):o.type==="directory"?(await pt.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await pt.unlink(o.path),s.push(o.path))}catch(i){n.push(`${o.path}: ${y(i)}`)}try{await new Xt().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||fi(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){n.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||fi("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){n.push(`npm: ${y(o)}`)}}return{deleted:s,errors:n}}l(nb,"performUninstall");async function rb(r){let e=YS.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}l(rb,"promptConfirmation");async function ob(r={},e=process.cwd()){let t=await eb(),s=ZS(),n=t.filter(c=>c.exists);if(n.length===0&&!s.homebrew&&!s.npm)return console.log(be.yellow(`
|
|
1567
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=n.reduce((c,u)=>c+(u.size||0),0);console.log(""),console.log(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 n){let u=R.getDisplayPath(c.path),d="";c.type==="section"?d=be.dim("(section only)"):c.size&&(d=be.dim(`(${vg(c.size)})`)),console.log(` ${be.cyan(u.padEnd(35))} ${d}`),console.log(` ${be.dim(c.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${be.cyan("Homebrew".padEnd(35))} ${be.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${be.cyan("npm global".padEnd(35))} ${be.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(be.dim(` Total size: ${vg(o)}`)),console.log("")),r.dryRun)return console.log(be.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:n.length};if(r.backup){console.log(be.blue("Creating backup..."));let c=await sb();c?(console.log(be.green(`Backup created: ${R.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 rb("> ")))return console.log(be.yellow(`
|
|
1568
|
+
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(be.blue("Removing prjct..."));let{deleted:i,errors:a}=await nb(t,s,r);if(console.log(""),i.length>0&&console.log(be.green(`Removed ${i.length} items`)),a.length>0){console.log(be.yellow(`
|
|
1569
|
+
${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}}l(ob,"uninstall");var yi=class extends Se{static{l(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return ob(e,t)}};var Ss=new Bn,wi=new Js,ib=new Ln,Cg=new Dn,ab=new $n,bs=new In,zn=new Ks,jr=new _n,cb=new Xs,lb=new Gn,ub=new yi,db=new Hn;function mb(){for(let[r,e]of Object.entries(bg))U.registerCategory(r,e)}l(mb,"registerCategories");function pb(){if(U.has("work"))return;mb();let r=l(e=>Tg.find(t=>t.name===e),"getMeta");U.registerMethod("task",Ss,"now",r("task")),U.registerMethod("done",Ss,"done",r("done")),U.registerMethod("next",Ss,"next",r("next")),U.registerMethod("pause",Ss,"pause",r("pause")),U.registerMethod("resume",Ss,"resume",r("resume")),U.registerMethod("workflow",Ss,"workflow",r("workflow")),U.registerMethod("tokens",Ss,"tokens",r("tokens")),U.registerMethod("sessions",Ss,"sessions",r("sessions")),U.registerMethod("init",wi,"init",r("init")),U.registerMethod("bug",wi,"bug",r("bug")),U.registerMethod("idea",wi,"idea",r("idea")),U.registerMethod("spec",wi,"spec",r("spec")),U.registerMethod("ship",ib,"ship",r("ship")),U.registerMethod("dash",Cg,"dash",r("dash")),U.registerMethod("help",Cg,"help",r("help")),U.registerMethod("perf",ab,"perf",r("perf")),U.registerMethod("velocity",lb,"velocity",r("velocity")),U.registerMethod("cleanup",bs,"cleanup",r("cleanup")),U.registerMethod("cleanup-projects",bs,"cleanupProjects",r("cleanup-projects")),U.registerMethod("design",bs,"design",r("design")),U.registerMethod("recover",bs,"recover",r("recover")),U.registerMethod("undo",bs,"undo",r("undo")),U.registerMethod("redo",bs,"redo",r("redo")),U.registerMethod("history",bs,"history",r("history")),U.registerMethod("enrich",bs,"enrich",r("enrich")),U.registerMethod("analyze",zn,"analyze",r("analyze")),U.registerMethod("sync",zn,"sync",r("sync")),U.registerMethod("stats",zn,"stats",r("stats")),U.registerMethod("status",zn,"status",r("status")),U.registerMethod("seal",zn,"seal",r("seal")),U.registerMethod("verify",zn,"verify",r("verify")),U.registerMethod("start",jr,"start",r("start")),U.registerMethod("setup",jr,"setup",r("setup")),U.registerMethod("login",jr,"login",r("login")),U.registerMethod("logout",jr,"logout",r("logout")),U.registerMethod("auth",jr,"auth",r("auth")),U.registerMethod("uninstall",ub,"uninstall",r("uninstall")),U.registerMethod("update",db,"update",r("update")),U.registerMethod("context",cb,"context",r("context"))}l(pb,"registerAllCommands");pb();De();or();Pt();import{Hono as Eb}from"hono";import{cors as Pb}from"hono/cors";import{logger as Cb}from"hono/logger";import{secureHeaders as xb}from"hono/secure-headers";fe();ee();ps();Wt();Ns();wt();H();Kt();import gb from"node:fs/promises";import fb from"node:path";import{Hono as hb}from"hono";function yb(r){return R.getGlobalProjectPath(r)}l(yb,"getProjectDataPath");function xg(r,e){let t=new hb,s=yb(r);return t.get("/state",async n=>{let o=await _.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await we.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await Le.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=P.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await Xe.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([_.read(r),we.read(r),Le.read(r),Xe.read(r)]),u=P.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await _.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=fb.join(s,"context",`${o}.md`),c=await gb.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return A(a)||G.error(`Context read error: ${y(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}l(xg,"createRoutes");fe();ee();ps();Wt();Ns();wt();import qn from"node:fs/promises";import wb from"node:path";import{Hono as kb}from"hono";var Sb=R.getGlobalBasePath(),Kn=wb.join(Sb,"projects");function ki(r){return P.getDoc(r,"project")}l(ki,"getProjectConfig");async function Cl(r){if(!r)return"";let e=new Date(r),s=new Date().getTime()-e.getTime(),n=Math.floor(s/(1e3*60*60)),o=Math.floor(s%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${o}m`:`${o}m`}l(Cl,"calculateDuration");function Rg(){let r=new kb;return r.get("/projects",async e=>{try{await qn.mkdir(Kn,{recursive:!0});let s=(await qn.readdir(Kn,{withFileTypes:!0})).filter(o=>o.isDirectory()).map(o=>o.name),n=await Promise.all(s.map(async o=>{let i=ki(o),a=await _.read(o),c=await we.read(o),u=await Le.read(o),d=await Xe.read(o),p=a?.currentTask,m=await Cl(p?.startedAt);return{id:o,name:i?.name||o.slice(0,8),path:i?.path||null,currentTask:p?{...p,duration:m}:null,pausedTask:a?.previousTask||null,stats:{queueCount:c?.tasks?.filter(g=>!g.completed)?.length||0,ideasCount:u?.ideas?.filter(g=>g.status==="pending")?.length||0,shippedCount:d?.shipped?.length||0}}}));return n.sort((o,i)=>o.currentTask&&!i.currentTask?-1:!o.currentTask&&i.currentTask?1:(o.name||"").localeCompare(i.name||"")),e.json({projects:n})}catch{return e.json({projects:[],error:"Internal server error"},500)}}),r.get("/projects/:id/full",async e=>{let t=e.req.param("id");try{let[s,n,o,i,a]=await Promise.all([Promise.resolve(ki(t)),_.read(t),we.read(t),Le.read(t),Xe.read(t)]),c=P.getDoc(t,"roadmap");n?.currentTask?.startedAt&&(n.currentTask.duration=await Cl(n.currentTask.startedAt));let u=new Date,d=new Date(u.getFullYear(),u.getMonth(),u.getDate()),p=new Date(d);p.setDate(p.getDate()-p.getDay());let m=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=d)?.length||0,g=o?.tasks?.filter(h=>!h.completed||!h.completedAt?!1:new Date(h.completedAt)>=p)?.length||0;return e.json({id:t,name:s?.name||t,path:s?.path,state:n||{currentTask:null,previousTask:null,lastUpdated:""},queue:o||{tasks:[],lastUpdated:""},ideas:i||{ideas:[],lastUpdated:""},shipped:a||{shipped:[],lastUpdated:""},roadmap:c||{features:[],backlog:[],lastUpdated:""},stats:{tasksToday:m,tasksThisWeek:g,queueCount:o?.tasks?.filter(h=>!h.completed)?.length||0,ideasCount:i?.ideas?.filter(h=>h.status==="pending")?.length||0,shippedCount:a?.shipped?.length||0},timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.post("/projects/:id/task/complete",async e=>{let t=e.req.param("id");try{let s=await _.read(t);if(!s?.currentTask)return e.json({success:!1,error:"No active task"},400);let n=s.currentTask,o={currentTask:null,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,completedTask:n,message:`Completed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/pause",async e=>{let t=e.req.param("id");try{let s=await e.req.json().catch(()=>({})),n=typeof s.reason=="string"?s.reason.slice(0,500):void 0,o=await _.read(t);if(!o?.currentTask)return e.json({success:!1,error:"No active task"},400);let i={id:o.currentTask.id,description:o.currentTask.description,status:"paused",startedAt:o.currentTask.startedAt,pausedAt:new Date().toISOString(),pauseReason:n},a={currentTask:null,previousTask:i,lastUpdated:new Date().toISOString()};return await _.write(t,a),e.json({success:!0,pausedTask:i,message:`Paused: ${i.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/task/resume",async e=>{let t=e.req.param("id");try{let s=await _.read(t);if(!s?.previousTask)return e.json({success:!1,error:"No paused task"},400);let n={id:s.previousTask.id,description:s.previousTask.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`},o={currentTask:n,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,o),e.json({success:!0,resumedTask:n,message:`Resumed: ${n.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/queue/start",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{taskId:n}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"taskId required (string)"},400);if(n.length>200)return e.json({success:!1,error:"taskId too long"},400);let[o,i]=await Promise.all([_.read(t),we.read(t)]);if(o?.currentTask)return e.json({success:!1,error:"Complete or pause current task first"},400);let a=i?.tasks?.find(d=>d.id===n);if(!a)return e.json({success:!1,error:"Task not found in queue"},404);let c={id:a.id,description:a.description,status:"active",startedAt:new Date().toISOString(),sessionId:`sess_${Date.now().toString(36)}`,featureId:a.featureId},u={currentTask:c,previousTask:null,lastUpdated:new Date().toISOString()};return await _.write(t,u),e.json({success:!0,task:c,message:`Started: ${c.description}`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.post("/projects/:id/ideas",async e=>{let t=e.req.param("id");try{let s=await e.req.json(),{text:n,priority:o="medium",tags:i=[]}=s;if(!n||typeof n!="string")return e.json({success:!1,error:"text required (string)"},400);if(n.length>5e3)return e.json({success:!1,error:"text too long (max 5000 chars)"},400);let c=["low","medium","high","critical"].includes(o)?o:"medium",u=Array.isArray(i)?i.filter(p=>typeof p=="string").slice(0,20):[],d=await Le.addIdea(t,n,{priority:c,tags:u});return e.json({success:!0,idea:d,message:`Captured: ${n.slice(0,50)}...`})}catch{return e.json({success:!1,error:"Internal server error"},500)}}),r.get("/stats/global",async e=>{try{await qn.mkdir(Kn,{recursive:!0});let s=(await qn.readdir(Kn,{withFileTypes:!0})).filter(c=>c.isDirectory()).map(c=>c.name),n=0,o=0,i=0,a=0;for(let c of s){let u=await _.read(c),d=await we.read(c),p=await Le.read(c),m=await Xe.read(c);u?.currentTask&&a++,n+=d?.tasks?.filter(g=>!g.completed)?.length||0,o+=p?.ideas?.filter(g=>g.status==="pending")?.length||0,i+=m?.shipped?.length||0}return e.json({totalProjects:s.length,activeProjects:a,totalTasks:n,totalIdeas:o,totalShipped:i,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r.get("/status-bar/compact",async e=>{try{let t=e.req.query("cwd");await qn.mkdir(Kn,{recursive:!0});let n=(await qn.readdir(Kn,{withFileTypes:!0})).filter(d=>d.isDirectory()).map(d=>d.name),o=null;if(t)for(let d of n){let p=ki(d),m=p?.repoPath||p?.path;if(m&&t.startsWith(m)){o=d;break}}let i=null,a=null,c=null,u=o?[o]:n;for(let d of u){let p=await _.read(d),m=ki(d);if(p?.currentTask){i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},a={...p.currentTask,duration:await Cl(p.currentTask.startedAt)};break}p?.previousTask&&!c&&(i={id:d,name:m?.name||d,path:m?.repoPath||m?.path},c=p.previousTask)}return e.json({hasActiveTask:!!a,hasPausedTask:!!c,activeProject:i,activeTask:a,pausedTask:c,totalProjects:n.length,filtered:!!o,cwd:t||null,timestamp:new Date().toISOString()})}catch{return e.json({error:"Internal server error"},500)}}),r}l(Rg,"createExtendedRoutes");import{streamSSE as bb}from"hono/streaming";var Ag=3600*1e3,Tb=300*1e3,vb=3e4;function Dg(){let r=new Map,e=null;function t(o){let i=r.get(o);i&&(clearInterval(i.heartbeatInterval),clearTimeout(i.ttlTimeout),i.abortController.abort(),r.delete(o))}l(t,"removeClient");function s(){e||(e=setInterval(()=>{let o=Date.now();for(let[i,a]of r)o-new Date(a.client.connectedAt).getTime()>Ag&&t(i)},Tb),e&&typeof e=="object"&&"unref"in e&&e.unref())}l(s,"startReaper");function n(){e&&(clearInterval(e),e=null)}return l(n,"stopReaper"),s(),{handleConnection(o){return bb(o,async i=>{let a=crypto.randomUUID(),c=new Date().toISOString(),u=new AbortController,d={id:a,connectedAt:c,send:l((g,h)=>{i.writeSSE({event:g,data:JSON.stringify(h)})},"send"),close:l(()=>{t(a)},"close")},p=setInterval(async()=>{try{await i.writeSSE({event:"heartbeat",data:JSON.stringify({timestamp:new Date().toISOString()})})}catch{t(a)}},vb),m=setTimeout(()=>{t(a)},Ag);typeof p=="object"&&"unref"in p&&p.unref(),typeof m=="object"&&"unref"in m&&m.unref(),r.set(a,{client:d,heartbeatInterval:p,ttlTimeout:m,abortController:u}),await i.writeSSE({event:"connected",data:JSON.stringify({clientId:a,timestamp:c,message:"Connected to prjct-cli server"})}),i.onAbort(()=>{t(a)}),await new Promise(g=>{u.signal.addEventListener("abort",()=>g(),{once:!0})})})},broadcast(o,i){let a={event:o,data:i,timestamp:new Date().toISOString()};for(let[c,u]of r)try{u.client.send(o,a)}catch{t(c)}},getClientCount(){return r.size},shutdown(){n();for(let o of[...r.keys()])t(o)}}}l(Dg,"createSSEManager");function jg(r){let e=new Eb,t=Dg();e.use("*",xb()),r.enableCors!==!1&&e.use("*",Pb({origin:l(i=>{if(!i)return i;try{let a=new URL(i);return a.hostname==="localhost"||a.hostname==="127.0.0.1"?i:null}catch{return null}},"origin"),allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type"]})),r.enableLogging!==!1&&e.use("*",Cb()),e.get("/health",i=>i.json({status:"ok",timestamp:new Date().toISOString()})),e.get("/",i=>i.json({name:"prjct-cli",version:ve,projectId:r.projectId,endpoints:{health:"/health",state:"/api/state",queue:"/api/queue",ideas:"/api/ideas",roadmap:"/api/roadmap",shipped:"/api/shipped",events:"/api/events",projects:"/api/projects",projectFull:"/api/projects/:id/full",statusBarCompact:"/api/status-bar/compact",globalStats:"/api/stats/global"}}));let s=xg(r.projectId,r.projectPath);e.route("/api",s);let n=Rg();e.route("/api",n),e.get("/api/events",i=>t.handleConnection(i));let o=null;return{app:e,async start(){let i=r.port,a=r.host||"0.0.0.0";if(Rs())o=Bun.serve({port:i,hostname:a,fetch:e.fetch});else{let{serve:c}=await import("@hono/node-server"),u=c({fetch:e.fetch,port:i,hostname:a});o={stop:l(()=>u.close(),"stop")}}console.log(`\u{1F680} prjct server running at http://${a}:${i}`),console.log(` Project: ${r.projectId}`),console.log(` Runtime: ${Rs()?"Bun":"Node.js"}`),console.log(` Dashboard: http://localhost:${i}`)},stop(){t.shutdown(),o&&(o.stop(),o=null,console.log("Server stopped"))},broadcast(i,a){t.broadcast(i,a)}}}l(jg,"createServer");var Ig=3478;ee();hl();var Ab=50,Xn=null,Ir=null,me=null,Te=null;async function $g(r){let e=Me.socket(),t=Me.pid(),s=Me.runDir();if(_e.mkdirSync(s,{recursive:!0}),_e.existsSync(t)){let i=parseInt(_e.readFileSync(t,"utf-8").trim(),10);Mb(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),_e.unlinkSync(t)}_e.existsSync(e)&&_e.unlinkSync(e),Nb();let n=_b(),o=null;if(n)try{o=_e.statSync(n).mtimeMs}catch{}if(Te={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:ng,idleTimer:null,entryPath:n,entryMtime:o},me=new Jn,Xn=Rb(i=>Db(i)),Xn.listen(e,()=>{_e.chmodSync(e,384),_e.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),n&&console.log(` Watching: ${n}`),Mg()}),Xn.on("error",i=>{console.error("Daemon socket error:",i.message),Yn(1)}),!r.noHttp)try{let i=process.cwd(),a=await M.getProjectId(i);if(a){let c=r.port||Ig;Ir=jg({port:c,projectId:a,projectPath:i,enableLogging:!1}),await Ir.start()}}catch{}if(process.on("SIGTERM",()=>Yn(0)),process.on("SIGINT",()=>Yn(0)),process.on("SIGHUP",()=>{me=new Jn,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}l($g,"startDaemon");function Db(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>rg){let n={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Fn(n)),r.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1570
|
+
`))!==-1;){let n=e.slice(0,s);if(e=e.slice(s+1),!!n.trim())try{let o=JSON.parse(n),i=await jb(o);r.write(Fn(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Fn(i))}}}),r.on("error",()=>{})}l(Db,"handleConnection");async function jb(r){if(!Te||!me)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Mg(),Te.commandsServed++,Te.lastActivity=Date.now(),Te.commandsServed%Ab===0&&I.checkpointAll(),_g()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),setTimeout(()=>{console.log("Daemon shutting down for code reload..."),Yn(0)},200)),r.command==="daemon")return $b(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,n=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await Ib(r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1502
1571
|
`)||o.message||void 0,stderr:t.join(`
|
|
1503
|
-
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}l(
|
|
1572
|
+
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=n}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}l(jb,"handleRequest");async function Ib(r){let e=r.args.join(" ")||null,t=r.options,s=t.md===!0;switch(r.command){case"sync":return me.sync(r.cwd,{preview:t.preview===!0||t["dry-run"]===!0,yes:t.yes===!0,json:t.json===!0,md:s,package:t.package?String(t.package):void 0,full:t.full===!0});case"status":return me.status(r.cwd,{json:t.json===!0,md:s});case"stats":return me.stats(r.cwd,{json:t.json===!0,export:t.export===!0});case"diff":return me.diff(r.cwd,{json:t.json===!0,md:s});case"seal":return me.seal(r.cwd,{json:t.json===!0});case"rollback":return me.rollback(r.cwd,{json:t.json===!0,md:s});case"verify":return me.verify(r.cwd,{json:t.json===!0,semantic:t.semantic===!0});case"task":return me.task(e,r.cwd,{md:s});case"done":return me.done(r.cwd,{md:s});case"next":return me.next(r.cwd,{md:s});case"pause":return me.pause(e||"",r.cwd,{md:s});case"resume":return me.resume(e,r.cwd,{md:s});case"bug":return me.bug(e||"",r.cwd,{md:s});case"idea":return me.idea(e||"",r.cwd,{md:s});case"ship":return me.ship(e,r.cwd,{md:s});case"dash":return me.dash(e||"default",r.cwd,{md:s});case"workflow":return me.workflowPrefs(e,r.cwd,{md:s});case"sessions":return me.sessions(r.cwd,{md:s,cleanup:t.cleanup===!0});case"design":return me.design(e||"",t,r.cwd);case"analysis-payload":return me.analysisPayload(r.cwd,{json:t.json===!0,md:s});case"analysis-save-llm":return me.saveLlmAnalysis(e||"",r.cwd,{md:s});case"analysis-llm":return me.getLlmAnalysis(r.cwd,{json:t.json===!0,md:s});case"analyze":return me.analyze(t,r.cwd);case"cleanup":return me.cleanup(t,r.cwd);case"cleanup-projects":return me.cleanupProjects({dryRun:t["dry-run"]===!0,md:s});default:return U.execute(r.command,e,r.cwd)}}l(Ib,"executeCommand");function $b(r){let e=r.args[0];if(e==="status")return{id:r.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:Me.socket(),uptime:Te?Date.now()-Te.startedAt:0,commandsServed:Te?.commandsServed??0,lastActivity:Te?new Date(Te.lastActivity).toISOString():null,registeredCommands:U.list().length,stale:_g()}};if(e==="stop"){let t={id:r.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>Yn(0),100),t}return{id:r.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}l($b,"handleDaemonCommand");function Mg(){Te&&(Te.idleTimer&&clearTimeout(Te.idleTimer),Te.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${Te.idleTimeoutMs/1e3/60} minutes, shutting down`),Yn(0)},Te.idleTimeoutMs),Te.idleTimer.unref&&Te.idleTimer.unref())}l(Mg,"resetIdleTimer");function Yn(r){console.log("Daemon shutting down..."),Te?.idleTimer&&clearTimeout(Te.idleTimer),Ir&&(Ir.stop(),Ir=null),Xn&&(Xn.close(),Xn=null),I.close();let e=Me.socket(),t=Me.pid();try{_e.existsSync(e)&&_e.unlinkSync(e)}catch{}try{_e.existsSync(t)&&_e.unlinkSync(t)}catch{}process.exit(r)}l(Yn,"shutdown");function Mb(r){try{return process.kill(r,0),!0}catch{return!1}}l(Mb,"isProcessRunning");function _b(){let r=gt("node:path"),e=__dirname;for(let n=0;n<5;n++){if(_e.existsSync(r.join(e,"package.json"))){let o=r.join(e,"dist","daemon","entry.mjs");if(_e.existsSync(o))return o;break}e=r.dirname(e)}let t=[r.join(__dirname,"..","daemon","entry.mjs"),r.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of t)if(_e.existsSync(n))return n;let s=process.argv[1];return s&&_e.existsSync(s)?s:null}l(_b,"resolveEntryPath");var Ob=1024*1024;function Nb(){let r=Me.log();try{if(_e.statSync(r).size>Ob){let t=`${r}.1`;try{_e.unlinkSync(t)}catch{}_e.renameSync(r,t)}}catch{}}l(Nb,"rotateLog");function _g(){if(!Te?.entryPath||Te.entryMtime===null)return!1;try{return _e.statSync(Te.entryPath).mtimeMs!==Te.entryMtime}catch{return!1}}l(_g,"isCodeStale");var xl=process.argv.slice(2),Lb=parseInt(xl.find(r=>r.startsWith("--port="))?.split("=")[1]||"",10)||void 0,Fb=xl.includes("--no-http"),Ub=xl.includes("--foreground");$g({port:Lb,noHttp:Fb,foreground:Ub}).catch(r=>{console.error("Failed to start daemon:",r.message),process.exit(1)});
|