prjct-cli 2.4.36 → 2.4.39
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 +15 -0
- package/README.md +11 -3
- package/dist/bin/prjct-core.mjs +182 -182
- package/dist/daemon/entry.mjs +142 -142
- package/package.json +1 -1
package/dist/daemon/entry.mjs
CHANGED
|
@@ -5,25 +5,19 @@ 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 zn=Object.defineProperty;var
|
|
9
|
-
`;await tt.writeFile(n,r,"utf-8")}async function Ke(n,e=""){try{return await tt.readFile(n,"utf-8")}catch(t){if(x(t))return e;throw t}}async function _t(n,e){let t=Yn.dirname(n);await tt.mkdir(t,{recursive:!0}),await tt.writeFile(n,e,"utf-8")}async function S(n){try{return await tt.access(n),!0}catch(e){if(x(e))return!1;throw e}}async function Nt(n){try{return(await tt.stat(n)).isDirectory()}catch(e){if(x(e))return!1;throw e}}async function ht(n){await tt.mkdir(n,{recursive:!0})}async function Mt(n,e={}){try{let s=await tt.readdir(n,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(r=>r.isFile())),e.dirsOnly&&(s=s.filter(r=>r.isDirectory())),e.extension&&(s=s.filter(r=>r.name.endsWith(e.extension))),s.map(r=>r.name)}catch(t){if(x(t))return[];throw t}}var Y=v(()=>{"use strict";Eo();$c();q();c(Es,"walkDir");c(Cs,"batchProcess");c(ge,"readJson");c(ce,"writeJson");c(Ke,"readFile");c(_t,"writeFile");c(S,"fileExists");c(Nt,"dirExists");c(ht,"ensureDir");c(Mt,"listFiles")});var Ao={};Ee(Ao,{PACKAGE_ROOT:()=>Ye,VERSION:()=>me,getPackageRoot:()=>Po,getVersion:()=>Zn,resetPackageRoot:()=>Ro});import Co from"node:fs";import Qn from"node:path";function Po(){if(Ps)return Ps;let n=__dirname;for(let e=0;e<5;e++){let t=Qn.join(n,"package.json");if(Co.existsSync(t))try{if(JSON.parse(Co.readFileSync(t,"utf-8")).name==="prjct-cli")return Ps=n,n}catch{}n=Qn.dirname(n)}return Ps=Qn.join(__dirname,"..","..",".."),Ps}function Zn(){if(es)return es;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return es=n,es;try{let e=Qn.join(Po(),"package.json");return es=JSON.parse(Co.readFileSync(e,"utf-8")).version,es}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",y(e)),"0.0.0"}}function Ro(n){Ps=n,es=null}var es,Ps,me,Ye,st=v(()=>{"use strict";q();es=null,Ps=null;c(Po,"getPackageRoot");c(Zn,"getVersion");c(Ro,"resetPackageRoot");me=Zn(),Ye=Po()});var jo={};Ee(jo,{execAsync:()=>_,execFileAsync:()=>Ct});import{exec as dp,execFile as mp}from"node:child_process";import{promisify as Dc}from"node:util";var _,Ct,Me=v(()=>{"use strict";_=Dc(dp),Ct=Dc(mp)});async function er(n){try{let{stdout:e}=await _(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function pp(){let n=await er("gh api user --jq .login");return n.success&&n.output||(n=await er("git config --global github.user"),n.success&&n.output)?n.output:null}async function gp(){let n=await er("git config user.name");return n.success&&n.output?n.output:null}async function fp(){let n=await er("git config user.email");return n.success&&n.output?n.output:null}async function Rs(){let[n,e,t]=await Promise.all([pp(),gp(),fp()]);return{github:n,email:t,name:e||n||"Unknown"}}var tr=v(()=>{"use strict";Me();c(er,"execCommand");c(pp,"detectGitHubUsername");c(gp,"detectGitName");c(fp,"detectGitEmail");c(Rs,"detect")});var $o=v(()=>{"use strict"});import{z as kn}from"zod";function Ic(n,e){let t=n.split(".").map(Number),s=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=s[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var vn,sr=v(()=>{"use strict";vn=kn.object({provider:kn.string(),model:kn.string(),cliVersion:kn.string().optional(),recordedAt:kn.string()});c(Ic,"compareSemver")});function rr(n,e){let t=typeof n=="string"?new Date(n).getTime():n;return Date.now()-t>e}var nr,or=v(()=>{"use strict";c(rr,"isExpired");nr=class{static{c(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,r)=>s[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import hp from"node:fs/promises";import yp from"node:os";import _c from"node:path";async function Mc(){try{let n=await hp.readFile(Nc,"utf-8"),e=JSON.parse(n);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||rr(e.timestamp,kp)?null:e.detection}catch{return null}}async function Oc(n){let e={timestamp:new Date().toISOString(),detection:n};await ce(Nc,e)}var wp,Nc,kp,Lc=v(()=>{"use strict";or();Y();wp=_c.join(yp.homedir(),".prjct-cli","cache"),Nc=_c.join(wp,"providers.json"),kp=10*60*1e3;c(Mc,"readProviderCache");c(Oc,"writeProviderCache")});var nt={};Ee(nt,{ClaudeProvider:()=>ir,CursorProvider:()=>Hc,GeminiProvider:()=>Do,Providers:()=>Pt,detectAllProviders:()=>bn,detectAntigravity:()=>Io,detectCodex:()=>ts,detectProvider:()=>ar,getActiveProvider:()=>Sp,getProviderBranding:()=>cr,selectProvider:()=>_o,validateCliVersion:()=>Vc});import Ot from"node:os";import yt from"node:path";async function Gc(n){try{let{stdout:e}=await _(`which ${n}`,{timeout:2e3});return e.trim()}catch{return null}}async function bp(n){try{let{stdout:e}=await _(`${n} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function ar(n){let e=Pt[n];if(!e.cliCommand)return{installed:!1};let t=await Gc(e.cliCommand);if(!t)return{installed:!1};let s=await bp(e.cliCommand),r=Vc(n,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:r||void 0}}function Vc(n,e){let t=Pt[n];return!t.minCliVersion||!e?null:Ic(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 bn(n=!1){if(!n){let i=await Mc();if(i)return i}let[e,t,s]=await Promise.all([ar("claude"),ar("gemini"),ts()]),r={installed:s.installed},o={claude:e,gemini:t,codex:r};return await Oc(o).catch(()=>{}),o}async function Sp(n){if(n&&Pt[n])return Pt[n];let e=await bn();return e.claude.installed&&!e.gemini.installed?ir:e.gemini.installed&&!e.claude.installed?Do:ir}function cr(n){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[n]||"\u26A1 prjct"}}async function Io(){let n=Uc.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=yt.join(n,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([S(n),S(e)]);return{installed:t,skillInstalled:s,configPath:t?n:void 0}}async function ts(){let n=Wc.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=await Gc("codex"),t=yt.join(n,"skills","prjct","SKILL.md"),s=await S(t),r=!!e;return{installed:r,skillInstalled:s,configPath:r?n:void 0}}async function _o(){let n=await bn(),e=n.claude.installed,t=n.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:n}:e&&!t?{provider:"claude",userSelected:!1,detection:n}:t&&!e?{provider:"gemini",userSelected:!1,detection:n}:{provider:"claude",userSelected:!0,detection:n}}var ir,Do,Uc,Hc,vp,Wc,Pt,He=v(()=>{"use strict";$o();sr();Me();Y();Lc();ir={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:yt.join(Ot.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:yt.join(Ot.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"},Do={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:yt.join(Ot.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:yt.join(Ot.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"},Uc={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:yt.join(Ot.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:yt.join(Ot.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"},Hc={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"},vp={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"},Wc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:yt.join(Ot.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:yt.join(Ot.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"},Pt={claude:ir,gemini:Do,cursor:Hc,antigravity:Uc,windsurf:vp,codex:Wc};c(Gc,"whichCommand");c(bp,"getCliVersion");c(ar,"detectProvider");c(Vc,"validateCliVersion");c(bn,"detectAllProviders");c(Sp,"getActiveProvider");c(cr,"getProviderBranding");c(Io,"detectAntigravity");c(ts,"detectCodex");c(_o,"selectProvider")});var lr={};Ee(lr,{default:()=>Tp,worktreeService:()=>Jc});import No from"node:fs/promises";import wt from"node:path";var Bc,Mo,Jc,Tp,ur=v(()=>{"use strict";Me();Y();Bc=".worktrees",Mo=class{static{c(this,"WorktreeService")}async create(e,t,s={}){let r=await this.getMainWorktree(e),o=wt.join(r,Bc,t),i=s.branch||`feat/${t}`;await No.mkdir(wt.join(r,Bc),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await _(`git worktree add "${o}" -b "${i}"${a}`,{cwd:r});let{stdout:l}=await _("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),r;if(t)try{let{stdout:o}=await _("git rev-parse --abbrev-ref HEAD",{cwd:e});r=o.trim()}catch{}if(await _(`git worktree remove "${e}" --force`,{cwd:s}),t&&r&&r!=="main"&&r!=="master")try{await _(`git branch -D "${r}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await _("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await _("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await _("git rev-parse --git-dir",{cwd:e}),r=wt.resolve(e,t.trim()),o=wt.resolve(e,s.trim());if(r!==o){let{stdout:i}=await _("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await _("git rev-parse HEAD",{cwd:e}),{stdout:l}=await _("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=wt.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await _("git worktree list --porcelain",{cwd:e}),r=s.split(`
|
|
8
|
+
var zn=Object.defineProperty;var op=Object.getOwnPropertyDescriptor;var ip=Object.getOwnPropertyNames;var ap=Object.prototype.hasOwnProperty;var c=(n,e)=>zn(n,"name",{value:e,configurable:!0}),Te=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var v=(n,e)=>()=>(n&&(e=n(n=0)),e);var Ee=(n,e)=>{for(var t in e)zn(n,t,{get:e[t],enumerable:!0})},cp=(n,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ip(e))!ap.call(n,r)&&r!==t&&zn(n,r,{get:()=>e[r],enumerable:!(s=op(e,r))||s.enumerable});return n};var et=n=>cp(zn({},"__esModule",{value:!0}),n);function lp(n){return n instanceof Ss}function ae(n){return lp(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Ss,Xn,Kn,wn,It=v(()=>{"use strict";Ss=class extends Error{static{c(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)}},Xn=class n extends Ss{static{c(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Kn=class n extends Ss{static{c(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new n(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new n(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},wn=class n extends Ss{static{c(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};c(lp,"isPrjctError");c(ae,"getErrorMessage")});function up(n){return n instanceof Error&&"code"in n}function x(n){return up(n)&&n.code==="ENOENT"}function y(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var q=v(()=>{"use strict";c(up,"isNodeError");c(x,"isNotFoundError");c(y,"getErrorMessage")});import{formatDistanceToNowStrict as rv}from"date-fns";function bc(n){let e=n.getFullYear(),t=(n.getMonth()+1).toString().padStart(2,"0"),s=n.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function Sc(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}function b(){return new Date().toISOString()}function Ts(n){let e=new Date;return e.setDate(e.getDate()-n),e}function Tc(n){let e=Math.floor(n/1e3),t=Math.floor(e/60),s=Math.floor(t/60),r=Math.floor(s/24);return r>0?`${r}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}var be=v(()=>{"use strict";c(bc,"formatDate");c(Sc,"getYearMonthDay");c(b,"getTimestamp");c(Ts,"getDaysAgo");c(Tc,"formatDuration")});var Ec,Cc,Pc,Eo=v(()=>{"use strict";Ec=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",".worktrees"]),Cc=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Pc=/(?:import|from)\s+['"]([^'"]+)['"]/g});import jc from"node:fs/promises";async function xc(n,e){let t;try{t=await jc.readFile(n,"utf-8")}catch(o){if(x(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Rc(n,t),Ac(n,"Malformed JSON"),null}let r=e.safeParse(s);return r.success?s:(await Rc(n,t),Ac(n,dp(r.error)),null)}async function Rc(n,e){let t=`${n}.backup`;try{await jc.writeFile(t,e,"utf-8")}catch{}}function Ac(n,e){console.error(`[prjct] Warning: Corrupted storage file: ${n}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function dp(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var $c=v(()=>{"use strict";q();c(xc,"safeRead");c(Rc,"createBackup");c(Ac,"logCorruption");c(dp,"formatZodError")});import tt from"node:fs/promises";import Yn from"node:path";async function Es(n,e={}){let t=[],s=e.maxFiles??1/0,r=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await tt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of a){if(t.length>=s)break;let u=String(l.name);if(Ec.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!r||!r.has(u)))continue;let d=Yn.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(Yn.relative(n,d))}}return c(o,"walk"),await o(n),t}async function Cs(n,e,t){let s=[];for(let r=0;r<n.length;r+=e){let o=await Promise.all(n.slice(r,r+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function pe(n,e=null,t){if(t)return await xc(n,t)??e;try{let s=await tt.readFile(n,"utf-8");return JSON.parse(s)}catch(s){if(x(s))return e;throw s}}async function ce(n,e,t=2){let s=Yn.dirname(n);await tt.mkdir(s,{recursive:!0});let r=`${JSON.stringify(e,null,t)}
|
|
9
|
+
`;await tt.writeFile(n,r,"utf-8")}async function Xe(n,e=""){try{return await tt.readFile(n,"utf-8")}catch(t){if(x(t))return e;throw t}}async function _t(n,e){let t=Yn.dirname(n);await tt.mkdir(t,{recursive:!0}),await tt.writeFile(n,e,"utf-8")}async function S(n){try{return await tt.access(n),!0}catch(e){if(x(e))return!1;throw e}}async function Nt(n){try{return(await tt.stat(n)).isDirectory()}catch(e){if(x(e))return!1;throw e}}async function ft(n){await tt.mkdir(n,{recursive:!0})}async function Mt(n,e={}){try{let s=await tt.readdir(n,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(r=>r.isFile())),e.dirsOnly&&(s=s.filter(r=>r.isDirectory())),e.extension&&(s=s.filter(r=>r.name.endsWith(e.extension))),s.map(r=>r.name)}catch(t){if(x(t))return[];throw t}}var Y=v(()=>{"use strict";Eo();$c();q();c(Es,"walkDir");c(Cs,"batchProcess");c(pe,"readJson");c(ce,"writeJson");c(Xe,"readFile");c(_t,"writeFile");c(S,"fileExists");c(Nt,"dirExists");c(ft,"ensureDir");c(Mt,"listFiles")});var Ao={};Ee(Ao,{PACKAGE_ROOT:()=>Ke,VERSION:()=>me,getPackageRoot:()=>Po,getVersion:()=>Zn,resetPackageRoot:()=>Ro});import Co from"node:fs";import Qn from"node:path";function Po(){if(Ps)return Ps;let n=__dirname;for(let e=0;e<5;e++){let t=Qn.join(n,"package.json");if(Co.existsSync(t))try{if(JSON.parse(Co.readFileSync(t,"utf-8")).name==="prjct-cli")return Ps=n,n}catch{}n=Qn.dirname(n)}return Ps=Qn.join(__dirname,"..","..",".."),Ps}function Zn(){if(es)return es;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return es=n,es;try{let e=Qn.join(Po(),"package.json");return es=JSON.parse(Co.readFileSync(e,"utf-8")).version,es}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",y(e)),"0.0.0"}}function Ro(n){Ps=n,es=null}var es,Ps,me,Ke,st=v(()=>{"use strict";q();es=null,Ps=null;c(Po,"getPackageRoot");c(Zn,"getVersion");c(Ro,"resetPackageRoot");me=Zn(),Ke=Po()});var jo={};Ee(jo,{execAsync:()=>_,execFileAsync:()=>Et});import{exec as mp,execFile as pp}from"node:child_process";import{promisify as Dc}from"node:util";var _,Et,Me=v(()=>{"use strict";_=Dc(mp),Et=Dc(pp)});async function er(n){try{let{stdout:e}=await _(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function gp(){let n=await er("gh api user --jq .login");return n.success&&n.output||(n=await er("git config --global github.user"),n.success&&n.output)?n.output:null}async function fp(){let n=await er("git config user.name");return n.success&&n.output?n.output:null}async function hp(){let n=await er("git config user.email");return n.success&&n.output?n.output:null}async function Rs(){let[n,e,t]=await Promise.all([gp(),fp(),hp()]);return{github:n,email:t,name:e||n||"Unknown"}}var tr=v(()=>{"use strict";Me();c(er,"execCommand");c(gp,"detectGitHubUsername");c(fp,"detectGitName");c(hp,"detectGitEmail");c(Rs,"detect")});var $o=v(()=>{"use strict"});import{z as kn}from"zod";function Ic(n,e){let t=n.split(".").map(Number),s=e.split(".").map(Number);for(let r=0;r<3;r++){let o=t[r]??0,i=s[r]??0;if(o<i)return-1;if(o>i)return 1}return 0}var vn,sr=v(()=>{"use strict";vn=kn.object({provider:kn.string(),model:kn.string(),cliVersion:kn.string().optional(),recordedAt:kn.string()});c(Ic,"compareSemver")});function rr(n,e){let t=typeof n=="string"?new Date(n).getTime():n;return Date.now()-t>e}var nr,or=v(()=>{"use strict";c(rr,"isExpired");nr=class{static{c(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,r)=>s[1].timestamp-r[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import yp from"node:fs/promises";import wp from"node:os";import _c from"node:path";async function Mc(){try{let n=await yp.readFile(Nc,"utf-8"),e=JSON.parse(n);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||rr(e.timestamp,vp)?null:e.detection}catch{return null}}async function Oc(n){let e={timestamp:new Date().toISOString(),detection:n};await ce(Nc,e)}var kp,Nc,vp,Lc=v(()=>{"use strict";or();Y();kp=_c.join(wp.homedir(),".prjct-cli","cache"),Nc=_c.join(kp,"providers.json"),vp=10*60*1e3;c(Mc,"readProviderCache");c(Oc,"writeProviderCache")});var yt={};Ee(yt,{ClaudeProvider:()=>ir,CursorProvider:()=>Hc,GeminiProvider:()=>Do,Providers:()=>Ct,detectAllProviders:()=>bn,detectAntigravity:()=>Io,detectCodex:()=>ts,detectProvider:()=>ar,getActiveProvider:()=>Tp,getProviderBranding:()=>cr,selectProvider:()=>_o,validateCliVersion:()=>Vc});import Ot from"node:os";import ht from"node:path";async function Gc(n){try{let{stdout:e}=await _(`which ${n}`,{timeout:2e3});return e.trim()}catch{return null}}async function Sp(n){try{let{stdout:e}=await _(`${n} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function ar(n){let e=Ct[n];if(!e.cliCommand)return{installed:!1};let t=await Gc(e.cliCommand);if(!t)return{installed:!1};let s=await Sp(e.cliCommand),r=Vc(n,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:r||void 0}}function Vc(n,e){let t=Ct[n];return!t.minCliVersion||!e?null:Ic(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 bn(n=!1){if(!n){let i=await Mc();if(i)return i}let[e,t,s]=await Promise.all([ar("claude"),ar("gemini"),ts()]),r={installed:s.installed},o={claude:e,gemini:t,codex:r};return await Oc(o).catch(()=>{}),o}async function Tp(n){if(n&&Ct[n])return Ct[n];let e=await bn();return e.claude.installed&&!e.gemini.installed?ir:e.gemini.installed&&!e.claude.installed?Do:ir}function cr(n){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[n]||"\u26A1 prjct"}}async function Io(){let n=Uc.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=ht.join(n,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([S(n),S(e)]);return{installed:t,skillInstalled:s,configPath:t?n:void 0}}async function ts(){let n=Wc.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=await Gc("codex"),t=ht.join(n,"skills","prjct","SKILL.md"),s=await S(t),r=!!e;return{installed:r,skillInstalled:s,configPath:r?n:void 0}}async function _o(){let n=await bn(),e=n.claude.installed,t=n.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:n}:e&&!t?{provider:"claude",userSelected:!1,detection:n}:t&&!e?{provider:"gemini",userSelected:!1,detection:n}:{provider:"claude",userSelected:!0,detection:n}}var ir,Do,Uc,Hc,bp,Wc,Ct,Ve=v(()=>{"use strict";$o();sr();Me();Y();Lc();ir={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ht.join(Ot.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ht.join(Ot.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"},Do={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ht.join(Ot.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ht.join(Ot.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"},Uc={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ht.join(Ot.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ht.join(Ot.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"},Hc={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},bp={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},Wc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ht.join(Ot.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ht.join(Ot.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:ir,gemini:Do,cursor:Hc,antigravity:Uc,windsurf:bp,codex:Wc};c(Gc,"whichCommand");c(Sp,"getCliVersion");c(ar,"detectProvider");c(Vc,"validateCliVersion");c(bn,"detectAllProviders");c(Tp,"getActiveProvider");c(cr,"getProviderBranding");c(Io,"detectAntigravity");c(ts,"detectCodex");c(_o,"selectProvider")});var lr={};Ee(lr,{default:()=>Ep,worktreeService:()=>Jc});import No from"node:fs/promises";import wt from"node:path";var Bc,Mo,Jc,Ep,ur=v(()=>{"use strict";Me();Y();Bc=".worktrees",Mo=class{static{c(this,"WorktreeService")}async create(e,t,s={}){let r=await this.getMainWorktree(e),o=wt.join(r,Bc,t),i=s.branch||`feat/${t}`;await No.mkdir(wt.join(r,Bc),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await _(`git worktree add "${o}" -b "${i}"${a}`,{cwd:r});let{stdout:l}=await _("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),r;if(t)try{let{stdout:o}=await _("git rev-parse --abbrev-ref HEAD",{cwd:e});r=o.trim()}catch{}if(await _(`git worktree remove "${e}" --force`,{cwd:s}),t&&r&&r!=="main"&&r!=="master")try{await _(`git branch -D "${r}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await _("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await _("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await _("git rev-parse --git-dir",{cwd:e}),r=wt.resolve(e,t.trim()),o=wt.resolve(e,s.trim());if(r!==o){let{stdout:i}=await _("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await _("git rev-parse HEAD",{cwd:e}),{stdout:l}=await _("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=wt.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await _("git worktree list --porcelain",{cwd:e}),r=s.split(`
|
|
10
10
|
`)[0];if(r?.startsWith("worktree "))return r.replace("worktree ","").trim()}catch{}let{stdout:t}=await _("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=wt.join(t,".env");await S(s)&&await No.copyFile(s,wt.join(e,".env"));let r=wt.join(t,".prjct"),o=wt.join(e,".prjct");await S(r)&&!await S(o)&&await No.symlink(r,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],r=await this.getMainWorktree(e);await _("git worktree prune",{cwd:r});for(let o of t)o.isMain||await S(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],r=e.trim().split(`
|
|
11
11
|
|
|
12
12
|
`);for(let o of r){if(!o.trim())continue;let i=o.trim().split(`
|
|
13
|
-
`),a="",l="",u="",d=!1;for(let m of i)m.startsWith("worktree ")?a=m.replace("worktree ","").trim():m.startsWith("HEAD ")?l=m.replace("HEAD ","").trim():m.startsWith("branch ")?u=m.replace("branch refs/heads/","").trim():m==="bare"?d=!0:m==="detached"&&(u="(detached)");if(a){let m=a===t||d;s.push({path:a,branch:u,commit:l,isMain:m,slug:m?"main":wt.basename(a)})}}return s}},Jc=new Mo,
|
|
14
|
-
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=D.join(e,"package.json"),i=await kt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?r=a.workspaces:a.workspaces?.packages&&(r=a.workspaces.packages),t==="lerna"){let l=D.join(e,"lerna.json");if(await S(l)){let u=await kt.readFile(l,"utf-8"),d=JSON.parse(u);d.packages&&(r=d.packages)}}}else if(t==="nx")r=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=D.join(e,"package.json"),i=await kt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(r=a.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let o of r){if(o.startsWith("!"))continue;let i=
|
|
15
|
-
`).filter(Boolean).forEach(s=>{let r=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);r&&(t[r[2]]=parseInt(r[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await
|
|
16
|
-
`).filter(Boolean)}catch{return[]}}}
|
|
17
|
-
`).forEach(i=>{let[a,...l]=i.split(":");if(a&&l.length>0){let u=l.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:r.trim()}}async function Qc(n){if(js.has(n))return Ip(n),js.get(n);let e,t=Vo();if(t){let r=`commands/${n}.md`;e=t[r]}if(!e){let r=gr.join(Ye,"templates","commands",`${n}.md`);try{e=await $p.readFile(r,"utf-8")}catch{throw Kn.notFound(n)}}let s=Yc(e);return _p(),js.set(n,s),ss.push(n),s}async function Np(n){return(await Qc(n)).frontmatter["allowed-tools"]||[]}function Zc(){js.clear(),ss.length=0}function Mp(){pr=null,Wo=!1,Zc()}function ot(n){let e=Vo();if(e?.[n])return e[n];let t=gr.join(Ye,"templates",n);try{return Go.readFileSync(t,"utf-8")}catch{return null}}function fr(n){let e=Vo();if(e)return Object.keys(e).filter(s=>s.startsWith(n));let t=gr.join(Ye,"templates",n);try{return Go.readdirSync(t).map(r=>`${n}${r}`)}catch{return[]}}var Dp,js,ss,pr,Wo,Op,Lp,xs=v(()=>{"use strict";It();st();Dp=50,js=new Map,ss=[],pr=null,Wo=!1;c(Vo,"loadBundle");c(Ip,"updateLruOrder");c(_p,"evictLru");c(Yc,"parseFrontmatter");c(Qc,"load");c(Np,"getAllowedTools");c(Zc,"clearCache");c(Mp,"resetBundle");c(ot,"getTemplateContent");c(fr,"listTemplates");Op={load:Qc,parseFrontmatter:Yc,getAllowedTools:Np,clearCache:Zc,getTemplateContent:ot,listTemplates:fr},Lp=Op});function hr(n,e,t,s){if(!n)return{content:e,action:"created"};if(!(n.includes(t)&&n.includes(s)))return{content:`${n}
|
|
18
|
-
|
|
19
|
-
${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.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 Jo=v(()=>{"use strict";c(hr,"mergeWithMarkers")});var sl={};Ee(sl,{CommandInstaller:()=>vt,default:()=>pe,getProviderPaths:()=>qo,installGlobalConfig:()=>tl});import xe from"node:fs/promises";import yr from"node:os";import le from"node:path";async function Fp(){try{let n=le.join(yr.homedir(),".prjct-cli","docs");await xe.mkdir(n,{recursive:!0});let e=fr("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=ot(r);if(o){let i=le.basename(r);await xe.writeFile(le.join(n,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(st(),Xe(Ao)),s=le.join(t,"templates/global/docs");try{let r=await xe.readdir(s);for(let o of r)if(o.endsWith(".md")){let i=le.join(s,o),a=le.join(n,o),l=await xe.readFile(i,"utf-8");await xe.writeFile(a,l,"utf-8")}}catch{}return{success:!0}}catch(n){return{success:!1,error:y(n)}}}async function tl(){let n=(He(),Xe(nt)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await xe.mkdir(e.configDir,{recursive:!0});let r=le.join(e.configDir,e.contextFile),o=el;if(t!=="claude"){let f=ot(`global/${e.contextFile}`);if(f)o=f;else{let{PACKAGE_ROOT:h}=(st(),Xe(Ao)),E=le.join(h,"templates","global",e.contextFile);try{o=await xe.readFile(E,"utf-8")}catch{t==="gemini"&&(o=el.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await xe.readFile(r,"utf-8"),a=!0}catch(f){if(x(f))a=!1;else throw f}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let f=i.substring(0,i.indexOf(l)),h=i.substring(i.indexOf(u)+u.length);i=`${(f+h).replace(/\n{3,}/g,`
|
|
20
|
-
|
|
21
|
-
`).trim()}
|
|
22
|
-
`}let p=hr(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await xe.writeFile(r,p.content,"utf-8"),{success:!0,action:p.action,path:r}}catch(r){return{success:!1,error:y(r),action:"failed"}}}function qo(){let n=yr.homedir();return{claude:{commands:le.join(n,".claude","commands"),config:le.join(n,".claude"),router:le.join(n,".claude","commands","p.md")},gemini:{commands:le.join(n,".gemini","commands"),config:le.join(n,".gemini"),router:le.join(n,".gemini","commands","p.toml")}}}var el,vt,Up,pe,bt=v(()=>{"use strict";xs();q();Y();Jo();el='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nYou are in a prjct project when any of these signs are present: `~/Documents/prjct/<slug>/_generated/` exists, OR `.prjct/` is in cwd, OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), READ these vault files first using Read/Glob \u2014 no CLI round-trip:\n\n- `~/Documents/prjct/<slug>/_generated/index.md` \u2014 overview, ships, memory counts, patterns count\n- `~/Documents/prjct/<slug>/_generated/architecture.md` \u2014 domains, conventions, key insights\n- `~/Documents/prjct/<slug>/_generated/{patterns,insights,tech-debt}.md` \u2014 inferred state of the project\n- `~/Documents/prjct/<slug>/_generated/memory/{decision,gotcha,learning,fact,inbox}.md` \u2014 captured knowledge\n- `~/Documents/prjct/<slug>/_generated/analysis/{anti-patterns,insights,patterns,refactors,risk-areas,tech-debt}/` \u2014 past analyses by category\n- `~/Documents/prjct/<slug>/_generated/{ships,releases,tags}/` \u2014 history & taxonomy\n\nOnly fall through to source/repo reading when the vault does not contain the answer.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha discovered \u2014 persist it so the next session benefits:\n\n- `prjct remember decision "<choice + why>"` \u2014 choices made, with rationale\n- `prjct remember learning "<insight>"` \u2014 non-obvious insights gained\n- `prjct remember gotcha "<trap + how to avoid>"` \u2014 bugs/traps found\n- `prjct remember fact "<verifiable claim>"` \u2014 project facts (paths, conventions, IDs)\n- `prjct capture "<text>" --tags type:analysis,topic:<x>` \u2014 analytical dumps & inbox items\n\nTag with `--tags k:v,k:v` for searchability. Memory persists to SQLite; vault auto-regenerates. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.**\n\n## Workflow\n\n`prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`\nPause/resume: `prjct status paused` | `prjct status active` (also reopens completed tasks)\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `~/Documents/prjct/<slug>/_generated/` (Read/Glob freely; never hand-edit \u2014 fix the pipeline)\n- Project config: `.prjct/prjct.config.json` in repo root\n\nThe vault regenerates automatically on `remember`, `capture`, `ship`, `sync`, and the SessionStart/Stop hooks.\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';c(Fp,"installDocs");c(tl,"installGlobalConfig");vt=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=yr.homedir()}async ensureInit(){if(this._initialized)return;let t=await(He(),Xe(nt)).getActiveProvider();this.commandsPath=le.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),S(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(He(),Xe(nt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=le.join(this.commandsPath,t);try{await xe.unlink(s),e.push(t)}catch(r){if(r.code!=="ENOENT")return{success:!1,error:y(r)}}}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=le.join(this.commandsPath,t);try{await xe.unlink(s),e=!0}catch(r){r.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=le.join(this.commandsPath,"p");try{if((await xe.stat(e).catch(()=>null))?.isDirectory())return await xe.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return tl()}async cleanupAllLegacy(){let e=yr.homedir(),t=[],s=[le.join(e,".claude","commands","p.md"),le.join(e,".claude","commands","p.toml"),le.join(e,".gemini","commands","p.md"),le.join(e,".gemini","commands","p.toml")];for(let i of s)try{await xe.unlink(i),t.push(i)}catch{}let r=[le.join(e,".claude","commands","p"),le.join(e,".gemini","commands","p")];for(let i of r)try{(await xe.stat(i).catch(()=>null))?.isDirectory()&&(await xe.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[le.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await xe.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Fp()}};c(qo,"getProviderPaths");Up=new vt,pe=Up});import{z as he}from"zod";function il(n,e="default"){let t=nl[e]||nl.default;return n/1e3*t}function wr(n){return n<.01?`$${(n*100).toFixed(2)}\xA2`:`$${n.toFixed(2)}`}var Hp,Wp,rl,ol,nl,kr=v(()=>{"use strict";Hp=he.object({date:he.string(),tokensSaved:he.number(),syncs:he.number(),avgCompressionRate:he.number(),totalDuration:he.number()}),Wp=he.object({agentName:he.string(),usageCount:he.number(),tokensSaved:he.number()}),rl=he.object({totalTokensSaved:he.number(),avgCompressionRate:he.number(),syncCount:he.number(),watchTriggers:he.number(),avgSyncDuration:he.number(),totalSyncDuration:he.number(),agentUsage:he.array(Wp),dailyStats:he.array(Hp),firstSync:he.string(),lastUpdated:he.string()}),ol={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},nl={"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};c(il,"estimateCostSaved");c(wr,"formatCost")});function al(n,e){let t=[];Sn("Languages",n.languages,e.languages,t),Sn("Frameworks",n.frameworks,e.frameworks,t),(n.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:n.packageManager??"(none)",after:e.packageManager??"(none)"}),(n.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:n.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(n.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:n.testDir??"(none)",after:e.testDir??"(none)"}),Sn("Config files",n.configFiles,e.configFiles,t),n.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(n.fileCount),after:String(e.fileCount)});let s=n.patterns.map(d=>d.name),r=e.patterns.map(d=>d.name);Sn("Patterns",s,r,t);let o=n.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Sn("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,l=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:l,changed:u},beforeCommit:n.commitHash??null,afterCommit:e.commitHash??null}}function zo(n){if(!n.hasChanges)return`## Analysis Diff
|
|
13
|
+
`),a="",l="",u="",d=!1;for(let m of i)m.startsWith("worktree ")?a=m.replace("worktree ","").trim():m.startsWith("HEAD ")?l=m.replace("HEAD ","").trim():m.startsWith("branch ")?u=m.replace("branch refs/heads/","").trim():m==="bare"?d=!0:m==="detached"&&(u="(detached)");if(a){let m=a===t||d;s.push({path:a,branch:u,commit:l,isMain:m,slug:m?"main":wt.basename(a)})}}return s}},Jc=new Mo,Ep=Jc});var qc={};Ee(qc,{default:()=>j});import Cp from"node:crypto";import kt from"node:fs/promises";import As from"node:os";import D from"node:path";import{globSync as Pp}from"glob";var Oo,Rp,j,je=v(()=>{"use strict";be();Y();Oo=class{static{c(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?D.resolve(e):D.join(As.homedir(),".prjct-cli"),this.globalProjectsDir=D.join(this.globalBaseDir,"projects"),this.globalConfigDir=D.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=D.resolve(e),this.globalProjectsDir=D.join(this.globalBaseDir,"projects"),this.globalConfigDir=D.join(this.globalBaseDir,"config")}generateProjectId(e){return Cp.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return D.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return D.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return D.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return D.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Nt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await S(t)}async ensureGlobalStructure(){await ft(this.globalBaseDir),await ft(this.globalProjectsDir),await ft(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let r of s)await ft(D.join(t,r));return await ft(D.join(t,"planning","tasks")),await ft(D.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:r,day:o}=Sc(t);return D.join(this.getGlobalProjectPath(e),"sessions",s,r,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await ft(s),s}async listSessions(e,t=null,s=null){let r=D.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await kt.readdir(r,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let l=D.join(r,a.name),u=await kt.readdir(l,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let m=D.join(l,d.name),p=await kt.readdir(m,{withFileTypes:!0});for(let f of p)f.isDirectory()&&o.push({year:a.name,month:d.name,day:f.name,path:D.join(m,f.name),date:new Date(`${a.name}-${d.name}-${f.name}`)})}}return o.sort((a,l)=>l.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 D.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 Nt(t)}getDisplayPath(e){let t=As.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return D.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return D.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return D.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return D.join(this.globalBaseDir,".running")}getDocsPath(){return D.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(Ve(),et(yt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Ve(),et(yt)).getActiveProvider();return(Ve(),et(yt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return D.join(As.homedir(),".claude")}getClaudeSettingsPath(){return D.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return D.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return D.join(this.getGlobalProjectPath(e),"context")}async getWikiPath(e,t){if(t&&t.trim().length>0)return this.resolveVaultOverride(e,t);let s=await this.resolveProjectRootPath(e),o=D.basename(D.resolve(s)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return D.join(As.homedir(),"Documents","prjct",o)}async resolveProjectRootPath(e){try{let{worktreeService:t}=await Promise.resolve().then(()=>(ur(),lr));return await t.detect(e)&&await t.getMainWorktree(e)||e}catch{return e}}getWikiPathWithProjectHash(e,t){let r=D.basename(D.resolve(e)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",o=t.replace(/-/g,"").slice(0,8);return D.join(As.homedir(),"Documents","prjct",`${r}-${o}`)}getLegacyWikiPath(e){return D.join(e,".prjct","wiki")}resolveVaultOverride(e,t){let s=t.trim();return(s.startsWith("~/")||s==="~")&&(s=D.join(As.homedir(),s.slice(1))),D.isAbsolute(s)||(s=D.resolve(e,s)),s}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let r of s){let o=D.join(e,r.file);if(await S(o)){t.isMonorepo=!0,t.type=r.type;break}}if(!t.isMonorepo){let r=D.join(e,"package.json");if(await S(r))try{let o=await kt.readFile(r,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],r=[];try{if(t==="pnpm"){let i=(await kt.readFile(D.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(r=i[1].split(`
|
|
14
|
+
`).map(a=>a.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let o=D.join(e,"package.json"),i=await kt.readFile(o,"utf-8"),a=JSON.parse(i);if(Array.isArray(a.workspaces)?r=a.workspaces:a.workspaces?.packages&&(r=a.workspaces.packages),t==="lerna"){let l=D.join(e,"lerna.json");if(await S(l)){let u=await kt.readFile(l,"utf-8"),d=JSON.parse(u);d.packages&&(r=d.packages)}}}else if(t==="nx")r=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let o=D.join(e,"package.json"),i=await kt.readFile(o,"utf-8"),a=JSON.parse(i);Array.isArray(a.workspaces)&&(r=a.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let o of r){if(o.startsWith("!"))continue;let i=Pp(o,{cwd:e,absolute:!1});for(let a of i){let l=D.join(e,a),u=D.join(l,"package.json");if(await S(u))try{let d=await kt.readFile(u,"utf-8"),m=JSON.parse(d),p=D.join(l,"PRJCT.md");s.push({name:m.name||D.basename(a),path:l,relativePath:a,hasPrjctMd:await S(p)})}catch{}}}}catch{}return s}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let s=D.resolve(e);for(let r of t.packages){let o=D.resolve(r.path);if(s.startsWith(o))return r}return null}async findMonorepoRoot(e){let t=D.resolve(e),s=D.parse(t).root;for(;t!==s;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=D.dirname(t)}return null}},Rp=new Oo,j=Rp});var mr={};Ee(mr,{default:()=>$});import Lo from"node:fs/promises";import Ap from"node:path";import*as dr from"jsonc-parser";function zc(n){let e=[],t=dr.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let s=e[0];throw new SyntaxError(`JSON parse error at offset ${s.offset}: ${dr.printParseErrorCode(s.error)}`)}return t}var Fo,jp,$,Ce=v(()=>{"use strict";It();q();be();Y();st();tr();je();c(zc,"parseJsonc");Fo=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=j.getLocalConfigPath(e),s=await Lo.readFile(t,"utf-8");return zc(s)}catch(t){return x(t)||console.warn(`Warning: Could not read config at ${e}: ${ae(t)}`),null}}async writeConfig(e,t){let s=j.getLocalConfigPath(e);await ce(s,t)}async readGlobalConfig(e){try{let t=j.getGlobalProjectConfigPath(e),s=await Lo.readFile(t,"utf-8");return zc(s)}catch(t){return x(t)||console.warn(`Warning: Could not read global config for ${e}: ${ae(t)}`),null}}async writeGlobalConfig(e,t){let s=j.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:me,lastSync:s},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let s=j.generateProjectId(e),r=j.getGlobalProjectPath(s),o=j.getDisplayPath(r),i=b(),a={projectId:s,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:s,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:me,created:i,lastSync:i};return await this.writeGlobalConfig(s,l),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 j.hasLegacyStructure(e))return!1;if(!await j.hasConfig(e))return!0;let r=await this.readConfig(e);if(!r||!r.projectId)return!0;let o=j.getGlobalProjectPath(r.projectId);try{return(await Lo.readdir(Ap.join(o,"core"))).length===0}catch(i){return x(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:s}=await Promise.resolve().then(()=>(ur(),lr));if(await s.detect(e)){let o=await s.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return j.generateProjectId(e)}async findAuthor(e,t){let s=await this.readGlobalConfig(e);return!s||!s.authors?null:s.authors.find(r=>r.github===t)||null}async addAuthor(e,t){let s=await this.ensureGlobalConfig(e);if(s.authors.some(i=>i.github===t.github))return;let o=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 r=s.authors.find(o=>o.github===t);r&&(r.lastActivity=b(),s.lastSync=r.lastActivity,await this.writeGlobalConfig(e,s))}async getCurrentAuthor(e){let t=await Rs(),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=j.generateProjectId(e);return{projectId:s,dataPath:j.getDisplayPath(j.getGlobalProjectPath(s))}}},jp=new Fo,$=jp});import Ye from"node:fs/promises";import nt from"node:path";var Ho,$p,Pe,Kc=v(()=>{"use strict";q();Me();Y();Ho=class{static{c(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=nt.join(this.projectPath,"package.json"),t=await Ye.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(x(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=nt.join(this.projectPath,"Cargo.toml");return await Ye.readFile(e,"utf-8")}catch(e){if(x(e))return null;throw e}}async readRequirements(){try{let e=nt.join(this.projectPath,"requirements.txt");return await Ye.readFile(e,"utf-8")}catch(e){if(x(e))return null;throw e}}async readGoMod(){try{let e=nt.join(this.projectPath,"go.mod");return await Ye.readFile(e,"utf-8")}catch(e){if(x(e))return null;throw e}}async readGemfile(){try{let e=nt.join(this.projectPath,"Gemfile");return await Ye.readFile(e,"utf-8")}catch(e){if(x(e))return null;throw e}}async readMixExs(){try{let e=nt.join(this.projectPath,"mix.exs");return await Ye.readFile(e,"utf-8")}catch(e){if(x(e))return null;throw e}}async readPomXml(){try{let e=nt.join(this.projectPath,"pom.xml");return await Ye.readFile(e,"utf-8")}catch(e){if(x(e))return null;throw e}}async readComposerJson(){try{let e=nt.join(this.projectPath,"composer.json"),t=await Ye.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(x(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=nt.join(this.projectPath,"pyproject.toml");return await Ye.readFile(e,"utf-8")}catch(e){if(x(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await _('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(`
|
|
15
|
+
`).filter(Boolean).forEach(s=>{let r=s.trim().match(/^\s*(\d+)\s+(\.\w+)$/);r&&(t[r[2]]=parseInt(r[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Ye.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(s=>t.some(r=>r.test(s)))}catch(e){if(x(e))return[];throw e}}async listDirectories(){try{return(await Ye.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(x(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await _(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await _("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await _('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:s}=await _('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 _('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 S(nt.join(this.projectPath,e))}async readFile(e){try{let t=nt.join(this.projectPath,e);return await Ye.readFile(t,"utf-8")}catch(t){if(x(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await _(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
|
|
16
|
+
`).filter(Boolean)}catch{return[]}}},$p=new Ho,Pe=$p});import{z as fe}from"zod";function el(n,e="default"){let t=Yc[e]||Yc.default;return n/1e3*t}function pr(n){return n<.01?`$${(n*100).toFixed(2)}\xA2`:`$${n.toFixed(2)}`}var Dp,Ip,Qc,Zc,Yc,gr=v(()=>{"use strict";Dp=fe.object({date:fe.string(),tokensSaved:fe.number(),syncs:fe.number(),avgCompressionRate:fe.number(),totalDuration:fe.number()}),Ip=fe.object({agentName:fe.string(),usageCount:fe.number(),tokensSaved:fe.number()}),Qc=fe.object({totalTokensSaved:fe.number(),avgCompressionRate:fe.number(),syncCount:fe.number(),watchTriggers:fe.number(),avgSyncDuration:fe.number(),totalSyncDuration:fe.number(),agentUsage:fe.array(Ip),dailyStats:fe.array(Dp),firstSync:fe.string(),lastUpdated:fe.string()}),Zc={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Yc={"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};c(el,"estimateCostSaved");c(pr,"formatCost")});function tl(n,e){let t=[];Sn("Languages",n.languages,e.languages,t),Sn("Frameworks",n.frameworks,e.frameworks,t),(n.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:n.packageManager??"(none)",after:e.packageManager??"(none)"}),(n.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:n.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(n.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:n.testDir??"(none)",after:e.testDir??"(none)"}),Sn("Config files",n.configFiles,e.configFiles,t),n.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(n.fileCount),after:String(e.fileCount)});let s=n.patterns.map(d=>d.name),r=e.patterns.map(d=>d.name);Sn("Patterns",s,r,t);let o=n.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Sn("Anti-patterns",o,i,t);let a=t.filter(d=>d.type==="added").length,l=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:l,changed:u},beforeCommit:n.commitHash??null,afterCommit:e.commitHash??null}}function Wo(n){if(!n.hasChanges)return`## Analysis Diff
|
|
23
17
|
|
|
24
18
|
No changes between runs.`;let e=[];e.push("## Analysis Diff"),(n.beforeCommit||n.afterCommit)&&e.push(`> \`${n.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${n.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let s of n.items){let r=s.type==="added"?"+":s.type==="removed"?"-":"~",o=s.type==="changed"?`${s.before} \u2192 ${s.after}`:s.after??s.before??"";e.push(`| ${r} | ${s.field} | ${o} |`)}e.push("");let t=[];return n.summary.added>0&&t.push(`${n.summary.added} added`),n.summary.removed>0&&t.push(`${n.summary.removed} removed`),n.summary.changed>0&&t.push(`${n.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
|
|
25
|
-
`)}function
|
|
26
|
-
`)}function Sn(n,e,t,s){let r=new Set(e),o=new Set(t);for(let i of t)r.has(i)||s.push({field:n,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:n,type:"removed",before:i})}var
|
|
19
|
+
`)}function sl(n){if(!n.hasChanges)return"No changes between analysis runs.";let e=[];(n.beforeCommit||n.afterCommit)&&(e.push(` ${n.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${n.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of n.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
|
|
20
|
+
`)}function Sn(n,e,t,s){let r=new Set(e),o=new Set(t);for(let i of t)r.has(i)||s.push({field:n,type:"added",after:i});for(let i of e)o.has(i)||s.push({field:n,type:"removed",before:i})}var Go=v(()=>{"use strict";c(tl,"generateAnalysisDiff");c(Wo,"formatAnalysisDiffMd");c(sl,"formatAnalysisDiffText");c(Sn,"diffStringArray")});var Vo=v(()=>{"use strict"});function nl(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function fr(){return nl()==="bun"}function Bo(){if(nl()==="bun")return!0;try{let{execSync:n}=Te("node:child_process");return n("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var hr=v(()=>{"use strict";c(nl,"detectRuntime");c(fr,"isBun");c(Bo,"isBunAvailable")});var ol={};Ee(ol,{PrjctDatabase:()=>yr,default:()=>L,prjctDb:()=>A});import Jo from"node:fs";import rl from"node:path";function _p(n){if(fr()){let{Database:r}=Te("bun:sqlite");return new r(n,{create:!0})}let e=Te("better-sqlite3"),t=new e(n),s=t.exec.bind(t);return t.run=r=>s(r),t}var Np,Mp,yr,A,L,he=v(()=>{"use strict";je();hr();c(_p,"openDatabase");Np=[{version:1,name:"initial-schema",up:c(n=>{n.run(`
|
|
27
21
|
-- =======================================================================
|
|
28
22
|
-- Document storage (backward-compatible with JSON file pattern)
|
|
29
23
|
-- =======================================================================
|
|
@@ -494,22 +488,28 @@ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(n.beforeCommit||n
|
|
|
494
488
|
);
|
|
495
489
|
|
|
496
490
|
CREATE INDEX IF NOT EXISTS idx_wrc_rule ON workflow_rule_cache(rule_id);
|
|
497
|
-
`)},"up")},{version:14,name:"workflow-rules-trust-source",up:c(n=>{try{n.run("ALTER TABLE workflow_rules ADD COLUMN trust_source TEXT NOT NULL DEFAULT 'local'")}catch{}},"up")},{version:15,name:"disable-orphan-workflow-rules",up:c(n=>{let t=["pause","resume","reopen","next","dash","bug","idea","linear","jira","tokens","velocity","plan"].map(s=>`'${s}'`).join(",");n.run(`UPDATE workflow_rules SET enabled = 0 WHERE command IN (${t}) AND enabled = 1`)},"up")}],
|
|
491
|
+
`)},"up")},{version:14,name:"workflow-rules-trust-source",up:c(n=>{try{n.run("ALTER TABLE workflow_rules ADD COLUMN trust_source TEXT NOT NULL DEFAULT 'local'")}catch{}},"up")},{version:15,name:"disable-orphan-workflow-rules",up:c(n=>{let t=["pause","resume","reopen","next","dash","bug","idea","linear","jira","tokens","velocity","plan"].map(s=>`'${s}'`).join(",");n.run(`UPDATE workflow_rules SET enabled = 0 WHERE command IN (${t}) AND enabled = 1`)},"up")}],Mp=3,yr=class{static{c(this,"PrjctDatabase")}connections=new Map;accessOrder=[];getDbPath(e){return rl.join(j.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=Mp&&this.evictLru();let s=this.getDbPath(e),r=rl.dirname(s);Jo.existsSync(r)||Jo.mkdirSync(r,{recursive:!0});let o=_p(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 Jo.existsSync(this.getDbPath(e))}getDoc(e,t){let r=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return r?JSON.parse(r.data):null}setDoc(e,t,s){let r=this.getDb(e),o=JSON.stringify(s),i=new Date().toISOString();r.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,s,r){let o=this.getDb(e),i=new Date().toISOString();o.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,r??null,JSON.stringify(s),i)}getEvents(e,t,s=100){let r=this.getDb(e);return t?r.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,s):r.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(s)}query(e,t,...s){return this.getDb(e).prepare(t).all(...s)}run(e,t,...s){this.getDb(e).prepare(t).run(...s)}get(e,t,...s){return this.getDb(e).prepare(t).get(...s)??null}transaction(e,t){let s=this.getDb(e);return s.transaction(t)(s)}runMigrations(e){e.run(`
|
|
498
492
|
CREATE TABLE IF NOT EXISTS _migrations (
|
|
499
493
|
version INTEGER PRIMARY KEY,
|
|
500
494
|
name TEXT NOT NULL,
|
|
501
495
|
applied_at TEXT NOT NULL
|
|
502
496
|
)
|
|
503
|
-
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Vp)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}},A=new Sr,L=A});import Jp from"node:fs/promises";import qp from"node:path";function $s(n){return n.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function zp(n,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...$s(p));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of r){let f;for(;(f=p.exec(n))!==null;)f[1]&&t.push(...$s(f[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let f;for(;(f=p.exec(n))!==null;)f[1]&&t.push(...$s(f[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(n))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...$s(p));else{let f=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...$s(f))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(n))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(f=>f.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(n))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(f=>f.length>2&&/^[a-z]+$/.test(f));t.push(...p)}return t.filter(p=>p.length>1&&!gl.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function Xp(n){return n.split(/\s+/).flatMap(e=>$s(e)).filter(e=>e.length>1&&!gl.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Kp(n){let e=await Es(n),t={},s={},r=0,o=await Cs(e,50,async a=>{try{let l=await Jp.readFile(qp.join(n,a),"utf-8"),u=zp(l,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:l}of o){t[a]={tokens:l,length:l.length},r+=l.length;let u=new Map;for(let d of l)u.set(d,(u.get(d)||0)+1);for(let[d,m]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:m})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Yp(n,e){return Math.log((e-n+.5)/(n+.5)+1)}function Qp(n,e){let t=Xp(n);if(t.length===0)return[];let s=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=Yp(o.length,e.totalDocs);for(let{path:a,tf:l}of o){let u=e.documents[a];if(!u)continue;let d=l*(1.2+1),m=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function Zp(n,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,r])=>[s,r.length]))};L.setDoc(n,Zo,t),Tr.delete(n)}function Er(n){let e=L.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Zo);if(!e)return Tr.delete(n),null;let t=Tr.get(n);if(t&&t.updatedAt===e.updated_at)return t.index;let s=L.getDoc(n,Zo);if(!s)return null;let r={};for(let[i,a]of Object.entries(s.docLengths))r[i]={tokens:[],length:a};let o={documents:r,invertedIndex:s.invertedIndex,avgDocLength:s.avgDocLength,totalDocs:s.totalDocs,builtAt:s.builtAt};return Tr.set(n,{index:o,updatedAt:e.updated_at}),o}async function fl(n,e){let t=await Kp(n);return Zp(e,t),t}function hl(n,e,t=15){let s=Er(n);return s?Qp(e,s).slice(0,t):[]}var gl,Zo,Tr,ei=v(()=>{"use strict";Ko();ye();Y();gl=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"]);c($s,"splitIdentifier");c(zp,"tokenizeFile");c(Xp,"tokenizeQuery");c(Kp,"buildIndex");c(Yp,"idf");c(Qp,"score");Zo="bm25-index",Tr=new Map;c(Zp,"saveIndex");c(Er,"loadIndex");c(fl,"indexProject");c(hl,"queryFiles")});import ti from"node:fs/promises";import Lt from"node:path";import{z as U}from"zod";async function rg(n,e){let t=Date.now();if(n.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=Lt.join(e,"package.json"),r=await ti.readFile(s,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],l=[];for(let u of n.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?l.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${l.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 x(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 og(n,e){let t=Date.now();if(n.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await lg(e),r=new Set(s),o=[],i=[];for(let a of n.languages){let l=ng[a];if(!l)continue;l.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function ig(n,e){let t=Date.now(),s=n.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of s){let a=i.location,l=Lt.join(e,a);await S(l)?o.push(a):r.push(`${i.name} (${a})`)}return r.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function ag(n,e){let t=Date.now();try{let s=await ug(e),r=n.fileCount,o=.1,i=Math.abs(s-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function cg(n,e){let t=Date.now();if(n.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],r=[];for(let o of n.antiPatterns){let i=Lt.join(e,o.file);await S(i)?r.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function yl(n,e){let t=Date.now(),s=await Promise.all([rg(n,e),og(n,e),ig(n,e),ag(n,e),cg(n,e)]),r=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:r===0,checks:s,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function lg(n){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(r){try{let o=await ti.readdir(r,{withFileTypes:!0});for(let i of o){let a=Lt.join(r,i.name),l=Lt.relative(n,a);if(!t.some(u=>u.test(l))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=Lt.extname(i.name);u&&e.add(u)}}}}catch{}}return c(s,"scanDir"),await s(n),Array.from(e)}async function ug(n){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(r){try{let o=await ti.readdir(r,{withFileTypes:!0});for(let i of o){let a=Lt.join(r,i.name),l=Lt.relative(n,a);t.some(u=>u.test(l))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return c(s,"scanDir"),await s(n),e}var eg,tg,sg,si,ng,wl=v(()=>{"use strict";q();Y();sr();eg=U.enum(["draft","verified","sealed"]),tg=U.object({name:U.string(),description:U.string(),location:U.string().optional(),severity:U.enum(["low","medium","high"]).optional(),language:U.string().optional(),framework:U.string().optional(),source:U.enum(["baseline","repo","context7","feedback"]).optional(),confidence:U.number().min(0).max(1).optional()}),sg=U.object({issue:U.string(),file:U.string(),suggestion:U.string(),severity:U.enum(["low","medium","high"]).optional(),language:U.string().optional(),framework:U.string().optional(),source:U.enum(["baseline","repo","context7","feedback"]).optional(),confidence:U.number().min(0).max(1).optional()}),si=U.object({projectId:U.string(),languages:U.array(U.string()),frameworks:U.array(U.string()),packageManager:U.string().optional(),sourceDir:U.string().optional(),testDir:U.string().optional(),configFiles:U.array(U.string()),fileCount:U.number(),patterns:U.array(tg),antiPatterns:U.array(sg),analyzedAt:U.string(),modelMetadata:vn.optional(),status:eg.default("draft"),commitHash:U.string().optional(),signature:U.string().optional(),sealedAt:U.string().optional(),verifiedAt:U.string().optional()}),ng={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"]};c(rg,"verifyFrameworks");c(og,"verifyLanguages");c(ig,"verifyPatternLocations");c(ag,"verifyFileCount");c(cg,"verifyAntiPatternFiles");c(yl,"semanticVerify");c(lg,"getProjectExtensions");c(ug,"countProjectFiles")});import{createHash as dg}from"node:crypto";function Tn(n){return dg("sha256").update(n).digest("hex")}function kl(n){return Tn(n).slice(0,16)}var Cr=v(()=>{"use strict";c(Tn,"sha256");c(kl,"sha256Short")});var ni,Ft,ri=v(()=>{"use strict";je();be();Y();ni=class{static{c(this,"SyncEventBus")}async publish(e){let t=j.getSyncPendingPath(e.projectId),s=await ge(t,[])??[],r=Array.isArray(s)?s:[];r.push(e),await ce(t,r)}async getPending(e){let t=j.getSyncPendingPath(e),s=await ge(t,[])??[];return Array.isArray(s)?s:[]}async clearPending(e){let t=j.getSyncPendingPath(e);await ce(t,[])}async updateLastSync(e){let t=j.getLastSyncPath(e),s={timestamp:b(),success:!0};await ce(t,s)}async getLastSync(e){let t=j.getLastSyncPath(e);return await ge(t,null)}},Ft=new ni});var _e,Ut=v(()=>{"use strict";ri();or();be();ye();_e=class{static{c(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new nr({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=A.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),r=t(s);return await this.write(e,r),r}async publishEvent(e,t,s){let r={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:b(),projectId:e};await Ft.publish(r)}async publishEntityEvent(e,t,s,r){let o=`${t}.${s}`,i={...r,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var oi,Oe,En=v(()=>{"use strict";wl();Xo();be();Cr();Ut();oi=class extends _e{static{c(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"};si.parse(s),await this.update(e,r=>({...r,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),r=b(),o={...t.draft,status:"sealed",signature:s,sealedAt:r};return si.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=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:al(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),r=s.sealed??s.draft;return r?await yl(r,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Tn(JSON.stringify(t))}},Oe=new oi});var ii,mg,Ze,Cn=v(()=>{"use strict";be();ye();ii=class{static{c(this,"LLMAnalysisStorage")}save(e,t){let s=A.getDb(e),r=b();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=A.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?A.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getAllFull(e){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(s=>({id:s.id,status:s.status,commitHash:s.commit_hash,analyzedAt:s.analyzed_at,supersededAt:s.superseded_at,analysis:JSON.parse(s.analysis)}))}getHistory(e,t=10){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},mg=new ii,Ze=mg});import pg from"node:crypto";function Le(){return pg.randomUUID()}var ns=v(()=>{"use strict";c(Le,"generateUUID")});import{z as w}from"zod";var gg,Pr,fg,hg,ai,bl,Sl,Tl,El,vl,yg,wg,kg,Cl,vg,Pl,ci=v(()=>{"use strict";sr();gg=w.enum(["low","medium","high","critical"]),Pr=w.enum(["feature","bug","improvement","chore"]),fg=w.enum(["active","backlog","previously_active"]),hg=w.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),ai=w.object({title:w.string(),description:w.string(),filesChanged:w.array(w.object({path:w.string(),action:w.enum(["created","modified","deleted"])})),whatWasDone:w.array(w.string()).min(1),outputForNextAgent:w.string().min(1),notes:w.string().optional()}),bl=w.object({output:w.string().min(1,"Subtask output is required"),summary:ai}),Sl=w.object({id:w.string(),description:w.string(),domain:w.string(),agent:w.string(),status:hg,dependsOn:w.array(w.string()),startedAt:w.string().optional(),completedAt:w.string().optional(),output:w.string().optional(),summary:ai.optional(),skipReason:w.string().optional(),blockReason:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional()}),Tl=w.object({completed:w.number(),total:w.number(),percentage:w.number()}),El=w.object({id:w.string(),description:w.string(),type:Pr.optional(),startedAt:w.string(),sessionId:w.string(),featureId:w.string().optional(),subtasks:w.array(Sl).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:Tl.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:vn.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional(),parentDescription:w.string().optional(),branch:w.string().optional(),prUrl:w.string().optional()}),vl=w.object({id:w.string(),description:w.string(),status:w.literal("paused"),startedAt:w.string(),pausedAt:w.string(),pauseReason:w.string().optional(),type:Pr.optional(),sessionId:w.string().optional(),featureId:w.string().optional(),subtasks:w.array(Sl).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:Tl.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:vn.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),yg=w.object({stackConfirmed:w.array(w.string()).optional(),patternsDiscovered:w.array(w.string()).optional(),agentAccuracy:w.array(w.object({agent:w.string(),rating:w.enum(["helpful","neutral","inaccurate"]),note:w.string().optional()})).optional(),issuesEncountered:w.array(w.string()).optional()}),wg=w.object({taskId:w.string(),title:w.string(),classification:Pr,startedAt:w.string(),completedAt:w.string(),subtaskCount:w.number(),subtaskSummaries:w.array(ai),outcome:w.string(),branchName:w.string(),linearId:w.string().optional(),linearUuid:w.string().optional(),prUrl:w.string().optional(),feedback:yg.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),kg=El.extend({workspaceId:w.string(),worktreePath:w.string().optional(),agentSessionId:w.string().optional(),jiraId:w.string().optional(),jiraUuid:w.string().optional(),dispatchedFrom:w.string().optional()}),Cl=w.object({currentTask:El.nullable(),previousTask:vl.nullable().optional(),pausedTasks:w.array(vl).optional(),taskHistory:w.array(wg).optional(),activeTasks:w.array(kg).optional(),lastUpdated:w.string()}),vg=w.object({id:w.string(),description:w.string(),body:w.string().optional(),priority:gg,type:Pr,featureId:w.string().optional(),originFeature:w.string().optional(),completed:w.boolean(),completedAt:w.string().optional(),createdAt:w.string(),section:fg,agent:w.string().optional(),groupName:w.string().optional(),groupId:w.string().optional()}),Pl=w.object({tasks:w.array(vg),lastUpdated:w.string()})});var Pn,li,rs,ui=v(()=>{"use strict";Pn={idle:{transitions:["task"],prompt:"prjct task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"prjct status done Complete task | prjct status paused Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct task <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct task <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct task <description> Start new task",description:"Feature shipped"}},li=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){if(Pn[e].transitions.includes(t))return{valid:!0};let r=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return e}}getStateInfo(e){return Pn[e]}getPrompt(e){return Pn[e].prompt}getValidCommands(e){return Pn[e].transitions}formatNextSteps(e){return Pn[e].transitions.map(s=>{switch(s){case"task":return"prjct task <desc> Start new task";case"done":return"prjct status done Complete current task";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${s}`}})}},rs=new li});var Rt,di,et,os=v(()=>{"use strict";ns();be();ye();Rt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},di=class{static{c(this,"ArchiveStorage")}archive(e,t){let s=Le(),r=b();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=b();return A.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Le(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=A.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in s&&(s[o]=r.count),s.total+=r.count}return s}restore(e,t){let s=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(A.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);A.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},et=new di});var mi,F,it=v(()=>{"use strict";ns();ci();be();ui();os();Ut();mi=class extends _e{static{c(this,"StateStorage")}constructor(){super("state.json",Cl)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=rs.getCurrentState(e),r=rs.canTransition(s,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async getPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let r={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let r={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:b()})),r}async completeTask(e,t){let s=await this.read(e),r=s.currentTask;if(!r)return null;this.validateTransition(s,"done");let o=b(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(s),l=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:l,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,s){let r=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=r.length>0?r.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:r,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),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 r={...s.currentTask,status:"paused",pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let s=await this.read(e),r=this.getPausedTasksFromState(s);if(r.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=r.findIndex(f=>f.id===t),o===-1))return null;let i=r[o],a=r.filter((f,h)=>h!==o),{status:l,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:b(),sessionId:i.sessionId??Le()};return await this.update(e,f=>({...f,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return Array.isArray(e.pausedTasks)&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<r),i=s.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];et.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:[],activeTasks:[],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(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of s){let f=p.feedback;Array.isArray(f.stackConfirmed)&&r.push(...f.stackConfirmed),Array.isArray(f.patternsDiscovered)&&o.push(...f.patternsDiscovered),Array.isArray(f.agentAccuracy)&&i.push(...f.agentAccuracy),Array.isArray(f.issuesEncountered)&&a.push(...f.issuesEncountered)}let l=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,f])=>f>=2).map(([p])=>p);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async startTaskInWorkspace(e,t,s){let r={...t,workspaceId:s,startedAt:b()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],r],lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId,workspaceId:s}),r}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(r=>r.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let r=await this.read(e),i=(r.activeTasks||[]).find(m=>m.workspaceId===t);if(!i)return null;let a=b(),l=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(r),d=[l,...u].slice(0,this.maxTaskHistory);return await this.update(e,m=>({...m,activeTasks:(m.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(l=>l.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,l=>{let u=[...l.activeTasks||[]];return u[i]=a,{...l,activeTasks:u,lastUpdated:b()}}),a}async addTokens(e,t,s){let r=await this.read(e);if(!r.currentTask)return null;let o=(r.currentTask.tokensIn||0)+t,i=(r.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 r=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:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=bl.safeParse(t);if(!s.success){let h=s.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
497
|
+
`);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of Np)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}},A=new yr,L=A});import Op from"node:fs/promises";import Lp from"node:path";function js(n){return n.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function Fp(n,e){let t=[],s=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let p of s)t.push(...js(p));let r=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let p of r){let f;for(;(f=p.exec(n))!==null;)f[1]&&t.push(...js(f[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let p of o){let f;for(;(f=p.exec(n))!==null;)f[1]&&t.push(...js(f[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(n))!==null;){let p=a[1];if(p.startsWith(".")||p.startsWith("@/"))t.push(...js(p));else{let f=p.startsWith("@")?p.split("/").slice(0,2).join("/"):p.split("/")[0];t.push(...js(f))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(n))!==null;){let p=u[1].toLowerCase().split(/\s+/).filter(f=>f.length>2);t.push(...p)}let d=/\/\*\*?([\s\S]*?)\*\//g,m;for(;(m=d.exec(n))!==null;){let p=m[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(f=>f.length>2&&/^[a-z]+$/.test(f));t.push(...p)}return t.filter(p=>p.length>1&&!cl.has(p)&&/^[a-z][a-z0-9]*$/.test(p))}function Up(n){return n.split(/\s+/).flatMap(e=>js(e)).filter(e=>e.length>1&&!cl.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function Hp(n){let e=await Es(n),t={},s={},r=0,o=await Cs(e,50,async a=>{try{let l=await Op.readFile(Lp.join(n,a),"utf-8"),u=Fp(l,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:l}of o){t[a]={tokens:l,length:l.length},r+=l.length;let u=new Map;for(let d of l)u.set(d,(u.get(d)||0)+1);for(let[d,m]of u)s[d]||(s[d]=[]),s[d].push({path:a,tf:m})}let i=Object.keys(t).length;return{documents:t,invertedIndex:s,avgDocLength:i>0?r/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function Wp(n,e){return Math.log((e-n+.5)/(n+.5)+1)}function Gp(n,e){let t=Up(n);if(t.length===0)return[];let s=new Map;for(let r of t){let o=e.invertedIndex[r];if(!o)continue;let i=Wp(o.length,e.totalDocs);for(let{path:a,tf:l}of o){let u=e.documents[a];if(!u)continue;let d=l*(1.2+1),m=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),p=i*(d/m);s.set(a,(s.get(a)||0)+p)}}return Array.from(s.entries()).map(([r,o])=>({path:r,score:o})).sort((r,o)=>o.score-r.score)}function Vp(n,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([s,r])=>[s,r.length]))};L.setDoc(n,qo,t),wr.delete(n)}function kr(n){let e=L.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",qo);if(!e)return wr.delete(n),null;let t=wr.get(n);if(t&&t.updatedAt===e.updated_at)return t.index;let s=L.getDoc(n,qo);if(!s)return null;let r={};for(let[i,a]of Object.entries(s.docLengths))r[i]={tokens:[],length:a};let o={documents:r,invertedIndex:s.invertedIndex,avgDocLength:s.avgDocLength,totalDocs:s.totalDocs,builtAt:s.builtAt};return wr.set(n,{index:o,updatedAt:e.updated_at}),o}async function ll(n,e){let t=await Hp(n);return Vp(e,t),t}function ul(n,e,t=15){let s=kr(n);return s?Gp(e,s).slice(0,t):[]}var cl,qo,wr,zo=v(()=>{"use strict";Vo();he();Y();cl=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"]);c(js,"splitIdentifier");c(Fp,"tokenizeFile");c(Up,"tokenizeQuery");c(Hp,"buildIndex");c(Wp,"idf");c(Gp,"score");qo="bm25-index",wr=new Map;c(Vp,"saveIndex");c(kr,"loadIndex");c(ll,"indexProject");c(ul,"queryFiles")});import Xo from"node:fs/promises";import Lt from"node:path";import{z as U}from"zod";async function Xp(n,e){let t=Date.now();if(n.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let s=Lt.join(e,"package.json"),r=await Xo.readFile(s,"utf-8"),o=JSON.parse(r),i={...o.dependencies,...o.devDependencies},a=[],l=[];for(let u of n.frameworks){let d=u.toLowerCase();Object.keys(i).some(p=>p.toLowerCase().includes(d))?l.push(u):a.push(u)}return a.length===0?{name:"Framework verification",passed:!0,output:`${l.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 x(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 Kp(n,e){let t=Date.now();if(n.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let s=await eg(e),r=new Set(s),o=[],i=[];for(let a of n.languages){let l=zp[a];if(!l)continue;l.some(d=>r.has(d))?o.push(a):i.push(a)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(s){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Yp(n,e){let t=Date.now(),s=n.patterns.filter(i=>i.location);if(s.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let r=[],o=[];for(let i of s){let a=i.location,l=Lt.join(e,a);await S(l)?o.push(a):r.push(`${i.name} (${a})`)}return r.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function Qp(n,e){let t=Date.now();try{let s=await tg(e),r=n.fileCount,o=.1,i=Math.abs(s-r),a=r*o;return i<=a?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${r}, actual: ${s})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${r}, actual ${s} (diff: ${i})`,durationMs:Date.now()-t}}catch(s){return{name:"File count verification",passed:!1,error:`Failed to count files: ${s instanceof Error?s.message:"unknown error"}`,durationMs:Date.now()-t}}}async function Zp(n,e){let t=Date.now();if(n.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let s=[],r=[];for(let o of n.antiPatterns){let i=Lt.join(e,o.file);await S(i)?r.push(o.file):s.push(`${o.issue} (${o.file})`)}return s.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${r.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function dl(n,e){let t=Date.now(),s=await Promise.all([Xp(n,e),Kp(n,e),Yp(n,e),Qp(n,e),Zp(n,e)]),r=s.filter(i=>!i.passed).length,o=s.filter(i=>i.passed).length;return{passed:r===0,checks:s,totalMs:Date.now()-t,failedCount:r,passedCount:o}}async function eg(n){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(r){try{let o=await Xo.readdir(r,{withFileTypes:!0});for(let i of o){let a=Lt.join(r,i.name),l=Lt.relative(n,a);if(!t.some(u=>u.test(l))){if(i.isDirectory())await s(a);else if(i.isFile()){let u=Lt.extname(i.name);u&&e.add(u)}}}}catch{}}return c(s,"scanDir"),await s(n),Array.from(e)}async function tg(n){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function s(r){try{let o=await Xo.readdir(r,{withFileTypes:!0});for(let i of o){let a=Lt.join(r,i.name),l=Lt.relative(n,a);t.some(u=>u.test(l))||(i.isDirectory()?await s(a):i.isFile()&&e++)}}catch{}}return c(s,"scanDir"),await s(n),e}var Bp,Jp,qp,Ko,zp,ml=v(()=>{"use strict";q();Y();sr();Bp=U.enum(["draft","verified","sealed"]),Jp=U.object({name:U.string(),description:U.string(),location:U.string().optional(),severity:U.enum(["low","medium","high"]).optional(),language:U.string().optional(),framework:U.string().optional(),source:U.enum(["baseline","repo","context7","feedback"]).optional(),confidence:U.number().min(0).max(1).optional()}),qp=U.object({issue:U.string(),file:U.string(),suggestion:U.string(),severity:U.enum(["low","medium","high"]).optional(),language:U.string().optional(),framework:U.string().optional(),source:U.enum(["baseline","repo","context7","feedback"]).optional(),confidence:U.number().min(0).max(1).optional()}),Ko=U.object({projectId:U.string(),languages:U.array(U.string()),frameworks:U.array(U.string()),packageManager:U.string().optional(),sourceDir:U.string().optional(),testDir:U.string().optional(),configFiles:U.array(U.string()),fileCount:U.number(),patterns:U.array(Jp),antiPatterns:U.array(qp),analyzedAt:U.string(),modelMetadata:vn.optional(),status:Bp.default("draft"),commitHash:U.string().optional(),signature:U.string().optional(),sealedAt:U.string().optional(),verifiedAt:U.string().optional()}),zp={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"]};c(Xp,"verifyFrameworks");c(Kp,"verifyLanguages");c(Yp,"verifyPatternLocations");c(Qp,"verifyFileCount");c(Zp,"verifyAntiPatternFiles");c(dl,"semanticVerify");c(eg,"getProjectExtensions");c(tg,"countProjectFiles")});import{createHash as sg}from"node:crypto";function Tn(n){return sg("sha256").update(n).digest("hex")}function pl(n){return Tn(n).slice(0,16)}var vr=v(()=>{"use strict";c(Tn,"sha256");c(pl,"sha256Short")});var Yo,Ft,Qo=v(()=>{"use strict";je();be();Y();Yo=class{static{c(this,"SyncEventBus")}async publish(e){let t=j.getSyncPendingPath(e.projectId),s=await pe(t,[])??[],r=Array.isArray(s)?s:[];r.push(e),await ce(t,r)}async getPending(e){let t=j.getSyncPendingPath(e),s=await pe(t,[])??[];return Array.isArray(s)?s:[]}async clearPending(e){let t=j.getSyncPendingPath(e);await ce(t,[])}async updateLastSync(e){let t=j.getLastSyncPath(e),s={timestamp:b(),success:!0};await ce(t,s)}async getLastSync(e){let t=j.getLastSyncPath(e);return await pe(t,null)}},Ft=new Yo});var _e,Ut=v(()=>{"use strict";Qo();or();be();he();_e=class{static{c(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new nr({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=A.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){A.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),r=t(s);return await this.write(e,r),r}async publishEvent(e,t,s){let r={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:b(),projectId:e};await Ft.publish(r)}async publishEntityEvent(e,t,s,r){let o=`${t}.${s}`,i={...r,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return A.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Zo,Oe,En=v(()=>{"use strict";ml();Go();be();vr();Ut();Zo=class extends _e{static{c(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"};Ko.parse(s),await this.update(e,r=>({...r,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),r=b(),o={...t.draft,status:"sealed",signature:s,sealedAt:r};return Ko.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:r}),await this.publishEntityEvent(e,"analysis","sealed",{commitHash:o.commitHash,signature:s}),{success:!0,signature:s}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let s=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:tl(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let s=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return s===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${s}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let s=await this.read(e),r=s.sealed??s.draft;return r?await dl(r,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return Tn(JSON.stringify(t))}},Oe=new Zo});var ei,ng,Qe,Cn=v(()=>{"use strict";be();he();ei=class{static{c(this,"LLMAnalysisStorage")}save(e,t){let s=A.getDb(e),r=b();s.transaction(()=>{s.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(r),s.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=A.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?A.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getAllFull(e){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(s=>({id:s.id,status:s.status,commitHash:s.commit_hash,analyzedAt:s.analyzed_at,supersededAt:s.superseded_at,analysis:JSON.parse(s.analysis)}))}getHistory(e,t=10){return A.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(r=>{let o=JSON.parse(r.analysis);return{id:r.id,commitHash:r.commit_hash,status:r.status,analyzedAt:r.analyzed_at,patternCount:o.patterns.length}})}},ng=new ei,Qe=ng});import rg from"node:crypto";function Le(){return rg.randomUUID()}var ss=v(()=>{"use strict";c(Le,"generateUUID")});import{z as w}from"zod";var og,br,ig,ag,ti,fl,hl,yl,wl,gl,cg,lg,ug,kl,dg,vl,si=v(()=>{"use strict";sr();og=w.enum(["low","medium","high","critical"]),br=w.enum(["feature","bug","improvement","chore"]),ig=w.enum(["active","backlog","previously_active"]),ag=w.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),ti=w.object({title:w.string(),description:w.string(),filesChanged:w.array(w.object({path:w.string(),action:w.enum(["created","modified","deleted"])})),whatWasDone:w.array(w.string()).min(1),outputForNextAgent:w.string().min(1),notes:w.string().optional()}),fl=w.object({output:w.string().min(1,"Subtask output is required"),summary:ti}),hl=w.object({id:w.string(),description:w.string(),domain:w.string(),agent:w.string(),status:ag,dependsOn:w.array(w.string()),startedAt:w.string().optional(),completedAt:w.string().optional(),output:w.string().optional(),summary:ti.optional(),skipReason:w.string().optional(),blockReason:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional()}),yl=w.object({completed:w.number(),total:w.number(),percentage:w.number()}),wl=w.object({id:w.string(),description:w.string(),type:br.optional(),startedAt:w.string(),sessionId:w.string(),featureId:w.string().optional(),subtasks:w.array(hl).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:yl.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:vn.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional(),parentDescription:w.string().optional(),branch:w.string().optional(),prUrl:w.string().optional()}),gl=w.object({id:w.string(),description:w.string(),status:w.literal("paused"),startedAt:w.string(),pausedAt:w.string(),pauseReason:w.string().optional(),type:br.optional(),sessionId:w.string().optional(),featureId:w.string().optional(),subtasks:w.array(hl).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:yl.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:vn.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),cg=w.object({stackConfirmed:w.array(w.string()).optional(),patternsDiscovered:w.array(w.string()).optional(),agentAccuracy:w.array(w.object({agent:w.string(),rating:w.enum(["helpful","neutral","inaccurate"]),note:w.string().optional()})).optional(),issuesEncountered:w.array(w.string()).optional()}),lg=w.object({taskId:w.string(),title:w.string(),classification:br,startedAt:w.string(),completedAt:w.string(),subtaskCount:w.number(),subtaskSummaries:w.array(ti),outcome:w.string(),branchName:w.string(),linearId:w.string().optional(),linearUuid:w.string().optional(),prUrl:w.string().optional(),feedback:cg.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),ug=wl.extend({workspaceId:w.string(),worktreePath:w.string().optional(),agentSessionId:w.string().optional(),jiraId:w.string().optional(),jiraUuid:w.string().optional(),dispatchedFrom:w.string().optional()}),kl=w.object({currentTask:wl.nullable(),previousTask:gl.nullable().optional(),pausedTasks:w.array(gl).optional(),taskHistory:w.array(lg).optional(),activeTasks:w.array(ug).optional(),lastUpdated:w.string()}),dg=w.object({id:w.string(),description:w.string(),body:w.string().optional(),priority:og,type:br,featureId:w.string().optional(),originFeature:w.string().optional(),completed:w.boolean(),completedAt:w.string().optional(),createdAt:w.string(),section:ig,agent:w.string().optional(),groupName:w.string().optional(),groupId:w.string().optional()}),vl=w.object({tasks:w.array(dg),lastUpdated:w.string()})});var Pn,ni,ns,ri=v(()=>{"use strict";Pn={idle:{transitions:["task"],prompt:"prjct task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"prjct status done Complete task | prjct status paused Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct task <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct task <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct task <description> Start new task",description:"Feature shipped"}},ni=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){if(Pn[e].transitions.includes(t))return{valid:!0};let r=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${r}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return e}}getStateInfo(e){return Pn[e]}getPrompt(e){return Pn[e].prompt}getValidCommands(e){return Pn[e].transitions}formatNextSteps(e){return Pn[e].transitions.map(s=>{switch(s){case"task":return"prjct task <desc> Start new task";case"done":return"prjct status done Complete current task";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${s}`}})}},ns=new ni});var Pt,oi,Ze,rs=v(()=>{"use strict";ss();be();he();Pt={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},oi=class{static{c(this,"ArchiveStorage")}archive(e,t){let s=Le(),r=b();return A.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,r,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=b();return A.transaction(e,r=>{let o=r.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Le(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?A.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):A.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=A.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let r of t){let o=r.entity_type;o in s&&(s[o]=r.count),s.total+=r.count}return s}restore(e,t){let s=A.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(A.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),r=this.getTotalCount(e);A.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return r-o}getTotalCount(e){return A.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Ze=new oi});var ii,F,rt=v(()=>{"use strict";ss();si();be();ri();rs();Ut();ii=class extends _e{static{c(this,"StateStorage")}constructor(){super("state.json",kl)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=ns.getCurrentState(e),r=ns.canTransition(s,t);if(!r.valid)throw new Error(`${r.error}. ${r.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async getPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let r={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId}),r}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let r={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:r,lastUpdated:b()})),r}async completeTask(e,t){let s=await this.read(e),r=s.currentTask;if(!r)return null;this.validateTransition(s,"done");let o=b(),i=this.createTaskHistoryEntry(r,o,t),a=this.getTaskHistoryFromState(s),l=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:l,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:r.id,description:r.description,startedAt:r.startedAt,completedAt:o}),r}createTaskHistoryEntry(e,t,s){let r=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=r.length>0?r.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:r,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),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 r={...s.currentTask,status:"paused",pausedAt:b(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[r,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:b()})),await this.publishEvent(e,"task.paused",{taskId:r.id,description:r.description,pausedAt:r.pausedAt,reason:t,pausedCount:i.length}),r}async resumeTask(e,t){let s=await this.read(e),r=this.getPausedTasksFromState(s);if(r.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=r.findIndex(f=>f.id===t),o===-1))return null;let i=r[o],a=r.filter((f,h)=>h!==o),{status:l,pausedAt:u,pauseReason:d,...m}=i,p={...m,startedAt:b(),sessionId:i.sessionId??Le()};return await this.update(e,f=>({...f,currentTask:p,previousTask:null,pausedTasks:a,lastUpdated:b()})),await this.publishEvent(e,"task.resumed",{taskId:p.id,description:p.description,resumedAt:p.startedAt,remainingPaused:a.length}),p}getPausedTasksFromState(e){return Array.isArray(e.pausedTasks)&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<r)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),r=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<r),i=s.filter(a=>new Date(a.pausedAt).getTime()>=r);if(o.length===0)return[];Ze.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:[],activeTasks:[],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(p=>p.feedback),r=[],o=[],i=[],a=[];for(let p of s){let f=p.feedback;Array.isArray(f.stackConfirmed)&&r.push(...f.stackConfirmed),Array.isArray(f.patternsDiscovered)&&o.push(...f.patternsDiscovered),Array.isArray(f.agentAccuracy)&&i.push(...f.agentAccuracy),Array.isArray(f.issuesEncountered)&&a.push(...f.issuesEncountered)}let l=[...new Set(r)],u=[...new Set(o)],d=new Map;for(let p of a)d.set(p,(d.get(p)||0)+1);let m=[...d.entries()].filter(([p,f])=>f>=2).map(([p])=>p);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:m}}async startTaskInWorkspace(e,t,s){let r={...t,workspaceId:s,startedAt:b()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],r],lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:r.id,description:r.description,startedAt:r.startedAt,sessionId:r.sessionId,workspaceId:s}),r}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(r=>r.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let r=await this.read(e),i=(r.activeTasks||[]).find(m=>m.workspaceId===t);if(!i)return null;let a=b(),l=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(r),d=[l,...u].slice(0,this.maxTaskHistory);return await this.update(e,m=>({...m,activeTasks:(m.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(l=>l.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,l=>{let u=[...l.activeTasks||[]];return u[i]=a,{...l,activeTasks:u,lastUpdated:b()}}),a}async addTokens(e,t,s){let r=await this.read(e);if(!r.currentTask)return null;let o=(r.currentTask.tokensIn||0)+t,i=(r.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 r=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:r,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:r.length,percentage:0}},lastUpdated:b()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:r.length,subtasks:r.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=fl.safeParse(t);if(!s.success){let h=s.error.issues.map(E=>`${E.path.join(".")}: ${E.message}`);throw new Error(`Subtask completion requires handoff data:
|
|
504
498
|
${h.join(`
|
|
505
|
-
`)}`)}let{output:r,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,l=i.currentTask.subtasks[a];if(!l)return null;let u=[...i.currentTask.subtasks];u[a]={...l,status:"completed",completedAt:b(),output:r,summary:o};let d=u.filter(h=>h.status==="completed").length,m=u.length,p=Math.round(d/m*100),f=a+1;return f<u.length&&(u[f]={...u[f],status:"in_progress",startedAt:b()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:f<m?f:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:l.id,description:l.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),f<m?u[f]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/l*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<l?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/l*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<l?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,l=i.length;return a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<l?i[a]:null}},F=new
|
|
506
|
-
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,
|
|
507
|
-
`)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=30&&s.push(r),r=new Set):i&&r&&
|
|
499
|
+
`)}`)}let{output:r,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,l=i.currentTask.subtasks[a];if(!l)return null;let u=[...i.currentTask.subtasks];u[a]={...l,status:"completed",completedAt:b(),output:r,summary:o};let d=u.filter(h=>h.status==="completed").length,m=u.length,p=Math.round(d/m*100),f=a+1;return f<u.length&&(u[f]={...u[f],status:"in_progress",startedAt:b()}),await this.update(e,h=>({...h,currentTask:{...h.currentTask,subtasks:u,currentSubtaskIndex:f<m?f:a,subtaskProgress:{completed:d,total:m,percentage:p}},lastUpdated:b()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:l.id,description:l.description,output:r,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:m,percentage:p}}),f<m?u[f]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/l*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<l?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=r+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(m=>m.status==="completed"||m.status==="failed"||m.status==="skipped").length,d=Math.round(u/l*100);return await this.update(e,m=>({...m,currentTask:{...m.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:b()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<l?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let r=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[r];if(!o)return null;let i=[...s.currentTask.subtasks];i[r]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=r+1,l=i.length;return a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:r},lastUpdated:b()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<l?i[a]:null}},F=new ii});function pg(){let n=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!n)return{level:-1,name:"disabled"};if(mg.has(n)||n.includes("prjct"))return{level:xs.debug,name:"debug"};let e=xs[n]??-1,t=e>=0?n:"disabled";return{level:e,name:t}}function Sr(n,e,t){return bl>=n?(...s)=>console[t](e,...s):fg}var xs,mg,bl,gg,fg,hg,H,$s=v(()=>{"use strict";xs={error:0,warn:1,info:2,debug:3},mg=new Set(["1","true","*"]);c(pg,"getLogLevel");({level:bl,name:gg}=pg()),fg=c(()=>{},"noop");c(Sr,"createLogMethod");hg={error:Sr(xs.error,"[prjct:error]","error"),warn:Sr(xs.warn,"[prjct:warn]","warn"),info:Sr(xs.info,"[prjct:info]","log"),debug:Sr(xs.debug,"[prjct:debug]","log"),isEnabled:c(()=>bl>=0,"isEnabled"),level:c(()=>gg,"level")},H=hg});import Sl from"node:fs/promises";import Tl from"node:path";async function ci(n,e,t,s){let[r,o,i,a]=await Promise.all([kg(n,e,s),vg(n),bg(n),Sg(n)]);return{project:{name:s.name,ecosystem:s.ecosystem,languages:s.languages,frameworks:s.frameworks,fileCount:s.fileCount,projectType:s.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,yg).map(l=>({message:l.message,date:l.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:r,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function kg(n,e,t){let s=[],r=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=ul(n,r,ai*2);for(let a of o){if(s.length>=ai)break;try{let l=Tl.join(e,a.path),u=await Sl.readFile(l,"utf-8");u.length>Tr*3?s.push({path:a.path,content:`${u.slice(0,Tr)}
|
|
500
|
+
// ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):s.push({path:a.path,content:u.slice(0,Tr),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>=ai)break;if(!s.some(l=>l.path===a))try{let l=Tl.join(e,a),u=await Sl.readFile(l,"utf-8");s.push({path:a,content:u.slice(0,Tr),reason:"entry point"})}catch{}}return s}async function vg(n){try{let e=await Oe.getActive(n);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function bg(n){try{return(await F.getTaskHistory(n)).slice(0,wg).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function Sg(n){try{let e=Qe.getActiveSummary(n);return Promise.resolve(e)}catch(e){return H.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Tr,ai,yg,wg,El=v(()=>{"use strict";zo();En();Cn();rt();$s();Tr=800,ai=6,yg=8,wg=5;c(ci,"buildAnalysisPayload");c(kg,"selectCodeSamples");c(vg,"getExistingPatterns");c(bg,"getTaskHistory");c(Sg,"getPreviousAnalysisSummary")});import Cl from"node:fs/promises";import Ds from"node:path";function Tg(n){let e=[],t,s=new RegExp(Pc.source,"g");for(;(t=s.exec(n))!==null;){let r=t[1];(r.startsWith(".")||r.startsWith("@/"))&&e.push(r)}return e}async function Eg(n,e,t){let s;if(n.startsWith("@/"))s=Ds.join(t,"src",n.slice(2));else{let r=Ds.dirname(Ds.join(t,e));s=Ds.resolve(r,n)}for(let r of Cc){let o=s+r;try{if((await Cl.stat(o)).isFile())return Ds.relative(t,o)}catch{}}return null}async function Cg(n){let e=await Es(n),t={},s={},r=0,o=await Cs(e,50,async i=>{try{let a=await Cl.readFile(Ds.join(n,i),"utf-8"),l=Tg(a),u=[];for(let d of l){let m=await Eg(d,i,n);m&&m!==i&&u.push(m)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,r+=a.length;for(let l of a)s[l]||(s[l]=[]),s[l].push(i)}return{forward:t,reverse:s,fileCount:e.length,edgeCount:r,builtAt:new Date().toISOString()}}function Pg(n,e){L.setDoc(n,li,e),Er.delete(n)}function Cr(n){let e=L.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",li);if(!e)return Er.delete(n),null;let t=Er.get(n);if(t&&t.updatedAt===e.updated_at)return t.graph;let s=L.getDoc(n,li);return s&&Er.set(n,{graph:s,updatedAt:e.updated_at}),s}async function Pl(n,e){let t=await Cg(n);return Pg(e,t),t}var li,Er,ui=v(()=>{"use strict";Eo();he();Y();c(Tg,"extractImportSources");c(Eg,"resolveImport");c(Cg,"buildGraph");li="import-graph",Er=new Map;c(Pg,"saveGraph");c(Cr,"loadGraph");c(Pl,"indexImports")});function Rl(n,e){let t=[...n.added,...n.modified],s=new Set(t),r=new Set,o=Cr(e);if(o)for(let l of t){let u=o.reverse[l];if(u)for(let d of u)s.has(d)||r.add(d)}let i=Array.from(r),a=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:n.deleted,allAffected:a}}function Al(n){let e=new Set;for(let t of n){let s=t.toLowerCase();(s.endsWith(".tsx")||s.endsWith(".jsx")||s.endsWith(".css")||s.endsWith(".scss")||s.endsWith(".vue")||s.endsWith(".svelte")||s.includes("/components/")||s.includes("/pages/")||s.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(s.includes(".test.")||s.includes(".spec.")||s.includes("__tests__")||s.includes("/test/"))&&e.add("testing"),(s.includes("dockerfile")||s.includes("docker-compose")||s.includes(".dockerignore")||s.includes(".github/")||s.includes("ci/")||s.includes("cd/"))&&e.add("devops"),(s.endsWith(".sql")||s.includes("prisma")||s.includes("drizzle")||s.includes("migration")||s.includes("/db/"))&&e.add("database"),(s.endsWith(".ts")||s.endsWith(".js"))&&!s.includes(".test.")&&!s.includes(".spec.")&&!s.endsWith(".d.ts")&&e.add("backend")}return e}var jl=v(()=>{"use strict";ui();c(Rl,"propagateChanges");c(Al,"affectedDomains")});import xl from"node:fs/promises";import Rg from"node:path";function Ag(n){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(n).toString(36)}`;let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function jg(n){let e=await Es(n,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),t=new Map,s=await Cs(e,100,async r=>{try{let o=Rg.join(n,r),[i,a]=await Promise.all([xl.readFile(o,"utf-8"),xl.stat(o)]);return{path:r,hash:Ag(i),size:a.size,mtime:a.mtime.toISOString()}}catch{return null}});for(let r of s)t.set(r.path,r);return t}function xg(n,e){let t=[],s=[],r=[];for(let[i,a]of n){let l=e.get(i);l?l.hash!==a.hash?s.push(i):r.push(i):t.push(i)}let o=[];for(let i of e.keys())n.has(i)||o.push(i);return{added:t,modified:s,deleted:o,unchanged:r}}function di(n,e){let t=L.getDb(n);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let s=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,r]of e)s.run(r.path,r.hash,r.size,r.mtime)})(),L.setDoc(n,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function $g(n){let e=new Map;try{let t=L.query(n,"SELECT path, checksum, size, mtime FROM index_checksums");for(let s of t)e.set(s.path,{path:s.path,hash:s.checksum,size:s.size||0,mtime:s.mtime||""})}catch{}return e}async function mi(n,e){let[t,s]=await Promise.all([jg(n),Promise.resolve($g(e))]);return{diff:xg(t,s),currentHashes:t}}function $l(n){return L.hasDoc(n,"file-hashes-meta")}var Dl=v(()=>{"use strict";he();Y();c(Ag,"hashContent");c(jg,"computeHashes");c(xg,"diffHashes");c(di,"saveHashes");c($g,"loadHashes");c(mi,"detectChanges");c($l,"hasHashRegistry")});async function Ig(n,e=100){try{let{stdout:t}=await _(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:n,maxBuffer:10485760}),s=[],r=null;for(let o of t.split(`
|
|
501
|
+
`)){let i=o.trim();i==="---COMMIT---"?(r&&r.size>0&&r.size<=30&&s.push(r),r=new Set):i&&r&&_g(i)&&r.add(i)}return r&&r.size>0&&r.size<=30&&s.push(r),s}catch{return[]}}function _g(n){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(n)&&!n.includes("node_modules/")}async function Ng(n,e=100){let t=await Ig(n,e),s=new Map,r=new Map;for(let i of t){let a=Array.from(i);for(let l of a)s.set(l,(s.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=Mg(a[l],a[u]);r.set(d,(r.get(d)||0)+1)}}let o={};for(let[i,a]of r){let[l,u]=i.split("\0"),d=s.get(l)||0,m=s.get(u)||0;if(d<2||m<2)continue;let p=d+m-a,f=p>0?a/p:0;f<.1||(o[l]||(o[l]={}),o[u]||(o[u]={}),o[l][u]=f,o[u][l]=f)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:s.size,builtAt:new Date().toISOString()}}function Mg(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function Og(n,e){L.setDoc(n,pi,e),Pr.delete(n)}function Nl(n){let e=L.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",pi);if(!e)return Pr.delete(n),null;let t=Pr.get(n);if(t&&t.updatedAt===e.updated_at)return t.matrix;let s=L.getDoc(n,pi);return s&&Pr.set(n,{matrix:s,updatedAt:e.updated_at}),s}async function Ml(n,e,t=100){let s=await Ng(n,t);return Og(e,s),s}var pi,Pr,Ol=v(()=>{"use strict";Vo();he();Me();c(Ig,"parseGitLog");c(_g,"isSourceFile");c(Ng,"buildMatrix");c(Mg,"pairKey");pi="cochange-index",Pr=new Map;c(Og,"saveMatrix");c(Nl,"loadMatrix");c(Ml,"indexCoChanges")});var yi={};Ee(yi,{default:()=>Bg,getTemplateContent:()=>ot,listTemplates:()=>jr,resetBundle:()=>Gg});import fi from"node:fs";import Lg from"node:fs/promises";import Ar from"node:path";function hi(){if(gi)return Rr;gi=!0;let n=Ar.join(Ke,"dist","templates.json");try{let e=fi.readFileSync(n,"utf-8");return Rr=JSON.parse(e),Rr}catch{return null}}function Ug(n){let e=os.indexOf(n);e>-1&&os.splice(e,1),os.push(n)}function Hg(){for(;Is.size>=Fg&&os.length>0;){let n=os.shift();n&&Is.delete(n)}}function Ll(n){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=n.match(e);if(!t)return{frontmatter:{},content:n.trim()};let[,s,r]=t,o={};return s.split(`
|
|
502
|
+
`).forEach(i=>{let[a,...l]=i.split(":");if(a&&l.length>0){let u=l.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:r.trim()}}async function Fl(n){if(Is.has(n))return Ug(n),Is.get(n);let e,t=hi();if(t){let r=`commands/${n}.md`;e=t[r]}if(!e){let r=Ar.join(Ke,"templates","commands",`${n}.md`);try{e=await Lg.readFile(r,"utf-8")}catch{throw Kn.notFound(n)}}let s=Ll(e);return Hg(),Is.set(n,s),os.push(n),s}async function Wg(n){return(await Fl(n)).frontmatter["allowed-tools"]||[]}function Ul(){Is.clear(),os.length=0}function Gg(){Rr=null,gi=!1,Ul()}function ot(n){let e=hi();if(e?.[n])return e[n];let t=Ar.join(Ke,"templates",n);try{return fi.readFileSync(t,"utf-8")}catch{return null}}function jr(n){let e=hi();if(e)return Object.keys(e).filter(s=>s.startsWith(n));let t=Ar.join(Ke,"templates",n);try{return fi.readdirSync(t).map(r=>`${n}${r}`)}catch{return[]}}var Fg,Is,os,Rr,gi,Vg,Bg,_s=v(()=>{"use strict";It();st();Fg=50,Is=new Map,os=[],Rr=null,gi=!1;c(hi,"loadBundle");c(Ug,"updateLruOrder");c(Hg,"evictLru");c(Ll,"parseFrontmatter");c(Fl,"load");c(Wg,"getAllowedTools");c(Ul,"clearCache");c(Gg,"resetBundle");c(ot,"getTemplateContent");c(jr,"listTemplates");Vg={load:Fl,parseFrontmatter:Ll,getAllowedTools:Wg,clearCache:Ul,getTemplateContent:ot,listTemplates:jr},Bg=Vg});function xr(n,e,t,s){if(!n)return{content:e,action:"created"};if(!(n.includes(t)&&n.includes(s)))return{content:`${n}
|
|
503
|
+
|
|
504
|
+
${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.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 wi=v(()=>{"use strict";c(xr,"mergeWithMarkers")});var Gl={};Ee(Gl,{CommandInstaller:()=>vt,default:()=>ye,getProviderPaths:()=>ki,installGlobalConfig:()=>Wl});import xe from"node:fs/promises";import $r from"node:os";import le from"node:path";async function Jg(){try{let n=le.join($r.homedir(),".prjct-cli","docs");await xe.mkdir(n,{recursive:!0});let e=jr("global/docs/");if(e.length>0){for(let r of e)if(r.endsWith(".md")){let o=ot(r);if(o){let i=le.basename(r);await xe.writeFile(le.join(n,i),o,"utf-8")}}return{success:!0}}let{PACKAGE_ROOT:t}=(st(),et(Ao)),s=le.join(t,"templates/global/docs");try{let r=await xe.readdir(s);for(let o of r)if(o.endsWith(".md")){let i=le.join(s,o),a=le.join(n,o),l=await xe.readFile(i,"utf-8");await xe.writeFile(a,l,"utf-8")}}catch{}return{success:!0}}catch(n){return{success:!1,error:y(n)}}}async function Wl(){let n=(Ve(),et(yt)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await xe.mkdir(e.configDir,{recursive:!0});let r=le.join(e.configDir,e.contextFile),o=Hl;if(t!=="claude"){let f=ot(`global/${e.contextFile}`);if(f)o=f;else{let{PACKAGE_ROOT:h}=(st(),et(Ao)),E=le.join(h,"templates","global",e.contextFile);try{o=await xe.readFile(E,"utf-8")}catch{t==="gemini"&&(o=Hl.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await xe.readFile(r,"utf-8"),a=!0}catch(f){if(x(f))a=!1;else throw f}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let f=i.substring(0,i.indexOf(l)),h=i.substring(i.indexOf(u)+u.length);i=`${(f+h).replace(/\n{3,}/g,`
|
|
505
|
+
|
|
506
|
+
`).trim()}
|
|
507
|
+
`}let p=xr(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await xe.writeFile(r,p.content,"utf-8"),{success:!0,action:p.action,path:r}}catch(r){return{success:!1,error:y(r),action:"failed"}}}function ki(){let n=$r.homedir();return{claude:{commands:le.join(n,".claude","commands"),config:le.join(n,".claude"),router:le.join(n,".claude","commands","p.md")},gemini:{commands:le.join(n,".gemini","commands"),config:le.join(n,".gemini"),router:le.join(n,".gemini","commands","p.toml")}}}var Hl,vt,qg,ye,Rt=v(()=>{"use strict";_s();q();Y();wi();Hl='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nYou are in a prjct project when any of these signs are present: `~/Documents/prjct/<slug>/_generated/` exists, OR `.prjct/` is in cwd, OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), READ these vault files first using Read/Glob \u2014 no CLI round-trip:\n\n- `~/Documents/prjct/<slug>/_generated/index.md` \u2014 overview, ships, memory counts, patterns count\n- `~/Documents/prjct/<slug>/_generated/architecture.md` \u2014 domains, conventions, key insights\n- `~/Documents/prjct/<slug>/_generated/{patterns,insights,tech-debt}.md` \u2014 inferred state of the project\n- `~/Documents/prjct/<slug>/_generated/memory/{decision,gotcha,learning,fact,inbox}.md` \u2014 captured knowledge\n- `~/Documents/prjct/<slug>/_generated/analysis/{anti-patterns,insights,patterns,refactors,risk-areas,tech-debt}/` \u2014 past analyses by category\n- `~/Documents/prjct/<slug>/_generated/{ships,releases,tags}/` \u2014 history & taxonomy\n\nOnly fall through to source/repo reading when the vault does not contain the answer.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha discovered \u2014 persist it so the next session benefits:\n\n- `prjct remember decision "<choice + why>"` \u2014 choices made, with rationale\n- `prjct remember learning "<insight>"` \u2014 non-obvious insights gained\n- `prjct remember gotcha "<trap + how to avoid>"` \u2014 bugs/traps found\n- `prjct remember fact "<verifiable claim>"` \u2014 project facts (paths, conventions, IDs)\n- `prjct capture "<text>" --tags type:analysis,topic:<x>` \u2014 analytical dumps & inbox items\n\nTag with `--tags k:v,k:v` for searchability. Memory persists to SQLite; vault auto-regenerates. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.**\n\n## Workflow\n\n`prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`\nPause/resume: `prjct status paused` | `prjct status active` (also reopens completed tasks)\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `~/Documents/prjct/<slug>/_generated/` (Read/Glob freely; never hand-edit \u2014 fix the pipeline)\n- Project config: `.prjct/prjct.config.json` in repo root\n\nThe vault regenerates automatically on `remember`, `capture`, `ship`, `sync`, and the SessionStart/Stop hooks.\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';c(Jg,"installDocs");c(Wl,"installGlobalConfig");vt=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=$r.homedir()}async ensureInit(){if(this._initialized)return;let t=await(Ve(),et(yt)).getActiveProvider();this.commandsPath=le.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),S(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(Ve(),et(yt)).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=le.join(this.commandsPath,t);try{await xe.unlink(s),e.push(t)}catch(r){if(r.code!=="ENOENT")return{success:!1,error:y(r)}}}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=le.join(this.commandsPath,t);try{await xe.unlink(s),e=!0}catch(r){r.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=le.join(this.commandsPath,"p");try{if((await xe.stat(e).catch(()=>null))?.isDirectory())return await xe.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Wl()}async cleanupAllLegacy(){let e=$r.homedir(),t=[],s=[le.join(e,".claude","commands","p.md"),le.join(e,".claude","commands","p.toml"),le.join(e,".gemini","commands","p.md"),le.join(e,".gemini","commands","p.toml")];for(let i of s)try{await xe.unlink(i),t.push(i)}catch{}let r=[le.join(e,".claude","commands","p"),le.join(e,".gemini","commands","p")];for(let i of r)try{(await xe.stat(i).catch(()=>null))?.isDirectory()&&(await xe.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[le.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await xe.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Jg()}};c(ki,"getProviderPaths");qg=new vt,ye=qg});import ql from"node:fs/promises";import Vl from"node:os";import vi from"node:path";function Xg(){let n=ot("mcp-config.json");if(!n)return{mcpServers:{context7:bi}};try{return JSON.parse(n)}catch{return{mcpServers:{context7:bi}}}}function zl(){return Xg().mcpServers?.context7||bi}function Bl(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?vi.join(Vl.tmpdir(),"prjct-context7-test","mcp.json"):vi.join(Vl.homedir(),".claude","mcp.json")}async function Jl(n){try{let e=await ql.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(x(e))return{};throw e}}async function Kg(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let n=zl(),e=[...n.args||[],"--help"];await Et(n.command||"npx",e,{timeout:15e3})}var bi,Ns,Si,Yg,is,Dr=v(()=>{"use strict";_s();$o();q();Me();Y();bi={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},Ns=null;c(Xg,"parseTemplateConfig");c(zl,"getContext7Config");c(Bl,"getConfigPath");c(Jl,"readConfig");c(Kg,"runSmokeCheck");Si=class{static{c(this,"Context7Service")}async install(){let e=Bl(),t=vi.dirname(e);await ql.mkdir(t,{recursive:!0});let s=await Jl(e),r=s.mcpServers||{};return r.context7=zl(),s.mcpServers=r,await ce(e,s),Ns=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(Ns&&Date.now()-Ns.at<3e5)return Ns.status;let e=Bl(),r=((await Jl(e)).mcpServers||{}).context7;if(!r?.command||!Array.isArray(r.args)||r.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await Kg();let o={installed:!0,verified:!0,configPath:e};return Ns={at:Date.now(),status:o},o}catch(o){let i={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${y(o)}`};return Ns={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}},Yg=new Si,is=Yg});var Xl,Kl=v(()=>{"use strict";Xl={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 Yl(n,e){return{...Xl[n],...e}}function Ir(n,e,t){return{message:n,hint:e,...t}}var Ti=v(()=>{"use strict";Kl();c(Yl,"getError");c(Ir,"createError")});import{execFileSync as Ql,execSync as Qg}from"node:child_process";var _r,Ei,Nr,Zl,eu=v(()=>{"use strict";or();Ti();_r={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"}},Ei=class{static{c(this,"DependencyValidator")}cache=new Map;cacheTimeout=6e4;cacheTimestamps=new Map;checkTool(e){let t=this.getCached(e);if(t)return t;let s=_r[e];if(!s)return this.checkUnknownTool(e);let r=this.executeCheck(s);return this.setCache(e,r),r}ensureTool(e){let t=this.checkTool(e);if(!t.available){let s=_r[e],r=t.error||{message:`${e} is not available`,hint:s?.installHint||`Install ${e} and try again`,docs:s?.docs};throw new Nr(r)}}ensureTools(e){let t=[];for(let s of e)this.checkTool(s).available||t.push(s);if(t.length>0){let s=t.map(r=>{let o=_r[r];return o?` ${r}: ${o.installHint}`:` ${r}: Install and try again`}).join(`
|
|
508
508
|
`);throw new Nr({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
|
|
509
|
-
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(_r),s=new Map;for(let r of t)s.set(r,this.checkTool(r));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=
|
|
509
|
+
${s}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(_r),s=new Map;for(let r of t)s.set(r,this.checkTool(r));return s}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=Qg(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),s;if(e.versionRegex){let r=t.match(e.versionRegex);s=r?r[1]:void 0}return{available:!0,version:s}}catch{return{available:!1,error:Ir(`${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:Ir(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return Ql(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return Ql(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:Ir(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?rr(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())}},Nr=class extends Error{static{c(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},Zl=new Ei});function Ms(n){let e=`PRJCT_TIMEOUT_${n}`,t=process.env[e];if(t){let s=Number.parseInt(t,10);if(!Number.isNaN(s)&&s>0)return s}return Zg[n]}var Zg,it,Mr=v(()=>{"use strict";Zg={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};c(Ms,"getTimeout");it={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}});import Ci from"node:fs/promises";import ef from"node:os";import tu from"node:path";var Pi,tf,Or,Ri=v(()=>{"use strict";q();Y();Pi=class{static{c(this,"EditorsConfig")}homeDir;configDir;configFile;constructor(){this.homeDir=ef.homedir(),this.configDir=tu.join(this.homeDir,".prjct-cli","config"),this.configFile=tu.join(this.configDir,"installed-editors.json")}async ensureConfigDir(){try{await Ci.mkdir(this.configDir,{recursive:!0})}catch(e){console.error("[editors-config] Error creating config directory:",y(e))}}async loadConfig(){try{let e=await Ci.readFile(this.configFile,"utf-8");return JSON.parse(e)}catch(e){return e.code==="ENOENT"||console.error("[editors-config] Error loading config:",y(e)),null}}async saveConfig(e,t,s="claude"){try{await this.ensureConfigDir();let r={version:e,provider:s,lastInstall:new Date().toISOString(),path:t};return await ce(this.configFile,r),!0}catch(r){return console.error("[editors-config] Error saving config:",y(r)),!1}}async getProvider(){let e=await this.loadConfig();return e?e.provider||"claude":null}async getLastVersion(){let e=await this.loadConfig();return e?e.version:null}async hasVersionChanged(e){let t=await this.getLastVersion();return t!==null&&t!==e}async updateVersion(e){try{let t=await this.loadConfig();return t?(t.version=e,t.lastInstall=new Date().toISOString(),await ce(this.configFile,t),!0):!1}catch(t){return console.error("[editors-config] Error updating version:",y(t)),!1}}async configExists(){return S(this.configFile)}async deleteConfig(){try{return await this.configExists()&&await Ci.unlink(this.configFile),!0}catch(e){return console.error("[editors-config] Error deleting config:",y(e)),!1}}},tf=new Pi,Or=tf});var ji={};Ee(ji,{installCodexSkill:()=>Ai,verifyCodexPRouterReady:()=>Fr});import{execFileSync as sf}from"node:child_process";import G from"node:fs/promises";import as from"node:os";import ee from"node:path";import ie from"chalk";async function nf(n){let e=n.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!Zl.isAvailable("npm"))return console.log(`${ie.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${ie.dim(`Install ${n.displayName} using one of:`)}`),console.log(ie.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(ie.dim(` \u2022 Use Homebrew: brew install ${n.name==="claude"?"claude":"gemini"}`)),console.log(ie.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(ie.yellow(`\u{1F4E6} ${n.displayName} not found. Installing...`)),console.log(""),sf("npm",["install","-g",e],{stdio:"inherit",timeout:Ms("NPM_INSTALL")}),console.log(""),console.log(`${ie.green("\u2713")} ${n.displayName} installed successfully`),console.log(""),!0}catch(t){let s=t;return s.killed&&s.signal==="SIGTERM"?(console.log(ie.yellow(`\u26A0\uFE0F Installation timed out for ${n.displayName}`)),console.log(""),console.log(ie.dim("The npm install took too long. Try:")),console.log(ie.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(ie.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(ie.yellow(`\u26A0\uFE0F Failed to install ${n.displayName}: ${s.message}`)),console.log(""),console.log(ie.dim("Alternative installation methods:")),console.log(ie.dim(` \u2022 npm: npm install -g ${e}`)),console.log(ie.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(ie.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(ie.dim(` \u2022 brew: brew install ${n.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function rf(){let n=await bn(),e=await _o(),t=Ct[e.provider],s={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let a of r){let l=Ct[a],u=n[a],d={provider:a,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!u.installed)if(a===e.provider)if(await nf(l))d.cliInstalled=!0,s.cliInstalled=!0;else throw new Error(`${l.displayName} installation failed`);else continue;if(a==="claude"){if(await ye.detectActiveProvider()){let p=await ye.syncCommands();p.success&&(d.commandsAdded=p.added,d.commandsUpdated=p.updated,s.commandsAdded+=p.added,s.commandsUpdated+=p.updated);let f=await ye.installGlobalConfig();f.success&&(d.configAction=f.action,s.configAction||(s.configAction=f.action)),await ye.installDocs(),await mf(),await is.ensureReady()}}else if(a==="gemini"){await of()&&(d.commandsAdded=1,s.commandsAdded+=1);let p=await af();p.success&&(d.configAction=p.action)}s.providers.push(d)}if((await Io()).installed&&(await cf()).success&&console.log(` ${ie.green("\u2713")} Antigravity skill installed`),(await ts()).installed){if(!(await Ai()).success)throw new Error("Codex skill installation failed");let l=await Fr({autoRepair:!0});if(!l.verified)throw new Error(l.message||"Codex p. router verification failed");console.log(` ${ie.green("\u2713")} Codex skill installed`),console.log(` ${ie.green("\u2713")} Codex p. router ready`)}await Or.saveConfig(me,await ye.getInstallPath(),e.provider),await df();for(let a of s.providers)pf(a,Ct[a.provider]);return s}async function of(){try{let n=ee.join(as.homedir(),".gemini","commands"),e=ee.join(n,"p.toml");try{return await G.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(n){return H.warn(`Gemini router cleanup warning: ${y(n)}`),!1}}async function af(){try{let n=ee.join(as.homedir(),".gemini"),e=ee.join(n,"GEMINI.md");await G.mkdir(n,{recursive:!0});let t=ot("global/GEMINI.md");if(!t){let l=ee.join(Ke,"templates","global","GEMINI.md");t=await G.readFile(l,"utf-8")}let s="",r=!1;try{s=await G.readFile(e,"utf-8"),r=!0}catch(l){if(x(l))r=!1;else throw l}let a=xr(r?s:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await G.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(n){return H.warn(`Gemini config warning: ${y(n)}`),{success:!1,action:null}}}async function cf(){try{let n=ee.join(as.homedir(),".gemini","antigravity","skills"),e=ee.join(n,"prjct"),t=ee.join(e,"SKILL.md");await G.mkdir(e,{recursive:!0});let s=await S(t),r=ot("antigravity/SKILL.md");if(!r){let o=ee.join(Ke,"templates","antigravity","SKILL.md");if(!await S(o))return H.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};r=await G.readFile(o,"utf-8")}return await G.writeFile(t,r,"utf-8"),{success:!0,action:s?"updated":"created"}}catch(n){return H.warn(`Antigravity skill warning: ${y(n)}`),{success:!1,action:null}}}function iu(){return ee.join(as.homedir(),".codex","skills","prjct","SKILL.md")}function lf(n){return`<!-- ${ou}: ${JSON.stringify({version:me,templateHash:n})} -->`}function su(n){let e=n.match(new RegExp(`<!--\\s*${ou}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{return JSON.parse(e[1])}catch{return null}}function uf(n){return Tn(n)}async function au(){let n=ot("codex/SKILL.md");if(n)return n;let e=ee.join(Ke,"templates","codex","SKILL.md");return await S(e)?G.readFile(e,"utf-8"):null}function cu(n){let e=n.trimEnd(),t=uf(e),s=lf(t);return{content:`${e}
|
|
510
510
|
|
|
511
511
|
${s}
|
|
512
|
-
`,templateHash:t}}async function Ai(){try{let n=iu(),e=ee.dirname(n);await G.mkdir(e,{recursive:!0});let t=await S(n),s=await au();if(!s)return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=cu(s);return t&&await G.readFile(n,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await G.writeFile(n,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(n){return H.warn(`Codex skill warning: ${y(n)}`),{success:!1,action:null}}}async function Fr(n={}){let e=iu();if(!(await ts()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await au();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let r=cu(s),o=c(async()=>n.autoRepair?(await Ai()).success:!1,"maybeRepair"),i="";if(!await S(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await G.readFile(e,"utf-8").catch(()=>"");let a=su(i);if(!(a?.version===me&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await G.readFile(e,"utf-8").catch(()=>""),a=su(i),!(a?.version===me&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,message:"Codex p. router ready"}}async function
|
|
512
|
+
`,templateHash:t}}async function Ai(){try{let n=iu(),e=ee.dirname(n);await G.mkdir(e,{recursive:!0});let t=await S(n),s=await au();if(!s)return H.warn("Codex SKILL.md template not found"),{success:!1,action:null};let r=cu(s);return t&&await G.readFile(n,"utf-8").catch(()=>"")===r.content?{success:!0,action:"unchanged"}:(await G.writeFile(n,r.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(n){return H.warn(`Codex skill warning: ${y(n)}`),{success:!1,action:null}}}async function Fr(n={}){let e=iu();if(!(await ts()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let s=await au();if(!s)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let r=cu(s),o=c(async()=>n.autoRepair?(await Ai()).success:!1,"maybeRepair"),i="";if(!await S(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await G.readFile(e,"utf-8").catch(()=>"");let a=su(i);if(!(a?.version===me&&a?.templateHash===r.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await G.readFile(e,"utf-8").catch(()=>""),a=su(i),!(a?.version===me&&a?.templateHash===r.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:r.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:r.templateHash,message:"Codex p. router ready"}}async function df(){try{let n=ee.join(as.homedir(),".prjct-cli","projects");if(!await S(n))return;let e=(await G.readdir(n,{withFileTypes:!0})).filter(s=>s.isDirectory()).map(s=>s.name),t=0;for(let s of e)try{let r=A.getDoc(s,"project");if(!r)continue;r.cliVersion!==me&&(r.cliVersion=me,A.setDoc(s,"project",r),t++)}catch{}t>0&&console.log(` ${ie.green("\u2713")} Updated ${t} project(s) to v${me}`)}catch(n){x(n)||H.warn(`Migration warning: ${y(n)}`)}}async function nu(n,e){let t={};if(await S(n))try{t=await pe(n)??{}}catch(s){if(!(s instanceof SyntaxError))throw s}t.statusLine={type:"command",command:e},await ce(n,t)}async function mf(){try{let n=ee.join(as.homedir(),".claude"),e=ee.join(n,"settings.json"),t=ee.join(n,"prjct-statusline.sh"),s=ee.join(as.homedir(),".prjct-cli","statusline"),r=ee.join(s,"statusline.sh"),o=ee.join(s,"themes"),i=ee.join(s,"lib"),a=ee.join(s,"components"),l=ee.join(s,"config.json"),u=ee.join(Ke,"assets","statusline"),d=ee.join(u,"statusline.sh"),m=ee.join(u,"themes"),p=ee.join(u,"lib"),f=ee.join(u,"components"),h=ee.join(u,"default-config.json");if(await S(n)||await G.mkdir(n,{recursive:!0}),await S(s)||await G.mkdir(s,{recursive:!0}),await S(o)||await G.mkdir(o,{recursive:!0}),await S(i)||await G.mkdir(i,{recursive:!0}),await S(a)||await G.mkdir(a,{recursive:!0}),await S(r)){let E=await G.readFile(r,"utf8");if(E.includes("CLI_VERSION=")){let P=E.match(/CLI_VERSION="([^"]*)"/);if(P&&P[1]!==me){let k=E.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${me}"`);await G.writeFile(r,k,{mode:493})}await Lr(p,i),await Lr(f,a),await ru(t,r),await nu(e,t);return}}if(await S(d)){let E=await G.readFile(d,"utf8");if(E=E.replace(/CLI_VERSION="[^"]*"/,`CLI_VERSION="${me}"`),await G.writeFile(r,E,{mode:493}),await Lr(p,i),await Lr(f,a),await S(m)){let P=await G.readdir(m);for(let k of P){let I=ee.join(m,k),C=ee.join(o,k);await G.copyFile(I,C)}}!await S(l)&&await S(h)&&await G.copyFile(h,l)}else{let E=`#!/bin/bash
|
|
513
513
|
# prjct Status Line for Claude Code
|
|
514
514
|
CLI_VERSION="${me}"
|
|
515
515
|
input=$(cat)
|
|
@@ -540,7 +540,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
540
540
|
fi
|
|
541
541
|
fi
|
|
542
542
|
echo "prjct"
|
|
543
|
-
`;await G.writeFile(r,E,{mode:493})}await ru(t,r),await nu(e,t)}catch(n){x(n)||H.warn(`Status line warning: ${y(n)}`)}}async function Lr(n,e){if(!await S(n))return;let t=await G.readdir(n);for(let s of t)if(s.endsWith(".sh")){let r=ee.join(n,s),o=ee.join(e,s);await G.copyFile(r,o),await G.chmod(o,493)}}async function ru(n,e){try{if(await S(n)){if((await G.lstat(n)).isSymbolicLink()&&await G.readlink(n)===e)return;await G.unlink(n)}await G.symlink(e,n)}catch{try{await S(e)&&(await G.copyFile(e,n),await G.chmod(n,493))}catch(s){x(s)||H.warn(`Symlink fallback warning: ${s.message}`)}}}function mf(n,e){if(console.log(""),n.cliInstalled?console.log(` ${ie.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ie.green("\u2713")} ${e.displayName} CLI found`),n.commandsAdded+n.commandsUpdated>0){let s=[];n.commandsAdded>0&&s.push(`${n.commandsAdded} new`),n.commandsUpdated>0&&s.push(`${n.commandsUpdated} updated`),console.log(` ${ie.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${ie.green("\u2713")} Commands up to date`);n.configAction==="created"?console.log(` ${ie.green("\u2713")} Global config created (${e.contextFile})`):n.configAction==="updated"?console.log(` ${ie.green("\u2713")} Global config updated (${e.contextFile})`):n.configAction==="appended"&&console.log(` ${ie.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var ou,pf,Ur=v(()=>{"use strict";xs();Dr();eu();ye();q();Mr();Y();Cr();Is();st();He();bt();Ri();Jo();c(sf,"installAICLI");c(nf,"run");c(rf,"installGeminiRouter");c(of,"installGeminiGlobalConfig");c(af,"installAntigravitySkill");ou="prjct-codex-router";c(iu,"getCodexSkillPath");c(cf,"getCodexSkillMetadata");c(su,"parseCodexSkillMetadata");c(lf,"hashContent");c(au,"loadCodexSkillTemplate");c(cu,"buildCodexSkillContent");c(Ai,"installCodexSkill");c(Fr,"verifyCodexPRouterReady");c(uf,"migrateProjectsCliVersion");c(nu,"ensureStatusLineSettings");c(df,"installStatusLine");c(Lr,"installStatusLineModules");c(ru,"ensureStatusLineSymlink");c(mf,"showResults");pf=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");pf&&nf().catch(n=>{console.error("Setup error:",n.message),process.exit(1)})});import{z as M}from"zod";var gf,ff,lu,hf,yf,wf,kf,vf,uu,du=v(()=>{"use strict";gf=M.enum(["low","medium","high"]),ff=M.enum(["pending","converted","completed","archived","dormant"]),lu=M.enum(["high","medium","low"]),hf=M.object({impact:lu,effort:lu}),yf=M.object({frontend:M.string().optional(),backend:M.string().optional(),payments:M.string().optional(),ai:M.string().optional(),deploy:M.string().optional(),other:M.array(M.string()).optional()}),wf=M.object({name:M.string(),description:M.string()}),kf=M.object({name:M.string(),description:M.string().optional()}),vf=M.object({id:M.string(),text:M.string(),details:M.string().optional(),priority:gf,status:ff,tags:M.array(M.string()),addedAt:M.string(),completedAt:M.string().optional(),convertedTo:M.string().optional(),source:M.string().optional(),sourceFiles:M.array(M.string()).optional(),painPoints:M.array(M.string()).optional(),solutions:M.array(M.string()).optional(),filesAffected:M.array(M.string()).optional(),impactEffort:hf.optional(),implementationNotes:M.string().optional(),stack:yf.optional(),modules:M.array(wf).optional(),roles:M.array(kf).optional(),risks:M.array(M.string()).optional(),risksCount:M.number().optional()}),uu=M.object({ideas:M.array(vf),lastUpdated:M.string()})});var xi,Os,$i=v(()=>{"use strict";du();ns();be();os();Ut();xi=class extends _e{static{c(this,"IdeasStorage")}constructor(){super("ideas.json",uu)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let r={id:Le(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async addTags(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(r=>r.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 r=s.sort((a,l)=>new Date(l.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(l=>!o.has(l.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=Ts(Rt.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(r.length===0)return 0;et.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},Os=new xi});var Di,Ls,Ii=v(()=>{"use strict";kr();be();Ut();Di=class extends _e{static{c(this,"MetricsStorage")}constructor(){super("metrics.json",rl)}getDefault(){return{...ol}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,l=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,m=[...i.dailyStats],p=m.findIndex(k=>k.date===o);if(p>=0){let k=m[p];m[p]={...k,tokensSaved:k.tokensSaved+s,syncs:k.syncs+1,avgCompressionRate:(k.avgCompressionRate*k.syncs+r)/(k.syncs+1),totalDuration:k.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let f=new Date;f.setDate(f.getDate()-90);let h=f.toISOString().split("T")[0],E=m.filter(k=>k.date>=h),P=[...i.agentUsage];if(t.agents)for(let k of t.agents){let I=P.findIndex(C=>C.agentName===k);I>=0?P[I]={...P[I],usageCount:P[I].usageCount+1,tokensSaved:P[I].tokensSaved+Math.floor(s/t.agents.length)}:P.push({agentName:k,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:l,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:P,dailyStats:E,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=s.reduce((l,u)=>l+u.tokensSaved,0),i=r.reduce((l,u)=>l+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:il(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((l,u)=>u.usageCount-l.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(r=>r.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let r=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},Ls=new Di});import V from"node:fs/promises";import W from"node:path";async function Hr(n){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(n)&&A.hasDoc(n,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=j.getGlobalProjectPath(n),r=W.join(s,"storage"),o=W.join(s,"index"),i=W.join(s,"memory");t.backupDir=await bf(r,o,i),A.getDb(n);for(let{filename:l,key:u}of Mi){let d=W.join(r,l),m=await ct(d);if(m===null){t.skippedFiles.push(l);continue}try{A.setDoc(n,u,m),mu(n,u,m),t.migratedFiles.push(l)}catch(p){t.errors.push({file:l,error:String(p)})}}for(let{filename:l,key:u}of Ni){let d=W.join(o,l),m=await ct(d);if(m===null){t.skippedFiles.push(`index/${l}`);continue}try{A.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),pu(n,u,m),t.migratedFiles.push(`index/${l}`)}catch(p){t.errors.push({file:`index/${l}`,error:String(p)})}}await jf(n,o,t),await xf(n,o,t),await $f(n,i,t),await Df(n,i,t);let a=W.join(s,"sessions");return await If(n,a,t),t.errors.length===0&&await _f(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function bf(n,e,t){let s=W.join(n,"backup");return await V.mkdir(s,{recursive:!0}),await V.mkdir(W.join(s,"index"),{recursive:!0}),await V.mkdir(W.join(s,"memory"),{recursive:!0}),await _i(n,s,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await _i(e,W.join(s,"index")),await _i(t,W.join(s,"memory")),s}async function _i(n,e,t){try{let s=await V.readdir(n,{withFileTypes:!0});for(let r of s){if(!r.isFile()||t&&!t(r.name))continue;let o=W.join(n,r.name),i=W.join(e,r.name);await V.copyFile(o,i)}}catch(s){if(!x(s))throw s}}function mu(n,e,t){switch(e){case"state":Sf(n,t);break;case"queue":Tf(n,t);break;case"ideas":Ef(n,t);break;case"shipped":Cf(n,t);break;case"metrics":Pf(n,t);break;case"analysis":Rf(n,t);break}}function Sf(n,e){let t=A.getDb(n),s=t.prepare(`
|
|
543
|
+
`;await G.writeFile(r,E,{mode:493})}await ru(t,r),await nu(e,t)}catch(n){x(n)||H.warn(`Status line warning: ${y(n)}`)}}async function Lr(n,e){if(!await S(n))return;let t=await G.readdir(n);for(let s of t)if(s.endsWith(".sh")){let r=ee.join(n,s),o=ee.join(e,s);await G.copyFile(r,o),await G.chmod(o,493)}}async function ru(n,e){try{if(await S(n)){if((await G.lstat(n)).isSymbolicLink()&&await G.readlink(n)===e)return;await G.unlink(n)}await G.symlink(e,n)}catch{try{await S(e)&&(await G.copyFile(e,n),await G.chmod(n,493))}catch(s){x(s)||H.warn(`Symlink fallback warning: ${s.message}`)}}}function pf(n,e){if(console.log(""),n.cliInstalled?console.log(` ${ie.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ie.green("\u2713")} ${e.displayName} CLI found`),n.commandsAdded+n.commandsUpdated>0){let s=[];n.commandsAdded>0&&s.push(`${n.commandsAdded} new`),n.commandsUpdated>0&&s.push(`${n.commandsUpdated} updated`),console.log(` ${ie.green("\u2713")} Commands synced (${s.join(", ")})`)}else console.log(` ${ie.green("\u2713")} Commands up to date`);n.configAction==="created"?console.log(` ${ie.green("\u2713")} Global config created (${e.contextFile})`):n.configAction==="updated"?console.log(` ${ie.green("\u2713")} Global config updated (${e.contextFile})`):n.configAction==="appended"&&console.log(` ${ie.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var ou,gf,Ur=v(()=>{"use strict";_s();Dr();eu();he();q();Mr();Y();vr();$s();st();Ve();Rt();Ri();wi();c(nf,"installAICLI");c(rf,"run");c(of,"installGeminiRouter");c(af,"installGeminiGlobalConfig");c(cf,"installAntigravitySkill");ou="prjct-codex-router";c(iu,"getCodexSkillPath");c(lf,"getCodexSkillMetadata");c(su,"parseCodexSkillMetadata");c(uf,"hashContent");c(au,"loadCodexSkillTemplate");c(cu,"buildCodexSkillContent");c(Ai,"installCodexSkill");c(Fr,"verifyCodexPRouterReady");c(df,"migrateProjectsCliVersion");c(nu,"ensureStatusLineSettings");c(mf,"installStatusLine");c(Lr,"installStatusLineModules");c(ru,"ensureStatusLineSymlink");c(pf,"showResults");gf=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");gf&&rf().catch(n=>{console.error("Setup error:",n.message),process.exit(1)})});import{z as M}from"zod";var ff,hf,lu,yf,wf,kf,vf,bf,uu,du=v(()=>{"use strict";ff=M.enum(["low","medium","high"]),hf=M.enum(["pending","converted","completed","archived","dormant"]),lu=M.enum(["high","medium","low"]),yf=M.object({impact:lu,effort:lu}),wf=M.object({frontend:M.string().optional(),backend:M.string().optional(),payments:M.string().optional(),ai:M.string().optional(),deploy:M.string().optional(),other:M.array(M.string()).optional()}),kf=M.object({name:M.string(),description:M.string()}),vf=M.object({name:M.string(),description:M.string().optional()}),bf=M.object({id:M.string(),text:M.string(),details:M.string().optional(),priority:ff,status:hf,tags:M.array(M.string()),addedAt:M.string(),completedAt:M.string().optional(),convertedTo:M.string().optional(),source:M.string().optional(),sourceFiles:M.array(M.string()).optional(),painPoints:M.array(M.string()).optional(),solutions:M.array(M.string()).optional(),filesAffected:M.array(M.string()).optional(),impactEffort:yf.optional(),implementationNotes:M.string().optional(),stack:wf.optional(),modules:M.array(kf).optional(),roles:M.array(vf).optional(),risks:M.array(M.string()).optional(),risksCount:M.number().optional()}),uu=M.object({ideas:M.array(bf),lastUpdated:M.string()})});var xi,Os,$i=v(()=>{"use strict";du();ss();be();rs();Ut();xi=class extends _e{static{c(this,"IdeasStorage")}constructor(){super("ideas.json",uu)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let r={id:Le(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:b()};return await this.update(e,o=>({ideas:[r,...o.ideas],lastUpdated:b()})),await this.publishEvent(e,"idea.created",{ideaId:r.id,text:r.text,priority:r.priority}),r}async getById(e,t){return(await this.read(e)).ideas.find(r=>r.id===t)}async convertToFeature(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:b()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(r=>r.id===t?{...r,status:"archived"}:r),lastUpdated:b()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async addTags(e,t,s){await this.update(e,r=>({ideas:r.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:b()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(r=>r.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 r=s.sort((a,l)=>new Date(l.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(r.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(l=>!o.has(l.id)),lastUpdated:b()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=Ts(Pt.IDEA_DORMANT_DAYS),r=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(r.length===0)return 0;Ze.archiveMany(e,r.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:b()})),await this.publishEvent(e,"ideas.dormant",{count:r.length}),r.length}},Os=new xi});var Di,Ls,Ii=v(()=>{"use strict";gr();be();Ut();Di=class extends _e{static{c(this,"MetricsStorage")}constructor(){super("metrics.json",Qc)}getDefault(){return{...Zc}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let s=Math.max(0,t.originalSize-t.filteredSize),r=t.originalSize>0?s/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let a=i.syncCount+1,l=i.totalTokensSaved+s,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?r:(i.avgCompressionRate*i.syncCount+r)/a,m=[...i.dailyStats],p=m.findIndex(k=>k.date===o);if(p>=0){let k=m[p];m[p]={...k,tokensSaved:k.tokensSaved+s,syncs:k.syncs+1,avgCompressionRate:(k.avgCompressionRate*k.syncs+r)/(k.syncs+1),totalDuration:k.totalDuration+t.duration}}else m.push({date:o,tokensSaved:s,syncs:1,avgCompressionRate:r,totalDuration:t.duration});let f=new Date;f.setDate(f.getDate()-90);let h=f.toISOString().split("T")[0],E=m.filter(k=>k.date>=h),P=[...i.agentUsage];if(t.agents)for(let k of t.agents){let I=P.findIndex(C=>C.agentName===k);I>=0?P[I]={...P[I],usageCount:P[I].usageCount+1,tokensSaved:P[I].tokensSaved+Math.floor(s/t.agents.length)}:P.push({agentName:k,usageCount:1,tokensSaved:Math.floor(s/t.agents.length)})}return{totalTokensSaved:l,avgCompressionRate:d,syncCount:a,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/a,totalSyncDuration:u,agentUsage:P,dailyStats:E,firstSync:i.firstSync||b(),lastUpdated:b()}})}async getSummary(e){let t=await this.read(e),s=this.getLast30Days(t.dailyStats),r=this.getPrev30Days(t.dailyStats),o=s.reduce((l,u)=>l+u.tokensSaved,0),i=r.reduce((l,u)=>l+u.tokensSaved,0),a=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:el(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((l,u)=>u.usageCount-l.usageCount).slice(0,5),last30DaysTokens:o,trend:a}}async getDailyStats(e,t=30){let s=await this.read(e),r=new Date;r.setDate(r.getDate()-t);let o=r.toISOString().split("T")[0];return s.dailyStats.filter(i=>i.date>=o).sort((i,a)=>i.date.localeCompare(a.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=t.toISOString().split("T")[0];return e.filter(r=>r.date>=s)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let s=new Date;s.setDate(s.getDate()-60);let r=s.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=r&&i.date<o)}},Ls=new Di});import V from"node:fs/promises";import W from"node:path";async function Hr(n){let e=Date.now(),t={success:!1,migratedFiles:[],skippedFiles:[],errors:[],backupDir:null,duration:0};try{if(A.exists(n)&&A.hasDoc(n,"state"))return t.success=!0,t.duration=Date.now()-e,t;let s=j.getGlobalProjectPath(n),r=W.join(s,"storage"),o=W.join(s,"index"),i=W.join(s,"memory");t.backupDir=await Sf(r,o,i),A.getDb(n);for(let{filename:l,key:u}of Mi){let d=W.join(r,l),m=await at(d);if(m===null){t.skippedFiles.push(l);continue}try{A.setDoc(n,u,m),mu(n,u,m),t.migratedFiles.push(l)}catch(p){t.errors.push({file:l,error:String(p)})}}for(let{filename:l,key:u}of Ni){let d=W.join(o,l),m=await at(d);if(m===null){t.skippedFiles.push(`index/${l}`);continue}try{A.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",u,JSON.stringify(m),new Date().toISOString()),pu(n,u,m),t.migratedFiles.push(`index/${l}`)}catch(p){t.errors.push({file:`index/${l}`,error:String(p)})}}await xf(n,o,t),await $f(n,o,t),await Df(n,i,t),await If(n,i,t);let a=W.join(s,"sessions");return await _f(n,a,t),t.errors.length===0&&await Nf(r,o,i,t),t.success=t.errors.length===0,t.duration=Date.now()-e,t}catch(s){return t.errors.push({file:"<migration>",error:String(s)}),t.duration=Date.now()-e,t}}async function Sf(n,e,t){let s=W.join(n,"backup");return await V.mkdir(s,{recursive:!0}),await V.mkdir(W.join(s,"index"),{recursive:!0}),await V.mkdir(W.join(s,"memory"),{recursive:!0}),await _i(n,s,r=>r.endsWith(".json")||r.endsWith(".jsonl")),await _i(e,W.join(s,"index")),await _i(t,W.join(s,"memory")),s}async function _i(n,e,t){try{let s=await V.readdir(n,{withFileTypes:!0});for(let r of s){if(!r.isFile()||t&&!t(r.name))continue;let o=W.join(n,r.name),i=W.join(e,r.name);await V.copyFile(o,i)}}catch(s){if(!x(s))throw s}}function mu(n,e,t){switch(e){case"state":Tf(n,t);break;case"queue":Ef(n,t);break;case"ideas":Cf(n,t);break;case"shipped":Pf(n,t);break;case"metrics":Rf(n,t);break;case"analysis":Af(n,t);break}}function Tf(n,e){let t=A.getDb(n),s=t.prepare(`
|
|
544
544
|
INSERT OR REPLACE INTO tasks
|
|
545
545
|
(id, description, type, status, parent_description, branch, linear_id,
|
|
546
546
|
linear_uuid, session_id, feature_id, started_at, completed_at,
|
|
@@ -551,94 +551,94 @@ echo "prjct"
|
|
|
551
551
|
(id, task_id, description, status, domain, agent, sort_order,
|
|
552
552
|
depends_on, started_at, completed_at, output, summary)
|
|
553
553
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
554
|
-
`),o=c((a,l)=>{if(!a||!a.id)return;s.run(T(a.id)??`task-${Date.now()}`,T(a.description??a.parentDescription)??"",T(a.type),T(l??a.status)??"unknown",T(a.parentDescription),T(a.branch),T(a.linearId),T(a.linearUuid),T(a.sessionId),T(a.featureId),T(a.startedAt)??new Date().toISOString(),T(a.completedAt),T(a.shippedAt),T(a.pausedAt),T(a.pauseReason),T(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];r.run(T(m.id)??`subtask-${d}`,T(a.id),T(m.description)??"",T(m.status)??"pending",T(m.domain),T(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,T(m.startedAt),T(m.completedAt),T(m.output),m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function
|
|
554
|
+
`),o=c((a,l)=>{if(!a||!a.id)return;s.run(T(a.id)??`task-${Date.now()}`,T(a.description??a.parentDescription)??"",T(a.type),T(l??a.status)??"unknown",T(a.parentDescription),T(a.branch),T(a.linearId),T(a.linearUuid),T(a.sessionId),T(a.featureId),T(a.startedAt)??new Date().toISOString(),T(a.completedAt),T(a.shippedAt),T(a.pausedAt),T(a.pauseReason),T(a.prUrl),a.expectedValue?JSON.stringify(a.expectedValue):null,JSON.stringify(a));let u=a.subtasks;if(u&&Array.isArray(u))for(let d=0;d<u.length;d++){let m=u[d];r.run(T(m.id)??`subtask-${d}`,T(a.id),T(m.description)??"",T(m.status)??"pending",T(m.domain),T(m.agent),d,m.dependsOn?JSON.stringify(m.dependsOn):null,T(m.startedAt),T(m.completedAt),T(m.output),m.summary?JSON.stringify(m.summary):null)}},"migrateTask");e.currentTask&&o(e.currentTask),e.previousTask&&o(e.previousTask);let i=e.pausedTasks;if(i&&Array.isArray(i))for(let a of i)o(a,"paused")}function Ef(n,e){let t=e.tasks;if(!t||!Array.isArray(t))return;let r=A.getDb(n).prepare(`
|
|
555
555
|
INSERT OR REPLACE INTO queue_tasks
|
|
556
556
|
(id, description, type, priority, section, created_at, completed, completed_at,
|
|
557
557
|
feature_id, feature_name)
|
|
558
558
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
559
|
-
`);for(let o of t)r.run(T(o.id)??`queue-${Date.now()}`,T(o.description)??"",T(o.type),T(o.priority),T(o.section),T(o.createdAt)??new Date().toISOString(),o.completed?1:0,T(o.completedAt),T(o.featureId),T(o.featureName))}function
|
|
559
|
+
`);for(let o of t)r.run(T(o.id)??`queue-${Date.now()}`,T(o.description)??"",T(o.type),T(o.priority),T(o.section),T(o.createdAt)??new Date().toISOString(),o.completed?1:0,T(o.completedAt),T(o.featureId),T(o.featureName))}function Cf(n,e){let t=e.ideas;if(!t||!Array.isArray(t))return;let r=A.getDb(n).prepare(`
|
|
560
560
|
INSERT OR REPLACE INTO ideas
|
|
561
561
|
(id, text, status, priority, tags, added_at, converted_to, details, data)
|
|
562
562
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
563
|
-
`);for(let o of t)r.run(T(o.id)??`idea-${Date.now()}`,T(o.text)??"",T(o.status)??"pending",T(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,T(o.addedAt)??new Date().toISOString(),T(o.convertedTo),T(o.details),JSON.stringify(o))}function
|
|
563
|
+
`);for(let o of t)r.run(T(o.id)??`idea-${Date.now()}`,T(o.text)??"",T(o.status)??"pending",T(o.priority)??"medium",o.tags?JSON.stringify(o.tags):null,T(o.addedAt)??new Date().toISOString(),T(o.convertedTo),T(o.details),JSON.stringify(o))}function Pf(n,e){let t=e.shipped;if(!t||!Array.isArray(t))return;let r=A.getDb(n).prepare(`
|
|
564
564
|
INSERT OR REPLACE INTO shipped_features
|
|
565
565
|
(id, name, shipped_at, version, description, type, duration, data)
|
|
566
566
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
567
|
-
`);for(let o of t)r.run(T(o.id)??`ship-${Date.now()}`,T(o.name)??"",T(o.shippedAt)??new Date().toISOString(),T(o.version)??"0.0.0",T(o.description),T(o.type),T(o.duration),JSON.stringify(o))}function
|
|
567
|
+
`);for(let o of t)r.run(T(o.id)??`ship-${Date.now()}`,T(o.name)??"",T(o.shippedAt)??new Date().toISOString(),T(o.version)??"0.0.0",T(o.description),T(o.type),T(o.duration),JSON.stringify(o))}function Rf(n,e){let t=e.dailyStats;if(!t||!Array.isArray(t))return;let r=A.getDb(n).prepare(`
|
|
568
568
|
INSERT OR REPLACE INTO metrics_daily
|
|
569
569
|
(date, tokens_saved, syncs, avg_compression_rate, total_duration)
|
|
570
570
|
VALUES (?, ?, ?, ?, ?)
|
|
571
|
-
`);for(let o of t)r.run(T(o.date)??new Date().toISOString().slice(0,10),Ht(o.tokensSaved)??0,Ht(o.syncs)??0,Ht(o.avgCompressionRate)??0,Ht(o.totalDuration)??0)}function
|
|
571
|
+
`);for(let o of t)r.run(T(o.date)??new Date().toISOString().slice(0,10),Ht(o.tokensSaved)??0,Ht(o.syncs)??0,Ht(o.avgCompressionRate)??0,Ht(o.totalDuration)??0)}function Af(n,e){let s=A.getDb(n).prepare(`
|
|
572
572
|
INSERT OR REPLACE INTO analysis
|
|
573
573
|
(id, status, commit_hash, signature, sealed_at, analyzed_at, data)
|
|
574
574
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
575
|
-
`),r=c((o,i)=>{o&&s.run(i,T(o.status)??"unknown",T(o.commitHash),T(o.signature),T(o.sealedAt),T(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function pu(n,e,t){e==="categories-cache"&&
|
|
575
|
+
`),r=c((o,i)=>{o&&s.run(i,T(o.status)??"unknown",T(o.commitHash),T(o.signature),T(o.sealedAt),T(o.analyzedAt),JSON.stringify(o))},"migrate");e.draft&&r(e.draft,"draft"),e.sealed&&r(e.sealed,"sealed")}function pu(n,e,t){e==="categories-cache"&&jf(n,t)}function jf(n,e){let t=e.fileCategories;if(!t||!Array.isArray(t))return;let r=A.getDb(n).prepare(`
|
|
576
576
|
INSERT OR REPLACE INTO index_files
|
|
577
577
|
(path, categories, domain, score, size, mtime, language)
|
|
578
578
|
VALUES (?, ?, ?, COALESCE((SELECT score FROM index_files WHERE path = ?), 0), NULL, NULL, NULL)
|
|
579
|
-
`);for(let o of t){let i=T(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,T(o.primaryDomain),i)}}async function
|
|
579
|
+
`);for(let o of t){let i=T(o.path);i&&r.run(i,o.categories?JSON.stringify(o.categories):null,T(o.primaryDomain),i)}}async function xf(n,e,t){let s=W.join(e,"checksums.json"),r=await at(s);if(r===null){t.skippedFiles.push("index/checksums.json");return}try{let o=r.checksums;if(!o)return;let i=A.getDb(n),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[l,u]of Object.entries(o))a.run(l,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function $f(n,e,t){let s=W.join(e,"file-scores.json"),r=await at(s);if(r===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=r.scores;if(!o||!Array.isArray(o))return;let i=A.getDb(n),a=i.prepare(`
|
|
580
580
|
INSERT OR REPLACE INTO index_files
|
|
581
581
|
(path, score, size, mtime, language, categories, domain)
|
|
582
582
|
VALUES (?, ?, ?, ?, NULL,
|
|
583
583
|
COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
|
|
584
584
|
COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
|
|
585
|
-
`);i.transaction(()=>{for(let l of o){let u=T(l.path);u&&a.run(u,Ht(l.score)??0,Ht(l.size),T(l.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
|
|
586
|
-
`).filter(l=>l.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=A.getDb(n),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let l of o)try{let u=JSON.parse(l),d=T(u.type??u.action)??"unknown",m=T(u.taskId??u.task_id),p=T(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,l,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(r){x(r)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(r)})}}async function
|
|
587
|
-
`).filter(l=>l.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=A.getDb(n),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let l of o)try{let u=JSON.parse(l),d=`learning:${T(u.taskId??u.timestamp)??Date.now()}`,m=u.tags,p=m&&m.length>0?T(m[0]):null;a.run(d,p,l,1,T(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(r){x(r)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(r)})}}async function
|
|
585
|
+
`);i.transaction(()=>{for(let l of o){let u=T(l.path);u&&a.run(u,Ht(l.score)??0,Ht(l.size),T(l.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 Df(n,e,t){let s=W.join(e,"events.jsonl");try{let o=(await V.readFile(s,"utf-8")).split(`
|
|
586
|
+
`).filter(l=>l.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=A.getDb(n),a=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let l of o)try{let u=JSON.parse(l),d=T(u.type??u.action)??"unknown",m=T(u.taskId??u.task_id),p=T(u.timestamp??u.ts)??new Date().toISOString();a.run(d,m,l,p)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(r){x(r)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(r)})}}async function If(n,e,t){let s=W.join(e,"learnings.jsonl");try{let o=(await V.readFile(s,"utf-8")).split(`
|
|
587
|
+
`).filter(l=>l.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=A.getDb(n),a=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let l of o)try{let u=JSON.parse(l),d=`learning:${T(u.taskId??u.timestamp)??Date.now()}`,m=u.tags,p=m&&m.length>0?T(m[0]):null;a.run(d,p,l,1,T(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(r){x(r)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(r)})}}async function _f(n,e,t){let r=A.getDb(n).prepare(`
|
|
588
588
|
INSERT OR IGNORE INTO sessions
|
|
589
589
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
590
590
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
591
|
-
`),o=c(u=>{!u||!u.id||r.run(T(u.id),T(u.projectId)??n,T(u.task)??"",T(u.status)??"completed",T(u.startedAt)??new Date().toISOString(),T(u.pausedAt),T(u.completedAt),Ht(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=W.join(e,"current.json"),a=await
|
|
592
|
-
`).filter(C=>C.trim());if(k.length===0){await V.unlink(E),s++;continue}let I=A.getDb(n);if(h==="events.jsonl"){let C=I.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");I.transaction(()=>{for(let te of k)try{let R=JSON.parse(te);C.run(T(R.type??R.action)??"unknown",T(R.taskId??R.task_id),te,T(R.timestamp??R.ts)??new Date().toISOString())}catch{}})()}else{let C=I.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");I.transaction(()=>{for(let te of k)try{let R=JSON.parse(te),
|
|
591
|
+
`),o=c(u=>{!u||!u.id||r.run(T(u.id),T(u.projectId)??n,T(u.task)??"",T(u.status)??"completed",T(u.startedAt)??new Date().toISOString(),T(u.pausedAt),T(u.completedAt),Ht(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=W.join(e,"current.json"),a=await at(i);if(a!==null)try{o(a),t.migratedFiles.push("sessions/current.json"),await V.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let l=W.join(e,"archive");try{let u=await V.readdir(l);for(let m of u){let p=W.join(l,m);try{if(!(await V.stat(p)).isDirectory())continue;let h=await V.readdir(p);for(let P of h){if(!P.endsWith(".json"))continue;let k=W.join(p,P),I=await at(k);if(I!==null)try{o(I),t.migratedFiles.push(`sessions/archive/${m}/${P}`),await V.unlink(k).catch(()=>{})}catch(C){t.errors.push({file:`sessions/archive/${m}/${P}`,error:String(C)})}}(await V.readdir(p)).length===0&&await V.rmdir(p).catch(()=>{})}catch{}}(await V.readdir(l).catch(()=>[])).length===0&&await V.rmdir(l).catch(()=>{})}catch{}try{(await V.readdir(e)).length===0&&await V.rmdir(e).catch(()=>{})}catch{}}async function Nf(n,e,t,s){let r=c(async(i,a)=>{try{await V.unlink(i)}catch(l){x(l)||s.errors.push({file:a,error:`cleanup: ${String(l)}`})}},"deleteFile");for(let{filename:i}of Mi)await r(W.join(n,i),`cleanup:${i}`);let o=["project-index.json","domains.json","categories-cache.json","checksums.json","file-scores.json"];for(let i of o)await r(W.join(e,i),`cleanup:index/${i}`);await r(W.join(t,"events.jsonl"),"cleanup:memory/events.jsonl"),await r(W.join(t,"learnings.jsonl"),"cleanup:memory/learnings.jsonl")}function T(n){return n==null?null:typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):JSON.stringify(n)}function Ht(n){if(n==null)return null;if(typeof n=="number")return n;if(typeof n=="string"){let e=Number(n);return Number.isNaN(e)?null:e}return null}async function at(n){try{let e=await V.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(x(e)||e instanceof SyntaxError)return null;throw e}}async function Wr(n){let e=j.getGlobalProjectPath(n),t=W.join(e,"storage"),s=0;A.getDb(n);for(let{filename:h,key:E}of Mi){let P=W.join(t,h),k=await at(P);if(k!==null){A.setDoc(n,E,k),mu(n,E,k);try{await V.unlink(P)}catch{}s++}}let r=W.join(e,"project.json"),o=await at(r);if(o!==null){A.setDoc(n,"project",o);try{await V.unlink(r)}catch{}s++}let i=W.join(e,"memory");for(let h of["events.jsonl","learnings.jsonl"]){let E=W.join(i,h);try{let k=(await V.readFile(E,"utf-8")).split(`
|
|
592
|
+
`).filter(C=>C.trim());if(k.length===0){await V.unlink(E),s++;continue}let I=A.getDb(n);if(h==="events.jsonl"){let C=I.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");I.transaction(()=>{for(let te of k)try{let R=JSON.parse(te);C.run(T(R.type??R.action)??"unknown",T(R.taskId??R.task_id),te,T(R.timestamp??R.ts)??new Date().toISOString())}catch{}})()}else{let C=I.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");I.transaction(()=>{for(let te of k)try{let R=JSON.parse(te),ge=`learning:${T(R.taskId??R.timestamp)??Date.now()}`,ze=R.tags;C.run(ge,T(ze?.[0]),te,1,T(R.timestamp)??new Date().toISOString())}catch{}})()}await V.unlink(E),s++}catch{}}let a=W.join(e,"sessions"),l=c(h=>{if(!h||!h.id)return;A.getDb(n).prepare(`
|
|
593
593
|
INSERT OR IGNORE INTO sessions
|
|
594
594
|
(id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
|
|
595
595
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
596
|
-
`).run(T(h.id),T(h.projectId)??n,T(h.task)??"",T(h.status)??"completed",T(h.startedAt)??new Date().toISOString(),T(h.pausedAt),T(h.completedAt),Ht(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=W.join(a,"current.json"),d=await ct(u);d!==null&&(l(d),await V.unlink(u).catch(()=>{}),s++);let m=W.join(a,"archive");try{let h=await V.readdir(m);for(let P of h){let k=W.join(m,P);try{if(!(await V.stat(k)).isDirectory())continue;let C=await V.readdir(k);for(let R of C){if(!R.endsWith(".json"))continue;let fe=await ct(W.join(k,R));fe!==null&&(l(fe),await V.unlink(W.join(k,R)).catch(()=>{}),s++)}(await V.readdir(k)).length===0&&await V.rmdir(k).catch(()=>{})}catch{}}(await V.readdir(m).catch(()=>[])).length===0&&await V.rmdir(m).catch(()=>{})}catch{}try{(await V.readdir(a)).length===0&&await V.rmdir(a).catch(()=>{})}catch{}let p=W.join(e,"index"),f=[...Ni.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of f){let E=W.join(p,h),P=await ct(E);if(P===null)continue;let k=Ni.find(I=>I.filename===h);k&&(A.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",k.key,JSON.stringify(P),new Date().toISOString()),pu(n,k.key,P));try{await V.unlink(E)}catch{}s++}return s}var Mi,Ni,Oi=v(()=>{"use strict";je();q();ye();Mi=[{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"}],Ni=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];c(Hr,"migrateJsonToSqlite");c(bf,"createBackup");c(_i,"copyFiles");c(mu,"populateNormalized");c(Sf,"populateTasksFromState");c(Tf,"populateQueueTasks");c(Ef,"populateIdeas");c(Cf,"populateShippedFeatures");c(Pf,"populateMetricsDaily");c(Rf,"populateAnalysis");c(pu,"populateIndexTables");c(Af,"populateCategoriesIndex");c(jf,"migrateChecksums");c(xf,"migrateFileScores");c($f,"migrateEventsJsonl");c(Df,"migrateLearningsJsonl");c(If,"migrateSessionFiles");c(_f,"cleanupJsonFiles");c(T,"toStr");c(Ht,"toNum");c(ct,"readJsonSafe");c(Wr,"sweepLegacyJson")});function hu(n){return[...n].sort((e,t)=>{let s=fu[e.section]-fu[t.section];return s!==0?s:gu[e.priority]-gu[t.priority]})}function Li(n,e){let t=new Set;return n.filter(s=>{let r=e(s);return t.has(r)?!1:(t.add(r),!0)})}var gu,fu,Fi=v(()=>{"use strict";gu={critical:0,high:1,medium:2,low:3},fu={active:0,previously_active:1,backlog:2};c(hu,"sortBySectionAndPriority");c(Li,"uniqueBy")});var Ui,Fs,Hi=v(()=>{"use strict";ns();ci();Fi();be();os();Ut();Ui=class extends _e{static{c(this,"QueueStorage")}constructor(){super("queue.json",Pl)}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 hu(t)[0]||null}async addTask(e,t){let s={...t,id:Le(),createdAt:b(),completed:!1};return await this.update(e,r=>({tasks:[...r.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(),r=t.map(o=>({...o,id:Le(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(r=>r.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:b()},s):i),lastUpdated:b()})),s){let r=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:b()}))}async setPriority(e,t,s){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async getTask(e,t){return(await this.read(e)).tasks.find(r=>r.id===t)||null}async updateTask(e,t,s){let r=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(r={...i,...s},r):i),lastUpdated:b()})),r&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),r}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:b()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=Ts(Rt.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(r.length===0)return 0;et.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},Fs=new Ui});import{z as B}from"zod";var Nf,yu,Mf,Of,Lf,Ff,Uf,Hf,Wf,wu,ku=v(()=>{"use strict";Nf=B.enum(["feature","fix","improvement","refactor"]),yu=B.enum(["pass","warning","fail","skipped"]),Mf=B.enum(["added","changed","fixed","removed"]),Of=B.object({hours:B.number(),minutes:B.number(),totalMinutes:B.number()}),Lf=B.object({filesChanged:B.number().nullable().optional(),linesAdded:B.number().nullable().optional(),linesRemoved:B.number().nullable().optional(),commits:B.number().nullable().optional()}),Ff=B.object({description:B.string(),type:Mf.optional()}),Uf=B.object({lintStatus:yu.nullable().optional(),lintDetails:B.string().optional(),testStatus:yu.nullable().optional(),testDetails:B.string().optional()}),Hf=B.object({hash:B.string().optional(),message:B.string().optional(),branch:B.string().optional()}),Wf=B.object({id:B.string(),name:B.string(),version:B.string().nullable().optional(),type:Nf,agent:B.string().optional(),description:B.string().optional(),changes:B.array(Ff).optional(),codeSnippets:B.array(B.string()).optional(),commit:Hf.optional(),codeMetrics:Lf.optional(),qualityMetrics:Uf.optional(),quantitativeImpact:B.string().optional(),duration:Of.optional(),tasksCompleted:B.number().nullable().optional(),shippedAt:B.string(),featureId:B.string().optional()}),wu=B.object({shipped:B.array(Wf),lastUpdated:B.string()})});var Wi,At,vu,Rn=v(()=>{"use strict";ns();ku();be();os();Ut();Wi=class extends _e{static{c(this,"ShippedStorage")}constructor(){super("shipped.json",wu)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Le(),shippedAt:b()};return await this.update(e,r=>({shipped:[s,...Array.isArray(r.shipped)?r.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(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,r;switch(t){case"week":r=new Date(s.getTime()-7*24*60*60*1e3);break;case"month":r=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":r=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=Ts(Rt.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(r.length===0)return 0;et.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},At=new Wi,vu=At});import{z as oe}from"zod";var Gf,Vf,bu,TC,EC,CC,Su,Tu=v(()=>{"use strict";Gf=oe.enum(["improving","stable","declining"]),Vf=oe.object({sprintNumber:oe.number(),startDate:oe.string(),endDate:oe.string(),pointsCompleted:oe.number(),tasksCompleted:oe.number(),avgVariance:oe.number(),estimationAccuracy:oe.number()}),bu=oe.object({category:oe.string(),avgVariance:oe.number(),taskCount:oe.number()}),TC=oe.object({totalPoints:oe.number(),sprints:oe.number(),estimatedDate:oe.string()}),EC=oe.object({sprints:oe.array(Vf),averageVelocity:oe.number(),velocityTrend:Gf,estimationAccuracy:oe.number(),overEstimated:oe.array(bu),underEstimated:oe.array(bu),lastUpdated:oe.string()}),CC=oe.object({sprintLengthDays:oe.number().min(1).max(90).default(7),startDay:oe.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:oe.number().min(1).max(52).default(6),accuracyTolerance:oe.number().min(0).max(100).default(20)}),Su={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Gi,Eu,Cu=v(()=>{"use strict";Tu();Ut();Gi=class extends _e{static{c(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Su,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}},Eu=new Gi});import Vi from"node:fs/promises";import Gr from"node:path";var Bi,Ji,Pu,Ru=v(()=>{"use strict";q();Y();Bi=".prjct/.prjct-state.md",Ji=class{static{c(this,"LocalStateGenerator")}async generate(e,t){let s=Gr.join(e,Bi);await Vi.mkdir(Gr.dirname(s),{recursive:!0});let r=this.toMarkdown(t);await Vi.writeFile(s,r,"utf-8")}async remove(e){try{await Vi.unlink(Gr.join(e,Bi))}catch(t){if(!x(t))throw t}}async exists(e){let t=Gr.join(e,Bi);return S(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,l)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=l===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${l+1}. ${u} ${a.description}${d}`)}),t.push("");let r=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
597
|
-
`)}},Pu=new Ji});var qi,
|
|
598
|
-
${n.stack} | ${n.fileCount} files | v${n.version} | Branch: ${n.branch}`}function
|
|
596
|
+
`).run(T(h.id),T(h.projectId)??n,T(h.task)??"",T(h.status)??"completed",T(h.startedAt)??new Date().toISOString(),T(h.pausedAt),T(h.completedAt),Ht(h.duration)??0,h.metrics?JSON.stringify(h.metrics):"{}",h.timeline?JSON.stringify(h.timeline):"[]")},"sessionInsert"),u=W.join(a,"current.json"),d=await at(u);d!==null&&(l(d),await V.unlink(u).catch(()=>{}),s++);let m=W.join(a,"archive");try{let h=await V.readdir(m);for(let P of h){let k=W.join(m,P);try{if(!(await V.stat(k)).isDirectory())continue;let C=await V.readdir(k);for(let R of C){if(!R.endsWith(".json"))continue;let ge=await at(W.join(k,R));ge!==null&&(l(ge),await V.unlink(W.join(k,R)).catch(()=>{}),s++)}(await V.readdir(k)).length===0&&await V.rmdir(k).catch(()=>{})}catch{}}(await V.readdir(m).catch(()=>[])).length===0&&await V.rmdir(m).catch(()=>{})}catch{}try{(await V.readdir(a)).length===0&&await V.rmdir(a).catch(()=>{})}catch{}let p=W.join(e,"index"),f=[...Ni.map(h=>h.filename),"checksums.json","file-scores.json"];for(let h of f){let E=W.join(p,h),P=await at(E);if(P===null)continue;let k=Ni.find(I=>I.filename===h);k&&(A.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",k.key,JSON.stringify(P),new Date().toISOString()),pu(n,k.key,P));try{await V.unlink(E)}catch{}s++}return s}var Mi,Ni,Oi=v(()=>{"use strict";je();q();he();Mi=[{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"}],Ni=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}];c(Hr,"migrateJsonToSqlite");c(Sf,"createBackup");c(_i,"copyFiles");c(mu,"populateNormalized");c(Tf,"populateTasksFromState");c(Ef,"populateQueueTasks");c(Cf,"populateIdeas");c(Pf,"populateShippedFeatures");c(Rf,"populateMetricsDaily");c(Af,"populateAnalysis");c(pu,"populateIndexTables");c(jf,"populateCategoriesIndex");c(xf,"migrateChecksums");c($f,"migrateFileScores");c(Df,"migrateEventsJsonl");c(If,"migrateLearningsJsonl");c(_f,"migrateSessionFiles");c(Nf,"cleanupJsonFiles");c(T,"toStr");c(Ht,"toNum");c(at,"readJsonSafe");c(Wr,"sweepLegacyJson")});function hu(n){return[...n].sort((e,t)=>{let s=fu[e.section]-fu[t.section];return s!==0?s:gu[e.priority]-gu[t.priority]})}function Li(n,e){let t=new Set;return n.filter(s=>{let r=e(s);return t.has(r)?!1:(t.add(r),!0)})}var gu,fu,Fi=v(()=>{"use strict";gu={critical:0,high:1,medium:2,low:3},fu={active:0,previously_active:1,backlog:2};c(hu,"sortBySectionAndPriority");c(Li,"uniqueBy")});var Ui,Fs,Hi=v(()=>{"use strict";ss();si();Fi();be();rs();Ut();Ui=class extends _e{static{c(this,"QueueStorage")}constructor(){super("queue.json",vl)}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 hu(t)[0]||null}async addTask(e,t){let s={...t,id:Le(),createdAt:b(),completed:!1};return await this.update(e,r=>({tasks:[...r.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(),r=t.map(o=>({...o,id:Le(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...r],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:r.length,tasks:r.map(o=>({id:o.id,description:o.description}))}),r}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(r=>r.id!==t),lastUpdated:b()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,r=>({tasks:r.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:b()},s):i),lastUpdated:b()})),s){let r=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:r.description,completedAt:r.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:b()}))}async setPriority(e,t,s){await this.update(e,r=>({tasks:r.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:b()}))}async getTask(e,t){return(await this.read(e)).tasks.find(r=>r.id===t)||null}async updateTask(e,t,s){let r=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(r={...i,...s},r):i),lastUpdated:b()})),r&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),r}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(r=>r.completed).length;return await this.update(e,r=>({tasks:r.tasks.filter(o=>!o.completed),lastUpdated:b()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=Ts(Pt.QUEUE_COMPLETED_DAYS),r=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(r.length===0)return 0;Ze.archiveMany(e,r.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(r.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"queue.stale_removed",{count:r.length}),r.length}},Fs=new Ui});import{z as B}from"zod";var Mf,yu,Of,Lf,Ff,Uf,Hf,Wf,Gf,wu,ku=v(()=>{"use strict";Mf=B.enum(["feature","fix","improvement","refactor"]),yu=B.enum(["pass","warning","fail","skipped"]),Of=B.enum(["added","changed","fixed","removed"]),Lf=B.object({hours:B.number(),minutes:B.number(),totalMinutes:B.number()}),Ff=B.object({filesChanged:B.number().nullable().optional(),linesAdded:B.number().nullable().optional(),linesRemoved:B.number().nullable().optional(),commits:B.number().nullable().optional()}),Uf=B.object({description:B.string(),type:Of.optional()}),Hf=B.object({lintStatus:yu.nullable().optional(),lintDetails:B.string().optional(),testStatus:yu.nullable().optional(),testDetails:B.string().optional()}),Wf=B.object({hash:B.string().optional(),message:B.string().optional(),branch:B.string().optional()}),Gf=B.object({id:B.string(),name:B.string(),version:B.string().nullable().optional(),type:Mf,agent:B.string().optional(),description:B.string().optional(),changes:B.array(Uf).optional(),codeSnippets:B.array(B.string()).optional(),commit:Wf.optional(),codeMetrics:Ff.optional(),qualityMetrics:Hf.optional(),quantitativeImpact:B.string().optional(),duration:Lf.optional(),tasksCompleted:B.number().nullable().optional(),shippedAt:B.string(),featureId:B.string().optional()}),wu=B.object({shipped:B.array(Gf),lastUpdated:B.string()})});var Wi,At,vu,Rn=v(()=>{"use strict";ss();ku();be();rs();Ut();Wi=class extends _e{static{c(this,"ShippedStorage")}constructor(){super("shipped.json",wu)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((r,o)=>new Date(o.shippedAt).getTime()-new Date(r.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Le(),shippedAt:b()};return await this.update(e,r=>({shipped:[s,...Array.isArray(r.shipped)?r.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(r=>r.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,r;switch(t){case"week":r=new Date(s.getTime()-7*24*60*60*1e3);break;case"month":r=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":r=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,r,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=Ts(Pt.SHIPPED_RETENTION_DAYS),r=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(r.length===0)return 0;Ze.archiveMany(e,r.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:b()})),await this.publishEvent(e,"shipped.archived",{count:r.length,oldestShippedAt:r[r.length-1]?.shippedAt}),r.length}},At=new Wi,vu=At});import{z as oe}from"zod";var Vf,Bf,bu,TC,EC,CC,Su,Tu=v(()=>{"use strict";Vf=oe.enum(["improving","stable","declining"]),Bf=oe.object({sprintNumber:oe.number(),startDate:oe.string(),endDate:oe.string(),pointsCompleted:oe.number(),tasksCompleted:oe.number(),avgVariance:oe.number(),estimationAccuracy:oe.number()}),bu=oe.object({category:oe.string(),avgVariance:oe.number(),taskCount:oe.number()}),TC=oe.object({totalPoints:oe.number(),sprints:oe.number(),estimatedDate:oe.string()}),EC=oe.object({sprints:oe.array(Bf),averageVelocity:oe.number(),velocityTrend:Vf,estimationAccuracy:oe.number(),overEstimated:oe.array(bu),underEstimated:oe.array(bu),lastUpdated:oe.string()}),CC=oe.object({sprintLengthDays:oe.number().min(1).max(90).default(7),startDay:oe.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:oe.number().min(1).max(52).default(6),accuracyTolerance:oe.number().min(0).max(100).default(20)}),Su={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var Gi,Eu,Cu=v(()=>{"use strict";Tu();Ut();Gi=class extends _e{static{c(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:Su,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}},Eu=new Gi});import Vi from"node:fs/promises";import Gr from"node:path";var Bi,Ji,Pu,Ru=v(()=>{"use strict";q();Y();Bi=".prjct/.prjct-state.md",Ji=class{static{c(this,"LocalStateGenerator")}async generate(e,t){let s=Gr.join(e,Bi);await Vi.mkdir(Gr.dirname(s),{recursive:!0});let r=this.toMarkdown(t);await Vi.writeFile(s,r,"utf-8")}async remove(e){try{await Vi.unlink(Gr.join(e,Bi))}catch(t){if(!x(t))throw t}}async exists(e){let t=Gr.join(e,Bi);return S(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,l)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=l===s.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${l+1}. ${u} ${a.description}${d}`)}),t.push("");let r=s.subtasks.filter(a=>a.status==="completed").length,o=s.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let s=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${s.description}**`),t.push(""),t.push(`- Status: ${s.status}`),s.prUrl&&t.push(`- PR: ${s.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
597
|
+
`)}},Pu=new Ji});var qi,He,cs=v(()=>{"use strict";Ce();rs();he();qi=class{static{c(this,"MemoryService")}async log(e,t,s,r){try{let o=await $.getProjectId(e);if(!o)return;L.appendEvent(o,`memory.${t}`,{...s,author:r})}catch(o){console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`)}}async getRecent(e,t=100){try{let s=await $.getProjectId(e);return s?L.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,...l}=i;return{timestamp:o.timestamp,action:o.type.replace("memory.",""),data:l,author:a}}):[]}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async search(e,t,s=50){let r=await this.getRecent(e,1e3),o=t.toLowerCase();return r.filter(i=>{let a=i.action.toLowerCase().includes(o),l=JSON.stringify(i.data).toLowerCase().includes(o);return a||l}).slice(-s)}async getByAction(e,t,s=50){try{let r=await $.getProjectId(e);return r?L.query(r,"SELECT type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`memory.${t}`,s).reverse().map(i=>{let a=JSON.parse(i.data),{author:l,...u}=a;return{timestamp:i.timestamp,action:i.type.replace("memory.",""),data:u,author:l}}):[]}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async clear(e){try{let t=await $.getProjectId(e);if(!t)return;L.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 L.query(e,"SELECT type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id DESC LIMIT ?",t).reverse().map(r=>{let o=JSON.parse(r.data);return{timestamp:r.timestamp,action:r.type.replace("memory.",""),...o}})}catch(s){return console.error(`Memory read error: ${s instanceof Error?s.message:String(s)}`),[]}}async capEntries(e){try{let s=L.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type LIKE 'memory.%'")?.cnt??0;if(s<=Pt.MEMORY_MAX_ENTRIES)return 0;let r=s-Pt.MEMORY_MAX_ENTRIES,o=L.query(e,"SELECT id, type, data, timestamp FROM events WHERE type LIKE 'memory.%' ORDER BY id ASC LIMIT ?",r);Ze.archiveMany(e,o.map((a,l)=>({entityType:"memory_entry",entityId:`memory-${a.timestamp||l}`,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&&L.run(e,"DELETE FROM events WHERE type LIKE 'memory.%' AND id <= ?",i),r}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},He=new qi});import Jf from"node:path";function qf(n){return pl(Jf.resolve(n))}function An(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"")}function zf(n){return Li(n,e=>`${An(e.name)}::${An(e.source)}`)}function Xf(n){return Li(n,e=>`${An(e.issue)}::${An(e.file)}::${An(e.source)}`)}var zi,Kf,Au,ju=v(()=>{"use strict";he();Fi();vr();c(qf,"repoHash");c(An,"normalizeKey");c(zf,"dedupePatterns");c(Xf,"dedupeAntiPatterns");zi=class{static{c(this,"PatternExtractor")}async extract(e){let t=qf(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 r=(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=zf([...s,...r]),a=Xf([...o]),l=`analysis:derived-rules:${t}`;return A.setDoc(e.projectId,l,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:a,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:a,repoPathHash:t}}},Kf=new zi,Au=Kf});import jn from"node:fs/promises";import Yf from"node:os";import xn from"node:path";function Qf(n){return`# ${n.projectName}
|
|
598
|
+
${n.stack} | ${n.fileCount} files | v${n.version} | Branch: ${n.branch}`}function Zf(n){return n.patterns.length===0?"":`
|
|
599
599
|
## Patterns
|
|
600
600
|
${n.patterns.slice(0,6).map(t=>`- **${t.name}**: ${t.description}${t.location?` (${t.location})`:""}`).join(`
|
|
601
601
|
`)}
|
|
602
|
-
`}function
|
|
602
|
+
`}function eh(n){if(n.antiPatterns.length===0)return"";let e={high:"HIGH",medium:"MEDIUM",low:"LOW"};return`
|
|
603
603
|
## Anti-Patterns
|
|
604
604
|
${n.antiPatterns.slice(0,6).map(s=>`- ${e[s.severity]||"MEDIUM"}: ${s.issue} in \`${s.file}\` \u2014 ${s.suggestion}`).join(`
|
|
605
605
|
`)}
|
|
606
|
-
`}function
|
|
606
|
+
`}function th(n){return n.knownGotchas.length===0?"":`
|
|
607
607
|
## Known Gotchas
|
|
608
608
|
${n.knownGotchas.slice(0,5).map(t=>`- ${t}`).join(`
|
|
609
609
|
`)}
|
|
610
|
-
`}function
|
|
610
|
+
`}function sh(n){return n.recentShipped.length===0?"":`
|
|
611
611
|
## Recent Deliveries
|
|
612
612
|
${n.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(`
|
|
613
613
|
`)}
|
|
614
|
-
`}function
|
|
614
|
+
`}function nh(n){if(!n.velocity)return"";let e=[];return n.velocity.avgPoints!=null&&e.push(`${n.velocity.avgPoints} pts/sprint`),n.velocity.trend&&e.push(n.velocity.trend),n.velocity.accuracy!=null&&e.push(`Estimation accuracy: ${n.velocity.accuracy}%`),e.length===0?"":`
|
|
615
615
|
## Velocity
|
|
616
616
|
${e.join(" | ")}
|
|
617
|
-
`}function
|
|
617
|
+
`}function rh(n){let e=[["Build",n.build],["Test",n.test],["Lint",n.lint],["Dev",n.dev],["Format",n.format]].filter(([t,s])=>s);return e.length===0?"":`
|
|
618
618
|
## Commands
|
|
619
619
|
| Action | Command |
|
|
620
620
|
|--------|---------|
|
|
621
621
|
${e.map(([t,s])=>`| ${t} | \`${s}\` |`).join(`
|
|
622
622
|
`)}
|
|
623
|
-
`}function
|
|
623
|
+
`}function oh(n){let e=[];if(n.hasActiveTask&&e.push(`Active task: **${n.activeTaskDescription}**`),n.pausedTasks.length>0)for(let s of n.pausedTasks.slice(0,3))e.push(`Paused: ${s.description} (${s.pausedAt})`);if(n.backlogCount>0){let s=n.topBacklog.slice(0,3).map(r=>`${r.description} [${r.priority}]`).join(", ");e.push(`Backlog: ${n.backlogCount} items${s?` \u2014 ${s}`:""}`)}let t=[];return n.ideasCount>0&&t.push(`Ideas: ${n.ideasCount} pending`),n.shippedCount>0&&t.push(`Shipped: ${n.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
|
|
624
624
|
## State
|
|
625
625
|
${e.join(`
|
|
626
626
|
`)}
|
|
627
|
-
`}function
|
|
627
|
+
`}function ih(n){return n.userPatterns.length===0?"":`
|
|
628
628
|
## User Patterns
|
|
629
629
|
${n.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
|
|
630
630
|
`)}
|
|
631
|
-
`}function
|
|
632
|
-
`)}function
|
|
631
|
+
`}function ah(n){return[Zf(n),eh(n),th(n),sh(n),nh(n),rh(n.commands),oh(n),ih(n)].filter(Boolean).join("")}function ch(n){return["# prjct","","## Use when","","You want to:","- recall prior project decisions, learnings, or shipped features","- capture a thought, todo, or insight without a commitment","- run a workflow the project already registered","- understand your role and the MCPs available in this project","","## What's here","",Qf(n),"",ah(n),"","### Primitives","",'- `prjct capture "<anything>"` \u2014 inbox dump (zero ceremony)','- `prjct remember <type> "<content>" [--tags]` \u2014 typed memory entry',"- `prjct context memory [topic]` \u2014 recall with optional keyword filter","- `prjct workflow list` / `prjct workflow run <name>` \u2014 registered workflows","- `prjct seed list` \u2014 active packs (memory types + workflow slots)","","Base memory types: `fact \xB7 decision \xB7 learning \xB7 gotcha \xB7 pattern \xB7 anti-pattern \xB7 shipped \xB7 inbox \xB7 todo \xB7 idea \xB7 insight \xB7 question \xB7 source \xB7 person`. Any lowercase string works (e.g. `recipe`, `okr`, `stakeholder`).","","### Data paths","","- `.prjct/wiki/_generated/` \u2014 agent-crawlable markdown (regenerated on ship/remember)","- `.prjct/wiki/captured/` \u2014 drop notes with frontmatter, run `prjct context wiki sync` to ingest","- `.prjct/prjct.config.json` \u2014 persona + active packs","","## Quality workflows","","Five named workflows for shipping quality. Each has an explicit methodology, modes, and stop conditions. Each persists findings via `prjct remember` so the vault accumulates project-specific knowledge across sessions.","","### `review` \u2014 Production Bug Hunt + Completeness Gate","",'Use when: user asks to review code, a PR, a recent diff, or "is this ready to ship".',"","Modes (pick one based on context):",'- `expansion` \u2014 adversarial scope ("what could break", "what is missing")',"- `polish` \u2014 final pass on already-correct code (naming, ergonomics, comments)","- `triage` \u2014 fast pass that flags everything but only auto-fixes the obvious","","Methodology:","1. Read git diff + relevant memory (decisions, gotchas) for affected files.","2. Find bugs that pass CI but blow up in production: race conditions, off-by-one, error swallow, leaked resources, partial writes, retry storms.","3. Auto-fix only the OBVIOUS (typos, wrong var names, missing await on a promise that is then discarded). Anything ambiguous \u2192 flag, do not touch.","4. Stop conditions: max 3 auto-fixes per file (more = the file needs a human); never refactor outside the diff scope.",'5. Persist: `prjct remember gotcha "<bug + how to avoid>"` for each finding; `prjct remember decision "<auto-fix applied>"` for each fix.',"","### `qa` \u2014 Real Browser, Atomic Fixes, Regression Tests","","Use when: user asks to test the app, validate a UI change, find UI bugs, or check accessibility.","","Methodology:","1. Use a real browser (Playwright MCP if available; otherwise document the manual steps).","2. Walk the golden path + 2-3 edge cases for the affected feature.","3. For each bug: atomic commit with `fix:` prefix + a regression test that fails without the fix.","4. Stop conditions: max 3 failed fixes per bug \u2014 escalate to a human with details (what was tried, why it failed).",'5. Persist: `prjct remember gotcha "<UI bug + reproducer>"`; `prjct remember decision "<fix + regression test path>"`.',"","### `security` \u2014 OWASP Top 10 + STRIDE Threat Model","",'Use when: user asks for a security review, a CSO check, a vulnerability scan, or "is this safe to ship".',"","Methodology:","1. Walk OWASP Top 10 against the diff: injection, broken auth, sensitive data exposure, XXE, broken access control, security misconfig, XSS, insecure deserialization, vulnerable deps, insufficient logging.","2. Run STRIDE on each new endpoint / data flow: Spoofing, Tampering, Repudiation, Info disclosure, DoS, Elevation of privilege.","3. Confidence gate: only report findings rated 8/10+ on exploit feasibility AND impact. Below = note in appendix only.","4. False-positive exclusions: skip CSRF on idempotent GET, skip SQL injection on parameterized queries, skip XSS on already-escaped templates, skip leaks on logged-error-codes-without-PII. (List grows with project context \u2014 capture exclusions as `prjct remember decision`).",'5. Each finding includes a CONCRETE exploit scenario (curl + payload, or click sequence). Abstract "could be exploited" is not actionable.','6. Persist: `prjct remember gotcha "<finding + exploit + fix>"` for every 8/10+ finding.',"","### `investigate` \u2014 Iron Law: no fix without investigation","",'Use when: user reports a bug, behavior is unexpected, tests fail intermittently, "why does X happen".',"","Methodology:","1. Iron Law: NO code fix until you can state the root cause in one sentence.","2. Trace the data flow from user input to symptom. Include logs, network, state.","3. Form a hypothesis. Design a test that proves or disproves it.","4. Stop condition: max 3 failed hypotheses per bug \u2014 escalate with what was tried.","5. Auto-freeze: limit edits to the module under investigation (mention this constraint to the user).",'6. Persist: `prjct remember learning "<root cause discovered>"`; `prjct remember decision "<fix + why it works>"`; `prjct remember gotcha "<related bug surfaced during investigation>"`.',"","### `ship` (endurecido) \u2014 Coverage Gate + Auto-Document","","Use when: user asks to ship, deploy, merge, or finalize work.","","Methodology (additions to the existing `prjct ship`):","1. Bootstrap a test framework if the project has none (bun test / vitest / jest based on stack).","2. Coverage gate: BLOCK ship if coverage drops more than 2% from the previous version.","3. Auto-document: scan the diff against README / ARCHITECTURE / CHANGELOG / CLAUDE.md \u2192 propose updates for any drift.","4. PR description: include {Summary, Tests added (delta), Coverage delta, Risk areas touched (cross-reference `_generated/analysis/risk-areas/`), Reviews already run on this branch}.",'5. Persist: `prjct remember decision "<release notes + coverage delta>"` so the next sprint sees the trend.',"","### Outputs convention","","Every workflow above persists findings VIA `prjct remember <type>` \u2014 never to ad-hoc files. The wiki regen exposes them in `_generated/memory/<type>.md` and `_generated/analysis/`. Tag with `--tags workflow:<name>,task:<id>` so the user can query a sprint cleanly with `prjct context --tags task=<id>`.","","## Gotchas","",'- Memory recall is best-effort \u2014 an empty result means no match, not "nothing exists".',"- Tags are freeform strings \u2014 reuse existing vocabulary before inventing new keys.","- Secret-like content is refused by `remember` and `capture` unless `--force`.",'- Bare `prjct "<text>"` routes to `capture` (inbox), not `task`. Use `prjct task` explicitly for work that needs a branch/worktree.',"- Hooks in `~/.claude/settings.json` already inject persona + topical memory on SessionStart / UserPromptSubmit \u2014 you rarely need to call prjct by hand at session start.",""].join(`
|
|
632
|
+
`)}function lh(n,e){let t=n.userInvocable!==!1;return`---
|
|
633
633
|
description: "${n.description}"
|
|
634
634
|
allowed-tools: [${n.allowedTools.map(s=>`"${s}"`).join(", ")}]
|
|
635
635
|
user-invocable: ${t}
|
|
636
|
-
---`}function
|
|
636
|
+
---`}function uh(n,e){return`${lh(n,e)}
|
|
637
637
|
|
|
638
|
-
${n.body(e)}`}var Xi,Ki,xu,$u=v(()=>{"use strict";It()
|
|
638
|
+
${n.body(e)}`}var Xi,Ki,xu,$u=v(()=>{"use strict";It();$s();c(Qf,"formatProjectHeader");c(Zf,"formatPatterns");c(eh,"formatAntiPatterns");c(th,"formatGotchas");c(sh,"formatRecentShipped");c(nh,"formatVelocity");c(rh,"formatCommands");c(oh,"formatState");c(ih,"formatUserPatterns");c(ah,"formatRichContext");Xi=[{name:"prjct",description:"Project memory + quality workflows. Use to recall prior decisions/learnings/gotchas, run quality reviews (review, qa, security, investigate), ship safely, or capture insights. Lookup-first: check the vault before re-reading source.",allowedTools:["Bash","Read","Write","Edit","Glob","Grep","Task"],condition:c(()=>!0,"condition"),body:c(n=>ch(n),"body")}];c(ch,"buildPrjctSkillBody");c(lh,"buildFrontmatter");c(uh,"buildSkillContent");Ki=class{static{c(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},s){let r={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=xn.join(Yf.homedir(),".claude","skills");for(let l of Xi){if(!l.condition(t)){r.skipped.push({name:l.name,reason:"condition not met"}),await jn.rm(xn.join(i,l.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=uh(l,o),d=xn.join(i,l.name),m=xn.join(d,"SKILL.md");await jn.mkdir(d,{recursive:!0}),await jn.writeFile(m,u,"utf-8"),r.generated.push({name:l.name,path:m})}catch(u){H.debug(`Failed to generate skill ${l.name}`,{error:ae(u)}),r.skipped.push({name:l.name,reason:ae(u)})}}let a=new Set(Xi.map(l=>l.name));try{let l=await jn.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of l)u.isDirectory()&&u.name.startsWith("prjct-")&&!a.has(u.name)&&await jn.rm(xn.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return r.generated.length>0&&H.info("Generated native workflow skills",{count:r.generated.length,skills:r.generated.map(l=>l.name)}),r}getDefinitions(){return Xi}},xu=new Ki});var Du=v(()=>{"use strict"});import dh from"node:fs/promises";import Iu from"node:path";var Vr,_u=v(()=>{"use strict";Y();Vr=class{static{c(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let s={...t.dependencies,...t.devDependencies};this.detectFrontend(s,e),this.detectBackend(s,e),this.detectDatabase(s,e),this.detectTesting(s,t,e),this.collectFrameworks(s,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(t.hasDatabase=!0)}detectTesting(e,t,s){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(s.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.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=Iu.join(this.projectPath,"package.json"),t=await dh.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return S(Iu.join(this.projectPath,e))}}});import Yi from"node:path";async function Nu(n){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await _("git branch --show-current",{cwd:n});e.branch=t.trim()||"main";let{stdout:s}=await _("git rev-list --count HEAD",{cwd:n});e.commits=parseInt(s.trim(),10)||0;let{stdout:r}=await _("git shortlog -sn --all | wc -l",{cwd:n});e.contributors=parseInt(r.trim(),10)||0;let{stdout:o}=await _("git status --porcelain",{cwd:n}),i=o.trim().split(`
|
|
639
639
|
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await _('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:n});e.recentCommits=a.split(`
|
|
640
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:l}=await _('git log --oneline --since="1 week ago" | wc -l',{cwd:n});e.weeklyCommits=parseInt(l.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:ae(t)})}return e}async function lt(n,e){let t=await S(Yi.join(n,e));return t||H.debug("File not found",{filename:e}),t}async function Mu(n){let e={fileCount:0,version:"0.0.0",name:Yi.basename(n),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await _('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:n});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:n,error:ae(t)}),e.fileCount=0}try{let t=Yi.join(n,"package.json"),s=await ge(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 lt(n,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:n,error:ae(t)})}return await lt(n,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await lt(n,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await lt(n,"requirements.txt")||await lt(n,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Ou(n){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await lt(n,"bun.lockb")||await lt(n,"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 lt(n,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await lt(n,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await lt(n,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await lt(n,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Lu(n){return new Vr(n).detect()}var Fu=v(()=>{"use strict";It();Du();Me();Y();Is();_u();c(Nu,"analyzeGit");c(lt,"fileExistsInProject");c(Mu,"gatherStats");c(Ou,"detectCommands");c(Lu,"detectStack")});import Uu from"node:fs/promises";import Qi from"node:path";var Hu,Zi,Wu,Gu=v(()=>{"use strict";it();q();Me();Hu={async jsonFilesValid(n){let e=Date.now(),t=[],s=Qi.basename(n);try{await F.read(s)}catch(r){x(r)||t.push(`state: ${y(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(n){let e=Date.now(),t=Qi.join(n,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await Uu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Uu.readFile(Qi.join(t,i),"utf-8");for(let l of s)if(l.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!x(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Zi=class{static{c(this,"SyncVerifier")}async verify(e,t,s){let r=Date.now(),o=[],i=s?.failFast??!1,a=0,l=[Hu.jsonFilesValid(t),Hu.noSensitiveData(t)];for(let p of l){let f=await p;if(o.push(f),!f.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&s?.checks)for(let p of s.checks){if(p.enabled===!1){a++;continue}let f=await this.runCustomCheck(p,e);if(o.push(f),!f.passed&&i){let h=s.checks.slice(s.checks.indexOf(p)+1);a+=h.filter(E=>E.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await _(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},Wu=new Zi});import Vu from"node:fs/promises";import ea from"node:path";var ta,Us,sa=v(()=>{"use strict";ei();Nl();Ll();Gl();hi();It();He();bt();Ce();je();Ur();En();os();ye();$i();Cn();Ii();Oi();Hi();Rn();it();Cu();be();Y();Is();Dr();Ru();cs();ju();$u();Fu();Gu();ta=class{static{c(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),r={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=j.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Vu.rm(ea.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await ts()).installed){let R=await Fr({autoRepair:!0});R.verified||H.warn(`Codex p. router not ready: ${R.message||"verification failed"}`)}try{r=await is.ensureReady()}catch(R){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:r.installed,verified:!1,message:ae(R)},error:`Context7 MCP is required but not ready: ${ae(R)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Hr(this.projectId);try{let R=await Wr(this.projectId);R>0&&H.info("Swept legacy JSON files into SQLite",{swept:R})}catch(R){H.debug("Legacy JSON sweep failed (non-critical)",{error:ae(R)})}let[a,l,u,d]=await Promise.all([Nu(this.projectPath),Mu(this.projectPath),Ou(this.projectPath),Lu(this.projectPath)]),m=t.full===!0,p,f=!0,h=new Set;if(!m&&Ol(this.projectId))try{let{diff:R,currentHashes:fe}=await wi(this.projectPath,this.projectId),ze=R.added.length+R.modified.length+R.deleted.length;if(ze===0&&!t.changedFiles?.length)f=!1,p={isIncremental:!0,filesChanged:0,filesUnchanged:R.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let gt=Il(R,this.projectId);h=_l(gt.allAffected);let ft=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=gt.allAffected.some(Et=>{let Dt=Et.substring(Et.lastIndexOf("."));return ft.has(Dt)}),p={isIncremental:!0,filesChanged:ze,filesUnchanged:R.unchanged.length,indexesRebuilt:f,affectedDomains:Array.from(h)}}yi(this.projectId,fe)}catch(R){H.debug("Incremental detection failed, falling back to full sync",{error:ae(R)})}else try{let{currentHashes:R}=await wi(this.projectPath,this.projectId);yi(this.projectId,R)}catch(R){H.debug("Hash computation failed (non-critical)",{error:ae(R)})}if(f)try{await Promise.all([fl(this.projectPath,this.projectId),Dl(this.projectPath,this.projectId),Wl(this.projectPath,this.projectId)])}catch(R){H.debug("File ranking index build failed (non-critical)",{error:ae(R)})}let E;try{let[R,fe,ze,gt,ft,Kt,Et,Dt,yn,To,vc]=await Promise.all([Promise.resolve(Ze.getActive(this.projectId)).catch(()=>null),Oe.getActive(this.projectId).catch(()=>null),At.getRecent(this.projectId,3).catch(()=>[]),Eu.getMetrics(this.projectId).catch(()=>null),Fs.getBacklog(this.projectId).catch(()=>[]),F.getTaskHistory(this.projectId).catch(()=>[]),F.getAllPausedTasks(this.projectId).catch(()=>[]),F.getAggregatedFeedback(this.projectId).catch(()=>null),F.getCurrentTask(this.projectId).catch(()=>null),Os.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),At.getCount(this.projectId).catch(()=>0)]),K={backlogCount:ft.length,completedTaskCount:Kt.length,pausedTaskCount:Et.length,hasActiveTask:!!yn},ve=R?R.patterns.map(Z=>({name:Z.name,description:Z.description,location:Z.locations?.[0]})):(fe?.patterns??[]).filter(Z=>Z.source!=="repo").map(Z=>({name:Z.name,description:Z.description,location:Z.location})),Yt=R?R.antiPatterns.map(Z=>({issue:Z.issue,file:Z.files?.[0]??"multiple",suggestion:Z.suggestion,severity:Z.severity??"medium"})):(fe?.antiPatterns??[]).filter(Z=>Z.source!=="repo").map(Z=>({issue:Z.issue,file:Z.file,suggestion:Z.suggestion,severity:Z.severity??"medium"})),sp=R?.commands?{install:R.commands.install??u.install,run:u.run,test:R.commands.test??u.test,build:R.commands.build??u.build,dev:R.commands.dev??u.dev,lint:R.commands.lint??u.lint,format:R.commands.format??u.format}:u,np={version:l.version,fileCount:l.fileCount,patterns:ve,antiPatterns:Yt,recentShipped:ze.map(Z=>({name:Z.name,type:Z.type??"feature",duration:Z.duration,filesChanged:Z.changes?.length})),velocity:gt?{avgPoints:gt.averageVelocity,trend:gt.velocityTrend,accuracy:gt.estimationAccuracy}:null,backlogCount:ft.length,completedTaskCount:Kt.length,pausedTaskCount:Et.length,knownGotchas:Dt?.knownGotchas??[],userPatterns:Dt?.patternsDiscovered??[],hasActiveTask:!!yn,activeTaskDescription:yn?.description??"",pausedTasks:Et.map(Z=>({description:Z.description,pausedAt:Z.pausedAt??""})),topBacklog:ft.slice(0,3).map(Z=>({description:Z.description,priority:Z.priority??"medium"})),ideasCount:To?.pending??0,shippedCount:vc};E=await xu.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:sp,stack:d},K,np)}catch(R){H.debug("Native skill generation failed (non-critical)",{error:ae(R)})}await Promise.all([this.updateProjectJson(a,l),this.updateStateJson(l,d),this.logToMemory(a,l),this.saveDraftAnalysis(a,l,d,r.verified)]);let P=await Oe.getActive(this.projectId),k={patterns:P?.patterns?.length||0,antiPatterns:P?.antiPatterns?.length||0,criticalAntiPatterns:P?.antiPatterns?.filter(R=>R.severity==="high").length||0},I=Date.now()-s,C=await this.recordSyncMetrics(l,I);await this.archiveStaleData(),await this.autoLearnFromHistory(),await pe.installGlobalConfig(),await pe.syncCommands();let te;try{let R=await $.readConfig(this.projectPath);te=await Wu.verify(this.projectPath,this.globalPath,R?.verification)}catch(R){H.debug("Verification failed (non-critical)",{error:ae(R)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:u,stack:d,context7:{installed:r.installed,verified:r.verified,message:r.message},analysisSummary:k,syncMetrics:C,verification:te,incremental:p,generatedSkills:E}}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:r.installed,verified:r.verified,message:r.message},error:ae(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Vu.mkdir(ea.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=A.getDoc(this.projectId,"project")||{},r={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};A.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await F.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=b(),r.lastUpdated=b(),r.context={...r.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,r);try{await Pu.generate(this.projectPath,r)}catch(o){H.debug("Local state generation failed (optional)",{error:ae(o)})}}async logToMemory(e,t){A.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=Er(this.projectId);if(a)for(let l of Object.values(a.documents))s+=l.length}catch(a){H.debug("Could not load BM25 index for metrics",{error:ae(a)})}s===0&&(s=e.fileCount*200);let r=0,o=s>0?Math.max(0,(s-r)/s):0;try{await Ls.recordSync(this.projectId,{originalSize:s,filteredSize:r,duration:t,isWatch:!1})}catch(a){H.debug("Failed to record sync metrics",{error:ae(a)})}let i={};try{let a=Er(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let l=xr(this.projectId);l&&(i.importEdges=l.edgeCount,i.importFiles=l.fileCount);let u=Hl(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){H.debug("Could not load index stats",{error:ae(a)})}return{duration:t,originalSize:s,filteredSize:r,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,r){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],l;try{l=await F.getAggregatedFeedback(this.projectId),l.patternsDiscovered.length>0&&(i=l.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),l.knownGotchas.length>0&&(a=l.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Au.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:l,context7Verified:r});i=u.patterns,a=u.antiPatterns,await Oe.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){H.debug("Failed to save draft analysis (non-critical)",{error:ae(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,r,o]=await Promise.all([At.archiveOldShipped(this.projectId).catch(()=>0),Os.markDormantIdeas(this.projectId).catch(()=>0),Fs.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),We.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+r.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:r.length,memoryCapped:o,total:i});let a=et.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:ae(e)})}}async autoLearnFromHistory(){}async getCliVersion(){try{let e=ea.join(__dirname,"..","..","package.json");return(await ge(e))?.version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:ae(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:[]}}},Us=new ta});function dh(){return"---"}function mh(){return`---
|
|
641
|
-
prjct v${Zn()}`}function N(...n){return ra(
|
|
640
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:l}=await _('git log --oneline --since="1 week ago" | wc -l',{cwd:n});e.weeklyCommits=parseInt(l.trim(),10)||0}catch(t){H.debug("Git analysis failed (not a git repo?)",{error:ae(t)})}return e}async function ct(n,e){let t=await S(Yi.join(n,e));return t||H.debug("File not found",{filename:e}),t}async function Mu(n){let e={fileCount:0,version:"0.0.0",name:Yi.basename(n),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await _('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:n});e.fileCount=parseInt(t.trim(),10)||0}catch(t){H.debug("File count failed",{path:n,error:ae(t)}),e.fileCount=0}try{let t=Yi.join(n,"package.json"),s=await pe(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 ct(n,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){H.debug("No package.json found",{path:n,error:ae(t)})}return await ct(n,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await ct(n,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await ct(n,"requirements.txt")||await ct(n,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Ou(n){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await ct(n,"bun.lockb")||await ct(n,"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 ct(n,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await ct(n,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await ct(n,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await ct(n,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Lu(n){return new Vr(n).detect()}var Fu=v(()=>{"use strict";It();Du();Me();Y();$s();_u();c(Nu,"analyzeGit");c(ct,"fileExistsInProject");c(Mu,"gatherStats");c(Ou,"detectCommands");c(Lu,"detectStack")});import Uu from"node:fs/promises";import Qi from"node:path";var Hu,Zi,Wu,Gu=v(()=>{"use strict";rt();q();Me();Hu={async jsonFilesValid(n){let e=Date.now(),t=[],s=Qi.basename(n);try{await F.read(s)}catch(r){x(r)||t.push(`state: ${y(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(n){let e=Date.now(),t=Qi.join(n,"context"),s=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await Uu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Uu.readFile(Qi.join(t,i),"utf-8");for(let l of s)if(l.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!x(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${y(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Zi=class{static{c(this,"SyncVerifier")}async verify(e,t,s){let r=Date.now(),o=[],i=s?.failFast??!1,a=0,l=[Hu.jsonFilesValid(t),Hu.noSensitiveData(t)];for(let p of l){let f=await p;if(o.push(f),!f.passed&&i){a=s?.checks?.filter(h=>h.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&s?.checks)for(let p of s.checks){if(p.enabled===!1){a++;continue}let f=await this.runCustomCheck(p,e);if(o.push(f),!f.passed&&i){let h=s.checks.slice(s.checks.indexOf(p)+1);a+=h.filter(E=>E.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let s=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-s};try{let{stdout:o,stderr:i}=await _(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-s}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-s}}}},Wu=new Zi});import Vu from"node:fs/promises";import ea from"node:path";var ta,Us,sa=v(()=>{"use strict";zo();jl();Dl();Ol();ui();It();Ve();Rt();Ce();je();Ur();En();rs();he();$i();Cn();Ii();Oi();Hi();Rn();rt();Cu();be();Y();$s();Dr();Ru();cs();ju();$u();Fu();Gu();ta=class{static{c(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let s=Date.now(),r={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=j.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await Vu.rm(ea.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await ts()).installed){let R=await Fr({autoRepair:!0});R.verified||H.warn(`Codex p. router not ready: ${R.message||"verification failed"}`)}try{r=await is.ensureReady()}catch(R){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),context7:{installed:r.installed,verified:!1,message:ae(R)},error:`Context7 MCP is required but not ready: ${ae(R)}. Run 'prjct start' to repair.`}}await this.ensureDirectories(),await Hr(this.projectId);try{let R=await Wr(this.projectId);R>0&&H.info("Swept legacy JSON files into SQLite",{swept:R})}catch(R){H.debug("Legacy JSON sweep failed (non-critical)",{error:ae(R)})}let[a,l,u,d]=await Promise.all([Nu(this.projectPath),Mu(this.projectPath),Ou(this.projectPath),Lu(this.projectPath)]),m=t.full===!0,p,f=!0,h=new Set;if(!m&&$l(this.projectId))try{let{diff:R,currentHashes:ge}=await mi(this.projectPath,this.projectId),ze=R.added.length+R.modified.length+R.deleted.length;if(ze===0&&!t.changedFiles?.length)f=!1,p={isIncremental:!0,filesChanged:0,filesUnchanged:R.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let pt=Rl(R,this.projectId);h=Al(pt.allAffected);let gt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);f=pt.allAffected.some(Tt=>{let Dt=Tt.substring(Tt.lastIndexOf("."));return gt.has(Dt)}),p={isIncremental:!0,filesChanged:ze,filesUnchanged:R.unchanged.length,indexesRebuilt:f,affectedDomains:Array.from(h)}}di(this.projectId,ge)}catch(R){H.debug("Incremental detection failed, falling back to full sync",{error:ae(R)})}else try{let{currentHashes:R}=await mi(this.projectPath,this.projectId);di(this.projectId,R)}catch(R){H.debug("Hash computation failed (non-critical)",{error:ae(R)})}if(f)try{await Promise.all([ll(this.projectPath,this.projectId),Pl(this.projectPath,this.projectId),Ml(this.projectPath,this.projectId)])}catch(R){H.debug("File ranking index build failed (non-critical)",{error:ae(R)})}let E;try{let[R,ge,ze,pt,gt,Kt,Tt,Dt,yn,To,vc]=await Promise.all([Promise.resolve(Qe.getActive(this.projectId)).catch(()=>null),Oe.getActive(this.projectId).catch(()=>null),At.getRecent(this.projectId,3).catch(()=>[]),Eu.getMetrics(this.projectId).catch(()=>null),Fs.getBacklog(this.projectId).catch(()=>[]),F.getTaskHistory(this.projectId).catch(()=>[]),F.getAllPausedTasks(this.projectId).catch(()=>[]),F.getAggregatedFeedback(this.projectId).catch(()=>null),F.getCurrentTask(this.projectId).catch(()=>null),Os.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),At.getCount(this.projectId).catch(()=>0)]),K={backlogCount:gt.length,completedTaskCount:Kt.length,pausedTaskCount:Tt.length,hasActiveTask:!!yn},ve=R?R.patterns.map(Z=>({name:Z.name,description:Z.description,location:Z.locations?.[0]})):(ge?.patterns??[]).filter(Z=>Z.source!=="repo").map(Z=>({name:Z.name,description:Z.description,location:Z.location})),Yt=R?R.antiPatterns.map(Z=>({issue:Z.issue,file:Z.files?.[0]??"multiple",suggestion:Z.suggestion,severity:Z.severity??"medium"})):(ge?.antiPatterns??[]).filter(Z=>Z.source!=="repo").map(Z=>({issue:Z.issue,file:Z.file,suggestion:Z.suggestion,severity:Z.severity??"medium"})),np=R?.commands?{install:R.commands.install??u.install,run:u.run,test:R.commands.test??u.test,build:R.commands.build??u.build,dev:R.commands.dev??u.dev,lint:R.commands.lint??u.lint,format:R.commands.format??u.format}:u,rp={version:l.version,fileCount:l.fileCount,patterns:ve,antiPatterns:Yt,recentShipped:ze.map(Z=>({name:Z.name,type:Z.type??"feature",duration:Z.duration,filesChanged:Z.changes?.length})),velocity:pt?{avgPoints:pt.averageVelocity,trend:pt.velocityTrend,accuracy:pt.estimationAccuracy}:null,backlogCount:gt.length,completedTaskCount:Kt.length,pausedTaskCount:Tt.length,knownGotchas:Dt?.knownGotchas??[],userPatterns:Dt?.patternsDiscovered??[],hasActiveTask:!!yn,activeTaskDescription:yn?.description??"",pausedTasks:Tt.map(Z=>({description:Z.description,pausedAt:Z.pausedAt??""})),topBacklog:gt.slice(0,3).map(Z=>({description:Z.description,priority:Z.priority??"medium"})),ideasCount:To?.pending??0,shippedCount:vc};E=await xu.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:np,stack:d},K,rp)}catch(R){H.debug("Native skill generation failed (non-critical)",{error:ae(R)})}await Promise.all([this.updateProjectJson(a,l),this.updateStateJson(l,d),this.logToMemory(a,l),this.saveDraftAnalysis(a,l,d,r.verified)]);let P=await Oe.getActive(this.projectId),k={patterns:P?.patterns?.length||0,antiPatterns:P?.antiPatterns?.length||0,criticalAntiPatterns:P?.antiPatterns?.filter(R=>R.severity==="high").length||0},I=Date.now()-s,C=await this.recordSyncMetrics(l,I);await this.archiveStaleData(),await this.autoLearnFromHistory(),await ye.installGlobalConfig(),await ye.syncCommands();let te;try{let R=await $.readConfig(this.projectPath);te=await Wu.verify(this.projectPath,this.globalPath,R?.verification)}catch(R){H.debug("Verification failed (non-critical)",{error:ae(R)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:a,stats:l,commands:u,stack:d,context7:{installed:r.installed,verified:r.verified,message:r.message},analysisSummary:k,syncMetrics:C,verification:te,incremental:p,generatedSkills:E}}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:r.installed,verified:r.verified,message:r.message},error:ae(o)}}}async ensureDirectories(){let e=["storage","context","memory","analysis","config","sync"];await Promise.all(e.map(t=>Vu.mkdir(ea.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let s=A.getDoc(this.projectId,"project")||{},r={...s,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:s.createdAt||b(),lastSync:b(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};A.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await F.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=b(),r.lastUpdated=b(),r.context={...r.context||{},lastSession:b(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,r);try{await Pu.generate(this.projectPath,r)}catch(o){H.debug("Local state generation failed (optional)",{error:ae(o)})}}async logToMemory(e,t){A.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=kr(this.projectId);if(a)for(let l of Object.values(a.documents))s+=l.length}catch(a){H.debug("Could not load BM25 index for metrics",{error:ae(a)})}s===0&&(s=e.fileCount*200);let r=0,o=s>0?Math.max(0,(s-r)/s):0;try{await Ls.recordSync(this.projectId,{originalSize:s,filteredSize:r,duration:t,isWatch:!1})}catch(a){H.debug("Failed to record sync metrics",{error:ae(a)})}let i={};try{let a=kr(this.projectId);a&&(i.bm25Files=a.totalDocs,i.bm25AvgTokens=Math.round(a.avgDocLength),i.bm25VocabSize=Object.keys(a.invertedIndex).length);let l=Cr(this.projectId);l&&(i.importEdges=l.edgeCount,i.importFiles=l.fileCount);let u=Nl(this.projectId);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(a){H.debug("Could not load index stats",{error:ae(a)})}return{duration:t,originalSize:s,filteredSize:r,compressionRate:o,indexes:i}}async saveDraftAnalysis(e,t,s,r){try{let o=e.recentCommits[0]?.hash||null,i=[],a=[],l;try{l=await F.getAggregatedFeedback(this.projectId),l.patternsDiscovered.length>0&&(i=l.patternsDiscovered.map(d=>({name:d,description:`Discovered during task execution: ${d}`,source:"feedback",confidence:.74}))),l.knownGotchas.length>0&&(a=l.knownGotchas.map(d=>({issue:d,file:"multiple",suggestion:`Recurring issue reported across tasks: ${d}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let u=await Au.extract({projectId:this.projectId,projectPath:this.projectPath,languages:t.languages,frameworks:Array.from(new Set([...t.frameworks,...s.frameworks])),feedback:l,context7Verified:r});i=u.patterns,a=u.antiPatterns,await Oe.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){H.debug("Failed to save draft analysis (non-critical)",{error:ae(o)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,s,r,o]=await Promise.all([At.archiveOldShipped(this.projectId).catch(()=>0),Os.markDormantIdeas(this.projectId).catch(()=>0),Fs.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),He.capEntries(this.projectId).catch(()=>0)]),i=e+t+s+r.length+o;if(i>0){H.info("Archived stale data",{shipped:e,dormant:t,staleQueue:s,stalePaused:r.length,memoryCapped:o,total:i});let a=Ze.getStats(this.projectId);H.debug("Archive stats",a)}}catch(e){H.debug("Archival failed (non-critical)",{error:ae(e)})}}async autoLearnFromHistory(){}async getCliVersion(){try{let e=ea.join(__dirname,"..","..","package.json");return(await pe(e))?.version||"0.0.0"}catch(e){return H.debug("Failed to read CLI version",{error:ae(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:[]}}},Us=new ta});function mh(){return"---"}function ph(){return`---
|
|
641
|
+
prjct v${Zn()}`}function N(...n){return ra(mh(),...n.filter(Boolean),ph())}function Bu(n,e){let t=`| ${n.join(" | ")} |`,s=`|${n.map(()=>"---").join("|")}|`,r=e.map(o=>`| ${o.join(" | ")} |`);return[t,s,...r].join(`
|
|
642
642
|
`)}function Ju(n,e=""){return`\`\`\`${e}
|
|
643
643
|
${n}
|
|
644
644
|
\`\`\``}function na(n,e){return`**${n}**: \`${e}\``}function O(n,e,t=3){return`### ${n}
|
|
@@ -649,17 +649,17 @@ ${Bu(e,t)}`}function Hs(n){let e=Object.entries(n).filter(([,r])=>r!=null);if(e.
|
|
|
649
649
|
> ${e}`:`## ${n}`}function qu(n){return`> **WARNING:** ${n}`}function ra(...n){return n.filter(Boolean).join(`
|
|
650
650
|
|
|
651
651
|
`)}function zu(n,e,t,s){let r=e.replace(/_/g," "),o=[`> **${n}**: ${r}`];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(`
|
|
652
|
-
`))}var Wt=v(()=>{"use strict";st();c(
|
|
653
|
-
Next:`));for(let o of r){let i=Dn.cyan(o.cmd.padEnd(12));console.log(Dn.dim(` ${i} \u2192 ${o.desc}`))}}function Br(n,e=!1){let t=Ku[n]||"idle";return
|
|
654
|
-
`),this))},done(n,e){if(this.stop(),!Be){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=se.dim(` [${s.join(" | ")}]`))}console.log(`${us.success} ${Gt(n,
|
|
652
|
+
`))}var Wt=v(()=>{"use strict";st();c(mh,"mdHeader");c(ph,"mdFooter");c(N,"mdOutput");c(Bu,"mdTable");c(Ju,"mdCodeBlock");c(na,"mdBadge");c(O,"mdSection");c(Se,"mdList");c($n,"mdTaskHeader");c($e,"mdNextSteps");c(Hs,"mdStats");c(we,"mdDone");c(qu,"mdWarn");c(ra,"mdJoin");c(zu,"mdActionRequired")});import Dn from"chalk";function Ws(n,e={}){if(e.quiet)return;let t=Ku[n]||"idle",s=ns.getValidCommands(t);if(s.length===0)return;let r=s.map(o=>({cmd:`p. ${o}`,desc:Xu[o]||o}));console.log(Dn.dim(`
|
|
653
|
+
Next:`));for(let o of r){let i=Dn.cyan(o.cmd.padEnd(12));console.log(Dn.dim(` ${i} \u2192 ${o.desc}`))}}function Br(n,e=!1){let t=Ku[n]||"idle";return ns.getValidCommands(t).map(r=>({cmd:e?`prjct ${r} --md`:`p. ${r}`,desc:Xu[r]||r}))}function Yu(n){let e=ns.getStateInfo(n);console.log(Dn.dim(`\u{1F4CD} State: ${Dn.white(n.toUpperCase())} - ${e.description}`))}var Xu,Ku,In=v(()=>{"use strict";ri();Xu={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"},Ku={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"};c(Ws,"showNextSteps");c(Br,"getNextSteps");c(Yu,"showStateInfo")});import ls from"chalk";var Qu,gh,fh,lt,Zu=v(()=>{"use strict";Ve();Qu=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],gh=80,fh={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Qu,speed:gh},cli:{header:c(()=>`${ls.cyan.bold("\u26A1")} ${ls.cyan("prjct")}`,"header"),footer:c(()=>ls.dim("\u26A1 prjct"),"footer"),spin:c((n,e)=>`${ls.cyan("\u26A1")} ${ls.cyan("prjct")} ${ls.cyan(Qu[n%10])} ${ls.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:c((n="claude")=>cr(n).commitFooter,"getCommitFooter"),getSignature:c((n="claude")=>cr(n).signature,"getSignature")},lt=fh});import se from"chalk";function wh(){return hh[yh]}var SR,oa,hh,yh,us,Gs,ia,Be,Gt,kh,vh,g,Re=v(()=>{"use strict";Zu();Mr();Ti();SR=lt.spinner.frames,oa=lt.spinner.speed,hh={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}},yh="compact";c(wh,"getTierConfig");us={success:se.green("\u2713"),fail:se.red("\u2717"),warn:se.yellow("\u26A0"),info:se.blue("\u2139"),debug:se.dim("\u{1F527}"),bullet:se.dim("\u2022"),arrow:se.dim("\u2192"),check:se.green("\u2713"),cross:se.red("\u2717"),spinner:se.cyan("\u25D0")},Gs=null,ia=0,Be=!1,Gt=c((n,e)=>{let t=e??(wh().maxCharsPerLine||it.FALLBACK_TRUNCATE);return n&&n.length>t?`${n.slice(0,t-1)}\u2026`:n||""},"truncate"),kh=c(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(it.CLEAR_WIDTH)}\r`):!0,"clear"),vh={start(){return Be||console.log(lt.cli.header()),this},end(){return Be||console.log(lt.cli.footer()),this},spin(n){return Be?this:(this.stop(),process.stdout.isTTY?(Gs=setInterval(()=>{process.stdout.write(`\r${lt.cli.spin(ia++,Gt(n,it.SPINNER_MSG))}`)},oa),this):(process.stdout.write(`${lt.cli.spin(0,Gt(n,it.SPINNER_MSG))}
|
|
654
|
+
`),this))},done(n,e){if(this.stop(),!Be){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=se.dim(` [${s.join(" | ")}]`))}console.log(`${us.success} ${Gt(n,it.DONE_MSG)}${t}`)}return this},fail(n){return this.stop(),console.error(`${us.fail} ${Gt(n,it.FAIL_MSG)}`),this},failWithHint(n){this.stop();let e=typeof n=="string"?Yl(n):n;return console.error(),console.error(`${us.fail} ${e.message}`),e.file&&console.error(se.dim(` File: ${e.file}`)),e.hint&&console.error(se.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(se.dim(` Docs: ${e.docs}`)),console.error(),this},warn(n){return this.stop(),Be||console.log(`${us.warn} ${Gt(n,it.WARN_MSG)}`),this},info(n){return this.stop(),Be||console.log(`${us.info} ${n}`),this},debug(n){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!Be&&e&&console.log(`${us.debug} ${se.dim(n)}`),this},success(n,e){return this.done(n,e)},list(n,e={}){if(this.stop(),Be)return this;let t=e.bullet||us.bullet,s=" ".repeat(e.indent||0);for(let r of n)console.log(`${s}${t} ${r}`);return this},table(n,e={}){if(this.stop(),Be||n.length===0)return this;let t=Object.keys(n[0]),s={};for(let r of t){s[r]=r.length;for(let o of n){let i=String(o[r]??"");i.length>s[r]&&(s[r]=i.length)}}if(e.header!==!1){let r=t.map(o=>o.padEnd(s[o])).join(" ");console.log(se.dim(r)),console.log(se.dim("\u2500".repeat(r.length)))}for(let r of n){let o=t.map(i=>String(r[i]??"").padEnd(s[i])).join(" ");console.log(o)}return this},box(n,e){if(this.stop(),Be)return this;let t=e.split(`
|
|
655
655
|
`),s=Math.max(n.length,...t.map(o=>o.length)),r="\u2500".repeat(s+2);console.log(se.dim(`\u250C${r}\u2510`)),console.log(`${se.dim("\u2502")} ${se.bold(n.padEnd(s))} ${se.dim("\u2502")}`),console.log(se.dim(`\u251C${r}\u2524`));for(let o of t)console.log(`${se.dim("\u2502")} ${o.padEnd(s)} ${se.dim("\u2502")}`);return console.log(se.dim(`\u2514${r}\u2518`)),this},section(n){return this.stop(),Be?this:(console.log(`
|
|
656
|
-
${se.bold(n)}`),console.log(se.dim("\u2500".repeat(n.length))),this)},stop(){return Gs&&(clearInterval(Gs),Gs=null,
|
|
657
|
-
`),this)},progress(n,e,t){if(Be)return this;this.stop();let s=Math.round(n/e*100),r=Math.round(s/10),o=10-r,i=se.cyan("\u2588".repeat(r))+se.dim("\u2591".repeat(o)),a=t?` ${Gt(t,
|
|
658
|
-
`),this)}},g=
|
|
659
|
-
`));let i=[];if(n.generatedSkills?.generated&&n.generatedSkills.generated.length>0){let a=n.generatedSkills.generated.length,l=a===1?"skill":"skills";i.push(`${a} ${l} generated`)}if(n.context7&&i.push(`Context7: ${n.context7.verified?"verified":`not ready${n.context7.message?` (${n.context7.message})`:""}`}`),n.analysisSummary&&i.push(`Analysis: ${n.analysisSummary.patterns} patterns | ${n.analysisSummary.antiPatterns} anti-patterns (${n.analysisSummary.criticalAntiPatterns} critical)`),g.section("Generated"),g.list(i,{bullet:"\u2713"}),console.log(""),n.git.hasChanges&&(g.warn("Uncommitted changes detected"),console.log("")),n.verification){let a=n.verification;if(a.passed){let l=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);g.section("Verified"),g.list(l,{bullet:"\u2713"})}else{g.section("Verification");let l=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);g.list(l),a.skippedCount>0&&g.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Ws("sync"),{success:!0,data:n,metrics:{elapsed:t,fileCount:n.stats.fileCount}}}async function td(n){try{let e=await
|
|
656
|
+
${se.bold(n)}`),console.log(se.dim("\u2500".repeat(n.length))),this)},stop(){return Gs&&(clearInterval(Gs),Gs=null,kh()),this},step(n,e,t){if(Be)return this;this.stop();let s=se.dim(`[${n}/${e}]`);return process.stdout.isTTY?(Gs=setInterval(()=>{process.stdout.write(`\r${lt.cli.spin(ia++,`${s} ${Gt(t,it.STEP_MSG)}`)}`)},oa),this):(process.stdout.write(`${lt.cli.spin(0,`${s} ${Gt(t,it.STEP_MSG)}`)}
|
|
657
|
+
`),this)},progress(n,e,t){if(Be)return this;this.stop();let s=Math.round(n/e*100),r=Math.round(s/10),o=10-r,i=se.cyan("\u2588".repeat(r))+se.dim("\u2591".repeat(o)),a=t?` ${Gt(t,it.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(Gs=setInterval(()=>{process.stdout.write(`\r${lt.cli.spin(ia++,`[${i}] ${s}%${a}`)}`)},oa),this):(process.stdout.write(`${lt.cli.spin(0,`[${i}] ${s}%${a}`)}
|
|
658
|
+
`),this)}},g=vh});import bh from"node:path";async function ed(n,e){let t=Date.now()-e;await ye.installGlobalConfig(),g.done(`Synced ${n.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let s=n.stats.frameworks.length>0?` (${n.stats.frameworks[0]})`:"",r=n.syncMetrics?.indexes,o=[`${n.stats.fileCount} files indexed`,`Stack: ${n.stats.ecosystem}${s} | Branch: ${n.git.branch}`];if(r?.bm25Files){let a=r.bm25Files*(r.bm25AvgTokens||0);o.push(`Index: ${Vs(a)} tokens | ${r.bm25VocabSize||0} terms | ${r.importEdges||0} imports`)}g.box("Sync Summary",o.join(`
|
|
659
|
+
`));let i=[];if(n.generatedSkills?.generated&&n.generatedSkills.generated.length>0){let a=n.generatedSkills.generated.length,l=a===1?"skill":"skills";i.push(`${a} ${l} generated`)}if(n.context7&&i.push(`Context7: ${n.context7.verified?"verified":`not ready${n.context7.message?` (${n.context7.message})`:""}`}`),n.analysisSummary&&i.push(`Analysis: ${n.analysisSummary.patterns} patterns | ${n.analysisSummary.antiPatterns} anti-patterns (${n.analysisSummary.criticalAntiPatterns} critical)`),g.section("Generated"),g.list(i,{bullet:"\u2713"}),console.log(""),n.git.hasChanges&&(g.warn("Uncommitted changes detected"),console.log("")),n.verification){let a=n.verification;if(a.passed){let l=a.checks.map(u=>`${u.name} (${u.durationMs}ms)`);g.section("Verified"),g.list(l,{bullet:"\u2713"})}else{g.section("Verification");let l=a.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);g.list(l),a.skippedCount>0&&g.warn(`${a.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Ws("sync"),{success:!0,data:n,metrics:{elapsed:t,fileCount:n.stats.fileCount}}}async function td(n){try{let e=await He.getRecentEvents(n,100),t=new Date().toISOString().split("T")[0],s=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),r=null;if(s.length>=2){let u=s.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,m)=>d-m);if(u.length>=2){let d=u[u.length-1]-u[0];r=Tc(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 l=Array.from(a.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:r,tasksCompleted:o,featuresShipped:i,agentsUsed:l}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Vs(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:n.toLocaleString()}function aa(n){return n<1e3?`${Math.round(n)}ms`:`${(n/1e3).toFixed(1)}s`}function sd(n){if(n.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=n.map(r=>r.tokensSaved),s=Math.max(...t,1);return t.map(r=>{let o=Math.min(Math.floor(r/s*(e.length-1)),e.length-1);return e[o]}).join("")}function nd(n,e,t,s,r,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${s}_`),i.push(""),r){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),r.sessionDuration&&i.push(`| Duration | ${r.sessionDuration} |`),i.push(`| Tasks completed | ${r.tasksCompleted} |`),i.push(`| Features shipped | ${r.featuresShipped} |`),r.agentsUsed.length>0){let a=r.agentsUsed.slice(0,3).map(l=>`${l.name} (${l.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 | ${Vs(n.totalTokensSaved)} |`),i.push(`| Compression | ${(n.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${pr(n.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${n.syncCount} |`),i.push(`| Avg time | ${aa(n.avgSyncDuration)} |`),i.push(""),n.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let a=n.topAgents.reduce((l,u)=>l+u.usageCount,0);for(let l of n.topAgents){let u=a>0?(l.usageCount/a*100).toFixed(0):0;i.push(`| ${l.agentName} | ${u}% (${l.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${Vs(n.last30DaysTokens)}`),n.trend!==0){let a=n.trend>0?"+":"";i.push(`- Trend: ${a}${n.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
|
|
660
660
|
`)}function rd(n,e){let t=[];t.push(`# Repository Analysis
|
|
661
661
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
662
|
-
`);let s=
|
|
662
|
+
`);let s=bh.basename(e);if(t.push(`## Project: ${s}
|
|
663
663
|
`),t.push(`## Stack Detected
|
|
664
664
|
`),n.packageJson){let i=n.packageJson;if(t.push(`### JavaScript/TypeScript
|
|
665
665
|
`),t.push("- **Package Manager**: npm/yarn/pnpm"),i.dependencies){let a=Object.keys(i.dependencies);a.length>0&&t.push(`- **Dependencies**: ${a.slice(0,10).join(", ")}${a.length>10?` (+${a.length-10} more)`:""}`)}n.hasNextConfig&&t.push("- **Framework**: Next.js detected"),n.hasViteConfig&&t.push("- **Build Tool**: Vite detected"),n.hasTsconfig&&t.push("- **Language**: TypeScript"),t.push("")}n.cargoToml&&(t.push(`### Rust
|
|
@@ -675,8 +675,8 @@ ${se.bold(n)}`),console.log(se.dim("\u2500".repeat(n.length))),this)},stop(){ret
|
|
|
675
675
|
`).slice(0,5).forEach(a=>{if(a.trim()){let[l,,u,d]=a.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
676
676
|
`),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
|
|
677
677
|
`),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
|
|
678
|
-
`)}var od=v(()=>{"use strict";
|
|
679
|
-
`)}var ca,Jr,
|
|
678
|
+
`)}var od=v(()=>{"use strict";Rt();gr();cs();be();In();Re();c(ed,"showSyncResult");c(td,"getSessionActivity");c(Vs,"formatTokens");c(aa,"formatDuration");c(sd,"generateSparkline");c(nd,"generateStatsMarkdown");c(rd,"generateAnalysisSummary")});import Sh from"node:https";import id from"node:os";import _n from"node:path";import Vt from"chalk";function Eh(n,e){let t=`Update available! ${n} \u2192 ${e}`,s="npm install -g prjct-cli@latest",r=Math.max(t.length,`Run: ${s}`.length)+4,o=`\u250C${"\u2500".repeat(r)}\u2510`,i=`\u2514${"\u2500".repeat(r)}\u2518`,a=c(l=>`\u2502 ${l}${" ".repeat(r-l.length-2)}\u2502`,"pad");return["",Vt.yellow(o),Vt.yellow(a("")),Vt.yellow(`\u2502 ${Vt.bold(t)}${" ".repeat(r-t.length-2)}\u2502`),Vt.yellow(`\u2502 Run: ${Vt.cyan(s)}${" ".repeat(r-s.length-7)}\u2502`),Vt.yellow(a("")),Vt.yellow(i),""].join(`
|
|
679
|
+
`)}var ca,Jr,Th,UR,HR,la=v(()=>{"use strict";q();Y();st();ca=class{static{c(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=_n.join(id.homedir(),".prjct-cli","config"),this.cacheFile=_n.join(this.cacheDir,"update-cache.json"),this.checkInterval=24*60*60*1e3}async getCurrentVersion(){try{let e=_n.join(__dirname,"..","..","package.json");return(await pe(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"}},r=Sh.request(s,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});r.on("error",o=>{t(o)}),r.setTimeout(5e3,()=>{r.destroy(),t(new Error("Request timeout"))}),r.end()})}compareVersions(e,t){let s=e.split(".").map(Number),r=t.split(".").map(Number);for(let o=0;o<3;o++){let i=s[o]||0,a=r[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await S(this.cacheFile))return await pe(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 r=await this.getLatestVersion();return await this.writeCache({lastCheck:s,latestVersion:r}),{updateAvailable:this.compareVersions(r,e)>0,currentVersion:e,latestVersion:r}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:Eh(e.currentVersion,e.latestVersion)}},Jr=ca,Th=_n.join(id.homedir(),".prjct-cli","config"),UR=_n.join(Th,"update-cache.json"),HR=24*60*60*1e3;c(Eh,"formatUpdateBanner")});import ad from"node:path";async function Rh(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let n=process.cwd();if(await S(ad.join(n,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await S(ad.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Ah(){return{...Ch}}function jh(){return{...Ph}}async function cd(){return qr||(qr=await Rh()?Ah():jh(),qr)}var qr,Ch,Ph,ld=v(()=>{"use strict";Y();qr=null,Ch={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}},Ph={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}};c(Rh,"isClaudeEnvironment");c(Ah,"getClaudeAgent");c(jh,"getTerminalAgent");c(cd,"detect")});import zr from"node:fs/promises";var ua,ud,dd=v(()=>{"use strict";q();Y();ua=class{static{c(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 zr.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 zr.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 zr.readdir(e)}async fileExists(e){return S(e)}async createDirectory(e){await zr.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
680
680
|
${e.map((t,s)=>`${s+1}. ${t}`).join(`
|
|
681
681
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
682
682
|
|
|
@@ -721,17 +721,17 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
|
|
|
721
721
|
|
|
722
722
|
Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
|
|
723
723
|
|
|
724
|
-
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}}},ud=ua});function md(n){if(!n||typeof n!="object")return!1;let e=n;if(e.code
|
|
725
|
-
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let r=L.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return r.id}getWorkflow(e,t){let s=L.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 L.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),L.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 L.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}}},De=new fa});function ya(n){let e=n.trust_source==="imported"?"imported":"local";return{id:n.id,type:n.type,command:n.command,position:n.position,action:n.action,description:n.description,enabled:n.enabled===1,timeoutMs:n.timeout_ms,createdAt:n.created_at,sortOrder:n.sort_order,whenExpr:n.when_expr??null,parallel:n.parallel===null?!0:n.parallel===1,trustSource:e}}var wa,Q,ds=v(()=>{"use strict";ha();
|
|
726
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r,t.whenExpr??null,t.parallel===!1?0:1,t.trustSource??"local"),A.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(A.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!A.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:c(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:c(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},i=[],a=[];for(let[l,u]of Object.entries(s)){let d=o[l];if(!d)continue;i.push(`${d.column} = ?`);let m=u;a.push(d.transform?d.transform(m):m)}return i.length===0||(a.push(t),A.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=A.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?ya(s):null}getRulesForCommand(e,t){let s=De.getWorkflow(e,t);return!s||!s.enabled?[]:A.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(ya)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(ya)}resetRules(e){let t=A.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return A.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Q=new wa});import Ne from"node:path";async function
|
|
727
|
-
`);ne.note(e,"Configuration Summary");let t=await ne.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ne.isCancel(t)||!t?(ne.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let r=t.join(this.projectPath,"package.json"),o=await e.readFile(r,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:path"),t=await import("node:os"),s=[];await Nt(e.join(t.homedir(),".claude"))&&s.push("claude"),await S(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await S(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await S(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await Nt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:r}=await Promise.resolve().then(()=>(Me(),jo));await r("which codex"),s.push("codex")}catch{await Nt(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 r=await e.readdir(this.projectPath);if(r.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),l={...a.dependencies,...a.devDependencies};s.language=l.typescript?"TypeScript":"JavaScript",l.next?s.framework="Next.js":l.nuxt?s.framework="Nuxt":l.react?s.framework="React":l.vue?s.framework="Vue":l["@angular/core"]?s.framework="Angular":l.express?s.framework="Express":l.hono?s.framework="Hono":l.fastify?s.framework="Fastify":(l.nestjs||l["@nestjs/core"])&&(s.framework="NestJS"),l.bun||l["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",r.includes("bun.lockb")?s.packageManager="Bun":r.includes("pnpm-lock.yaml")?s.packageManager="pnpm":r.includes("yarn.lock")?s.packageManager="Yarn":r.includes("package-lock.json")&&(s.packageManager="npm"),(l.prisma||l["@prisma/client"])&&s.technologies.push("Prisma"),(l.drizzle||l["drizzle-orm"])&&s.technologies.push("Drizzle"),l.tailwindcss&&s.technologies.push("Tailwind CSS"),l.zod&&s.technologies.push("Zod"),(l.trpc||l["@trpc/server"])&&s.technologies.push("tRPC")}else r.includes("pyproject.toml")||r.includes("requirements.txt")?s.language="Python":r.includes("go.mod")?s.language="Go":r.includes("Cargo.toml")?s.language="Rust":(r.includes("pom.xml")||r.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,ne.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Qr.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return vd.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}}});function Sd(n){return ps[n]??null}var ps,va,ba=v(()=>{"use strict";ps={code:{name:"code",description:"Coding work: features, bugs, refactors, TDD, shipping.",suggestedPersona:{role:"DEV",mcps:["github"]},memoryTypes:["fact","decision","learning","gotcha","pattern","anti-pattern","shipped"],workflowSlots:{ship:{description:"Publish finished work \u2014 tests, commit, push, PR."},review:{description:"Pre-commit or pre-PR review pass."}},hookSignals:[],suggestedTags:{domain:["auth","api","frontend","infra","data"]}},daily:{name:"daily",description:"Day-to-day capture + review. GTD-style inbox + weekly review.",memoryTypes:["inbox","todo","idea"],workflowSlots:{morning:{description:"Morning briefing \u2014 pull open todos + upcoming commitments."},clarify:{description:"Reclassify inbox entries to real memory types."},review:{description:"Weekly/biweekly review across memory."}},hookSignals:[]},pm:{name:"pm",description:"Product Management: specs, user interviews, roadmap, backlog triage.",suggestedPersona:{role:"PM",mcps:["linear","posthog"]},memoryTypes:["insight","question","stakeholder","decision","source"],workflowSlots:{spec:{description:"Draft a technical/product spec from captured insights."},triage:{description:"Review Linear backlog and prioritize."},interview:{description:"User interview pre-brief + post-synthesis."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"spec|requirements?|prd",inject:["type=insight","type=question"]}],suggestedTags:{audience:["team","stakeholders"],quarter:["q1","q2","q3","q4"]}},founder:{name:"founder",description:"Founder ops: strategy, fundraising, hiring, stakeholder comms.",suggestedPersona:{role:"Founder",mcps:["gmail","linear","posthog"]},memoryTypes:["goal","okr","person","stakeholder","decision","shipped"],workflowSlots:{"investor-update":{description:"Monthly investor update draft."},"1on1":{description:"1:1 prep + synthesis."},strategy:{description:"Strategy checkpoint \u2014 OKR progress + pivots."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"investor|board|update|fundrais",inject:["type=okr","type=shipped","type=stakeholder"]}],suggestedTags:{audience:["board","investors","team"]}},research:{name:"research",description:"Research: deep-dives, literature review, competitive scans.",suggestedPersona:{role:"Research",mcps:["web"]},memoryTypes:["source","claim","question","insight"],workflowSlots:{"lit-review":{description:"Literature review across captured sources."},analyze:{description:"Data analysis run via MCP, persist findings."}},hookSignals:[],suggestedTags:{confidence:["high","medium","low"]}}},va=Object.keys(ps);c(Sd,"getPackManifest")});var Td={};Ee(Td,{activatePacks:()=>Ta,deactivatePacks:()=>Ea,detectSuggestedPacks:()=>Sa,listActivePacks:()=>Ca});async function Sa(n){let e=await import("node:fs/promises"),t=await import("node:path"),s=new Set(["daily"]),r=["package.json","go.mod","Cargo.toml","pyproject.toml","Gemfile","pom.xml","build.gradle"];for(let o of r)try{await e.stat(t.join(n,o)),s.add("code");break}catch{}return[...s]}async function Ta(n,e,t={}){let s=[],r=[],o=await $.readConfig(n);if(!o)throw new Error("No prjct project here \u2014 run `prjct init` first.");let i=o.persona??{role:"DEV"},a=new Set(i.packs??[]);for(let m of e){if(!ps[m]){r.push(m);continue}a.has(m)||(a.add(m),s.push(m))}let l=[...a],u={...i,packs:l};t.suggestPersona&&s.length>0&&
|
|
724
|
+
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}}},ud=ua});function md(n){if(!n||typeof n!="object")return!1;let e=n;if(e.code&&$h.has(e.code))return!0;if(e.code&&gd.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 Dh(n){if(!n||typeof n!="object")return!1;let e=n;return!!(e.code&&gd.has(e.code))}function pd(n,e,t){let s=Bt.get(n);return s&&s.consecutiveFailures>=e&&s.openedAt?Date.now()-s.openedAt>=t?(Bt.delete(n),!1):!0:!1}function da(n,e){let t=Bt.get(n)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),Bt.set(n,t)}function Ih(n){Bt.delete(n)}var $h,gd,Bt,Xr,fd,QR,hd=v(()=>{"use strict";$h=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),gd=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);c(md,"isTransientError");c(Dh,"isPermanentError");Bt=new Map;c(pd,"isCircuitOpen");c(da,"recordFailure");c(Ih,"recordSuccess");Xr=class{static{c(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(pd(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let s,r=0;for(;r<this.options.maxAttempts;)try{let o=await e();return Ih(t),o}catch(o){if(s=o,r++,Dh(o))throw da(t,this.options.circuitBreakerThreshold),o;if(!(md(o)&&r<this.options.maxAttempts))throw da(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(r-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,a))}throw da(t,this.options.circuitBreakerThreshold),s}isTransientError(e){return md(e)}isCircuitOpen(e){return pd(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return Bt.get(e)}resetCircuit(e){Bt.delete(e)}resetAllCircuits(){Bt.clear()}},fd=new Xr({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),QR=new Xr({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var _h,ma,Kr,yd=v(()=>{"use strict";It();ld();dd();hd();_h=["claude"],ma=class{static{c(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await fd.execute(async()=>{if(this.agentInfo=await cd(),!this.agentInfo?.isSupported)throw wn.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!_h.includes(e))throw wn.notSupported(this.agentInfo?.type??"unknown");return this.agent=new ud,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Kr=new ma});var pa,ga,wd=v(()=>{"use strict";pa=class{static{c(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},ga=new pa});var fa,De,ha=v(()=>{"use strict";he();fa=class{static{c(this,"CustomWorkflowStorage")}createWorkflow(e,t){let s=new Date().toISOString();L.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
725
|
+
VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,s,s,t.metadata?JSON.stringify(t.metadata):null);let r=L.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!r)throw new Error(`Failed to create workflow: ${t.name}`);return r.id}getWorkflow(e,t){let s=L.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 L.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),L.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 L.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}}},De=new fa});function ya(n){let e=n.trust_source==="imported"?"imported":"local";return{id:n.id,type:n.type,command:n.command,position:n.position,action:n.action,description:n.description,enabled:n.enabled===1,timeoutMs:n.timeout_ms,createdAt:n.created_at,sortOrder:n.sort_order,whenExpr:n.when_expr??null,parallel:n.parallel===null?!0:n.parallel===1,trustSource:e}}var wa,Q,ds=v(()=>{"use strict";ha();he();c(ya,"rowToRule");wa=class{static{c(this,"WorkflowRuleStorage")}addRule(e,t){let s=A.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),r=t.sortOrder||(s?.m??-1)+1;return A.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
|
|
726
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,r,t.whenExpr??null,t.parallel===!1?0:1,t.trustSource??"local"),A.get(e,"SELECT last_insert_rowid() as id")?.id??0}removeRule(e,t){return A.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(A.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),!0):!1}updateRule(e,t,s){if(!A.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:c(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:c(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},i=[],a=[];for(let[l,u]of Object.entries(s)){let d=o[l];if(!d)continue;i.push(`${d.column} = ?`);let m=u;a.push(d.transform?d.transform(m):m)}return i.length===0||(a.push(t),A.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...a)),!0}getRuleById(e,t){let s=A.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return s?ya(s):null}getRulesForCommand(e,t){let s=De.getWorkflow(e,t);return!s||!s.enabled?[]:A.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(ya)}getAllRules(e){return A.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(ya)}resetRules(e){let t=A.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return A.run(e,"DELETE FROM workflow_rules"),t?.c??0}},Q=new wa});import Ne from"node:path";async function Nh(n,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await S(Ne.join(n,"pnpm-lock.yaml"))?"pnpm":await S(Ne.join(n,"yarn.lock"))?"yarn":await S(Ne.join(n,"bun.lockb"))||await S(Ne.join(n,"bun.lock"))?"bun":(await S(Ne.join(n,"package-lock.json")),"npm")}function kd(n,e){return n==="yarn"?`yarn ${e}`:n==="pnpm"?`pnpm run ${e}`:n==="bun"?`bun run ${e}`:`npm run ${e}`}function Mh(n){return n==="yarn"?"yarn test":n==="pnpm"?"pnpm test":n==="bun"?"bun test":"npm test"}async function Bs(n,e){for(let r of Oh)if(await S(Ne.join(n,r)))return r;let s=(e??await Mt(n)).find(r=>r.endsWith(Lh));if(s)return s}async function jt(n){for(let e of Fh)if(await S(Ne.join(n,e)))return e}async function Yr(n){let e=Ne.join(n,"package.json"),t=await pe(e,null);if(t){let a=await Nh(n,t),l=t.scripts||{},u={stack:"js",packageManager:a};return l.lint&&(u.lint={tool:a,command:kd(a,"lint")}),l.typecheck&&(u.typecheck={tool:a,command:kd(a,"typecheck")}),l.test&&(u.test={tool:a,command:Mh(a)}),u.versionFile=await Bs(n),u.changelogFile=await jt(n),u}if(await S(Ne.join(n,"pytest.ini"))){let a=await Bs(n),l=await jt(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}let s=await Xe(Ne.join(n,"pyproject.toml"),"");if(s.includes("[tool.pytest")||s.includes("pytest")){let a=await Bs(n),l=await jt(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}if(await S(Ne.join(n,"Cargo.toml"))){let a=await jt(n);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await S(Ne.join(n,"go.mod"))){let a=await Bs(n),l=await jt(n);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:l}}let r=await Mt(n);if(r.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await Bs(n,r),l=await jt(n);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:l}}if(await S(Ne.join(n,"pom.xml"))){let a=await jt(n);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await S(Ne.join(n,"gradlew"))&&(await S(Ne.join(n,"build.gradle"))||await S(Ne.join(n,"build.gradle.kts")))){let a=await jt(n);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await Bs(n),i=await jt(n);return{stack:"unknown",versionFile:o,changelogFile:i}}var Oh,Lh,Fh,ka=v(()=>{"use strict";Y();c(Nh,"detectPackageManager");c(kd,"pmRun");c(Mh,"pmTest");Oh=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Lh=".csproj",Fh=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];c(Bs,"detectVersionFile");c(jt,"detectChangelogFile");c(Yr,"detectProjectCommands")});import*as ne from"@clack/prompts";import ms from"chalk";var Qr,vd,Nn,bd=v(()=>{"use strict";Y();Re();Qr=[{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."}],vd=[{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"}],Nn=class{static{c(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(){ne.intro(ms.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:c(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:c(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:c(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:c(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:c(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return ne.outro(ms.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){g.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,g.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await this.detectProjectType();let e=Qr.findIndex(s=>s.value===this.detectedType),t=await ne.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Qr.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValue:e>=0?Qr[e].value:void 0});return ne.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await this.detectInstalledAgents(),t=await ne.multiselect({message:"Which AI agents do you use?",options:vd.map(s=>({label:s.title,hint:s.description,value:s.value})),initialValues:e,required:!0});return ne.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);ne.note(e,"Detected stack");let t=await ne.confirm({message:"Is this stack correct?",initialValue:!0});if(ne.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let s=await ne.group({language:c(()=>ne.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:c(()=>ne.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:c(()=>{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 ne.group({verbosity:c(()=>ne.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:c(()=>ne.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:c(()=>{this.handleCancel()},"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${ms.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${ms.cyan("AI Agents:")} ${this.selectedAgents.map(s=>this.getAgentLabel(s)).join(", ")}`,`${ms.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${ms.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${ms.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
727
|
+
`);ne.note(e,"Configuration Summary");let t=await ne.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ne.isCancel(t)||!t?(ne.isCancel(t)&&this.handleCancel(),!1):!0}async detectProjectType(){let e=await import("node:fs/promises"),t=await import("node:path");try{let s=await e.readdir(this.projectPath);if(s.includes("turbo.json")||s.includes("lerna.json")||s.includes("nx.json"))return"monorepo";if(s.includes("package.json")){let r=t.join(this.projectPath,"package.json"),o=await e.readFile(r,"utf-8"),i=JSON.parse(o),a={...i.dependencies,...i.devDependencies};if(i.bin)return"cli-tool";if(i.main&&!a.react&&!a.vue&&!a.angular&&!a.express&&!a.hono)return"library";if((a.react||a.vue)&&(a.express||a.hono||a.fastify))return"fullstack";if(a.react||a.vue||a["@angular/core"]||a.next||a.nuxt)return"web-app";if(a.express||a.hono||a.fastify||a.koa||a.nestjs)return"api-backend"}return s.includes("pyproject.toml")||s.includes("setup.py")?s.some(o=>["main.py","app.py","server.py"].includes(o))?"api-backend":"library":s.includes("go.mod")?s.includes("main.go")?"cli-tool":"library":s.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async detectInstalledAgents(){let e=await import("node:path"),t=await import("node:os"),s=[];await Nt(e.join(t.homedir(),".claude"))&&s.push("claude"),await S(e.join(this.projectPath,".cursorrules"))&&s.push("cursor"),await S(e.join(this.projectPath,".windsurfrules"))&&s.push("windsurf"),await S(e.join(this.projectPath,".github","copilot-instructions.md"))&&s.push("copilot"),await Nt(e.join(t.homedir(),".gemini"))&&s.push("gemini");try{let{execAsync:r}=await Promise.resolve().then(()=>(Me(),jo));await r("which codex"),s.push("codex")}catch{await Nt(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 r=await e.readdir(this.projectPath);if(r.includes("package.json")){let o=t.join(this.projectPath,"package.json"),i=await e.readFile(o,"utf-8"),a=JSON.parse(i),l={...a.dependencies,...a.devDependencies};s.language=l.typescript?"TypeScript":"JavaScript",l.next?s.framework="Next.js":l.nuxt?s.framework="Nuxt":l.react?s.framework="React":l.vue?s.framework="Vue":l["@angular/core"]?s.framework="Angular":l.express?s.framework="Express":l.hono?s.framework="Hono":l.fastify?s.framework="Fastify":(l.nestjs||l["@nestjs/core"])&&(s.framework="NestJS"),l.bun||l["@types/bun"]||a.engines?.bun?s.runtime="Bun":s.runtime="Node.js",r.includes("bun.lockb")?s.packageManager="Bun":r.includes("pnpm-lock.yaml")?s.packageManager="pnpm":r.includes("yarn.lock")?s.packageManager="Yarn":r.includes("package-lock.json")&&(s.packageManager="npm"),(l.prisma||l["@prisma/client"])&&s.technologies.push("Prisma"),(l.drizzle||l["drizzle-orm"])&&s.technologies.push("Drizzle"),l.tailwindcss&&s.technologies.push("Tailwind CSS"),l.zod&&s.technologies.push("Zod"),(l.trpc||l["@trpc/server"])&&s.technologies.push("tRPC")}else r.includes("pyproject.toml")||r.includes("requirements.txt")?s.language="Python":r.includes("go.mod")?s.language="Go":r.includes("Cargo.toml")?s.language="Rust":(r.includes("pom.xml")||r.includes("build.gradle"))&&(s.language="Java");return s}catch{return s}}handleCancel(){this.aborted=!0,ne.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Qr.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return vd.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}}});function Sd(n){return ps[n]??null}var ps,va,ba=v(()=>{"use strict";ps={code:{name:"code",description:"Coding work: features, bugs, refactors, TDD, shipping.",suggestedPersona:{role:"DEV",mcps:["github"]},memoryTypes:["fact","decision","learning","gotcha","pattern","anti-pattern","shipped"],workflowSlots:{ship:{description:"Publish finished work \u2014 tests, commit, push, PR."},review:{description:"Pre-commit or pre-PR review pass."}},hookSignals:[],suggestedTags:{domain:["auth","api","frontend","infra","data"]}},daily:{name:"daily",description:"Day-to-day capture + review. GTD-style inbox + weekly review.",memoryTypes:["inbox","todo","idea"],workflowSlots:{morning:{description:"Morning briefing \u2014 pull open todos + upcoming commitments."},clarify:{description:"Reclassify inbox entries to real memory types."},review:{description:"Weekly/biweekly review across memory."}},hookSignals:[]},pm:{name:"pm",description:"Product Management: specs, user interviews, roadmap, backlog triage.",suggestedPersona:{role:"PM",mcps:["linear","posthog"]},memoryTypes:["insight","question","stakeholder","decision","source"],workflowSlots:{spec:{description:"Draft a technical/product spec from captured insights."},triage:{description:"Review Linear backlog and prioritize."},interview:{description:"User interview pre-brief + post-synthesis."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"spec|requirements?|prd",inject:["type=insight","type=question"]}],suggestedTags:{audience:["team","stakeholders"],quarter:["q1","q2","q3","q4"]}},founder:{name:"founder",description:"Founder ops: strategy, fundraising, hiring, stakeholder comms.",suggestedPersona:{role:"Founder",mcps:["gmail","linear","posthog"]},memoryTypes:["goal","okr","person","stakeholder","decision","shipped"],workflowSlots:{"investor-update":{description:"Monthly investor update draft."},"1on1":{description:"1:1 prep + synthesis."},strategy:{description:"Strategy checkpoint \u2014 OKR progress + pivots."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"investor|board|update|fundrais",inject:["type=okr","type=shipped","type=stakeholder"]}],suggestedTags:{audience:["board","investors","team"]}},research:{name:"research",description:"Research: deep-dives, literature review, competitive scans.",suggestedPersona:{role:"Research",mcps:["web"]},memoryTypes:["source","claim","question","insight"],workflowSlots:{"lit-review":{description:"Literature review across captured sources."},analyze:{description:"Data analysis run via MCP, persist findings."}},hookSignals:[],suggestedTags:{confidence:["high","medium","low"]}}},va=Object.keys(ps);c(Sd,"getPackManifest")});var Td={};Ee(Td,{activatePacks:()=>Ta,deactivatePacks:()=>Ea,detectSuggestedPacks:()=>Sa,listActivePacks:()=>Ca});async function Sa(n){let e=await import("node:fs/promises"),t=await import("node:path"),s=new Set(["daily"]),r=["package.json","go.mod","Cargo.toml","pyproject.toml","Gemfile","pom.xml","build.gradle"];for(let o of r)try{await e.stat(t.join(n,o)),s.add("code");break}catch{}return[...s]}async function Ta(n,e,t={}){let s=[],r=[],o=await $.readConfig(n);if(!o)throw new Error("No prjct project here \u2014 run `prjct init` first.");let i=o.persona??{role:"DEV"},a=new Set(i.packs??[]);for(let m of e){if(!ps[m]){r.push(m);continue}a.has(m)||(a.add(m),s.push(m))}let l=[...a],u={...i,packs:l};t.suggestPersona&&s.length>0&&Uh(u,s);let d={...o,persona:u};return await $.writeConfig(n,d),{activated:s,skipped:r}}async function Ea(n,e){let t=await $.readConfig(n);if(!t)throw new Error("No prjct project here \u2014 run `prjct init` first.");let s=t.persona??{role:"DEV"},r=new Set(s.packs??[]),o=[],i=[];for(let u of e)r.delete(u)?o.push(u):i.push(u);let a={...s,packs:[...r]},l={...t,persona:a};return await $.writeConfig(n,l),{deactivated:o,notActive:i}}async function Ca(n){let t=(await $.readConfig(n))?.persona?.packs??[],s=[];for(let r of t){let o=ps[r];o&&s.push({name:o.name,description:o.description,memoryTypes:o.memoryTypes,slots:Object.keys(o.workflowSlots)})}return s}function Uh(n,e){let t=n.role&&n.role!=="DEV",s=n.mcps&&n.mcps.length>0;for(let r of e){let o=Sd(r);if(o?.suggestedPersona&&(!t&&o.suggestedPersona.role&&(n.role=o.suggestedPersona.role),!n.focus&&o.suggestedPersona.focus&&(n.focus=o.suggestedPersona.focus),!s&&o.suggestedPersona.mcps&&(n.mcps=[...o.suggestedPersona.mcps]),n.role&&n.role!=="DEV"))break}}var Pa=v(()=>{"use strict";Ce();ba();c(Sa,"detectSuggestedPacks");c(Ta,"activatePacks");c(Ea,"deactivatePacks");c(Ca,"listActivePacks");c(Uh,"applyPersonaSuggestion")});var Ed,Ra,Aa,Cd,Js,Zr=v(()=>{"use strict";Ed="memory.",Ra="remember.",Aa=`${Ed}${Ra}`,Cd=`${Ed}task.tagged`,Js="status.changed"});import Pd from"node:path";var Hh,Wh,eo,Rd=v(()=>{"use strict";be();Y();Hh=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],Wh=`# Changelog
|
|
728
728
|
|
|
729
729
|
All notable changes to this project will be documented in this file.
|
|
730
730
|
|
|
731
731
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
732
732
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
733
|
-
`,eo=class{static{c(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of
|
|
734
|
-
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await
|
|
733
|
+
`,eo=class{static{c(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let s of Hh){let r=Pd.join(this.projectPath,s);if(await S(r)){let o=await Xe(r),i=this.detectFormat(o);return{filePath:r,fileName:s,format:i,created:!1}}}let e="CHANGELOG.md",t=Pd.join(this.projectPath,e);return await _t(t,`${Wh}
|
|
734
|
+
`),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),s=await Xe(t.filePath),r=e.date||bc(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(s,e,r):o=this.insertMarkdownEntry(s,e,r),await _t(t.filePath,o)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,s){let r=this.formatKeepAChangelogEntry(t,s),o=e.search(/^## /m);if(o!==-1){let i=e.slice(0,o),a=e.slice(o);return`${i+r}
|
|
735
735
|
${a}`}return`${e.trimEnd()}
|
|
736
736
|
|
|
737
737
|
${r}`}insertMarkdownEntry(e,t,s){let r=this.formatMarkdownEntry(t,s),o=e.indexOf(`
|
|
@@ -741,33 +741,33 @@ ${a}`}return`${r}
|
|
|
741
741
|
|
|
742
742
|
${e}`}formatKeepAChangelogEntry(e,t){let s=[`## [${e.version}] - ${t}`];if(s.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){s.push(`### ${r}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push("### Added"),s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
743
743
|
`)}formatMarkdownEntry(e,t){let s=[`## ${e.version} - ${t}`];if(s.push(""),e.sections)for(let[r,o]of Object.entries(e.sections)){s.push(`### ${r}`);for(let i of o)s.push(`- ${i}`);s.push("")}else e.description&&(s.push(`- ${e.description}`),s.push(""));return s.join(`
|
|
744
|
-
`)}}});import qs from"node:path";function Ad(n){return/^\d+\.\d+\.\d+/.test(n)}function zs(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return n;let[,t,s,r,o]=e;if(o){let i=o.split("."),a=i.length-1;return/^\d+$/.test(i[a])?(i[a]=String(Number(i[a])+1),`${t}.${s}.${r}-${i.join(".")}`):`${t}.${s}.${r}-${o}.1`}return`${t}.${s}.${Number(r)+1}`}function
|
|
744
|
+
`)}}});import qs from"node:path";function Ad(n){return/^\d+\.\d+\.\d+/.test(n)}function zs(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return n;let[,t,s,r,o]=e;if(o){let i=o.split("."),a=i.length-1;return/^\d+$/.test(i[a])?(i[a]=String(Number(i[a])+1),`${t}.${s}.${r}-${i.join(".")}`):`${t}.${s}.${r}-${o}.1`}return`${t}.${s}.${Number(r)+1}`}function Gh(n){let e=n.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Vh(n){let e=n.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let s=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}let t=n.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let s=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(s)return s[1]}return null}function Bh(n){return n.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var to,jd=v(()=>{"use strict";Me();Y();to=class{static{c(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=qs.join(this.projectPath,"package.json"),t=await pe(e,null);return t?.version?{current:t.version,next:zs(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=qs.join(this.projectPath,"Cargo.toml"),t=await Xe(e,"");if(!t)return null;let s=Gh(t);return s?{current:s,next:zs(s),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=qs.join(this.projectPath,"pyproject.toml"),t=await Xe(e,"");if(!t)return null;let s=Vh(t);return s?{current:s,next:zs(s),file:e,format:"toml"}:null}async fromCsproj(){let e=await Mt(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=qs.join(this.projectPath,e[0]),s=await Xe(t,"");if(!s)return null;let r=Bh(s);return r?{current:r,next:zs(r),file:t,format:"xml"}:null}async fromVersionFile(e){let t=qs.join(this.projectPath,e),s=await Xe(t,"");if(!s)return null;let r=s.trim();return Ad(r)?{current:r,next:zs(r),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await _("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
|
|
745
745
|
`);for(let s of t){let r=s.trim().replace(/^v/,"");if(Ad(r))return{current:r,next:zs(r),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=qs.join(this.projectPath,"VERSION");return await _t(e,`0.1.0
|
|
746
|
-
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await
|
|
747
|
-
`);break}}async writeJsonVersion(e,t){let s=await
|
|
746
|
+
`),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await Et("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 _t(e.file,`${e.next}
|
|
747
|
+
`);break}}async writeJsonVersion(e,t){let s=await pe(e,{});s&&(s.version=t,await ce(e,s))}async writeTomlVersion(e,t){let s=await Xe(e,"");if(!s)return;let r=s.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await _t(e,r)}async writeXmlVersion(e,t){let s=await Xe(e,"");if(!s)return;let r=s.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await _t(e,r)}};c(Ad,"isSemver");c(zs,"bumpPatch");c(Gh,"parseTomlVersion");c(Vh,"parsePyprojectVersion");c(Bh,"parseCsprojVersion")});async function so(n){try{let{stdout:e}=await _("git branch --show-current",{cwd:n});return e.trim()||void 0}catch{return}}var ja=v(()=>{"use strict";Me();c(so,"getGitBranch")});function Jh(n){let e=n.split(/\s+/).map(s=>s.trim()).filter(Boolean),t=[];for(let s of e){let r=s.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(r){t.push({kind:"tags",key:r[1],op:r[2],value:r[3]});continue}let o=s.match(/^branch([=~])(.+)$/);if(o){t.push({kind:"branch",op:o[1],value:o[2]});continue}let i=s.match(/^files:(.+)$/);i&&t.push({kind:"files",op:"~",value:i[1]})}return t}function qh(n){let e=xd.get(n);if(e)return e;let t="";for(let r=0;r<n.length;r++){let o=n[r];o==="*"?n[r+1]==="*"?(t+=".*",r++):t+="[^/]*":/[.+^${}()|[\]\\]/.test(o)?t+=`\\${o}`:t+=o}let s=new RegExp(`^${t}$`);return xd.set(n,s),s}function zh(n,e){if(n.kind==="tags"){let t=e.tags[n.key??""]??"";return n.op==="="?t===n.value:t.toLowerCase().includes(n.value.toLowerCase())}if(n.kind==="branch")return n.op==="="?e.branch===n.value:e.branch.toLowerCase().includes(n.value.toLowerCase());if(n.kind==="files"){let t=qh(n.value);return e.filesChanged.some(s=>t.test(s))}return!0}function $d(n,e){if(!n||!n.trim())return!0;let t=Jh(n);return t.length===0?!0:t.every(s=>zh(s,e))}var xd,Dd=v(()=>{"use strict";c(Jh,"parseWhen");xd=new Map;c(qh,"globToRegex");c(zh,"matchCondition");c($d,"evaluateWhen")});import{execSync as Xh}from"node:child_process";import Kh from"node:fs/promises";import xa from"node:path";import Je from"chalk";async function ey(n,e,t){let s=await F.getCurrentTask(n);if(!s)throw new Error(`Cannot transition to '${t}': no active task`);await He.log(e,Js,{taskId:s.id,from:s.type??null,to:t,source:"workflow"})}async function ty(n,e){if(n.trustSource==="imported")throw new Error(`Refusing to run imported rule without approval: ${n.description||n.action}. Re-create the rule locally if you trust it.`);await _(n.action,{timeout:n.timeoutMs,cwd:e,env:{...process.env}})}async function sy(n,e,t){if(n.trustSource==="imported")throw new Error(`Refusing to run imported script rule without approval: ${n.description||n.action}.`);let s=n.action.slice(Nd.length).trim();if(!s)throw new Error(`Empty script path in action '${n.action}'`);let r=xa.resolve(e,".prjct/workflows",s),o=xa.resolve(e,".prjct/workflows");if(!r.startsWith(`${o}${xa.sep}`)&&r!==o)throw new Error(`Script path escapes workflows dir: ${s}`);try{await Kh.access(r)}catch{throw new Error(`Script not found: .prjct/workflows/${s}`)}await _(`bash ${JSON.stringify(r)}`,{timeout:n.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:t.branch,PRJCT_FILES_CHANGED:t.filesChanged.join(","),PRJCT_TAGS:Object.entries(t.tags).map(([i,a])=>`${i}=${a}`).join(",")}})}function ny(n){let e=n.action.slice(Md.length).trim(),t=e.indexOf(":");if(t===-1)return`Call MCP tool ${JSON.stringify(e)} (server unspecified \u2014 re-author rule with format \`mcp:<server>:<tool>[:<args>]\`).`;let s=e.slice(0,t),r=e.slice(t+1),o=r.indexOf(":"),i=o===-1?r:r.slice(0,o),a=o===-1?"":r.slice(o+1),l=n.description?` (${n.description})`:"";return a?`Call MCP \`${s}.${i}\` with args ${a}${l}.`:`Call MCP \`${s}.${i}\`${l}.`}async function ry(n){try{let{default:e}=await Promise.resolve().then(()=>(Ce(),mr)),s=(await e.readConfig(n))?.persona;if(!s)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let r=[`You are **${s.role}** in this project.`];return s.focus&&r.push(`Focus: ${s.focus}.`),s.mcps&&s.mcps.length>0&&r.push(`MCPs available: ${s.mcps.join(", ")}.`),s.packs&&s.packs.length>0&&r.push(`Active packs: ${s.packs.join(", ")}.`),r.join(" ")}catch(e){return`Could not resolve persona: ${y(e)}`}}async function oy(n,e){let s=await new to(n).bump();e.version=s}async function iy(n,e){let t=typeof e.version=="string"?e.version:null,s=typeof e.feature=="string"?e.feature:null;if(!t)throw new Error("changelog:add requires a prior version:bump step (no version in runContext)");if(!s)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new eo(n).addFeature(t,s)}function ay(n,e){return n.replace(/\$([A-Z_]+)/g,(t,s)=>{let r=s.toLowerCase(),o=e[r];return typeof o=="string"?o:""})}async function cy(n,e,t){let r=n.slice(Da.length).replace(/^:/,"").trim()||(t.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),o=`${ay(r,t)}
|
|
748
748
|
|
|
749
|
-
Generated with [p/](https://www.prjct.app/)`;await
|
|
750
|
-
`).map(i=>i.trim()).filter(Boolean)}catch{return[]}},"runDiff"),[s,r]=await Promise.all([t("git diff --cached --name-only"),t("git diff --name-only")]);return[...new Set([...s,...r])]}async function
|
|
751
|
-
${Je.dim(`[gate] ${t}-${e}: ${C.action}`)}`);try{let R=Date.now();await $a(C,n,l,d,r,o);let
|
|
749
|
+
Generated with [p/](https://www.prjct.app/)`;await Et("git",["add","."],{cwd:e}),await Et("git",["commit","-m",o],{cwd:e})}async function ly(n){await Et("git",["push"],{cwd:n})}async function $a(n,e,t,s,r,o){let i=n.action;if(i.startsWith(Id)){let a=i.slice(Id.length).trim();if(!a)throw new Error(`Empty status target in action '${i}'`);await ey(e,t,a);return}if(i.startsWith(Nd)){await sy(n,t,s);return}if(i.startsWith(Md)){r.instructions.push(ny(n));return}if(i===Yh){r.instructions.push(await ry(t));return}if(i===_d||i.startsWith(`${_d}:`)){await oy(t,o);return}if(i===Qh){await iy(t,o);return}if(i===Da||i.startsWith(`${Da}:`)){await cy(i,t,o);return}if(i===Zh){await ly(t);return}await ty(n,t)}async function uy(n,e){let[t,s,r]=await Promise.all([dy(e),my(e),py(n)]);return{branch:t,filesChanged:s,tags:r}}async function dy(n){try{return await so(n)||""}catch{return""}}async function my(n){let e={cwd:n,encoding:"utf-8"},t=c(async o=>{try{return Xh(o,e).split(`
|
|
750
|
+
`).map(i=>i.trim()).filter(Boolean)}catch{return[]}},"runDiff"),[s,r]=await Promise.all([t("git diff --cached --name-only"),t("git diff --name-only")]);return[...new Set([...s,...r])]}async function py(n){try{let e=await F.getCurrentTask(n),t={};if(e?.type&&(t.type=e.type),!e)return t;let s=L.get(n,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 1",Cd);if(s)try{let r=JSON.parse(s.data);if(r.taskId===e.id&&r.tags)return{...t,...r.tags}}catch{}return t}catch{return{}}}async function Jt(n,e,t,s={}){let r={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(s.skipRules)return r;let o=s.runContext??{},a=Q.getRulesForCommand(n,e).filter(C=>C.position===t),l=s.projectPath||process.cwd(),d=a.some(C=>C.whenExpr||C.type==="gate")?await uy(n,l):{branch:"",filesChanged:[],tags:{}},m=a.filter(C=>$d(C.whenExpr,d)),p=m.filter(C=>C.type==="gate");for(let C of p){let te=C.description||C.action;console.log(`
|
|
751
|
+
${Je.dim(`[gate] ${t}-${e}: ${C.action}`)}`);try{let R=Date.now();await $a(C,n,l,d,r,o);let ge=Date.now()-R,ze=ge>1e3?`${(ge/1e3).toFixed(1)}s`:`${ge}ms`;console.log(`${Je.green("\u2713")} ${Je.dim(`gate passed (${ze})`)}`)}catch(R){return console.log(`${Je.red("\u2717")} gate failed: ${te}`),r.gatesFailed.push(te),r.success=!1,r.output+=`Gate failed: ${te}
|
|
752
752
|
${y(R)}
|
|
753
753
|
`,r}}let f=m.filter(C=>C.type==="instruction");for(let C of f){let te=C.description||C.action;console.log(`
|
|
754
754
|
${Je.dim(`[instruction] ${t}-${e}: ${te}`)}`),r.instructions.push(C.action)}let h=m.filter(C=>C.type==="hook"),E=h.filter(C=>C.parallel===!1),P=h.filter(C=>C.parallel!==!1),k=c(async C=>{console.log(`
|
|
755
|
-
${Je.dim(`[hook] ${t}-${e}: ${C.action}`)}`);try{let te=Date.now();await $a(C,n,l,d,r,o);let R=Date.now()-te,
|
|
755
|
+
${Je.dim(`[hook] ${t}-${e}: ${C.action}`)}`);try{let te=Date.now();await $a(C,n,l,d,r,o);let R=Date.now()-te,ge=R>1e3?`${(R/1e3).toFixed(1)}s`:`${R}ms`;console.log(`${Je.green("\u2713")} ${Je.dim(`(${ge})`)}`)}catch(te){console.log(`${Je.yellow("\u26A0")} hook failed (non-blocking): ${C.action}`),r.hooksFailed.push(C.description||C.action),r.output+=`Hook failed: ${C.action}
|
|
756
756
|
${y(te)}
|
|
757
757
|
`}},"runHook");for(let C of E)await k(C);P.length>0&&await Promise.all(P.map(k));let I=m.filter(C=>C.type==="step");for(let C of I){console.log(`
|
|
758
|
-
${Je.dim(`[step] ${e}: ${C.action}`)}`);try{let te=Date.now();await $a(C,n,l,d,r,o);let R=Date.now()-te,
|
|
758
|
+
${Je.dim(`[step] ${e}: ${C.action}`)}`);try{let te=Date.now();await $a(C,n,l,d,r,o);let R=Date.now()-te,ge=R>1e3?`${(R/1e3).toFixed(1)}s`:`${R}ms`;console.log(`${Je.green("\u2713")} ${Je.dim(`step passed (${ge})`)}`),r.stepsRun.push(C.description||C.action)}catch(te){return console.log(`${Je.red("\u2717")} step failed: ${C.action}`),r.gatesFailed.push(C.description||C.action),r.success=!1,r.output+=`Step failed: ${C.action}
|
|
759
759
|
${y(te)}
|
|
760
|
-
`,r}}return r}var Id,Nd,Md,
|
|
761
|
-
`).trim()}var
|
|
762
|
-
`,"utf-8"),!0}async function
|
|
763
|
-
Merge manually or set \`vaultPath\` in .prjct/prjct.config.json to choose one.`),{moved:!1,reason:"conflict",from:t,to:r};await
|
|
760
|
+
`,r}}return r}var Id,Nd,Md,Yh,_d,Qh,Da,Zh,Ia=v(()=>{"use strict";Zr();Rd();cs();jd();ja();he();rt();ds();q();Me();Dd();Id="status:",Nd="script:",Md="mcp:",Yh="persona:context",_d="version:bump",Qh="changelog:add",Da="git:commit",Zh="git:push";c(ey,"runStatusTransition");c(ty,"runShellAction");c(sy,"runScriptAction");c(ny,"buildMcpInstruction");c(ry,"buildPersonaInstruction");c(oy,"runVersionBump");c(iy,"runChangelogAdd");c(ay,"expandTemplate");c(cy,"runGitCommit");c(ly,"runGitPush");c($a,"runRuleAction");c(uy,"buildWhenContext");c(dy,"resolveBranch");c(my,"resolveChangedFiles");c(py,"resolveActiveTags");c(Jt,"executeWorkflowRules")});function Od(n,e){try{return JSON.parse(n)}catch{return e}}function wy(n){let e=n.type.slice(Aa.length),t=Od(n.data,{});return{id:`mem_${n.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:n.timestamp,source:t.source,provenance:t.provenance??"declared"}}function ky(n){let e=n.data?Od(n.data,{}):{},t=e.tags??{};return n.type&&(t.type=n.type),{id:`ship_${n.id}`,type:"shipped",content:n.name,tags:t,rememberedAt:n.shipped_at,source:e.taskId,provenance:"extracted"}}function vy(n,e){let t=e.toLowerCase();if(n.content.toLowerCase().includes(t))return!0;for(let s of Object.values(n.tags))if(s.toLowerCase().includes(t))return!0;return!1}function by(n,e){for(let[t,s]of Object.entries(e))if(n.tags[t]!==s)return!1;return!0}function On(n){if(n.length===0)return"> No matching memory entries.";let e=new Map;for(let a of n){let l=e.get(a.type)??[];l.push(a),e.set(a.type,l)}let t=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],s=[],r={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},o=c((a,l)=>{if(l.length!==0){s.push(`### ${a.toUpperCase()}`);for(let u of l){let d=Object.entries(u.tags).map(([f,h])=>`${f}=${h}`).join(" "),m=d?` _(${d})_`:"",p=r[u.provenance];s.push(`- \`${p}\` [${u.id}] ${u.content}${m}`)}s.push("")}},"renderGroup"),i=new Set;for(let a of t){let l=e.get(a);!l||l.length===0||(o(a,l),i.add(a))}for(let[a,l]of e)i.has(a)||o(a,l);return s.join(`
|
|
761
|
+
`).trim()}var gy,Mn,fy,hy,yy,qt,Ln=v(()=>{"use strict";cs();he();Zr();gy=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person"],Mn=gy,fy=25,hy=4,yy=100;c(Od,"safeJson");c(wy,"rowToEntry");c(ky,"shippedRowToEntry");c(vy,"matchesTopic");c(by,"matchesTags");qt={async remember(n,e){await He.log(n,`${Ra}${e.type}`,{content:e.content,tags:e.tags??{},source:e.source,provenance:e.provenance??"declared"})},recall(n,e={}){let t=e.limit??fy,s=Math.max(t*hy,yy),r=L.query(n,"SELECT id, type, data, timestamp FROM events WHERE type LIKE ? ORDER BY id DESC LIMIT ?",`${Aa}%`,s),o=L.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",s),i=[...r.map(wy),...o.map(ky)];if(e.types&&e.types.length>0){let a=new Set(e.types);i=i.filter(l=>a.has(l.type))}return e.tags&&(i=i.filter(a=>by(a,e.tags??{}))),e.topic&&(i=i.filter(a=>vy(a,e.topic))),i.sort((a,l)=>l.rememberedAt.localeCompare(a.rememberedAt)),i.slice(0,t)},similar(n,e,t=10){let s=e.toLowerCase().split(/[^a-z0-9]+/).filter(i=>i.length>3);return s.length===0?[]:qt.recall(n,{limit:200}).map(i=>{let a=`${i.content} ${Object.values(i.tags).join(" ")}`.toLowerCase(),l=s.reduce((u,d)=>a.includes(d)?u+1:u,0);return{entry:i,hits:l}}).filter(i=>i.hits>0).sort((i,a)=>a.hits-i.hits).slice(0,t).map(i=>i.entry)}};c(On,"formatMemoryMd")});import Sy from"node:crypto";import Fn from"node:fs/promises";import Ty from"node:os";import ut from"node:path";async function Ld(n){let e=await Cy(n),t=ut.basename(n),s=`obsidian://open?vault=${encodeURIComponent(t)}`,r=Ey();if(!r)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:s,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await Py(r,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:s,obsidianConfigFound:!0,alreadyRegistered:i}}function Ey(){let n=Ty.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=ut.join(n,"Library","Application Support","obsidian");break;case"win32":e=ut.join(process.env.APPDATA||ut.join(n,"AppData","Roaming"),"obsidian");break;default:e=ut.join(process.env.XDG_CONFIG_HOME||ut.join(n,".config"),"obsidian");break}try{if(!Te("node:fs").existsSync(e))return null}catch{return null}return ut.join(e,"obsidian.json")}async function Cy(n){let e=ut.join(n,".obsidian"),t=ut.join(e,"app.json");try{return await Fn.stat(t),!1}catch{}return await Fn.mkdir(e,{recursive:!0}),await Fn.writeFile(t,`${JSON.stringify({},null,2)}
|
|
762
|
+
`,"utf-8"),!0}async function Py(n,e){let t={};try{let a=await Fn.readFile(n,"utf-8");t=JSON.parse(a)}catch{}let s=t.vaults??{},r=ut.resolve(e);for(let a of Object.values(s))if(ut.resolve(a.path)===r)return{registered:!1,alreadyRegistered:!0};let o=Sy.randomBytes(8).toString("hex");s[o]={path:r,ts:Date.now()};let i={...t,vaults:s};try{return await Fn.writeFile(n,JSON.stringify(i),"utf-8"),{registered:!0,alreadyRegistered:!1}}catch{return{registered:!1,alreadyRegistered:!1}}}var Fd=v(()=>{"use strict";c(Ld,"ensureObsidianVault");c(Ey,"resolveObsidianConfigPath");c(Cy,"bootstrapObsidianDir");c(Py,"registerVaultInObsidianConfig")});function Un(n){let e=[];for(let{name:t,re:s}of Ry)s.test(n)&&e.push(t);return e}var Ry,no=v(()=>{"use strict";Ry=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/}];c(Un,"scanForSecrets")});import dt from"node:fs/promises";import Xs from"node:path";async function Hn(n){await jy(n);let e=await $.readConfig(n).catch(()=>null);return await j.getWikiPath(n,e?.vaultPath)}async function jy(n){let e=await $.readConfig(n).catch(()=>null);if(e?.vaultPath&&e.vaultPath.trim().length>0)return{moved:!1,reason:"user-override"};let t=j.getLegacyWikiPath(n);if(!await Hd(t))return{moved:!1,reason:"no-legacy"};let r=await j.getWikiPath(n);if(await Hd(r))return console.error(`\u26A0 prjct: legacy wiki at ${t} was NOT migrated \u2014 ${r} already has content.
|
|
763
|
+
Merge manually or set \`vaultPath\` in .prjct/prjct.config.json to choose one.`),{moved:!1,reason:"conflict",from:t,to:r};await dt.mkdir(Xs.dirname(r),{recursive:!0});let i=await xy(t,r);return await $y(n),console.error(`\u2139 prjct: migrated Obsidian vault
|
|
764
764
|
from: ${j.getDisplayPath(t)}
|
|
765
765
|
to: ${j.getDisplayPath(r)}
|
|
766
|
-
(set \`vaultPath\` in .prjct/prjct.config.json to override)`),{moved:!0,reason:"moved",from:t,to:r,filesMoved:i}}async function Hd(n){try{return(await
|
|
767
|
-
${
|
|
766
|
+
(set \`vaultPath\` in .prjct/prjct.config.json to override)`),{moved:!0,reason:"moved",from:t,to:r,filesMoved:i}}async function Hd(n){try{return(await dt.readdir(n)).filter(s=>s!==".DS_Store"&&s!==".gitkeep").length>0}catch{return!1}}async function xy(n,e){try{return await dt.rename(n,e),await _a(e)}catch(t){if(t.code!=="EXDEV")throw t;await Wd(n,e);let r=await _a(e);return await dt.rm(n,{recursive:!0,force:!0}),r}}async function Wd(n,e){await dt.mkdir(e,{recursive:!0});let t=await dt.readdir(n,{withFileTypes:!0});for(let s of t){let r=Xs.join(n,s.name),o=Xs.join(e,s.name);s.isDirectory()?await Wd(r,o):s.isFile()&&await dt.copyFile(r,o)}}async function _a(n){let e=0,t=await dt.readdir(n,{withFileTypes:!0});for(let s of t){let r=Xs.join(n,s.name);s.isDirectory()?e+=await _a(r):s.isFile()&&e++}return e}async function $y(n){let e=Xs.join(n,".gitignore"),t="";try{t=await dt.readFile(e,"utf-8")}catch{if(!await Dy(Xs.join(n,".git")))return}if(t.includes(Ud))return;let s=`
|
|
767
|
+
${Ay}
|
|
768
768
|
${Ud}
|
|
769
769
|
`,r=t.endsWith(`
|
|
770
|
-
`)||t.length===0?t+s:`${t}${s}`;await
|
|
770
|
+
`)||t.length===0?t+s:`${t}${s}`;await dt.writeFile(e,r,"utf-8")}async function Dy(n){try{return await dt.stat(n),!0}catch{return!1}}var Ay,Ud,Na=v(()=>{"use strict";Ce();je();Ay="# prjct: legacy wiki \u2014 vault moved to ~/Documents/prjct/ in 2.2.0",Ud=".prjct/wiki/";c(Hn,"resolveVaultRoot");c(jy,"migrateWikiLocationIfNeeded");c(Hd,"dirHasContent");c(xy,"moveDirectory");c(Wd,"copyRecursive");c(_a,"countFiles");c($y,"ensureLegacyGitignore");c(Dy,"fileExists")});import Ks from"node:fs/promises";import ro from"node:path";async function Ny(n){return ro.join(await Hn(n),Iy)}async function My(n){return ro.join(await Hn(n),_y)}async function Vd(n){let e=await Ny(n);await Ks.mkdir(e,{recursive:!0});let t=ro.join(e,Gd);await Ks.stat(t).then(()=>!0,()=>!1)||await Ks.writeFile(t,Oy,"utf-8")}async function Bd(n){let e=await My(n);await Ks.mkdir(e,{recursive:!0});let t=ro.join(e,Gd);await Ks.stat(t).then(()=>!0,()=>!1)||await Ks.writeFile(t,Ly,"utf-8")}var Iy,_y,Gd,Oy,Ly,Jd=v(()=>{"use strict";Ce();Ln();no();ds();Na();Iy="captured",_y="workflows",Gd="README.md";c(Ny,"resolveCapturedRoot");c(My,"resolveWorkflowsRoot");c(Vd,"ensureCapturedReadme");Oy=`# Captured notes (Obsidian dropzone)
|
|
771
771
|
|
|
772
772
|
Drop a markdown note here, run \`prjct context wiki sync\`, and each note
|
|
773
773
|
becomes a project-memory entry. Processed notes move to \`_ingested/\` so
|
|
@@ -799,61 +799,61 @@ ${Mn.map(n=>`- \`${n}\``).join(`
|
|
|
799
799
|
- Secret-like content (API keys, JWTs) is refused unless you pass
|
|
800
800
|
\`--force\` to \`prjct context wiki sync\`.
|
|
801
801
|
- Files already in \`_ingested/\` are ignored.
|
|
802
|
-
`;c(Bd,"ensureWorkflowsReadme");
|
|
802
|
+
`;c(Bd,"ensureWorkflowsReadme");Ly='# Workflows (Obsidian dropzone)\n\nDrop a markdown file here to OVERRIDE a workflow\'s rules in SQLite. Format:\n\n```markdown\n---\nname: ship\n---\n\n## Gates\n- `git branch --show-current | grep -vE "^(main|master)$"` \u2014 Prevent shipping from main branch\n\n## Steps\n- `version:bump` \u2014 Bump version (stack-aware)\n- `changelog:add` \u2014 Append CHANGELOG entry\n- `git:commit` \u2014 Commit ship\n- `git:push` \u2014 Push to origin\n```\n\n## How it works\n\n1. You drop `workflows/<name>.md` here.\n2. Stop hook (or `prjct context wiki sync`) reads it.\n3. ALL existing rules for that workflow are deleted from SQLite.\n4. New rules from your file are inserted.\n5. Wiki regenerates \u2192 `_generated/workflows/<name>.md` reflects your edits.\n6. Your file moves to `_ingested/<timestamp>/` so this folder stays clean.\n\n## Schema\n\n- Frontmatter `name:` is required (the workflow command: ship, task, sync, \u2026)\n- Sections: `## Gates`, `## Steps`, `## Hooks`, `## Instructions` (any subset)\n- Each bullet: `- \\`<action>\\` \u2014 <description>` (description optional)\n- Order within a section is preserved as sortOrder\n\n## Notes\n\n- This is destructive: SQLite rules for the named workflow are REPLACED, not merged.\n- To restore a built-in workflow, run `prjct workflow reset <name>`.\n- `README.md` and `index.md` are ignored.\n- Files in `_ingested/` are ignored.\n'});var Wn={};Ee(Wn,{generateWiki:()=>Oa,regenerateWikiDeferred:()=>dw});import Fy from"node:crypto";import qe from"node:fs/promises";import mt from"node:path";function Ys(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,60)||"unnamed"}function Wy(n){return Fy.createHash("sha256").update(n).digest("hex").slice(0,16)}function Gy(n){let e=[];return e.push(`# ${n.name}`),e.push(""),e.push(`- Shipped: ${n.shippedAt}`),e.push(`- Version: ${n.version}`),n.type&&e.push(`- Type: ${n.type}`),n.duration&&e.push(`- Duration: ${n.duration}`),e.push(""),n.description&&(e.push("## Description"),e.push(""),e.push(n.description)),`${e.join(`
|
|
803
803
|
`)}
|
|
804
|
-
`}function
|
|
804
|
+
`}function Vy(n){let e=new Map;for(let t of n)for(let[s,r]of Object.entries(t.tags)){let o=e.get(s);o||(o=new Map,e.set(s,o));let i=o.get(r)??[];i.push(t),o.set(r,i)}return e}function Kd(n,e=Hy){if(n.length<=e)return[n];let t=[];for(let s=0;s<n.length;s+=e)t.push(n.slice(s,s+e));return t}function By(n){let e=new Map,t=new Map;for(let s of n){let r=t.get(s.type)??[];r.push(s),t.set(s.type,r)}for(let[s,r]of t){let o=Kd(r);if(o.length===1){let a=[`# ${s.toUpperCase()}`,"",On(r),""].join(`
|
|
805
805
|
`);e.set(`memory/${s}.md`,a);continue}let i=[`# ${s.toUpperCase()}`,"",`_${r.length} entries across ${o.length} chunks._`,""];for(let a=0;a<o.length;a++){let l=`${s}/chunk-${a+1}.md`,u=[`# ${s.toUpperCase()} \u2014 chunk ${a+1}/${o.length}`,"",On(o[a]),""].join(`
|
|
806
806
|
`);e.set(`memory/${l}`,u),i.push(`- [chunk ${a+1}](${l}) \u2014 ${o[a].length} entries`)}e.set(`memory/${s}.md`,`${i.join(`
|
|
807
807
|
`)}
|
|
808
|
-
`)}return e}function
|
|
808
|
+
`)}return e}function Jy(n){let e=new Map,t=Vy(n);for(let[s,r]of t){let o=Ys(s),i=[`# Tag: ${s}`,""],a=[...r.entries()].sort((l,u)=>l[0].localeCompare(u[0]));for(let[l,u]of a){let d=Ys(l),m=Kd(u);if(m.length===1){let p=[`# ${s}: ${l}`,"",On(u),""].join(`
|
|
809
809
|
`);e.set(`tags/${o}/${d}.md`,p),i.push(`- [${l}](${o}/${d}.md) \u2014 ${u.length} entries`)}else{for(let p=0;p<m.length;p++){let f=[`# ${s}: ${l} \u2014 chunk ${p+1}/${m.length}`,"",On(m[p]),""].join(`
|
|
810
810
|
`);e.set(`tags/${o}/${d}-${p+1}.md`,f)}i.push(`- **${l}** \u2014 ${u.length} entries across ${m.length} chunks`);for(let p=0;p<m.length;p++)i.push(` - [chunk ${p+1}](${o}/${d}-${p+1}.md)`)}}i.push(""),e.set(`tags/${o}.md`,`${i.join(`
|
|
811
811
|
`)}
|
|
812
|
-
`)}return e}function
|
|
812
|
+
`)}return e}function qy(n,e){if(n.length===0&&e.length===0)return null;let t=["# Patterns (inferred)",""];if(n.length>0){t.push("## Patterns");for(let s of n){let r=s.locations&&s.locations.length>0?` \u2014 ${s.locations.slice(0,3).join(", ")}`:"",o=s.category?` _[${s.category}]_`:"";t.push(`- **${s.name}**${o}: ${s.description}${r}`)}t.push("")}if(e.length>0){t.push("## Anti-patterns");for(let s of e){let r=s.files&&s.files.length>0?` (${s.files[0]})`:"",o=s.severity?` _[${s.severity}]_`:"";t.push(`- **${s.issue}**${o}${r} \u2014 ${s.suggestion}`),s.reasoning&&t.push(` - Why: ${s.reasoning}`)}t.push("")}return t.push("> Source: `prjct sync` analysis. Provenance: INFR."),`${t.join(`
|
|
813
813
|
`)}
|
|
814
|
-
`}function
|
|
814
|
+
`}function zy(n){let{architecture:e,conventions:t}=n;if(!(e&&(e.style||e.insights?.length||e.domains?.length))&&(!t||t.length===0))return null;let r=["# Architecture",""];if(e?.style&&r.push(`**Style**: ${e.style}`,""),e?.domains&&e.domains.length>0){r.push("## Domains");for(let o of e.domains)r.push(`- ${o}`);r.push("")}if(e?.insights&&e.insights.length>0){r.push("## Insights");for(let o of e.insights)r.push(`- ${o}`);r.push("")}if(t&&t.length>0){r.push("## Conventions");for(let o of t){let i=o.example?` \u2014 \`${o.example}\``:"";r.push(`- **${o.category}**: ${o.rule}${i}`)}r.push("")}return r.push("> Source: `prjct sync` LLM analysis."),`${r.join(`
|
|
815
815
|
`)}
|
|
816
|
-
`}function
|
|
816
|
+
`}function Xy(n){let{techDebt:e,riskAreas:t,refactorSuggestions:s}=n;if((e?.length??0)+(t?.length??0)+(s?.length??0)===0)return null;let o=["# Tech debt, risks & refactors",""];if(e&&e.length>0){o.push("## Tech debt");for(let i of e)o.push(`- **${i.description}** _[${i.priority}, ${i.effort}]_ \u2014 ${i.area}. Impact: ${i.impact}`);o.push("")}if(t&&t.length>0){o.push("## Risk areas");for(let i of t)o.push(`- **${i.path}** _[${i.severity}]_ \u2014 ${i.reason}. Risk: ${i.risk}`);o.push("")}if(s&&s.length>0){o.push("## Refactor suggestions");for(let i of s){let a=i.files&&i.files.length>0?` (${i.files.slice(0,3).join(", ")})`:"";o.push(`- **${i.description}** _[${i.effort}]_${a} \u2014 ${i.benefit}`)}o.push("")}return o.push("> Source: `prjct sync` LLM analysis."),`${o.join(`
|
|
817
817
|
`)}
|
|
818
|
-
`}function
|
|
818
|
+
`}function Ky(n){if(!n.projectInsights||n.projectInsights.length===0)return null;let e=["# Project insights",""];for(let t of n.projectInsights)e.push(`- ${t}`);return e.push("","> Source: `prjct sync` LLM analysis."),`${e.join(`
|
|
819
819
|
`)}
|
|
820
|
-
`}function
|
|
820
|
+
`}function Yy(n){let e=[],t=/^## \[([^\]]+)\]\s*-\s*(\d{4}-\d{2}-\d{2})\s*$/,s=n.split(`
|
|
821
821
|
`),r=null,o=[],i=c(()=>{r&&(e.push({version:r.version,date:r.date,body:o.join(`
|
|
822
|
-
`).trim()}),o=[])},"flush");for(let a of s){let l=a.match(t);if(l){i(),r={version:l[1],date:l[2]};continue}r&&o.push(a)}return i(),e}function
|
|
822
|
+
`).trim()}),o=[])},"flush");for(let a of s){let l=a.match(t);if(l){i(),r={version:l[1],date:l[2]};continue}r&&o.push(a)}return i(),e}function Qy(n){return`v${n.replace(/[^a-zA-Z0-9._-]+/g,"-")}`}function Zy(n,e,t){let s=[];s.push("---"),s.push("type: release"),s.push(`version: ${n.version}`),s.push(`date: ${n.date}`),s.push("tags: [release]"),s.push("---"),s.push(""),s.push(`# v${n.version} \u2014 ${n.date}`),s.push("");let r=[];return e&&r.push(`\u2190 [v${e.entry.version}](${e.slug}.md)`),r.push("[releases index](index.md)"),t&&r.push(`[v${t.entry.version}](${t.slug}.md) \u2192`),s.push(r.join(" \xB7 ")),s.push(""),n.body?(s.push(n.body),s.push("")):(s.push("_No changelog body._"),s.push("")),s.push("---"),s.push(""),s.push("[project wiki](../index.md) \xB7 [releases index](index.md)"),s.push(""),`${s.join(`
|
|
823
823
|
`)}
|
|
824
|
-
`}function
|
|
824
|
+
`}function ew(n){let e=["# Releases",""];e.push(`${n.length} version entr${n.length===1?"y":"ies"} parsed from \`CHANGELOG.md\`. Newest first.`),e.push(""),e.push("See also: [project wiki](../index.md)"),e.push(""),e.push("| Date | Version | Link |"),e.push("|---|---|---|");for(let{entry:t,slug:s}of n)e.push(`| ${t.date} | ${t.version} | [v${t.version}](${s}.md) |`);return e.push(""),`${e.join(`
|
|
825
825
|
`)}
|
|
826
|
-
`}async function
|
|
826
|
+
`}async function tw(n){let e=new Map,t=mt.join(n,"CHANGELOG.md"),s;try{s=await qe.readFile(t,"utf-8")}catch{return e}let r=Yy(s);if(r.length===0)return e;let o=new Map,i=[];for(let a of r){let l=Qy(a.version),u=o.get(l)??0;o.set(l,u+1);let d=u===0?l:`${l}-${u+1}b`;i.push({entry:a,slug:d})}for(let a=0;a<i.length;a++){let l=i[a],u=a>0?i[a-1]:null,d=a+1<i.length?i[a+1]:null;e.set(`releases/${l.slug}.md`,Zy(l.entry,d,u))}return e.set("releases/index.md",ew(i)),e}function Ma(n){let e=(n.analyzedAt||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:"undated"}function Yd(n,e){return`${n}::${e.trim().toLowerCase()}`}function Qd(n){let e=new Map,t=[...n].reverse(),s=c((o,i,a,l)=>{if(!i||!i.trim())return;let u=Yd(o,i),d=Ma(l),m=e.get(u);if(m){m.lastSeen=d,m.latestBody=a,m.seenIn.push({analysisId:l.id,date:d,commit:l.commitHash}),l.status==="active"&&(m.stillActive=!0);return}e.set(u,{kind:o,name:i.trim(),slug:Ys(i).slice(0,60)||"unnamed",latestBody:a,firstSeen:d,lastSeen:d,seenIn:[{analysisId:l.id,date:d,commit:l.commitHash}],stillActive:l.status==="active"})},"touch");for(let o of t){let i=o.analysis;for(let a of i.patterns??[])s("pattern",a.name,a,o);for(let a of i.antiPatterns??[])s("anti-pattern",a.issue,a,o);for(let a of i.techDebt??[])s("tech-debt",a.description,a,o);for(let a of i.riskAreas??[])s("risk-area",a.path,a,o);for(let a of i.refactorSuggestions??[])s("refactor",a.description,a,o);for(let a of i.projectInsights??[])s("insight",a,{description:a},o)}let r=new Map;for(let o of e.values()){let i=ao[o.kind],a=r.get(i);a||(a=new Set,r.set(i,a));let l=o.slug,u=2;for(;a.has(l);)l=`${o.slug}-${u}`,u+=1;o.slug=l,a.add(l)}return e}function sw(n){let e=[],t=n.latestBody,s=[...new Set(n.seenIn.map(u=>u.date))];e.push("---"),e.push(`type: ${n.kind}`),e.push(`name: ${JSON.stringify(n.name)}`),e.push(`firstSeen: ${n.firstSeen}`),e.push(`lastSeen: ${n.lastSeen}`),e.push(`seenIn: ${n.seenIn.length}`),e.push(`stillActive: ${n.stillActive}`),e.push(`tags: [${n.kind}]`),e.push("---"),e.push(""),e.push(`# ${n.name}`),e.push("");let r=t.description||t.reason||t.issue;r&&r!==n.name&&(e.push(r),e.push(""));let o=[];t.severity&&o.push(`**Severity**: ${t.severity}`),t.priority&&o.push(`**Priority**: ${t.priority}`),t.effort&&o.push(`**Effort**: ${t.effort}`),t.impact&&o.push(`**Impact**: ${t.impact}`),t.benefit&&o.push(`**Benefit**: ${t.benefit}`),t.confidence!==void 0&&o.push(`**Confidence**: ${t.confidence}`),t.category&&o.push(`**Category**: ${t.category}`),t.area&&o.push(`**Area**: ${t.area}`),t.risk&&o.push(`**Risk**: ${t.risk}`),t.suggestion&&o.push(`**Suggestion**: ${t.suggestion}`),t.reasoning&&t.reasoning!==r&&o.push(`**Reasoning**: ${t.reasoning}`),o.length>0&&(e.push(...o.map(u=>`- ${u}`)),e.push(""));let i=t.files||[],a=t.locations||[],l=[...new Set([...i,...a])];if(l.length>0){e.push("## Where");for(let u of l)e.push(`- \`${u}\``);e.push("")}return e.push("## Seen in"),e.push(`First: ${n.firstSeen} \xB7 Last: ${n.lastSeen} \xB7 ${n.seenIn.length} analysis run${n.seenIn.length===1?"":"s"} (${s.length} distinct date${s.length===1?"":"s"})`),e.push(""),e.push("---"),e.push(""),e.push("See also: [analysis index](../index.md) \xB7 [change log](../history.md)"),e.push(""),`${e.join(`
|
|
827
827
|
`)}
|
|
828
|
-
`}function
|
|
828
|
+
`}function nw(n,e){let t=["# Analysis evolution",""];if(t.push("One entry per analysis save where *something changed* (architecture, patterns, anti-patterns, tech debt, risks, refactors, or insights). Repeated saves with identical contents are collapsed."),t.push(""),t.push("See also: [analysis index](index.md) \xB7 [project wiki](../index.md)"),t.push(""),n.length===0)return t.push("> No analyses saved yet. Run `prjct sync` to generate one."),`${t.join(`
|
|
829
829
|
`)}
|
|
830
830
|
`;let s=c((u,d)=>{let m=e.get(Yd(u,d)),p=d.length>80?`${d.slice(0,77)}\u2026`:d;if(!m)return`"${p}"`;let f=ao[m.kind];return`[${p}](${f}/${m.slug}.md)`},"linkFor"),r=c(u=>{let d=u.analysis;return{arch:d.architecture?.style??"\u2014",patterns:new Set((d.patterns??[]).map(m=>m.name)),anti:new Set((d.antiPatterns??[]).map(m=>m.issue)),debt:new Set((d.techDebt??[]).map(m=>m.description)),risks:new Set((d.riskAreas??[]).map(m=>m.path)),refactors:new Set((d.refactorSuggestions??[]).map(m=>m.description)),insights:new Set(d.projectInsights??[])}},"rowFor"),o=c((u,d)=>{let m=[],p=[];for(let f of d)u.has(f)||m.push(f);for(let f of u)d.has(f)||p.push(f);return{added:m,removed:p}},"diffNames"),i=[...n].reverse(),a=null,l=[];for(let u of i){let d=r(u);if(a===null){l.push(`- **${Ma(u)}** \u2014 baseline captured (arch: ${d.arch}, ${d.patterns.size} patterns, ${d.anti.size} anti, ${d.debt.size} debt, ${d.risks.size} risks, ${d.refactors.size} refactors, ${d.insights.size} insights).`),a=d;continue}let m=[];a.arch!==d.arch&&m.push(`arch ${a.arch} \u2192 ${d.arch}`);let p=[["pattern","patterns","pattern"],["anti-pattern","anti","anti-pattern"],["tech-debt","debt","tech-debt"],["risk","risks","risk-area"],["refactor","refactors","refactor"],["insight","insights","insight"]];for(let[f,h,E]of p){let P=o(a[h],d[h]);for(let k of P.added)m.push(`+${f} ${s(E,k)}`);for(let k of P.removed)m.push(`\u2212${f} ${s(E,k)}`)}m.length!==0&&(l.push(`- **${Ma(u)}** \u2014 ${m.join("; ")}.`),a=d)}return l.length===0?t.push("> No changes recorded yet."):t.push(...l.reverse()),t.push(""),`${t.join(`
|
|
831
831
|
`)}
|
|
832
|
-
`}function
|
|
832
|
+
`}function rw(n){let e=new Map;for(let r of n.values()){let o=e.get(r.kind)??[];o.push(r),e.set(r.kind,o)}let t=["# Analysis",""];t.push("One file per concept from `prjct sync`. Files are deduped across history \u2014 the same pattern or risk always lands at the same path, updated with first/last-seen dates."),t.push(""),t.push("See also: [change log](history.md) \xB7 [project wiki](../index.md)"),t.push("");let s=["pattern","anti-pattern","tech-debt","risk-area","refactor","insight"];for(let r of s){let o=e.get(r);if(!o||o.length===0)continue;let i=ao[r],a=o.filter(u=>u.stillActive).length;t.push(`## ${i} (${a} active / ${o.length} total)`),t.push("");let l=[...o].sort((u,d)=>u.stillActive!==d.stillActive?u.stillActive?-1:1:u.lastSeen>d.lastSeen?-1:1);for(let u of l){let d=u.stillActive?"":" _(historical)_";t.push(`- [${u.name}](${i}/${u.slug}.md)${d}`)}t.push("")}return`${t.join(`
|
|
833
833
|
`)}
|
|
834
|
-
`}function
|
|
834
|
+
`}function ow(n){let e=new Map;if(n.length===0)return e;let t=Qd(n);for(let s of t.values()){let r=ao[s.kind];e.set(`analysis/${r}/${s.slug}.md`,sw(s))}return e.set("analysis/index.md",rw(t)),e.set("analysis/history.md",nw(n,t)),e}function iw(n){let e=new Map;if(n.length===0)return{files:e,commandCount:0};let t=new Map;for(let r of n){let o=t.get(r.command)??[];o.push(r),t.set(r.command,o)}for(let[r,o]of t){let i=o.filter(f=>f.enabled),a=i.filter(f=>f.type==="gate").sort((f,h)=>f.sortOrder-h.sortOrder),l=i.filter(f=>f.type==="step").sort((f,h)=>f.sortOrder-h.sortOrder),u=i.filter(f=>f.type==="hook").sort((f,h)=>f.sortOrder-h.sortOrder),d=i.filter(f=>f.type==="instruction").sort((f,h)=>f.sortOrder-h.sortOrder),m=o.filter(f=>!f.enabled),p=[];if(p.push("---"),p.push(`name: ${r}`),p.push(`rules: ${o.length}`),p.push(`enabled: ${i.length}`),m.length>0&&p.push(`disabled: ${m.length}`),p.push("---"),p.push(""),p.push(`# Workflow: ${r}`),p.push(""),a.length>0){p.push("## Gates (must pass before workflow runs)"),p.push("");for(let f of a){let h=f.description?` \u2014 ${f.description}`:"",E=f.whenExpr?` _(when: \`${f.whenExpr}\`)_`:"";p.push(`- \`${f.action}\`${h}${E} \u2014 id: ${f.id}`)}p.push("")}if(l.length>0){p.push("## Steps (run in order)"),p.push("");let f=1;for(let h of l){let E=h.description??h.action;p.push(`${f}. **${E}** \u2014 \`${h.action}\` (id: ${h.id})`),f+=1}p.push("")}if(u.length>0){p.push("## Hooks"),p.push("");for(let f of u){let h=f.description?` \u2014 ${f.description}`:"",E=f.position?` _(position: ${f.position})_`:"";p.push(`- \`${f.action}\`${h}${E} \u2014 id: ${f.id}`)}p.push("")}if(d.length>0){p.push("## Instructions"),p.push("");for(let f of d){let h=f.description?` \u2014 ${f.description}`:"";p.push(`- \`${f.action}\`${h} \u2014 id: ${f.id}`)}p.push("")}if(m.length>0){p.push("## Disabled rules"),p.push("");for(let f of m){let h=f.description?` \u2014 ${f.description}`:"";p.push(`- (${f.type}) \`${f.action}\`${h} \u2014 id: ${f.id}`)}p.push("")}p.push("---"),p.push(""),p.push(`> Edit this workflow: drop a Markdown file at \`<vault>/workflows/${r}.md\` (NOT under \`_generated/\`) with the same frontmatter + sections. The Stop hook ingests it and overrides these rules.`),e.set(`workflows/${r}.md`,`${p.join(`
|
|
835
835
|
`)}
|
|
836
836
|
`)}let s=["# Workflows",""];s.push("Workflow definitions stored in SQLite, rendered as Markdown for inspection. To edit, see the per-workflow page."),s.push("");for(let[r,o]of t){let i=o.filter(a=>a.enabled).length;s.push(`- [${r}](${r}.md) \u2014 ${i} active rule(s)`)}return e.set("workflows/index.md",`${s.join(`
|
|
837
837
|
`)}
|
|
838
|
-
`),{files:e,commandCount:t.size}}function
|
|
838
|
+
`),{files:e,commandCount:t.size}}function aw(n){let{ships:e,memoryTypeCounts:t,tagKeyCounts:s,patternsCount:r,antiPatternsCount:o,llmAnalysis:i}=n,a=["# Project context export (generated)","","Agent-readable snapshot of project memory. Regenerated on `prjct remember`, `prjct capture`,","`prjct ship`, `prjct sync`, and the SessionStart / Stop hooks.","Read directly with Read/Glob \u2014 no CLI round-trip needed.","","> \u26A0\uFE0F **Snapshot, not source.** SQLite is the source of truth. Edits to files under","> `_generated/` are silently overwritten on the next regen. To add memory, run",'> `prjct remember <type> "..."` or drop a markdown note in `../captured/` (parent directory)',"> with `type:` frontmatter \u2014 the Stop hook ingests it.",""];if(e.length>0){a.push("## Ships");for(let l of e)a.push(`- [${l.name}](ships/${Ys(l.name)}.md) \u2014 ${l.shippedAt}`);a.push("")}if(n.releaseCount>0&&(a.push("## Releases"),a.push(`- [releases/index](releases/index.md) \u2014 ${n.releaseCount} versions parsed from \`CHANGELOG.md\``),a.push("")),n.workflowCount>0&&(a.push("## Workflows"),a.push(`- [workflows/index](workflows/index.md) \u2014 ${n.workflowCount} workflow definition(s)`),a.push("")),t.size>0){a.push("## Memory by type");for(let[l,u]of t)a.push(`- [${l}](memory/${l}.md) \u2014 ${u} entries`);a.push("")}if(s.size>0){a.push("## Memory by tag");for(let[l,u]of s)a.push(`- [${l}](tags/${Ys(l)}.md) \u2014 ${u} entries`);a.push("")}return(r>0||o>0||i)&&(a.push("## Inferred"),(r>0||o>0)&&a.push(`- [patterns](patterns.md) \u2014 ${r} patterns, ${o} anti-patterns`),i&&((i.architecture?.style||i.architecture?.insights?.length||i.conventions?.length)&&a.push(`- [architecture](architecture.md) \u2014 ${i.architecture?.style??"\u2014"}, ${i.conventions?.length??0} conventions`),(i.techDebt?.length??0)+(i.riskAreas?.length??0)+(i.refactorSuggestions?.length??0)>0&&a.push(`- [tech-debt](tech-debt.md) \u2014 ${i.techDebt?.length??0} debt items, ${i.riskAreas?.length??0} risks, ${i.refactorSuggestions?.length??0} refactors`),i.projectInsights&&i.projectInsights.length>0&&a.push(`- [insights](insights.md) \u2014 ${i.projectInsights.length} project insights`)),n.archiveCount>0&&a.push(`- [analysis drill-down](analysis/index.md) \u2014 ${n.archiveCount} concepts (patterns, anti-patterns, tech-debt, risks, refactors, insights) + [history](analysis/history.md)`),a.push("")),e.length===0&&t.size===0&&r===0&&o===0&&a.push("> No ships, memory, or patterns yet. Run `prjct remember`, `prjct ship`, or `prjct sync`."),`${a.join(`
|
|
839
839
|
`)}
|
|
840
|
-
`}async function zd(n){try{let e=await qe.readFile(
|
|
840
|
+
`}async function zd(n){try{let e=await qe.readFile(mt.join(n,Xd),"utf-8"),t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}async function io(n,e,t){let s=mt.join(n,e);await qe.mkdir(mt.dirname(s),{recursive:!0}),await qe.writeFile(s,t,"utf-8")}async function cw(n,e){try{await qe.rm(mt.join(n,e),{force:!0})}catch{}}async function lw(n,e){let t=0,s=c(async r=>{let o;try{o=await qe.readdir(r,{withFileTypes:!0})}catch{return}for(let i of o){let a=mt.join(r,i.name);if(i.isDirectory()){await s(a);try{(await qe.readdir(a)).length===0&&await qe.rmdir(a)}catch{}continue}if(!i.name.endsWith(".md"))continue;let l=mt.relative(n,a);if(!e[l])try{await qe.rm(a,{force:!0}),t++}catch{}}},"walk");return await s(n),t}async function uw(n,e){let t=null;try{t=A.get(e,`SELECT
|
|
841
841
|
(SELECT COALESCE(MAX(id), 0) FROM events) AS max_event_id,
|
|
842
842
|
(SELECT COALESCE(MAX(id), 0) FROM llm_analysis) AS max_analysis_id,
|
|
843
843
|
(SELECT COUNT(*) FROM shipped_features) AS ship_count,
|
|
844
844
|
(SELECT MAX(shipped_at) FROM shipped_features) AS last_ship,
|
|
845
845
|
(SELECT COUNT(*) FROM workflow_rules) AS workflow_count,
|
|
846
|
-
(SELECT COALESCE(MAX(id), 0) FROM workflow_rules) AS max_workflow_id`)}catch{}let s=t?.max_event_id??0,r=t?.max_analysis_id??0,o=t?.ship_count??0,i=t?.last_ship??"",a=t?.workflow_count??0,l=t?.max_workflow_id??0,u=await qe.stat(
|
|
847
|
-
`),await io(s,qd,o);let To=
|
|
846
|
+
(SELECT COALESCE(MAX(id), 0) FROM workflow_rules) AS max_workflow_id`)}catch{}let s=t?.max_event_id??0,r=t?.max_analysis_id??0,o=t?.ship_count??0,i=t?.last_ship??"",a=t?.workflow_count??0,l=t?.max_workflow_id??0,u=await qe.stat(mt.join(n,"CHANGELOG.md")).then(d=>Math.floor(d.mtimeMs)).catch(()=>0);return`v${Uy}|e${s}|a${r}|s${o}|ls${i}|c${u}|w${a}/${l}`}async function Oa(n,e){let t=await Hn(n),s=mt.join(t,oo);await qe.mkdir(s,{recursive:!0});let r=mt.join(s,qd),o=await uw(n,e);if(await qe.readFile(r,"utf-8").catch(()=>null)===o){let K=await zd(s);return{wikiRoot:t,filesWritten:0,filesSkipped:Object.keys(K).length,filesRemoved:0}}let[a,l,u,d,m]=await Promise.all([vu.getAll(e),Promise.resolve(qt.recall(e,{limit:5e3})),Oe.getActive(e).catch(()=>null),Promise.resolve(Qe.getActive(e)).catch(()=>null),Promise.resolve(Q.getAllRules(e)).catch(()=>[])]),p=l.filter(K=>K.type!=="shipped"),f=new Map;for(let K of a)f.set(`ships/${Ys(K.name)}.md`,Gy(K));for(let[K,ve]of By(p))f.set(K,ve);for(let[K,ve]of Jy(p))f.set(K,ve);let h=d?.patterns??u?.patterns??[],E=d?.antiPatterns??u?.antiPatterns??[],P=qy(h,E);if(P&&f.set("patterns.md",P),d){let K=zy(d);K&&f.set("architecture.md",K);let ve=Xy(d);ve&&f.set("tech-debt.md",ve);let Yt=Ky(d);Yt&&f.set("insights.md",Yt)}let k=iw(m);for(let[K,ve]of k.files)f.set(K,ve);let I=k.commandCount,C=Qe.getAllFull(e);for(let[K,ve]of ow(C))f.set(K,ve);let te=await tw(n);for(let[K,ve]of te)f.set(K,ve);let R=te.size>0?te.size-1:0,ge=new Map;for(let K of p)ge.set(K.type,(ge.get(K.type)??0)+1);let ze=new Map;for(let K of p)for(let ve of Object.keys(K.tags))ze.set(ve,(ze.get(ve)??0)+1);f.set("index.md",aw({ships:a,memoryTypeCounts:ge,tagKeyCounts:ze,patternsCount:h.length,antiPatternsCount:E.length,llmAnalysis:d,archiveCount:Qd(C).size,releaseCount:R,workflowCount:I}));let pt=await zd(s),gt={},Kt=0,Tt=0,Dt=0;for(let[K,ve]of f){let Yt=Wy(ve);if(gt[K]=Yt,pt[K]===Yt){Tt++;continue}await io(s,K,ve),Kt++}for(let K of Object.keys(pt))gt[K]||(await cw(s,K),Dt++);let yn=await lw(s,gt);Dt+=yn,await io(s,Xd,`${JSON.stringify(gt,null,2)}
|
|
847
|
+
`),await io(s,qd,o);let To=mt.join(t,"README.md");return await qe.stat(To).then(()=>!0,()=>!1)||(await io(t,"README.md",`# Project Wiki
|
|
848
848
|
|
|
849
849
|
Open this folder as an Obsidian vault to browse project memory.
|
|
850
850
|
|
|
851
851
|
- Auto-generated content lives in \`${oo}/\` \u2014 start at [${oo}/index.md](${oo}/index.md). Do not edit; it rebuilds on \`prjct ship\` / \`prjct remember\`.
|
|
852
852
|
- Drop notes into \`captured/\` with frontmatter, then run \`prjct context wiki sync\` to ingest them into project memory. See [captured/README.md](captured/README.md).
|
|
853
853
|
- Any other markdown you place here survives rebuilds.
|
|
854
|
-
`),Kt++),await Vd(n),await Bd(n),await Ld(t).catch(()=>{}),{wikiRoot:t,filesWritten:Kt,filesSkipped:
|
|
854
|
+
`),Kt++),await Vd(n),await Bd(n),await Ld(t).catch(()=>{}),{wikiRoot:t,filesWritten:Kt,filesSkipped:Tt,filesRemoved:Dt}}async function dw(n,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{Oa(n,e).catch(()=>{})});return}try{await Oa(n,e)}catch{}}var oo,Xd,qd,Uy,Hy,ao,Gn=v(()=>{"use strict";Ln();En();he();Cn();Rn();ds();Fd();Jd();Na();oo="_generated",Xd=".manifest.json",qd=".regen-fingerprint",Uy=2,Hy=50;c(Ys,"slugify");c(Wy,"sha256");c(Gy,"formatShipBody");c(Vy,"groupByTagPair");c(Kd,"chunkEntries");c(By,"buildMemoryFiles");c(Jy,"buildTagFiles");c(qy,"buildPatternsFile");c(zy,"buildArchitectureFile");c(Xy,"buildTechDebtFile");c(Ky,"buildInsightsFile");c(Yy,"parseChangelog");c(Qy,"releaseSlug");c(Zy,"buildReleaseFile");c(ew,"buildReleasesIndex");c(tw,"buildReleasesFiles");ao={pattern:"patterns","anti-pattern":"anti-patterns","tech-debt":"tech-debt","risk-area":"risk-areas",refactor:"refactors",insight:"insights"};c(Ma,"analysisDateOnly");c(Yd,"conceptKey");c(Qd,"collectConcepts");c(sw,"buildConceptFile");c(nw,"buildHistoryFile");c(rw,"buildAnalysisIndex");c(ow,"buildAnalysisArchiveFiles");c(iw,"buildWorkflowFiles");c(aw,"buildIndexFile");c(zd,"readManifest");c(io,"writeFile");c(cw,"removeFile");c(lw,"sweepStaleFiles");c(uw,"computeRegenFingerprint");c(Oa,"generateWiki");c(dw,"regenerateWikiDeferred")});var sm={};Ee(sm,{ShippingCommands:()=>gs,seedCodeShipRules:()=>Fa});import{existsSync as Zd}from"node:fs";import em from"node:path";function tm(n){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>Zd(em.join(n,t)))}function La(n){return Zd(em.join(n,".git"))}async function Fa(n,e){if(!tm(e))return!1;let t=new Date().toISOString(),s=Q.getRulesForCommand(n,"ship"),r=new Set(s.map(d=>d.action)),i=s.reduce((d,m)=>Math.max(d,m.sortOrder??0),0)+1,a=[];La(e)&&a.push({action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",timeoutMs:5e3});let l=[{action:"version:bump",description:"Bump version (stack-aware)",timeoutMs:1e4},{action:"changelog:add",description:"Append CHANGELOG entry",timeoutMs:1e4}];La(e)&&(l.push({action:"git:commit",description:"Commit ship",timeoutMs:15e3}),l.push({action:"git:push",description:"Push to origin",timeoutMs:3e4}));let u=0;for(let d of a)r.has(d.action)||(Q.addRule(n,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)r.has(d.action)||(Q.addRule(n,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function mw(n,e,t,s){if(s.intent==="proceed"||s.intent==="register-only")return null;if(!t.some(a=>a.type==="step"&&a.position==="before"))return{question:"No `ship` workflow steps are configured for this project. What should ship do?",options:["register-only","seed-code-workflow","abort"],state:{rulesCount:t.length,looksLikeCode:tm(e)}};if(await F.getCurrentTask(n))return null;let i=await gw(e);return i?{question:`No active task, and PR #${i.number} ("${i.title}") is OPEN for this branch. Continue ship anyway?`,options:["proceed","abort"],state:{openPr:i.number,branch:i.branch}}:null}function pw(n,e){if(e){let t=N(O("Clarification needed",n.question),O("Options",Se(n.options.map(s=>`\`prjct ship --intent=${s}\``))),n.state?O("State",Se(Object.entries(n.state).map(([s,r])=>`${s}: ${JSON.stringify(r)}`))):null);console.log(t);return}console.log(`
|
|
855
855
|
\u26A0\uFE0F ${n.question}`),console.log(`
|
|
856
|
-
Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}async function
|
|
856
|
+
Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}async function gw(n){if(!La(n))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(Me(),jo)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:n,timeout:3e3}),s=t.toString().trim();if(!s)return null;let{stdout:r}=await e("gh",["pr","list","--head",s,"--state","open","--json","number,title","--limit","1"],{cwd:n,timeout:5e3}),o=JSON.parse(r.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:s}}catch{return null}}var gs,co=v(()=>{"use strict";Ce();sa();Rn();rt();ds();q();be();Wt();In();Re();Ia();Fe();gs=class extends re{static{c(this,"ShippingCommands")}async ship(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return g.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e,a=await F.getCurrentTask(o);a&&(i||(i=a.description||"current work"),await F.completeTask(o)),i||(i="current work");let l=Q.getRulesForCommand(o,"ship");if(s.intent==="seed-code-workflow"){if(!await Fa(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};l=Q.getRulesForCommand(o,"ship")}!l.some(k=>k.type==="step"&&k.position==="before")&&s.intent!=="register-only"&&await Fa(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),l=Q.getRulesForCommand(o,"ship"));let d=await mw(o,t,l,s);if(d)return pw(d,s.md===!0),{success:!1,clarification:d};let m={feature:i},p=await Jt(o,"ship","before",{projectPath:t,skipRules:s.skipHooks,runContext:m});if(!p.success)return{success:!1,error:`Ship blocked: ${p.gatesFailed.length>0?p.gatesFailed.join(", "):"unknown step"}`};let f=typeof m.version=="string"?m.version:"unversioned";await At.addShipped(o,{name:i,version:f}),await this.logToMemory(t,"feature_shipped",{feature:i,version:f,timestamp:b()});let h=await Jt(o,"ship","after",{projectPath:t,skipRules:s.skipHooks,runContext:m}),E=[...p.instructions,...h.instructions];try{await Us.sync(t)}catch(k){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",y(k))}try{let{regenerateWikiDeferred:k}=await Promise.resolve().then(()=>(Gn(),Wn));await k(t,o)}catch(k){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",y(k))}let P=p.stepsRun.length+h.stepsRun.length;if(s.md){let k=Br("ship",!0),I=N(we(`Shipped: ${i}`,`Version: ${f}`),O("Results",Se([`Version: ${f}`,`Workflow steps run: ${P>0?[...p.stepsRun,...h.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${p.hooksFailed.length+h.hooksFailed.length}`])),E.length>0?O("Agent Instructions",Se(E)):null,$e(k.map(C=>({label:C.desc,command:C.cmd}))));console.log(I)}else g.done(`v${f} shipped`),Ws("ship");return{success:!0,feature:i,version:f}}catch(r){return g.fail(y(r)),{success:!1,error:y(r)}}}};c(tm,"isCodeProject");c(La,"isGitRepo");c(Fa,"seedCodeShipRules");c(mw,"buildClarification");c(pw,"renderClarification");c(gw,"findOpenPrForBranch")});var om={};Ee(om,{PlanningCommands:()=>fs});import nm from"node:fs/promises";import rm from"node:path";async function fw(){if(!Ua){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(uo(),im));Ua=new n}return Ua}var Ua,fs,lo=v(()=>{"use strict";tr();Rt();Ce();je();ds();q();Re();ka();bd();Fe();Ua=null;c(fw,"getAnalysisCommands");fs=class extends re{static{c(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let s={};if(typeof e=="string"||e===null?s={idea:e}:s=e,await this.initializeAgent(),await $.isConfigured(t))return g.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 Nn(t).runNonInteractive());else if(a=await new Nn(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await Rs(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},m=(await $.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,s),g.step(2,4,"Creating structure..."),await j.ensureProjectStructure(m);let p=j.getGlobalProjectPath(m);await this._seedShipWorkflow(m,t);let f={"core/now.md":`# NOW
|
|
857
857
|
|
|
858
858
|
No current task. Use \`/p:now\` to set focus.
|
|
859
859
|
`,"core/next.md":`# NEXT
|
|
@@ -872,7 +872,7 @@ No current task. Use \`/p:now\` to set focus.
|
|
|
872
872
|
|
|
873
873
|
`,"planning/roadmap.md":`# ROADMAP
|
|
874
874
|
|
|
875
|
-
`,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(f["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[k,I]of Object.entries(f))await nm.writeFile(rm.join(p,k),I);let h=await this._detectEmptyDirectory(t),E=await this._detectExistingCode(t);if(E||!h){g.step(3,4,"Analyzing project...");let k=await
|
|
875
|
+
`,"memory/context.jsonl":"","memory/patterns.json":JSON.stringify({version:1,decisions:{},preferences:{},workflows:{},counters:{}},null,2)};a&&(f["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[k,I]of Object.entries(f))await nm.writeFile(rm.join(p,k),I);let h=await this._detectEmptyDirectory(t),E=await this._detectExistingCode(t);if(E||!h){g.step(3,4,"Analyzing project...");let k=await fw();if((await k.analyze({},t)).success)return g.step(4,4,"Generating agents..."),await k.sync(t),g.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:m,wizard:a}}let P=s.idea;if(h&&!E){if(!P)return g.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:m,wizard:a};g.spin("architect mode...");let k=rm.join(p,"planning","architect-session.md"),I=`# Architect Session
|
|
876
876
|
|
|
877
877
|
## Idea
|
|
878
878
|
${P}
|
|
@@ -881,7 +881,7 @@ ${P}
|
|
|
881
881
|
Initialized - awaiting stack recommendation
|
|
882
882
|
|
|
883
883
|
Generated: ${new Date().toLocaleString()}
|
|
884
|
-
`;return await nm.writeFile(k,I),await
|
|
884
|
+
`;return await nm.writeFile(k,I),await ye.installGlobalConfig(),g.done("architect mode ready"),{success:!0,mode:"architect",projectId:m,idea:P,wizard:a}}return await ye.installGlobalConfig(),g.done("initialized"),this._printNextSteps(a),{success:!0,projectId:m,wizard:a}}catch(s){return g.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 _applyInitialPacksAndPersona(e,t){let{activatePacks:s,detectSuggestedPacks:r}=await Promise.resolve().then(()=>(Pa(),Td)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await r(e)),o.length>0&&await s(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(Ce(),mr))).default,a=await i.readConfig(e);if(a){let l=a.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...a,persona:l})}}}async _seedShipWorkflow(e,t){let s=await Yr(t),r=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(co(),sm));await o(e,t),r=Q.getRulesForCommand(e,"ship").reduce((i,a)=>Math.max(i,a.sortOrder??0),0)+1,Q.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:r++,createdAt:new Date().toISOString()}),s.lint&&Q.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:r++,createdAt:new Date().toISOString()}),s.test&&Q.addRule(e,{type:"step",command:"ship",position:"before",action:`${s.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:r++,createdAt:new Date().toISOString()})}}});var Ha,hs,am=v(()=>{"use strict";It();tr();Ce();je();q();Y();Re();Ha=class{static{c(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await $.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(ur(),lr));if(await o.detect(e)){let a=await o.getMainWorktree(e);if(a&&a!==e&&await $.isConfigured(a))return await o.setup(e,a),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(lo(),om)),r=await new t().init(null,e);return r.success?{success:!0}:r}async getProjectId(e){let t=await $.getProjectId(e);if(!t)throw Xn.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await j.ensureProjectStructure(t),j.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Rs();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 Mt(e)).filter(r=>!r.startsWith(".")&&r!=="node_modules"&&r!=="package.json"&&r!=="package-lock.json"&&r!=="README.md").length===0}catch(t){return x(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 Mt(e)).some(r=>t.includes(r))}catch(t){return x(t)||console.error(`Code check error: ${y(t)}`),!1}}async isConfigured(e){return await $.isConfigured(e)}async needsMigration(e){return await $.needsMigration(e)}},hs=new Ha});var re,Fe=v(()=>{"use strict";la();yd();wd();cs();am();re=class{static{c(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new Jr,this.updateNotificationShown=!1}get agent(){return Kr.getAgent()}get agentInfo(){return Kr.getInfo()}get currentAuthor(){return hs.getCurrentAuthor()}async initializeAgent(){return Kr.initialize()}async ensureProjectInit(e){return hs.ensureInit(e)}async ensureAuthor(){return hs.ensureAuthor()}async getGlobalProjectPath(e){return hs.getGlobalPath(e)}async logToMemory(e,t,s){let r=await this.ensureAuthor();return He.log(e,t,s,r.name)}async _detectEmptyDirectory(e){return hs.isEmptyDirectory(e)}async _detectExistingCode(e){return hs.hasExistingCode(e)}_breakdownFeatureTasks(e){return ga.breakdownFeature(e)}_detectBugSeverity(e){return ga.detectBugSeverity(e)}}});var im={};Ee(im,{AnalysisCommands:()=>ys});import cm from"node:fs/promises";var lm,ys,uo=v(()=>{"use strict";Kc();Ce();je();gr();Go();El();sa();En();he();Cn();Ii();q();be();Wt();In();Re();od();Fe();lm=`{version:1, commitHash, analyzedAt,
|
|
885
885
|
architecture:{style:"monolith|monorepo|microservices|modular-monolith", insights:[], domains:[]},
|
|
886
886
|
patterns:[{name, description, locations:[], confidence:0-1, category:"architecture|data-flow|error-handling|testing"}],
|
|
887
887
|
antiPatterns:[{issue, reasoning, files:[], suggestion, severity:"low|medium|high", confidence:0-1}],
|
|
@@ -889,10 +889,10 @@ Generated: ${new Date().toLocaleString()}
|
|
|
889
889
|
riskAreas:[{path, reason, risk, severity}], refactorSuggestions:[{description, files:[], benefit, effort}],
|
|
890
890
|
projectInsights:[], conventions:[{category, rule, example}],
|
|
891
891
|
commands:{build, test, lint, dev, format, install}, stack:{languages:[], frameworks:[], packageManager}}`,ys=class extends re{static{c(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
892
|
-
`),Pe.init(t);let s={packageJson:await Pe.readPackageJson(),cargoToml:await Pe.readCargoToml(),goMod:await Pe.readGoMod(),requirements:await Pe.readRequirements(),directories:await Pe.listDirectories(),fileCount:await Pe.countFiles(),gitStats:await Pe.getGitStats(),gitLog:await Pe.getGitLog(20),hasDockerfile:await Pe.fileExists("Dockerfile"),hasDockerCompose:await Pe.fileExists("docker-compose.yml"),hasReadme:await Pe.fileExists("README.md"),hasTsconfig:await Pe.fileExists("tsconfig.json"),hasViteConfig:await Pe.fileExists("vite.config.ts")||await Pe.fileExists("vite.config.js"),hasNextConfig:await Pe.fileExists("next.config.js")||await Pe.fileExists("next.config.mjs")},r=rd(s,t),o=await $.
|
|
893
|
-
`),console.log(`\u{1F4C4} Full report: ${j.getDisplayPath(
|
|
894
|
-
`),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:
|
|
895
|
-
`)}catch{p="### Next: Run `prjct analysis-payload --md` to update project analysis"}let f=Br("sync",!0),h=i.syncMetrics?.indexes,E={Duration:`${(a/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(h?.bm25Files){let k=h.bm25Files*(h.bm25AvgTokens||0);E["Tokens indexed"]=`${Math.round(k/1e3)}K`,E["Import edges"]=h.importEdges||0,E["Co-change commits"]=h.cochangeCommits||0}let P=N(we("Sync Complete"),Hs(E),u,i.git.hasChanges?qu("Uncommitted changes detected"):null,p,$e(f.map(k=>({label:k.desc,command:k.cmd}))));return console.log(P),{success:!0,data:i,metrics:{elapsed:a,skillCount:l,fileCount:i.stats.fileCount}}}return ed(i,o)}catch(s){return t.md?console.log(N("## Sync Failed",`> ${y(s)}`)):g.fail(y(s)),{success:!1,error:y(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Us.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&&
|
|
892
|
+
`),Pe.init(t);let s={packageJson:await Pe.readPackageJson(),cargoToml:await Pe.readCargoToml(),goMod:await Pe.readGoMod(),requirements:await Pe.readRequirements(),directories:await Pe.listDirectories(),fileCount:await Pe.countFiles(),gitStats:await Pe.getGitStats(),gitLog:await Pe.getGitLog(20),hasDockerfile:await Pe.fileExists("Dockerfile"),hasDockerCompose:await Pe.fileExists("docker-compose.yml"),hasReadme:await Pe.fileExists("README.md"),hasTsconfig:await Pe.fileExists("tsconfig.json"),hasViteConfig:await Pe.fileExists("vite.config.ts")||await Pe.fileExists("vite.config.js"),hasNextConfig:await Pe.fileExists("next.config.js")||await Pe.fileExists("next.config.mjs")},r=rd(s,t),o=await $.readConfig(t).catch(()=>null),i=await j.getWikiPath(t,o?.vaultPath),a=`${i}/_generated/analysis/repo-summary.md`;return await cm.mkdir(`${i}/_generated/analysis`,{recursive:!0}),await cm.writeFile(a,r,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:b(),fileCount:s.fileCount,gitCommits:s.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
|
|
893
|
+
`),console.log(`\u{1F4C4} Full report: ${j.getDisplayPath(a)}
|
|
894
|
+
`),console.log("Next steps:"),console.log("\u2022 /p:sync \u2192 Generate agents based on stack"),console.log("\u2022 /p:feature \u2192 Add a new feature"),{success:!0,summaryPath:a,data:s}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async sync(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return g.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let o=Date.now();if(t.package){let a=await j.detectMonorepo(e);if(!a.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=a.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=a.packages.map(m=>m.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Us.sync(e,{packagePath:l.path,packageName:l.name});return t.json?console.log(JSON.stringify({success:u.success,package:l.name,path:l.relativePath})):t.md?console.log(N(we(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await Us.sync(e,{full:t.full});if(!i.success)return t.md?console.log(N("## Sync Failed",`> ${i.error||"Unknown error"}`)):g.fail(i.error||"Sync failed"),{success:!1,error:i.error};if(t.md||g.stop(),t.md){let a=Date.now()-o,l=i.generatedSkills?.generated?.length??0,u=null;try{let k=await Oe.diff(r);k?.hasChanges&&(u=Wo(k))}catch{}let d=i.git.recentCommits[0]?.hash??null,m=d&&Qe.isCurrent(r,d),p=null;if(!m)try{let k=await ci(r,e,i.git,i.stats);p=["## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",lm,"```","### Data","```json",JSON.stringify(k),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`"].join(`
|
|
895
|
+
`)}catch{p="### Next: Run `prjct analysis-payload --md` to update project analysis"}let f=Br("sync",!0),h=i.syncMetrics?.indexes,E={Duration:`${(a/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(h?.bm25Files){let k=h.bm25Files*(h.bm25AvgTokens||0);E["Tokens indexed"]=`${Math.round(k/1e3)}K`,E["Import edges"]=h.importEdges||0,E["Co-change commits"]=h.cochangeCommits||0}let P=N(we("Sync Complete"),Hs(E),u,i.git.hasChanges?qu("Uncommitted changes detected"):null,p,$e(f.map(k=>({label:k.desc,command:k.cmd}))));return console.log(P),{success:!0,data:i,metrics:{elapsed:a,skillCount:l,fileCount:i.stats.fileCount}}}return ed(i,o)}catch(s){return t.md?console.log(N("## Sync Failed",`> ${y(s)}`)):g.fail(y(s)),{success:!1,error:y(s)}}}async analysisPayload(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Us.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&&Qe.isCurrent(r,i))return t.md?console.log(N(we("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let a=await ci(r,e,o.git,o.stats);return t.md?console.log(N("## Analysis Payload","> Analyze this project data. Return JSON matching the schema.","### Schema","```",lm,"```","### Data","```json",JSON.stringify(a),"```","> Save: `prjct analysis-save-llm '<JSON>' --md`")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(s){return{success:!1,error:y(s)}}}async regenVault(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(je(),qc))).default,l=await(await Promise.resolve().then(()=>(Ce(),mr))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:m}=await Promise.resolve().then(()=>(Gn(),Wn)),p=await m(e,r);return t.md?console.log(`---
|
|
896
896
|
|
|
897
897
|
## Vault regenerated
|
|
898
898
|
|
|
@@ -902,32 +902,32 @@ Generated: ${new Date().toLocaleString()}
|
|
|
902
902
|
| Files written | ${p.filesWritten} |
|
|
903
903
|
| Files skipped | ${p.filesSkipped} |
|
|
904
904
|
| Files removed | ${p.filesRemoved} |
|
|
905
|
-
`):console.log(JSON.stringify({success:!0,message:"Vault regenerated",...p})),{success:!0}}catch(s){return{success:!1,error:y(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);if(!i.version||!i.architecture||!i.patterns)return{success:!1,error:"Invalid LLM analysis format. Missing required fields."};Ze.save(o,i);let{regenerateWikiDeferred:a}=await Promise.resolve().then(()=>(Gn(),Wn));return await a(t,o),s.md?console.log(N(we("LLM Analysis Saved"),Hs({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0}}catch(r){return{success:!1,error:y(r)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=Ze.getActive(r);if(!o)return t.md?console.log(N("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[we(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(O("Architecture Insights",Se(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(O(`Patterns (${o.patterns.length})`,Se(a.map(l=>`**${l.name}** \u2014 ${l.description} (${l.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(O(`Anti-Patterns (${o.antiPatterns.length})`,Se(a.map(l=>`[${l.severity}] ${l.issue} \u2014 ${l.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(O(`Tech Debt (${o.techDebt.length})`,Se(a.map(l=>`[${l.priority}/${l.effort}] ${l.description}`))))}o.conventions.length>0&&i.push(O("Conventions",Se(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(N(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(s){return{success:!1,error:y(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Ls.getSummary(r),i=await Ls.getDailyStats(r,30),a=await td(r),l={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(t.json){let p={session:a,patterns:l,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await Ls.read(r),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(f=>`${f.name} (${f.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(l.decisions>0||l.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${l.learnedDecisions} confirmed (${l.decisions} total)`),console.log(` Preferences: ${l.preferences} saved`),console.log(` Workflows: ${l.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Vs(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${wr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${aa(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((f,h)=>f+h.usageCount,0);for(let f of o.topAgents){let h=p>0?(f.usageCount/p*100).toFixed(0):0;console.log(` ${f.agentName.padEnd(12)}: ${h}% (${f.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=sd(i);if(console.log(` ${p} ${Vs(o.last30DaysTokens)} tokens saved`),o.trend!==0){let f=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${f} ${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 p=nd(o,i,u,m,a,l);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:l}}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.diff(r);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(N("## Analysis Diff",`> ${i}`)):g.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(N(zo(o))),{success:!0,data:o};if(!o.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(cl(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`),g.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(N("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.seal(r);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(g.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(g.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.rollback(r);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(N(we("Analysis Rolled Back"),Hs({"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(N("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(g.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}}):(g.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(N("## Rollback Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Oe.verify(r);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?g.done(o.message):g.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let r=y(s);return g.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(r,"project")?.repoPath||e}catch{}let i=await Oe.semanticVerify(r,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(g.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(g.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 l=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${l} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}}});var km={};Ee(km,{PRJCT_HOOKS:()=>Vn,install:()=>Ka,status:()=>Qa,uninstall:()=>Ya});import Ja from"node:fs/promises";import Sw from"node:os";import hm from"node:path";function en(){let n=process.env.HOME||Sw.homedir();return hm.join(n,".claude","settings.json")}async function za(){try{let n=await Ja.readFile(en(),"utf-8"),e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch(n){if(n.code==="ENOENT")return{};throw n}}async function ym(n){await Ja.mkdir(hm.dirname(en()),{recursive:!0}),await Ja.writeFile(en(),`${JSON.stringify(n,null,2)}
|
|
906
|
-
`,"utf-8")}function
|
|
907
|
-
`)}var ke,
|
|
908
|
-
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",l=>{i||(i=!0,clearTimeout(a),t(l))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function ek(n,e,t,s,r,o=!0){let i=ke.socket();if(!Ae.existsSync(i))return o&&
|
|
909
|
-
`,"utf-8")}c(ww,"writeRaw");function
|
|
910
|
-
`);console.log(N(O("Global config",r),O("Path",`\`${
|
|
911
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(O("Stack",Hs({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),N(...t)}async loadRepoAnalysis(e){try{let t=bw.join(e,"analysis","repo-analysis.json"),s=await vw.readFile(t,"utf-8"),r=JSON.parse(s);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return x(t),null}}},
|
|
905
|
+
`):console.log(JSON.stringify({success:!0,message:"Vault regenerated",...p})),{success:!0}}catch(s){return{success:!1,error:y(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);if(!i.version||!i.architecture||!i.patterns)return{success:!1,error:"Invalid LLM analysis format. Missing required fields."};Qe.save(o,i);let{regenerateWikiDeferred:a}=await Promise.resolve().then(()=>(Gn(),Wn));return await a(t,o),s.md?console.log(N(we("LLM Analysis Saved"),Hs({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0}}catch(r){return{success:!1,error:y(r)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=Qe.getActive(r);if(!o)return t.md?console.log(N("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[we(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(O("Architecture Insights",Se(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(O(`Patterns (${o.patterns.length})`,Se(a.map(l=>`**${l.name}** \u2014 ${l.description} (${l.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(O(`Anti-Patterns (${o.antiPatterns.length})`,Se(a.map(l=>`[${l.severity}] ${l.issue} \u2014 ${l.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(O(`Tech Debt (${o.techDebt.length})`,Se(a.map(l=>`[${l.priority}/${l.effort}] ${l.description}`))))}o.conventions.length>0&&i.push(O("Conventions",Se(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(N(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(s){return{success:!1,error:y(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Ls.getSummary(r),i=await Ls.getDailyStats(r,30),a=await td(r),l={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(t.json){let p={session:a,patterns:l,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await Ls.read(r),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(f=>`${f.name} (${f.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(l.decisions>0||l.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${l.learnedDecisions} confirmed (${l.decisions} total)`),console.log(` Preferences: ${l.preferences} saved`),console.log(` Workflows: ${l.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Vs(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${pr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${aa(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((f,h)=>f+h.usageCount,0);for(let f of o.topAgents){let h=p>0?(f.usageCount/p*100).toFixed(0):0;console.log(` ${f.agentName.padEnd(12)}: ${h}% (${f.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=sd(i);if(console.log(` ${p} ${Vs(o.last30DaysTokens)} tokens saved`),o.trend!==0){let f=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${f} ${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 p=nd(o,i,u,m,a,l);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:l}}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.diff(r);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(N("## Analysis Diff",`> ${i}`)):g.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(N(Wo(o))),{success:!0,data:o};if(!o.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(sl(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`),g.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(N("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.seal(r);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(g.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(g.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.rollback(r);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(N(we("Analysis Rolled Back"),Hs({"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(N("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(g.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}}):(g.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(N("## Rollback Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Oe.verify(r);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?g.done(o.message):g.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let r=y(s);return g.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(r,"project")?.repoPath||e}catch{}let i=await Oe.semanticVerify(r,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(g.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(g.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 l=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${l} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}}});var vm={};Ee(vm,{PRJCT_HOOKS:()=>Vn,install:()=>Ka,status:()=>Qa,uninstall:()=>Ya});import Ja from"node:fs/promises";import Sw from"node:os";import ym from"node:path";function en(){let n=process.env.HOME||Sw.homedir();return ym.join(n,".claude","settings.json")}async function za(){try{let n=await Ja.readFile(en(),"utf-8"),e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch(n){if(n.code==="ENOENT")return{};throw n}}async function wm(n){await Ja.mkdir(ym.dirname(en()),{recursive:!0}),await Ja.writeFile(en(),`${JSON.stringify(n,null,2)}
|
|
906
|
+
`,"utf-8")}function km(n){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${n} || exit 0`}function Xa(n){return n[qa]===!0}function Tw(n){if(n[qa]===!0)return!1;let e=n.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function hm(n){let e={type:"command",command:km(n.subcommand),[qa]:!0};return"ifClause"in n&&n.ifClause&&(e.if=n.ifClause),e}async function Ka(){let n=await za(),e=n.hooks??{},t=0,s=0;for(let r of Vn){let o=e[r.event]??[],i=km(r.subcommand),a=o.find(m=>(m.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(m=>!Tw(m));let u=l-a.hooks.length,d=a.hooks.find(m=>Xa(m));if(d){let m=hm(r);d.command===m.command&&d.if===m.if&&u===0?s++:(d.command=m.command,d.if=m.if,t++)}else a.hooks.push(hm(r)),t++;e[r.event]=o}return n.hooks=e,await wm(n),{settingsPath:en(),hooksWritten:t,alreadyPresent:s}}async function Ya(){let n=await za();if(!n.hooks)return{settingsPath:en(),hooksRemoved:0};let e=0;for(let[t,s]of Object.entries(n.hooks)){let r=[];for(let o of s){let i=o.hooks.filter(a=>Xa(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?n.hooks[t]=r:delete n.hooks[t]}return Object.keys(n.hooks).length===0&&delete n.hooks,await wm(n),{settingsPath:en(),hooksRemoved:e}}async function Qa(){let e=(await za()).hooks??{},t=0;for(let s of Object.values(e))for(let r of s)for(let o of r.hooks)Xa(o)&&t++;return{installed:t,expected:Vn.length}}var qa,Vn,Za=v(()=>{"use strict";c(en,"settingsPath");qa="_prjctManaged",Vn=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(za,"readSettings");c(wm,"writeSettings");c(km,"hookCommand");c(Xa,"isPrjctHook");c(Tw,"isLegacyPrjctHook");c(hm,"hookEntryFor");c(Ka,"install");c(Ya,"uninstall");c(Qa,"status")});function un(n){return Buffer.from(`${JSON.stringify(n)}
|
|
907
|
+
`)}var ke,xm,$m,dc=v(()=>{"use strict";ke={runDir:c(()=>`${process.env.HOME||Te("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:c(()=>`${ke.runDir()}/daemon.sock`,"socket"),pid:c(()=>`${ke.runDir()}/daemon.pid`,"pid"),log:c(()=>`${ke.runDir()}/daemon.log`,"log")},xm=30*60*1e3,$m=1024*1024;c(un,"encodeMessage")});var _m={};Ee(_m,{executeViaDaemon:()=>ek,forceKillDaemon:()=>sk,getDaemonStatus:()=>Zw,isDaemonRunning:()=>Dm,sendRequest:()=>Bn,spawnDaemon:()=>Im,stopDaemon:()=>tk});import yo from"node:crypto";import Ae from"node:fs";import{connect as Qw}from"node:net";async function Dm(){let n=ke.socket();if(!Ae.existsSync(n))return!1;try{return(await Bn({id:yo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Ae.unlinkSync(n)}catch{}return!1}}async function Zw(){let n=ke.socket(),e=ke.pid();if(!Ae.existsSync(n))return{running:!1};try{let t=await Bn({id:yo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Ae.existsSync(e)?{running:!1,pid:parseInt(Ae.readFileSync(e,"utf-8").trim(),10),socketPath:n}:{running:!1}}function Bn(n){return new Promise((e,t)=>{let s=ke.socket(),r=Qw(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(un(n))}),r.on("data",l=>{o+=l.toString();let u=o.indexOf(`
|
|
908
|
+
`);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",l=>{i||(i=!0,clearTimeout(a),t(l))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function ek(n,e,t,s,r,o=!0){let i=ke.socket();if(!Ae.existsSync(i))return o&&Im().catch(()=>{}),null;try{return await Bn({id:yo.randomUUID(),command:n,args:e,options:t,cwd:s,perfStartNs:r})}catch{return null}}async function tk(){try{return(await Bn({id:yo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function sk(){let n=ke.pid(),e=ke.socket(),t=!1;if(Ae.existsSync(n)){let s=parseInt(Ae.readFileSync(n,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Ae.existsSync(n)&&Ae.unlinkSync(n)}catch{}try{Ae.existsSync(e)&&Ae.unlinkSync(e)}catch{}return t}async function Im(){let{spawn:n}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Ae.existsSync(t))o=t,i="bun";else if(Ae.existsSync(s))o=s,i=Bo()?"bun":"node";else if(Ae.existsSync(r))o=r,i=Bo()?"bun":"node";else return!1;let a=ke.runDir();Ae.mkdirSync(a,{recursive:!0});let l=ke.log(),u=Ae.openSync(l,"a");n(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Ae.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await Dm())return!0;return!1}var Nm=v(()=>{"use strict";hr();dc();c(Dm,"isDaemonRunning");c(Zw,"getDaemonStatus");c(Bn,"sendRequest");c(ek,"executeViaDaemon");c(tk,"stopDaemon");c(sk,"forceKillDaemon");c(Im,"spawnDaemon")});var Qm={};Ee(Qm,{isSyncCurrent:()=>Km,runSelfHeal:()=>Ym,selfHealIfStale:()=>Nk});import kc from"node:fs";import Dk from"node:os";import qm from"node:path";function Ik(){try{return kc.readFileSync(Xm,"utf-8").trim()}catch{return null}}function _k(n){try{kc.mkdirSync(zm,{recursive:!0}),kc.writeFileSync(Xm,n,"utf-8")}catch{}}function Km(n){return n?Ik()===n:!0}async function Ym(n){if(n&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(Rt(),Gl));await e()}catch{}try{await(await Promise.resolve().then(()=>(Za(),vm))).install()}catch{}_k(n)}}async function Nk(n){process.env.PRJCT_NO_SELF_SYNC!=="1"&&(Km(n)||await Ym(n))}var zm,Xm,Zm=v(()=>{"use strict";zm=qm.join(Dk.homedir(),".prjct-cli","state"),Xm=qm.join(zm,"installed-version");c(Ik,"readStamp");c(_k,"writeStamp");c(Km,"isSyncCurrent");c(Ym,"runSelfHeal");c(Nk,"selfHealIfStale")});import de from"node:fs";import{createServer as Mk}from"node:net";Ce();je();q();be();var Uo=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,s,r){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} is not a function`);let i=c(async(a,l)=>a!=null?o.call(t,a,l.projectPath):o.call(t,l.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let s of this.categories.keys())t[s]=e.filter(r=>r.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),r=s.filter((a,l)=>s.indexOf(a)!==l);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(l=>!i.includes(l.group));a.length>0&&e.push(`Invalid categories: ${a.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,s=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:b()};else try{o=await this.buildContext(s)}catch(l){return{success:!1,error:y(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return r.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()}},z=new Uo;function Xc(n){let e=z.getAll().map(r=>r.name),t=null,s=1/0;for(let r of e){let o=xp(n.toLowerCase(),r.toLowerCase());o<s&&(s=o,t=r)}return s<=2?t:null}c(Xc,"findClosestCommand");function xp(n,e){let t=n.length,s=e.length,r=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=s;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)r[o][i]=n[o-1]===e[i-1]?r[o-1][i-1]:1+Math.min(r[o-1][i],r[o][i-1],r[o-1][i-1]);return r[t][s]}c(xp,"editDistance");uo();Ln();no();q();Re();Fe();var Qs=class extends re{static{c(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),s={}){try{if(!e||!e.trim())return g.info('Usage: prjct capture "<anything>" [--tags k:v,...]'),{success:!1,error:"Content required"};let r=e.trim(),o=Un(r);if(o.length>0&&!s.force)return g.fail(`refusing to capture content that looks like a secret (${o.join(", ")}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"};let i=hw(s.tags),a=await this.ensureProjectInit(t);if(!a.success)return a;await qt.remember(t,{type:"inbox",content:r,tags:i,provenance:"declared"});let l=r.length>60?`${r.slice(0,57)}\u2026`:r;return s.md?console.log(`\u2713 captured: ${l}`):g.done(`captured: ${l}`),{success:!0,type:"inbox",content:r,tags:i}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}};function hw(n){if(!n)return{};let e={};for(let t of n.split(",")){let s=t.trim(),r=s.indexOf(":");r>0&&(e[s.slice(0,r)]=s.slice(r+1))}return e}c(hw,"parseFlagTags");import Wa from"node:fs";import yw from"node:os";import um from"node:path";var dm=um.join(yw.homedir(),".prjct-cli","config"),Ga=um.join(dm,"global.json");function Va(){try{let n=Wa.readFileSync(Ga,"utf-8"),e=JSON.parse(n);if(e&&typeof e=="object"&&!Array.isArray(e))return e}catch{}return{}}c(Va,"readRaw");function ww(n){Wa.mkdirSync(dm,{recursive:!0}),Wa.writeFileSync(Ga,`${JSON.stringify(n,null,2)}
|
|
909
|
+
`,"utf-8")}c(ww,"writeRaw");function mm(n){return Va()[n]}c(mm,"getConfig");function pm(){return Va()}c(pm,"getAll");function Ba(n,e){let t=Va();e===void 0?delete t[n]:t[n]=e,ww(t)}c(Ba,"setConfig");function gm(n){Ba(n,void 0)}c(gm,"unsetConfig");function fm(){return Ga}c(fm,"configPath");Wt();Re();Fe();var Zs=class extends re{static{c(this,"ConfigCommands")}async config(e=null,t=process.cwd(),s={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list";switch(o){case"list":return this.list(s);case"get":return this.get(r[1],s);case"set":return this.set(r[1],r.slice(2).join(" "),s);case"unset":return this.unset(r[1],s);default:return g.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=pm(),s=Object.keys(t).sort();if(e.md){let r=s.length===0?"_No global config set._":s.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
|
|
910
|
+
`);console.log(N(O("Global config",r),O("Path",`\`${fm()}\``)))}else if(s.length===0)g.info("No global config set.");else for(let r of s)console.log(` ${r} = ${JSON.stringify(t[r])}`);return{success:!0,config:t}}get(e,t){if(!e)return g.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let s=mm(e);return t.md?console.log(N(O(e,s===void 0?"_(unset)_":`\`${JSON.stringify(s)}\``))):s===void 0?g.info("(unset)"):console.log(JSON.stringify(s)),{success:!0,key:e,value:s}}set(e,t,s){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let r=kw(t);Ba(e,r);let o=`${e} = ${JSON.stringify(r)}`;return s.md?console.log(N(O("Set",o))):g.done(o),{success:!0,key:e,value:r}}unset(e,t){if(!e)return g.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};gm(e);let s=`Removed ${e}`;return t.md?console.log(N(O("Unset",s))):g.done(s),{success:!0,key:e}}};function kw(n){let e=n.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(n);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(n)?t:n}c(kw,"parseValue");Ce();je();rt();q();Wt();import vw from"node:fs/promises";import bw from"node:path";var ws=class{static{c(this,"ContextCommands")}async context(e=null,t=process.cwd(),s={}){try{let r=await $.readConfig(t);if(!r||!r.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `prjct init` first."};let o=r.projectId,i=j.getGlobalProjectPath(o),a=await F.read(o),l=a?.currentTask?{id:a.currentTask.id,description:a.currentTask.description,startedAt:a.currentTask.startedAt,subtasks:a.currentTask.subtasks?.map(m=>({id:m.id,description:m.description,status:m.status,domain:m.domain})),currentSubtaskIndex:a.currentTask.currentSubtaskIndex}:null,u=await this.loadRepoAnalysis(i),d={projectId:o,globalPath:i,currentTask:l,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:u?.ecosystem||"unknown",frameworks:u?.frameworks||[],hasTests:u?.hasTests||!1,technologies:u?.technologies||[]}};return s.md?console.log(this.formatContextMd(d)):console.log(JSON.stringify(d)),{success:!0,message:""}}catch(r){return{success:!1,message:`Context error: ${y(r)}`}}}formatContextMd(e){let t=[];if(t.push(O("Project",ra(na("ID",e.projectId),na("Path",e.globalPath)))),e.currentTask){let s=e.currentTask;if(t.push($n({description:s.description,status:"in-progress"})),s.subtasks&&s.subtasks.length>0){let r=s.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(r.join(`
|
|
911
|
+
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(O("Stack",Hs({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),N(...t)}async loadRepoAnalysis(e){try{let t=bw.join(e,"analysis","repo-analysis.json"),s=await vw.readFile(t,"utf-8"),r=JSON.parse(s);return{ecosystem:r.ecosystem||"unknown",frameworks:r.frameworks||[],hasTests:r.hasTests??!1,technologies:r.technologies||[]}}catch(t){return x(t),null}}},E$=new ws;Za();q();Re();Fe();var tn=class extends re{static{c(this,"InstallCommands")}async install(e=null,t=process.cwd(),s={}){try{let r=await Ka(),o=Vn.length,i=`installed ${r.hooksWritten} new, ${r.alreadyPresent} already present (total ${o} hooks)`;return s.md?console.log(["# prjct hooks installed","",`Wrote to \`${r.settingsPath}\`.`,"",`- new: ${r.hooksWritten}`,`- already present: ${r.alreadyPresent}`,`- total expected: ${o}`,"","> Only `_prjctManaged: true` entries were touched. Your other hooks are untouched."].join(`
|
|
912
912
|
`)):(g.done(i),g.info(`settings: ${r.settingsPath}`)),{success:!0,hooksWritten:r.hooksWritten}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async uninstall(e=null,t=process.cwd(),s={}){try{let r=await Ya(),o=`removed ${r.hooksRemoved} prjct hook(s)`;return s.md?console.log(`# prjct hooks removed
|
|
913
913
|
|
|
914
914
|
- removed: ${r.hooksRemoved}
|
|
915
915
|
- settings: \`${r.settingsPath}\`
|
|
916
|
-
`):g.done(o),{success:!0,hooksRemoved:r.hooksRemoved}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async status(e=null,t=process.cwd()){try{let s=await Qa();return{success:!0,installed:s.installed,expected:s.expected}}catch(s){return{success:!1,error:y(s)}}}};import*as
|
|
917
|
-
`,"utf-8")}},ks=new tc;q();Wt();Re();Fe();var sn=class extends re{static{c(this,"McpCommands")}async mcp(e=null,t=process.cwd(),s={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??null,i=r[1]??null;if(o===null)return!s.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,s);switch(o){case"list":return this.list(t,s);case"status":return this.status(t,s);case"deny":return this.deny(i,t,s);case"allow":return this.allow(i,t,s);default:return g.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await ks.list(e);if(t.length===0)return g.info("No MCP servers detected for this project."),{success:!0,servers:[]};let s=c(k=>k.reduce((I,C)=>I+C.estimatedTools,0),"sumTools"),r=t.filter(k=>!k.denied),o=s(r),i=s(t),a=e.split("/").pop()??"this project";
|
|
918
|
-
`),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((k,I)=>{if(k.source!==I.source){let C=["cloud","project","global"];return C.indexOf(k.source)-C.indexOf(I.source)}return I.estimatedTools-k.estimatedTools}),d=await
|
|
919
|
-
`),`Wrote ${this.relativeSettingsPath(p.settingsPath,e)}`),
|
|
916
|
+
`):g.done(o),{success:!0,hooksRemoved:r.hooksRemoved}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async status(e=null,t=process.cwd()){try{let s=await Qa();return{success:!0,installed:s.installed,expected:s.expected}}catch(s){return{success:!1,error:y(s)}}}};import*as We from"@clack/prompts";import xt from"chalk";import ec from"node:fs";import Ew from"node:os";import mo from"node:path";var Cw=[{name:"claude_ai_PostHog",displayName:"PostHog",description:"Product analytics, dashboards, feature flags, surveys",estimatedTools:280},{name:"claude_ai_Atlassian",displayName:"Atlassian (Jira + Confluence)",description:"Jira issues, Confluence pages, Compass components",estimatedTools:40},{name:"claude_ai_Supabase",displayName:"Supabase",description:"Postgres projects, migrations, edge functions, branches",estimatedTools:30},{name:"claude_ai_Google_Drive",displayName:"Google Drive",description:"Read files from your Drive (auth-gated)",estimatedTools:2},{name:"claude_ai_Linear",displayName:"Linear",description:"Issues, projects, comments",estimatedTools:25},{name:"claude_ai_GitHub",displayName:"GitHub",description:"Repos, PRs, issues (claude.ai integration, separate from gh CLI)",estimatedTools:35},{name:"claude_ai_Notion",displayName:"Notion",description:"Pages, databases, blocks",estimatedTools:20},{name:"claude_ai_Slack",displayName:"Slack",description:"Messages, channels, threads",estimatedTools:15}],tc=class{static{c(this,"McpService")}async list(e){let t=new Set(this.readDenied(e).map(i=>i.serverName)),s=[];for(let i of Cw)s.push({name:i.name,displayName:i.displayName,source:"cloud",description:i.description,estimatedTools:i.estimatedTools,denied:t.has(i.name)});let r=this.readJson(mo.join(e,".mcp.json"));if(r?.mcpServers)for(let i of Object.keys(r.mcpServers))s.push({name:i,displayName:i,source:"project",description:"stdio server declared in .mcp.json",estimatedTools:0,denied:t.has(i)});let o=this.readJson(mo.join(Ew.homedir(),".claude.json"));if(o?.mcpServers)for(let i of Object.keys(o.mcpServers))s.push({name:i,displayName:i,source:"global",description:"stdio server declared in ~/.claude.json",estimatedTools:0,denied:t.has(i)});return s}async deny(e,t){let s=this.localSettingsPath(e),r=this.readJson(s)??{},o=r.deniedMcpServers??[];return o.some(a=>a.serverName===t)?{alreadyDenied:!0,settingsPath:s}:(r.deniedMcpServers=[...o,{serverName:t}],this.writeJson(s,r),{alreadyDenied:!1,settingsPath:s})}async allow(e,t){let s=this.localSettingsPath(e),r=this.readJson(s)??{},o=r.deniedMcpServers??[],i=o.filter(a=>a.serverName!==t);return i.length===o.length?{wasDenied:!1,settingsPath:s}:(i.length===0?delete r.deniedMcpServers:r.deniedMcpServers=i,this.writeJson(s,r),{wasDenied:!0,settingsPath:s})}async setEnabled(e,t,s){let r=this.localSettingsPath(e),o=this.readJson(r)??{},i=new Set((o.deniedMcpServers??[]).map(m=>m.serverName)),a=new Set(t),l=new Set(i);for(let m of s)a.has(m)?l.delete(m):l.add(m);let u=[],d=[];for(let m of s){let p=i.has(m),f=l.has(m);!p&&f?u.push(m):p&&!f&&d.push(m)}return u.length===0&&d.length===0?{nowDenied:u,nowAllowed:d,settingsPath:r}:(l.size===0?delete o.deniedMcpServers:o.deniedMcpServers=Array.from(l).map(m=>({serverName:m})),this.writeJson(r,o),{nowDenied:u,nowAllowed:d,settingsPath:r})}localSettingsPath(e){return mo.join(e,".claude","settings.local.json")}readDenied(e){return this.readJson(this.localSettingsPath(e))?.deniedMcpServers??[]}readJson(e){try{let t=ec.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}writeJson(e,t){ec.mkdirSync(mo.dirname(e),{recursive:!0}),ec.writeFileSync(e,`${JSON.stringify(t,null,2)}
|
|
917
|
+
`,"utf-8")}},ks=new tc;q();Wt();Re();Fe();var sn=class extends re{static{c(this,"McpCommands")}async mcp(e=null,t=process.cwd(),s={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??null,i=r[1]??null;if(o===null)return!s.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,s);switch(o){case"list":return this.list(t,s);case"status":return this.status(t,s);case"deny":return this.deny(i,t,s);case"allow":return this.allow(i,t,s);default:return g.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await ks.list(e);if(t.length===0)return g.info("No MCP servers detected for this project."),{success:!0,servers:[]};let s=c(k=>k.reduce((I,C)=>I+C.estimatedTools,0),"sumTools"),r=t.filter(k=>!k.denied),o=s(r),i=s(t),a=e.split("/").pop()??"this project";We.intro(xt.cyan.bold(`MCP servers \u2014 ${a}`)),We.note([`${r.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,xt.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
|
|
918
|
+
`),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((k,I)=>{if(k.source!==I.source){let C=["cloud","project","global"];return C.indexOf(k.source)-C.indexOf(I.source)}return I.estimatedTools-k.estimatedTools}),d=await We.multiselect({message:"Keep enabled in this project:",options:u.map(k=>({value:k.name,label:this.optionLabel(k,l[k.source]),hint:k.description})),initialValues:u.filter(k=>!k.denied).map(k=>k.name),required:!1});if(We.isCancel(d))return We.cancel("No changes."),{success:!0,cancelled:!0};let m=d,p=await ks.setEnabled(e,m,t.map(k=>k.name)),f=s(t.filter(k=>m.includes(k.name))),h=f-o;if(p.nowDenied.length===0&&p.nowAllowed.length===0)return We.outro(xt.dim("No changes.")),{success:!0,unchanged:!0};let E=[];p.nowDenied.length>0&&E.push(xt.red(`\u2717 denied (${p.nowDenied.length}): ${p.nowDenied.join(", ")}`)),p.nowAllowed.length>0&&E.push(xt.green(`\u2713 allowed (${p.nowAllowed.length}): ${p.nowAllowed.join(", ")}`));let P=h>0?"+":"";return E.push(""),E.push(`Tools loaded: ${o} \u2192 ${f} (${xt.bold(`${P}${h}`)})`),We.note(E.join(`
|
|
919
|
+
`),`Wrote ${this.relativeSettingsPath(p.settingsPath,e)}`),We.outro(xt.yellow("Restart Claude Code to apply (MCP config is cached at session start).")),{success:!0,...p,beforeTools:o,afterTools:f}}catch(t){let s=y(t);return g.fail(s),{success:!1,error:s}}}optionLabel(e,t){let s=e.estimatedTools>0?xt.dim(` ~${e.estimatedTools} tools`):"";return`${xt.dim(`[${t}]`)} ${e.displayName}${s}`}relativeSettingsPath(e,t){return e.startsWith(t)?e.slice(t.length+1):e}async list(e,t){try{let s=await ks.list(e);return t.md?console.log(this.formatMd(s,!1)):this.formatTerminal(s,!1),{success:!0,servers:s}}catch(s){let r=y(s);return g.fail(r),{success:!1,error:r}}}async status(e,t){try{let r=(await ks.list(e)).filter(o=>o.denied);return t.md?console.log(this.formatMd(r,!0)):this.formatTerminal(r,!0),{success:!0,denied:r}}catch(s){let r=y(s);return g.fail(r),{success:!1,error:r}}}async deny(e,t,s){if(!e)return g.fail("Usage: prjct mcp deny <serverName>"),{success:!1,error:"Missing serverName"};try{let r=await ks.deny(t,e),o=r.alreadyDenied?"already denied":"denied",i=`${e} ${o} in this project`;return s.md?console.log(N(O("Done",i),O("What to do next",this.restartHint(r.settingsPath)))):(g.done(i),console.log(this.restartHint(r.settingsPath))),{success:!0,...r}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async allow(e,t,s){if(!e)return g.fail("Usage: prjct mcp allow <serverName>"),{success:!1,error:"Missing serverName"};try{let r=await ks.allow(t,e),o=r.wasDenied?`${e} re-allowed in this project`:`${e} was not denied \u2014 nothing to change`;return s.md?console.log(N(O("Done",o),r.wasDenied?O("What to do next",this.restartHint(r.settingsPath)):null)):(g.done(o),r.wasDenied&&console.log(this.restartHint(r.settingsPath))),{success:!0,...r}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}formatTerminal(e,t){if(e.length===0){t?g.info("No MCP servers denied in this project."):g.info("No MCP servers detected.");return}let s=e.filter(o=>o.denied).reduce((o,i)=>o+i.estimatedTools,0),r=e.filter(o=>!o.denied).reduce((o,i)=>o+i.estimatedTools,0);t||console.log(`
|
|
920
920
|
MCP servers \u2014 this project (${process.cwd().split("/").pop()})
|
|
921
921
|
`);for(let o of e){let i=o.denied?"\u2717 DENIED":"\u2713 active",a=o.estimatedTools>0?` ~${o.estimatedTools} tools`:"";console.log(` ${i.padEnd(10)} [${o.source}] ${o.displayName}${a}`),console.log(` ${o.description}`),console.log(` name: ${o.name}`)}t||(console.log(""),console.log(`Estimated tools loaded: ${r} (denied: ${s})`),console.log(""),console.log("Toggle in this project (does NOT affect other projects):"),console.log(" prjct mcp deny <name> # silence here, keep elsewhere"),console.log(" prjct mcp allow <name> # re-enable here"),console.log(""),console.log("Cloud MCPs come from your claude.ai connected apps. To see one"),console.log("here, it must already be connected in claude.ai. To disable it"),console.log("globally, disconnect it in claude.ai settings."))}formatMd(e,t){if(e.length===0)return`${t?"# MCP status \u2014 this project":"# MCP servers \u2014 this project"}
|
|
922
922
|
|
|
923
923
|
Nothing to show.
|
|
924
924
|
`;let s=[];s.push(t?"# MCP denylist \u2014 this project":"# MCP servers \u2014 this project"),s.push("");let r={cloud:e.filter(i=>i.source==="cloud"),project:e.filter(i=>i.source==="project"),global:e.filter(i=>i.source==="global")},o={cloud:"Cloud (claude.ai connected apps)",project:"Project (.mcp.json)",global:"Global (~/.claude.json)"};for(let[i,a]of Object.entries(r))if(a.length!==0){s.push(`## ${o[i]}`),s.push(""),s.push("| Status | Name | Tools | Description |"),s.push("|---|---|---|---|");for(let l of a){let u=l.denied?"\u2717 denied":"\u2713 active",d=l.estimatedTools>0?`~${l.estimatedTools}`:"\u2014";s.push(`| ${u} | \`${l.name}\` | ${d} | ${l.description} |`)}s.push("")}if(!t){let i=e.filter(l=>l.denied).reduce((l,u)=>l+u.estimatedTools,0),a=e.filter(l=>!l.denied).reduce((l,u)=>l+u.estimatedTools,0);s.push(`**Estimated tools loaded:** ${a} (denied: ${i})`),s.push(""),s.push("## Toggle in this project (project-local, no global side effects)"),s.push(""),s.push("- `prjct mcp deny <name>` \u2014 silence here, keep elsewhere"),s.push("- `prjct mcp allow <name>` \u2014 re-enable here"),s.push(""),s.push("Cloud MCPs come from your claude.ai connected apps. To disable one globally, disconnect it in claude.ai settings.")}return s.join(`
|
|
925
925
|
`)}restartHint(e){return[`Wrote: ${e}`,"","Restart Claude Code for this to take effect:"," 1. Exit this Claude Code session (Ctrl+C or close the window)"," 2. Re-run `claude` in the same directory","","The harness caches MCP config at session start \u2014 denylist edits are","only read on a fresh session."].join(`
|
|
926
|
-
`)}};lo();Zr();Ln();no();cs();
|
|
927
|
-
Types: ${Mn.join(" | ")}`),{success:!1,error:"Missing args"};let o=jw(e);if(!o.ok)return g.fail(o.error),{success:!1,error:o.error};let{type:i,content:a}=o,l=Un(a);if(l.length>0&&!s.force){let f=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${f}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Aw(s.tags),d=await po(t);if(!d.ok)return d.result;let m=await F.getCurrentTask(d.value);await qt.remember(t,{type:i,content:a,tags:u,source:m?.id});let{regenerateWikiDeferred:p}=await Promise.resolve().then(()=>(Gn(),Wn));return await p(t,d.value),s.md?console.log(`\u2713 remembered ${i}: ${a}`):g.done(`remembered ${i}`),{success:!0,type:i,content:a,tags:u}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}};function Rw(n){let e=n.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let s=t.indexOf(":");return s<=0?null:[t.slice(0,s),t.slice(s+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}c(Rw,"parseTagPairs");function Aw(n){if(!n)return{};let e={};for(let t of n.split(",")){let s=t.trim(),r=s.indexOf(":");r>0&&(e[s.slice(0,r)]=s.slice(r+1))}return e}c(Aw,"parseFlagTags");function jw(n){let e=n.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let s=e.slice(0,t).toLowerCase().trim();if(!s||!/^[a-z][a-z0-9-]*$/.test(s))return{ok:!1,error:`invalid type '${s}'. Lowercase letters + dashes only. Base types: ${Mn.join(", ")}`};let r=s,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:r,content:o}:{ok:!1,error:"content is required"}}c(jw,"parseRememberArgs");async function xw(n,e){try{let{default:t}=await Promise.resolve().then(()=>(
|
|
926
|
+
`)}};lo();Zr();Ln();no();cs();rt();q();Re();Fe();Ce();rt();Re();async function po(n){let e=await $.getProjectId(n);return e?{ok:!0,value:e}:(g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}c(po,"requireProjectId");async function sc(n,e={}){let t=await F.getCurrentTask(n);if(!t){let s='No active task \u2014 start one with `prjct task "<desc>"`';return e.md?console.log(`> ${s}`):g.warn("no active task"),{ok:!1,result:{success:!1,error:s}}}return{ok:!0,value:t}}c(sc,"requireActiveTask");var Pw=["feature","bug","improvement","chore"],nn=class extends re{static{c(this,"PrimitiveCommands")}async status(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await po(t);if(!o.ok)return o.result;if(e!==null&&["active","resume","in_progress","working"].includes(e.toLowerCase())&&!await F.getCurrentTask(o.value)){let f=await F.resumeTask(o.value);if(f){await He.log(t,Js,{taskId:f.id,from:"paused",to:e});let h=`status \u2192 ${e}`;return s.md?console.log(`\u2713 ${h}`):g.done(h),{success:!0,taskId:f.id,status:e}}}if(!e&&!await F.getCurrentTask(o.value)){let f=await F.getPausedTasks(o.value);if(f.length>0){let h=f[0],E=`Task: ${h.id} | Type: ${h.type??"unset"} | Status: paused`;return s.md?console.log(E):g.info(E),{success:!0,taskId:h.id,status:"paused"}}}let a=await sc(o.value,s);if(!a.ok)return a.result;let l=a.value,u=await xw(o.value,l.id);if(!e){let p=`Task: ${l.id} | Type: ${l.type??"unset"} | Status: ${u??"active"}`;return s.md?console.log(p):g.info(p),{success:!0,taskId:l.id,status:u??"active"}}await He.log(t,Js,{taskId:l.id,from:u??null,to:e});let d=e.toLowerCase();try{d==="done"||d==="completed"?await F.completeTask(o.value):d==="paused"||d==="pause"?await F.pauseTask(o.value):(d==="active"||d==="resume"||d==="in_progress"||d==="working")&&(await F.getCurrentTask(o.value)||await F.resumeTask(o.value))}catch{}let m=`status \u2192 ${e}`;return s.md?console.log(`\u2713 ${m}`):g.done(m),{success:!0,taskId:l.id,status:e}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async tag(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await po(t);if(!o.ok)return o.result;let i=await sc(o.value,s);if(!i.ok)return i.result;if(!e)return g.info("Usage: prjct tag <key:value> [<key:value>...]"),{success:!1,error:"No tags provided"};let a=Rw(e);if(Object.keys(a).length===0)return g.fail("no valid k:v pairs (expected `key:value`)"),{success:!1,error:"Invalid tag format"};let l=a.type;l&&Pw.includes(l)&&await F.updateCurrentTask(o.value,{type:l}),await He.log(t,"task.tagged",{taskId:i.value.id,tags:a});let u=Object.entries(a).map(([d,m])=>`${d}=${m}`).join(", ");return s.md?console.log(`\u2713 tagged ${u}`):g.done(`tagged ${u}`),{success:!0,taskId:i.value.id,tags:a}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async remember(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;if(!e)return g.info(`Usage: prjct remember <type> "<content>" [--tags k:v,...]
|
|
927
|
+
Types: ${Mn.join(" | ")}`),{success:!1,error:"Missing args"};let o=jw(e);if(!o.ok)return g.fail(o.error),{success:!1,error:o.error};let{type:i,content:a}=o,l=Un(a);if(l.length>0&&!s.force){let f=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${f}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Aw(s.tags),d=await po(t);if(!d.ok)return d.result;let m=await F.getCurrentTask(d.value);await qt.remember(t,{type:i,content:a,tags:u,source:m?.id});let{regenerateWikiDeferred:p}=await Promise.resolve().then(()=>(Gn(),Wn));return await p(t,d.value),s.md?console.log(`\u2713 remembered ${i}: ${a}`):g.done(`remembered ${i}`),{success:!0,type:i,content:a,tags:u}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}};function Rw(n){let e=n.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let s=t.indexOf(":");return s<=0?null:[t.slice(0,s),t.slice(s+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}c(Rw,"parseTagPairs");function Aw(n){if(!n)return{};let e={};for(let t of n.split(",")){let s=t.trim(),r=s.indexOf(":");r>0&&(e[s.slice(0,r)]=s.slice(r+1))}return e}c(Aw,"parseFlagTags");function jw(n){let e=n.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let s=e.slice(0,t).toLowerCase().trim();if(!s||!/^[a-z][a-z0-9-]*$/.test(s))return{ok:!1,error:`invalid type '${s}'. Lowercase letters + dashes only. Base types: ${Mn.join(", ")}`};let r=s,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:r,content:o}:{ok:!1,error:"content is required"}}c(jw,"parseRememberArgs");async function xw(n,e){try{let{default:t}=await Promise.resolve().then(()=>(he(),ol)),s=t.query(n,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${Js}`);for(let r of s)try{let o=JSON.parse(r.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}c(xw,"readLastStatus");ba();Pa();q();Re();Fe();var rn=class extends re{static{c(this,"SeedCommands")}async seed(e=null,t=process.cwd(),s={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list",i=r.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,s);case"remove":return this.remove(i||null,t,s);case"list":return this.list(null,t,s);case"suggest":return this.suggest(null,t,s);default:return g.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),s={}){try{if(!e)return g.info(`Usage: prjct seed add <pack>[,<pack>...]
|
|
928
928
|
Available: ${va.join(", ")}`),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await Ta(t,r,{suggestPersona:s.suggestPersona??!1}),i=`activated: ${o.activated.join(", ")||"none"}${o.skipped.length?` \u2022 unknown: ${o.skipped.join(", ")}`:""}`;return s.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async remove(e=null,t=process.cwd(),s={}){try{if(!e)return g.info("Usage: prjct seed remove <pack>[,<pack>...]"),{success:!1,error:"No pack given"};let r=e.split(",").map(a=>a.trim()).filter(Boolean),o=await Ea(t,r),i=`deactivated: ${o.deactivated.join(", ")||"none"}${o.notActive.length?` \u2022 not active: ${o.notActive.join(", ")}`:""}`;return s.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async list(e=null,t=process.cwd(),s={}){try{let r=await Ca(t);if(r.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${va.join(", ")}`;return s.md?console.log(`> ${o}`):g.info(o),{success:!0,active:[]}}if(s.md){let o=["# Active packs",""];for(let i of r)o.push(`## ${i.name}`),o.push(i.description),o.push(`- memory types: ${i.memoryTypes.join(", ")||"\u2014"}`),o.push(`- workflow slots: ${i.slots.join(", ")||"\u2014"}`),o.push("");console.log(o.join(`
|
|
929
929
|
`))}else for(let o of r)g.info(`${o.name}: ${o.description}`),g.info(` memory: ${o.memoryTypes.join(", ")||"\u2014"}`),g.info(` slots: ${o.slots.join(", ")||"\u2014"}`);return{success:!0,active:r}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}async suggest(e=null,t=process.cwd(),s={}){try{let r=await Sa(t),o=r.map(i=>{let a=ps[i];return{name:i,description:a?.description??""}});if(s.md){let i=["# Suggested packs for this project",""];for(let a of o)i.push(`- **${a.name}** \u2014 ${a.description}`);i.push(""),i.push(`Activate with: \`prjct seed add ${r.join(",")}\``),console.log(i.join(`
|
|
930
|
-
`))}else g.info(`Suggested: ${r.join(", ")}`),g.info(`Activate: prjct seed add ${r.join(",")}`);return{success:!0,suggested:r}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}};
|
|
930
|
+
`))}else g.info(`Suggested: ${r.join(", ")}`),g.info(`Activate: prjct seed add ${r.join(",")}`);return{success:!0,suggested:r}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}};Rt();Ce();je();Dr();import Vw from"node:fs/promises";import Bw from"node:http";import Jw from"node:path";import J from"chalk";je();Y();import $w from"node:fs/promises";import Dw from"node:path";var Sm="https://api.prjct.app",bm={apiKey:null,apiUrl:Sm,userId:null,email:null,lastAuth:null},nc=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=j.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await pe(this.configPath);return this.cachedConfig=e??{...bm},this.cachedConfig}async write(e){let s={...await this.read(),...e,lastAuth:new Date().toISOString()};await ft(Dw.dirname(this.configPath)),await ce(this.configPath,s),await $w.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||Sm}async saveAuth(e,t,s){await this.write({apiKey:e,userId:t,email:s})}async clearAuth(){this.cachedConfig={...bm},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}},Iw=new nc,Ue=Iw;Mr();var _w={task:"tasks",idea:"ideas",feature:"roadmap_features",shipped:"shipped_items",queue:"queue_tasks",project:"projects",session:"sessions",agent:"agents"};function Nw(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}c(Nw,"camelToSnake");function Mw(n){let e={};for(let[t,s]of Object.entries(n))e[Nw(t)]=s;return e}c(Mw,"snakeCaseKeys");function Ow(n,e){let[t,s]=e.type.split("."),r=_w[t];if(!r)return null;let i=s==="deleted"?"delete":"upsert",a=e.data||{},l=Mw(a),u=l.id||a.id||"";return{event_type:i,entity_type:r,entity_id:u,data:{...l,project_id:n},project_id:n}}c(Ow,"mapCliEventToWebFormat");function Tm(n,e){return e.map(t=>Ow(n,t)).filter(t=>t!==null)}c(Tm,"mapCliEventsToWebFormat");var rc=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:s,apiKey:r}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=Tm(e,t),i=await this.fetchWithRetry(`${s}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json","X-Api-Key":r},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:r}=await this.getAuthHeaders();if(!r)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":r},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 r=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{"X-Api-Key":s}});if(!r.ok)throw await this.parseErrorResponse(r);return await r.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ms("API_REQUEST"));try{let{apiUrl:s,apiKey:r}=await this.getAuthHeaders();if(!r)return clearTimeout(t),!1;let o=await fetch(`${s}/health`,{method:"GET",headers:{"X-Api-Key":r},signal:e.signal});return clearTimeout(t),o.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Ue.hasAuth()}async getAuthHeaders(){let[e,t]=await Promise.all([Ue.getApiUrl(),Ue.getApiKey()]);return{apiUrl:e,apiKey:t}}async fetchWithRetry(e,t,s=0){let r=new AbortController,o=setTimeout(()=>r.abort(),Ms("API_REQUEST"));try{let i=await fetch(e,{...t,signal:r.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: ${Ms("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))}},on=new rc;Qo();$i();Hi();Rn();rt();var oc=class{static{c(this,"SyncManager")}async hasAuth(){return await Ue.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await on.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 r=await this.pull(e);return r.success&&!r.skipped&&(t.pulled={count:r.count||0,syncedAt:r.syncedAt||new Date().toISOString()}),(!s.success||!r.success)&&(t.success=!1,t.error=s.error||r.error),t}async push(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let t=await Ft.getPending(e);if(t.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let s=await this.createProjectLinkEvent(e),r=s?[s,...t]:t,o=await on.pushEvents(e,r);if(o.success)return await Ft.clearPending(e),await Ft.updateLastSync(e),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let i=o.processed,a=o.errors.length,l=o.errors.map(u=>u.error).join(", ");return{success:!1,skipped:!1,count:i,syncedAt:o.syncedAt,error:`${a} events failed: ${l}`}}}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 Ft.getLastSync(e))?.timestamp,r=await on.pullEvents(e,s);if(r.events.length===0)return{success:!0,skipped:!1,count:0,applied:0,syncedAt:r.syncedAt};let o=await this.applyPulledEvents(e,r.events);return await Ft.updateLastSync(e),{success:!0,skipped:!1,count:r.events.length,applied:o,syncedAt:r.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 r of t)try{await this.applyEvent(e,r),s++}catch(o){let i=r.entity_type||r.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return s}async applyEvent(e,t){let s,r,o;if(t.entity_type)s=t.entity_type,r=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,r=a==="deleted"?"delete":"upsert",o=t.data||{}}if(r!=="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 F.update(e,r=>!r.currentTask||t.id!==r.currentTask.id?{...r,currentTask:{id:t.id,description:t.description,startedAt:t.started_at||t.startedAt,sessionId:t.session_id||t.sessionId||""}}:r):s==="completed"?await F.update(e,r=>r.currentTask?.id===t.id?{...r,currentTask:null}:r):await Fs.addTask(e,{description:t.description,priority:t.priority||"medium",type:t.type||"feature",section:"backlog"})}async applyIdeaUpsert(e,t){(t.status||"active")==="archived"?await Os.update(e,r=>({...r,ideas:r.ideas.map(o=>o.id===t.id?{...o,status:"archived"}:o)})):await Os.addIdea(e,t.title||t.text||"",{priority:t.priority||"medium"})}async applyShippedUpsert(e,t){await At.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""})}async applyQueueUpsert(e,t){await Fs.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}}},Lw=new oc,Em=Lw;q();Me();Y();import Hw from"node:fs/promises";import Pm from"node:os";import fo from"node:path";hr();import Cm from"node:fs";import go from"node:path";function Fw(n){if(fr()){let{Database:r}=Te("bun:sqlite");return new r(n,{create:!0})}let e=Te("better-sqlite3"),t=new e(n),s=t.exec.bind(t);return t.run=r=>s(r),t}c(Fw,"openDatabase");var ic=class{static{c(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),t=e?go.resolve(e):go.join(Te("node:os").homedir(),".prjct-cli");this.dbPath=go.join(t,"system.db")}getDb(){if(this.db)return this.db;let e=go.dirname(this.dbPath);Cm.existsSync(e)||Cm.mkdirSync(e,{recursive:!0});let t=Fw(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(`
|
|
931
931
|
CREATE TABLE IF NOT EXISTS _system_migrations (
|
|
932
932
|
version INTEGER PRIMARY KEY,
|
|
933
933
|
name TEXT NOT NULL,
|
|
@@ -948,7 +948,7 @@ Available: ${va.join(", ")}`),{success:!1,error:"No pack given"};let r=e.split("
|
|
|
948
948
|
INSERT OR REPLACE INTO mcp_health
|
|
949
949
|
(provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
|
|
950
950
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
951
|
-
`).run(e,t.status,r,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,r)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},Uw=new ic;q();Y();var ho="mcp-remote@0.1.38";function Ww(){try{let n=fo.dirname(Te.resolve("prjct-cli/package.json"));return{command:"node",args:[fo.join(n,"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)"}}}c(Ww,"getPrjctMcpConfig");var ac={prjct:Ww(),linear:{command:"npx",args:["-y",ho,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",ho,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},
|
|
951
|
+
`).run(e,t.status,r,t.lastError??null,t.tokenVersion??null,t.configValid?1:0,t.oauthValid?1:0,r)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},Uw=new ic;q();Y();var ho="mcp-remote@0.1.38";function Ww(){try{let n=fo.dirname(Te.resolve("prjct-cli/package.json"));return{command:"node",args:[fo.join(n,"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)"}}}c(Ww,"getPrjctMcpConfig");var ac={prjct:Ww(),linear:{command:"npx",args:["-y",ho,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",ho,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},YD={linear:`npx -y ${ho} https://mcp.linear.app/mcp`,jira:`npx -y ${ho} https://mcp.atlassian.com/v1/mcp`};function vs(){return process.env.PRJCT_TEST_MODE==="1"?fo.join(Pm.tmpdir(),"prjct-context7-test","mcp.json"):fo.join(Pm.homedir(),".claude","mcp.json")}c(vs,"getClaudeMcpConfigPath");async function Rm(n=vs()){try{let e=await Hw.readFile(n,"utf-8");return JSON.parse(e)}catch(e){let t=y(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${n}: ${y(e)}`)}}c(Rm,"readMcpConfig");async function Gw(n,e=vs()){await ce(e,n)}c(Gw,"writeMcpConfig");async function cc(n,e,t=vs()){let s=await Rm(t),r={...s.mcpServers||{}},o=r[n];r[n]=e,s.mcpServers=r;let i=JSON.stringify(o)!==JSON.stringify(e);return await Gw(s,t),{path:t,changed:i}}c(cc,"upsertMcpServer");async function lc(n,e=vs()){return!!(await Rm(e)).mcpServers?.[n]}c(lc,"hasMcpServer");Re();st();Fe();var an=class extends re{static{c(this,"SetupCommands")}async auth(e=null,t={}){let s=e?.split(" ")[0]||"status",r=e?.split(" ").slice(1)||[];switch(s){case"login":{let o=r[0];if(!o)return t.md||g.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=r.indexOf("--url");return a!==-1&&r[a+1]&&(i=r[a+1]),await Ue.write({apiKey:o,...i?{apiUrl:i}:{}}),await on.testConnection()?(t.md||(g.done("Connected! API key saved"),g.info(J.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
|
|
952
952
|
- **Status**: Connected
|
|
953
953
|
- **Key**: \`${o.substring(0,12)}...\`
|
|
954
954
|
- **API**: ${i||"default"}`:""}):(t.md||(g.warn("API key saved, but server is unreachable"),g.info(J.dim(`Key: ${o.substring(0,12)}...`)),g.info(J.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
|
|
@@ -971,7 +971,7 @@ Status: Connected`)),await this.autoSync(),r({success:!0,message:e.md?`## Authen
|
|
|
971
971
|
- **Email**: ${d}
|
|
972
972
|
- **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||g.fail("Authentication failed: no API key received"),r({success:!1,message:e.md?`## Error
|
|
973
973
|
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||g.fail("Failed to start callback server"),r({success:!1,message:e.md?`## Error
|
|
974
|
-
Failed to start callback server`:""});return}let a=i.port,l=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(J.dim(l));let u=process.platform,d=u==="darwin"?`open "${l}"`:u==="win32"?`start "${l}"`:`xdg-open "${l}"`;try{await _(d)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${l}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${J.cyan("prjct login")} to try again`)),r({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},5*60*1e3)})}async logout(){return(await Ue.getStatus()).authenticated?(await Ue.clearAuth(),g.done("Logged out"),{success:!0,message:""}):(g.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await $.getProjectId(process.cwd());if(!e)return;g.spin("Syncing project...");let t=await
|
|
974
|
+
Failed to start callback server`:""});return}let a=i.port,l=`${s}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(J.dim(l));let u=process.platform,d=u==="darwin"?`open "${l}"`:u==="win32"?`start "${l}"`:`xdg-open "${l}"`;try{await _(d)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${l}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${J.cyan("prjct login")} to try again`)),r({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},5*60*1e3)})}async logout(){return(await Ue.getStatus()).authenticated?(await Ue.clearAuth(),g.done("Logged out"),{success:!0,message:""}):(g.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await $.getProjectId(process.cwd());if(!e)return;g.spin("Syncing project...");let t=await Em.sync(e);if(g.stop(),t.success&&!t.skipped){let s=t.pushed?.count||0,r=t.pulled?.count||0;s>0||r>0?g.done(`Synced (${s} pushed, ${r} pulled)`):g.done("Synced \u2014 everything up to date")}}catch{g.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
|
|
975
975
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
976
976
|
<title>prjct CLI Connected</title>
|
|
977
977
|
<style>
|
|
@@ -1026,22 +1026,22 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
|
|
|
1026
1026
|
<h1>Authentication Failed</h1>
|
|
1027
1027
|
<div class="msg">${e}</div>
|
|
1028
1028
|
<p class="hint">Return to your terminal and try again.</p>
|
|
1029
|
-
</div></body></html>`}async start(){let e=await
|
|
1029
|
+
</div></body></html>`}async start(){let e=await ye.checkInstallation(),t=(Ve(),et(yt)),s=await t.detectCodex(),r=e.providerDetected,o=r?await t.getActiveProvider():null,i=r?o.displayName:"OpenAI Codex";if(console.log(`\u{1F680} Setting up prjct for ${i}...
|
|
1030
1030
|
`),!r&&!s.installed)return{success:!1,message:`\u274C No supported AI provider detected.
|
|
1031
1031
|
|
|
1032
1032
|
Please install one first:
|
|
1033
1033
|
- Claude Code: https://docs.anthropic.com/claude-code
|
|
1034
1034
|
- Gemini CLI: https://geminicli.com/docs
|
|
1035
|
-
- OpenAI Codex: https://github.com/openai/codex`};if(r){console.log("\u{1F4E6} Installing /p:* commands...");let a=await
|
|
1035
|
+
- OpenAI Codex: https://github.com/openai/codex`};if(r){console.log("\u{1F4E6} Installing /p:* commands...");let a=await ye.installCommands();if(!a.success)return{success:!1,message:`\u274C Installation failed: ${a.error}`};if(console.log(`
|
|
1036
1036
|
\u2705 Installed ${a.installed?.length??0} commands to:
|
|
1037
1037
|
${j.getDisplayPath(a.path||"")}`),(a.errors?.length??0)>0){console.log(`
|
|
1038
1038
|
\u26A0\uFE0F ${a.errors?.length??0} errors:`);for(let l of a.errors??[])console.log(` - ${l.file}: ${l.error}`)}}if(s.installed)try{let{installCodexSkill:a,verifyCodexPRouterReady:l}=await Promise.resolve().then(()=>(Ur(),ji));await a();let u=await l({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(`
|
|
1039
1039
|
\u{1F389} Setup complete!`),console.log(`
|
|
1040
1040
|
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...
|
|
1041
|
-
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await
|
|
1041
|
+
`),e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await ye.uninstallCommands()),console.log("\u{1F4E6} Installing /p:* commands...");let t=await ye.installCommands();if(!t.success)return{success:!1,message:`\u274C Setup failed: ${t.error}`};if(console.log(`
|
|
1042
1042
|
\u2705 Installed ${t.installed?.length??0} commands`),(t.errors?.length??0)>0){console.log(`
|
|
1043
1043
|
\u26A0\uFE0F ${t.errors?.length??0} errors:`);for(let l of t.errors??[])console.log(` - ${l.file}: ${l.error}`)}console.log(`
|
|
1044
|
-
\u{1F4DD} Installing global configuration...`);let s=await
|
|
1044
|
+
\u{1F4DD} Installing global configuration...`);let s=await ye.installGlobalConfig(),r=s.path?j.getDisplayPath(s.path):"global config";s.success?s.action==="created"?console.log(`\u2705 Created ${r}`):s.action==="updated"?console.log(`\u2705 Updated ${r}`):s.action==="appended"&&console.log(`\u2705 Added prjct config to ${r}`):console.log(`\u26A0\uFE0F ${s.error}`);let o=(Ve(),et(yt)),i=await o.getActiveProvider(),a=await o.detectCodex();if(i.name==="claude"){console.log(`
|
|
1045
1045
|
\u26A1 Installing status line...`);let l=await this.installStatusLine();l.success?console.log("\u2705 Status line configured"):console.log(`\u26A0\uFE0F ${l.error}`)}if(a.installed)try{let{installCodexSkill:l,verifyCodexPRouterReady:u}=await Promise.resolve().then(()=>(Ur(),ji));await l();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(l){console.log(`\u26A0\uFE0F Codex skill setup failed (non-blocking): ${y(l)}`)}return await this.setupMcpServers(),console.log(`
|
|
1046
1046
|
\u{1F389} Setup complete!
|
|
1047
1047
|
`),this.showAsciiArt(),{success:!0,message:""}}async setupMcpServers(){console.log(`
|
|
@@ -1101,8 +1101,8 @@ fi
|
|
|
1101
1101
|
|
|
1102
1102
|
# Default: show prjct branding
|
|
1103
1103
|
echo "\u26A1 prjct"
|
|
1104
|
-
`;await Vw.writeFile(s,r,{mode:493});let o={};if(await S(t))try{o=await
|
|
1105
|
-
`,"utf-8"),await zt.mkdir(cn.dirname(i),{recursive:!0});let a=Kw(r),l="";try{l=await zt.readFile(i,"utf-8")}catch{}let u=Yw(l,a,
|
|
1104
|
+
`;await Vw.writeFile(s,r,{mode:493});let o={};if(await S(t))try{o=await pe(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(J.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(J.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(J.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(J.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(J.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(J.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(J.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(` ${J.bold.cyan("prjct")}${J.magenta("/")}${J.green("cli")} ${J.dim.white(`v${me} installed`)}`),console.log(""),console.log(` ${J.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${J.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${J.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(J.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(J.bold.cyan("\u{1F680} Quick Start")),console.log(J.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(` ${J.bold("1.")} Initialize your project:`),console.log(` ${J.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${J.bold("2.")} Start your first task:`),console.log(` ${J.green('prjct task "build auth"')}`),console.log(""),console.log(` ${J.bold("3.")} Ship & celebrate:`),console.log(` ${J.green('prjct ship "user login"')}`),console.log(""),console.log(J.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(` ${J.dim("Documentation:")} ${J.cyan("https://prjct.app")}`),console.log(` ${J.dim("Report issues:")} ${J.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(J.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}};co();q();Wt();Re();st();Fe();import{exec as qw}from"node:child_process";import zt from"node:fs/promises";import cn from"node:path";import{promisify as zw}from"node:util";var uc=zw(qw),Am="<!-- prjct-team:start - DO NOT REMOVE THIS MARKER -->",jm="<!-- prjct-team:end - DO NOT REMOVE THIS MARKER -->",ln=class extends re{static{c(this,"TeamCommands")}async team(e=null,t=process.cwd(),s={}){try{let r={required:s.required===!0,minVersion:s.minVersion??me??"0.0.0",enrolledAt:new Date().toISOString()},o=cn.join(t,".prjct","team.json"),i=cn.join(t,".claude","CLAUDE.md");await zt.mkdir(cn.dirname(o),{recursive:!0}),await zt.writeFile(o,`${JSON.stringify(r,null,2)}
|
|
1105
|
+
`,"utf-8"),await zt.mkdir(cn.dirname(i),{recursive:!0});let a=Kw(r),l="";try{l=await zt.readFile(i,"utf-8")}catch{}let u=Yw(l,a,Am,jm);await zt.writeFile(i,u,"utf-8");let d=!1,m=[o,i];try{await uc("git rev-parse --show-toplevel",{cwd:t});let P=null;s.enforce===!0&&(P=cn.join(t,".githooks","pre-commit"),await zt.mkdir(cn.dirname(P),{recursive:!0}),await zt.writeFile(P,Xw,"utf-8"),await zt.chmod(P,493),await uc("git config core.hooksPath .githooks",{cwd:t}),m.push(P)),await uc(`git add ${m.map(k=>JSON.stringify(k)).join(" ")}`,{cwd:t}),d=!0}catch{}let p=s.enforce?" + pre-commit enforce":"",f=`${r.required?"\u2713 team mode (required)":"\u2713 team mode (optional)"}${p} \u2014 minVersion ${r.minVersion}`,h=d?`Staged: ${m.map(P=>P.replace(`${t}/`,"")).join(", ")}`:"Files written but not staged (no git repo or git missing).",E=["1. Review the diff: `git diff --staged`",'2. Commit: `git commit -m "chore: enroll repo in prjct team mode"`',"3. Push: `git push`","4. Teammates run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` (or `npm install -g prjct-cli@latest`).",...s.enforce?["5. **Each teammate** runs `git config core.hooksPath .githooks` once (or `prjct team --enforce` to do it automatically)."]:[]].join(`
|
|
1106
1106
|
`);return s.md?console.log(N(O("Team mode enrolled",f),O("Files",h),O("Next",E))):(g.done(f),console.log(h),console.log(`
|
|
1107
1107
|
Next steps:`),console.log(E)),{success:!0,teamConfig:r,staged:d,teamPath:o,claudeMdPath:i}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}},Xw=`#!/usr/bin/env sh
|
|
1108
1108
|
# prjct team enforce \u2014 blocks commits when team.json says required:true
|
|
@@ -1128,7 +1128,7 @@ if ! command -v prjct >/dev/null 2>&1; then
|
|
|
1128
1128
|
fi
|
|
1129
1129
|
|
|
1130
1130
|
exit 0
|
|
1131
|
-
`;function Kw(n){return[
|
|
1131
|
+
`;function Kw(n){return[Am,"# prjct (team mode)","",`This repo is enrolled in prjct team mode (required: ${n.required}, minVersion: ${n.minVersion}, enrolled: ${n.enrolledAt}).`,"","When working in this repo:","- prjct stores project memory (decisions, learnings, gotchas, patterns) per project.","- The vault lives at `~/Documents/prjct/<slug>/_generated/`.","- Always lookup the vault before re-reading source for project context.",'- Capture substantive analysis back via `prjct remember <type> "..."`.',"","Don't have prjct? Install once: `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash`",`${n.required?"This repo *requires* prjct \u2014 please install before contributing.":""}`,jm].filter(e=>e!=="").join(`
|
|
1132
1132
|
`)}c(Kw,"teamClaudeMdBlock");function Yw(n,e,t,s){if(!n.trim())return`${e}
|
|
1133
1133
|
`;let r=n.indexOf(t),o=n.indexOf(s);if(r>=0&&o>r){let a=n.slice(0,r),l=n.slice(o+s.length);return`${a}${e}${l}`.replace(/\n{3,}/g,`
|
|
1134
1134
|
|
|
@@ -1136,11 +1136,11 @@ exit 0
|
|
|
1136
1136
|
`}return`${n.replace(/\s+$/,"")}
|
|
1137
1137
|
|
|
1138
1138
|
${e}
|
|
1139
|
-
`}c(Yw,"upsertBetweenMarkers");
|
|
1139
|
+
`}c(Yw,"upsertBetweenMarkers");Rt();Ri();je();la();Oi();q();Re();st();Fe();import{execSync as bs}from"node:child_process";import mc from"node:fs/promises";import nk from"node:os";import bt from"node:path";import dn from"chalk";function Mm(){try{return!!bs("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})}catch{return!1}}c(Mm,"isHomebrewInstall");var rk=nk.homedir(),St={npm:{name:"npm",installArgs:["install","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return bs("npm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},pnpm:{name:"pnpm",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return bs("pnpm root -g",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}},"getInstallRoot")},bun:{name:"bun",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>bt.join(rk,".bun","install","global","node_modules"),"getInstallRoot")},yarn:{name:"yarn",installArgs:["global","add","prjct-cli@latest"],getInstallRoot:c(()=>{try{let n=bs("yarn global dir",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return bt.join(n,"node_modules")}catch{return null}},"getInstallRoot")}};function gc(n){try{return bs(`command -v ${n}`,{stdio:"pipe",shell:"/bin/sh"}),!0}catch{return!1}}c(gc,"isOnPath");function ok(){let n=[process.argv[1],process.execPath].filter(Boolean);for(let e of n){let t=e;try{t=Te("node:fs").realpathSync(e)}catch{}if(t.includes("/.bun/install/global")||t.includes("/.bun/bin/"))return"bun";if(t.includes("/Library/pnpm/")||t.includes("/.pnpm/")||t.includes("/.local/share/pnpm/"))return"pnpm";if(t.includes("/.yarn/")||t.includes("/yarn/global"))return"yarn"}return null}c(ok,"detectInstallerFromRunningBinary");function pc(){let n=ok();if(n&&gc(n))return St[n];for(let e of["bun","pnpm","npm","yarn"])if(gc(e))return St[e];throw new Error("No supported package manager found in PATH (tried npm, pnpm, bun, yarn). Install one and re-run, or upgrade manually: bun add -g prjct-cli@latest")}c(pc,"selectPackageManager");function Om(){let n=[];for(let e of[St.bun,St.pnpm,St.npm,St.yarn]){let t=e.getInstallRoot();if(!t)continue;let s=bt.join(t,"prjct-cli","package.json");try{let r=JSON.parse(Te("node:fs").readFileSync(s,"utf-8"));r?.name==="prjct-cli"&&typeof r.version=="string"&&n.push({pm:e,version:r.version})}catch{}}return n}c(Om,"getAllInstalledLocations");var mn=class extends re{static{c(this,"UpdateCommands")}async update(e={},t=process.cwd()){let s=e["dry-run"]===!0,r=e.md===!0,o={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(r||g.step(1,3,"Updating package..."),o.phase1=await this.phasePackageUpdate(s),r||g.stop(),!s&&o.phase1.success&&this.redirectToInstalledPackage(),r||g.step(2,3,"Cleaning up all projects..."),o.phase2=await this.phaseGlobalCleanup(s),r||g.stop(),r||g.step(3,3,"Restarting daemon..."),o.phase3=await this.phaseDaemonRestart(s),r||g.stop(),!s){try{await Or.updateVersion(me)}catch{}try{await new Jr().writeCache({lastCheck:0,latestVersion:""})}catch{}}return r?this.formatMdOutput(o,s):this.formatTerminalOutput(o,s)}catch(i){return r||g.stop(),g.fail(y(i)),{success:!1,error:y(i)}}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},s=Om();if(e){if(Mm()){let o;try{o=pc().name}catch(i){o="<none-available>",t.errors.push(y(i))}t.details.push("Would uninstall homebrew formula"),t.details.push(`Would install via ${o}`)}else if(s.length===0){let o;try{o=pc().name}catch(i){o="<none-available>",t.errors.push(y(i))}t.details.push(`Would install via ${o}`)}else for(let{pm:o,version:i}of s)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(Mm())try{bs("brew uninstall prjct-cli 2>/dev/null",{stdio:"pipe"}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}let o;s.length>0?o=s.map(d=>d.pm):o=[pc()];for(let d of o){if(!gc(d.name)){t.errors.push(`${d.name} is not on PATH but has a prjct-cli install. Either install ${d.name} or remove that copy.`);continue}try{bs([d.name,...d.installArgs].join(" "),{stdio:"pipe"}),t.details.push(`${d.name} install complete`)}catch(m){t.errors.push(`${d.name}: ${y(m)}`)}}let i=Om(),a=new Map(s.map(d=>[d.pm.name,d.version])),l=[],u=!1;for(let{pm:d,version:m}of i){let p=a.get(d.name);p&&p!==m?(l.push(`${d.name}: ${p} \u2192 ${m}`),u=!0):p||(l.push(`${d.name}: installed v${m}`),u=!0)}if(l.length>1)for(let d of l)t.details.push(d);else l.length===1?t.details.push(l[0]):i.length>0&&t.details.push(`v${i[0].version} (already latest)`)}catch(r){t.success=!1,t.errors.push(y(r))}return t}async phaseGlobalCleanup(e){let t={success:!0,details:[],errors:[]},s=await this.getAllProjectIds();if(s.length===0)t.details.push("No projects found");else{let r=0,o=0;for(let i of s)if(!e)try{let a=await Hr(i),l=await Wr(i);if(r+=a.migratedFiles.length,o+=l,a.errors.length>0)for(let u of a.errors)t.errors.push(`${i.slice(0,8)}: ${u.file}: ${u.error}`)}catch(a){t.errors.push(`${i.slice(0,8)}: ${y(a)}`)}if(e)t.details.push(`Would migrate ${s.length} project(s)`);else{let i=[`${s.length} project(s) checked`];r>0&&i.push(`${r} files migrated`),o>0&&i.push(`${o} leftovers swept`),t.details.push(i.join(", "))}}if(e)t.details.push("Would 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 vt().cleanupAllLegacy();o.cleaned.length>0&&t.details.push(`Cleaned ${o.cleaned.length} legacy artifact(s)`)}catch(r){t.errors.push(`Legacy cleanup: ${y(r)}`)}try{let o=await new vt().installCommands();t.details.push(`Editor commands reinstalled (${o.installed?.length||0} providers)`)}catch(r){t.errors.push(`Commands: ${y(r)}`)}try{await new vt().installGlobalConfig(),t.details.push("Global config updated (prjct section replaced)")}catch(r){t.errors.push(`Global config: ${y(r)}`)}try{let{detectAllProviders:r}=await Promise.resolve().then(()=>(Ve(),yt)),o=await r(),i=bt.join(Te("node:os").homedir());if(o.gemini.installed){let a=bt.join(i,".gemini","GEMINI.md");try{let l=await mc.readFile(a,"utf-8"),u="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",d="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(l.includes(u)&&l.includes(d)){let{getTemplateContent:m}=await Promise.resolve().then(()=>(_s(),yi)),p=m("global/GEMINI.md");if(p?.includes(u)&&p.includes(d)){let f=p.substring(p.indexOf(u),p.indexOf(d)+d.length),h=l.substring(0,l.indexOf(u)),E=l.substring(l.indexOf(d)+d.length),P=h+f+E,k="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",I="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(P.includes(k)&&P.includes(I)){let C=P.substring(0,P.indexOf(k)),te=P.substring(P.indexOf(I)+I.length);P=`${(C+te).replace(/\n{3,}/g,`
|
|
1140
1140
|
|
|
1141
1141
|
`).trim()}
|
|
1142
|
-
`}await mc.writeFile(a,P,"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:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(
|
|
1143
|
-
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}redirectToInstalledPackage(){try{let{existsSync:e,realpathSync:t,readFileSync:s}=Te("node:fs"),r=(()=>{try{return t(
|
|
1142
|
+
`}await mc.writeFile(a,P,"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:r,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Nm(),_m));await s()?(await r()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)")),await i()?t.details.push("Daemon restarted"):t.details.push("Daemon will start automatically on next use")}catch(s){t.success=!1,t.errors.push(y(s))}return t}formatTerminalOutput(e,t){let s=e.phase1.success&&e.phase2.success,r=[...e.phase1.errors,...e.phase2.errors];console.log("");let o=[{label:"Package",result:e.phase1,fatal:!0},{label:"Cleanup",result:e.phase2,fatal:!0},{label:"Daemon",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:l}of o){let u=a.success?dn.green("\u2713"):l?dn.red("\u2717"):dn.yellow("\u26A0");console.log(` ${u} ${dn.bold(i)}`);for(let d of a.details)console.log(` ${dn.dim(d)}`);for(let d of a.errors)console.log(` ${dn.yellow("\u26A0")} ${d}`)}return console.log(""),t?g.done("Dry run complete \u2014 no changes made"):s?g.done("System updated"):g.warn(`Updated with ${r.length} error(s)`),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}formatMdOutput(e,t){let s=e.phase1.success&&e.phase2.success,r=[];r.push(t?"# Update (Dry Run)":"# System Update"),r.push("");let o=[{label:"Package Update",result:e.phase1,fatal:!0},{label:"Global Cleanup",result:e.phase2,fatal:!0},{label:"Daemon Restart",result:e.phase3,fatal:!1}];for(let{label:i,result:a,fatal:l}of o){let u=a.success?"OK":l?"FAILED":"WARNING";r.push(`## ${i} (${u})`);for(let d of a.details)r.push(`- ${d}`);for(let d of a.errors)r.push(`- WARNING: ${d}`);r.push("")}return t||r.push(s?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(r.join(`
|
|
1143
|
+
`)),{success:s,message:t?"Dry run complete":s?"System updated":"Updated with errors"}}redirectToInstalledPackage(){try{let{existsSync:e,realpathSync:t,readFileSync:s}=Te("node:fs"),r=(()=>{try{return t(bt.resolve(__dirname,"..",".."))}catch{return""}})(),o=[St.bun.getInstallRoot(),St.pnpm.getInstallRoot(),St.npm.getInstallRoot(),St.yarn.getInstallRoot()].filter(i=>!!i);for(let i of o){let a=bt.join(i,"prjct-cli"),l=bt.join(a,"package.json");if(!e(l))continue;let u=a;try{u=t(a)}catch{}if(r&&u===r)continue;try{if(JSON.parse(s(bt.join(u,"package.json"),"utf-8"))?.name!=="prjct-cli")continue}catch{continue}Ro(u);let{resetBundle:d}=(_s(),et(yi));d();return}}catch{}}async getAllProjectIds(){let e=bt.join(j.getGlobalBasePath(),"projects");try{return(await mc.readdir(e,{withFileTypes:!0})).filter(s=>s.isDirectory()&&!s.name.startsWith(".")).map(s=>s.name)}catch{return[]}}};Ce();q();Y();import fc from"node:fs/promises";import ik from"node:os";import wo from"node:path";var hc=class{static{c(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=wo.join(ik.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await fc.mkdir(this.commandsPath,{recursive:!0});let s=wo.join(this.commandsPath,`${e}.md`),r=this.buildTemplateContent(e,t);return await fc.writeFile(s,r,"utf-8"),{success:!0,path:s}}catch(s){return{success:!1,error:y(s)}}}async deleteWorkflowTemplate(e){try{let t=wo.join(this.commandsPath,`${e}.md`);return await fc.unlink(t),{success:!0}}catch(t){return x(t)?{success:!0}:{success:!1,error:y(t)}}}async templateExists(e){let t=wo.join(this.commandsPath,`${e}.md`);return S(t)}buildTemplateContent(e,t){return`---
|
|
1144
1144
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1145
1145
|
---
|
|
1146
1146
|
|
|
@@ -1176,7 +1176,7 @@ Suggest relevant actions based on the workflow results:
|
|
|
1176
1176
|
- View rules: \`prjct workflow ${e} --md\`
|
|
1177
1177
|
- Add rules: \`prjct workflow add "command" before ${e} --md\`
|
|
1178
1178
|
- Run again: \`p. ${e}\`
|
|
1179
|
-
`}},yc=new hc;ns();ja();ha();it();ds();q();be();Wt();In();Re();ka();Ia();Fe();var ak=[{type:"help",patterns:/^help\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|new)\b/i},{type:"list",patterns:/^list\b/i},{type:"delete",patterns:/^delete\b/i},{type:"run",patterns:/^run\b/i},{type:"disable",patterns:/^disable\b/i},{type:"view",patterns:/^(?:show|view)\b/i}],pn=class extends re{static{c(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return g.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e)return this._showActiveTask(o,s);let i=await Jt(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=/^[A-Z]+-\d+$/.test(e)?e:void 0,l=e,u=Le();await F.startTask(o,{id:u,description:l,sessionId:Le(),linearId:a}),await this.logToMemory(t,"task_started",{task:l,taskId:u,timestamp:b()}),await Jt(o,"task","after",{projectPath:t,skipRules:s.skipHooks});let d=await so(t).catch(()=>"");return s.md?console.log(N($n({description:l,status:"active"}),O("State",Se([`Task: \`${u}\``,d?`Branch: \`${d}\``:null,a?`Linear: \`${a}\``:null,i.instructions.length>0?`Agent instructions: ${i.instructions.length}`:null].filter(m=>m!==null))),i.instructions.length>0?O("Agent Instructions",Se(i.instructions)):null,$e([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(g.done(`Task: ${l}`),Yu("working"),Ws("task")),{success:!0,task:l,taskId:u}}catch(r){let o=y(r);return s.md?console.log(`> ${o}`):g.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t){let s=await F.getCurrentTask(e);if(!s){let r='no active task. `prjct task "<description>"` to start one.';return t.md?console.log(`> ${r}`):g.info(r),{success:!0,message:"no active task"}}return t.md?console.log(N($n({description:s.description,status:"active"}),O("State",Se([`Task: \`${s.id}\``,s.branch?`Branch: \`${s.branch}\``:null,s.linearId?`Linear: \`${s.linearId}\``:null,`Started: ${s.startedAt}`].filter(r=>r!==null))))):g.info(`Active: ${s.description}`),{success:!0,currentTask:s}}async workflow(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):g.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(r){return s.md?console.log(`> Error: ${y(r)}`):g.fail(y(r)),{success:!1,error:y(r)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:r}of ak){let o=t.match(r);if(o){let i=o[0],a=t.slice(i.length).trim();return{type:s,args:a,confidence:"exact"}}}return{type:"view",args:t,confidence:"exact"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(r=>r.action.toLowerCase().includes(s)||(r.description?.toLowerCase().includes(s)??!1)||r.command.toLowerCase().includes(s)||String(r.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let r=t.indexOf('"',1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}if(t.startsWith("'")){let r=t.indexOf("'",1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[r,o]=this._parseAction(e);if(!r||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${m}`):g.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),l=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return s.md?console.log(`> ${m}`):g.warn(m),{success:!1,error:m}}let u=De.getWorkflow(t,l||"");if(!l||!u||!u.enabled){let p=De.getAllWorkflows(t).map(h=>h.name).join(", "),f=`Workflow '${l}' not found. Available: ${p}`;return s.md?console.log(`> ${f}`):g.warn(f),{success:!1,error:f}}let d=Q.addRule(t,{type:"hook",command:l,position:a,action:r,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(N(we("Rule Added",`#${d} [hook] ${a} ${l} \u2192 \`${r}\``),$e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):g.done(`rule #${d} added: [hook] ${a} ${l} \u2192 ${r}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=De.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=De.getAllWorkflows(t).map(f=>f.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${p}`):g.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[l]=this._parseAction(a);if(!l){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):g.warn(d),{success:!1,error:d}}let u=Q.addRule(t,{type:"gate",command:o,position:"before",action:l,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(N(we("Gate Added",`#${u} [gate] before ${o} \u2192 \`${l}\``),$e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):g.done(`gate #${u} added: before ${o} \u2192 ${l}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=De.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=De.getAllWorkflows(t).map(P=>P.name).join(", "),E=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${E}`):g.warn(E),{success:!1,error:E}}let a=e.slice(e.indexOf(o)+o.length).trim(),l=a.match(/^(before|after)\s+/i);if(!l){let f='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${f}`):g.warn(f),{success:!1,error:f}}let u=l[1].toLowerCase(),d=a.slice(l[0].length).trim(),[m]=this._parseAction(d);if(!m){let f='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${f}`):g.warn(f),{success:!1,error:f}}let p=Q.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(N(we("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),$e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):g.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,s){let r=parseInt(e.trim(),10);if(Number.isNaN(r)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):g.warn(i),{success:!1,error:i}}if(!Q.removeRule(t,r)){let i=`Rule #${r} not found`;return s.md?console.log(`> ${i}`):g.warn(i),{success:!1,error:i}}return s.md?console.log(N(we("Rule Removed",`Removed rule #${r}`))):g.done(`removed rule #${r}`),{success:!0}}async _workflowReset(e,t){let s=Q.resetRules(e);return t.md?console.log(N(we("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):g.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let r=e.trim(),o=parseInt(r,10);if(!Number.isNaN(o)){let u=Q.getRuleById(t,o);if(!u){let d=`Rule #${o} not found`;return s.md?console.log(`> ${d}`):g.warn(d),{success:!1,error:d}}if(!u.enabled){let d=`Rule #${o} is already disabled`;return s.md?console.log(`> ${d}`):g.warn(d),{success:!0,message:d}}return Q.updateRule(t,o,{enabled:!1}),s.md?console.log(N(we("Rule Disabled",`#${o} [${u.type}] ${u.action}`),$e([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):g.done(`disabled rule #${o}: ${u.action}`),{success:!0,ruleId:o}}let i=Q.getAllRules(t),a=this._searchRules(i,r);if(a.length===0){let u=`No rules matching "${r}"`;return s.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}if(a.length===1){let u=a[0];return Q.updateRule(t,u.id,{enabled:!1}),s.md?console.log(N(we("Rule Disabled",`#${u.id} [${u.type}] ${u.action}`))):g.done(`disabled rule #${u.id}: ${u.action}`),{success:!0,ruleId:u.id}}let l=a.slice(0,5);if(s.md){let u=l.map(d=>`#${d.id} [${d.type}] ${d.position} ${d.command} -> \`${d.action}\``);a.length>5&&u.push(`...and ${a.length-5} more`),console.log(N(O("Multiple matches",`${a.length} rules match "${r}"`),Se(u),$e(l.map(d=>({label:`Disable #${d.id}`,command:`prjct workflow disable ${d.id} --md`})))))}else{g.warn(`${a.length} rules match "${r}" \u2014 specify an ID:`);for(let u of l)console.log(` #${u.id} [${u.type}] ${u.position} ${u.command} -> ${u.action}`);a.length>5&&console.log(` ...and ${a.length-5} more`)}return{success:!0,matches:a.map(u=>u.id)}}async _workflowHelp(e){return e.md?console.log(N(O("Workflow Help","Manage hooks, gates, and steps for your workflow"),O("Commands",Se(["`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"])),O("Natural Language (EN/ES)",Se(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let r=["task","done","ship","sync"],o;if(e&&r.includes(e)?o=Q.getRulesForCommand(t,e):o=Q.getAllRules(t),o.length===0)return s.md?console.log(N(O("Workflow Rules","No rules configured"),$e([{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'}]))):(g.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:r,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(ck(d,m))}let l=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(N(O(l,u),a.length>0?Ju(a.join(`
|
|
1179
|
+
`}},yc=new hc;ss();ja();ha();rt();ds();q();be();Wt();In();Re();ka();Ia();Fe();var ak=[{type:"help",patterns:/^help\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|new)\b/i},{type:"list",patterns:/^list\b/i},{type:"delete",patterns:/^delete\b/i},{type:"run",patterns:/^run\b/i},{type:"disable",patterns:/^disable\b/i},{type:"view",patterns:/^(?:show|view)\b/i}],pn=class extends re{static{c(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return g.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};if(!e)return this._showActiveTask(o,s);let i=await Jt(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=/^[A-Z]+-\d+$/.test(e)?e:void 0,l=e,u=Le();await F.startTask(o,{id:u,description:l,sessionId:Le(),linearId:a}),await this.logToMemory(t,"task_started",{task:l,taskId:u,timestamp:b()}),await Jt(o,"task","after",{projectPath:t,skipRules:s.skipHooks});let d=await so(t).catch(()=>"");return s.md?console.log(N($n({description:l,status:"active"}),O("State",Se([`Task: \`${u}\``,d?`Branch: \`${d}\``:null,a?`Linear: \`${a}\``:null,i.instructions.length>0?`Agent instructions: ${i.instructions.length}`:null].filter(m=>m!==null))),i.instructions.length>0?O("Agent Instructions",Se(i.instructions)):null,$e([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(g.done(`Task: ${l}`),Yu("working"),Ws("task")),{success:!0,task:l,taskId:u}}catch(r){let o=y(r);return s.md?console.log(`> ${o}`):g.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t){let s=await F.getCurrentTask(e);if(!s){let r='no active task. `prjct task "<description>"` to start one.';return t.md?console.log(`> ${r}`):g.info(r),{success:!0,message:"no active task"}}return t.md?console.log(N($n({description:s.description,status:"active"}),O("State",Se([`Task: \`${s.id}\``,s.branch?`Branch: \`${s.branch}\``:null,s.linearId?`Linear: \`${s.linearId}\``:null,`Started: ${s.startedAt}`].filter(r=>r!==null))))):g.info(`Active: ${s.description}`),{success:!0,currentTask:s}}async workflow(e=null,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):g.failWithHint("NO_PROJECT_ID"),{success:!1,error:"No project ID found"};let i=e?.trim()??"";if(!i)return this._workflowShow(null,o,s);let a=this._detectIntent(i);switch(a.type){case"add":return this._workflowAdd(a.args,o,s);case"gate":return this._workflowGate(a.args,o,s);case"instruction":return this._workflowInstruction(a.args,o,s);case"remove":return this._workflowRm(a.args,o,s);case"disable":return this._workflowDisable(a.args,o,s);case"reset":return this._workflowReset(o,s);case"init":return this._workflowInit(o,t,s);case"help":return this._workflowHelp(s);case"create":return this._workflowCreate(a.args,o,t,s);case"list":return this._workflowList(o,s);case"delete":return this._workflowDelete(a.args,o,s);case"run":return this.run(a.args,t,s);case"view":return this._workflowShow(a.args||null,o,s);default:return this._workflowShow(i.split(/\s+/)[0]?.toLowerCase()||null,o,s)}}catch(r){return s.md?console.log(`> Error: ${y(r)}`):g.fail(y(r)),{success:!1,error:y(r)}}}_detectIntent(e){let t=e.trim();for(let{type:s,patterns:r}of ak){let o=t.match(r);if(o){let i=o[0],a=t.slice(i.length).trim();return{type:s,args:a,confidence:"exact"}}}return{type:"view",args:t,confidence:"exact"}}_searchRules(e,t){let s=t.toLowerCase();return e.filter(r=>r.action.toLowerCase().includes(s)||(r.description?.toLowerCase().includes(s)??!1)||r.command.toLowerCase().includes(s)||String(r.id)===s)}_parseAction(e){let t=e.trim();if(t.startsWith('"')){let r=t.indexOf('"',1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}if(t.startsWith("'")){let r=t.indexOf("'",1);return r===-1?[t.slice(1),""]:[t.slice(1,r),t.slice(r+1).trim()]}let s=t.match(/^(.+?)\s+(before|after)\s+/i);return s?[s[1].trim(),t.slice(s[1].length).trim()]:[t,""]}async _workflowAdd(e,t,s){let[r,o]=this._parseAction(e);if(!r||!o){let m='Usage: prjct workflow add "command" before|after <task|done|ship|sync>';return s.md?console.log(`> ${m}`):g.warn(m),{success:!1,error:m}}let i=o.split(/\s+/),a=i[0]?.toLowerCase(),l=i[1]?.toLowerCase();if(!a||!["before","after"].includes(a)){let m='Position must be "before" or "after"';return s.md?console.log(`> ${m}`):g.warn(m),{success:!1,error:m}}let u=De.getWorkflow(t,l||"");if(!l||!u||!u.enabled){let p=De.getAllWorkflows(t).map(h=>h.name).join(", "),f=`Workflow '${l}' not found. Available: ${p}`;return s.md?console.log(`> ${f}`):g.warn(f),{success:!1,error:f}}let d=Q.addRule(t,{type:"hook",command:l,position:a,action:r,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(N(we("Rule Added",`#${d} [hook] ${a} ${l} \u2192 \`${r}\``),$e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):g.done(`rule #${d} added: [hook] ${a} ${l} \u2192 ${r}`),{success:!0,ruleId:d}}async _workflowGate(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=De.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let m=De.getAllWorkflows(t).map(f=>f.name).join(", "),p=`Workflow '${o}' not found. Available: ${m}`;return s.md?console.log(`> ${p}`):g.warn(p),{success:!1,error:p}}let a=e.slice(e.indexOf(o)+o.length).trim(),[l]=this._parseAction(a);if(!l){let d='Usage: prjct workflow gate <command> "shell command"';return s.md?console.log(`> ${d}`):g.warn(d),{success:!1,error:d}}let u=Q.addRule(t,{type:"gate",command:o,position:"before",action:l,description:null,enabled:!0,timeoutMs:6e4,createdAt:new Date().toISOString(),sortOrder:0});return s.md?console.log(N(we("Gate Added",`#${u} [gate] before ${o} \u2192 \`${l}\``),$e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${u} --md`}]))):g.done(`gate #${u} added: before ${o} \u2192 ${l}`),{success:!0,ruleId:u}}async _workflowInstruction(e,t,s){let o=e.trim().split(/\s+/)[0]?.toLowerCase(),i=De.getWorkflow(t,o||"");if(!o||!i||!i.enabled){let h=De.getAllWorkflows(t).map(P=>P.name).join(", "),E=`Workflow '${o}' not found. Available: ${h}`;return s.md?console.log(`> ${E}`):g.warn(E),{success:!1,error:E}}let a=e.slice(e.indexOf(o)+o.length).trim(),l=a.match(/^(before|after)\s+/i);if(!l){let f='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${f}`):g.warn(f),{success:!1,error:f}}let u=l[1].toLowerCase(),d=a.slice(l[0].length).trim(),[m]=this._parseAction(d);if(!m){let f='Usage: prjct workflow instruction <command> before|after "instruction text"';return s.md?console.log(`> ${f}`):g.warn(f),{success:!1,error:f}}let p=Q.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(N(we("Instruction Added",`#${p} [instruction] ${u} ${o} \u2192 \`${m}\``),$e([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${p} --md`}]))):g.done(`instruction #${p} added: ${u} ${o} \u2192 ${m}`),{success:!0,ruleId:p}}async _workflowRm(e,t,s){let r=parseInt(e.trim(),10);if(Number.isNaN(r)){let i="Usage: prjct workflow rm <rule-id>";return s.md?console.log(`> ${i}`):g.warn(i),{success:!1,error:i}}if(!Q.removeRule(t,r)){let i=`Rule #${r} not found`;return s.md?console.log(`> ${i}`):g.warn(i),{success:!1,error:i}}return s.md?console.log(N(we("Rule Removed",`Removed rule #${r}`))):g.done(`removed rule #${r}`),{success:!0}}async _workflowReset(e,t){let s=Q.resetRules(e);return t.md?console.log(N(we("Rules Reset",`Removed ${s} rule${s!==1?"s":""}`))):g.done(`reset: removed ${s} rule${s!==1?"s":""}`),{success:!0,count:s}}async _workflowDisable(e,t,s){let r=e.trim(),o=parseInt(r,10);if(!Number.isNaN(o)){let u=Q.getRuleById(t,o);if(!u){let d=`Rule #${o} not found`;return s.md?console.log(`> ${d}`):g.warn(d),{success:!1,error:d}}if(!u.enabled){let d=`Rule #${o} is already disabled`;return s.md?console.log(`> ${d}`):g.warn(d),{success:!0,message:d}}return Q.updateRule(t,o,{enabled:!1}),s.md?console.log(N(we("Rule Disabled",`#${o} [${u.type}] ${u.action}`),$e([{label:"Re-enable this rule",command:`prjct workflow enable ${o} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):g.done(`disabled rule #${o}: ${u.action}`),{success:!0,ruleId:o}}let i=Q.getAllRules(t),a=this._searchRules(i,r);if(a.length===0){let u=`No rules matching "${r}"`;return s.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}if(a.length===1){let u=a[0];return Q.updateRule(t,u.id,{enabled:!1}),s.md?console.log(N(we("Rule Disabled",`#${u.id} [${u.type}] ${u.action}`))):g.done(`disabled rule #${u.id}: ${u.action}`),{success:!0,ruleId:u.id}}let l=a.slice(0,5);if(s.md){let u=l.map(d=>`#${d.id} [${d.type}] ${d.position} ${d.command} -> \`${d.action}\``);a.length>5&&u.push(`...and ${a.length-5} more`),console.log(N(O("Multiple matches",`${a.length} rules match "${r}"`),Se(u),$e(l.map(d=>({label:`Disable #${d.id}`,command:`prjct workflow disable ${d.id} --md`})))))}else{g.warn(`${a.length} rules match "${r}" \u2014 specify an ID:`);for(let u of l)console.log(` #${u.id} [${u.type}] ${u.position} ${u.command} -> ${u.action}`);a.length>5&&console.log(` ...and ${a.length-5} more`)}return{success:!0,matches:a.map(u=>u.id)}}async _workflowHelp(e){return e.md?console.log(N(O("Workflow Help","Manage hooks, gates, and steps for your workflow"),O("Commands",Se(["`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"])),O("Natural Language (EN/ES)",Se(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async _workflowShow(e,t,s){let r=["task","done","ship","sync"],o;if(e&&r.includes(e)?o=Q.getRulesForCommand(t,e):o=Q.getAllRules(t),o.length===0)return s.md?console.log(N(O("Workflow Rules","No rules configured"),$e([{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'}]))):(g.warn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(s.md){let i=e?[e]:r,a=[];for(let d of i){let m=o.filter(p=>p.command===d);m.length!==0&&a.push(ck(d,m))}let l=e?`Workflow: ${e}`:"Workflow Rules",u=`${o.length} rule${o.length!==1?"s":""}`;console.log(N(O(l,u),a.length>0?Ju(a.join(`
|
|
1180
1180
|
|
|
1181
1181
|
`),""):null,$e([{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 l=a.enabled?"":" (disabled)";console.log(` #${a.id} [${a.type}] ${a.position.padEnd(6)} ${a.command.padEnd(5)} \u2192 ${a.action}${l}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:o}}async _workflowInit(e,t,s){let r=Q.getRulesForCommand(e,"ship").filter(u=>u.position==="before");if(r.length>0){let u=`Ship workflow already has ${r.length} rule${r.length!==1?"s":""}. Use 'prjct workflow reset' first if you want to reinitialize.`;return s.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let o=await Yr(t),i=0,a=[],l=Q.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(`#${l} [gate] prevent main branch`),o.lint){let u=Q.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=Q.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(N(we("Workflow Initialized",`Added ${a.length} default ship rules`),Se(a),$e([{label:"View all rules",command:"prjct workflow --md"},{label:"Ship your work",command:"prjct ship --md"}])));else{g.done(`initialized ${a.length} workflow rules for ship`);for(let u of a)console.log(` ${u}`)}return{success:!0,rulesAdded:a.length}}async _workflowCreate(e,t,s,r){let o=e.match(/^(\S+)\s+"([^"]+)"/);if(!o){let u='Usage: prjct workflow create <name> "description"';return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let[,i,a]=o;if(!De.isValidName(i)){let u='Workflow name must be lowercase alphanumeric + hyphens (e.g., "qa", "deploy-prod")';return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}if(De.isReservedName(i)){let u=`Workflow name '${i}' is reserved`;return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}if(De.getWorkflow(t,i)){let u=`Workflow '${i}' already exists`;return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}try{let u=De.createWorkflow(t,{name:i,description:a}),d=await yc.generateWorkflowTemplate(i,a);if(!d.success){De.deleteWorkflow(t,i);let m=`Failed to generate template: ${d.error}`;return r.md?console.log(`> Error: ${m}`):g.fail(m),{success:!1,error:m}}return r.md?console.log(N(we("Workflow Created",`Created workflow: ${i}`),O("Description",a),O("Template",`Installed at ${d.path}`),$e([{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}`}]))):(g.done(`created workflow: ${i}`),console.log(` ${a}`),console.log(` Template: ${d.path}`),console.log(`
|
|
1182
1182
|
Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(u){let d=y(u);return r.md?console.log(`> Error: ${d}`):g.fail(d),{success:!1,error:d}}}async _workflowList(e,t){let s=De.getAllWorkflows(e);if(s.length===0){let i="No workflows found";return t.md?console.log(`> ${i}`):g.warn(i),{success:!0,workflows:[]}}let r=s.filter(i=>i.isBuiltin),o=s.filter(i=>!i.isBuiltin);if(t.md){let i=[];if(r.length>0){let a=r.map(l=>`- **${l.name}** \u2014 ${l.description}`);i.push(O("Built-in Workflows",a.join(`
|
|
@@ -1184,15 +1184,15 @@ Run with: p. ${i}`)),{success:!0,workflowId:u,name:i,templatePath:d.path}}catch(
|
|
|
1184
1184
|
`)))}console.log(N(...i,$e([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(g.done(`${s.length} workflow${s.length!==1?"s":""}`),r.length>0){console.log(`
|
|
1185
1185
|
Built-in:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}if(o.length>0){console.log(`
|
|
1186
1186
|
Custom:`);for(let i of o)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:s}}async _workflowDelete(e,t,s){let r=e.trim();if(!r){let o="Usage: prjct workflow delete <name>";return s.md?console.log(`> ${o}`):g.warn(o),{success:!1,error:o}}try{if(!De.deleteWorkflow(t,r)){let i=`Workflow '${r}' not found`;return s.md?console.log(`> ${i}`):g.warn(i),{success:!1,error:i}}return await yc.deleteWorkflowTemplate(r),s.md?console.log(N(we("Workflow Deleted",`Deleted workflow: ${r}`))):g.done(`deleted workflow: ${r}`),{success:!0}}catch(o){let i=y(o);return s.md?console.log(`> Error: ${i}`):g.fail(i),{success:!1,error:i}}}async run(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return s.md?console.log("> No project ID found. Run `prjct init` first."):g.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}`):g.warn(u),{success:!1,error:u}}let a=De.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return s.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let l=await Jt(o,i,"before",{projectPath:t});if(!l.success){if(s.md)zu("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(g.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await Jt(o,i,"after",{projectPath:t}),s.md?console.log(N(we(`Workflow: ${i}`,a.description||""),$e([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):g.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(r){let o=y(r);return s.md?console.log(`> Error: ${o}`):g.fail(o),{success:!1,error:o}}}};function ck(n,e){let t=e.filter(p=>p.type==="gate"&&p.position==="before"),s=e.filter(p=>p.type==="instruction"&&p.position==="before"),r=e.filter(p=>p.type==="hook"&&p.position==="before"),o=e.filter(p=>p.type==="step"&&p.position==="before"),i=e.filter(p=>p.type==="instruction"&&p.position==="after"),a=e.filter(p=>p.type==="hook"&&p.position==="after"),l=e.filter(p=>p.type==="step"&&p.position==="after"),u=[],d=c((p,f,h)=>{let E=f.map(C=>` ${C.enabled?h:"o"} #${C.id} ${C.action}`),P=[p,...E],I=Math.max(...P.map(C=>C.length))+2;u.push(`+${"-".repeat(I)}+`);for(let C of P)u.push(`| ${C.padEnd(I-1)}|`);u.push(`+${"-".repeat(I)}+`)},"drawBox"),m=c(p=>{p.push(" |"),p.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),m(u)),s.length>0&&(d("INSTRUCTIONS (before)",s,"\u{1F4CB}"),m(u)),r.length>0&&(d("HOOKS (before)",r,">"),m(u)),o.length>0&&(d("STEPS (before)",o,">"),m(u)),u.push(` [ ${n.toUpperCase()} ]`),i.length>0&&(m(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(m(u),d("HOOKS (after)",a,">")),l.length>0&&(m(u),d("STEPS (after)",l,">")),u.join(`
|
|
1187
|
-
`)}c(ck,"buildFlowDiagram");var gn=class{static{c(this,"PrjctCommands")}workflow;planning;shipping;analysis;setupCmds;updateCmds;contextCmds;primitivesCmds;seedCmds;installCmds;captureCmds;mcpCmds;teamCmds;configCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new pn,this.planning=new fs,this.shipping=new gs,this.analysis=new ys,this.setupCmds=new an,this.updateCmds=new mn,this.contextCmds=new ws,this.primitivesCmds=new nn,this.seedCmds=new rn,this.installCmds=new tn,this.captureCmds=new Qs,this.mcpCmds=new sn,this.teamCmds=new ln,this.configCmds=new Zs,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 workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(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 saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async regenVault(e=process.cwd(),t={}){return this.analysis.regenVault(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async status(e=null,t=process.cwd(),s={}){return this.primitivesCmds.status(e,t,s)}async tag(e=null,t=process.cwd(),s={}){return this.primitivesCmds.tag(e,t,s)}async remember(e=null,t=process.cwd(),s={}){return this.primitivesCmds.remember(e,t,s)}async seed(e=null,t=process.cwd(),s={}){return this.seedCmds.seed(e,t,s)}async install(e=null,t=process.cwd(),s={}){return this.installCmds.install(null,t,s)}async capture(e=null,t=process.cwd(),s={}){return this.captureCmds.capture(e,t,s)}async mcp(e=null,t=process.cwd(),s={}){return this.mcpCmds.mcp(e,t,s)}async team(e=null,t=process.cwd(),s={}){return this.teamCmds.team(e,t,s)}async config(e=null,t=process.cwd(),s={}){return this.configCmds.config(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)}},F0=new gn;uo();var Om={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}},Lm=[{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:"task",group:"core",description:"Register a task (or show the active one)",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{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,features:["No arg \u2192 ships the active task description, or falls back to current work"]},{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:"regen",group:"core",description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"/p:regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{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:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"/p:status <value>",terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"core",description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"/p:tag type:bug",terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'/p:remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"capture",group:"core",description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'/p:capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"/p:seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"/p:mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",description:"Install Claude Code hooks (~/.claude/settings.json merge-safe)",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Writes 7 passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Remove with `prjct claude uninstall`"]},{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:"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:"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:"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"]},{name:"team",group:"core",description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"/p:team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"config",group:"core",description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"/p:config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]}];lo();co();bt();je();q();Y();Fe();import{execSync as ko}from"node:child_process";import Ve from"node:fs/promises";import lk from"node:os";import $t from"node:path";import uk from"node:readline";import ue from"chalk";var vo="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Jn="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Um(n){let e=0;try{let t=await Ve.readdir(n,{withFileTypes:!0});for(let s of t){let r=$t.join(n,s.name);if(s.isDirectory())e+=await Um(r);else try{let o=await Ve.stat(r);e+=o.size}catch{}}}catch{}return e}c(Um,"getDirectorySize");function Fm(n){if(n===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(n)/Math.log(1024));return`${(n/1024**t).toFixed(1)} ${e[t]}`}c(Fm,"formatSize");async function dk(n){try{return(await Ve.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}c(dk,"countDirectoryItems");function mk(){let n={homebrew:!1,npm:!1};try{ko("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(n.homebrew=!0,n.homebrewFormula="prjct-cli")}catch{}try{ko("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(n.npm=!0)}catch{}return n}c(mk,"detectInstallation");async function pk(){let n=[],e=qo(),t=j.getGlobalBasePath(),s=await S(t),r=s?await dk($t.join(t,"projects")):0,o=s?await Um(t):0;n.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:s});let i=$t.join(e.claude.config,"CLAUDE.md"),a=await S(i),l=!1;if(a)try{let I=await Ve.readFile(i,"utf-8");l=I.includes(vo)&&I.includes(Jn)}catch{}n.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&l});let u=e.claude.router,d=await S(u);n.push({path:u,type:"file",description:"Claude router",exists:d});let m=$t.join(e.claude.config,"prjct-statusline.sh"),p=await S(m);n.push({path:m,type:"file",description:"Status line script",exists:p});let f=e.gemini.router,h=await S(f);n.push({path:f,type:"file",description:"Gemini router",exists:h});let E=$t.join(e.gemini.config,"GEMINI.md"),P=await S(E),k=!1;if(P)try{let I=await Ve.readFile(E,"utf-8");k=I.includes(vo)&&I.includes(Jn)}catch{}return P&&k&&n.push({path:E,type:"section",description:"prjct section in GEMINI.md",exists:!0}),n}c(pk,"gatherUninstallItems");async function gk(n){try{let e=await Ve.readFile(n,"utf-8");if(!e.includes(vo)||!e.includes(Jn))return!1;let t=e.indexOf(vo),s=e.indexOf(Jn)+Jn.length,r=e.substring(0,t)+e.substring(s);return r=r.replace(/\n{3,}/g,`
|
|
1187
|
+
`)}c(ck,"buildFlowDiagram");var gn=class{static{c(this,"PrjctCommands")}workflow;planning;shipping;analysis;setupCmds;updateCmds;contextCmds;primitivesCmds;seedCmds;installCmds;captureCmds;mcpCmds;teamCmds;configCmds;agent;agentInfo;currentAuthor;prjctDir;constructor(){this.workflow=new pn,this.planning=new fs,this.shipping=new gs,this.analysis=new ys,this.setupCmds=new an,this.updateCmds=new mn,this.contextCmds=new ws,this.primitivesCmds=new nn,this.seedCmds=new rn,this.installCmds=new tn,this.captureCmds=new Qs,this.mcpCmds=new sn,this.teamCmds=new ln,this.configCmds=new Zs,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 workflowPrefs(e=null,t=process.cwd(),s={}){return this.workflow.workflow(e,t,s)}async init(e=null,t=process.cwd()){return this.planning.init(e,t)}async ship(e,t=process.cwd(),s={}){return this.shipping.ship(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 saveLlmAnalysis(e,t=process.cwd(),s={}){return this.analysis.saveLlmAnalysis(e,t,s)}async regenVault(e=process.cwd(),t={}){return this.analysis.regenVault(e,t)}async context(e=null,t=process.cwd(),s={}){return this.contextCmds.context(e,t,s)}async status(e=null,t=process.cwd(),s={}){return this.primitivesCmds.status(e,t,s)}async tag(e=null,t=process.cwd(),s={}){return this.primitivesCmds.tag(e,t,s)}async remember(e=null,t=process.cwd(),s={}){return this.primitivesCmds.remember(e,t,s)}async seed(e=null,t=process.cwd(),s={}){return this.seedCmds.seed(e,t,s)}async install(e=null,t=process.cwd(),s={}){return this.installCmds.install(null,t,s)}async capture(e=null,t=process.cwd(),s={}){return this.captureCmds.capture(e,t,s)}async mcp(e=null,t=process.cwd(),s={}){return this.mcpCmds.mcp(e,t,s)}async team(e=null,t=process.cwd(),s={}){return this.teamCmds.team(e,t,s)}async config(e=null,t=process.cwd(),s={}){return this.configCmds.config(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)}},L0=new gn;uo();var Lm={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}},Fm=[{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:"task",group:"core",description:"Register a task (or show the active one)",usage:{claude:'/p:task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{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,features:["No arg \u2192 ships the active task description, or falls back to current work"]},{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:"regen",group:"core",description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"/p:regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{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:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"/p:status <value>",terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"core",description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"/p:tag type:bug",terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'/p:remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"capture",group:"core",description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'/p:capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"/p:seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"/p:mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",description:"Install Claude Code hooks (~/.claude/settings.json merge-safe)",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Writes 7 passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Remove with `prjct claude uninstall`"]},{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:"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:"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:"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"]},{name:"team",group:"core",description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"/p:team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"config",group:"core",description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"/p:config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]}];lo();co();Rt();je();q();Y();Fe();import{execSync as ko}from"node:child_process";import Ge from"node:fs/promises";import lk from"node:os";import $t from"node:path";import uk from"node:readline";import ue from"chalk";var vo="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Jn="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";async function Hm(n){let e=0;try{let t=await Ge.readdir(n,{withFileTypes:!0});for(let s of t){let r=$t.join(n,s.name);if(s.isDirectory())e+=await Hm(r);else try{let o=await Ge.stat(r);e+=o.size}catch{}}}catch{}return e}c(Hm,"getDirectorySize");function Um(n){if(n===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(n)/Math.log(1024));return`${(n/1024**t).toFixed(1)} ${e[t]}`}c(Um,"formatSize");async function dk(n){try{return(await Ge.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}c(dk,"countDirectoryItems");function mk(){let n={homebrew:!1,npm:!1};try{ko("brew list prjct-cli 2>/dev/null",{encoding:"utf-8"})&&(n.homebrew=!0,n.homebrewFormula="prjct-cli")}catch{}try{ko("npm list -g prjct-cli --depth=0 2>/dev/null",{encoding:"utf-8"}).includes("prjct-cli")&&(n.npm=!0)}catch{}return n}c(mk,"detectInstallation");async function pk(){let n=[],e=ki(),t=j.getGlobalBasePath(),s=await S(t),r=s?await dk($t.join(t,"projects")):0,o=s?await Hm(t):0;n.push({path:t,type:"directory",description:`All project data${r>0?`, ${r} project${r>1?"s":""}`:""}`,size:o,count:r,exists:s});let i=$t.join(e.claude.config,"CLAUDE.md"),a=await S(i),l=!1;if(a)try{let I=await Ge.readFile(i,"utf-8");l=I.includes(vo)&&I.includes(Jn)}catch{}n.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:a&&l});let u=e.claude.router,d=await S(u);n.push({path:u,type:"file",description:"Claude router",exists:d});let m=$t.join(e.claude.config,"prjct-statusline.sh"),p=await S(m);n.push({path:m,type:"file",description:"Status line script",exists:p});let f=e.gemini.router,h=await S(f);n.push({path:f,type:"file",description:"Gemini router",exists:h});let E=$t.join(e.gemini.config,"GEMINI.md"),P=await S(E),k=!1;if(P)try{let I=await Ge.readFile(E,"utf-8");k=I.includes(vo)&&I.includes(Jn)}catch{}return P&&k&&n.push({path:E,type:"section",description:"prjct section in GEMINI.md",exists:!0}),n}c(pk,"gatherUninstallItems");async function gk(n){try{let e=await Ge.readFile(n,"utf-8");if(!e.includes(vo)||!e.includes(Jn))return!1;let t=e.indexOf(vo),s=e.indexOf(Jn)+Jn.length,r=e.substring(0,t)+e.substring(s);return r=r.replace(/\n{3,}/g,`
|
|
1188
1188
|
|
|
1189
|
-
`).trim(),!r||r.trim().length===0?await
|
|
1190
|
-
`,"utf-8"),!0}catch{return!1}}c(gk,"removePrjctSection");async function fk(){let n=lk.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=$t.join(n,`.prjct-backup-${e}`);try{await
|
|
1191
|
-
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.reduce((l,u)=>l+(u.size||0),0);console.log(""),console.log(ue.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ue.white("The following will be permanently deleted:")),console.log("");for(let l of r){let u=j.getDisplayPath(l.path),d="";l.type==="section"?d=ue.dim("(section only)"):l.size&&(d=ue.dim(`(${
|
|
1189
|
+
`).trim(),!r||r.trim().length===0?await Ge.unlink(n):await Ge.writeFile(n,`${r}
|
|
1190
|
+
`,"utf-8"),!0}catch{return!1}}c(gk,"removePrjctSection");async function fk(){let n=lk.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=$t.join(n,`.prjct-backup-${e}`);try{await Ge.mkdir(t,{recursive:!0});let s=j.getGlobalBasePath();return await S(s)&&await Wm(s,$t.join(t,".prjct-cli")),t}catch{return null}}c(fk,"createBackup");async function Wm(n,e){await Ge.mkdir(e,{recursive:!0});let t=await Ge.readdir(n,{withFileTypes:!0});for(let s of t){let r=$t.join(n,s.name),o=$t.join(e,s.name);s.isDirectory()?await Wm(r,o):await Ge.copyFile(r,o)}}c(Wm,"copyDirectory");async function hk(n,e,t){let s=[],r=[];for(let o of n)if(o.exists)try{o.type==="section"?await gk(o.path)&&s.push(o.path):o.type==="directory"?(await Ge.rm(o.path,{recursive:!0,force:!0}),s.push(o.path)):o.type==="file"&&(await Ge.unlink(o.path),s.push(o.path))}catch(i){r.push(`${o.path}: ${y(i)}`)}try{await new vt().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||ko(`brew uninstall ${e.homebrewFormula}`,{stdio:"pipe"}),s.push("Homebrew: prjct-cli")}catch(o){r.push(`Homebrew: ${y(o)}`)}if(e.npm)try{t.dryRun||ko("npm uninstall -g prjct-cli",{stdio:"pipe"}),s.push("npm: prjct-cli")}catch(o){r.push(`npm: ${y(o)}`)}}return{deleted:s,errors:r}}c(hk,"performUninstall");async function yk(n){let e=uk.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(n,s=>{e.close(),t(s.toLowerCase()==="uninstall")})})}c(yk,"promptConfirmation");async function wk(n={},e=process.cwd()){let t=await pk(),s=mk(),r=t.filter(l=>l.exists);if(r.length===0&&!s.homebrew&&!s.npm)return console.log(ue.yellow(`
|
|
1191
|
+
No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=r.reduce((l,u)=>l+(u.size||0),0);console.log(""),console.log(ue.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(ue.white("The following will be permanently deleted:")),console.log("");for(let l of r){let u=j.getDisplayPath(l.path),d="";l.type==="section"?d=ue.dim("(section only)"):l.size&&(d=ue.dim(`(${Um(l.size)})`)),console.log(` ${ue.cyan(u.padEnd(35))} ${d}`),console.log(` ${ue.dim(l.description)}`),console.log("")}if(s.homebrew&&(console.log(` ${ue.cyan("Homebrew".padEnd(35))} ${ue.dim("prjct-cli formula")}`),console.log("")),s.npm&&(console.log(` ${ue.cyan("npm global".padEnd(35))} ${ue.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(ue.dim(` Total size: ${Um(o)}`)),console.log("")),n.dryRun)return console.log(ue.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:r.length};if(n.backup){console.log(ue.blue("Creating backup..."));let l=await fk();l?(console.log(ue.green(`Backup created: ${j.getDisplayPath(l)}`)),console.log("")):console.log(ue.yellow("Failed to create backup, continuing..."))}if(!n.force&&(console.log(ue.yellow('Type "uninstall" to confirm:')),!await yk("> ")))return console.log(ue.yellow(`
|
|
1192
1192
|
Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(ue.blue("Removing prjct..."));let{deleted:i,errors:a}=await hk(t,s,n);if(console.log(""),i.length>0&&console.log(ue.green(`Removed ${i.length} items`)),a.length>0){console.log(ue.yellow(`
|
|
1193
|
-
${a.length} errors:`));for(let l of a)console.log(ue.red(` - ${l}`))}return console.log(""),console.log(ue.green("prjct has been uninstalled.")),console.log(ue.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}}c(wk,"uninstall");var bo=class extends re{static{c(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return wk(e,t)}};var
|
|
1193
|
+
${a.length} errors:`));for(let l of a)console.log(ue.red(` - ${l}`))}return console.log(""),console.log(ue.green("prjct has been uninstalled.")),console.log(ue.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}}c(wk,"uninstall");var bo=class extends re{static{c(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return wk(e,t)}};var Gm=new pn,kk=new fs,vk=new gs,So=new ys,qn=new an,bk=new ws,wc=new nn,Sk=new bo,Tk=new mn,Ek=new rn,Ck=new tn,Pk=new Qs,Rk=new sn,Ak=new ln,jk=new Zs;function xk(){for(let[n,e]of Object.entries(Lm))z.registerCategory(n,e)}c(xk,"registerCategories");function $k(){if(z.has("work"))return;xk();let n=c(e=>Fm.find(t=>t.name===e),"getMeta");z.registerMethod("task",Gm,"now",n("task")),z.registerMethod("workflow",Gm,"workflow",n("workflow")),z.registerMethod("init",kk,"init",n("init")),z.registerMethod("ship",vk,"ship",n("ship")),z.registerMethod("analyze",So,"analyze",n("analyze")),z.registerMethod("analysis-save-llm",So,"saveLlmAnalysis",n("analysis-save-llm")),z.registerMethod("sync",So,"sync",n("sync")),z.registerMethod("regen",So,"regenVault",n("regen")),z.registerMethod("start",qn,"start",n("start")),z.registerMethod("setup",qn,"setup",n("setup")),z.registerMethod("login",qn,"login",n("login")),z.registerMethod("logout",qn,"logout",n("logout")),z.registerMethod("auth",qn,"auth",n("auth")),z.registerMethod("uninstall",Sk,"uninstall",n("uninstall")),z.registerMethod("update",Tk,"update",n("update")),z.registerMethod("context",bk,"context",n("context")),z.registerMethod("status",wc,"status",n("status")),z.registerMethod("tag",wc,"tag",n("tag")),z.registerMethod("remember",wc,"remember",n("remember")),z.registerMethod("seed",Ek,"seed",n("seed")),z.registerMethod("install",Ck,"install",n("install")),z.registerMethod("capture",Pk,"capture",n("capture")),z.registerMethod("mcp",Rk,"mcp",n("mcp")),z.registerMethod("team",Ak,"team",n("team")),z.registerMethod("config",jk,"config",n("config"))}c($k,"registerAllCommands");$k();var Vm={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};function Bm(n){return Object.hasOwn(Vm,n)}c(Bm,"isRemovedVerb");function Jm(n){let e=Vm[n];return e?`'prjct ${n}' was removed in v2.
|
|
1194
1194
|
\u2192 Use: ${e.replacement}
|
|
1195
|
-
${e.note}`:null}c(
|
|
1196
|
-
`))!==-1;){let r=e.slice(0,s);if(e=e.slice(s+1),!!r.trim())try{let o=JSON.parse(r),i=await Uk(o);n.write(un(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(un(i))}}}),n.on("error",()=>{})}c(Fk,"handleConnection");async function Uk(n){if(!X||!Ie)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(X.restartPending)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon restarting \u2014 retry the command"};X.activeRequests++;try{return await Hk(n)}finally{X.activeRequests--,X.restartPending&&X.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>hn(0)))}}c(Uk,"handleRequest");async function Hk(n){if(!X||!Ie)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(
|
|
1195
|
+
${e.note}`:null}c(Jm,"migrationMessage");he();dc();var Ok=50,Lk=10,fn=null,Ie=null,X=null,Xt=null;async function ep(n){process.env.PRJCT_IN_DAEMON="1";let e=ke.socket(),t=ke.pid(),s=ke.runDir();if(de.mkdirSync(s,{recursive:!0}),de.existsSync(t)){let i=parseInt(de.readFileSync(t,"utf-8").trim(),10);Vk(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),de.unlinkSync(t)}de.existsSync(e)&&de.unlinkSync(e),qk();let r=Bk(),o=null;if(r)try{o=de.statSync(r).mtimeMs}catch{}if(Xt=zk(),X={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:xm,idleTimer:null,entryPath:r,entryMtime:o,activeRequests:0,restartPending:!1},Xt)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Zm(),Qm));i(Xt)||await a(Xt)}catch{}if(Ie=new gn,fn=Mk(i=>Fk(i)),fn.listen(e,()=>{de.chmodSync(e,384),de.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),r&&console.log(` Watching: ${r}`),tp()}),fn.on("error",i=>{console.error("Daemon socket error:",i.message),hn(1)}),process.on("SIGTERM",()=>hn(0)),process.on("SIGINT",()=>hn(0)),process.on("SIGHUP",()=>{Ie=new gn,console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}c(ep,"startDaemon");function Fk(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>$m){let r={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(un(r)),n.destroy(),e="";return}let s;for(;(s=e.indexOf(`
|
|
1196
|
+
`))!==-1;){let r=e.slice(0,s);if(e=e.slice(s+1),!!r.trim())try{let o=JSON.parse(r),i=await Uk(o);n.write(un(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(un(i))}}}),n.on("error",()=>{})}c(Fk,"handleConnection");async function Uk(n){if(!X||!Ie)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(X.restartPending)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon restarting \u2014 retry the command"};X.activeRequests++;try{return await Hk(n)}finally{X.activeRequests--,X.restartPending&&X.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>hn(0)))}}c(Uk,"handleRequest");async function Hk(n){if(!X||!Ie)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(tp(),X.commandsServed++,X.lastActivity=Date.now(),X.commandsServed%Ok===0&&L.checkpointAll(),!X.restartPending&&sp()&&(console.log("Build changed detected \u2014 daemon will restart after this request"),X.restartPending=!0),!X.restartPending&&Xt&&X.commandsServed%Lk===0&&Xk()&&(console.log(`Version drift detected \u2014 daemon v${Xt} is stale; shutting down so the next request spawns fresh.`),X.restartPending=!0),n.command==="daemon")return Gk(n);if(n.command==="__ping")return{id:n.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],s=console.log,r=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await Wk(n);return{id:n.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1197
1197
|
`)||o.message||void 0,stderr:t.join(`
|
|
1198
|
-
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=r}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}c(Hk,"handleRequestInner");async function Wk(n){let e=n.args.join(" ")||null,t=n.options,s=t.md===!0;if(
|
|
1198
|
+
`)||o.error||void 0,result:o}}finally{console.log=s,console.error=r}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}c(Hk,"handleRequestInner");async function Wk(n){let e=n.args.join(" ")||null,t=n.options,s=t.md===!0;if(Bm(n.command)&&!z.getByName(n.command))return{success:!1,error:Jm(n.command)??`'${n.command}' was removed in v2.`};if(n.command&&!z.getByName(n.command)&&!(n.args.length===0&&Xc(n.command)!==null)){let r=[n.command,...n.args.filter(o=>!o.startsWith("-"))].join(" ");return Ie.capture(r,n.cwd,{md:s,tags:t.tags?String(t.tags):void 0,force:t.force===!0})}switch(n.command){case"sync":return Ie.sync(n.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"task":return Ie.task(e,n.cwd,{md:s});case"ship":{let r=typeof t.intent=="string"?t.intent:void 0;return Ie.ship(e,n.cwd,{md:s,intent:r,skipHooks:t["skip-hooks"]===!0})}case"workflow":return Ie.workflowPrefs(e,n.cwd,{md:s});case"analyze":return Ie.analyze(t,n.cwd);case"analysis-save-llm":return e?Ie.saveLlmAnalysis(e,n.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"status":return Ie.status(e,n.cwd,{md:s});case"tag":return Ie.tag(e,n.cwd,{md:s});case"remember":return Ie.remember(e,n.cwd,{md:s,tags:t.tags?String(t.tags):void 0});case"mcp":return Ie.mcp(e,n.cwd,{md:s});case"team":return Ie.team(e,n.cwd,{md:s,required:t.required===!0,minVersion:t["min-version"]?String(t["min-version"]):void 0,enforce:t.enforce===!0});case"config":return Ie.config(e,n.cwd,{md:s});default:return z.execute(n.command,e,n.cwd)}}c(Wk,"executeCommand");function Gk(n){let e=n.args[0];if(e==="status")return{id:n.id,success:!0,exitCode:0,result:{running:!0,pid:process.pid,socketPath:ke.socket(),uptime:X?Date.now()-X.startedAt:0,commandsServed:X?.commandsServed??0,lastActivity:X?new Date(X.lastActivity).toISOString():null,registeredCommands:z.list().length,stale:sp()}};if(e==="stop"){let t={id:n.id,success:!0,exitCode:0,stdout:"Daemon stopping..."};return setTimeout(()=>hn(0),100),t}return{id:n.id,success:!1,exitCode:1,stderr:`Unknown daemon command: ${e}. Use: status, stop`}}c(Gk,"handleDaemonCommand");function tp(){X&&(X.idleTimer&&clearTimeout(X.idleTimer),X.idleTimer=setTimeout(()=>{console.log(`Daemon idle for ${X.idleTimeoutMs/1e3/60} minutes, shutting down`),hn(0)},X.idleTimeoutMs),X.idleTimer.unref&&X.idleTimer.unref())}c(tp,"resetIdleTimer");function hn(n){console.log("Daemon shutting down..."),X?.idleTimer&&clearTimeout(X.idleTimer),fn&&(fn.close(),fn=null),L.close();let e=ke.socket(),t=ke.pid();try{de.existsSync(e)&&de.unlinkSync(e)}catch{}try{de.existsSync(t)&&de.unlinkSync(t)}catch{}process.exit(n)}c(hn,"shutdown");function Vk(n){try{return process.kill(n,0),!0}catch{return!1}}c(Vk,"isProcessRunning");function Bk(){let n=Te("node:path"),e=__dirname;for(let r=0;r<5;r++){if(de.existsSync(n.join(e,"package.json"))){let o=n.join(e,"dist","daemon","entry.mjs");if(de.existsSync(o))return o;break}e=n.dirname(e)}let t=[n.join(__dirname,"..","daemon","entry.mjs"),n.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of t)if(de.existsSync(r))return r;let s=process.argv[1];return s&&de.existsSync(s)?s:null}c(Bk,"resolveEntryPath");var Jk=1024*1024;function qk(){let n=ke.log();try{if(de.statSync(n).size>Jk){let t=`${n}.1`;try{de.unlinkSync(t)}catch{}de.renameSync(n,t)}}catch{}}c(qk,"rotateLog");function sp(){if(!X?.entryPath||X.entryMtime===null)return!1;try{return de.statSync(X.entryPath).mtimeMs!==X.entryMtime}catch{return!1}}c(sp,"isCodeStale");function zk(){let n=Te("node:path"),e=__dirname;for(let t=0;t<6;t++){let s=n.join(e,"package.json");try{let o=JSON.parse(de.readFileSync(s,"utf-8"));if(o?.name==="prjct-cli"&&typeof o.version=="string")return o.version}catch{}let r=n.dirname(e);if(r===e)break;e=r}return null}c(zk,"readOwnPackageVersion");function Xk(){if(!Xt)return!1;let n=Te("node:os"),e=Te("node:path"),t=n.homedir(),s=[`${t}/Library/pnpm/prjct`,`${t}/.local/share/pnpm/prjct`,`${t}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${t}/.volta/bin/prjct`,`${t}/.asdf/shims/prjct`];for(let r of s){let o;try{o=de.realpathSync(r)}catch{continue}let i=e.dirname(o);for(let a=0;a<6;a++){let l=e.join(i,"package.json");try{let d=JSON.parse(de.readFileSync(l,"utf-8"));if(d?.name==="prjct-cli"&&typeof d.version=="string")return d.version!==Xt}catch{}let u=e.dirname(i);if(u===i)break;i=u}}return!1}c(Xk,"isGlobalVersionDrifted");var Kk=process.argv.slice(2),Yk=Kk.includes("--foreground");ep({foreground:Yk}).catch(n=>{console.error("Failed to start daemon:",n.message),process.exit(1)});
|