prjct-cli 2.57.0 → 2.58.0

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 CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.58.0] - 2026-06-22
6
+
7
+ ### Added
8
+ - stale sync slash copy
9
+
5
10
  ## [2.57.0] - 2026-06-22
6
11
 
7
12
  ### Added
@@ -6,7 +6,7 @@ var __filename = __fileURLToPath(import.meta.url);
6
6
  var __dirname = __pathDirname(__filename);
7
7
  var ej=Object.create;var Jo=Object.defineProperty;var tj=Object.getOwnPropertyDescriptor;var nj=Object.getOwnPropertyNames;var rj=Object.getPrototypeOf,sj=Object.prototype.hasOwnProperty;var c=(n,e)=>Jo(n,"name",{value:e,configurable:!0}),at=(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 h=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(r){throw t=[r],r}};var oj=(n,e)=>()=>{try{return e||n((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}},j=(n,e)=>{for(var t in e)Jo(n,t,{get:e[t],enumerable:!0})},Hy=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of nj(e))!sj.call(n,s)&&s!==t&&Jo(n,s,{get:()=>e[s],enumerable:!(r=tj(e,s))||r.enumerable});return n};var ij=(n,e,t)=>(t=n!=null?ej(rj(n)):{},Hy(e||!n||!n.__esModule?Jo(t,"default",{value:n,enumerable:!0}):t,n)),et=n=>Hy(Jo({},"__esModule",{value:!0}),n);import aj from"node:os";import Uy from"node:path";function an(){let n=process.env.PRJCT_CLI_HOME?.trim();return n?Uy.resolve(n):Uy.join(aj.homedir(),".prjct-cli")}var $s=h(()=>{"use strict";c(an,"resolveCliHome")});import{z as Ko}from"zod";function dj(n){return uj[n]??Bn}function Gy(n){let e=dj(n);return e.model==="opus"&&e.effort==="max"?'Dispatch with the Agent tool using `model: "opus"` and full reasoning effort \u2014 this is the IMPLEMENTER; it writes code and needs the best model.':`Dispatch with the Agent tool using \`model: "${e.model}"\` (NOT the parent's max model). Apply ${e.effort}, not exhaustive, effort \u2014 this is an orchestration/review role: return the verdict, don't over-deliberate. A smaller model at decent effort is correct here and far faster.`}function Xo(n,e){let t=n.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=r[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var cj,lj,Bn,uj,zo,Is=h(()=>{"use strict";cj={model:"opus",effort:"max"},lj={model:"haiku",effort:"decent"},Bn={model:"sonnet",effort:"decent"},uj={implementer:cj,orchestrator:lj,"strategic-review":Bn,"architecture-review":Bn,"design-review":Bn,"spec-review":Bn,review:Bn,security:Bn,investigate:Bn,reviewer:Bn};c(dj,"getAgentModelPolicy");c(Gy,"renderModelDirective");zo=Ko.object({provider:Ko.string(),model:Ko.string(),cliVersion:Ko.string().optional(),recordedAt:Ko.string()});c(Xo,"compareSemver")});import wa from"node:fs";import Wy from"node:path";function By(){return Wy.join(an(),"config")}function ka(){return Wy.join(By(),"global.json")}function qy(n){try{let e=wa.statSync(n);return`${n}|${e.mtimeMs}|${e.size}`}catch{return`${n}|absent`}}function Vu(){let n=ka(),e=qy(n);if(ya!==null&&e===qu)return ya;let t={};try{let r=wa.readFileSync(n,"utf-8"),s=JSON.parse(r);s&&typeof s=="object"&&!Array.isArray(s)&&(t=s)}catch{}return ya=t,qu=e,t}function pj(n){wa.mkdirSync(By(),{recursive:!0}),wa.writeFileSync(ka(),`${JSON.stringify(n,null,2)}
8
8
  `,"utf-8"),ya=n,qu=qy(ka())}function Tt(n){return Vu()[n]}function Vy(){return Vu()}function Ie(n,e){let t=Vu();e===void 0?delete t[n]:t[n]=e,pj(t)}function Jy(n){Ie(n,void 0)}function Ky(){return ka()}var ya,qu,ba=h(()=>{"use strict";$s();c(By,"configDir");c(ka,"configFilePath");ya=null,qu="";c(qy,"fileStamp");c(Vu,"readRaw");c(pj,"writeRaw");c(Tt,"getConfig");c(Vy,"getAll");c(Ie,"setConfig");c(Jy,"unsetConfig");c(Ky,"configPath")});var Ku={};j(Ku,{_internal:()=>vj,maybeAutoUpdate:()=>wj,runBackgroundCheck:()=>kj});import{execFile as mj,spawn as fj}from"node:child_process";import Ds from"node:fs";import Yo from"node:path";import{promisify as gj}from"node:util";function wj(n){if(!n||process.env.PRJCT_NO_AUTO_UPDATE==="1"||Tt("auto-update")!=="on")return;let e=Tt("auto-update-last-check");if(e&&Date.now()-Date.parse(e)<Xy)return;Ie("auto-update-last-check",new Date().toISOString()),fj(process.execPath,[process.argv[1],"__internal-auto-update",n],{detached:!0,stdio:"ignore"}).unref()}async function kj(n){try{let e=await Yy();if(!e)return;if(Xo(e,n)<=0){va(`current ${n} >= latest ${e}, no-op`);return}let t=Qy();va(`upgrade available: ${n} \u2192 ${e} (source: ${t})`),await bj(t,e),va(`upgrade complete: ${n} \u2192 ${e}`)}catch(e){va(`auto-update failed: ${e.message}`)}}async function Yy(){try{let n=new AbortController,e=setTimeout(()=>n.abort(),6e3),t=await fetch(yj,{signal:n.signal});if(clearTimeout(e),!t.ok)return null;let r=await t.json();return typeof r.version=="string"?r.version:null}catch{return null}}function Qy(){let n=Yo.join(an(),"bin","prjct");if(Ds.existsSync(n))try{if(Ds.statSync(n).size>1024*1024)return"binary"}catch{}try{let e=String(at("node:child_process").execSync("npm root -g")).trim();if(e&&Ds.existsSync(Yo.join(e,"prjct-cli")))return"npm"}catch{}try{let e=String(at("node:child_process").execSync("bun pm bin -g")).trim();if(e&&Ds.existsSync(Yo.join(e,"prjct")))return"bun"}catch{}return"unknown"}async function bj(n,e){if(n==="binary"){await Ju("bash",["-c","curl -sSL 'https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh' | bash"],{timeout:12e4,maxBuffer:4*1024*1024});return}if(n==="bun"){await Ju("bun",["install","-g","prjct-cli@latest"],{timeout:12e4});return}if(n==="npm"||n==="unknown"){await Ju("npm",["install","-g","prjct-cli@latest"],{timeout:12e4});return}}function va(n){try{Ds.mkdirSync(zy(),{recursive:!0}),Ds.appendFileSync(hj(),`${new Date().toISOString()} ${n}
9
- `)}catch{}}var Ju,zy,hj,Xy,yj,vj,zu=h(()=>{"use strict";$s();Is();ba();Ju=gj(mj),zy=c(()=>Yo.join(an(),"state"),"stateDir"),hj=c(()=>Yo.join(zy(),"auto-update.log"),"logPath"),Xy=3600*1e3,yj="https://registry.npmjs.org/prjct-cli/latest";c(wj,"maybeAutoUpdate");c(kj,"runBackgroundCheck");c(Yy,"fetchLatestVersion");c(Qy,"detectInstallSource");c(bj,"applyUpgrade");c(va,"log");vj={fetchLatestVersion:Yy,detectInstallSource:Qy,compareSemver:Xo,THROTTLE_MS:Xy}});function Sj(n){return n instanceof Ms}function Ve(n){return Sj(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Ms,Sa,Ea,Qo,gr=h(()=>{"use strict";Ms=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)}},Sa=class n extends Ms{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")}},Ea=class n extends Ms{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")}},Qo=class n extends Ms{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(Sj,"isPrjctError");c(Ve,"getErrorMessage")});function Ej(n){return n instanceof Error&&"code"in n}function B(n){return Ej(n)&&n.code==="ENOENT"}function w(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}function Xu(n){if(n instanceof Error)return n.stack}var F=h(()=>{"use strict";c(Ej,"isNodeError");c(B,"isNotFoundError");c(w,"getErrorMessage");c(Xu,"getErrorStack")});var zr={};j(zr,{PACKAGE_ROOT:()=>ct,VERSION:()=>re,getPackageRoot:()=>Qu,getVersion:()=>Ca,resetPackageRoot:()=>Zu});import Yu from"node:fs";import Ta from"node:path";function Qu(){if(Ns)return Ns;let n=__dirname;for(let e=0;e<5;e++){let t=Ta.join(n,"package.json");if(Yu.existsSync(t))try{if(JSON.parse(Yu.readFileSync(t,"utf-8")).name==="prjct-cli")return Ns=n,n}catch{}n=Ta.dirname(n)}return Ns=Ta.join(__dirname,"..","..",".."),Ns}function Ca(){if(Kr)return Kr;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return Kr=n,Kr;try{let e=Ta.join(Qu(),"package.json");return Kr=JSON.parse(Yu.readFileSync(e,"utf-8")).version,Kr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",w(e)),"0.0.0"}}function Zu(n){Ns=n,Kr=null}var Kr,Ns,re,ct,De=h(()=>{"use strict";F();Kr=null,Ns=null;c(Qu,"getPackageRoot");c(Ca,"getVersion");c(Zu,"resetPackageRoot");re=Ca(),ct=Qu()});var Pa={};j(Pa,{default:()=>_j,getTemplateContent:()=>ze,listTemplates:()=>Aa,resetBundle:()=>Pj});import td from"node:fs";import Tj from"node:fs/promises";import xa from"node:path";function nd(){if(ed)return Ra;ed=!0;let n=xa.join(ct,"dist","templates.json");try{let e=td.readFileSync(n,"utf-8");return Ra=JSON.parse(e),Ra}catch{return null}}function Rj(n){let e=Xr.indexOf(n);e>-1&&Xr.splice(e,1),Xr.push(n)}function xj(){for(;Os.size>=Cj&&Xr.length>0;){let n=Xr.shift();n&&Os.delete(n)}}function Zy(n){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=n.match(e);if(!t)return{frontmatter:{},content:n.trim()};let[,r,s]=t,o={};return r.split(`
9
+ `)}catch{}}var Ju,zy,hj,Xy,yj,vj,zu=h(()=>{"use strict";$s();Is();ba();Ju=gj(mj),zy=c(()=>Yo.join(an(),"state"),"stateDir"),hj=c(()=>Yo.join(zy(),"auto-update.log"),"logPath"),Xy=3600*1e3,yj="https://registry.npmjs.org/prjct-cli/latest";c(wj,"maybeAutoUpdate");c(kj,"runBackgroundCheck");c(Yy,"fetchLatestVersion");c(Qy,"detectInstallSource");c(bj,"applyUpgrade");c(va,"log");vj={fetchLatestVersion:Yy,detectInstallSource:Qy,compareSemver:Xo,THROTTLE_MS:Xy}});function Sj(n){return n instanceof Ms}function Ve(n){return Sj(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Ms,Sa,Ea,Qo,gr=h(()=>{"use strict";Ms=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)}},Sa=class n extends Ms{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")}},Ea=class n extends Ms{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")}},Qo=class n extends Ms{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(Sj,"isPrjctError");c(Ve,"getErrorMessage")});function Ej(n){return n instanceof Error&&"code"in n}function B(n){return Ej(n)&&n.code==="ENOENT"}function w(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}function Xu(n){if(n instanceof Error)return n.stack}var F=h(()=>{"use strict";c(Ej,"isNodeError");c(B,"isNotFoundError");c(w,"getErrorMessage");c(Xu,"getErrorStack")});var zr={};j(zr,{PACKAGE_ROOT:()=>ct,VERSION:()=>re,getPackageRoot:()=>Qu,getVersion:()=>Ca,resetPackageRoot:()=>Zu});import Yu from"node:fs";import Ta from"node:path";function Qu(){if(Ns)return Ns;let n=__dirname;for(let e=0;e<5;e++){let t=Ta.join(n,"package.json");if(Yu.existsSync(t))try{if(JSON.parse(Yu.readFileSync(t,"utf-8")).name==="prjct-cli")return Ns=n,n}catch{}n=Ta.dirname(n)}return Ns=Ta.join(__dirname,"..","..",".."),Ns}function Ca(){if(Kr)return Kr;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return Kr=n,Kr;try{let e=Ta.join(Qu(),"package.json");return Kr=JSON.parse(Yu.readFileSync(e,"utf-8")).version,Kr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",w(e)),"0.0.0"}}function Zu(n){Ns=n,Kr=null}var Kr,Ns,re,ct,De=h(()=>{"use strict";F();Kr=null,Ns=null;c(Qu,"getPackageRoot");c(Ca,"getVersion");c(Zu,"resetPackageRoot");re=Ca(),ct=Qu()});var Pa={};j(Pa,{default:()=>_j,getTemplateContent:()=>ze,listTemplates:()=>Aa,resetBundle:()=>Pj});import td from"node:fs";import Tj from"node:fs/promises";import xa from"node:path";function nd(){if(ed)return Ra;ed=!0;let n=xa.join(ct,"dist","templates.json");try{let e=td.readFileSync(n,"utf-8");return Ra=JSON.parse(e),Ra}catch{return null}}function Rj(n){let e=Xr.indexOf(n);e>-1&&Xr.splice(e,1),Xr.push(n)}function xj(){for(;Os.size>=Cj&&Xr.length>0;){let n=Xr.shift();n&&Os.delete(n)}}function Zy(n){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=n.match(e);if(!t)return{frontmatter:{},content:n.trim()};let[,r,s]=t,o={};return r.split(`
10
10
  `).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:s.trim()}}async function ew(n){if(Os.has(n))return Rj(n),Os.get(n);let e,t=nd();if(t){let s=`commands/${n}.md`;e=t[s]}if(!e){let s=xa.join(ct,"templates","commands",`${n}.md`);try{e=await Tj.readFile(s,"utf-8")}catch{throw Ea.notFound(n)}}let r=Zy(e);return xj(),Os.set(n,r),Xr.push(n),r}async function Aj(n){return(await ew(n)).frontmatter["allowed-tools"]||[]}function tw(){Os.clear(),Xr.length=0}function Pj(){Ra=null,ed=!1,tw()}function ze(n){let e=nd();if(e?.[n])return e[n];let t=xa.join(ct,"templates",n);try{return td.readFileSync(t,"utf-8")}catch{return null}}function Aa(n){let e=nd();if(e)return Object.keys(e).filter(r=>r.startsWith(n));let t=xa.join(ct,"templates",n);try{return td.readdirSync(t).map(s=>`${n}${s}`)}catch{return[]}}var Cj,Os,Xr,Ra,ed,jj,_j,cn=h(()=>{"use strict";gr();De();Cj=50,Os=new Map,Xr=[],Ra=null,ed=!1;c(nd,"loadBundle");c(Rj,"updateLruOrder");c(xj,"evictLru");c(Zy,"parseFrontmatter");c(ew,"load");c(Aj,"getAllowedTools");c(tw,"clearCache");c(Pj,"resetBundle");c(ze,"getTemplateContent");c(Aa,"listTemplates");jj={load:ew,parseFrontmatter:Zy,getAllowedTools:Aj,clearCache:tw,getTemplateContent:ze,listTemplates:Aa},_j=jj});var ja=h(()=>{"use strict"});var rd={};j(rd,{execAsync:()=>V,execFileAsync:()=>Q});import{exec as $j,execFile as Ij}from"node:child_process";import{promisify as nw}from"node:util";var V,Q,fe=h(()=>{"use strict";V=nw($j),Q=nw(Ij)});var rw,sw,ow,sd=h(()=>{"use strict";rw=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"]),sw=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],ow=/(?:import|from)\s+['"]([^'"]+)['"]/g});import cw from"node:fs/promises";async function lw(n,e){let t;try{t=await cw.readFile(n,"utf-8")}catch(o){if(B(o))return null;throw o}let r;try{r=JSON.parse(t)}catch{return await iw(n,t),aw(n,"Malformed JSON"),null}let s=e.safeParse(r);return s.success?r:(await iw(n,t),aw(n,Dj(s.error)),null)}async function iw(n,e){let t=`${n}.backup`;try{await cw.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function aw(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 Dj(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var uw=h(()=>{"use strict";F();c(lw,"safeRead");c(iw,"createBackup");c(aw,"logCorruption");c(Dj,"formatZodError")});var Xt={};j(Xt,{batchProcess:()=>Yr,dirExists:()=>Me,ensureDir:()=>Lt,fileExists:()=>E,listFiles:()=>Jn,readFile:()=>Ot,readJson:()=>xe,walkDir:()=>qn,writeFile:()=>Vn,writeFileAtomic:()=>Qr,writeJson:()=>we});import Ct from"node:fs/promises";import Zo from"node:path";async function qn(n,e={}){let t=[],r=e.maxFiles??1/0,s=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=r)return;let a=await Ct.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of a){if(t.length>=r)break;let u=String(l.name);if(rw.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!s||!s.has(u)))continue;let d=Zo.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(Zo.relative(n,d))}}return c(o,"walk"),await o(n),t}async function Yr(n,e,t){let r=[];for(let s=0;s<n.length;s+=e){let o=await Promise.all(n.slice(s,s+e).map(t));for(let i of o)i!==null&&r.push(i)}return r}async function xe(n,e=null,t){if(t)return await lw(n,t)??e;try{let r=await Ct.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(B(r))return e;throw r}}async function we(n,e,t=2){let r=Zo.dirname(n);await Ct.mkdir(r,{recursive:!0});let s=`${JSON.stringify(e,null,t)}
11
11
  `;await Ct.writeFile(n,s,"utf-8")}async function Ot(n,e=""){try{return await Ct.readFile(n,"utf-8")}catch(t){if(B(t))return e;throw t}}async function Vn(n,e){let t=Zo.dirname(n);await Ct.mkdir(t,{recursive:!0}),await Ct.writeFile(n,e,"utf-8")}async function Qr(n,e){let t=Zo.dirname(n);await Ct.mkdir(t,{recursive:!0});let r=`${n}.tmp`;await Ct.writeFile(r,e,"utf-8"),await Ct.rename(r,n)}async function E(n){try{return await Ct.access(n),!0}catch(e){if(B(e))return!1;throw e}}async function Me(n){try{return(await Ct.stat(n)).isDirectory()}catch(e){if(B(e))return!1;throw e}}async function Lt(n){await Ct.mkdir(n,{recursive:!0})}async function Jn(n,e={}){try{let r=await Ct.readdir(n,{withFileTypes:!0});return e.filesOnly&&(r=r.filter(s=>s.isFile())),e.dirsOnly&&(r=r.filter(s=>s.isDirectory())),e.extension&&(r=r.filter(s=>s.name.endsWith(e.extension))),r.map(s=>s.name)}catch(t){if(B(t))return[];throw t}}var K=h(()=>{"use strict";sd();uw();F();c(qn,"walkDir");c(Yr,"batchProcess");c(xe,"readJson");c(we,"writeJson");c(Ot,"readFile");c(Vn,"writeFile");c(Qr,"writeFileAtomic");c(E,"fileExists");c(Me,"dirExists");c(Lt,"ensureDir");c(Jn,"listFiles")});var od,dw=h(()=>{"use strict";od="mcp-remote@0.1.38"});import Mj from"node:fs";import Nj from"node:fs/promises";import pw from"node:os";import Kn from"node:path";function Oj(){let n=Lj();if(n)return{command:n,args:["mcp-server"],description:"prjct: Spec-Driven Development + project memory. When the user describes work with goals or stakes attached, call prjct_spec_create FIRST, then prjct_spec_audit (parallel reviewers), then implement, then prjct_spec_ship. Skip the spec for routine work (single-file fix, doc tweak, capture). Recognize intent in any language; never make the user type prjct commands."};try{let e=Kn.dirname(at.resolve("prjct-cli/package.json"));return{command:Kn.join(e,"bin","prjct"),args:["mcp-server"],description:"prjct: Spec-Driven Development + project memory. When the user describes work with goals or stakes attached, call prjct_spec_create FIRST, then prjct_spec_audit (parallel reviewers), then implement, then prjct_spec_ship. Skip the spec for routine work (single-file fix, doc tweak, capture). Recognize intent in any language; never make the user type prjct commands."}}catch{return{command:"npx",args:["-y","prjct-cli","mcp-server"],description:"prjct: Spec-Driven Development + project memory. When the user describes work with goals or stakes attached, call prjct_spec_create FIRST, then prjct_spec_audit (parallel reviewers), then implement, then prjct_spec_ship. Skip the spec for routine work (single-file fix, doc tweak, capture). Recognize intent in any language; never make the user type prjct commands."}}}function Lj(){let n=process.argv[1],e=[n?Kn.resolve(Kn.dirname(n),"prjct"):"",n?Kn.resolve(Kn.dirname(n),"..","bin","prjct"):"",Kn.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let t of e)if(Mj.existsSync(t))return t;return null}function Fs(){return process.env.PRJCT_TEST_MODE==="1"?Kn.join(pw.tmpdir(),"prjct-context7-test","mcp.json"):Kn.join(pw.homedir(),".claude","mcp.json")}async function mw(n=Fs()){try{let e=await Nj.readFile(n,"utf-8");return JSON.parse(e)}catch(e){let t=w(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${n}: ${w(e)}`)}}async function Fj(n,e=Fs()){await we(e,n)}async function fw(n,e,t=Fs()){let r=await mw(t),s={...r.mcpServers||{}},o=s[n];s[n]=e,r.mcpServers=s;let i=JSON.stringify(o)!==JSON.stringify(e);return await Fj(r,t),{path:t,changed:i}}async function gw(n,e=Fs()){return!!(await mw(e)).mcpServers?.[n]}var Ls,_a=h(()=>{"use strict";F();K();dw();c(Oj,"getPrjctMcpConfig");c(Lj,"resolveLocalPrjctBin");Ls={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:Oj(),linear:{command:"npx",args:["-y",od,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",od,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};c(Fs,"getClaudeMcpConfigPath");c(mw,"readMcpConfig");c(Fj,"writeMcpConfig");c(fw,"upsertMcpServer");c(gw,"hasMcpServer")});var vw={};j(vw,{buildContext7SmokePath:()=>bw,default:()=>jn,getVerifyCachePath:()=>ld});import{constants as Hj}from"node:fs";import es from"node:fs/promises";import $a from"node:os";import Ne from"node:path";function ld(){return process.env.NODE_ENV==="test"?Ne.join($a.tmpdir(),"prjct-context7-test","verify-cache.json"):Ne.join(an(),"state","context7-verify.json")}async function Uj(){try{let n=await es.readFile(ld(),"utf-8"),e=JSON.parse(n);if(typeof e?.at=="number"&&e.status)return e}catch{}return null}async function Gj(n,e){let t=ld();try{await es.mkdir(Ne.dirname(t),{recursive:!0}),await es.writeFile(t,JSON.stringify({at:n,status:e}),"utf-8")}catch{}}function qj(){let n=ze("mcp-config.json");if(!n)return{mcpServers:{context7:ad}};try{return JSON.parse(n)}catch{return{mcpServers:{context7:ad}}}}function kw(){return qj().mcpServers?.context7||ad}async function yw(n){try{return(await es.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async function Vj(n){let e=[],t=process.env.NVM_DIR||Ne.join(n,".nvm"),r=Ne.join(t,"versions","node");for(let i of await yw(r))e.push(Ne.join(r,i,"bin"));let s=process.env.FNM_DIR||Ne.join(n,".local","share","fnm"),o=Ne.join(s,"node-versions");for(let i of await yw(o))e.push(Ne.join(o,i,"installation","bin"));return e}async function bw(n=process.env.PATH||"",e=$a.homedir()){let t=new Set,r=[],s=Bj.map(i=>Ne.join(e,...i)),o=[...Wj,...s,...process.env.NVM_BIN?[process.env.NVM_BIN]:[],...process.env.VOLTA_HOME?[Ne.join(process.env.VOLTA_HOME,"bin")]:[],...process.env.ASDF_DIR?[Ne.join(process.env.ASDF_DIR,"shims")]:[],...process.env.MISE_DATA_DIR?[Ne.join(process.env.MISE_DATA_DIR,"shims")]:[],...await Vj(e)];for(let i of[...n.split(Ne.delimiter),...o]){let a=i.trim();!a||t.has(a)||(t.add(a),r.push(a))}return r.join(Ne.delimiter)}async function Jj(n,e){if(Ne.isAbsolute(n)||n.includes(Ne.sep))return n;let t=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let r of e.split(Ne.delimiter))if(r)for(let s of t){let o=Ne.join(r,n+s);try{return await es.access(o,Hj.X_OK),o}catch{}}return n}function id(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?Ne.join($a.tmpdir(),"prjct-context7-test","mcp.json"):Ne.join($a.homedir(),".claude","mcp.json")}async function ww(n){try{let e=await es.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(B(e))return{};throw e}}async function Kj(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let n=kw(),e=[...n.args||[],"--help"],t=await bw(),r=await Jj(n.command||"npx",t);await Q(r,e,{timeout:15e3,env:{...process.env,PATH:t}})}var ad,Zr,Wj,Bj,cd,zj,jn,Hs=h(()=>{"use strict";cn();ja();$s();F();fe();K();_a();c(ld,"getVerifyCachePath");c(Uj,"readPersistedVerify");c(Gj,"writePersistedVerify");ad=Ls.context7,Zr=null,Wj=[Ne.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin","/bin"],Bj=[[".bun","bin"],[".local","bin"],[".volta","bin"],[".asdf","shims"],[".local","share","mise","shims"],[".rtx","shims"],[".npm-global","bin"]];c(qj,"parseTemplateConfig");c(kw,"getContext7Config");c(yw,"listChildDirs");c(Vj,"discoverNodeManagerBinDirs");c(bw,"buildContext7SmokePath");c(Jj,"resolveExecutable");c(id,"getConfigPath");c(ww,"readConfig");c(Kj,"runSmokeCheck");cd=class{static{c(this,"Context7Service")}async install(){let e=id(),t=Ne.dirname(e);await es.mkdir(t,{recursive:!0});let r=await ww(e),s=r.mcpServers||{},o=kw(),i=s.context7;return i&&JSON.stringify(i)===JSON.stringify(o)?{installed:!0,verified:!1,configPath:e,message:"Context7 MCP already configured"}:(s.context7=o,r.mcpServers=s,await we(e,r),Zr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"})}async verify(){let e=Date.now();if(Zr&&e-Zr.at<3e5)return Zr.status;let t=await Uj();if(t?.status.verified&&e-t.at<3e5&&t.status.configPath===id())return Zr=t,t.status;let r=id(),i=((await ww(r)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:r,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await Kj();let a={installed:!0,verified:!0,configPath:r};return Zr={at:e,status:a},await Gj(e,a),a}catch(a){let l={installed:!0,verified:!1,configPath:r,message:`Context7 smoke check failed: ${w(a)}`};return Zr={at:e,status:l},l}}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}},zj=new cd,jn=zj});function Us(n,e){let t=typeof n=="string"?new Date(n).getTime():n;return Date.now()-t>e}var Ia,ei=h(()=>{"use strict";c(Us,"isExpired");Ia=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((r,s)=>r[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of t)this.cache.delete(r)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Sw,Ew=h(()=>{"use strict";Sw={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 ti(n,e){return{...Sw[n],...e}}function Da(n,e,t){return{message:n,hint:e,...t}}var Ma=h(()=>{"use strict";Ew();c(ti,"getError");c(Da,"createError")});import{execFileSync as Tw,execSync as Xj}from"node:child_process";var Na,ud,Oa,Cw,Rw=h(()=>{"use strict";ei();Ma();Na={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"}},ud=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 r=Na[e];if(!r)return this.checkUnknownTool(e);let s=this.executeCheck(r);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let r=Na[e],s=t.error||{message:`${e} is not available`,hint:r?.installHint||`Install ${e} and try again`,docs:r?.docs};throw new Oa(s)}}ensureTools(e){let t=[];for(let r of e)this.checkTool(r).available||t.push(r);if(t.length>0){let r=t.map(s=>{let o=Na[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
12
12
  `);throw new Oa({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
@@ -1128,13 +1128,13 @@ ${JSON.stringify(r.value,null,2)}`,e)}return XT(t,e)}function AN(n){try{return{o
1128
1128
  `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),n.gitLog&&(t.push(`## Recent Activity
1129
1129
  `),n.gitLog.split(`
1130
1130
  `).slice(0,5).forEach(a=>{if(a.trim()){let[l,,u,d]=a.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1131
- `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1132
- `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1131
+ `),t.push("Based on detected stack, consider generating specialized agents using `p. sync`.\n"),t.push(`---
1132
+ `),t.push("*This analysis was generated automatically. For updated information, run `p. analyze` again.*\n"),t.join(`
1133
1133
  `)}var mf=h(()=>{"use strict";Dn();El();tr();ce();Di();se();c(eC,"showSyncResult");c(tC,"getSessionActivity");c(Co,"formatTokens");c(pf,"formatDuration");c(nC,"generateSparkline");c(rC,"generateStatsMarkdown");c(sC,"generateAnalysisSummary")});async function oC(n=process.cwd(),e={}){try{let t=await te(n);if(!t.ok)return t.result;let r=t.value,s=await Eo.getSummary(r),o=await Eo.getDailyStats(r,30),i=await tC(r),a={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:a,totalTokensSaved:s.totalTokensSaved,estimatedCostSaved:s.estimatedCostSaved,compressionRate:s.compressionRate,syncCount:s.syncCount,avgSyncDuration:s.avgSyncDuration,topAgents:s.topAgents.slice(0,5),last30DaysTokens:s.last30DaysTokens,trend:s.trend,dailyStats:o.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=_.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await Eo.read(r),d=u.firstSync?new Date(u.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: ${l.padEnd(20).slice(0,20)} | Since: ${d.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"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(a.decisions>0||a.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${a.learnedDecisions} confirmed (${a.decisions} total)`),console.log(` Preferences: ${a.preferences} saved`),console.log(` Workflows: ${a.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Co(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Sl(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${pf(s.avgSyncDuration)}`),console.log(""),s.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=s.topAgents.reduce((m,f)=>m+f.usageCount,0);for(let m of s.topAgents){let f=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${f}% (${m.usageCount} uses)`)}console.log("")}if(o.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=nC(o);if(console.log(` ${p} ${Co(s.last30DaysTokens)} tokens saved`),s.trend!==0){let m=s.trend>0?"\u2191":"\u2193",f=s.trend>0?"+":"";console.log(` ${m} ${f}${s.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(""),e.export){let p=rC(s,o,l,d,i,a);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:i,patterns:a}}}catch(t){return console.error("\u274C Error:",w(t)),Ge(t)}}async function iC(n=process.cwd(),e={}){try{let t=await te(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await st.diff(r);if(!s){let o="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:o})):e.md?console.log(D("## Analysis Diff",`> ${o}`)):g.warn(o),{success:!1,error:o}}if(e.json)return console.log(JSON.stringify({success:!0,...s})),{success:!0,data:s};if(e.md)return console.log(D(pc(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(Yk(s)),console.log("");let o=[];s.summary.added>0&&o.push(`${s.summary.added} added`),s.summary.removed>0&&o.push(`${s.summary.removed} removed`),s.summary.changed>0&&o.push(`${s.summary.changed} changed`),g.done(o.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(D("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}var aC=h(()=>{"use strict";El();mc();Pr();X();Km();F();le();Qe();se();mf();_t();c(oC,"stats");c(iC,"diff")});var Ml={};j(Ml,{AnalysisCommands:()=>ff});import cC from"node:fs/promises";var lC,ff,Nl=h(()=>{"use strict";zS();z();he();mc();rE();_l();Pr();ls();F();ce();le();Qe();Di();se();qT();ZT();aC();mf();ge();_t();lC=["> Review this project data and save concise notes for future AI agents.","> Focus on architecture, conventions, risks, and gotchas. Markdown/text is fine; JSON is optional.","> Most compatible save path: write notes to a temp file, then run `prjct analysis-save-llm <file> --md`."].join(`
1134
1134
  `),ff=class extends G{static{c(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1135
1135
  `),it.init(t);let r={packageJson:await it.readPackageJson(),cargoToml:await it.readCargoToml(),goMod:await it.readGoMod(),requirements:await it.readRequirements(),directories:await it.listDirectories(),fileCount:await it.countFiles(),gitStats:await it.getGitStats(),gitLog:await it.getGitLog(20),hasDockerfile:await it.fileExists("Dockerfile"),hasDockerCompose:await it.fileExists("docker-compose.yml"),hasReadme:await it.fileExists("README.md"),hasTsconfig:await it.fileExists("tsconfig.json"),hasViteConfig:await it.fileExists("vite.config.ts")||await it.fileExists("vite.config.js"),hasNextConfig:await it.fileExists("next.config.js")||await it.fileExists("next.config.mjs")},s=sC(r,t),o=await R.readConfig(t).catch(()=>null),i=await I.getWikiPath(t,o?.vaultPath),a=`${i}/_generated/analysis/repo-summary.md`;return await cC.mkdir(`${i}/_generated/analysis`,{recursive:!0}),await cC.writeFile(a,s,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:C(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
1136
1136
  `),console.log(`\u{1F4C4} Full report: ${I.getDisplayPath(a)}
1137
- `),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:r}}catch(r){return console.error("\u274C Error:",w(r)),Ge(r)}}async sync(e=process.cwd(),t={}){try{let r=await te(e);if(!r.ok)return r.result;let s=r.value,o=Date.now();if(t.package){let a=await I.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(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Lr.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(D(Pe(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await Lr.sync(e,{full:t.full});if(!i.success)return t.md?console.log(D("## 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 b=await st.diff(s);b?.hasChanges&&(u=pc(b))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&vt.isCurrent(s,d),m=null;if(!p)try{let b=await Pm(s,e,i.git,i.stats);m=["## Analysis Payload",lC,"### Data","```json",JSON.stringify(b),"```"].join(`
1137
+ `),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:r}}catch(r){return console.error("\u274C Error:",w(r)),Ge(r)}}async sync(e=process.cwd(),t={}){try{let r=await te(e);if(!r.ok)return r.result;let s=r.value,o=Date.now();if(t.package){let a=await I.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(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Lr.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(D(Pe(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await Lr.sync(e,{full:t.full});if(!i.success)return t.md?console.log(D("## 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 b=await st.diff(s);b?.hasChanges&&(u=pc(b))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&vt.isCurrent(s,d),m=null;if(!p)try{let b=await Pm(s,e,i.git,i.stats);m=["## Analysis Payload",lC,"### Data","```json",JSON.stringify(b),"```"].join(`
1138
1138
  `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let f=$l("sync",!0),y=i.syncMetrics?.indexes,v={Duration:`${(a/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(y?.bm25Files){let b=y.bm25Files*(y.bm25AvgTokens||0);v["Tokens indexed"]=`${Math.round(b/1e3)}K`,v["Import edges"]=y.importEdges||0,v["Co-change commits"]=y.cochangeCommits||0}let k=D(Pe("Sync Complete"),Fr(v),u,i.git.hasChanges?OT("Uncommitted changes detected"):null,m,Ke(f.map(b=>({label:b.desc,command:b.cmd}))));return console.log(k),{success:!0,data:i,metrics:{elapsed:a,skillCount:l,fileCount:i.stats.fileCount}}}return eC(i,o)}catch(r){return t.md?console.log(D("## Sync Failed",`> ${w(r)}`)):g.fail(w(r)),Ge(r)}}async analysisPayload(e=process.cwd(),t={}){try{let r=await te(e);if(!r.ok)return r.result;let s=r.value,o=await Lr.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&&vt.isCurrent(s,i))return t.md?console.log(D(Pe("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 Pm(s,e,o.git,o.stats);return t.md?console.log(D("## Analysis Payload",lC,"### Data","```json",JSON.stringify(a),"```")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(r){return Ge(r)}}async regenVault(e=process.cwd(),t={}){try{let r=await te(e);if(!r.ok)return r.result;let s=r.value,o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(he(),Td))).default,l=await(await Promise.resolve().then(()=>(z(),pn))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(Fn(),$r)),m=await p(e,s);return t.md?console.log(`---
1139
1139
 
1140
1140
  ## Vault regenerated
@@ -1223,7 +1223,7 @@ ${a}`:i,FO)},"build")},e)}var FO,HO,UO,Gi,hg=h(()=>{"use strict";z();Ht();Se();A
1223
1223
  `).toLowerCase()}function oF(n){return typeof n=="string"?n:Array.isArray(n)?n.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
1224
1224
  `).trim():""}function qR(n){let e=new Set;for(let t of n.toLowerCase().split(/[^a-z0-9]+/))t.length<KR||zR.has(t)||e.add(t);return e}function iF(n){let e=[...n].filter(r=>r.length>=tF);if(e.length>0)return new Set(e);let t="";for(let r of n)(r.length>t.length||r.length===t.length&&r<t)&&(t=r);return t?new Set([t]):new Set}function au(n){let e=new Set;for(let t of n)for(let r of t.split("/")){let s=r.replace(/\.[a-z0-9]+$/i,"").toLowerCase();s.length>=KR&&!zR.has(s)&&e.add(s)}return e}function VR(n,e){let t=au([n]);for(let r of au([e]))if(t.has(r))return!0;return!1}function aF(n){let e=n.evidenceFile!==""?`touched \`${n.evidenceFile}\``:"worked the same area";return[`[skill-miss] Unused project knowledge (${n.memType}, ${n.memId}): "${n.excerpt}"`,`This session ${e} but never referenced it. Apply it, or supersede it via: prjct remember decision "<resolution>" --tags resolves:skill-miss,relates:${n.memId}`].join(`
1225
1225
  `)}function cF(n,e){let t=`${n}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return JL.createHash("sha256").update(t).digest("hex")}function lF(n,e){let t=O.recall(n,{types:[...YL],limit:120}),r=Date.now()-QL,s=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>r||e&&o.tags.session===e||s.push({id:o.id,type:o.type,content:o.content,fileTag:o.tags.file??"",rememberedAt:o.rememberedAt,provenance:o.provenance,session:o.tags.session??""}));return s}function uF(n){try{let e=O.recall(n,{types:["improvement-signal"],tags:{source:JR},limit:100,dedupeByKey:!1}),t=new Set;for(let r of e)r.tags.key&&t.add(r.tags.key);return t}catch{return new Set}}function dF(n){try{let e=at("node:fs"),r=at("node:path").join(n,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(r,"utf-8")).projectId??null}catch{return null}}var JR,zL,XL,YL,QL,ZL,eF,KR,tF,zR,YR=h(()=>{"use strict";Se();Ti();Ac();Ji();nr();JR="skill-miss-detector",zL=3,XL=280,YL=["decision","gotcha","anti-pattern"],QL=5400*1e3,ZL=360*60*1e3,eF=2,KR=5,tF=8,zR=new Set(["should","because","project","prjct","instead","always","never","using","value","state","change","changes","update","updated","function","return","returns","error","errors","tests","testing","config","default","import","export","before","after","without"]);c(XR,"detectSkillMisses");c(nF,"analyze");c(rF,"parseJsonl");c(sF,"transcriptTextOf");c(oF,"textOf");c(qR,"tokenize");c(iF,"signatureOf");c(au,"fileStems");c(VR,"sharesStem");c(aF,"formatSkillMiss");c(cF,"hashKey");c(lF,"recallCandidates");c(uF,"existingSkillMissKeys");c(dF,"projectIdFromPath")});import pF from"node:crypto";import mF from"node:fs/promises";async function nx(n,e,t,r={}){let s={scanned:0,ingested:0,skipped:[],errors:[]},o=r.preloadedConfig!==void 0?r.preloadedConfig:await R.readConfig(n).catch(()=>null);if(!o?.projectId)return s.errors.push("no project config"),s;let i;if(r.preloadedLines)i=r.preloadedLines;else{let p;try{p=await mF.readFile(e,"utf-8")}catch(m){return s.errors.push(`transcript read failed: ${m.message}`),s}i=Ur(p)}let a=hF(i);if(s.scanned=a.length,a.length===0)return s;let l=kF(a);if(l.length===0)return s;let u=SF(o.projectId),d=t?t.slice(0,12):"unknown";for(let p of l){if(u.has(p.hash)){s.skipped.push({reason:"duplicate",phrase:p.matchedPhrase});continue}try{await O.remember(n,{type:p.type,content:p.content,tags:{source:ex,session:d,hash:p.hash,phrase:p.matchedPhrase},provenance:"inferred",projectId:o.projectId}),s.ingested+=1}catch(m){s.errors.push(`remember failed: ${m.message}`)}}return s}function hF(n){let e=[];for(let t of n){let r=yF(t);if(r!=="assistant")continue;let s=wF(t);!s||s.length<tx||e.push({role:r,text:s})}return e}function yF(n){let e=n.role;if(typeof e=="string")return ZR(e);let t=n.message;if(t&&typeof t=="object"&&"role"in t){let s=t.role;if(typeof s=="string")return ZR(s)}let r=n.type;return r==="assistant"||r==="user"||r==="system"?r:null}function ZR(n){let e=n.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}function wF(n){let e=n.content;if(e===void 0&&n.message&&typeof n.message=="object"&&(e=n.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let r of e){if(!r||typeof r!="object")continue;let s=r;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(`
1226
- `).trim()}return""}function kF(n){let e=[],t=new Set;for(let r of n){let s=bF(r.text);for(let o of s){if(e.length>=fF)return e;if(o.length<tx)continue;let i=o.toLowerCase(),a=gF.find(d=>i.includes(d.phrase));if(!a)continue;let l=o.length>QR?`${o.slice(0,QR)}\u2026`:o,u=vF(l);t.has(u)||(t.add(u),e.push({type:a.type,content:l,hash:u,matchedPhrase:a.phrase}))}}return e}function bF(n){return n.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}function vF(n){return pF.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}function SF(n){let e=new Set;try{let{prjctDb:t}=(X(),et(wr)),{REMEMBER_EVENT_RANGE:r}=(Tr(),et(Dk)),s=t.query(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...r);for(let o of s){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==ex)continue;let l=a.hash;typeof l=="string"&&e.add(l)}}catch{}return e}var ex,tx,QR,fF,gF,rx=h(()=>{"use strict";z();Se();Ji();ex="transcript-auto",tx=80,QR=1500,fF=12,gF=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"}];c(nx,"ingestTranscript");c(hF,"projectMessages");c(yF,"inferRole");c(ZR,"normalizeRole");c(wF,"extractText");c(kF,"extractCandidates");c(bF,"splitParagraphs");c(vF,"hashContent");c(SF,"collectExistingAutoHashes")});var sx={};j(sx,{runStopHook:()=>Ig});import EF from"node:fs/promises";function Ig(n=process.cwd(),e){return Je({event:"Stop",projectPath:n,afterEmit:c(async(t,r)=>{let s=await R.readConfig(r).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await EF.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Ur(i))}try{await Fp(r)}catch{}try{await Up(r,s)}catch{}if(t.transcript_path)try{await nx(r,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await FR(r,s)}catch{}try{await IR(r,s)}catch{}try{let i=await GR(s.projectId);await WR(s.projectId,i)}catch{}if(t.transcript_path)try{if((await AR(r,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:a}=await Promise.resolve().then(()=>(Ao(),cR)),u=(await a(s.projectId,r)).current?.id;u&&mt.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await XR(r,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await Vi.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(Wf(),Gf));await i(r,s)}catch{}await Ei(r,s.projectId).catch(()=>{})},"afterEmit")},e)}var Dg=h(()=>{"use strict";z();su();jR();DR();HR();BR();YR();Ji();rx();nr();Fn();Sc();dn();c(Ig,"runStopHook")});var ox={};j(ox,{runSubagentStartHook:()=>Mg});function Mg(n=process.cwd(),e){return Je({event:"SubagentStart",projectPath:n,build:c((t,r)=>ng(r),"build")},e)}var Ng=h(()=>{"use strict";dn();Ui();c(Mg,"runSubagentStartHook")});var ix={};j(ix,{runSubagentStopHook:()=>Og});function Og(n=process.cwd(),e){return Je({event:"SubagentStop",projectPath:n,build:c(async(t,r)=>{let s=await R.readConfig(r).catch(()=>null);if(!s?.projectId||Po(s)==="off")return null;let o=[];try{let i=await dr(s.projectId,r);i.current&&o.push(`active: ${i.current.description}`)}catch{}try{let i=await ot.getActiveTasks(s.projectId);i.length>0&&o.push(`pending: ${i.length}`)}catch{}return await zl("prjct \u2014 subagent finished",o.join(" \xB7 ")||"A subagent finished"),null},"build")},e)}var Lg=h(()=>{"use strict";z();Ao();or();Xl();dn();c(Og,"runSubagentStopHook")});var cx={};j(cx,{HOOK_RUNNERS:()=>ax,getHookRunner:()=>Fg});function Fg(n){return n?ax[n]:void 0}var ax,Hg=h(()=>{"use strict";og();cg();ug();pg();fg();hg();Ui();Dg();Ng();Lg();ax={"session-start":rg,prompt:gg,"pre-commit":dg,"pre-edit":mg,"post-edit":lg,stop:Ig,"subagent-start":Mg,"subagent-stop":Og,notification:ag,"cwd-changed":sg};c(Fg,"getHookRunner")});var zi,Tn,TF,lx,Ug,cu=h(()=>{"use strict";zi={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}},Tn=[{name:"init",group:"core",routing:{group:"planning",method:"init"},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",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"]},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",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},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 derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},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",routing:{group:"analysis",method:"regenVault"},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",routing:{group:"primitives",method:"status"},optionSchema:{},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",routing:{group:"primitives",method:"tag"},optionSchema:{},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",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"]},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:"forget",group:"core",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"prjct forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},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",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},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",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},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",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces and the Claude hooks adapter",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},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:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"/p:lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"/p:tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"/p:sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"/p:notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"/p:agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"/p:value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"/p:memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"/p:report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"/p:handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"/p:guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"/p:cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},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",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",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",routing:{group:"setup",method:"login"},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",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},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",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},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:"search",group:"core",routing:{group:"context",method:"search"},optionSchema:{},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'prjct search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},routingMode:"bin-only",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",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",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",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},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:"embeddings",group:"core",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"/p:embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"guard",group:"core",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"/p:guard <file>",terminal:"prjct guard <file>"},params:"<file>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"core",routing:{group:"config",method:"config"},optionSchema:{},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"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'/p:spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to ~/Documents/prjct/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"/p:audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`"],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e])=>({name:n,group:"setup",description:e,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],TF={"-h":"help","--help":"help","-v":"version","--version":"version"},lx=new Set(Tn.filter(n=>n.routingMode==="cold-only").map(n=>n.name)),Ug=new Set([...Tn.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(TF).filter(([,n])=>Tn.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)])});var ux={};j(ux,{BIN_COMMANDS_SET:()=>RF,REGISTERED_VERBS_SET:()=>CF,SHIM_SKIP_SET:()=>xF});var CF,RF,xF,dx=h(()=>{"use strict";cu();CF=new Set(Tn.filter(n=>n.routing).map(n=>n.name)),RF=Ug,xF=new Set([...Ug,...lx])});var fx={};j(fx,{sessionTracker:()=>Xi});var px,mx,Gg,Xi,Wg=h(()=>{"use strict";ja();X();ei();ce();px=50,mx=200,Gg=class{static{c(this,"SessionTracker")}async read(e){try{return _.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){_.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Us(e.lastActivity,t)}async touch(e){let t=await this.read(e),r=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=r,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:r,lastActivity:r,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,r){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:r}),s.current.commands.length>px&&(s.current.commands=s.current.commands.slice(-px)),await this.write(e,s)}async trackFile(e,t,r){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:r,timestamp:o}),s.current.files.length>mx&&(s.current.files=s.current.files.slice(-mx)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let r=t.current,s=Date.now(),o=new Date(r.createdAt).getTime(),i=new Date(r.lastActivity).getTime(),a=s-i,l=t.config.idleTimeoutMs,u=Math.max(0,l-a),d=r.commands.map(f=>f.command),p=new Set(r.files.filter(f=>f.operation==="read").map(f=>f.path)).size,m=new Set(r.files.filter(f=>f.operation==="write").map(f=>f.path)).size;return{active:!0,id:r.id,duration:ni(s-o),idleSince:r.lastActivity,idleMs:a,expiresIn:ni(u),commandCount:r.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Xi=new Gg});var hx={};j(hx,{default:()=>Yi,performanceTracker:()=>gx});var PF,Bg,gx,Yi,qg=h(()=>{"use strict";X();PF=BigInt(300*1e9),Bg=class{static{c(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let r=process.hrtime.bigint();return this.marks.delete(e),Number(r-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,r]of this.marks)e-r>PF&&this.marks.delete(t)}recordTiming(e,t,r,s){S.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(r*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let r=this.snapshotMemory(),s=[{metric:"heap_used",value:r.heapUsed,unit:"bytes"},{metric:"heap_total",value:r.heapTotal,unit:"bytes"},{metric:"rss",value:r.rss,unit:"bytes"},{metric:"external_memory",value:r.external,unit:"bytes"}];for(let o of s)S.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return r}recordContextCorrectness(e,t){S.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){S.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let r=t.toISOString();return S.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",r).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let r=new Date;r.setDate(r.getDate()-t),r.setHours(0,0,0,0);let s=this.getMetrics(e,r),o={period:`${t}d`},i=s.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(f=>f.value);o.startup={avg:Math.round(m.reduce((f,y)=>f+y,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=s.filter(m=>"metric"in m&&m.metric==="heap_used"),l=s.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=c(v=>Math.round(v/1048576*10)/10,"toMB"),f=a.map(v=>v.value),y=l.map(v=>v.value);o.memory={avgHeapMB:m(f.reduce((v,k)=>v+k,0)/f.length),peakHeapMB:m(Math.max(...f)),avgRssMB:y.length>0?m(y.reduce((v,k)=>v+k,0)/y.length):0}}let u=s.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(f=>f.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=s.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(f=>f.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=s.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let f of p){let y=f.context?.command||"unknown";m[y]||(m[y]=[]),m[y].push(f.value)}o.commandDurations={};for(let[f,y]of Object.entries(m))o.commandDurations[f]={avg:Math.round(y.reduce((v,k)=>v+k,0)/y.length),min:Math.min(...y),max:Math.max(...y),count:y.length,unit:"ms"}}return o}},gx=new Bg,Yi=gx});function yx(n){let e=n.trim();for(let{type:t,patterns:r}of jF){let s=e.match(r);if(s){let o=s[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}function lu(n){let e=n.trim();if(e.startsWith('"')){let r=e.indexOf('"',1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}if(e.startsWith("'")){let r=e.indexOf("'",1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function wx(n,e){let t=e.toLowerCase();return n.filter(r=>r.action.toLowerCase().includes(t)||(r.description?.toLowerCase().includes(t)??!1)||r.command.toLowerCase().includes(t)||String(r.id)===t)}var jF,Vg=h(()=>{"use strict";jF=[{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}];c(yx,"detectIntent");c(lu,"parseAction");c(wx,"searchRules")});var Gr,Jg=h(()=>{"use strict";Gr={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function uu(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var Kg,kx,zg=h(()=>{"use strict";Kg=["task","done","ship","sync"],kx=["before","after"];c(uu,"newRuleDefaults")});async function vx(n,e,t){let[r,s]=lu(n);if(!r||!s)return L('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=s.split(/\s+/),i=o[0]?.toLowerCase(),a=o[1]?.toLowerCase();if(!i||!kx.includes(i))return L('Position must be "before" or "after"',t);let l=Dl(e,a,t);if(!l.ok)return l.result;let u=ie.addRule(e,{type:"hook",command:l.value.name,position:i,action:r,timeoutMs:Gr.HOOK_DEFAULT_MS,...uu()});return t.md?console.log(D(Pe("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${r}\``),Ke([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):Bt(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${r}`),{success:!0,ruleId:u}}async function Sx(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=Dl(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),[i]=lu(o);if(!i)return L('Usage: prjct workflow gate <command> "shell command"',t);let a=ie.addRule(e,{type:"gate",command:s.value.name,position:"before",action:i,timeoutMs:Gr.GATE_DEFAULT_MS,...uu()});return t.md?console.log(D(Pe("Gate Added",`#${a} [gate] before ${s.value.name} \u2192 \`${i}\``),Ke([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${a} --md`}]))):Bt(`gate #${a} added: before ${s.value.name} \u2192 ${i}`),{success:!0,ruleId:a}}async function Ex(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=Dl(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let a=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=lu(l);if(!u)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=ie.addRule(e,{type:"instruction",command:s.value.name,position:a,action:u,timeoutMs:Gr.INSTRUCTION_MS,...uu()});return t.md?console.log(D(Pe("Instruction Added",`#${d} [instruction] ${a} ${s.value.name} \u2192 \`${u}\``),Ke([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):Bt(`instruction #${d} added: ${a} ${s.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function Tx(n,e,t){let r=parseInt(n.trim(),10);return Number.isNaN(r)?L("Usage: prjct workflow rm <rule-id>",t):ie.removeRule(e,r)?(t.md?console.log(D(Pe("Rule Removed",`Removed rule #${r}`))):Bt(`removed rule #${r}`),{success:!0}):L(`Rule #${r} not found`,t)}async function Cx(n,e){let t=ie.resetRules(n),r=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(D(Pe("Rules Reset",r))):Bt(`reset: ${r.toLowerCase()}`),{success:!0,count:t}}async function Rx(n,e,t){let r=n.trim(),s=parseInt(r,10);if(!Number.isNaN(s)){let d=ie.getRuleById(e,s);if(!d)return L(`Rule #${s} not found`,t);if(!d.enabled){let p=`Rule #${s} is already disabled`;return t.md?console.log(`> ${p}`):kn(p),{success:!0,message:p}}return ie.updateRule(e,s,{enabled:!1}),t.md?console.log(D(Pe("Rule Disabled",`#${s} [${d.type}] ${d.action}`),Ke([{label:"Re-enable this rule",command:`prjct workflow enable ${s} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):Bt(`disabled rule #${s}: ${d.action}`),{success:!0,ruleId:s}}let o=ie.getAllRules(e),i=wx(o,r);if(i.length===0)return L(`No rules matching "${r}"`,t);if(i.length===1){let d=i[0];return ie.updateRule(e,d.id,{enabled:!1}),t.md?console.log(D(Pe("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):Bt(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let a=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=a.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log(D(Z("Multiple matches",`${i.length} rules match "${r}"`),He(d),Ke(a.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{kn(`${i.length} rules match "${r}" \u2014 specify an ID:`);for(let d of a)console.log(` #${d.id} [${d.type}] ${d.position} ${d.command} -> ${d.action}`);u&&console.log(` ${u}`)}return{success:!0,matches:i.map(d=>d.id)}}var xx=h(()=>{"use strict";rr();le();Qe();Jg();_t();Vg();zg();c(vx,"workflowAdd");c(Sx,"workflowGate");c(Ex,"workflowInstruction");c(Tx,"workflowRm");c(Cx,"workflowReset");c(Rx,"workflowDisable")});function Ax(n,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),r=e.filter(m=>m.type==="instruction"&&m.position==="before"),s=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=c((m,f,y)=>{let v=f.map(T=>` ${T.enabled?y:"o"} #${T.id} ${T.action}`),k=[m,...v],A=Math.max(...k.map(T=>T.length))+2;u.push(`+${"-".repeat(A)}+`);for(let T of k)u.push(`| ${T.padEnd(A-1)}|`);u.push(`+${"-".repeat(A)}+`)},"drawBox"),p=c(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),r.length>0&&(d("INSTRUCTIONS (before)",r,"\u{1F4CB}"),p(u)),s.length>0&&(d("HOOKS (before)",s,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${n.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1226
+ `).trim()}return""}function kF(n){let e=[],t=new Set;for(let r of n){let s=bF(r.text);for(let o of s){if(e.length>=fF)return e;if(o.length<tx)continue;let i=o.toLowerCase(),a=gF.find(d=>i.includes(d.phrase));if(!a)continue;let l=o.length>QR?`${o.slice(0,QR)}\u2026`:o,u=vF(l);t.has(u)||(t.add(u),e.push({type:a.type,content:l,hash:u,matchedPhrase:a.phrase}))}}return e}function bF(n){return n.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}function vF(n){return pF.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}function SF(n){let e=new Set;try{let{prjctDb:t}=(X(),et(wr)),{REMEMBER_EVENT_RANGE:r}=(Tr(),et(Dk)),s=t.query(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...r);for(let o of s){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==ex)continue;let l=a.hash;typeof l=="string"&&e.add(l)}}catch{}return e}var ex,tx,QR,fF,gF,rx=h(()=>{"use strict";z();Se();Ji();ex="transcript-auto",tx=80,QR=1500,fF=12,gF=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"}];c(nx,"ingestTranscript");c(hF,"projectMessages");c(yF,"inferRole");c(ZR,"normalizeRole");c(wF,"extractText");c(kF,"extractCandidates");c(bF,"splitParagraphs");c(vF,"hashContent");c(SF,"collectExistingAutoHashes")});var sx={};j(sx,{runStopHook:()=>Ig});import EF from"node:fs/promises";function Ig(n=process.cwd(),e){return Je({event:"Stop",projectPath:n,afterEmit:c(async(t,r)=>{let s=await R.readConfig(r).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await EF.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Ur(i))}try{await Fp(r)}catch{}try{await Up(r,s)}catch{}if(t.transcript_path)try{await nx(r,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await FR(r,s)}catch{}try{await IR(r,s)}catch{}try{let i=await GR(s.projectId);await WR(s.projectId,i)}catch{}if(t.transcript_path)try{if((await AR(r,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:a}=await Promise.resolve().then(()=>(Ao(),cR)),u=(await a(s.projectId,r)).current?.id;u&&mt.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await XR(r,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await Vi.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(Wf(),Gf));await i(r,s)}catch{}await Ei(r,s.projectId).catch(()=>{})},"afterEmit")},e)}var Dg=h(()=>{"use strict";z();su();jR();DR();HR();BR();YR();Ji();rx();nr();Fn();Sc();dn();c(Ig,"runStopHook")});var ox={};j(ox,{runSubagentStartHook:()=>Mg});function Mg(n=process.cwd(),e){return Je({event:"SubagentStart",projectPath:n,build:c((t,r)=>ng(r),"build")},e)}var Ng=h(()=>{"use strict";dn();Ui();c(Mg,"runSubagentStartHook")});var ix={};j(ix,{runSubagentStopHook:()=>Og});function Og(n=process.cwd(),e){return Je({event:"SubagentStop",projectPath:n,build:c(async(t,r)=>{let s=await R.readConfig(r).catch(()=>null);if(!s?.projectId||Po(s)==="off")return null;let o=[];try{let i=await dr(s.projectId,r);i.current&&o.push(`active: ${i.current.description}`)}catch{}try{let i=await ot.getActiveTasks(s.projectId);i.length>0&&o.push(`pending: ${i.length}`)}catch{}return await zl("prjct \u2014 subagent finished",o.join(" \xB7 ")||"A subagent finished"),null},"build")},e)}var Lg=h(()=>{"use strict";z();Ao();or();Xl();dn();c(Og,"runSubagentStopHook")});var cx={};j(cx,{HOOK_RUNNERS:()=>ax,getHookRunner:()=>Fg});function Fg(n){return n?ax[n]:void 0}var ax,Hg=h(()=>{"use strict";og();cg();ug();pg();fg();hg();Ui();Dg();Ng();Lg();ax={"session-start":rg,prompt:gg,"pre-commit":dg,"pre-edit":mg,"post-edit":lg,stop:Ig,"subagent-start":Mg,"subagent-stop":Og,notification:ag,"cwd-changed":sg};c(Fg,"getHookRunner")});var zi,Tn,TF,lx,Ug,cu=h(()=>{"use strict";zi={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}},Tn=[{name:"init",group:"core",routing:{group:"planning",method:"init"},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",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"]},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",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},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 derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},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",routing:{group:"analysis",method:"regenVault"},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",routing:{group:"primitives",method:"status"},optionSchema:{},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",routing:{group:"primitives",method:"tag"},optionSchema:{},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",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"]},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:"forget",group:"core",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"prjct forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},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",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},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",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},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",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces and the Claude hooks adapter",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},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:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"/p:lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"/p:tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"/p:sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"/p:notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"/p:agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"/p:value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"/p:memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"/p:report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"/p:handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"/p:guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"/p:cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},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",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",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",routing:{group:"setup",method:"login"},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",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},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",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},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:"search",group:"core",routing:{group:"context",method:"search"},optionSchema:{},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'prjct search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},routingMode:"bin-only",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",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",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",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},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:"embeddings",group:"core",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"/p:embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"guard",group:"core",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"/p:guard <file>",terminal:"prjct guard <file>"},params:"<file>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"core",routing:{group:"config",method:"config"},optionSchema:{},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"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'/p:spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to ~/Documents/prjct/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"/p:audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`"],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e])=>({name:n,group:"setup",description:e,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],TF={"-h":"help","--help":"help","-v":"version","--version":"version"},lx=new Set(Tn.filter(n=>n.routingMode==="cold-only").map(n=>n.name)),Ug=new Set([...Tn.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(TF).filter(([,n])=>Tn.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)])});var ux={};j(ux,{BIN_COMMANDS_SET:()=>RF,REGISTERED_VERBS_SET:()=>CF,SHIM_SKIP_SET:()=>xF});var CF,RF,xF,dx=h(()=>{"use strict";cu();CF=new Set(Tn.filter(n=>n.routing).map(n=>n.name)),RF=Ug,xF=new Set([...Ug,...lx])});var fx={};j(fx,{sessionTracker:()=>Xi});var px,mx,Gg,Xi,Wg=h(()=>{"use strict";ja();X();ei();ce();px=50,mx=200,Gg=class{static{c(this,"SessionTracker")}async read(e){try{return _.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){_.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Us(e.lastActivity,t)}async touch(e){let t=await this.read(e),r=C();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=r,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:r,lastActivity:r,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,r){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:r}),s.current.commands.length>px&&(s.current.commands=s.current.commands.slice(-px)),await this.write(e,s)}async trackFile(e,t,r){let s=await this.read(e);if(!s.current)return;let o=C();s.current.lastActivity=o,s.current.files.push({path:t,operation:r,timestamp:o}),s.current.files.length>mx&&(s.current.files=s.current.files.slice(-mx)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let r=t.current,s=Date.now(),o=new Date(r.createdAt).getTime(),i=new Date(r.lastActivity).getTime(),a=s-i,l=t.config.idleTimeoutMs,u=Math.max(0,l-a),d=r.commands.map(f=>f.command),p=new Set(r.files.filter(f=>f.operation==="read").map(f=>f.path)).size,m=new Set(r.files.filter(f=>f.operation==="write").map(f=>f.path)).size;return{active:!0,id:r.id,duration:ni(s-o),idleSince:r.lastActivity,idleMs:a,expiresIn:ni(u),commandCount:r.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Xi=new Gg});var hx={};j(hx,{default:()=>Yi,performanceTracker:()=>gx});var PF,Bg,gx,Yi,qg=h(()=>{"use strict";X();PF=BigInt(300*1e9),Bg=class{static{c(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let r=process.hrtime.bigint();return this.marks.delete(e),Number(r-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,r]of this.marks)e-r>PF&&this.marks.delete(t)}recordTiming(e,t,r,s){S.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(r*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let r=this.snapshotMemory(),s=[{metric:"heap_used",value:r.heapUsed,unit:"bytes"},{metric:"heap_total",value:r.heapTotal,unit:"bytes"},{metric:"rss",value:r.rss,unit:"bytes"},{metric:"external_memory",value:r.external,unit:"bytes"}];for(let o of s)S.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return r}recordContextCorrectness(e,t){S.appendEvent(e,"perf.context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){S.appendEvent(e,"perf.subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let r=t.toISOString();return S.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",r).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let r=new Date;r.setDate(r.getDate()-t),r.setHours(0,0,0,0);let s=this.getMetrics(e,r),o={period:`${t}d`},i=s.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(f=>f.value);o.startup={avg:Math.round(m.reduce((f,y)=>f+y,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let a=s.filter(m=>"metric"in m&&m.metric==="heap_used"),l=s.filter(m=>"metric"in m&&m.metric==="rss");if(a.length>0){let m=c(v=>Math.round(v/1048576*10)/10,"toMB"),f=a.map(v=>v.value),y=l.map(v=>v.value);o.memory={avgHeapMB:m(f.reduce((v,k)=>v+k,0)/f.length),peakHeapMB:m(Math.max(...f)),avgRssMB:y.length>0?m(y.reduce((v,k)=>v+k,0)/y.length):0}}let u=s.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(f=>f.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=s.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(f=>f.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=s.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let f of p){let y=f.context?.command||"unknown";m[y]||(m[y]=[]),m[y].push(f.value)}o.commandDurations={};for(let[f,y]of Object.entries(m))o.commandDurations[f]={avg:Math.round(y.reduce((v,k)=>v+k,0)/y.length),min:Math.min(...y),max:Math.max(...y),count:y.length,unit:"ms"}}return o}},gx=new Bg,Yi=gx});function yx(n){let e=n.trim();for(let{type:t,patterns:r}of jF){let s=e.match(r);if(s){let o=s[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}function lu(n){let e=n.trim();if(e.startsWith('"')){let r=e.indexOf('"',1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}if(e.startsWith("'")){let r=e.indexOf("'",1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function wx(n,e){let t=e.toLowerCase();return n.filter(r=>r.action.toLowerCase().includes(t)||(r.description?.toLowerCase().includes(t)??!1)||r.command.toLowerCase().includes(t)||String(r.id)===t)}var jF,Vg=h(()=>{"use strict";jF=[{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}];c(yx,"detectIntent");c(lu,"parseAction");c(wx,"searchRules")});var Gr,Jg=h(()=>{"use strict";Gr={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function uu(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var Kg,kx,zg=h(()=>{"use strict";Kg=["task","done","ship","sync"],kx=["before","after"];c(uu,"newRuleDefaults")});async function vx(n,e,t){let[r,s]=lu(n);if(!r||!s)return L('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=s.split(/\s+/),i=o[0]?.toLowerCase(),a=o[1]?.toLowerCase();if(!i||!kx.includes(i))return L('Position must be "before" or "after"',t);let l=Dl(e,a,t);if(!l.ok)return l.result;let u=ie.addRule(e,{type:"hook",command:l.value.name,position:i,action:r,timeoutMs:Gr.HOOK_DEFAULT_MS,...uu()});return t.md?console.log(D(Pe("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${r}\``),Ke([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):Bt(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${r}`),{success:!0,ruleId:u}}async function Sx(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=Dl(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),[i]=lu(o);if(!i)return L('Usage: prjct workflow gate <command> "shell command"',t);let a=ie.addRule(e,{type:"gate",command:s.value.name,position:"before",action:i,timeoutMs:Gr.GATE_DEFAULT_MS,...uu()});return t.md?console.log(D(Pe("Gate Added",`#${a} [gate] before ${s.value.name} \u2192 \`${i}\``),Ke([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${a} --md`}]))):Bt(`gate #${a} added: before ${s.value.name} \u2192 ${i}`),{success:!0,ruleId:a}}async function Ex(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=Dl(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let a=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=lu(l);if(!u)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=ie.addRule(e,{type:"instruction",command:s.value.name,position:a,action:u,timeoutMs:Gr.INSTRUCTION_MS,...uu()});return t.md?console.log(D(Pe("Instruction Added",`#${d} [instruction] ${a} ${s.value.name} \u2192 \`${u}\``),Ke([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):Bt(`instruction #${d} added: ${a} ${s.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function Tx(n,e,t){let r=parseInt(n.trim(),10);return Number.isNaN(r)?L("Usage: prjct workflow rm <rule-id>",t):ie.removeRule(e,r)?(t.md?console.log(D(Pe("Rule Removed",`Removed rule #${r}`))):Bt(`removed rule #${r}`),{success:!0}):L(`Rule #${r} not found`,t)}async function Cx(n,e){let t=ie.resetRules(n),r=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(D(Pe("Rules Reset",r))):Bt(`reset: ${r.toLowerCase()}`),{success:!0,count:t}}async function Rx(n,e,t){let r=n.trim(),s=parseInt(r,10);if(!Number.isNaN(s)){let d=ie.getRuleById(e,s);if(!d)return L(`Rule #${s} not found`,t);if(!d.enabled){let p=`Rule #${s} is already disabled`;return t.md?console.log(`> ${p}`):kn(p),{success:!0,message:p}}return ie.updateRule(e,s,{enabled:!1}),t.md?console.log(D(Pe("Rule Disabled",`#${s} [${d.type}] ${d.action}`),Ke([{label:"Re-enable this rule",command:`prjct workflow enable ${s} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):Bt(`disabled rule #${s}: ${d.action}`),{success:!0,ruleId:s}}let o=ie.getAllRules(e),i=wx(o,r);if(i.length===0)return L(`No rules matching "${r}"`,t);if(i.length===1){let d=i[0];return ie.updateRule(e,d.id,{enabled:!1}),t.md?console.log(D(Pe("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):Bt(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let a=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=a.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log(D(Z("Multiple matches",`${i.length} rules match "${r}"`),He(d),Ke(a.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{kn(`${i.length} rules match "${r}" \u2014 specify an ID:`);for(let d of a)console.log(` #${d.id} [${d.type}] ${d.position} ${d.command} -> ${d.action}`);u&&console.log(` ${u}`)}return{success:!0,matches:i.map(d=>d.id)}}var xx=h(()=>{"use strict";rr();le();Qe();Jg();_t();Vg();zg();c(vx,"workflowAdd");c(Sx,"workflowGate");c(Ex,"workflowInstruction");c(Tx,"workflowRm");c(Cx,"workflowReset");c(Rx,"workflowDisable")});function Ax(n,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),r=e.filter(m=>m.type==="instruction"&&m.position==="before"),s=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),a=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=c((m,f,y)=>{let v=f.map(T=>` ${T.enabled?y:"o"} #${T.id} ${T.action}`),k=[m,...v],A=Math.max(...k.map(T=>T.length))+2;u.push(`+${"-".repeat(A)}+`);for(let T of k)u.push(`| ${T.padEnd(A-1)}|`);u.push(`+${"-".repeat(A)}+`)},"drawBox"),p=c(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),r.length>0&&(d("INSTRUCTIONS (before)",r,"\u{1F4CB}"),p(u)),s.length>0&&(d("HOOKS (before)",s,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${n.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1227
1227
  `)}var Px=h(()=>{"use strict";c(Ax,"buildFlowDiagram")});async function jx(n){return n.md?console.log(D(Z("Workflow Help","Manage hooks, gates, and steps for your workflow"),Z("Commands",He(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),Z("Natural Language (EN/ES)",He(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async function du(n,e,t){let r=n!==null&&Kg.includes(n),s=r?ie.getRulesForCommand(e,n):ie.getAllRules(e);if(s.length===0)return t.md?console.log(D(Z("Workflow Rules","No rules configured"),Ke([{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'}]))):(kn("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(t.md){let o=r?[n]:Kg,i=[];for(let u of o){let d=s.filter(p=>p.command===u);d.length!==0&&i.push(Ax(u,d))}let a=r?`Workflow: ${n}`:"Workflow Rules",l=`${s.length} rule${s.length!==1?"s":""}`;console.log(D(Z(a,l),i.length>0?NT(i.join(`
1228
1228
 
1229
1229
  `),""):null,Ke([{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 o=r?`WORKFLOW RULES: ${n.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(o),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 i of s){let a=i.enabled?"":" (disabled)";console.log(` #${i.id} [${i.type}] ${i.position.padEnd(6)} ${i.command.padEnd(5)} \u2192 ${i.action}${a}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:s}}var _x=h(()=>{"use strict";rr();le();Qe();Px();zg();c(jx,"workflowHelp");c(du,"workflowShow")});import Xg from"node:fs/promises";import _F from"node:os";import pu from"node:path";var Yg,Qg,$x=h(()=>{"use strict";F();K();Yg=class{static{c(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=pu.join(_F.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await Xg.mkdir(this.commandsPath,{recursive:!0});let r=pu.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await Xg.writeFile(r,s,"utf-8"),{success:!0,path:r}}catch(r){return{success:!1,error:w(r)}}}async deleteWorkflowTemplate(e){try{let t=pu.join(this.commandsPath,`${e}.md`);return await Xg.unlink(t),{success:!0}}catch(t){return B(t)?{success:!0}:{success:!1,error:w(t)}}}async templateExists(e){let t=pu.join(this.commandsPath,`${e}.md`);return E(t)}buildTemplateContent(e,t){return`---
@@ -1389,12 +1389,12 @@ if [[ -f "$CONFIG" ]]; then
1389
1389
 
1390
1390
  # If no cliVersion or different version, show update notice
1391
1391
  if [[ -z "$PROJECT_VERSION" ]] || [[ "$PROJECT_VERSION" != "$CLI_VERSION" ]]; then
1392
- echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run /p:sync"
1392
+ echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run p. sync"
1393
1393
  exit 0
1394
1394
  fi
1395
1395
  else
1396
1396
  # No project.json means project needs sync
1397
- echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run /p:sync"
1397
+ echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run p. sync"
1398
1398
  exit 0
1399
1399
  fi
1400
1400
 
@@ -1526,7 +1526,7 @@ scope:`);for(let i of o.content.scope)console.log(` - ${i}`)}if(o.content.out_o
1526
1526
  out of scope:`);for(let i of o.content.out_of_scope)console.log(` - ${i}`)}if(o.content.risks.length>0){console.log(`
1527
1527
  risks:`);for(let i of o.content.risks)console.log(` - ${i.risk} \u2192 ${i.mitigation}`)}if(o.content.test_plan.length>0){console.log(`
1528
1528
  test plan:`);for(let i of o.content.test_plan)console.log(` - ${i}`)}}return{success:!0,spec:o}}catch(s){return P(w(s))}}async update(e=null,t=process.cwd(),r={}){try{if(!e)return L(`Usage: prjct spec update <id> --json '{"goal": "...", ...}'`);let s=typeof r.json=="string"?r.json:"";if(!s)return L("--json is required");let o=await this.ensureProjectInit(t);if(!o.success)return o;let i;try{i=JSON.parse(s)}catch{return L("--json is not valid JSON")}if(i===null||typeof i!="object"||Array.isArray(i))return L("--json must decode to an object");let a=await It.get(t,e);if(!a)return L(`spec not found: ${e}`);let l=sr.parse({...a.content,...i}),u=await It.update(t,e,l);return u?(r.md?console.log(`\u2713 spec updated: ${u.title}`):g.done(`spec updated: ${u.title}`),{success:!0,specId:u.id}):L(`spec not found: ${e}`)}catch(s){return P(w(s))}}async setStatus(e=null,t=process.cwd(),r={}){try{if(!e)return L("Usage: prjct spec set-status <id> <status>");let s=r.status;if(!s||!_r.includes(s))return L(`status must be one of: ${_r.join(", ")}`);let o=await this.ensureProjectInit(t);return o.success?await It.setStatus(t,e,s)?(r.md?console.log(`\u2713 spec ${e} \u2192 ${s}`):g.done(`spec status: ${s}`),{success:!0,specId:e,status:s}):L(`spec not found: ${e}`):o}catch(s){return P(w(s))}}async recordReview(e=null,t=process.cwd(),r={}){try{if(!e)return L('Usage: prjct spec record-review <id> --reviewer <lens> --verdict <pass|fail> --notes "..."');let s=r.reviewer?.trim().toLowerCase(),o=r.verdict;if(!s)return L("--reviewer is required (the lens name, e.g. architecture, security)");if(o!=="pass"&&o!=="fail")return L("--verdict must be `pass` or `fail`");let i=await this.ensureProjectInit(t);if(!i.success)return i;let a=await It.recordReview(t,e,s,{verdict:o,notes:r.notes??""});if(!a)return L(`spec not found: ${e}`);let l=a.content.selected_reviewers;l.length>0&&!l.includes(s)&&g.warn(`lens "${s}" is not in this spec's selected set (${l.join(", ")})`);let u=`${s} \u2192 ${o}${a.status==="reviewed"?" (all selected lenses passed \u2192 status: reviewed)":""}`;return r.md?console.log(`\u2713 ${u}`):g.done(u),{success:!0,specId:e,status:a.status}}catch(s){return P(w(s))}}async linkTask(e=null,t=process.cwd(),r={}){try{if(!e||!r.taskId)return L("Usage: prjct spec link-task <spec-id> --task-id <id>");let s=await this.ensureProjectInit(t);return s.success?await It.linkTask(t,e,r.taskId)?(r.md?console.log(`\u2713 linked task ${r.taskId} to spec ${e}`):g.done("linked task \u2192 spec"),{success:!0,specId:e,taskId:r.taskId}):L(`spec not found: ${e}`):s}catch(s){return P(w(s))}}async ship(e=null,t=process.cwd(),r={}){try{if(!e)return L("Usage: prjct spec ship <id> [--pr <number>]");let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=r.pr!==void 0?Number(r.pr):void 0,i=await It.ship(t,e,o!==void 0&&Number.isFinite(o)?o:void 0);return i?(r.md?console.log(`\u2713 spec shipped: ${i.title}${o?` (PR #${o})`:""}`):g.done(`spec shipped${o?` (PR #${o})`:""}`),{success:!0,specId:e,status:"shipped"}):L(`spec not found: ${e}`)}catch(s){return P(w(s))}}async audit(e=null,t=process.cwd(),r={}){try{if(!e)return L("Usage: prjct spec audit <id> [--lenses a,b,c]");let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await It.get(t,e);if(!o)return L(`spec not found: ${e}`);let i=typeof r.lenses=="string"&&r.lenses.trim()!==""?r.lenses.split(",").map(l=>l.trim().toLowerCase()).filter(Boolean):Sf(o.content);await It.setSelectedReviewers(t,e,i);let a=Ef(o.id,o.title,o.content,i);return console.log(a),{success:!0,specId:e,dispatch:"emitted"}}catch(s){return P(w(s))}}async breakdown(e=null,t=process.cwd(),r={}){try{if(!e)return L("Usage: prjct spec breakdown <id> [--force]");let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await It.get(t,e);if(!o)return L(`spec not found: ${e}`);let i=new Set(["reviewed","shipped","archived"]);if(!i.has(o.status)&&r.force!==!0)return process.stderr.write(`error: spec status is '${o.status}'; breakdown requires 'reviewed' or later. Re-run with --force if intentional.
1529
- `),process.exitCode=2,{success:!1,error:`spec status '${o.status}' is below the breakdown gate`};let a=r.force===!0&&!i.has(o.status),l=await R.getProjectId(t);if(!l)return P("No prjct project. Run `prjct init` first.");let{breakdownSpecToTasks:u}=await Promise.resolve().then(()=>(Rf(),Cf)),d=await u(l,t,o),p=null;if(a){let{projectMemory:f}=await Promise.resolve().then(()=>(Se(),dc)),y=await f.remember(t,{type:"spec",content:`prjct spec breakdown --force on '${o.title}' (status was '${o.status}')`,tags:{spec_id:o.id,event:"spec.breakdown.forced",from_status:o.status},source:o.id});p=typeof y=="string"?y:null}let m=[];if(p&&m.push(`forced-breakdown event=${p}`),d.skippedReason==="already_broken_down")m.push(`skipped: already_broken_down (spec ${e})`);else if(d.skippedReason==="no_acceptance_criteria")m.push(`skipped: no_acceptance_criteria (spec ${e})`);else{let f=d.recoveredFromPartial?" (recovered from partial)":"";m.push(`\u2713 breakdown: ${d.taskIds.length} task(s) linked${f}`)}for(let f of m)console.log(f);return{success:!0,specId:e,forced:a,forcedEventMemId:p,taskIds:d.taskIds,recoveredFromPartial:d.recoveredFromPartial===!0,skippedReason:d.skippedReason}}catch(s){return P(w(s))}}async inventory(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let{default:o}=await Promise.resolve().then(()=>(z(),pn)),a=(await o.readConfig(t))?.projectId;if(!a)return L("not a prjct project");let{buildInventory:l,renderInventoryMd:u}=await Promise.resolve().then(()=>(sA(),rA)),d=await l(t,a);if(r.json)console.log(JSON.stringify(d,null,2));else if(r.md)console.log(u(d));else{g.info(`${d.totalSpecs} specs across ${d.modules.length} modules`);for(let p of d.modules){let m=p.coveredPct===null?"n/a":`${p.coveredPct}%`,f=p.drift===!0?" DRIFT":p.drift==="unknown"?" ?":"";console.log(` ${p.module.padEnd(20)} ${String(p.specCount).padStart(3)} specs \xB7 ${m.padStart(6)} covered${f}`)}d.uncoveredModules.length>0&&g.info(`${d.uncoveredModules.length} module(s) without specs`)}return{success:!0,totalSpecs:d.totalSpecs}}catch(s){return P(w(s))}}};c(vH,"parseFlagTags");c(SH,"renderSpecMarkdown")});var Cs,Bh=h(()=>{"use strict";Cs=class{static{c(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(th(),eh)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(Vl(),ql)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(Bl(),Wl)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(Nl(),Ml)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(gu(),fu)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(uh(),lh)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(bu(),ku)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(gh(),fh)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(Su(),vu)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(na(),ta)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(bh(),kh)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(Ch(),Th)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(jh(),Ph)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(Ih(),$h)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(Nh(),Mh)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(Fh(),Lh)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(Wh(),Gh)).then(e=>new e.SpecCommands).catch(e=>{throw this._specCmds=void 0,e})}agent;agentInfo;currentAuthor;prjctDir;constructor(){this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),r={}){return(await this.workflowG()).now(e,t,r)}async workflowPrefs(e=null,t=process.cwd(),r={}){return(await this.workflowG()).workflow(e,t,r)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),r={}){return(await this.shippingG()).ship(e,t,{...r})}async analyze(e={},t=process.cwd()){return(await this.analysisG()).analyze(e,t)}async sync(e=process.cwd(),t={}){return(await this.analysisG()).sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),r={}){return(await this.analysisG()).saveLlmAnalysis(e,t,r)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).context(e,t,r)}async search(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).search(e,t,r)}async status(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).status(e,t,r)}async tag(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).tag(e,t,r)}async remember(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).remember(e,t,r)}async forget(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).forget(e,t,r)}async seed(e=null,t=process.cwd(),r={}){return(await this.seedCmdsG()).seed(e,t,r)}async install(e=null,t=process.cwd(),r={}){return(await this.installCmdsG()).install(null,t,r)}async capture(e=null,t=process.cwd(),r={}){return(await this.captureCmdsG()).capture(e,t,r)}async mcp(e=null,t=process.cwd(),r={}){return(await this.mcpCmdsG()).mcp(e,t,r)}async team(e=null,t=process.cwd(),r={}){return(await this.teamCmdsG()).team(e,t,r)}async config(e=null,t=process.cwd(),r={}){return(await this.configCmdsG()).config(e,t,r)}async embeddings(e=null,t=process.cwd(),r={}){return(await this.embeddingsCmdsG()).embeddings(e,t,r)}async guard(e=null,t=process.cwd(),r={}){return(await this.guardCmdsG()).guard(e,t,r)}async auth(e=null,t={}){return(await this.setupCmdsG()).auth(e,t)}async login(e={}){return(await this.setupCmdsG()).login(e)}async logout(){return(await this.setupCmdsG()).logout()}async start(){return(await this.setupCmdsG()).start()}async setup(e={}){return(await this.setupCmdsG()).setup(e)}async update(e={},t=process.cwd()){return(await this.updateCmdsG()).update(e,t)}async installStatusLine(){return(await this.setupCmdsG()).installStatusLine()}async initializeAgent(){return(await this.workflowG()).initializeAgent()}async ensureProjectInit(e){return(await this.workflowG()).ensureProjectInit(e)}async ensureAuthor(){return(await this.workflowG()).ensureAuthor()}async getGlobalProjectPath(e){return(await this.workflowG()).getGlobalProjectPath(e)}async logToMemory(e,t,r){return(await this.workflowG()).logToMemory(e,t,r)}async spec(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).draft(e,t,r)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).show(e,t,r)}async specUpdate(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).update(e,t,r)}async specSetStatus(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).setStatus(e,t,r)}async specRecordReview(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).recordReview(e,t,r)}async specLinkTask(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).linkTask(e,t,r)}async specShip(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).ship(e,t,r)}async specAudit(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).audit(e,t,r)}async specBreakdown(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).breakdown(e,t,r)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}}});var qh,qe,No=h(()=>{"use strict";z();he();F();ce();qh=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;optionFns=new Map;lazyResetters=[];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,r){this.handlerFns.set(e,t),this.setMeta(e,r)}setMeta(e,t){let r=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:r,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,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,r,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=c(async()=>{if(o)return o;let l=await t(),u=l[r];if(typeof u!="function")throw new Error(`${r} is not a function`);return o={instance:l,method:u},o},"resolve"),a=c(async(l,u)=>{let{instance:d,method:p}=await i();return l!=null?p.call(d,l,u.projectPath):p.call(d,u.projectPath)},"wrapper");this.handlerFns.set(e,a),this.optionFns.set(e,async(l,u,d)=>{let{instance:p,method:m}=await i();return m.call(p,l,u,d)}),this.setMeta(e,s)}resetLazyResolutions(){for(let e of this.lazyResetters)e()}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 r of this.categories.keys())t[r]=e.filter(s=>s.group===r).length;return{total:e.length,implemented:e.filter(r=>r.implemented).length,withTemplates:e.filter(r=>r.hasTemplate).length,claudeOnly:e.filter(r=>r.usage.claude&&!r.usage.terminal).length,terminalOnly:e.filter(r=>!r.usage.claude&&r.usage.terminal).length,both:e.filter(r=>r.usage.claude&&r.usage.terminal).length,requiresInit:e.filter(r=>r.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),r=t.map(a=>a.name),s=r.filter((a,l)=>r.indexOf(a)!==l);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(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 R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,r=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:r,globalPath:"",timestamp:C()};else try{o=await this.buildContext(r)}catch(l){return{success:!1,error:w(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 executeWithOptions(e,t,r,s){let o=this.optionFns.get(e);if(!o)return{success:!1,error:`Command not found: ${e}`};if(this.metadata.get(e)?.requiresProject!==!1)try{await this.buildContext(r)}catch(a){return{success:!1,error:w(a)}}return o(t,r,s)}async executeWithoutProject(e,t,r=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:r,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:r,globalPath:"",timestamp:C()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},qe=new qh});import{execFileSync as oA}from"node:child_process";import Tu from"node:fs/promises";import ra from"node:path";async function aA(n){let e=0;try{let t=await Tu.readdir(n,{withFileTypes:!0});for(let r of t){let s=ra.join(n,r.name);if(r.isDirectory())e+=await aA(s);else try{let o=await Tu.stat(s);e+=o.size}catch{}}}catch{}return e}function Vh(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]}`}async function EH(n){try{return(await Tu.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function cA(){let n={homebrew:!1,npm:!1};try{oA("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})&&(n.homebrew=!0,n.homebrewFormula="prjct-cli")}catch{}try{oA("npm",["list","-g","prjct-cli","--depth=0"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).includes("prjct-cli")&&(n.npm=!0)}catch{}return n}async function lA(){let n=[],e=Id(),t=I.getGlobalBasePath(),r=await E(t),s=r?await EH(ra.join(t,"projects")):0,o=r?await aA(t):0;n.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:r});let i=ra.join(e.claude.config,"CLAUDE.md");n.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await iA(i)}),n.push({path:e.claude.router,type:"file",description:"Claude router",exists:await E(e.claude.router)});let a=ra.join(e.claude.config,"prjct-statusline.sh");n.push({path:a,type:"file",description:"Status line script",exists:await E(a)}),n.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await E(e.gemini.router)});let l=ra.join(e.gemini.config,"GEMINI.md");return await iA(l)&&n.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),n}async function iA(n){if(!await E(n))return!1;try{let e=await Tu.readFile(n,"utf-8");return e.includes(Cu)&&e.includes(sa)}catch{return!1}}var Cu,sa,Jh=h(()=>{"use strict";Dn();he();K();Cu="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",sa="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";c(aA,"getDirectorySize");c(Vh,"formatSize");c(EH,"countDirectoryItems");c(cA,"detectInstallation");c(lA,"gatherUninstallItems");c(iA,"hasMarkerSection")});import{execFileSync as uA}from"node:child_process";import mr from"node:fs/promises";import TH from"node:os";import Ru from"node:path";import CH from"node:readline";async function dA(n,e){await mr.mkdir(e,{recursive:!0});let t=await mr.readdir(n,{withFileTypes:!0});for(let r of t){let s=Ru.join(n,r.name),o=Ru.join(e,r.name);r.isDirectory()?await dA(s,o):await mr.copyFile(s,o)}}async function pA(){let n=TH.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Ru.join(n,`.prjct-backup-${e}`);try{await mr.mkdir(t,{recursive:!0});let r=I.getGlobalBasePath();return await E(r)&&await dA(r,Ru.join(t,".prjct-cli")),t}catch{return null}}async function RH(n){try{let e=await mr.readFile(n,"utf-8");if(!e.includes(Cu)||!e.includes(sa))return!1;let t=e.indexOf(Cu),r=e.indexOf(sa)+sa.length,s=e.substring(0,t)+e.substring(r);return s=s.replace(/\n{3,}/g,`
1529
+ `),process.exitCode=2,{success:!1,error:`spec status '${o.status}' is below the breakdown gate`};let a=r.force===!0&&!i.has(o.status),l=await R.getProjectId(t);if(!l)return P("No prjct project. Run `prjct init` first.");let{breakdownSpecToTasks:u}=await Promise.resolve().then(()=>(Rf(),Cf)),d=await u(l,t,o),p=null;if(a){let{projectMemory:f}=await Promise.resolve().then(()=>(Se(),dc)),y=await f.remember(t,{type:"spec",content:`prjct spec breakdown --force on '${o.title}' (status was '${o.status}')`,tags:{spec_id:o.id,event:"spec.breakdown.forced",from_status:o.status},source:o.id});p=typeof y=="string"?y:null}let m=[];if(p&&m.push(`forced-breakdown event=${p}`),d.skippedReason==="already_broken_down")m.push(`skipped: already_broken_down (spec ${e})`);else if(d.skippedReason==="no_acceptance_criteria")m.push(`skipped: no_acceptance_criteria (spec ${e})`);else{let f=d.recoveredFromPartial?" (recovered from partial)":"";m.push(`\u2713 breakdown: ${d.taskIds.length} task(s) linked${f}`)}for(let f of m)console.log(f);return{success:!0,specId:e,forced:a,forcedEventMemId:p,taskIds:d.taskIds,recoveredFromPartial:d.recoveredFromPartial===!0,skippedReason:d.skippedReason}}catch(s){return P(w(s))}}async inventory(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let{default:o}=await Promise.resolve().then(()=>(z(),pn)),a=(await o.readConfig(t))?.projectId;if(!a)return L("not a prjct project");let{buildInventory:l,renderInventoryMd:u}=await Promise.resolve().then(()=>(sA(),rA)),d=await l(t,a);if(r.json)console.log(JSON.stringify(d,null,2));else if(r.md)console.log(u(d));else{g.info(`${d.totalSpecs} specs across ${d.modules.length} modules`);for(let p of d.modules){let m=p.coveredPct===null?"n/a":`${p.coveredPct}%`,f=p.drift===!0?" DRIFT":p.drift==="unknown"?" ?":"";console.log(` ${p.module.padEnd(20)} ${String(p.specCount).padStart(3)} specs \xB7 ${m.padStart(6)} covered${f}`)}d.uncoveredModules.length>0&&g.info(`${d.uncoveredModules.length} module(s) without specs`)}return{success:!0,totalSpecs:d.totalSpecs}}catch(s){return P(w(s))}}};c(vH,"parseFlagTags");c(SH,"renderSpecMarkdown")});var Cs,Bh=h(()=>{"use strict";Cs=class{static{c(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(th(),eh)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(Vl(),ql)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(Bl(),Wl)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(Nl(),Ml)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(gu(),fu)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(uh(),lh)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(bu(),ku)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(gh(),fh)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(Su(),vu)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(na(),ta)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(bh(),kh)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(Ch(),Th)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(jh(),Ph)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(Ih(),$h)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(Nh(),Mh)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(Fh(),Lh)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(Wh(),Gh)).then(e=>new e.SpecCommands).catch(e=>{throw this._specCmds=void 0,e})}agent;agentInfo;currentAuthor;prjctDir;constructor(){this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),r={}){return(await this.workflowG()).now(e,t,r)}async workflowPrefs(e=null,t=process.cwd(),r={}){return(await this.workflowG()).workflow(e,t,r)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),r={}){return(await this.shippingG()).ship(e,t,{...r})}async analyze(e={},t=process.cwd()){return(await this.analysisG()).analyze(e,t)}async sync(e=process.cwd(),t={}){return(await this.analysisG()).sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),r={}){return(await this.analysisG()).saveLlmAnalysis(e,t,r)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).context(e,t,r)}async search(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).search(e,t,r)}async status(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).status(e,t,r)}async tag(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).tag(e,t,r)}async remember(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).remember(e,t,r)}async forget(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).forget(e,t,r)}async seed(e=null,t=process.cwd(),r={}){return(await this.seedCmdsG()).seed(e,t,r)}async install(e=null,t=process.cwd(),r={}){return(await this.installCmdsG()).install(null,t,r)}async capture(e=null,t=process.cwd(),r={}){return(await this.captureCmdsG()).capture(e,t,r)}async mcp(e=null,t=process.cwd(),r={}){return(await this.mcpCmdsG()).mcp(e,t,r)}async team(e=null,t=process.cwd(),r={}){return(await this.teamCmdsG()).team(e,t,r)}async config(e=null,t=process.cwd(),r={}){return(await this.configCmdsG()).config(e,t,r)}async embeddings(e=null,t=process.cwd(),r={}){return(await this.embeddingsCmdsG()).embeddings(e,t,r)}async guard(e=null,t=process.cwd(),r={}){return(await this.guardCmdsG()).guard(e,t,r)}async auth(e=null,t={}){return(await this.setupCmdsG()).auth(e,t)}async login(e={}){return(await this.setupCmdsG()).login(e)}async logout(){return(await this.setupCmdsG()).logout()}async start(){return(await this.setupCmdsG()).start()}async setup(e={}){return(await this.setupCmdsG()).setup(e)}async update(e={},t=process.cwd()){return(await this.updateCmdsG()).update(e,t)}async installStatusLine(){return(await this.setupCmdsG()).installStatusLine()}async initializeAgent(){return(await this.workflowG()).initializeAgent()}async ensureProjectInit(e){return(await this.workflowG()).ensureProjectInit(e)}async ensureAuthor(){return(await this.workflowG()).ensureAuthor()}async getGlobalProjectPath(e){return(await this.workflowG()).getGlobalProjectPath(e)}async logToMemory(e,t,r){return(await this.workflowG()).logToMemory(e,t,r)}async spec(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).draft(e,t,r)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).show(e,t,r)}async specUpdate(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).update(e,t,r)}async specSetStatus(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).setStatus(e,t,r)}async specRecordReview(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).recordReview(e,t,r)}async specLinkTask(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).linkTask(e,t,r)}async specShip(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).ship(e,t,r)}async specAudit(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).audit(e,t,r)}async specBreakdown(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).breakdown(e,t,r)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}}});var qh,qe,No=h(()=>{"use strict";z();he();F();ce();qh=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;optionFns=new Map;lazyResetters=[];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,r){this.handlerFns.set(e,t),this.setMeta(e,r)}setMeta(e,t){let r=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:r,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,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,r,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=c(async()=>{if(o)return o;let l=await t(),u=l[r];if(typeof u!="function")throw new Error(`${r} is not a function`);return o={instance:l,method:u},o},"resolve"),a=c(async(l,u)=>{let{instance:d,method:p}=await i();return l!=null?p.call(d,l,u.projectPath):p.call(d,u.projectPath)},"wrapper");this.handlerFns.set(e,a),this.optionFns.set(e,async(l,u,d)=>{let{instance:p,method:m}=await i();return m.call(p,l,u,d)}),this.setMeta(e,s)}resetLazyResolutions(){for(let e of this.lazyResetters)e()}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 r of this.categories.keys())t[r]=e.filter(s=>s.group===r).length;return{total:e.length,implemented:e.filter(r=>r.implemented).length,withTemplates:e.filter(r=>r.hasTemplate).length,claudeOnly:e.filter(r=>r.usage.claude&&!r.usage.terminal).length,terminalOnly:e.filter(r=>!r.usage.claude&&r.usage.terminal).length,both:e.filter(r=>r.usage.claude&&r.usage.terminal).length,requiresInit:e.filter(r=>r.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),r=t.map(a=>a.name),s=r.filter((a,l)=>r.indexOf(a)!==l);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(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 R.getProjectId(e);if(!t)throw new Error("No prjct project found. Run p. init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:C()}}async execute(e,t,r=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:r,globalPath:"",timestamp:C()};else try{o=await this.buildContext(r)}catch(l){return{success:!1,error:w(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 executeWithOptions(e,t,r,s){let o=this.optionFns.get(e);if(!o)return{success:!1,error:`Command not found: ${e}`};if(this.metadata.get(e)?.requiresProject!==!1)try{await this.buildContext(r)}catch(a){return{success:!1,error:w(a)}}return o(t,r,s)}async executeWithoutProject(e,t,r=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:r,globalPath:"",timestamp:C()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:r,globalPath:"",timestamp:C()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},qe=new qh});import{execFileSync as oA}from"node:child_process";import Tu from"node:fs/promises";import ra from"node:path";async function aA(n){let e=0;try{let t=await Tu.readdir(n,{withFileTypes:!0});for(let r of t){let s=ra.join(n,r.name);if(r.isDirectory())e+=await aA(s);else try{let o=await Tu.stat(s);e+=o.size}catch{}}}catch{}return e}function Vh(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]}`}async function EH(n){try{return(await Tu.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function cA(){let n={homebrew:!1,npm:!1};try{oA("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})&&(n.homebrew=!0,n.homebrewFormula="prjct-cli")}catch{}try{oA("npm",["list","-g","prjct-cli","--depth=0"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).includes("prjct-cli")&&(n.npm=!0)}catch{}return n}async function lA(){let n=[],e=Id(),t=I.getGlobalBasePath(),r=await E(t),s=r?await EH(ra.join(t,"projects")):0,o=r?await aA(t):0;n.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:r});let i=ra.join(e.claude.config,"CLAUDE.md");n.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await iA(i)}),n.push({path:e.claude.router,type:"file",description:"Claude router",exists:await E(e.claude.router)});let a=ra.join(e.claude.config,"prjct-statusline.sh");n.push({path:a,type:"file",description:"Status line script",exists:await E(a)}),n.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await E(e.gemini.router)});let l=ra.join(e.gemini.config,"GEMINI.md");return await iA(l)&&n.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),n}async function iA(n){if(!await E(n))return!1;try{let e=await Tu.readFile(n,"utf-8");return e.includes(Cu)&&e.includes(sa)}catch{return!1}}var Cu,sa,Jh=h(()=>{"use strict";Dn();he();K();Cu="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",sa="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";c(aA,"getDirectorySize");c(Vh,"formatSize");c(EH,"countDirectoryItems");c(cA,"detectInstallation");c(lA,"gatherUninstallItems");c(iA,"hasMarkerSection")});import{execFileSync as uA}from"node:child_process";import mr from"node:fs/promises";import TH from"node:os";import Ru from"node:path";import CH from"node:readline";async function dA(n,e){await mr.mkdir(e,{recursive:!0});let t=await mr.readdir(n,{withFileTypes:!0});for(let r of t){let s=Ru.join(n,r.name),o=Ru.join(e,r.name);r.isDirectory()?await dA(s,o):await mr.copyFile(s,o)}}async function pA(){let n=TH.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Ru.join(n,`.prjct-backup-${e}`);try{await mr.mkdir(t,{recursive:!0});let r=I.getGlobalBasePath();return await E(r)&&await dA(r,Ru.join(t,".prjct-cli")),t}catch{return null}}async function RH(n){try{let e=await mr.readFile(n,"utf-8");if(!e.includes(Cu)||!e.includes(sa))return!1;let t=e.indexOf(Cu),r=e.indexOf(sa)+sa.length,s=e.substring(0,t)+e.substring(r);return s=s.replace(/\n{3,}/g,`
1530
1530
 
1531
1531
  `).trim(),!s||s.trim().length===0?await mr.unlink(n):await mr.writeFile(n,`${s}
1532
1532
  `,"utf-8"),!0}catch{return!1}}async function mA(n,e,t){let r=[],s=[];for(let o of n)if(o.exists)try{o.type==="section"?await RH(o.path)&&r.push(o.path):o.type==="directory"?(await mr.rm(o.path,{recursive:!0,force:!0}),r.push(o.path)):o.type==="file"&&(await mr.unlink(o.path),r.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}try{await new In().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||uA("brew",["uninstall",e.homebrewFormula],{stdio:"pipe"}),r.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||uA("npm",["uninstall","-g","prjct-cli"],{stdio:"pipe"}),r.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:r,errors:s}}async function fA(n){let e=CH.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(n,r=>{e.close(),t(r.toLowerCase()==="uninstall")})})}var gA=h(()=>{"use strict";Dn();he();F();K();Jh();c(dA,"copyDirectory");c(pA,"createBackup");c(RH,"removePrjctSection");c(mA,"performUninstall");c(fA,"promptConfirmation")});var zh={};j(zh,{UninstallCommands:()=>Kh,uninstall:()=>hA});import $e from"chalk";async function hA(n={},e=process.cwd()){let t=await lA(),r=cA(),s=t.filter(l=>l.exists);if(s.length===0&&!r.homebrew&&!r.npm)return console.log($e.yellow(`
@@ -1802,7 +1802,7 @@ ${js.dim("Providers:")}`}var j1,Ny=h(()=>{"use strict";j1={ready:js.green("\u271
1802
1802
  ${s.dim("Run 'prjct start' to configure global/runtime adapters")}
1803
1803
  ${s.dim("Run 'prjct init' or 'prjct sync' to refresh AGENTS.md and project-level rules")}
1804
1804
  ${s.cyan("https://prjct.app")}
1805
- `)}else return!1;return!0}var VP=h(()=>{"use strict";c(_1,"runBinCommand")});var JP=oj((Fde,$1)=>{$1.exports={name:"prjct-cli",version:"2.57.0",description:"Project memory and workflow context for AI coding agents.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.28.1",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.5.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var L1={};import KP from"node:os";import Lu from"node:path";import _s from"chalk";async function I1(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>ij(JP()));await N1(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(O1(),process.exit(0)),n&&$u(n)&&!qe.getByName(n)){let r=_u[n];r&&(g.failWithHint({message:`'prjct ${n}' was removed in v2. ${r.note}`,hint:`Use: ${r.replacement}`}),process.exit(1))}if(n&&!qe.getByName(n)&&!(e.length===0&&aa(n)!==null)){let s=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[s,...o]}let t=e.includes("--md");t||g.start();try{let r=qe.getByName(n);if(!r){let m=aa(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(ti("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||g.end(),process.exit(1)}if(r.deprecated){let m=r.replacedBy?`Use 'prjct ${r.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}r.implemented||(g.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||g.end(),process.exit(1));let{parsedArgs:s,options:o}=M1(r,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;r.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let a=D1(r,s);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await R.getProjectId(process.cwd()),l&&(await Xi.expireIfStale(l),await Xi.touch(l))}catch{}let d=new Cs,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update"||n==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,y=qe.getByName(n);if(y?.optionSchema)p=await qe.executeWithOptions(n,m,process.cwd(),ju(o,y.optionSchema));else{let k={spec:c(b=>Iu(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),"audit-spec":c(b=>b?d.specAudit(b,process.cwd(),{md:f,lenses:o.lenses?String(o.lenses):void 0}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(b=>b?d.saveLlmAnalysis(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:f}),"regen"),start:c(()=>d.start(),"start"),login:c(()=>d.login({md:f,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(b=>d.auth(b,{md:f}),"auth")}[n];if(k)p=await k(m);else throw new Error(`Command '${n}' has no handler`)}}if(l){let m=Date.now()-u;try{await Xi.trackCommand(l,n,m)}catch{}try{await Yi.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await Yi.recordTiming(l,"startup_time",y)}await Yi.recordMemory(l,{command:n})}catch{}}p?.message&&console.log(p.message),t||g.end(),process.exit(p?.success?0:1)}catch(r){console.error("Error:",w(r)),process.env.DEBUG&&console.error(Xu(r)),t||g.end(),process.exit(1)}}function D1(n,e){if(!n.params)return null;let t=n.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let r=t.map(o=>o.slice(1,-1)).join(", "),s=n.usage.terminal||`prjct ${n.name} ${n.params}`;return ti("MISSING_PARAM",{message:`Missing required parameter: ${r}`,hint:`Usage: ${s}`})}return null}function M1(n,e){let t=[],r={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?r[i]=e[++s]:r[i]=!0}else t.push(o)}return{parsedArgs:t,options:r}}async function N1(n){let e=await ts(),t=Lu.join(KP.homedir(),".claude","commands","p.md"),r=Lu.join(KP.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([E(t),E(r),E(Lu.join(process.cwd(),".cursor","commands","sync.md")),E(Lu.join(process.cwd(),".cursor"))]),l=await ri();console.log(My(n)),console.log(Bo("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?_s.dim(` (v${e.claude.version})`):"")),console.log(Bo("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?_s.dim(` (v${e.gemini.version})`):"")),console.log(Bo("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${_s.dim("(run prjct start)")}`:"")),console.log(Bo("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${_s.dim("(use /sync, /task)")}`:a?` ${_s.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
1805
+ `)}else return!1;return!0}var VP=h(()=>{"use strict";c(_1,"runBinCommand")});var JP=oj((Fde,$1)=>{$1.exports={name:"prjct-cli",version:"2.58.0",description:"Project memory and workflow context for AI coding agents.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.28.1",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.5.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var L1={};import KP from"node:os";import Lu from"node:path";import _s from"chalk";async function I1(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>ij(JP()));await N1(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(O1(),process.exit(0)),n&&$u(n)&&!qe.getByName(n)){let r=_u[n];r&&(g.failWithHint({message:`'prjct ${n}' was removed in v2. ${r.note}`,hint:`Use: ${r.replacement}`}),process.exit(1))}if(n&&!qe.getByName(n)&&!(e.length===0&&aa(n)!==null)){let s=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[s,...o]}let t=e.includes("--md");t||g.start();try{let r=qe.getByName(n);if(!r){let m=aa(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(ti("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||g.end(),process.exit(1)}if(r.deprecated){let m=r.replacedBy?`Use 'prjct ${r.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}r.implemented||(g.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||g.end(),process.exit(1));let{parsedArgs:s,options:o}=M1(r,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;r.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let a=D1(r,s);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await R.getProjectId(process.cwd()),l&&(await Xi.expireIfStale(l),await Xi.touch(l))}catch{}let d=new Cs,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update"||n==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,y=qe.getByName(n);if(y?.optionSchema)p=await qe.executeWithOptions(n,m,process.cwd(),ju(o,y.optionSchema));else{let k={spec:c(b=>Iu(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),"audit-spec":c(b=>b?d.specAudit(b,process.cwd(),{md:f,lenses:o.lenses?String(o.lenses):void 0}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(b=>b?d.saveLlmAnalysis(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:f}),"regen"),start:c(()=>d.start(),"start"),login:c(()=>d.login({md:f,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(b=>d.auth(b,{md:f}),"auth")}[n];if(k)p=await k(m);else throw new Error(`Command '${n}' has no handler`)}}if(l){let m=Date.now()-u;try{await Xi.trackCommand(l,n,m)}catch{}try{await Yi.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await Yi.recordTiming(l,"startup_time",y)}await Yi.recordMemory(l,{command:n})}catch{}}p?.message&&console.log(p.message),t||g.end(),process.exit(p?.success?0:1)}catch(r){console.error("Error:",w(r)),process.env.DEBUG&&console.error(Xu(r)),t||g.end(),process.exit(1)}}function D1(n,e){if(!n.params)return null;let t=n.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let r=t.map(o=>o.slice(1,-1)).join(", "),s=n.usage.terminal||`prjct ${n.name} ${n.params}`;return ti("MISSING_PARAM",{message:`Missing required parameter: ${r}`,hint:`Usage: ${s}`})}return null}function M1(n,e){let t=[],r={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?r[i]=e[++s]:r[i]=!0}else t.push(o)}return{parsedArgs:t,options:r}}async function N1(n){let e=await ts(),t=Lu.join(KP.homedir(),".claude","commands","p.md"),r=Lu.join(KP.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([E(t),E(r),E(Lu.join(process.cwd(),".cursor","commands","sync.md")),E(Lu.join(process.cwd(),".cursor"))]),l=await ri();console.log(My(n)),console.log(Bo("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?_s.dim(` (v${e.claude.version})`):"")),console.log(Bo("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?_s.dim(` (v${e.gemini.version})`):"")),console.log(Bo("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${_s.dim("(run prjct start)")}`:"")),console.log(Bo("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${_s.dim("(use /sync, /task)")}`:a?` ${_s.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
1806
1806
  ${_s.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1807
1807
  ${_s.cyan("https://prjct.app")}
1808
1808
  `)}function O1(){console.log(`
@@ -627,7 +627,7 @@ ${y.join(`
627
627
  `)}`)}let{output:s,summary:o}=r.data,i=await n.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:s,summary:o};let d=u.filter(y=>y.status==="completed").length,p=u.length,m=Math.round(d/p*100),f=a+1;return f<u.length&&(u[f]={...u[f],status:"in_progress",startedAt:b()}),await n.update(e,y=>({...y,currentTask:{...y.currentTask,subtasks:u,currentSubtaskIndex:f<p?f:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:b()})),await n.publish(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:l.id,description:l.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),f<p?u[f]:null}async function Th(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[r]||null}async function Ch(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[r]||null}async function Nl(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=(t.currentTask.currentSubtaskIndex||0)-1;return r<0?null:t.currentTask.subtasks[r]||null}async function Rh(n,e){let t=await Nl(n,e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async function xh(n,e){return(await n.read(e)).currentTask?.subtasks||[]}async function Ah(n,e){return(await n.read(e)).currentTask?.subtaskProgress||null}async function Ph(n,e){return((await n.read(e)).currentTask?.subtasks?.length||0)>0}async function _h(n,e){let t=await n.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(r=>r.status==="completed"||r.status==="failed"||r.status==="skipped"):!0}async function jh(n,e,t){let r=await n.read(e);if(!r.currentTask?.subtasks)return null;let s=r.currentTask.currentSubtaskIndex||0,o=r.currentTask.subtasks[s];if(!o)return null;let i=[...r.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:b(),output:`Failed: ${t}`};let a=s+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await n.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:s,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:b()})),await n.publish(e,"subtask.failed",{taskId:r.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<l?i[a]:null}async function Dh(n,e,t){let r=await n.read(e);if(!r.currentTask?.subtasks)return null;let s=r.currentTask.currentSubtaskIndex||0,o=r.currentTask.subtasks[s];if(!o)return null;let i=[...r.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:b(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await n.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:s,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:b()})),await n.publish(e,"subtask.skipped",{taskId:r.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<l?i[a]:null}async function Ih(n,e,t){let r=await n.read(e);if(!r.currentTask?.subtasks)return null;let s=r.currentTask.currentSubtaskIndex||0,o=r.currentTask.subtasks[s];if(!o)return null;let i=[...r.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,l=i.length;return a<l&&(i[a]={...i[a],status:"in_progress",startedAt:b()}),await n.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:s},lastUpdated:b()})),await n.publish(e,"subtask.blocked",{taskId:r.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<l?i[a]:null}var $h=h(()=>{"use strict";mi();ae();c(vh,"createSubtasks");c(Eh,"completeSubtask");c(Th,"getCurrentSubtask");c(Ch,"getNextSubtask");c(Nl,"getPreviousSubtask");c(Rh,"getPreviousHandoff");c(xh,"getSubtasks");c(Ah,"getSubtaskProgress");c(Ph,"hasSubtasks");c(_h,"areAllSubtasksComplete");c(jh,"failSubtask");c(Dh,"skipSubtask");c(Ih,"blockSubtask")});async function Mh(n,e,t,r){let s={...t,workspaceId:r,startedAt:b()};return await n.update(e,o=>{if((o.activeTasks||[]).some(i=>i.workspaceId===r))throw new Error("A task is already active in this workspace");return{...o,activeTasks:[...o.activeTasks||[],s],lastUpdated:b()}}),await n.publish(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId,workspaceId:r}),s}async function Nh(n,e,t){return((await n.read(e)).activeTasks||[]).find(s=>s.workspaceId===t)??null}async function Oh(n,e,t,r){let o=((await n.read(e)).activeTasks||[]).find(a=>a.workspaceId===t);if(!o)return null;let i=b();return await n.update(e,a=>{let l=(a.activeTasks||[]).find(p=>p.workspaceId===t)??o,d=[n.createTaskHistoryEntry(l,i,r),...n.getTaskHistoryFromState(a)].slice(0,n.maxTaskHistory);return{...a,activeTasks:(a.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:i}}),await n.publish(e,"task.completed",{taskId:o.id,description:o.description,startedAt:o.startedAt,completedAt:i,workspaceId:t}),o}async function Lh(n,e){return(await n.read(e)).activeTasks||[]}async function Fh(n,e){return((await n.read(e)).activeTasks||[]).length}async function Uh(n,e,t,r){let o=((await n.read(e)).activeTasks||[]).find(i=>i.workspaceId===t);return o?(await n.update(e,i=>({...i,activeTasks:(i.activeTasks||[]).map(a=>a.workspaceId===t?{...a,...r,workspaceId:t}:a),lastUpdated:b()})),{...o,...r,workspaceId:t}):null}async function Hh(n,e,t,r,s){let o=await n.read(e);if(s){if(!(o.activeTasks||[]).some(l=>l.workspaceId===s))return null;let a=null;return await n.update(e,l=>({...l,activeTasks:(l.activeTasks||[]).map(u=>{if(u.workspaceId!==s)return u;let d=(u.tokensIn||0)+t,p=(u.tokensOut||0)+r;return a={tokensIn:d,tokensOut:p},{...u,tokensIn:d,tokensOut:p}}),lastUpdated:b()})),a}if(!o.currentTask)return null;let i=null;return await n.update(e,a=>{if(!a.currentTask)return a;let l=(a.currentTask.tokensIn||0)+t,u=(a.currentTask.tokensOut||0)+r;return i={tokensIn:l,tokensOut:u},{...a,currentTask:{...a.currentTask,tokensIn:l,tokensOut:u},lastUpdated:b()}}),i}var Wh=h(()=>{"use strict";ae();c(Mh,"startTaskInWorkspace");c(Nh,"getCurrentTaskForWorkspace");c(Oh,"completeTaskInWorkspace");c(Lh,"getActiveTasks");c(Fh,"getActiveTaskCount");c(Uh,"updateWorkspaceTask");c(Hh,"addTokens")});import fx from"node:crypto";function gx(n){let[e,t]=n.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}function hx(n){if(!n||typeof n!="object")return;let e=n;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let r=e[t];if(typeof r=="string"&&r.length>0)return r}}function yx(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(wx(n)):JSON.stringify(n);return fx.createHash("sha256").update(e).digest("hex")}function wx(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function kx(){if(vi)return vi;try{let{default:n}=await Promise.resolve().then(()=>(Gn(),Dl)),e=n;return typeof e.getDeviceId=="function"?(vi=await e.getDeviceId(),vi):"unknown-device"}catch{return"unknown-device"}}var vi,et,qn=h(()=>{"use strict";ro();bl();ae();K();c(gx,"deriveEntityShape");c(hx,"entityIdOf");c(yx,"hashPayload");c(wx,"sortKeys");vi=null;c(kx,"_resolveDeviceId");et=class{static{c(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new hi({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1")){let r=this.cache.get(e);if(r!==null)return r}try{let r=D.getDoc(e,this.getStoreKey());if(r!==null)return this.cache.set(e,r),r}catch{}return this.getDefault()}async write(e,t){D.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let r=this.getStoreKey(),s=D.updateDoc(e,r,t,()=>this.getDefault());return this.cache.set(e,s),s}async publishEvent(e,t,r){let s=gx(t),o={type:t,path:[this.filename.replace(".json","")],data:r,timestamp:b(),projectId:e,entityType:s.entityType,entityId:hx(r),eventType:s.eventType,contentHash:yx(r),deviceId:await kx(),revisionCount:1};await bt.publish(o)}async publishEntityEvent(e,t,r,s){let o=`${t}.${r}`,i={...s,timestamp:b()};await this.publishEvent(e,o,i)}async exists(e){try{return D.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Ol,V,St=h(()=>{"use strict";mi();ae();pl();mh();Sh();$h();Wh();qn();Ol=class extends et{static{c(this,"StateStorage")}constructor(){super("state.json",cg)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t,r){let s=gr.getCurrentState(e,r),o=gr.canTransition(s,t);if(!o.valid)throw new Error(`${o.error}. ${o.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 r=await this.read(e);this.validateTransition(r,"task");let s={...t,startedAt:b()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let r=await this.read(e);if(!r.currentTask)return null;let s={...r.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:b()})),s}async completeTask(e,t){let r=await this.read(e),s=r.currentTask;if(!s)return null;this.validateTransition(r,"done");let o=b(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(r),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:s.id,description:s.description,startedAt:s.startedAt,completedAt:o}),s}createTaskHistoryEntry(e,t,r){let s=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=s.length>0?s.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:s,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return r&&(i.feedback=r),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;lifecycleBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),validateTransition:this.validateTransition.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),maxPausedTasks:this.maxPausedTasks,stalenessThresholdDays:this.stalenessThresholdDays}}async pauseTask(e,t){return lh(this.lifecycleBackend(),e,t)}async resumeTask(e,t){return uh(this.lifecycleBackend(),e,t)}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){return dh(this.lifecycleBackend(),e)}async archiveStalePausedTasks(e){return ph(this.lifecycleBackend(),e)}queryBackend(){return{read:this.read.bind(this),update:this.update.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this)}}async clearTask(e){return fh(this.queryBackend(),e)}async hasTask(e){return gh(this.queryBackend(),e)}async getPausedTask(e){return hh(this.queryBackend(),e)}async getAllPausedTasks(e){return yh(this.queryBackend(),e)}async getTaskHistory(e){return Ml(this.queryBackend(),e)}async getMostRecentTask(e){return wh(this.queryBackend(),e)}async getTaskHistoryByType(e,t){return kh(this.queryBackend(),e,t)}async getAggregatedFeedback(e){return bh(this.queryBackend(),e)}workspaceBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),createTaskHistoryEntry:this.createTaskHistoryEntry.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this),maxTaskHistory:this.maxTaskHistory}}async startTaskInWorkspace(e,t,r){let s=await this.read(e);return this.validateTransition(s,"task",r),Mh(this.workspaceBackend(),e,t,r)}async getCurrentTaskForWorkspace(e,t){return Nh(this.workspaceBackend(),e,t)}async completeTaskInWorkspace(e,t,r){return Oh(this.workspaceBackend(),e,t,r)}async getActiveTasks(e){return Lh(this.workspaceBackend(),e)}async getActiveTaskCount(e){return Fh(this.workspaceBackend(),e)}async updateWorkspaceTask(e,t,r){return Uh(this.workspaceBackend(),e,t,r)}async addTokens(e,t,r,s){return Hh(this.workspaceBackend(),e,t,r,s)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(e,t){return vh(this.subtaskBackend(),e,t)}async completeSubtask(e,t){return Eh(this.subtaskBackend(),e,t)}async getCurrentSubtask(e){return Th(this.subtaskBackend(),e)}async getNextSubtask(e){return Ch(this.subtaskBackend(),e)}async getPreviousSubtask(e){return Nl(this.subtaskBackend(),e)}async getPreviousHandoff(e){return Rh(this.subtaskBackend(),e)}async getSubtasks(e){return xh(this.subtaskBackend(),e)}async getSubtaskProgress(e){return Ah(this.subtaskBackend(),e)}async hasSubtasks(e){return Ph(this.subtaskBackend(),e)}async areAllSubtasksComplete(e){return _h(this.subtaskBackend(),e)}async failSubtask(e,t){return jh(this.subtaskBackend(),e,t)}async skipSubtask(e,t){return Dh(this.subtaskBackend(),e,t)}async blockSubtask(e,t){return Ih(this.subtaskBackend(),e,t)}},V=new Ol});import{createHash as bx}from"node:crypto";function oo(n){return bx("sha256").update(n).digest("hex")}function Ei(n){return oo(n).slice(0,16)}var io=h(()=>{"use strict";c(oo,"sha256");c(Ei,"sha256Short")});import Sx from"node:fs/promises";import Gh from"node:path";async function Bh(n){try{return await Sx.realpath(n)}catch{return n}}function Ll(n,e){return`${n} \xB7 ${e??"(detached)"}`}async function yr(n){let e=Date.now(),t=qh.get(n);if(t&&e-t.at<vx)return t.ctx;let r=await Ex(n);return qh.set(n,{ctx:r,at:e}),r}async function Ex(n){let e="",t="",r="",s;try{let{stdout:u}=await ee("git",["rev-parse","--show-toplevel","--git-dir","--git-common-dir","--abbrev-ref","HEAD"],{cwd:n}),[d="",p="",m="",f=""]=u.trim().split(`
628
628
  `);e=d.trim(),t=p.trim(),r=m.trim(),s=f.trim()&&f.trim()!=="HEAD"?f.trim():void 0}catch{let u=await Bh(n);return{workspaceId:vt,worktreePath:u,shortId:vt,isMain:!0,label:Ll(vt)}}let o=Gh.resolve(n,t)===Gh.resolve(n,r),i=await Bh(e||n);if(o)return{workspaceId:vt,worktreePath:i,shortId:vt,branch:s,isMain:!0,label:Ll(vt,s)};let a=Ei(i),l=a.slice(0,6);return{workspaceId:a,worktreePath:i,shortId:l,branch:s,isMain:!1,label:Ll(l,s)}}var vt,qh,vx,Fl=h(()=>{"use strict";ye();io();vt="main";c(Bh,"safeRealpath");c(Ll,"buildLabel");qh=new Map,vx=5e3;c(yr,"deriveWorkspace");c(Ex,"computeWorkspace")});var Xh={};F(Xh,{collectActiveTasks:()=>wn,formatActiveTaskLine:()=>Jh,formatActiveTaskList:()=>Tx});function Vh(n,e){let t=n===vt?vt:n.slice(0,6);return{shortId:t,label:`${t} \xB7 ${e??"(detached)"}`}}async function wn(n,e){let t=await yr(e),r=[],s=await V.getCurrentTask(n);if(s){let{shortId:i,label:a}=Vh(vt,s.branch);r.push({id:s.id,description:s.description,workspaceId:vt,shortId:i,label:a,branch:s.branch,linearId:s.linearId,startedAt:s.startedAt,isCurrent:t.workspaceId===vt})}for(let i of await V.getActiveTasks(n)){if(i.workspaceId===vt)continue;let{shortId:a,label:l}=Vh(i.workspaceId,i.branch);r.push({id:i.id,description:i.description,workspaceId:i.workspaceId,shortId:a,label:l,branch:i.branch,linearId:i.linearId,startedAt:i.startedAt,isCurrent:t.workspaceId===i.workspaceId})}return r.sort((i,a)=>Number(a.isCurrent)-Number(i.isCurrent)),{current:r.find(i=>i.isCurrent)??null,all:r}}function Jh(n){let e=n.isCurrent?"\u2192":" ",t=n.isCurrent?" (this worktree)":"";return`${e} ${n.label} ${n.description}${t}`}function Tx(n){if(n.all.length===0)return"No active task.";if(n.all.length===1&&n.current){let t=n.current;return`Active: ${t.description}
629
629
  Workspace: ${t.label}`}let e=[`Active tasks (${n.all.length})`];for(let t of n.all)e.push(Jh(t));return e.join(`
630
- `)}var Kr=h(()=>{"use strict";St();Fl();c(Vh,"labelFor");c(wn,"collectActiveTasks");c(Jh,"formatActiveTaskLine");c(Tx,"formatActiveTaskList")});function Cx(n){return n instanceof Yr}function Ue(n){return Cx(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Yr,Ti,Ci,ao,Vn=h(()=>{"use strict";Yr=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)}},Ti=class n extends Yr{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")}},Ci=class n extends Yr{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")}},ao=class n extends Yr{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(Cx,"isPrjctError");c(Ue,"getErrorMessage")});var Ai={};F(Ai,{PACKAGE_ROOT:()=>Ut,VERSION:()=>Pe,getPackageRoot:()=>Hl,getVersion:()=>xi,resetPackageRoot:()=>Wl});import Ul from"node:fs";import Ri from"node:path";function Hl(){if(Qr)return Qr;let n=__dirname;for(let e=0;e<5;e++){let t=Ri.join(n,"package.json");if(Ul.existsSync(t))try{if(JSON.parse(Ul.readFileSync(t,"utf-8")).name==="prjct-cli")return Qr=n,n}catch{}n=Ri.dirname(n)}return Qr=Ri.join(__dirname,"..","..",".."),Qr}function xi(){if(wr)return wr;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return wr=n,wr;try{let e=Ri.join(Hl(),"package.json");return wr=JSON.parse(Ul.readFileSync(e,"utf-8")).version,wr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",w(e)),"0.0.0"}}function Wl(n){Qr=n,wr=null}var wr,Qr,Pe,Ut,tt=h(()=>{"use strict";H();wr=null,Qr=null;c(Hl,"getPackageRoot");c(xi,"getVersion");c(Wl,"resetPackageRoot");Pe=xi(),Ut=Hl()});async function Pi(n){try{let{stdout:e}=await G(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Rx(){let n=await Pi("gh api user --jq .login");return n.success&&n.output||(n=await Pi("git config --global github.user"),n.success&&n.output)?n.output:null}async function xx(){let n=await Pi("git config user.name");return n.success&&n.output?n.output:null}async function Ax(){let n=await Pi("git config user.email");return n.success&&n.output?n.output:null}async function Zr(){let[n,e,t]=await Promise.all([Rx(),xx(),Ax()]);return{github:n,email:t,name:e||n||"Unknown"}}var _i=h(()=>{"use strict";ye();c(Pi,"execCommand");c(Rx,"detectGitHubUsername");c(xx,"detectGitName");c(Ax,"detectGitEmail");c(Zr,"detect")});var Jn={};F(Jn,{default:()=>C});import Bl from"node:fs/promises";import Px from"node:path";import*as ji from"jsonc-parser";function zh(n){let e=[],t=ji.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let r=e[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${ji.printParseErrorCode(r.error)}`)}return t}var ql,_x,C,Q=h(()=>{"use strict";Vn();H();ae();Z();tt();_i();ve();c(zh,"parseJsonc");ql=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=I.getLocalConfigPath(e),r=await Bl.readFile(t,"utf-8");return zh(r)}catch(t){return W(t)||console.warn(`Warning: Could not read config at ${e}: ${Ue(t)}`),null}}async writeConfig(e,t){let r=I.getLocalConfigPath(e);await Se(r,t)}async readGlobalConfig(e){try{let t=I.getGlobalProjectConfigPath(e),r=await Bl.readFile(t,"utf-8");return zh(r)}catch(t){return W(t)||console.warn(`Warning: Could not read global config for ${e}: ${Ue(t)}`),null}}async writeGlobalConfig(e,t){let r=I.getGlobalProjectConfigPath(e);await Se(r,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let r=b();t={projectId:e,authors:[],version:Pe,lastSync:r},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let r=I.generateProjectId(e),s=I.getGlobalProjectPath(r),o=I.getDisplayPath(s),i=b(),a={projectId:r,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:r,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Pe,created:i,lastSync:i};return await this.writeGlobalConfig(r,l),a}async updateLastSync(e){let t=await this.getProjectId(e),r=await this.readGlobalConfig(t);r&&(r.lastSync=b(),await this.writeGlobalConfig(t,r))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await I.hasLegacyStructure(e))return!1;if(!await I.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=I.getGlobalProjectPath(s.projectId);try{return(await Bl.readdir(Px.join(o,"core"))).length===0}catch(i){return W(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(gi(),fi));if(await r.detect(e)){let o=await r.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return""}async findAuthor(e,t){let r=await this.readGlobalConfig(e);return!r||!r.authors?null:r.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let r=await this.ensureGlobalConfig(e);if(r.authors.some(i=>i.github===t.github))return;let o=b();r.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),r.lastSync=o,await this.writeGlobalConfig(e,r)}async updateAuthorActivity(e,t){let r=await this.readGlobalConfig(e);if(!r||!r.authors)return;let s=r.authors.find(o=>o.github===t);s&&(s.lastActivity=b(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(e,r))}async getCurrentAuthor(e){let t=await Zr(),r=await this.getProjectId(e);return await this.addAuthor(r,{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 r=await this.readConfig(e);r&&(r.showMetrics=t,await this.writeConfig(e,r))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let r=I.generateProjectId(e);return{projectId:r,dataPath:I.getDisplayPath(I.getGlobalProjectPath(r))}}},_x=new ql,C=_x});var Yh={};F(Yh,{MEMORY_EVENT_RANGE:()=>ts,REMEMBER_ACTION_PREFIX:()=>es,REMEMBER_EVENT_PREFIX:()=>Ht,REMEMBER_EVENT_RANGE:()=>Xn,STATUS_CHANGE_ACTION:()=>zn,TAG_EVENT_TYPE:()=>Vl});function Kh(n){return n.slice(0,-1)+String.fromCharCode(n.charCodeAt(n.length-1)+1)}var Di,es,Ht,Vl,ts,Xn,zn,Kn=h(()=>{"use strict";Di="memory.",es="remember.",Ht=`${Di}${es}`,Vl=`${Di}task.tagged`;c(Kh,"prefixUpperBound");ts=[Di,Kh(Di)],Xn=[Ht,Kh(Ht)],zn="status.changed"});async function ns(n){try{let{stdout:e}=await G("git branch --show-current",{cwd:n});return e.trim()||void 0}catch{return}}async function Qh(n,e=20){try{let{stdout:t}=await G("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:n});return t.trim().split(`
630
+ `)}var Kr=h(()=>{"use strict";St();Fl();c(Vh,"labelFor");c(wn,"collectActiveTasks");c(Jh,"formatActiveTaskLine");c(Tx,"formatActiveTaskList")});function Cx(n){return n instanceof Yr}function Ue(n){return Cx(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Yr,Ti,Ci,ao,Vn=h(()=>{"use strict";Yr=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)}},Ti=class n extends Yr{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")}},Ci=class n extends Yr{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")}},ao=class n extends Yr{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(Cx,"isPrjctError");c(Ue,"getErrorMessage")});var Ai={};F(Ai,{PACKAGE_ROOT:()=>Ut,VERSION:()=>Pe,getPackageRoot:()=>Hl,getVersion:()=>xi,resetPackageRoot:()=>Wl});import Ul from"node:fs";import Ri from"node:path";function Hl(){if(Qr)return Qr;let n=__dirname;for(let e=0;e<5;e++){let t=Ri.join(n,"package.json");if(Ul.existsSync(t))try{if(JSON.parse(Ul.readFileSync(t,"utf-8")).name==="prjct-cli")return Qr=n,n}catch{}n=Ri.dirname(n)}return Qr=Ri.join(__dirname,"..","..",".."),Qr}function xi(){if(wr)return wr;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return wr=n,wr;try{let e=Ri.join(Hl(),"package.json");return wr=JSON.parse(Ul.readFileSync(e,"utf-8")).version,wr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",w(e)),"0.0.0"}}function Wl(n){Qr=n,wr=null}var wr,Qr,Pe,Ut,tt=h(()=>{"use strict";H();wr=null,Qr=null;c(Hl,"getPackageRoot");c(xi,"getVersion");c(Wl,"resetPackageRoot");Pe=xi(),Ut=Hl()});async function Pi(n){try{let{stdout:e}=await G(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Rx(){let n=await Pi("gh api user --jq .login");return n.success&&n.output||(n=await Pi("git config --global github.user"),n.success&&n.output)?n.output:null}async function xx(){let n=await Pi("git config user.name");return n.success&&n.output?n.output:null}async function Ax(){let n=await Pi("git config user.email");return n.success&&n.output?n.output:null}async function Zr(){let[n,e,t]=await Promise.all([Rx(),xx(),Ax()]);return{github:n,email:t,name:e||n||"Unknown"}}var _i=h(()=>{"use strict";ye();c(Pi,"execCommand");c(Rx,"detectGitHubUsername");c(xx,"detectGitName");c(Ax,"detectGitEmail");c(Zr,"detect")});var Jn={};F(Jn,{default:()=>C});import Bl from"node:fs/promises";import Px from"node:path";import*as ji from"jsonc-parser";function zh(n){let e=[],t=ji.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let r=e[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${ji.printParseErrorCode(r.error)}`)}return t}var ql,_x,C,Q=h(()=>{"use strict";Vn();H();ae();Z();tt();_i();ve();c(zh,"parseJsonc");ql=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=I.getLocalConfigPath(e),r=await Bl.readFile(t,"utf-8");return zh(r)}catch(t){return W(t)||console.warn(`Warning: Could not read config at ${e}: ${Ue(t)}`),null}}async writeConfig(e,t){let r=I.getLocalConfigPath(e);await Se(r,t)}async readGlobalConfig(e){try{let t=I.getGlobalProjectConfigPath(e),r=await Bl.readFile(t,"utf-8");return zh(r)}catch(t){return W(t)||console.warn(`Warning: Could not read global config for ${e}: ${Ue(t)}`),null}}async writeGlobalConfig(e,t){let r=I.getGlobalProjectConfigPath(e);await Se(r,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let r=b();t={projectId:e,authors:[],version:Pe,lastSync:r},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let r=I.generateProjectId(e),s=I.getGlobalProjectPath(r),o=I.getDisplayPath(s),i=b(),a={projectId:r,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:r,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:Pe,created:i,lastSync:i};return await this.writeGlobalConfig(r,l),a}async updateLastSync(e){let t=await this.getProjectId(e),r=await this.readGlobalConfig(t);r&&(r.lastSync=b(),await this.writeGlobalConfig(t,r))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await I.hasLegacyStructure(e))return!1;if(!await I.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=I.getGlobalProjectPath(s.projectId);try{return(await Bl.readdir(Px.join(o,"core"))).length===0}catch(i){return W(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(gi(),fi));if(await r.detect(e)){let o=await r.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return""}async findAuthor(e,t){let r=await this.readGlobalConfig(e);return!r||!r.authors?null:r.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let r=await this.ensureGlobalConfig(e);if(r.authors.some(i=>i.github===t.github))return;let o=b();r.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),r.lastSync=o,await this.writeGlobalConfig(e,r)}async updateAuthorActivity(e,t){let r=await this.readGlobalConfig(e);if(!r||!r.authors)return;let s=r.authors.find(o=>o.github===t);s&&(s.lastActivity=b(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(e,r))}async getCurrentAuthor(e){let t=await Zr(),r=await this.getProjectId(e);return await this.addAuthor(r,{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 r=await this.readConfig(e);r&&(r.showMetrics=t,await this.writeConfig(e,r))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let r=I.generateProjectId(e);return{projectId:r,dataPath:I.getDisplayPath(I.getGlobalProjectPath(r))}}},_x=new ql,C=_x});var Yh={};F(Yh,{MEMORY_EVENT_RANGE:()=>ts,REMEMBER_ACTION_PREFIX:()=>es,REMEMBER_EVENT_PREFIX:()=>Ht,REMEMBER_EVENT_RANGE:()=>Xn,STATUS_CHANGE_ACTION:()=>zn,TAG_EVENT_TYPE:()=>Vl});function Kh(n){return n.slice(0,-1)+String.fromCharCode(n.charCodeAt(n.length-1)+1)}var Di,es,Ht,Vl,ts,Xn,zn,Kn=h(()=>{"use strict";Di="memory.",es="remember.",Ht=`${Di}${es}`,Vl=`${Di}task.tagged`;c(Kh,"prefixUpperBound");ts=[Di,Kh(Di)],Xn=[Ht,Kh(Ht)],zn="status.changed"});async function ns(n){try{let{stdout:e}=await G("git branch --show-current",{cwd:n});return e.trim()||void 0}catch{return}}async function Qh(n,e=20){try{let{stdout:t}=await G("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:n});return t.trim().split(`
631
631
  `).filter(r=>r.length>0).slice(0,e)}catch{return[]}}var co=h(()=>{"use strict";ye();c(ns,"getGitBranch");c(Qh,"getModifiedFiles")});import Zh from"node:path";var jx,Dx,Ii,ey=h(()=>{"use strict";ae();Z();jx=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],Dx=`# Changelog
632
632
 
633
633
  All notable changes to this project will be documented in this file.
@@ -1084,13 +1084,13 @@ ${JSON.stringify(r.value,null,2)}`,e)}return qS(t,e)}function sI(n){try{return{o
1084
1084
  `),t.push(`- **Total Commits**: ${o?.totalCommits||0}`),t.push(`- **Contributors**: ${o?.contributors||0}`),t.push(`- **Age**: ${o?.age||"unknown"}`),t.push(""),n.gitLog&&(t.push(`## Recent Activity
1085
1085
  `),n.gitLog.split(`
1086
1086
  `).slice(0,5).forEach(a=>{if(a.trim()){let[l,,u,d]=a.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1087
- `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1088
- `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1087
+ `),t.push("Based on detected stack, consider generating specialized agents using `p. sync`.\n"),t.push(`---
1088
+ `),t.push("*This analysis was generated automatically. For updated information, run `p. analyze` again.*\n"),t.join(`
1089
1089
  `)}var op=h(()=>{"use strict";Tn();Pa();kn();ae();Co();de();c(zS,"showSyncResult");c(KS,"getSessionActivity");c(Ps,"formatTokens");c(sp,"formatDuration");c(YS,"generateSparkline");c(QS,"generateStatsMarkdown");c(ZS,"generateAnalysisSummary")});async function ev(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return t.result;let r=t.value,s=await ys.getSummary(r),o=await ys.getDailyStats(r,30),i=await KS(r),a={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:a,totalTokensSaved:s.totalTokensSaved,estimatedCostSaved:s.estimatedCostSaved,compressionRate:s.compressionRate,syncCount:s.syncCount,avgSyncDuration:s.avgSyncDuration,topAgents:s.topAgents.slice(0,5),last30DaysTokens:s.last30DaysTokens,trend:s.trend,dailyStats:o.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=D.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await ys.read(r),d=u.firstSync?new Date(u.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: ${l.padEnd(20).slice(0,20)} | Since: ${d.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"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(a.decisions>0||a.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${a.learnedDecisions} confirmed (${a.decisions} total)`),console.log(` Preferences: ${a.preferences} saved`),console.log(` Workflows: ${a.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Ps(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Aa(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${sp(s.avgSyncDuration)}`),console.log(""),s.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=s.topAgents.reduce((m,f)=>m+f.usageCount,0);for(let m of s.topAgents){let f=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${f}% (${m.usageCount} uses)`)}console.log("")}if(o.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=YS(o);if(console.log(` ${p} ${Ps(s.last30DaysTokens)} tokens saved`),s.trend!==0){let m=s.trend>0?"\u2191":"\u2193",f=s.trend>0?"+":"";console.log(` ${m} ${f}${s.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(""),e.export){let p=QS(s,o,l,d,i,a);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:i,patterns:a}}}catch(t){return console.error("\u274C Error:",w(t)),$e(t)}}async function tv(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Xe.diff(r);if(!s){let o="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:o})):e.md?console.log(_("## Analysis Diff",`> ${o}`)):g.warn(o),{success:!1,error:o}}if(e.json)return console.log(JSON.stringify({success:!0,...s})),{success:!0,data:s};if(e.md)return console.log(_(ra(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(Zy(s)),console.log("");let o=[];s.summary.added>0&&o.push(`${s.summary.added} added`),s.summary.removed>0&&o.push(`${s.summary.removed} removed`),s.summary.changed>0&&o.push(`${s.summary.changed} changed`),g.done(o.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(_("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}var nv=h(()=>{"use strict";Pa();sa();nr();K();ld();H();ge();qe();de();op();Ot();c(ev,"stats");c(tv,"diff")});var cc={};F(cc,{AnalysisCommands:()=>ip});import rv from"node:fs/promises";var sv,ip,lc=h(()=>{"use strict";Yy();Q();ve();sa();uw();Ad();nr();xr();H();ae();ge();qe();Co();de();_b();XS();nv();op();Ee();Ot();sv=["> Review this project data and save concise notes for future AI agents.","> Focus on architecture, conventions, risks, and gotchas. Markdown/text is fine; JSON is optional.","> Most compatible save path: write notes to a temp file, then run `prjct analysis-save-llm <file> --md`."].join(`
1090
1090
  `),ip=class extends B{static{c(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1091
1091
  `),Je.init(t);let r={packageJson:await Je.readPackageJson(),cargoToml:await Je.readCargoToml(),goMod:await Je.readGoMod(),requirements:await Je.readRequirements(),directories:await Je.listDirectories(),fileCount:await Je.countFiles(),gitStats:await Je.getGitStats(),gitLog:await Je.getGitLog(20),hasDockerfile:await Je.fileExists("Dockerfile"),hasDockerCompose:await Je.fileExists("docker-compose.yml"),hasReadme:await Je.fileExists("README.md"),hasTsconfig:await Je.fileExists("tsconfig.json"),hasViteConfig:await Je.fileExists("vite.config.ts")||await Je.fileExists("vite.config.js"),hasNextConfig:await Je.fileExists("next.config.js")||await Je.fileExists("next.config.mjs")},s=ZS(r,t),o=await C.readConfig(t).catch(()=>null),i=await I.getWikiPath(t,o?.vaultPath),a=`${i}/_generated/analysis/repo-summary.md`;return await rv.mkdir(`${i}/_generated/analysis`,{recursive:!0}),await rv.writeFile(a,s,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:b(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
1092
1092
  `),console.log(`\u{1F4C4} Full report: ${I.getDisplayPath(a)}
1093
- `),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:r}}catch(r){return console.error("\u274C Error:",w(r)),$e(r)}}async sync(e=process.cwd(),t={}){try{let r=await se(e);if(!r.ok)return r.result;let s=r.value,o=Date.now();if(t.package){let a=await I.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(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await vs.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(_(Te(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await vs.sync(e,{full:t.full});if(!i.success)return t.md?console.log(_("## 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 S=await Xe.diff(s);S?.hasChanges&&(u=ra(S))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&lt.isCurrent(s,d),m=null;if(!p)try{let S=await _u(s,e,i.git,i.stats);m=["## Analysis Payload",sv,"### Data","```json",JSON.stringify(S),"```"].join(`
1093
+ `),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:r}}catch(r){return console.error("\u274C Error:",w(r)),$e(r)}}async sync(e=process.cwd(),t={}){try{let r=await se(e);if(!r.ok)return r.result;let s=r.value,o=Date.now();if(t.package){let a=await I.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(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await vs.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(_(Te(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await vs.sync(e,{full:t.full});if(!i.success)return t.md?console.log(_("## 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 S=await Xe.diff(s);S?.hasChanges&&(u=ra(S))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&lt.isCurrent(s,d),m=null;if(!p)try{let S=await _u(s,e,i.git,i.stats);m=["## Analysis Payload",sv,"### Data","```json",JSON.stringify(S),"```"].join(`
1094
1094
  `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let f=Va("sync",!0),y=i.syncMetrics?.indexes,x={Duration:`${(a/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(y?.bm25Files){let S=y.bm25Files*(y.bm25AvgTokens||0);x["Tokens indexed"]=`${Math.round(S/1e3)}K`,x["Import edges"]=y.importEdges||0,x["Co-change commits"]=y.cochangeCommits||0}let v=_(Te("Sync Complete"),sr(x),u,i.git.hasChanges?vb("Uncommitted changes detected"):null,m,He(f.map(S=>({label:S.desc,command:S.cmd}))));return console.log(v),{success:!0,data:i,metrics:{elapsed:a,skillCount:l,fileCount:i.stats.fileCount}}}return zS(i,o)}catch(r){return t.md?console.log(_("## Sync Failed",`> ${w(r)}`)):g.fail(w(r)),$e(r)}}async analysisPayload(e=process.cwd(),t={}){try{let r=await se(e);if(!r.ok)return r.result;let s=r.value,o=await vs.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&lt.isCurrent(s,i))return t.md?console.log(_(Te("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 _u(s,e,o.git,o.stats);return t.md?console.log(_("## Analysis Payload",sv,"### Data","```json",JSON.stringify(a),"```")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(r){return $e(r)}}async regenVault(e=process.cwd(),t={}){try{let r=await se(e);if(!r.ok)return r.result;let s=r.value,o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(ve(),Bg))).default,l=await(await Promise.resolve().then(()=>(Q(),Jn))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(dn(),lr)),m=await p(e,s);return t.md?console.log(`---
1095
1095
 
1096
1096
  ## Vault regenerated
@@ -1317,12 +1317,12 @@ if [[ -f "$CONFIG" ]]; then
1317
1317
 
1318
1318
  # If no cliVersion or different version, show update notice
1319
1319
  if [[ -z "$PROJECT_VERSION" ]] || [[ "$PROJECT_VERSION" != "$CLI_VERSION" ]]; then
1320
- echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run /p:sync"
1320
+ echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run p. sync"
1321
1321
  exit 0
1322
1322
  fi
1323
1323
  else
1324
1324
  # No project.json means project needs sync
1325
- echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run /p:sync"
1325
+ echo "\u26A0\uFE0F prjct v$CLI_VERSION available! Run p. sync"
1326
1326
  exit 0
1327
1327
  fi
1328
1328
 
@@ -1546,7 +1546,7 @@ ${o.map(l=>`- \`${l}\``).join(`
1546
1546
  `)}function KM(n){return[`Handoff for ${n.target}`,`Active: ${n.active?.description??"none"}`,"Run: prjct status --md; prjct value --md; prjct guardrails --md",`Context entries: ${n.memories.length}`].join(`
1547
1547
  `)}function YM(n){let e=["# Risk Guardrails",""];if(e.push(`Changed files checked: ${n.files.length}`),n.hits.length>0){e.push("","## File-specific warnings");for(let t of n.hits)e.push(`- \`${t.file}\`: **[${Ir(t.entry)}] ${xe(t.entry)}** \u2014 ${or(t.entry.content)} \`${t.entry.id}\``)}else e.push("","No file-specific preventive memory matched the current changeset."),n.fallback.length>0&&(e.push("","## General project traps"),Gf(e,n.fallback));return e.push("","_Advisory only. This command does not block or mutate anything._"),e.join(`
1548
1548
  `)}function QM(n){return n.hits.length===0?`Risk guardrails: ${n.files.length} files checked, no file-specific hits.`:`Risk guardrails: ${n.hits.length} warning(s) across ${n.files.length} changed file(s).`}function Gf(n,e){if(e.length===0){n.push("- None recorded yet.");return}for(let t of e)n.push(`- **[${t.type}] ${xe(t)}** \u2014 ${or(t.content)} \`${t.id}\``)}function qT(n,e,t){if(n.push("",`### ${e}`),t.length===0){n.push("- None.");return}for(let r of t)n.push(`- **${r.type??"unknown"}** ${r.title??r.content.slice(0,80)} \`${r.id}\``)}var DM,IM,Wf,XT=h(()=>{"use strict";fo();Pt();ke();_n();K();H();ye();ge();Ee();Ot();DM=["gotcha","anti-pattern","learning"],IM=/^(current work|wip|todo|misc|n\/a|none|latest|unreleased|changelog)$/i,Wf=class extends B{static{c(this,"ProductCommands")}async value(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=await VT(s.value,t);return console.log(r.md?GM(o):BM(o)),{success:!0,...o}}catch(s){return j(w(s),r)}}async memoryDoctor(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=$M(s.value);return console.log(r.md?qM(o):VM(o)),{success:!0,score:o.score,issues:o.issues.length}}catch(s){return j(w(s),r)}}async report(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=UM(e,r.days,7),i=await MM(s.value,t,o);return console.log(r.md?JM(i):XM(i)),{success:!0,days:o,ships:i.ships.length,completed:i.completed.length}}catch(s){return j(w(s),r)}}async handoff(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=(e??"").trim().split(/\s+/).filter(Boolean)[0]??"next agent",i=await NM(s.value,t,o);return console.log(r.md?zM(i):KM(i)),{success:!0,target:o,memories:i.memories.length}}catch(s){return j(w(s),r)}}async guardrails(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=await OM(s.value,t);return console.log(r.md?YM(o):QM(o)),{success:!0,files:o.files.length,hits:o.hits.length}}catch(s){return j(w(s),r)}}};c(VT,"buildValueSnapshot");c($M,"buildMemoryDoctor");c(MM,"buildHumanReport");c(NM,"buildHandoff");c(OM,"buildGuardrails");c(LM,"changedFiles");c(ot,"count");c(Qo,"query");c(FM,"valueScore");c(UM,"pickDays");c(HM,"sinceIso");c(WM,"isNoise");c(GM,"formatValueMd");c(BM,"formatValueText");c(qM,"formatMemoryDoctorMd");c(VM,"formatMemoryDoctorText");c(JM,"formatReportMd");c(XM,"formatReportText");c(zM,"formatHandoffMd");c(KM,"formatHandoffText");c(YM,"formatGuardrailsMd");c(QM,"formatGuardrailsText");c(Gf,"appendEntries");c(qT,"appendMemoryRows")});var nC={};F(nC,{isSyncCurrent:()=>Jf,runSelfHeal:()=>Xf});import Vf from"node:fs";import iN from"node:path";function aN(){try{return Vf.readFileSync(tC(),"utf-8").trim()}catch{return null}}function cN(n){try{Vf.mkdirSync(eC(),{recursive:!0}),Vf.writeFileSync(tC(),n,"utf-8")}catch{}}function Jf(n){return n?aN()===n:!0}async function Xf(n){if(n&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(Tn(),Cy));await e()}catch{}try{await(await Promise.resolve().then(()=>(Qm(),ZE))).install()}catch{}cN(n)}}var eC,tC,zf=h(()=>{"use strict";ve();eC=c(()=>I.getStatePath(),"stampDir"),tC=c(()=>iN.join(eC(),"installed-version"),"stampPath");c(aN,"readStamp");c(cN,"writeStamp");c(Jf,"isSyncCurrent");c(Xf,"runSelfHeal")});var aC={};F(aC,{_internal:()=>yN,maybeAutoUpdate:()=>fN,runBackgroundCheck:()=>gN});import{execFile as lN,spawn as uN}from"node:child_process";import Bs from"node:fs";import Zo from"node:path";import{promisify as dN}from"node:util";function fN(n){if(!n||process.env.PRJCT_NO_AUTO_UPDATE==="1"||wt("auto-update")!=="on")return;let e=wt("auto-update-last-check");if(e&&Date.now()-Date.parse(e)<sC)return;Ie("auto-update-last-check",new Date().toISOString()),uN(process.execPath,[process.argv[1],"__internal-auto-update",n],{detached:!0,stdio:"ignore"}).unref()}async function gN(n){try{let e=await oC();if(!e)return;if(Zs(e,n)<=0){Qc(`current ${n} >= latest ${e}, no-op`);return}let t=iC();Qc(`upgrade available: ${n} \u2192 ${e} (source: ${t})`),await hN(t,e),Qc(`upgrade complete: ${n} \u2192 ${e}`)}catch(e){Qc(`auto-update failed: ${e.message}`)}}async function oC(){try{let n=new AbortController,e=setTimeout(()=>n.abort(),6e3),t=await fetch(mN,{signal:n.signal});if(clearTimeout(e),!t.ok)return null;let r=await t.json();return typeof r.version=="string"?r.version:null}catch{return null}}function iC(){let n=Zo.join(Lt(),"bin","prjct");if(Bs.existsSync(n))try{if(Bs.statSync(n).size>1024*1024)return"binary"}catch{}try{let e=String(Ye("node:child_process").execSync("npm root -g")).trim();if(e&&Bs.existsSync(Zo.join(e,"prjct-cli")))return"npm"}catch{}try{let e=String(Ye("node:child_process").execSync("bun pm bin -g")).trim();if(e&&Bs.existsSync(Zo.join(e,"prjct")))return"bun"}catch{}return"unknown"}async function hN(n,e){if(n==="binary"){await Kf("bash",["-c","curl -sSL 'https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh' | bash"],{timeout:12e4,maxBuffer:4*1024*1024});return}if(n==="bun"){await Kf("bun",["install","-g","prjct-cli@latest"],{timeout:12e4});return}if(n==="npm"||n==="unknown"){await Kf("npm",["install","-g","prjct-cli@latest"],{timeout:12e4});return}}function Qc(n){try{Bs.mkdirSync(rC(),{recursive:!0}),Bs.appendFileSync(pN(),`${new Date().toISOString()} ${n}
1549
- `)}catch{}}var Kf,rC,pN,sC,mN,yN,cC=h(()=>{"use strict";Jr();Gr();Dc();Kf=dN(lN),rC=c(()=>Zo.join(Lt(),"state"),"stateDir"),pN=c(()=>Zo.join(rC(),"auto-update.log"),"logPath"),sC=3600*1e3,mN="https://registry.npmjs.org/prjct-cli/latest";c(fN,"maybeAutoUpdate");c(gN,"runBackgroundCheck");c(oC,"fetchLatestVersion");c(iC,"detectInstallSource");c(hN,"applyUpgrade");c(Qc,"log");yN={fetchLatestVersion:oC,detectInstallSource:iC,compareSemver:Zs,THROTTLE_MS:sC}});import jt from"node:fs";import{createServer as fO}from"node:net";var Jo=class{static{c(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(tm(),em)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(kc(),wc)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(yc(),hc)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(lc(),cc)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(cm(),am)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(km(),wm)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(Fm(),Lm)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(Wm(),Hm)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(qm(),Bm)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(tf(),ef)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(sf(),rf)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(uf(),lf)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(gf(),ff)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(wf(),yf)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(Sf(),bf)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(Tf(),Ef)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(Af(),xf)).then(e=>new e.SpecCommands).catch(e=>{throw this._specCmds=void 0,e})}agent;agentInfo;currentAuthor;prjctDir;constructor(){this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),r={}){return(await this.workflowG()).now(e,t,r)}async workflowPrefs(e=null,t=process.cwd(),r={}){return(await this.workflowG()).workflow(e,t,r)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),r={}){return(await this.shippingG()).ship(e,t,{...r})}async analyze(e={},t=process.cwd()){return(await this.analysisG()).analyze(e,t)}async sync(e=process.cwd(),t={}){return(await this.analysisG()).sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),r={}){return(await this.analysisG()).saveLlmAnalysis(e,t,r)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).context(e,t,r)}async search(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).search(e,t,r)}async status(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).status(e,t,r)}async tag(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).tag(e,t,r)}async remember(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).remember(e,t,r)}async forget(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).forget(e,t,r)}async seed(e=null,t=process.cwd(),r={}){return(await this.seedCmdsG()).seed(e,t,r)}async install(e=null,t=process.cwd(),r={}){return(await this.installCmdsG()).install(null,t,r)}async capture(e=null,t=process.cwd(),r={}){return(await this.captureCmdsG()).capture(e,t,r)}async mcp(e=null,t=process.cwd(),r={}){return(await this.mcpCmdsG()).mcp(e,t,r)}async team(e=null,t=process.cwd(),r={}){return(await this.teamCmdsG()).team(e,t,r)}async config(e=null,t=process.cwd(),r={}){return(await this.configCmdsG()).config(e,t,r)}async embeddings(e=null,t=process.cwd(),r={}){return(await this.embeddingsCmdsG()).embeddings(e,t,r)}async guard(e=null,t=process.cwd(),r={}){return(await this.guardCmdsG()).guard(e,t,r)}async auth(e=null,t={}){return(await this.setupCmdsG()).auth(e,t)}async login(e={}){return(await this.setupCmdsG()).login(e)}async logout(){return(await this.setupCmdsG()).logout()}async start(){return(await this.setupCmdsG()).start()}async setup(e={}){return(await this.setupCmdsG()).setup(e)}async update(e={},t=process.cwd()){return(await this.updateCmdsG()).update(e,t)}async installStatusLine(){return(await this.setupCmdsG()).installStatusLine()}async initializeAgent(){return(await this.workflowG()).initializeAgent()}async ensureProjectInit(e){return(await this.workflowG()).ensureProjectInit(e)}async ensureAuthor(){return(await this.workflowG()).ensureAuthor()}async getGlobalProjectPath(e){return(await this.workflowG()).getGlobalProjectPath(e)}async logToMemory(e,t,r){return(await this.workflowG()).logToMemory(e,t,r)}async spec(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).draft(e,t,r)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).show(e,t,r)}async specUpdate(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).update(e,t,r)}async specSetStatus(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).setStatus(e,t,r)}async specRecordReview(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).recordReview(e,t,r)}async specLinkTask(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).linkTask(e,t,r)}async specShip(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).ship(e,t,r)}async specAudit(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).audit(e,t,r)}async specBreakdown(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).breakdown(e,t,r)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}};var cT={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}},Xo=[{name:"init",group:"core",routing:{group:"planning",method:"init"},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",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"]},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",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},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 derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},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",routing:{group:"analysis",method:"regenVault"},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",routing:{group:"primitives",method:"status"},optionSchema:{},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",routing:{group:"primitives",method:"tag"},optionSchema:{},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",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"]},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:"forget",group:"core",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"prjct forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},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",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},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",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},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",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces and the Claude hooks adapter",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},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:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"/p:lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"/p:tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"/p:sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"/p:notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"/p:agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"/p:value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"/p:memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"/p:report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"/p:handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"/p:guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"/p:cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},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",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",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",routing:{group:"setup",method:"login"},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",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},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",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},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:"search",group:"core",routing:{group:"context",method:"search"},optionSchema:{},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'prjct search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},routingMode:"bin-only",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",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",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",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},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:"embeddings",group:"core",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"/p:embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"guard",group:"core",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"/p:guard <file>",terminal:"prjct guard <file>"},params:"<file>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"core",routing:{group:"config",method:"config"},optionSchema:{},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"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'/p:spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to ~/Documents/prjct/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"/p:audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`"],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e])=>({name:n,group:"setup",description:e,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],mM={"-h":"help","--help":"help","-v":"version","--version":"version"},C9=new Set(Xo.filter(n=>n.routingMode==="cold-only").map(n=>n.name)),R9=new Set([...Xo.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(mM).filter(([,n])=>Xo.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)]);Q();ve();H();ae();var Pf=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;optionFns=new Map;lazyResetters=[];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,r){this.handlerFns.set(e,t),this.setMeta(e,r)}setMeta(e,t){let r=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:r,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,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,r,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=c(async()=>{if(o)return o;let l=await t(),u=l[r];if(typeof u!="function")throw new Error(`${r} is not a function`);return o={instance:l,method:u},o},"resolve"),a=c(async(l,u)=>{let{instance:d,method:p}=await i();return l!=null?p.call(d,l,u.projectPath):p.call(d,u.projectPath)},"wrapper");this.handlerFns.set(e,a),this.optionFns.set(e,async(l,u,d)=>{let{instance:p,method:m}=await i();return m.call(p,l,u,d)}),this.setMeta(e,s)}resetLazyResolutions(){for(let e of this.lazyResetters)e()}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 r of this.categories.keys())t[r]=e.filter(s=>s.group===r).length;return{total:e.length,implemented:e.filter(r=>r.implemented).length,withTemplates:e.filter(r=>r.hasTemplate).length,claudeOnly:e.filter(r=>r.usage.claude&&!r.usage.terminal).length,terminalOnly:e.filter(r=>!r.usage.claude&&r.usage.terminal).length,both:e.filter(r=>r.usage.claude&&r.usage.terminal).length,requiresInit:e.filter(r=>r.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),r=t.map(a=>a.name),s=r.filter((a,l)=>r.indexOf(a)!==l);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(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 C.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,r=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:r,globalPath:"",timestamp:b()};else try{o=await this.buildContext(r)}catch(l){return{success:!1,error:w(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 executeWithOptions(e,t,r,s){let o=this.optionFns.get(e);if(!o)return{success:!1,error:`Command not found: ${e}`};if(this.metadata.get(e)?.requiresProject!==!1)try{await this.buildContext(r)}catch(a){return{success:!1,error:w(a)}}return o(t,r,s)}async executeWithoutProject(e,t,r=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:r,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:r,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()}},ut=new Pf;var zT=[];function KT(){for(let n of zT)n()}c(KT,"resetGroupLoaders");function Re(n){let e;return zT.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}c(Re,"lazy");var ZM={workflow:Re(async()=>new(await Promise.resolve().then(()=>(tm(),em))).WorkflowCommands),planning:Re(async()=>new(await Promise.resolve().then(()=>(kc(),wc))).PlanningCommands),shipping:Re(async()=>new(await Promise.resolve().then(()=>(yc(),hc))).ShippingCommands),analysis:Re(async()=>new(await Promise.resolve().then(()=>(lc(),cc))).AnalysisCommands),setup:Re(async()=>new(await Promise.resolve().then(()=>(cm(),am))).SetupCommands),context:Re(async()=>new(await Promise.resolve().then(()=>(Fm(),Lm))).ContextCommands),primitives:Re(async()=>new(await Promise.resolve().then(()=>(Wm(),Hm))).PrimitiveCommands),seed:Re(async()=>new(await Promise.resolve().then(()=>(qm(),Bm))).SeedCommands),install:Re(async()=>new(await Promise.resolve().then(()=>(tf(),ef))).InstallCommands),capture:Re(async()=>new(await Promise.resolve().then(()=>(sf(),rf))).CaptureCommands),mcp:Re(async()=>new(await Promise.resolve().then(()=>(uf(),lf))).McpCommands),team:Re(async()=>new(await Promise.resolve().then(()=>(gf(),ff))).TeamCommands),config:Re(async()=>new(await Promise.resolve().then(()=>(wf(),yf))).ConfigCommands),uninstall:Re(async()=>new(await Promise.resolve().then(()=>(vT(),ST))).UninstallCommands),update:Re(async()=>new(await Promise.resolve().then(()=>(km(),wm))).UpdateCommands),spec:Re(async()=>new(await Promise.resolve().then(()=>(Af(),xf))).SpecCommands),embeddings:Re(async()=>new(await Promise.resolve().then(()=>(Sf(),bf))).EmbeddingsCommands),guard:Re(async()=>new(await Promise.resolve().then(()=>(Tf(),Ef))).GuardCommands),lean:Re(async()=>new(await Promise.resolve().then(()=>(IT(),DT))).LeanCommands),cloud:Re(async()=>new(await Promise.resolve().then(()=>(FT(),LT))).CloudCommands),tdd:Re(async()=>new(await Promise.resolve().then(()=>(Cp(),Tp))).TddCommands),sdd:Re(async()=>new(await Promise.resolve().then(()=>(pc(),dc))).SddCommands),notify:Re(async()=>new(await Promise.resolve().then(()=>(WT(),HT))).NotifyCommands),agents:Re(async()=>new(await Promise.resolve().then(()=>(BT(),GT))).AgentsCommands),product:Re(async()=>new(await Promise.resolve().then(()=>(XT(),JT))).ProductCommands)};function eN(){for(let[n,e]of Object.entries(cT))ut.registerCategory(n,e)}c(eN,"registerCategories");function tN(){if(!ut.has("work")){eN();for(let n of Xo)n.routing&&ut.registerLazyMethod(n.name,ZM[n.routing.group],n.routing.method,n)}}c(tN,"registerAllCommands");tN();La();var nN=new Set(["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse"]);async function YT(){return process.stdin.isTTY?{}:new Promise(n=>{let e=[];process.stdin.on("data",t=>e.push(t)),process.stdin.on("end",()=>{try{let t=Buffer.concat(e).toString("utf-8").trim();if(!t)return n({});n(JSON.parse(t))}catch{n({})}}),process.stdin.on("error",()=>n({})),setTimeout(()=>n({}),200)})}c(YT,"readStdinSafe");function Bf(n){process.stdout.write(`${JSON.stringify(n)}
1549
+ `)}catch{}}var Kf,rC,pN,sC,mN,yN,cC=h(()=>{"use strict";Jr();Gr();Dc();Kf=dN(lN),rC=c(()=>Zo.join(Lt(),"state"),"stateDir"),pN=c(()=>Zo.join(rC(),"auto-update.log"),"logPath"),sC=3600*1e3,mN="https://registry.npmjs.org/prjct-cli/latest";c(fN,"maybeAutoUpdate");c(gN,"runBackgroundCheck");c(oC,"fetchLatestVersion");c(iC,"detectInstallSource");c(hN,"applyUpgrade");c(Qc,"log");yN={fetchLatestVersion:oC,detectInstallSource:iC,compareSemver:Zs,THROTTLE_MS:sC}});import jt from"node:fs";import{createServer as fO}from"node:net";var Jo=class{static{c(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(tm(),em)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(kc(),wc)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(yc(),hc)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(lc(),cc)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(cm(),am)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(km(),wm)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(Fm(),Lm)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(Wm(),Hm)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(qm(),Bm)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(tf(),ef)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(sf(),rf)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(uf(),lf)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(gf(),ff)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(wf(),yf)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(Sf(),bf)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(Tf(),Ef)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(Af(),xf)).then(e=>new e.SpecCommands).catch(e=>{throw this._specCmds=void 0,e})}agent;agentInfo;currentAuthor;prjctDir;constructor(){this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),r={}){return(await this.workflowG()).now(e,t,r)}async workflowPrefs(e=null,t=process.cwd(),r={}){return(await this.workflowG()).workflow(e,t,r)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),r={}){return(await this.shippingG()).ship(e,t,{...r})}async analyze(e={},t=process.cwd()){return(await this.analysisG()).analyze(e,t)}async sync(e=process.cwd(),t={}){return(await this.analysisG()).sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),r={}){return(await this.analysisG()).saveLlmAnalysis(e,t,r)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).context(e,t,r)}async search(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).search(e,t,r)}async status(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).status(e,t,r)}async tag(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).tag(e,t,r)}async remember(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).remember(e,t,r)}async forget(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).forget(e,t,r)}async seed(e=null,t=process.cwd(),r={}){return(await this.seedCmdsG()).seed(e,t,r)}async install(e=null,t=process.cwd(),r={}){return(await this.installCmdsG()).install(null,t,r)}async capture(e=null,t=process.cwd(),r={}){return(await this.captureCmdsG()).capture(e,t,r)}async mcp(e=null,t=process.cwd(),r={}){return(await this.mcpCmdsG()).mcp(e,t,r)}async team(e=null,t=process.cwd(),r={}){return(await this.teamCmdsG()).team(e,t,r)}async config(e=null,t=process.cwd(),r={}){return(await this.configCmdsG()).config(e,t,r)}async embeddings(e=null,t=process.cwd(),r={}){return(await this.embeddingsCmdsG()).embeddings(e,t,r)}async guard(e=null,t=process.cwd(),r={}){return(await this.guardCmdsG()).guard(e,t,r)}async auth(e=null,t={}){return(await this.setupCmdsG()).auth(e,t)}async login(e={}){return(await this.setupCmdsG()).login(e)}async logout(){return(await this.setupCmdsG()).logout()}async start(){return(await this.setupCmdsG()).start()}async setup(e={}){return(await this.setupCmdsG()).setup(e)}async update(e={},t=process.cwd()){return(await this.updateCmdsG()).update(e,t)}async installStatusLine(){return(await this.setupCmdsG()).installStatusLine()}async initializeAgent(){return(await this.workflowG()).initializeAgent()}async ensureProjectInit(e){return(await this.workflowG()).ensureProjectInit(e)}async ensureAuthor(){return(await this.workflowG()).ensureAuthor()}async getGlobalProjectPath(e){return(await this.workflowG()).getGlobalProjectPath(e)}async logToMemory(e,t,r){return(await this.workflowG()).logToMemory(e,t,r)}async spec(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).draft(e,t,r)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).show(e,t,r)}async specUpdate(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).update(e,t,r)}async specSetStatus(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).setStatus(e,t,r)}async specRecordReview(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).recordReview(e,t,r)}async specLinkTask(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).linkTask(e,t,r)}async specShip(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).ship(e,t,r)}async specAudit(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).audit(e,t,r)}async specBreakdown(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).breakdown(e,t,r)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}};var cT={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}},Xo=[{name:"init",group:"core",routing:{group:"planning",method:"init"},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",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"]},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",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},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 derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},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",routing:{group:"analysis",method:"regenVault"},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",routing:{group:"primitives",method:"status"},optionSchema:{},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",routing:{group:"primitives",method:"tag"},optionSchema:{},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",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"]},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:"forget",group:"core",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"prjct forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},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",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},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",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},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",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces and the Claude hooks adapter",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"/p:help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},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:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"/p:lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"/p:tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"/p:sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"/p:notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"/p:agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"/p:value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"/p:memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"/p:report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"/p:handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"/p:guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"/p:cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},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",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",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",routing:{group:"setup",method:"login"},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",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},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",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},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:"search",group:"core",routing:{group:"context",method:"search"},optionSchema:{},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'prjct search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},routingMode:"bin-only",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",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",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",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},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:"embeddings",group:"core",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"/p:embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"guard",group:"core",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"/p:guard <file>",terminal:"prjct guard <file>"},params:"<file>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"core",routing:{group:"config",method:"config"},optionSchema:{},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"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'/p:spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to ~/Documents/prjct/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"/p:audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`"],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e])=>({name:n,group:"setup",description:e,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],mM={"-h":"help","--help":"help","-v":"version","--version":"version"},C9=new Set(Xo.filter(n=>n.routingMode==="cold-only").map(n=>n.name)),R9=new Set([...Xo.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(mM).filter(([,n])=>Xo.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)]);Q();ve();H();ae();var Pf=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;optionFns=new Map;lazyResetters=[];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,r){this.handlerFns.set(e,t),this.setMeta(e,r)}setMeta(e,t){let r=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:r,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,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,r,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=c(async()=>{if(o)return o;let l=await t(),u=l[r];if(typeof u!="function")throw new Error(`${r} is not a function`);return o={instance:l,method:u},o},"resolve"),a=c(async(l,u)=>{let{instance:d,method:p}=await i();return l!=null?p.call(d,l,u.projectPath):p.call(d,u.projectPath)},"wrapper");this.handlerFns.set(e,a),this.optionFns.set(e,async(l,u,d)=>{let{instance:p,method:m}=await i();return m.call(p,l,u,d)}),this.setMeta(e,s)}resetLazyResolutions(){for(let e of this.lazyResetters)e()}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 r of this.categories.keys())t[r]=e.filter(s=>s.group===r).length;return{total:e.length,implemented:e.filter(r=>r.implemented).length,withTemplates:e.filter(r=>r.hasTemplate).length,claudeOnly:e.filter(r=>r.usage.claude&&!r.usage.terminal).length,terminalOnly:e.filter(r=>!r.usage.claude&&r.usage.terminal).length,both:e.filter(r=>r.usage.claude&&r.usage.terminal).length,requiresInit:e.filter(r=>r.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),r=t.map(a=>a.name),s=r.filter((a,l)=>r.indexOf(a)!==l);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(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 C.getProjectId(e);if(!t)throw new Error("No prjct project found. Run p. init first.");return{projectId:t,projectPath:e,globalPath:I.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,r=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:r,globalPath:"",timestamp:b()};else try{o=await this.buildContext(r)}catch(l){return{success:!1,error:w(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 executeWithOptions(e,t,r,s){let o=this.optionFns.get(e);if(!o)return{success:!1,error:`Command not found: ${e}`};if(this.metadata.get(e)?.requiresProject!==!1)try{await this.buildContext(r)}catch(a){return{success:!1,error:w(a)}}return o(t,r,s)}async executeWithoutProject(e,t,r=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:r,globalPath:"",timestamp:b()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:r,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()}},ut=new Pf;var zT=[];function KT(){for(let n of zT)n()}c(KT,"resetGroupLoaders");function Re(n){let e;return zT.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}c(Re,"lazy");var ZM={workflow:Re(async()=>new(await Promise.resolve().then(()=>(tm(),em))).WorkflowCommands),planning:Re(async()=>new(await Promise.resolve().then(()=>(kc(),wc))).PlanningCommands),shipping:Re(async()=>new(await Promise.resolve().then(()=>(yc(),hc))).ShippingCommands),analysis:Re(async()=>new(await Promise.resolve().then(()=>(lc(),cc))).AnalysisCommands),setup:Re(async()=>new(await Promise.resolve().then(()=>(cm(),am))).SetupCommands),context:Re(async()=>new(await Promise.resolve().then(()=>(Fm(),Lm))).ContextCommands),primitives:Re(async()=>new(await Promise.resolve().then(()=>(Wm(),Hm))).PrimitiveCommands),seed:Re(async()=>new(await Promise.resolve().then(()=>(qm(),Bm))).SeedCommands),install:Re(async()=>new(await Promise.resolve().then(()=>(tf(),ef))).InstallCommands),capture:Re(async()=>new(await Promise.resolve().then(()=>(sf(),rf))).CaptureCommands),mcp:Re(async()=>new(await Promise.resolve().then(()=>(uf(),lf))).McpCommands),team:Re(async()=>new(await Promise.resolve().then(()=>(gf(),ff))).TeamCommands),config:Re(async()=>new(await Promise.resolve().then(()=>(wf(),yf))).ConfigCommands),uninstall:Re(async()=>new(await Promise.resolve().then(()=>(vT(),ST))).UninstallCommands),update:Re(async()=>new(await Promise.resolve().then(()=>(km(),wm))).UpdateCommands),spec:Re(async()=>new(await Promise.resolve().then(()=>(Af(),xf))).SpecCommands),embeddings:Re(async()=>new(await Promise.resolve().then(()=>(Sf(),bf))).EmbeddingsCommands),guard:Re(async()=>new(await Promise.resolve().then(()=>(Tf(),Ef))).GuardCommands),lean:Re(async()=>new(await Promise.resolve().then(()=>(IT(),DT))).LeanCommands),cloud:Re(async()=>new(await Promise.resolve().then(()=>(FT(),LT))).CloudCommands),tdd:Re(async()=>new(await Promise.resolve().then(()=>(Cp(),Tp))).TddCommands),sdd:Re(async()=>new(await Promise.resolve().then(()=>(pc(),dc))).SddCommands),notify:Re(async()=>new(await Promise.resolve().then(()=>(WT(),HT))).NotifyCommands),agents:Re(async()=>new(await Promise.resolve().then(()=>(BT(),GT))).AgentsCommands),product:Re(async()=>new(await Promise.resolve().then(()=>(XT(),JT))).ProductCommands)};function eN(){for(let[n,e]of Object.entries(cT))ut.registerCategory(n,e)}c(eN,"registerCategories");function tN(){if(!ut.has("work")){eN();for(let n of Xo)n.routing&&ut.registerLazyMethod(n.name,ZM[n.routing.group],n.routing.method,n)}}c(tN,"registerAllCommands");tN();La();var nN=new Set(["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse"]);async function YT(){return process.stdin.isTTY?{}:new Promise(n=>{let e=[];process.stdin.on("data",t=>e.push(t)),process.stdin.on("end",()=>{try{let t=Buffer.concat(e).toString("utf-8").trim();if(!t)return n({});n(JSON.parse(t))}catch{n({})}}),process.stdin.on("error",()=>n({})),setTimeout(()=>n({}),200)})}c(YT,"readStdinSafe");function Bf(n){process.stdout.write(`${JSON.stringify(n)}
1550
1550
  `)}c(Bf,"emit");function rN(){Bf({})}c(rN,"emitEmpty");async function QT(n){try{await n()}catch{rN()}}c(QT,"safeRun");var sN=new Set(["this","that","with","from","have","your","please","would","about","there","these","those","what","when","where","which","while","will","been","were","they","them","their","que","como","cuando","donde","porque","para","pero","por","con","sin","los","las","del","una","uno","unos","unas","este","esta","esto","estos","estas","eso","esos","esas","mas","muy","todo","toda","todos","todas","sobre","entre","hasta","desde","hace","hacer","tiene","tienen","debe","deben","puede","pueden","estan","ser","son","algo","ahora","aqui","bien","cada","dale"]);function ZT(n,e=8){let t=ks(n.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2")).toLowerCase(),r=new Set,s=[];for(let o of t.split(/[^\p{L}\p{N}]+/u))if(!(o.length<3)&&!sN.has(o)&&!r.has(o)&&(r.add(o),s.push(o),s.length>=e))break;return s}c(ZT,"extractKeywords");function oN(n){return n.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD")}c(oN,"stripLoneSurrogates");function $n(n,e,t=`
1551
1551
  \u2026 [truncated]`){if(n.length<=e)return n;let r=Math.max(0,e-t.length),s=n.charCodeAt(r-1);return s>=55296&&s<=56319&&(r-=1),n.slice(0,Math.max(0,r))+t}c($n,"safeTruncate");function qf(n,e){if(!e)return{};let t=oN(e);return nN.has(n)?{hookSpecificOutput:{hookEventName:n,additionalContext:t}}:{systemMessage:t}}c(qf,"buildHookOutput");async function We(n,e){let t=n.projectPath??process.cwd();if(e){try{let r=e.input,s=n.build?await n.build(r,t):null;e.sink(`${JSON.stringify(qf(n.event,s))}
1552
1552
  `),n.afterEmit&&e.detachAfterEmit(()=>n.afterEmit(r,t))}catch{e.sink(`{}
@@ -617,7 +617,7 @@ CREATE TABLE velocity_sprints (
617
617
  applied_at TEXT NOT NULL
618
618
  )
619
619
  `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=Xu.filter(i=>!r.has(i.version));if(s.length!==0){if(t&&r.size>0)try{let i=`${t}.pre-migrate.bak`;Ur.existsSync(i)&&Ur.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)qo(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.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}},T=new Ls,y=T});import td from"node:fs/promises";import zn from"node:path";function hk(n){let e=[],t,r=new RegExp(cu.source,"g");for(;(t=r.exec(n))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function yk(n,e,t){let r;if(n.startsWith("@/"))r=zn.join(t,"src",n.slice(2));else{let s=zn.dirname(zn.join(t,e));r=zn.resolve(s,n)}for(let s of au){let i=r+s;try{if((await td.stat(i)).isFile())return zn.relative(t,i)}catch{}}return null}async function wk(n){let e=await Wt(n),t={},r={},s=0,i=await Xn(e,50,async o=>{try{let a=await td.readFile(zn.join(n,o),"utf-8"),l=hk(a),u=[];for(let d of l){let p=await yk(d,o,n);p&&p!==o&&u.push(p)}return u.length>0?{filePath:o,imports:u}:null}catch{return null}});for(let{filePath:o,imports:a}of i){t[o]=a,s+=a.length;for(let l of a)r[l]||(r[l]=[]),r[l].push(o)}return{forward:t,reverse:r,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function nd(n,e,t=2){let r=new Set(n),s=new Map,i=[];for(let o of n){let a=e.forward[o]||[],l=e.reverse[o]||[];for(let u of[...a,...l])r.has(u)||i.push({file:u,depth:1})}for(;i.length>0;){let{file:o,depth:a}=i.shift();if(a>t)continue;let l=1/(a+1),u=s.get(o);if(u){l>u.score&&s.set(o,{score:l,depth:a});continue}if(s.set(o,{score:l,depth:a}),a<t){let d=e.forward[o]||[],p=e.reverse[o]||[];for(let m of[...d,...p])!r.has(m)&&!s.has(m)&&i.push({file:m,depth:a+1})}}return Array.from(s.entries()).map(([o,{score:a,depth:l}])=>({path:o,score:a,depth:l})).sort((o,a)=>a.score-o.score)}function kk(n,e){y.setDoc(n,Jo,e),Fs.delete(n)}function fn(n){let e=y.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Jo);if(!e)return Fs.delete(n),null;let t=Fs.get(n);if(t&&t.updatedAt===e.updated_at)return t.graph;let r=y.getDoc(n,Jo);return r&&Fs.set(n,{graph:r,updatedAt:e.updated_at}),r}async function Us(n,e){let t=await wk(n);return kk(e,t),t}var Jo,Fs,Hr=f(()=>{"use strict";No();X();J();c(hk,"extractImportSources");c(yk,"resolveImport");c(wk,"buildGraph");c(nd,"scoreFromSeeds");Jo="import-graph",Fs=new Map;c(kk,"saveGraph");c(fn,"loadGraph");c(Us,"indexImports")});function Hs(n,e){let t=[...n.added,...n.modified],r=new Set(t),s=new Set,i=fn(e);if(i)for(let l of t){let u=i.reverse[l];if(u)for(let d of u)r.has(d)||s.add(d)}let o=Array.from(s),a=[...t,...o];return{directlyChanged:t,affectedByImports:o,deleted:n.deleted,allAffected:a}}function Ws(n){let e=new Set;for(let t of n){let r=t.toLowerCase();(r.endsWith(".tsx")||r.endsWith(".jsx")||r.endsWith(".css")||r.endsWith(".scss")||r.endsWith(".vue")||r.endsWith(".svelte")||r.includes("/components/")||r.includes("/pages/")||r.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(r.includes(".test.")||r.includes(".spec.")||r.includes("__tests__")||r.includes("/test/"))&&e.add("testing"),(r.includes("dockerfile")||r.includes("docker-compose")||r.includes(".dockerignore")||r.includes(".github/")||r.includes("ci/")||r.includes("cd/"))&&e.add("devops"),(r.endsWith(".sql")||r.includes("prisma")||r.includes("drizzle")||r.includes("migration")||r.includes("/db/"))&&e.add("database"),(r.endsWith(".ts")||r.endsWith(".js"))&&!r.includes(".test.")&&!r.includes(".spec.")&&!r.endsWith(".d.ts")&&e.add("backend")}return e}var zo=f(()=>{"use strict";Hr();c(Hs,"propagateChanges");c(Ws,"affectedDomains")});var Ko=f(()=>{"use strict"});async function Ek(n,e=100){try{let{stdout:t}=await O(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:n,maxBuffer:10485760}),r=[],s=null;for(let i of t.split(`
620
- `)){let o=i.trim();o==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):o&&s&&bk(o)&&s.add(o)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}function bk(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 vk(n,e=100){let t=await Ek(n,e),r=new Map,s=new Map;for(let o of t){let a=Array.from(o);for(let l of a)r.set(l,(r.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=Tk(a[l],a[u]);s.set(d,(s.get(d)||0)+1)}}let i={};for(let[o,a]of s){let[l,u]=o.split("\0"),d=r.get(l)||0,p=r.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(i[l]||(i[l]={}),i[u]||(i[u]={}),i[l][u]=g,i[u][l]=g)}return{matrix:i,commitsAnalyzed:t.length,filesAnalyzed:r.size,builtAt:new Date().toISOString()}}function Tk(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function Qo(n,e){let t=new Set(n),r=new Map;for(let s of n){let i=e.matrix[s];if(i)for(let[o,a]of Object.entries(i)){if(t.has(o))continue;let l=r.get(o)||0;a>l&&r.set(o,a)}}return Array.from(r.entries()).map(([s,i])=>({path:s,score:i})).sort((s,i)=>i.score-s.score)}function xk(n,e){y.setDoc(n,Yo,e),Gs.delete(n)}function Wr(n){let e=y.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Yo);if(!e)return Gs.delete(n),null;let t=Gs.get(n);if(t&&t.updatedAt===e.updated_at)return t.matrix;let r=y.getDoc(n,Yo);return r&&Gs.set(n,{matrix:r,updatedAt:e.updated_at}),r}async function Bs(n,e,t=100){let r=await vk(n,t);return xk(e,r),r}var Yo,Gs,Vs=f(()=>{"use strict";Ko();X();ge();c(Ek,"parseGitLog");c(bk,"isSourceFile");c(vk,"buildMatrix");c(Tk,"pairKey");c(Qo,"scoreFromSeeds");Yo="cochange-index",Gs=new Map;c(xk,"saveMatrix");c(Wr,"loadMatrix");c(Bs,"indexCoChanges")});function Rk(n){return n instanceof Gr}function we(n){return Rk(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Gr,Xs,Br,Kt=f(()=>{"use strict";Gr=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)}},Xs=class n extends Gr{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")}},Br=class n extends Gr{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(Rk,"isPrjctError");c(we,"getErrorMessage")});var ta={};ee(ta,{PACKAGE_ROOT:()=>St,VERSION:()=>kt,getPackageRoot:()=>ea,getVersion:()=>Js,resetPackageRoot:()=>_k});import Zo from"node:fs";import qs from"node:path";function ea(){if(Kn)return Kn;let n=__dirname;for(let e=0;e<5;e++){let t=qs.join(n,"package.json");if(Zo.existsSync(t))try{if(JSON.parse(Zo.readFileSync(t,"utf-8")).name==="prjct-cli")return Kn=n,n}catch{}n=qs.dirname(n)}return Kn=qs.join(__dirname,"..","..",".."),Kn}function Js(){if(hn)return hn;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return hn=n,hn;try{let e=qs.join(ea(),"package.json");return hn=JSON.parse(Zo.readFileSync(e,"utf-8")).version,hn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function _k(n){Kn=n,hn=null}var hn,Kn,kt,St,Et=f(()=>{"use strict";q();hn=null,Kn=null;c(ea,"getPackageRoot");c(Js,"getVersion");c(_k,"resetPackageRoot");kt=Js(),St=ea()});async function zs(n){try{let{stdout:e}=await O(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Ck(){let n=await zs("gh api user --jq .login");return n.success&&n.output||(n=await zs("git config --global github.user"),n.success&&n.output)?n.output:null}async function Ak(){let n=await zs("git config user.name");return n.success&&n.output?n.output:null}async function Pk(){let n=await zs("git config user.email");return n.success&&n.output?n.output:null}async function Yn(){let[n,e,t]=await Promise.all([Ck(),Ak(),Pk()]);return{github:n,email:t,name:e||n||"Unknown"}}var Ks=f(()=>{"use strict";ge();c(zs,"execCommand");c(Ck,"detectGitHubUsername");c(Ak,"detectGitName");c(Pk,"detectGitEmail");c(Yn,"detect")});var Qn={};ee(Qn,{default:()=>$});import ra from"node:fs/promises";import jk from"node:path";import*as Ys from"jsonc-parser";function id(n){let e=[],t=Ys.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let r=e[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${Ys.printParseErrorCode(r.error)}`)}return t}var sa,Dk,$,fe=f(()=>{"use strict";Kt();q();Y();J();Et();Ks();De();c(id,"parseJsonc");sa=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=L.getLocalConfigPath(e),r=await ra.readFile(t,"utf-8");return id(r)}catch(t){return M(t)||console.warn(`Warning: Could not read config at ${e}: ${we(t)}`),null}}async writeConfig(e,t){let r=L.getLocalConfigPath(e);await Se(r,t)}async readGlobalConfig(e){try{let t=L.getGlobalProjectConfigPath(e),r=await ra.readFile(t,"utf-8");return id(r)}catch(t){return M(t)||console.warn(`Warning: Could not read global config for ${e}: ${we(t)}`),null}}async writeGlobalConfig(e,t){let r=L.getGlobalProjectConfigPath(e);await Se(r,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let r=k();t={projectId:e,authors:[],version:kt,lastSync:r},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let r=L.generateProjectId(e),s=L.getGlobalProjectPath(r),i=L.getDisplayPath(s),o=k(),a={projectId:r,dataPath:i,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:r,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}],version:kt,created:o,lastSync:o};return await this.writeGlobalConfig(r,l),a}async updateLastSync(e){let t=await this.getProjectId(e),r=await this.readGlobalConfig(t);r&&(r.lastSync=k(),await this.writeGlobalConfig(t,r))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await L.hasLegacyStructure(e))return!1;if(!await L.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let i=L.getGlobalProjectPath(s.projectId);try{return(await ra.readdir(jk.join(i,"core"))).length===0}catch(o){return M(o),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(Ds(),js));if(await r.detect(e)){let i=await r.getMainWorktree(e);if(i!==e){let o=await this.readConfig(i);if(o?.projectId)return o.projectId}}}catch{}return""}async findAuthor(e,t){let r=await this.readGlobalConfig(e);return!r||!r.authors?null:r.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let r=await this.ensureGlobalConfig(e);if(r.authors.some(o=>o.github===t.github))return;let i=k();r.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}),r.lastSync=i,await this.writeGlobalConfig(e,r)}async updateAuthorActivity(e,t){let r=await this.readGlobalConfig(e);if(!r||!r.authors)return;let s=r.authors.find(i=>i.github===t);s&&(s.lastActivity=k(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(e,r))}async getCurrentAuthor(e){let t=await Yn(),r=await this.getProjectId(e);return await this.addAuthor(r,{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 r=await this.readConfig(e);r&&(r.showMetrics=t,await this.writeConfig(e,r))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let r=L.generateProjectId(e);return{projectId:r,dataPath:L.getDisplayPath(L.getGlobalProjectPath(r))}}},Dk=new sa,$=Dk});import{z as w}from"zod";var Nk,Qs,Mk,Ok,ia,cd,ld,ud,dd,ad,$k,Lk,Fk,pd,Uk,md,Zs=f(()=>{"use strict";Fr();Nk=w.enum(["low","medium","high","critical"]),Qs=w.enum(["feature","bug","improvement","chore"]),Mk=w.enum(["active","backlog","previously_active"]),Ok=w.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),ia=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()}),cd=w.object({output:w.string().min(1,"Subtask output is required"),summary:ia}),ld=w.object({id:w.string(),description:w.string(),domain:w.string(),agent:w.string(),status:Ok,dependsOn:w.array(w.string()),startedAt:w.string().optional(),completedAt:w.string().optional(),output:w.string().optional(),summary:ia.optional(),skipReason:w.string().optional(),blockReason:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional()}),ud=w.object({completed:w.number(),total:w.number(),percentage:w.number()}),dd=w.object({id:w.string(),description:w.string(),type:Qs.optional(),startedAt:w.string(),sessionId:w.string(),featureId:w.string().optional(),subtasks:w.array(ld).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:ud.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),linkedSpecId:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:Lr.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional(),parentDescription:w.string().optional(),branch:w.string().optional(),prUrl:w.string().optional()}),ad=w.object({id:w.string(),description:w.string(),status:w.literal("paused"),startedAt:w.string(),pausedAt:w.string(),pauseReason:w.string().optional(),type:Qs.optional(),sessionId:w.string().optional(),featureId:w.string().optional(),subtasks:w.array(ld).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:ud.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:Lr.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),$k=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()}),Lk=w.object({taskId:w.string(),title:w.string(),classification:Qs,startedAt:w.string(),completedAt:w.string(),subtaskCount:w.number(),subtaskSummaries:w.array(ia),outcome:w.string(),branchName:w.string(),linearId:w.string().optional(),linearUuid:w.string().optional(),prUrl:w.string().optional(),feedback:$k.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),Fk=dd.extend({workspaceId:w.string(),worktreePath:w.string().optional(),agentSessionId:w.string().optional(),jiraId:w.string().optional(),jiraUuid:w.string().optional(),dispatchedFrom:w.string().optional()}),pd=w.object({currentTask:dd.nullable(),previousTask:ad.nullable().optional(),pausedTasks:w.array(ad).optional(),taskHistory:w.array(Lk).optional(),activeTasks:w.array(Fk).optional(),lastUpdated:w.string()}),Uk=w.object({id:w.string(),description:w.string(),body:w.string().optional(),priority:Nk,type:Qs,featureId:w.string().optional(),originFeature:w.string().optional(),completed:w.boolean(),completedAt:w.string().optional(),createdAt:w.string(),section:Mk,agent:w.string().optional(),groupName:w.string().optional(),groupId:w.string().optional()}),md=w.object({tasks:w.array(Uk),lastUpdated:w.string()})});var Vr,oa,Zn,aa=f(()=>{"use strict";Vr={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"}},oa=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){if(t){let s=(e?.activeTasks??[]).find(i=>i.workspaceId===t);return s?this.statusToState(s):"idle"}let r=e?.currentTask;return r?this.statusToState(r):(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle"}statusToState(e){switch((typeof e.status=="string"?e.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"working"}}canTransition(e,t){if(Vr[e].transitions.includes(t))return{valid:!0};let s=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return e}}getStateInfo(e){return Vr[e]}getPrompt(e){return Vr[e].prompt}getValidCommands(e){return Vr[e].transitions}formatNextSteps(e){return Vr[e].transitions.map(r=>{switch(r){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 ${r}`}})}},Zn=new oa});import Hk from"node:crypto";function Ee(){return Hk.randomUUID()}var It=f(()=>{"use strict";c(Ee,"generateUUID")});var ca,yn,gd=f(()=>{"use strict";Y();X();ca=class{static{c(this,"SyncPendingStorage")}append(e,t){let r=k(),s=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&y.run(e,`DELETE FROM sync_pending
620
+ `)){let o=i.trim();o==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):o&&s&&bk(o)&&s.add(o)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}function bk(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 vk(n,e=100){let t=await Ek(n,e),r=new Map,s=new Map;for(let o of t){let a=Array.from(o);for(let l of a)r.set(l,(r.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=Tk(a[l],a[u]);s.set(d,(s.get(d)||0)+1)}}let i={};for(let[o,a]of s){let[l,u]=o.split("\0"),d=r.get(l)||0,p=r.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,g=m>0?a/m:0;g<.1||(i[l]||(i[l]={}),i[u]||(i[u]={}),i[l][u]=g,i[u][l]=g)}return{matrix:i,commitsAnalyzed:t.length,filesAnalyzed:r.size,builtAt:new Date().toISOString()}}function Tk(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function Qo(n,e){let t=new Set(n),r=new Map;for(let s of n){let i=e.matrix[s];if(i)for(let[o,a]of Object.entries(i)){if(t.has(o))continue;let l=r.get(o)||0;a>l&&r.set(o,a)}}return Array.from(r.entries()).map(([s,i])=>({path:s,score:i})).sort((s,i)=>i.score-s.score)}function xk(n,e){y.setDoc(n,Yo,e),Gs.delete(n)}function Wr(n){let e=y.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Yo);if(!e)return Gs.delete(n),null;let t=Gs.get(n);if(t&&t.updatedAt===e.updated_at)return t.matrix;let r=y.getDoc(n,Yo);return r&&Gs.set(n,{matrix:r,updatedAt:e.updated_at}),r}async function Bs(n,e,t=100){let r=await vk(n,t);return xk(e,r),r}var Yo,Gs,Vs=f(()=>{"use strict";Ko();X();ge();c(Ek,"parseGitLog");c(bk,"isSourceFile");c(vk,"buildMatrix");c(Tk,"pairKey");c(Qo,"scoreFromSeeds");Yo="cochange-index",Gs=new Map;c(xk,"saveMatrix");c(Wr,"loadMatrix");c(Bs,"indexCoChanges")});function Rk(n){return n instanceof Gr}function we(n){return Rk(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var Gr,Xs,Br,Kt=f(()=>{"use strict";Gr=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)}},Xs=class n extends Gr{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")}},Br=class n extends Gr{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(Rk,"isPrjctError");c(we,"getErrorMessage")});var ta={};ee(ta,{PACKAGE_ROOT:()=>St,VERSION:()=>kt,getPackageRoot:()=>ea,getVersion:()=>Js,resetPackageRoot:()=>_k});import Zo from"node:fs";import qs from"node:path";function ea(){if(Kn)return Kn;let n=__dirname;for(let e=0;e<5;e++){let t=qs.join(n,"package.json");if(Zo.existsSync(t))try{if(JSON.parse(Zo.readFileSync(t,"utf-8")).name==="prjct-cli")return Kn=n,n}catch{}n=qs.dirname(n)}return Kn=qs.join(__dirname,"..","..",".."),Kn}function Js(){if(hn)return hn;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return hn=n,hn;try{let e=qs.join(ea(),"package.json");return hn=JSON.parse(Zo.readFileSync(e,"utf-8")).version,hn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function _k(n){Kn=n,hn=null}var hn,Kn,kt,St,Et=f(()=>{"use strict";q();hn=null,Kn=null;c(ea,"getPackageRoot");c(Js,"getVersion");c(_k,"resetPackageRoot");kt=Js(),St=ea()});async function zs(n){try{let{stdout:e}=await O(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Ck(){let n=await zs("gh api user --jq .login");return n.success&&n.output||(n=await zs("git config --global github.user"),n.success&&n.output)?n.output:null}async function Ak(){let n=await zs("git config user.name");return n.success&&n.output?n.output:null}async function Pk(){let n=await zs("git config user.email");return n.success&&n.output?n.output:null}async function Yn(){let[n,e,t]=await Promise.all([Ck(),Ak(),Pk()]);return{github:n,email:t,name:e||n||"Unknown"}}var Ks=f(()=>{"use strict";ge();c(zs,"execCommand");c(Ck,"detectGitHubUsername");c(Ak,"detectGitName");c(Pk,"detectGitEmail");c(Yn,"detect")});var Qn={};ee(Qn,{default:()=>$});import ra from"node:fs/promises";import jk from"node:path";import*as Ys from"jsonc-parser";function id(n){let e=[],t=Ys.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let r=e[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${Ys.printParseErrorCode(r.error)}`)}return t}var sa,Dk,$,fe=f(()=>{"use strict";Kt();q();Y();J();Et();Ks();De();c(id,"parseJsonc");sa=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=L.getLocalConfigPath(e),r=await ra.readFile(t,"utf-8");return id(r)}catch(t){return M(t)||console.warn(`Warning: Could not read config at ${e}: ${we(t)}`),null}}async writeConfig(e,t){let r=L.getLocalConfigPath(e);await Se(r,t)}async readGlobalConfig(e){try{let t=L.getGlobalProjectConfigPath(e),r=await ra.readFile(t,"utf-8");return id(r)}catch(t){return M(t)||console.warn(`Warning: Could not read global config for ${e}: ${we(t)}`),null}}async writeGlobalConfig(e,t){let r=L.getGlobalProjectConfigPath(e);await Se(r,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let r=k();t={projectId:e,authors:[],version:kt,lastSync:r},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let r=L.generateProjectId(e),s=L.getGlobalProjectPath(r),i=L.getDisplayPath(s),o=k(),a={projectId:r,dataPath:i,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:r,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}],version:kt,created:o,lastSync:o};return await this.writeGlobalConfig(r,l),a}async updateLastSync(e){let t=await this.getProjectId(e),r=await this.readGlobalConfig(t);r&&(r.lastSync=k(),await this.writeGlobalConfig(t,r))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await L.hasLegacyStructure(e))return!1;if(!await L.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let i=L.getGlobalProjectPath(s.projectId);try{return(await ra.readdir(jk.join(i,"core"))).length===0}catch(o){return M(o),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(Ds(),js));if(await r.detect(e)){let i=await r.getMainWorktree(e);if(i!==e){let o=await this.readConfig(i);if(o?.projectId)return o.projectId}}}catch{}return""}async findAuthor(e,t){let r=await this.readGlobalConfig(e);return!r||!r.authors?null:r.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let r=await this.ensureGlobalConfig(e);if(r.authors.some(o=>o.github===t.github))return;let i=k();r.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}),r.lastSync=i,await this.writeGlobalConfig(e,r)}async updateAuthorActivity(e,t){let r=await this.readGlobalConfig(e);if(!r||!r.authors)return;let s=r.authors.find(i=>i.github===t);s&&(s.lastActivity=k(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(e,r))}async getCurrentAuthor(e){let t=await Yn(),r=await this.getProjectId(e);return await this.addAuthor(r,{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 r=await this.readConfig(e);r&&(r.showMetrics=t,await this.writeConfig(e,r))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let r=L.generateProjectId(e);return{projectId:r,dataPath:L.getDisplayPath(L.getGlobalProjectPath(r))}}},Dk=new sa,$=Dk});import{z as w}from"zod";var Nk,Qs,Mk,Ok,ia,cd,ld,ud,dd,ad,$k,Lk,Fk,pd,Uk,md,Zs=f(()=>{"use strict";Fr();Nk=w.enum(["low","medium","high","critical"]),Qs=w.enum(["feature","bug","improvement","chore"]),Mk=w.enum(["active","backlog","previously_active"]),Ok=w.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),ia=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()}),cd=w.object({output:w.string().min(1,"Subtask output is required"),summary:ia}),ld=w.object({id:w.string(),description:w.string(),domain:w.string(),agent:w.string(),status:Ok,dependsOn:w.array(w.string()),startedAt:w.string().optional(),completedAt:w.string().optional(),output:w.string().optional(),summary:ia.optional(),skipReason:w.string().optional(),blockReason:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional()}),ud=w.object({completed:w.number(),total:w.number(),percentage:w.number()}),dd=w.object({id:w.string(),description:w.string(),type:Qs.optional(),startedAt:w.string(),sessionId:w.string(),featureId:w.string().optional(),subtasks:w.array(ld).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:ud.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),linkedSpecId:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:Lr.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional(),parentDescription:w.string().optional(),branch:w.string().optional(),prUrl:w.string().optional()}),ad=w.object({id:w.string(),description:w.string(),status:w.literal("paused"),startedAt:w.string(),pausedAt:w.string(),pauseReason:w.string().optional(),type:Qs.optional(),sessionId:w.string().optional(),featureId:w.string().optional(),subtasks:w.array(ld).optional(),currentSubtaskIndex:w.number().optional(),subtaskProgress:ud.optional(),linearId:w.string().optional(),linearUuid:w.string().optional(),estimatedPoints:w.number().optional(),estimatedMinutes:w.number().optional(),modelMetadata:Lr.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),$k=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()}),Lk=w.object({taskId:w.string(),title:w.string(),classification:Qs,startedAt:w.string(),completedAt:w.string(),subtaskCount:w.number(),subtaskSummaries:w.array(ia),outcome:w.string(),branchName:w.string(),linearId:w.string().optional(),linearUuid:w.string().optional(),prUrl:w.string().optional(),feedback:$k.optional(),tokensIn:w.number().optional(),tokensOut:w.number().optional()}),Fk=dd.extend({workspaceId:w.string(),worktreePath:w.string().optional(),agentSessionId:w.string().optional(),jiraId:w.string().optional(),jiraUuid:w.string().optional(),dispatchedFrom:w.string().optional()}),pd=w.object({currentTask:dd.nullable(),previousTask:ad.nullable().optional(),pausedTasks:w.array(ad).optional(),taskHistory:w.array(Lk).optional(),activeTasks:w.array(Fk).optional(),lastUpdated:w.string()}),Uk=w.object({id:w.string(),description:w.string(),body:w.string().optional(),priority:Nk,type:Qs,featureId:w.string().optional(),originFeature:w.string().optional(),completed:w.boolean(),completedAt:w.string().optional(),createdAt:w.string(),section:Mk,agent:w.string().optional(),groupName:w.string().optional(),groupId:w.string().optional()}),md=w.object({tasks:w.array(Uk),lastUpdated:w.string()})});var Vr,oa,Zn,aa=f(()=>{"use strict";Vr={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"}},oa=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){if(t){let s=(e?.activeTasks??[]).find(i=>i.workspaceId===t);return s?this.statusToState(s):"idle"}let r=e?.currentTask;return r?this.statusToState(r):(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle"}statusToState(e){switch((typeof e.status=="string"?e.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"working"}}canTransition(e,t){if(Vr[e].transitions.includes(t))return{valid:!0};let s=this.formatNextSteps(e).join(" | ");return{valid:!1,error:`Cannot transition to '${t}' from '${e}' state`,suggestion:`Valid next steps: ${s}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return e}}getStateInfo(e){return Vr[e]}getPrompt(e){return Vr[e].prompt}getValidCommands(e){return Vr[e].transitions}formatNextSteps(e){return Vr[e].transitions.map(r=>{switch(r){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 ${r}`}})}},Zn=new oa});import Hk from"node:crypto";function Ee(){return Hk.randomUUID()}var It=f(()=>{"use strict";c(Ee,"generateUUID")});var ca,yn,gd=f(()=>{"use strict";Y();X();ca=class{static{c(this,"SyncPendingStorage")}append(e,t){let r=k(),s=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&y.run(e,`DELETE FROM sync_pending
621
621
  WHERE project_id = ?
622
622
  AND entity_type = ?
623
623
  AND entity_id = ?
@@ -1076,13 +1076,13 @@ ${JSON.stringify(r.value,null,2)}`,e)}return ly(t,e)}function lR(n){try{return{o
1076
1076
  `),t.push(`- **Total Commits**: ${i?.totalCommits||0}`),t.push(`- **Contributors**: ${i?.contributors||0}`),t.push(`- **Age**: ${i?.age||"unknown"}`),t.push(""),n.gitLog&&(t.push(`## Recent Activity
1077
1077
  `),n.gitLog.split(`
1078
1078
  `).slice(0,5).forEach(a=>{if(a.trim()){let[l,,u,d]=a.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1079
- `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1080
- `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1079
+ `),t.push("Based on detected stack, consider generating specialized agents using `p. sync`.\n"),t.push(`---
1080
+ `),t.push("*This analysis was generated automatically. For updated information, run `p. analyze` again.*\n"),t.join(`
1081
1081
  `)}var Tl=f(()=>{"use strict";Si();Zi();Tn();Y();mo();He();c(my,"showSyncResult");c(gy,"getSessionActivity");c(Cr,"formatTokens");c(vl,"formatDuration");c(fy,"generateSparkline");c(hy,"generateStatsMarkdown");c(yy,"generateAnalysisSummary")});async function wy(n=process.cwd(),e={}){try{let t=await xe(n);if(!t.ok)return t.result;let r=t.value,s=await kr.getSummary(r),i=await kr.getDailyStats(r,30),o=await gy(r),a={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:o,patterns:a,totalTokensSaved:s.totalTokensSaved,estimatedCostSaved:s.estimatedCostSaved,compressionRate:s.compressionRate,syncCount:s.syncCount,avgSyncDuration:s.avgSyncDuration,topAgents:s.topAgents.slice(0,5),last30DaysTokens:s.last30DaysTokens,trend:s.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=T.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await kr.read(r),d=u.firstSync?new Date(u.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: ${l.padEnd(20).slice(0,20)} | Since: ${d.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"),o.sessionDuration&&console.log(` Duration: ${o.sessionDuration}`),console.log(` Tasks completed: ${o.tasksCompleted}`),console.log(` Features shipped: ${o.featuresShipped}`),o.agentsUsed.length>0){let p=o.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(a.decisions>0||a.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${a.learnedDecisions} confirmed (${a.decisions} total)`),console.log(` Preferences: ${a.preferences} saved`),console.log(` Workflows: ${a.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Cr(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${Qi(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vl(s.avgSyncDuration)}`),console.log(""),s.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=s.topAgents.reduce((m,g)=>m+g.usageCount,0);for(let m of s.topAgents){let g=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${g}% (${m.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=fy(i);if(console.log(` ${p} ${Cr(s.last30DaysTokens)} tokens saved`),s.trend!==0){let m=s.trend>0?"\u2191":"\u2193",g=s.trend>0?"+":"";console.log(` ${m} ${g}${s.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(""),e.export){let p=hy(s,i,l,d,o,a);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:o,patterns:a}}}catch(t){return console.error("\u274C Error:",x(t)),$e(t)}}async function ky(n=process.cwd(),e={}){try{let t=await xe(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Te.diff(r);if(!s){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:i})):e.md?console.log(Q("## Analysis Diff",`> ${i}`)):A.warn(i),{success:!1,error:i}}if(e.json)return console.log(JSON.stringify({success:!0,...s})),{success:!0,data:s};if(e.md)return console.log(Q(Mi(s))),{success:!0,data:s};if(!s.hasChanges)A.done("No changes between draft and sealed analysis");else{A.section("Analysis Diff"),console.log(Um(s)),console.log("");let i=[];s.summary.added>0&&i.push(`${s.summary.added} added`),s.summary.removed>0&&i.push(`${s.summary.removed} removed`),s.summary.changed>0&&i.push(`${s.summary.changed} changed`),A.done(i.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=x(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(Q("## Diff Failed",`> ${r}`)):A.fail(r),{success:!1,error:r}}}var Sy=f(()=>{"use strict";Zi();Oi();an();X();Lc();q();Ct();un();He();Tl();br();c(wy,"stats");c(ky,"diff")});var vy={};ee(vy,{AnalysisCommands:()=>xl});import Ey from"node:fs/promises";var by,xl,Ty=f(()=>{"use strict";Lm();fe();De();Oi();Km();el();an();On();q();Y();Ct();un();mo();He();ah();py();Sy();Tl();dr();br();by=["> Review this project data and save concise notes for future AI agents.","> Focus on architecture, conventions, risks, and gotchas. Markdown/text is fine; JSON is optional.","> Most compatible save path: write notes to a temp file, then run `prjct analysis-save-llm <file> --md`."].join(`
1082
1082
  `),xl=class extends ze{static{c(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1083
1083
  `),ve.init(t);let r={packageJson:await ve.readPackageJson(),cargoToml:await ve.readCargoToml(),goMod:await ve.readGoMod(),requirements:await ve.readRequirements(),directories:await ve.listDirectories(),fileCount:await ve.countFiles(),gitStats:await ve.getGitStats(),gitLog:await ve.getGitLog(20),hasDockerfile:await ve.fileExists("Dockerfile"),hasDockerCompose:await ve.fileExists("docker-compose.yml"),hasReadme:await ve.fileExists("README.md"),hasTsconfig:await ve.fileExists("tsconfig.json"),hasViteConfig:await ve.fileExists("vite.config.ts")||await ve.fileExists("vite.config.js"),hasNextConfig:await ve.fileExists("next.config.js")||await ve.fileExists("next.config.mjs")},s=yy(r,t),i=await $.readConfig(t).catch(()=>null),o=await L.getWikiPath(t,i?.vaultPath),a=`${o}/_generated/analysis/repo-summary.md`;return await Ey.mkdir(`${o}/_generated/analysis`,{recursive:!0}),await Ey.writeFile(a,s,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:k(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
1084
1084
  `),console.log(`\u{1F4C4} Full report: ${L.getDisplayPath(a)}
1085
- `),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:r}}catch(r){return console.error("\u274C Error:",x(r)),$e(r)}}async sync(e=process.cwd(),t={}){try{let r=await xe(e);if(!r.ok)return r.result;let s=r.value,i=Date.now();if(t.package){let a=await L.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(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Sr.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(Q(ut(`Synced package: ${l.name}`))):A.done(`Synced package: ${l.name}`),{success:u.success}}t.md||A.spin("Syncing project...");let o=await Sr.sync(e,{full:t.full});if(!o.success)return t.md?console.log(Q("## Sync Failed",`> ${o.error||"Unknown error"}`)):A.fail(o.error||"Sync failed"),{success:!1,error:o.error};if(t.md||A.stop(),t.md){let a=Date.now()-i,l=o.generatedSkills?.generated?.length??0,u=null;try{let v=await Te.diff(s);v?.hasChanges&&(u=Mi(v))}catch{}let d=o.git.recentCommits[0]?.hash??null,p=d&&Me.isCurrent(s,d),m=null;if(!p)try{let v=await gc(s,e,o.git,o.stats);m=["## Analysis Payload",by,"### Data","```json",JSON.stringify(v),"```"].join(`
1085
+ `),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:r}}catch(r){return console.error("\u274C Error:",x(r)),$e(r)}}async sync(e=process.cwd(),t={}){try{let r=await xe(e);if(!r.ok)return r.result;let s=r.value,i=Date.now();if(t.package){let a=await L.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(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Sr.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(Q(ut(`Synced package: ${l.name}`))):A.done(`Synced package: ${l.name}`),{success:u.success}}t.md||A.spin("Syncing project...");let o=await Sr.sync(e,{full:t.full});if(!o.success)return t.md?console.log(Q("## Sync Failed",`> ${o.error||"Unknown error"}`)):A.fail(o.error||"Sync failed"),{success:!1,error:o.error};if(t.md||A.stop(),t.md){let a=Date.now()-i,l=o.generatedSkills?.generated?.length??0,u=null;try{let v=await Te.diff(s);v?.hasChanges&&(u=Mi(v))}catch{}let d=o.git.recentCommits[0]?.hash??null,p=d&&Me.isCurrent(s,d),m=null;if(!p)try{let v=await gc(s,e,o.git,o.stats);m=["## Analysis Payload",by,"### Data","```json",JSON.stringify(v),"```"].join(`
1086
1086
  `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let g=po("sync",!0),h=o.syncMetrics?.indexes,R={Duration:`${(a/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":o.stats.fileCount};if(h?.bm25Files){let v=h.bm25Files*(h.bm25AvgTokens||0);R["Tokens indexed"]=`${Math.round(v/1e3)}K`,R["Import edges"]=h.importEdges||0,R["Co-change commits"]=h.cochangeCommits||0}let E=Q(ut("Sync Complete"),Er(R),u,o.git.hasChanges?th("Uncommitted changes detected"):null,m,lo(g.map(v=>({label:v.desc,command:v.cmd}))));return console.log(E),{success:!0,data:o,metrics:{elapsed:a,skillCount:l,fileCount:o.stats.fileCount}}}return my(o,i)}catch(r){return t.md?console.log(Q("## Sync Failed",`> ${x(r)}`)):A.fail(x(r)),$e(r)}}async analysisPayload(e=process.cwd(),t={}){try{let r=await xe(e);if(!r.ok)return r.result;let s=r.value,i=await Sr.sync(e);if(!i.success)return{success:!1,error:i.error||"Failed to gather project data"};let o=i.git.recentCommits[0]?.hash??null;if(o&&Me.isCurrent(s,o))return t.md?console.log(Q(ut("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 gc(s,e,i.git,i.stats);return t.md?console.log(Q("## Analysis Payload",by,"### Data","```json",JSON.stringify(a),"```")):console.log(JSON.stringify({success:!0,payload:a})),{success:!0,data:a}}catch(r){return $e(r)}}async regenVault(e=process.cwd(),t={}){try{let r=await xe(e);if(!r.ok)return r.result;let s=r.value,i=await import("node:fs/promises"),o=(await Promise.resolve().then(()=>(De(),Gu))).default,l=await(await Promise.resolve().then(()=>(fe(),Qn))).default.readConfig(e).catch(()=>null),d=`${await o.getWikiPath(e,l?.vaultPath)}/_generated`;await i.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(To(),vo)),m=await p(e,s);return t.md?console.log(`---
1087
1087
 
1088
1088
  ## Vault regenerated
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.57.0",
3
+ "version": "2.58.0",
4
4
  "description": "Project memory and workflow context for AI coding agents.",
5
5
  "main": "dist/bin/prjct.mjs",
6
6
  "bin": {