prjct-cli 2.49.0 → 2.49.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,15 +7,15 @@ var __dirname = __pathDirname(__filename);
7
7
  var sA=Object.create;var Oo=Object.defineProperty;var oA=Object.getOwnPropertyDescriptor;var iA=Object.getOwnPropertyNames;var aA=Object.getPrototypeOf,cA=Object.prototype.hasOwnProperty;var c=(r,e)=>Oo(r,"name",{value:e,configurable:!0}),tt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var h=(r,e,t)=>()=>{if(t)throw t[0];try{return r&&(e=r(r=0)),e}catch(n){throw t=[n],n}};var lA=(r,e)=>()=>{try{return e||r((e={exports:{}}).exports,e),e.exports}catch(t){throw e=0,t}},A=(r,e)=>{for(var t in e)Oo(r,t,{get:e[t],enumerable:!0})},ly=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of iA(e))!cA.call(r,s)&&s!==t&&Oo(r,s,{get:()=>e[s],enumerable:!(n=oA(e,s))||n.enumerable});return r};var uA=(r,e,t)=>(t=r!=null?sA(aA(r)):{},ly(e||!r||!r.__esModule?Oo(t,"default",{value:r,enumerable:!0}):t,r)),ze=r=>ly(Oo({},"__esModule",{value:!0}),r);import dA from"node:os";import uy from"node:path";function en(){let r=process.env.PRJCT_CLI_HOME?.trim();return r?uy.resolve(r):uy.join(dA.homedir(),".prjct-cli")}var Es=h(()=>{"use strict";c(en,"resolveCliHome")});import{z as No}from"zod";function gA(r){return fA[r]??Hn}function dy(r){let e=gA(r);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 Fo(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=n[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var pA,mA,Hn,fA,Lo,Ts=h(()=>{"use strict";pA={model:"opus",effort:"max"},mA={model:"haiku",effort:"decent"},Hn={model:"sonnet",effort:"decent"},fA={implementer:pA,orchestrator:mA,"strategic-review":Hn,"architecture-review":Hn,"design-review":Hn,"spec-review":Hn,review:Hn,security:Hn,investigate:Hn,reviewer:Hn};c(gA,"getAgentModelPolicy");c(dy,"renderModelDirective");Lo=No.object({provider:No.string(),model:No.string(),cliVersion:No.string().optional(),recordedAt:No.string()});c(Fo,"compareSemver")});import sa from"node:fs";import py from"node:path";function my(){return py.join(en(),"config")}function oa(){return py.join(my(),"global.json")}function fy(r){try{let e=sa.statSync(r);return`${r}|${e.mtimeMs}|${e.size}`}catch{return`${r}|absent`}}function Eu(){let r=oa(),e=fy(r);if(ra!==null&&e===Su)return ra;let t={};try{let n=sa.readFileSync(r,"utf-8"),s=JSON.parse(n);s&&typeof s=="object"&&!Array.isArray(s)&&(t=s)}catch{}return ra=t,Su=e,t}function hA(r){sa.mkdirSync(my(),{recursive:!0}),sa.writeFileSync(oa(),`${JSON.stringify(r,null,2)}
8
8
  `,"utf-8"),ra=r,Su=fy(oa())}function Pt(r){return Eu()[r]}function gy(){return Eu()}function Oe(r,e){let t=Eu();e===void 0?delete t[r]:t[r]=e,hA(t)}function hy(r){Oe(r,void 0)}function yy(){return oa()}var ra,Su,ia=h(()=>{"use strict";Es();c(my,"configDir");c(oa,"configFilePath");ra=null,Su="";c(fy,"fileStamp");c(Eu,"readRaw");c(hA,"writeRaw");c(Pt,"getConfig");c(gy,"getAll");c(Oe,"setConfig");c(hy,"unsetConfig");c(yy,"configPath")});var Cu={};A(Cu,{_internal:()=>CA,maybeAutoUpdate:()=>SA,runBackgroundCheck:()=>EA});import{execFile as yA,spawn as wA}from"node:child_process";import Cs from"node:fs";import Ho from"node:path";import{promisify as kA}from"node:util";function SA(r){if(!r||process.env.PRJCT_NO_AUTO_UPDATE==="1"||Pt("auto-update")!=="on")return;let e=Pt("auto-update-last-check");if(e&&Date.now()-Date.parse(e)<ky)return;Oe("auto-update-last-check",new Date().toISOString()),wA(process.execPath,[process.argv[1],"__internal-auto-update",r],{detached:!0,stdio:"ignore"}).unref()}async function EA(r){try{let e=await by();if(!e)return;if(Fo(e,r)<=0){aa(`current ${r} >= latest ${e}, no-op`);return}let t=vy();aa(`upgrade available: ${r} \u2192 ${e} (source: ${t})`),await TA(t,e),aa(`upgrade complete: ${r} \u2192 ${e}`)}catch(e){aa(`auto-update failed: ${e.message}`)}}async function by(){try{let r=new AbortController,e=setTimeout(()=>r.abort(),6e3),t=await fetch(vA,{signal:r.signal});if(clearTimeout(e),!t.ok)return null;let n=await t.json();return typeof n.version=="string"?n.version:null}catch{return null}}function vy(){let r=Ho.join(en(),"bin","prjct");if(Cs.existsSync(r))try{if(Cs.statSync(r).size>1024*1024)return"binary"}catch{}try{let e=String(tt("node:child_process").execSync("npm root -g")).trim();if(e&&Cs.existsSync(Ho.join(e,"prjct-cli")))return"npm"}catch{}try{let e=String(tt("node:child_process").execSync("bun pm bin -g")).trim();if(e&&Cs.existsSync(Ho.join(e,"prjct")))return"bun"}catch{}return"unknown"}async function TA(r,e){if(r==="binary"){await Tu("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(r==="bun"){await Tu("bun",["install","-g","prjct-cli@latest"],{timeout:12e4});return}if(r==="npm"||r==="unknown"){await Tu("npm",["install","-g","prjct-cli@latest"],{timeout:12e4});return}}function aa(r){try{Cs.mkdirSync(wy(),{recursive:!0}),Cs.appendFileSync(bA(),`${new Date().toISOString()} ${r}
9
9
  `)}catch{}}var Tu,wy,bA,ky,vA,CA,Ru=h(()=>{"use strict";Es();Ts();ia();Tu=kA(yA),wy=c(()=>Ho.join(en(),"state"),"stateDir"),bA=c(()=>Ho.join(wy(),"auto-update.log"),"logPath"),ky=3600*1e3,vA="https://registry.npmjs.org/prjct-cli/latest";c(SA,"maybeAutoUpdate");c(EA,"runBackgroundCheck");c(by,"fetchLatestVersion");c(vy,"detectInstallSource");c(TA,"applyUpgrade");c(aa,"log");CA={fetchLatestVersion:by,detectInstallSource:vy,compareSemver:Fo,THROTTLE_MS:ky}});function RA(r){return r instanceof Rs}function Ge(r){return RA(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Rs,ca,la,Uo,lr=h(()=>{"use strict";Rs=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)}},ca=class r extends Rs{static{c(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},la=class r extends Rs{static{c(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Uo=class r extends Rs{static{c(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};c(RA,"isPrjctError");c(Ge,"getErrorMessage")});function xA(r){return r instanceof Error&&"code"in r}function W(r){return xA(r)&&r.code==="ENOENT"}function w(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function xu(r){if(r instanceof Error)return r.stack}var H=h(()=>{"use strict";c(xA,"isNodeError");c(W,"isNotFoundError");c(w,"getErrorMessage");c(xu,"getErrorStack")});var ur={};A(ur,{PACKAGE_ROOT:()=>mt,VERSION:()=>te,getPackageRoot:()=>Au,getVersion:()=>da,resetPackageRoot:()=>ju});import Pu from"node:fs";import ua from"node:path";function Au(){if(xs)return xs;let r=__dirname;for(let e=0;e<5;e++){let t=ua.join(r,"package.json");if(Pu.existsSync(t))try{if(JSON.parse(Pu.readFileSync(t,"utf-8")).name==="prjct-cli")return xs=r,r}catch{}r=ua.dirname(r)}return xs=ua.join(__dirname,"..","..",".."),xs}function da(){if(Hr)return Hr;let r=process.env.PRJCT_VERSION;if(r&&/^\d+\.\d+\.\d+/.test(r))return Hr=r,Hr;try{let e=ua.join(Au(),"package.json");return Hr=JSON.parse(Pu.readFileSync(e,"utf-8")).version,Hr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",w(e)),"0.0.0"}}function ju(r){xs=r,Hr=null}var Hr,xs,te,mt,_e=h(()=>{"use strict";H();Hr=null,xs=null;c(Au,"getPackageRoot");c(da,"getVersion");c(ju,"resetPackageRoot");te=da(),mt=Au()});var Du={};A(Du,{default:()=>MA,getTemplateContent:()=>Je,listTemplates:()=>As,resetBundle:()=>IA});import $u from"node:fs";import PA from"node:fs/promises";import ma from"node:path";function Iu(){if(_u)return pa;_u=!0;let r=ma.join(mt,"dist","templates.json");try{let e=$u.readFileSync(r,"utf-8");return pa=JSON.parse(e),pa}catch{return null}}function jA(r){let e=Ur.indexOf(r);e>-1&&Ur.splice(e,1),Ur.push(r)}function _A(){for(;Ps.size>=AA&&Ur.length>0;){let r=Ur.shift();r&&Ps.delete(r)}}function Sy(r){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=r.match(e);if(!t)return{frontmatter:{},content:r.trim()};let[,n,s]=t,o={};return n.split(`
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 Ey(r){if(Ps.has(r))return jA(r),Ps.get(r);let e,t=Iu();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ma.join(mt,"templates","commands",`${r}.md`);try{e=await PA.readFile(s,"utf-8")}catch{throw la.notFound(r)}}let n=Sy(e);return _A(),Ps.set(r,n),Ur.push(r),n}async function $A(r){return(await Ey(r)).frontmatter["allowed-tools"]||[]}function Ty(){Ps.clear(),Ur.length=0}function IA(){pa=null,_u=!1,Ty()}function Je(r){let e=Iu();if(e?.[r])return e[r];let t=ma.join(mt,"templates",r);try{return $u.readFileSync(t,"utf-8")}catch{return null}}function As(r){let e=Iu();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ma.join(mt,"templates",r);try{return $u.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var AA,Ps,Ur,pa,_u,DA,MA,En=h(()=>{"use strict";lr();_e();AA=50,Ps=new Map,Ur=[],pa=null,_u=!1;c(Iu,"loadBundle");c(jA,"updateLruOrder");c(_A,"evictLru");c(Sy,"parseFrontmatter");c(Ey,"load");c($A,"getAllowedTools");c(Ty,"clearCache");c(IA,"resetBundle");c(Je,"getTemplateContent");c(As,"listTemplates");DA={load:Ey,parseFrontmatter:Sy,getAllowedTools:$A,clearCache:Ty,getTemplateContent:Je,listTemplates:As},MA=DA});var fa=h(()=>{"use strict"});var Mu={};A(Mu,{execAsync:()=>G,execFileAsync:()=>re});import{exec as OA,execFile as NA}from"node:child_process";import{promisify as Cy}from"node:util";var G,re,Ce=h(()=>{"use strict";G=Cy(OA),re=Cy(NA)});var Ry,xy,Py,Ou=h(()=>{"use strict";Ry=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"]),xy=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Py=/(?:import|from)\s+['"]([^'"]+)['"]/g});import _y from"node:fs/promises";async function $y(r,e){let t;try{t=await _y.readFile(r,"utf-8")}catch(o){if(W(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Ay(r,t),jy(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Ay(r,t),jy(r,LA(s.error)),null)}async function Ay(r,e){let t=`${r}.backup`;try{await _y.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function jy(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function LA(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Iy=h(()=>{"use strict";H();c($y,"safeRead");c(Ay,"createBackup");c(jy,"logCorruption");c(LA,"formatZodError")});var Bt={};A(Bt,{batchProcess:()=>Wr,dirExists:()=>dr,ensureDir:()=>jt,fileExists:()=>E,listFiles:()=>Gn,readFile:()=>At,readJson:()=>Pe,walkDir:()=>Un,writeFile:()=>Wn,writeFileAtomic:()=>Gr,writeJson:()=>fe});import wt from"node:fs/promises";import Wo from"node:path";async function Un(r,e={}){let t=[],n=e.maxFiles??1/0,s=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=n)return;let a=await wt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of a){if(t.length>=n)break;let u=String(l.name);if(Ry.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!s||!s.has(u)))continue;let d=Wo.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(Wo.relative(r,d))}}return c(o,"walk"),await o(r),t}async function Wr(r,e,t){let n=[];for(let s=0;s<r.length;s+=e){let o=await Promise.all(r.slice(s,s+e).map(t));for(let i of o)i!==null&&n.push(i)}return n}async function Pe(r,e=null,t){if(t)return await $y(r,t)??e;try{let n=await wt.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(W(n))return e;throw n}}async function fe(r,e,t=2){let n=Wo.dirname(r);await wt.mkdir(n,{recursive:!0});let s=`${JSON.stringify(e,null,t)}
11
- `;await wt.writeFile(r,s,"utf-8")}async function At(r,e=""){try{return await wt.readFile(r,"utf-8")}catch(t){if(W(t))return e;throw t}}async function Wn(r,e){let t=Wo.dirname(r);await wt.mkdir(t,{recursive:!0}),await wt.writeFile(r,e,"utf-8")}async function Gr(r,e){let t=Wo.dirname(r);await wt.mkdir(t,{recursive:!0});let n=`${r}.tmp`;await wt.writeFile(n,e,"utf-8"),await wt.rename(n,r)}async function E(r){try{return await wt.access(r),!0}catch(e){if(W(e))return!1;throw e}}async function dr(r){try{return(await wt.stat(r)).isDirectory()}catch(e){if(W(e))return!1;throw e}}async function jt(r){await wt.mkdir(r,{recursive:!0})}async function Gn(r,e={}){try{let n=await wt.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(W(t))return[];throw t}}var J=h(()=>{"use strict";Ou();Iy();H();c(Un,"walkDir");c(Wr,"batchProcess");c(Pe,"readJson");c(fe,"writeJson");c(At,"readFile");c(Wn,"writeFile");c(Gr,"writeFileAtomic");c(E,"fileExists");c(dr,"dirExists");c(jt,"ensureDir");c(Gn,"listFiles")});var Nu,Dy=h(()=>{"use strict";Nu="mcp-remote@0.1.38"});import FA from"node:fs/promises";import My from"node:os";import ga from"node:path";function HA(){try{let r=ga.dirname(tt.resolve("prjct-cli/package.json"));return{command:"node",args:[ga.join(r,"dist","mcp","server.mjs")],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"],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 _s(){return process.env.PRJCT_TEST_MODE==="1"?ga.join(My.tmpdir(),"prjct-context7-test","mcp.json"):ga.join(My.homedir(),".claude","mcp.json")}async function Oy(r=_s()){try{let e=await FA.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=w(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${w(e)}`)}}async function UA(r,e=_s()){await fe(e,r)}async function Ny(r,e,t=_s()){let n=await Oy(t),s={...n.mcpServers||{}},o=s[r];s[r]=e,n.mcpServers=s;let i=JSON.stringify(o)!==JSON.stringify(e);return await UA(n,t),{path:t,changed:i}}async function Ly(r,e=_s()){return!!(await Oy(e)).mcpServers?.[r]}var js,ha=h(()=>{"use strict";H();J();Dy();c(HA,"getPrjctMcpConfig");js={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:HA(),linear:{command:"npx",args:["-y",Nu,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Nu,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};c(_s,"getClaudeMcpConfigPath");c(Oy,"readMcpConfig");c(UA,"writeMcpConfig");c(Ny,"upsertMcpServer");c(Ly,"hasMcpServer")});var Wy={};A(Wy,{default:()=>Tn,getVerifyCachePath:()=>Wu});import Go from"node:fs/promises";import Fu from"node:os";import $s from"node:path";function Wu(){return process.env.NODE_ENV==="test"?$s.join(Fu.tmpdir(),"prjct-context7-test","verify-cache.json"):$s.join(en(),"state","context7-verify.json")}async function WA(){try{let r=await Go.readFile(Wu(),"utf-8"),e=JSON.parse(r);if(typeof e?.at=="number"&&e.status)return e}catch{}return null}async function GA(r,e){let t=Wu();try{await Go.mkdir($s.dirname(t),{recursive:!0}),await Go.writeFile(t,JSON.stringify({at:r,status:e}),"utf-8")}catch{}}function BA(){let r=Je("mcp-config.json");if(!r)return{mcpServers:{context7:Hu}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Hu}}}}function Uy(){return BA().mcpServers?.context7||Hu}function Lu(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?$s.join(Fu.tmpdir(),"prjct-context7-test","mcp.json"):$s.join(Fu.homedir(),".claude","mcp.json")}async function Hy(r){try{let e=await Go.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(W(e))return{};throw e}}async function qA(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Uy(),e=[...r.args||[],"--help"];await re(r.command||"npx",e,{timeout:15e3})}var Hu,Br,Uu,VA,Tn,Is=h(()=>{"use strict";En();fa();Es();H();Ce();J();ha();c(Wu,"getVerifyCachePath");c(WA,"readPersistedVerify");c(GA,"writePersistedVerify");Hu=js.context7,Br=null;c(BA,"parseTemplateConfig");c(Uy,"getContext7Config");c(Lu,"getConfigPath");c(Hy,"readConfig");c(qA,"runSmokeCheck");Uu=class{static{c(this,"Context7Service")}async install(){let e=Lu(),t=$s.dirname(e);await Go.mkdir(t,{recursive:!0});let n=await Hy(e),s=n.mcpServers||{},o=Uy(),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,n.mcpServers=s,await fe(e,n),Br=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"})}async verify(){let e=Date.now();if(Br&&e-Br.at<3e5)return Br.status;let t=await WA();if(t?.status.verified&&e-t.at<3e5&&t.status.configPath===Lu())return Br=t,t.status;let n=Lu(),i=((await Hy(n)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:n,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await qA();let a={installed:!0,verified:!0,configPath:n};return Br={at:e,status:a},await GA(e,a),a}catch(a){let l={installed:!0,verified:!1,configPath:n,message:`Context7 smoke check failed: ${w(a)}`};return Br={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}},VA=new Uu,Tn=VA});function Ds(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var ya,Bo=h(()=>{"use strict";c(Ds,"isExpired");ya=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((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Gy,By=h(()=>{"use strict";Gy={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 qo(r,e){return{...Gy[r],...e}}function wa(r,e,t){return{message:r,hint:e,...t}}var ka=h(()=>{"use strict";By();c(qo,"getError");c(wa,"createError")});import{execFileSync as qy,execSync as JA}from"node:child_process";var ba,Gu,va,Vy,Jy=h(()=>{"use strict";Bo();ka();ba={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"}},Gu=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 n=ba[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=ba[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new va(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=ba[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
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 Ey(r){if(Ps.has(r))return jA(r),Ps.get(r);let e,t=Iu();if(t){let s=`commands/${r}.md`;e=t[s]}if(!e){let s=ma.join(mt,"templates","commands",`${r}.md`);try{e=await PA.readFile(s,"utf-8")}catch{throw la.notFound(r)}}let n=Sy(e);return _A(),Ps.set(r,n),Ur.push(r),n}async function $A(r){return(await Ey(r)).frontmatter["allowed-tools"]||[]}function Ty(){Ps.clear(),Ur.length=0}function IA(){pa=null,_u=!1,Ty()}function Je(r){let e=Iu();if(e?.[r])return e[r];let t=ma.join(mt,"templates",r);try{return $u.readFileSync(t,"utf-8")}catch{return null}}function As(r){let e=Iu();if(e)return Object.keys(e).filter(n=>n.startsWith(r));let t=ma.join(mt,"templates",r);try{return $u.readdirSync(t).map(s=>`${r}${s}`)}catch{return[]}}var AA,Ps,Ur,pa,_u,DA,MA,En=h(()=>{"use strict";lr();_e();AA=50,Ps=new Map,Ur=[],pa=null,_u=!1;c(Iu,"loadBundle");c(jA,"updateLruOrder");c(_A,"evictLru");c(Sy,"parseFrontmatter");c(Ey,"load");c($A,"getAllowedTools");c(Ty,"clearCache");c(IA,"resetBundle");c(Je,"getTemplateContent");c(As,"listTemplates");DA={load:Ey,parseFrontmatter:Sy,getAllowedTools:$A,clearCache:Ty,getTemplateContent:Je,listTemplates:As},MA=DA});var fa=h(()=>{"use strict"});var Mu={};A(Mu,{execAsync:()=>G,execFileAsync:()=>re});import{exec as OA,execFile as NA}from"node:child_process";import{promisify as Cy}from"node:util";var G,re,Re=h(()=>{"use strict";G=Cy(OA),re=Cy(NA)});var Ry,xy,Py,Ou=h(()=>{"use strict";Ry=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"]),xy=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Py=/(?:import|from)\s+['"]([^'"]+)['"]/g});import _y from"node:fs/promises";async function $y(r,e){let t;try{t=await _y.readFile(r,"utf-8")}catch(o){if(W(o))return null;throw o}let n;try{n=JSON.parse(t)}catch{return await Ay(r,t),jy(r,"Malformed JSON"),null}let s=e.safeParse(n);return s.success?n:(await Ay(r,t),jy(r,LA(s.error)),null)}async function Ay(r,e){let t=`${r}.backup`;try{await _y.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function jy(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function LA(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Iy=h(()=>{"use strict";H();c($y,"safeRead");c(Ay,"createBackup");c(jy,"logCorruption");c(LA,"formatZodError")});var Bt={};A(Bt,{batchProcess:()=>Wr,dirExists:()=>dr,ensureDir:()=>jt,fileExists:()=>E,listFiles:()=>Gn,readFile:()=>At,readJson:()=>Pe,walkDir:()=>Un,writeFile:()=>Wn,writeFileAtomic:()=>Gr,writeJson:()=>fe});import wt from"node:fs/promises";import Wo from"node:path";async function Un(r,e={}){let t=[],n=e.maxFiles??1/0,s=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=n)return;let a=await wt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of a){if(t.length>=n)break;let u=String(l.name);if(Ry.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!s||!s.has(u)))continue;let d=Wo.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(Wo.relative(r,d))}}return c(o,"walk"),await o(r),t}async function Wr(r,e,t){let n=[];for(let s=0;s<r.length;s+=e){let o=await Promise.all(r.slice(s,s+e).map(t));for(let i of o)i!==null&&n.push(i)}return n}async function Pe(r,e=null,t){if(t)return await $y(r,t)??e;try{let n=await wt.readFile(r,"utf-8");return JSON.parse(n)}catch(n){if(W(n))return e;throw n}}async function fe(r,e,t=2){let n=Wo.dirname(r);await wt.mkdir(n,{recursive:!0});let s=`${JSON.stringify(e,null,t)}
11
+ `;await wt.writeFile(r,s,"utf-8")}async function At(r,e=""){try{return await wt.readFile(r,"utf-8")}catch(t){if(W(t))return e;throw t}}async function Wn(r,e){let t=Wo.dirname(r);await wt.mkdir(t,{recursive:!0}),await wt.writeFile(r,e,"utf-8")}async function Gr(r,e){let t=Wo.dirname(r);await wt.mkdir(t,{recursive:!0});let n=`${r}.tmp`;await wt.writeFile(n,e,"utf-8"),await wt.rename(n,r)}async function E(r){try{return await wt.access(r),!0}catch(e){if(W(e))return!1;throw e}}async function dr(r){try{return(await wt.stat(r)).isDirectory()}catch(e){if(W(e))return!1;throw e}}async function jt(r){await wt.mkdir(r,{recursive:!0})}async function Gn(r,e={}){try{let n=await wt.readdir(r,{withFileTypes:!0});return e.filesOnly&&(n=n.filter(s=>s.isFile())),e.dirsOnly&&(n=n.filter(s=>s.isDirectory())),e.extension&&(n=n.filter(s=>s.name.endsWith(e.extension))),n.map(s=>s.name)}catch(t){if(W(t))return[];throw t}}var J=h(()=>{"use strict";Ou();Iy();H();c(Un,"walkDir");c(Wr,"batchProcess");c(Pe,"readJson");c(fe,"writeJson");c(At,"readFile");c(Wn,"writeFile");c(Gr,"writeFileAtomic");c(E,"fileExists");c(dr,"dirExists");c(jt,"ensureDir");c(Gn,"listFiles")});var Nu,Dy=h(()=>{"use strict";Nu="mcp-remote@0.1.38"});import FA from"node:fs/promises";import My from"node:os";import ga from"node:path";function HA(){try{let r=ga.dirname(tt.resolve("prjct-cli/package.json"));return{command:"node",args:[ga.join(r,"dist","mcp","server.mjs")],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"],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 _s(){return process.env.PRJCT_TEST_MODE==="1"?ga.join(My.tmpdir(),"prjct-context7-test","mcp.json"):ga.join(My.homedir(),".claude","mcp.json")}async function Oy(r=_s()){try{let e=await FA.readFile(r,"utf-8");return JSON.parse(e)}catch(e){let t=w(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${r}: ${w(e)}`)}}async function UA(r,e=_s()){await fe(e,r)}async function Ny(r,e,t=_s()){let n=await Oy(t),s={...n.mcpServers||{}},o=s[r];s[r]=e,n.mcpServers=s;let i=JSON.stringify(o)!==JSON.stringify(e);return await UA(n,t),{path:t,changed:i}}async function Ly(r,e=_s()){return!!(await Oy(e)).mcpServers?.[r]}var js,ha=h(()=>{"use strict";H();J();Dy();c(HA,"getPrjctMcpConfig");js={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:HA(),linear:{command:"npx",args:["-y",Nu,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Nu,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};c(_s,"getClaudeMcpConfigPath");c(Oy,"readMcpConfig");c(UA,"writeMcpConfig");c(Ny,"upsertMcpServer");c(Ly,"hasMcpServer")});var Wy={};A(Wy,{default:()=>Tn,getVerifyCachePath:()=>Wu});import Go from"node:fs/promises";import Fu from"node:os";import $s from"node:path";function Wu(){return process.env.NODE_ENV==="test"?$s.join(Fu.tmpdir(),"prjct-context7-test","verify-cache.json"):$s.join(en(),"state","context7-verify.json")}async function WA(){try{let r=await Go.readFile(Wu(),"utf-8"),e=JSON.parse(r);if(typeof e?.at=="number"&&e.status)return e}catch{}return null}async function GA(r,e){let t=Wu();try{await Go.mkdir($s.dirname(t),{recursive:!0}),await Go.writeFile(t,JSON.stringify({at:r,status:e}),"utf-8")}catch{}}function BA(){let r=Je("mcp-config.json");if(!r)return{mcpServers:{context7:Hu}};try{return JSON.parse(r)}catch{return{mcpServers:{context7:Hu}}}}function Uy(){return BA().mcpServers?.context7||Hu}function Lu(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?$s.join(Fu.tmpdir(),"prjct-context7-test","mcp.json"):$s.join(Fu.homedir(),".claude","mcp.json")}async function Hy(r){try{let e=await Go.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(W(e))return{};throw e}}async function qA(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let r=Uy(),e=[...r.args||[],"--help"];await re(r.command||"npx",e,{timeout:15e3})}var Hu,Br,Uu,VA,Tn,Is=h(()=>{"use strict";En();fa();Es();H();Re();J();ha();c(Wu,"getVerifyCachePath");c(WA,"readPersistedVerify");c(GA,"writePersistedVerify");Hu=js.context7,Br=null;c(BA,"parseTemplateConfig");c(Uy,"getContext7Config");c(Lu,"getConfigPath");c(Hy,"readConfig");c(qA,"runSmokeCheck");Uu=class{static{c(this,"Context7Service")}async install(){let e=Lu(),t=$s.dirname(e);await Go.mkdir(t,{recursive:!0});let n=await Hy(e),s=n.mcpServers||{},o=Uy(),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,n.mcpServers=s,await fe(e,n),Br=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"})}async verify(){let e=Date.now();if(Br&&e-Br.at<3e5)return Br.status;let t=await WA();if(t?.status.verified&&e-t.at<3e5&&t.status.configPath===Lu())return Br=t,t.status;let n=Lu(),i=((await Hy(n)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:n,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await qA();let a={installed:!0,verified:!0,configPath:n};return Br={at:e,status:a},await GA(e,a),a}catch(a){let l={installed:!0,verified:!1,configPath:n,message:`Context7 smoke check failed: ${w(a)}`};return Br={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}},VA=new Uu,Tn=VA});function Ds(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var ya,Bo=h(()=>{"use strict";c(Ds,"isExpired");ya=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((n,s)=>n[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[n]of t)this.cache.delete(n)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var Gy,By=h(()=>{"use strict";Gy={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 qo(r,e){return{...Gy[r],...e}}function wa(r,e,t){return{message:r,hint:e,...t}}var ka=h(()=>{"use strict";By();c(qo,"getError");c(wa,"createError")});import{execFileSync as qy,execSync as JA}from"node:child_process";var ba,Gu,va,Vy,Jy=h(()=>{"use strict";Bo();ka();ba={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"}},Gu=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 n=ba[e];if(!n)return this.checkUnknownTool(e);let s=this.executeCheck(n);return this.setCache(e,s),s}ensureTool(e){let t=this.checkTool(e);if(!t.available){let n=ba[e],s=t.error||{message:`${e} is not available`,hint:n?.installHint||`Install ${e} and try again`,docs:n?.docs};throw new va(s)}}ensureTools(e){let t=[];for(let n of e)this.checkTool(n).available||t.push(n);if(t.length>0){let n=t.map(s=>{let o=ba[s];return o?` ${s}: ${o.installHint}`:` ${s}: Install and try again`}).join(`
12
12
  `);throw new va({message:`Missing required tools: ${t.join(", ")}`,hint:`Install the following:
13
13
  ${n}`})}}isAvailable(e){return this.checkTool(e).available}getVersion(e){return this.checkTool(e).version}checkAll(e){let t=e||Object.keys(ba),n=new Map;for(let s of t)n.set(s,this.checkTool(s));return n}clearCache(){this.cache.clear(),this.cacheTimestamps.clear()}executeCheck(e){try{let t=JA(e.command,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),n;if(e.versionRegex){let s=t.match(e.versionRegex);n=s?s[1]:void 0}return{available:!0,version:n}}catch{return{available:!1,error:wa(`${e.name} is not installed or not in PATH`,e.installHint,{docs:e.docs})}}}checkUnknownTool(e){if(!/^[a-zA-Z0-9_-]+$/.test(e))return{available:!1,error:wa(`Invalid tool name: ${e}`,"Tool names must only contain alphanumeric characters, hyphens, and underscores")};try{return qy(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{try{return qy(e,["-v"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}),{available:!0}}catch{return{available:!1,error:wa(`${e} is not installed or not in PATH`,`Install ${e} and try again`)}}}}getCached(e){let t=this.cacheTimestamps.get(e);return t?Ds(t,this.cacheTimeout)?(this.cache.delete(e),this.cacheTimestamps.delete(e),null):this.cache.get(e)||null:null}setCache(e,t){this.cache.set(e,t),this.cacheTimestamps.set(e,Date.now())}},va=class extends Error{static{c(this,"DependencyError")}hint;docs;constructor(e){super(e.message),this.name="DependencyError",this.hint=e.hint,this.docs=e.docs}},Vy=new Gu});function Ky(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),n=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${n}`}function Xy(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function T(){return new Date().toISOString()}function Ms(r){let e=new Date;return e.setDate(e.getDate()-r),e}function Vo(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),n=Math.floor(t/60),s=Math.floor(n/24);return s>0?`${s}d ${n%24}h`:n>0?`${n}h ${t%60}m`:t>0?`${t}m`:`${e}s`}var NU,le=h(()=>{"use strict";c(Ky,"formatDate");c(Xy,"getYearMonthDay");c(T,"getTimestamp");c(Ms,"getDaysAgo");c(Vo,"formatDuration");NU=new Intl.RelativeTimeFormat("en",{numeric:"always"})});import{globSync as KA}from"node:fs";import Os from"node:fs/promises";import ft from"node:path";async function Bu(r){let e={isMonorepo:!1,type:null,rootPath:r,packages:[]},t=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of t)if(await E(ft.join(r,n.file))){e.isMonorepo=!0,e.type=n.type;break}if(!e.isMonorepo){let n=ft.join(r,"package.json");if(await E(n))try{JSON.parse(await Os.readFile(n,"utf-8")).workspaces&&(e.isMonorepo=!0,e.type="npm")}catch{}}return e.isMonorepo&&(e.packages=await qu(r,e.type)),e}async function qu(r,e){let t=[],n=[];try{if(e==="pnpm"){let o=(await Os.readFile(ft.join(r,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);o&&(n=o[1].split(`
14
- `).map(i=>i.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(e==="npm"||e==="lerna"){let s=ft.join(r,"package.json"),o=JSON.parse(await Os.readFile(s,"utf-8"));if(Array.isArray(o.workspaces)?n=o.workspaces:o.workspaces?.packages&&(n=o.workspaces.packages),e==="lerna"){let i=ft.join(r,"lerna.json");if(await E(i)){let a=JSON.parse(await Os.readFile(i,"utf-8"));a.packages&&(n=a.packages)}}}else if(e==="nx")n=["apps/*","libs/*","packages/*"];else if(e==="turborepo"){let s=ft.join(r,"package.json"),o=JSON.parse(await Os.readFile(s,"utf-8"));Array.isArray(o.workspaces)&&(n=o.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let s of n){if(s.startsWith("!"))continue;let o=KA(s,{cwd:r});for(let i of o){let a=ft.join(r,i),l=ft.join(a,"package.json");if(await E(l))try{let u=JSON.parse(await Os.readFile(l,"utf-8")),d=ft.join(a,"PRJCT.md");t.push({name:u.name||ft.basename(i),path:a,relativePath:i,hasPrjctMd:await E(d)})}catch{}}}}catch{}return t}async function zy(r,e){if(!e.isMonorepo)return null;let t=ft.resolve(r);for(let n of e.packages){let s=ft.resolve(n.path);if(t.startsWith(s))return n}return null}async function Yy(r){let e=ft.resolve(r),t=ft.parse(e).root;for(;e!==t;){if((await Bu(e)).isMonorepo)return e;e=ft.dirname(e)}return null}var Qy=h(()=>{"use strict";J();c(Bu,"detectMonorepo");c(qu,"discoverMonorepoPackages");c(zy,"findContainingPackage");c(Yy,"findMonorepoRoot")});var Sa={};A(Sa,{worktreeService:()=>XA});import Vu from"node:fs/promises";import Cn from"node:path";var Zy,Ju,XA,Ea=h(()=>{"use strict";Ce();J();Zy=".worktrees",Ju=class{static{c(this,"WorktreeService")}async create(e,t,n={}){let s=await this.getMainWorktree(e),o=Cn.join(s,Zy,t),i=n.branch||`feat/${t}`;await Vu.mkdir(Cn.join(s,Zy),{recursive:!0});let a=n.baseBranch?` ${n.baseBranch}`:"";await G(`git worktree add "${o}" -b "${i}"${a}`,{cwd:s});let{stdout:l}=await G("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let n=await this.getMainWorktree(e),s;if(t)try{let{stdout:o}=await G("git rev-parse --abbrev-ref HEAD",{cwd:e});s=o.trim()}catch{}if(await G(`git worktree remove "${e}" --force`,{cwd:n}),t&&s&&s!=="main"&&s!=="master")try{await G(`git branch -D "${s}"`,{cwd:n})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:n}=await G("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(n,t)}async detect(e){try{let{stdout:t}=await G("git rev-parse --git-common-dir",{cwd:e}),{stdout:n}=await G("git rev-parse --git-dir",{cwd:e}),s=Cn.resolve(e,t.trim()),o=Cn.resolve(e,n.trim());if(s!==o){let{stdout:i}=await G("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await G("git rev-parse HEAD",{cwd:e}),{stdout:l}=await G("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Cn.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:n}=await G("git worktree list --porcelain",{cwd:e}),s=n.split(`
14
+ `).map(i=>i.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(e==="npm"||e==="lerna"){let s=ft.join(r,"package.json"),o=JSON.parse(await Os.readFile(s,"utf-8"));if(Array.isArray(o.workspaces)?n=o.workspaces:o.workspaces?.packages&&(n=o.workspaces.packages),e==="lerna"){let i=ft.join(r,"lerna.json");if(await E(i)){let a=JSON.parse(await Os.readFile(i,"utf-8"));a.packages&&(n=a.packages)}}}else if(e==="nx")n=["apps/*","libs/*","packages/*"];else if(e==="turborepo"){let s=ft.join(r,"package.json"),o=JSON.parse(await Os.readFile(s,"utf-8"));Array.isArray(o.workspaces)&&(n=o.workspaces)}n.length===0&&(n=["packages/*","apps/*","libs/*"]);for(let s of n){if(s.startsWith("!"))continue;let o=KA(s,{cwd:r});for(let i of o){let a=ft.join(r,i),l=ft.join(a,"package.json");if(await E(l))try{let u=JSON.parse(await Os.readFile(l,"utf-8")),d=ft.join(a,"PRJCT.md");t.push({name:u.name||ft.basename(i),path:a,relativePath:i,hasPrjctMd:await E(d)})}catch{}}}}catch{}return t}async function zy(r,e){if(!e.isMonorepo)return null;let t=ft.resolve(r);for(let n of e.packages){let s=ft.resolve(n.path);if(t.startsWith(s))return n}return null}async function Yy(r){let e=ft.resolve(r),t=ft.parse(e).root;for(;e!==t;){if((await Bu(e)).isMonorepo)return e;e=ft.dirname(e)}return null}var Qy=h(()=>{"use strict";J();c(Bu,"detectMonorepo");c(qu,"discoverMonorepoPackages");c(zy,"findContainingPackage");c(Yy,"findMonorepoRoot")});var Sa={};A(Sa,{worktreeService:()=>XA});import Vu from"node:fs/promises";import Cn from"node:path";var Zy,Ju,XA,Ea=h(()=>{"use strict";Re();J();Zy=".worktrees",Ju=class{static{c(this,"WorktreeService")}async create(e,t,n={}){let s=await this.getMainWorktree(e),o=Cn.join(s,Zy,t),i=n.branch||`feat/${t}`;await Vu.mkdir(Cn.join(s,Zy),{recursive:!0});let a=n.baseBranch?` ${n.baseBranch}`:"";await G(`git worktree add "${o}" -b "${i}"${a}`,{cwd:s});let{stdout:l}=await G("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let n=await this.getMainWorktree(e),s;if(t)try{let{stdout:o}=await G("git rev-parse --abbrev-ref HEAD",{cwd:e});s=o.trim()}catch{}if(await G(`git worktree remove "${e}" --force`,{cwd:n}),t&&s&&s!=="main"&&s!=="master")try{await G(`git branch -D "${s}"`,{cwd:n})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:n}=await G("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(n,t)}async detect(e){try{let{stdout:t}=await G("git rev-parse --git-common-dir",{cwd:e}),{stdout:n}=await G("git rev-parse --git-dir",{cwd:e}),s=Cn.resolve(e,t.trim()),o=Cn.resolve(e,n.trim());if(s!==o){let{stdout:i}=await G("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await G("git rev-parse HEAD",{cwd:e}),{stdout:l}=await G("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Cn.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:n}=await G("git worktree list --porcelain",{cwd:e}),s=n.split(`
15
15
  `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:t}=await G("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let n=Cn.join(t,".env");await E(n)&&await Vu.copyFile(n,Cn.join(e,".env"));let s=Cn.join(t,".prjct"),o=Cn.join(e,".prjct");await E(s)&&!await E(o)&&await Vu.symlink(s,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),n=[],s=await this.getMainWorktree(e);await G("git worktree prune",{cwd:s});for(let o of t)o.isMain||await E(o.path)||n.push(o.slug);return n}parsePorcelainOutput(e,t){let n=[],s=e.trim().split(`
16
16
 
17
17
  `);for(let o of s){if(!o.trim())continue;let i=o.trim().split(`
18
- `),a="",l="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?l=p.replace("HEAD ","").trim():p.startsWith("branch ")?u=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(u="(detached)");if(a){let p=a===t||d;n.push({path:a,branch:u,commit:l,isMain:p,slug:p?"main":Cn.basename(a)})}}return n}},XA=new Ju});import ew from"node:os";import qt from"node:path";function tw(){let r=process.env.PRJCT_VAULT_ROOT?.trim();return r?qt.resolve(r):qt.join(ew.homedir(),"Documents","prjct")}async function nw(r,e){if(e&&e.trim().length>0)return YA(r,e);let t=await zA(r),s=qt.basename(qt.resolve(t)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return qt.join(tw(),s)}function rw(r,e){let n=qt.basename(qt.resolve(r)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",s=e.replace(/-/g,"").slice(0,8);return qt.join(tw(),`${n}-${s}`)}function sw(r){return qt.join(r,".prjct","wiki")}async function zA(r){try{let{worktreeService:e}=await Promise.resolve().then(()=>(Ea(),Sa));return await e.detect(r)&&await e.getMainWorktree(r)||r}catch{return r}}function YA(r,e){let t=e.trim();return(t.startsWith("~/")||t==="~")&&(t=qt.join(ew.homedir(),t.slice(1))),qt.isAbsolute(t)||(t=qt.resolve(r,t)),t}var ow=h(()=>{"use strict";c(tw,"getVaultRoot");c(nw,"getWikiPath");c(rw,"getWikiPathWithProjectHash");c(sw,"getLegacyWikiPath");c(zA,"resolveProjectRootPath");c(YA,"resolveVaultOverride")});var aw={};A(aw,{invalidateProviderCache:()=>ej,readProviderCache:()=>Xu,writeProviderCache:()=>zu});import iw from"node:fs/promises";import QA from"node:path";async function Xu(){try{let r=await iw.readFile(Ku(),"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ds(e.timestamp,ZA)?null:e.detection}catch{return null}}async function zu(r){let e={timestamp:new Date().toISOString(),detection:r};await fe(Ku(),e)}async function ej(){try{await iw.unlink(Ku())}catch{}}var Ku,ZA,Yu=h(()=>{"use strict";ge();Bo();J();Ku=c(()=>QA.join(_.getCachePath(),"providers.json"),"cacheFile"),ZA=600*1e3;c(Xu,"readProviderCache");c(zu,"writeProviderCache");c(ej,"invalidateProviderCache")});var _t={};A(_t,{ClaudeProvider:()=>Ta,CursorProvider:()=>uw,GeminiProvider:()=>Zu,Providers:()=>kt,detectAllProviders:()=>qn,detectAntigravity:()=>Jo,detectCodex:()=>Rn,detectProvider:()=>Qu,getActiveProvider:()=>rj,getProviderBranding:()=>Ca,selectProvider:()=>ed,validateCliVersion:()=>mw});import pr from"node:os";import tn from"node:path";async function pw(r){try{let{stdout:e}=await G(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function nj(r){try{let{stdout:e}=await G(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Qu(r){let e=kt[r];if(!e.cliCommand)return{installed:!1};let t=await pw(e.cliCommand);if(!t)return{installed:!1};let n=await nj(e.cliCommand),s=mw(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function mw(r,e){let t=kt[r];return!t.minCliVersion||!e?null:Fo(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function qn(r=!1){if(!r){let i=await Xu();if(i)return i}let[e,t,n]=await Promise.all([Qu("claude"),Qu("gemini"),Rn()]),s={installed:n.installed},o={claude:e,gemini:t,codex:s};return await zu(o).catch(()=>{}),o}async function rj(r){if(r&&kt[r])return kt[r];let e=await qn();return e.claude.installed&&!e.gemini.installed?Ta:e.gemini.installed&&!e.claude.installed?Zu:Ta}function Ca(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function Jo(){let r=lw.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=tn.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([E(r),E(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Rn(){let r=dw.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await pw("codex"),t=tn.join(r,"skills","prjct","SKILL.md"),n=await E(t),s=!!e||await E(tn.join(r,"auth.json"));return{installed:s,skillInstalled:n,configPath:s?r:void 0}}async function ed(){let r=await qn();return{provider:r.gemini.installed&&!r.claude.installed?"gemini":"claude",detection:r}}var Ta,Zu,lw,uw,tj,dw,kt,Be=h(()=>{"use strict";fa();Ts();Ce();J();Yu();Ta={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:tn.join(pr.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:tn.join(pr.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},Zu={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:tn.join(pr.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:tn.join(pr.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},lw={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:tn.join(pr.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:tn.join(pr.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},uw={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},tj={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},dw={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:tn.join(pr.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:tn.join(pr.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},kt={claude:Ta,gemini:Zu,cursor:uw,antigravity:lw,windsurf:tj,codex:dw};c(pw,"whichCommand");c(nj,"getCliVersion");c(Qu,"detectProvider");c(mw,"validateCliVersion");c(qn,"detectAllProviders");c(rj,"getActiveProvider");c(Ca,"getProviderBranding");c(Jo,"detectAntigravity");c(Rn,"detectCodex");c(ed,"selectProvider")});var nd={};A(nd,{default:()=>_});import sj from"node:crypto";import Ra from"node:fs/promises";import fw from"node:os";import be from"node:path";var td,oj,_,ge=h(()=>{"use strict";le();J();Es();Qy();ow();td=class{static{c(this,"PathManager")}globalBaseDir;globalConfigDir;constructor(){this.globalBaseDir=en(),this.globalConfigDir=be.join(this.globalBaseDir,"config")}get globalProjectsDir(){let e=process.env.PRJCT_PROJECTS_DIR;return e?be.resolve(e):be.join(this.globalBaseDir,"projects")}setGlobalBaseDir(e){this.globalBaseDir=be.resolve(e),this.globalConfigDir=be.join(this.globalBaseDir,"config")}generateProjectId(e){return sj.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return be.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return be.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return be.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return be.join(e,".prjct")}async hasLegacyStructure(e){return await dr(this.getLegacyPrjctPath(e))}async hasConfig(e){return await E(this.getLocalConfigPath(e))}async ensureGlobalStructure(){await jt(this.globalBaseDir),await jt(this.globalProjectsDir),await jt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["analysis","memory"];for(let s of n)await jt(be.join(t,s));return await jt(be.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Xy(t);return be.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await jt(n),n}async listSessions(e,t=null,n=null){let s=be.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Ra.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let l=be.join(s,a.name),u=await Ra.readdir(l,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let p=be.join(l,d.name),m=await Ra.readdir(p,{withFileTypes:!0});for(let f of m)f.isDirectory()&&o.push({year:a.name,month:d.name,day:f.name,path:be.join(p,f.name),date:new Date(`${a.name}-${d.name}-${f.name}`)})}}return o.sort((a,l)=>l.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return be.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Ra.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){return await dr(this.getGlobalProjectPath(e))}getDisplayPath(e){let t=fw.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return be.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return be.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return be.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return be.join(this.globalBaseDir,".running")}getDocsPath(){return be.join(this.globalBaseDir,"docs")}getCachePath(){return be.join(this.globalBaseDir,"cache")}getStatePath(){return be.join(this.globalBaseDir,"state")}getStatusLinePath(){return be.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(Be(),ze(_t)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),ze(_t)).getActiveProvider();return(Be(),ze(_t)).getGlobalSettingsPath(e.name)}getClaudeDir(){return be.join(fw.homedir(),".claude")}getClaudeSettingsPath(){return be.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return be.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return be.join(this.getGlobalProjectPath(e),"context")}async getWikiPath(e,t){return nw(e,t)}getWikiPathWithProjectHash(e,t){return rw(e,t)}getLegacyWikiPath(e){return sw(e)}async detectMonorepo(e){return Bu(e)}async discoverMonorepoPackages(e,t){return qu(e,t)}async findContainingPackage(e,t){return zy(e,t)}async findMonorepoRoot(e){return Yy(e)}},oj=new td,_=oj});import ij from"node:crypto";function mr(r){let e=r.toLowerCase().replace(/\s+/g," ").trim();return ij.createHash("sha256").update(e).digest("hex")}var xa=h(()=>{"use strict";c(mr,"memoryFingerprint")});var gw,hw=h(()=>{"use strict";gw=`
18
+ `),a="",l="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?a=p.replace("worktree ","").trim():p.startsWith("HEAD ")?l=p.replace("HEAD ","").trim():p.startsWith("branch ")?u=p.replace("branch refs/heads/","").trim():p==="bare"?d=!0:p==="detached"&&(u="(detached)");if(a){let p=a===t||d;n.push({path:a,branch:u,commit:l,isMain:p,slug:p?"main":Cn.basename(a)})}}return n}},XA=new Ju});import ew from"node:os";import qt from"node:path";function tw(){let r=process.env.PRJCT_VAULT_ROOT?.trim();return r?qt.resolve(r):qt.join(ew.homedir(),"Documents","prjct")}async function nw(r,e){if(e&&e.trim().length>0)return YA(r,e);let t=await zA(r),s=qt.basename(qt.resolve(t)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return qt.join(tw(),s)}function rw(r,e){let n=qt.basename(qt.resolve(r)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",s=e.replace(/-/g,"").slice(0,8);return qt.join(tw(),`${n}-${s}`)}function sw(r){return qt.join(r,".prjct","wiki")}async function zA(r){try{let{worktreeService:e}=await Promise.resolve().then(()=>(Ea(),Sa));return await e.detect(r)&&await e.getMainWorktree(r)||r}catch{return r}}function YA(r,e){let t=e.trim();return(t.startsWith("~/")||t==="~")&&(t=qt.join(ew.homedir(),t.slice(1))),qt.isAbsolute(t)||(t=qt.resolve(r,t)),t}var ow=h(()=>{"use strict";c(tw,"getVaultRoot");c(nw,"getWikiPath");c(rw,"getWikiPathWithProjectHash");c(sw,"getLegacyWikiPath");c(zA,"resolveProjectRootPath");c(YA,"resolveVaultOverride")});var aw={};A(aw,{invalidateProviderCache:()=>ej,readProviderCache:()=>Xu,writeProviderCache:()=>zu});import iw from"node:fs/promises";import QA from"node:path";async function Xu(){try{let r=await iw.readFile(Ku(),"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ds(e.timestamp,ZA)?null:e.detection}catch{return null}}async function zu(r){let e={timestamp:new Date().toISOString(),detection:r};await fe(Ku(),e)}async function ej(){try{await iw.unlink(Ku())}catch{}}var Ku,ZA,Yu=h(()=>{"use strict";ge();Bo();J();Ku=c(()=>QA.join(_.getCachePath(),"providers.json"),"cacheFile"),ZA=600*1e3;c(Xu,"readProviderCache");c(zu,"writeProviderCache");c(ej,"invalidateProviderCache")});var _t={};A(_t,{ClaudeProvider:()=>Ta,CursorProvider:()=>uw,GeminiProvider:()=>Zu,Providers:()=>kt,detectAllProviders:()=>qn,detectAntigravity:()=>Jo,detectCodex:()=>Rn,detectProvider:()=>Qu,getActiveProvider:()=>rj,getProviderBranding:()=>Ca,selectProvider:()=>ed,validateCliVersion:()=>mw});import pr from"node:os";import tn from"node:path";async function pw(r){try{let{stdout:e}=await G(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function nj(r){try{let{stdout:e}=await G(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Qu(r){let e=kt[r];if(!e.cliCommand)return{installed:!1};let t=await pw(e.cliCommand);if(!t)return{installed:!1};let n=await nj(e.cliCommand),s=mw(r,n||void 0);return{installed:!0,version:n||void 0,path:t,versionWarning:s||void 0}}function mw(r,e){let t=kt[r];return!t.minCliVersion||!e?null:Fo(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function qn(r=!1){if(!r){let i=await Xu();if(i)return i}let[e,t,n]=await Promise.all([Qu("claude"),Qu("gemini"),Rn()]),s={installed:n.installed},o={claude:e,gemini:t,codex:s};return await zu(o).catch(()=>{}),o}async function rj(r){if(r&&kt[r])return kt[r];let e=await qn();return e.claude.installed&&!e.gemini.installed?Ta:e.gemini.installed&&!e.claude.installed?Zu:Ta}function Ca(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function Jo(){let r=lw.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=tn.join(r,"skills","prjct","SKILL.md"),[t,n]=await Promise.all([E(r),E(e)]);return{installed:t,skillInstalled:n,configPath:t?r:void 0}}async function Rn(){let r=dw.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await pw("codex"),t=tn.join(r,"skills","prjct","SKILL.md"),n=await E(t),s=!!e||await E(tn.join(r,"auth.json"));return{installed:s,skillInstalled:n,configPath:s?r:void 0}}async function ed(){let r=await qn();return{provider:r.gemini.installed&&!r.claude.installed?"gemini":"claude",detection:r}}var Ta,Zu,lw,uw,tj,dw,kt,Be=h(()=>{"use strict";fa();Ts();Re();J();Yu();Ta={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:tn.join(pr.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:tn.join(pr.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},Zu={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:tn.join(pr.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:tn.join(pr.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},lw={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:tn.join(pr.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:tn.join(pr.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},uw={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},tj={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},dw={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:tn.join(pr.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:tn.join(pr.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},kt={claude:Ta,gemini:Zu,cursor:uw,antigravity:lw,windsurf:tj,codex:dw};c(pw,"whichCommand");c(nj,"getCliVersion");c(Qu,"detectProvider");c(mw,"validateCliVersion");c(qn,"detectAllProviders");c(rj,"getActiveProvider");c(Ca,"getProviderBranding");c(Jo,"detectAntigravity");c(Rn,"detectCodex");c(ed,"selectProvider")});var nd={};A(nd,{default:()=>_});import sj from"node:crypto";import Ra from"node:fs/promises";import fw from"node:os";import be from"node:path";var td,oj,_,ge=h(()=>{"use strict";le();J();Es();Qy();ow();td=class{static{c(this,"PathManager")}globalBaseDir;globalConfigDir;constructor(){this.globalBaseDir=en(),this.globalConfigDir=be.join(this.globalBaseDir,"config")}get globalProjectsDir(){let e=process.env.PRJCT_PROJECTS_DIR;return e?be.resolve(e):be.join(this.globalBaseDir,"projects")}setGlobalBaseDir(e){this.globalBaseDir=be.resolve(e),this.globalConfigDir=be.join(this.globalBaseDir,"config")}generateProjectId(e){return sj.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return be.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return be.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return be.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return be.join(e,".prjct")}async hasLegacyStructure(e){return await dr(this.getLegacyPrjctPath(e))}async hasConfig(e){return await E(this.getLocalConfigPath(e))}async ensureGlobalStructure(){await jt(this.globalBaseDir),await jt(this.globalProjectsDir),await jt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),n=["analysis","memory"];for(let s of n)await jt(be.join(t,s));return await jt(be.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:n,month:s,day:o}=Xy(t);return be.join(this.getGlobalProjectPath(e),"sessions",n,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let n=this.getSessionPath(e,t);return await jt(n),n}async listSessions(e,t=null,n=null){let s=be.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await Ra.readdir(s,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let l=be.join(s,a.name),u=await Ra.readdir(l,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||n&&d.name!==n.toString().padStart(2,"0"))continue;let p=be.join(l,d.name),m=await Ra.readdir(p,{withFileTypes:!0});for(let f of m)f.isDirectory()&&o.push({year:a.name,month:d.name,day:f.name,path:be.join(p,f.name),date:new Date(`${a.name}-${d.name}-${f.name}`)})}}return o.sort((a,l)=>l.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,n=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=n)}getFilePath(e,t,n){return be.join(this.getGlobalProjectPath(e),t,n)}async listProjects(){try{return await this.ensureGlobalStructure(),(await Ra.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){return await dr(this.getGlobalProjectPath(e))}getDisplayPath(e){let t=fw.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return be.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return be.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return be.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return be.join(this.globalBaseDir,".running")}getDocsPath(){return be.join(this.globalBaseDir,"docs")}getCachePath(){return be.join(this.globalBaseDir,"cache")}getStatePath(){return be.join(this.globalBaseDir,"state")}getStatusLinePath(){return be.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(Be(),ze(_t)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(Be(),ze(_t)).getActiveProvider();return(Be(),ze(_t)).getGlobalSettingsPath(e.name)}getClaudeDir(){return be.join(fw.homedir(),".claude")}getClaudeSettingsPath(){return be.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return be.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return be.join(this.getGlobalProjectPath(e),"context")}async getWikiPath(e,t){return nw(e,t)}getWikiPathWithProjectHash(e,t){return rw(e,t)}getLegacyWikiPath(e){return sw(e)}async detectMonorepo(e){return Bu(e)}async discoverMonorepoPackages(e,t){return qu(e,t)}async findContainingPackage(e,t){return zy(e,t)}async findMonorepoRoot(e){return Yy(e)}},oj=new td,_=oj});import ij from"node:crypto";function mr(r){let e=r.toLowerCase().replace(/\s+/g," ").trim();return ij.createHash("sha256").update(e).digest("hex")}var xa=h(()=>{"use strict";c(mr,"memoryFingerprint")});var gw,hw=h(()=>{"use strict";gw=`
19
19
  -- =======================================================================
20
20
  -- Document storage (backward-compatible with JSON file pattern)
21
21
  -- =======================================================================
@@ -665,7 +665,7 @@ echo "prjct"
665
665
  `)}function Hj(){Sd({})}async function Ww(r){try{await r()}catch{Hj()}}function Gw(r,e=8){let t=Ws(r.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2")).toLowerCase(),n=new Set,s=[];for(let o of t.split(/[^\p{L}\p{N}]+/u))if(!(o.length<3)&&!Uj.has(o)&&!n.has(o)&&(n.add(o),s.push(o),s.length>=e))break;return s}function Wj(r){return r.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD")}function Jn(r,e,t=`
666
666
  \u2026 [truncated]`){if(r.length<=e)return r;let n=Math.max(0,e-t.length),s=r.charCodeAt(n-1);return s>=55296&&s<=56319&&(n-=1),r.slice(0,Math.max(0,n))+t}function Ed(r,e){if(!e)return{};let t=Wj(e);return Fj.has(r)?{hookSpecificOutput:{hookEventName:r,additionalContext:t}}:{systemMessage:t}}var Fj,Uj,Gs=h(()=>{"use strict";La();Fj=new Set(["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse"]);c(Uw,"readStdinSafe");c(Sd,"emit");c(Hj,"emitEmpty");c(Ww,"safeRun");Uj=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"]);c(Gw,"extractKeywords");c(Wj,"stripLoneSurrogates");c(Jn,"safeTruncate");c(Ed,"buildHookOutput")});async function it(r,e){let t=r.projectPath??process.cwd();if(e){try{let n=e.input,s=r.build?await r.build(n,t):null;e.sink(`${JSON.stringify(Ed(r.event,s))}
667
667
  `),r.afterEmit&&e.detachAfterEmit(()=>r.afterEmit(n,t))}catch{e.sink(`{}
668
- `)}return}await Ww(async()=>{let n=await Uw(),s=r.build?await r.build(n,t):null;Sd(Ed(r.event,s)),r.afterEmit&&await r.afterEmit(n,t)})}var Kn=h(()=>{"use strict";Gs();c(it,"runHook")});async function Fa(r){try{let{stdout:e}=await G(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Gj(){let r=await Fa("gh api user --jq .login");return r.success&&r.output||(r=await Fa("git config --global github.user"),r.success&&r.output)?r.output:null}async function Bj(){let r=await Fa("git config user.name");return r.success&&r.output?r.output:null}async function qj(){let r=await Fa("git config user.email");return r.success&&r.output?r.output:null}async function Bs(){let[r,e,t]=await Promise.all([Gj(),Bj(),qj()]);return{github:r,email:t,name:e||r||"Unknown"}}var Ha=h(()=>{"use strict";Ce();c(Fa,"execCommand");c(Gj,"detectGitHubUsername");c(Bj,"detectGitName");c(qj,"detectGitEmail");c(Bs,"detect")});var sn={};A(sn,{default:()=>P});import Cd from"node:fs/promises";import Vj from"node:path";import*as Ua from"jsonc-parser";function Bw(r){let e=[],t=Ua.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Ua.printParseErrorCode(n.error)}`)}return t}var Rd,Jj,P,Q=h(()=>{"use strict";lr();H();le();J();_e();Ha();ge();c(Bw,"parseJsonc");Rd=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=_.getLocalConfigPath(e),n=await Cd.readFile(t,"utf-8");return Bw(n)}catch(t){return W(t)||console.warn(`Warning: Could not read config at ${e}: ${Ge(t)}`),null}}async writeConfig(e,t){let n=_.getLocalConfigPath(e);await fe(n,t)}async readGlobalConfig(e){try{let t=_.getGlobalProjectConfigPath(e),n=await Cd.readFile(t,"utf-8");return Bw(n)}catch(t){return W(t)||console.warn(`Warning: Could not read global config for ${e}: ${Ge(t)}`),null}}async writeGlobalConfig(e,t){let n=_.getGlobalProjectConfigPath(e);await fe(n,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=T();t={projectId:e,authors:[],version:te,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=_.generateProjectId(e),s=_.getGlobalProjectPath(n),o=_.getDisplayPath(s),i=T(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:te,created:i,lastSync:i};return await this.writeGlobalConfig(n,l),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=T(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await _.hasLegacyStructure(e))return!1;if(!await _.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=_.getGlobalProjectPath(s.projectId);try{return(await Cd.readdir(Vj.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:n}=await Promise.resolve().then(()=>(Ea(),Sa));if(await n.detect(e)){let o=await n.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return""}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=T();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=T(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await Bs(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=_.generateProjectId(e);return{projectId:n,dataPath:_.getDisplayPath(_.getGlobalProjectPath(n))}}},Jj=new Rd,P=Jj});var Id={};A(Id,{PRJCT_HOOKS:()=>Vs,install:()=>jd,status:()=>$d,uninstall:()=>_d});import xd from"node:fs/promises";import Kj from"node:os";import Vw from"node:path";function qs(){let r=process.env.HOME||Kj.homedir();return Vw.join(r,".claude","settings.json")}function Xj(r){let e=r.command?.match(/\bhook\s+(\S+)/);return e?e[1]:null}function zj(r){let e=new Set(Vs.map(n=>n.subcommand)),t=0;for(let n of Object.keys(r)){let s=r[n],o=[];for(let i of s)i.hooks=i.hooks.filter(a=>{if(!Wa(a))return!0;let l=Xj(a);return l&&!e.has(l)?(t++,!1):!0}),i.hooks.length>0&&o.push(i);o.length>0?r[n]=o:delete r[n]}return t}async function Ad(){try{let r=await xd.readFile(qs(),"utf-8"),e=JSON.parse(r);return e&&typeof e=="object"?e:{}}catch(r){if(r.code==="ENOENT")return{};throw r}}async function Jw(r){await xd.mkdir(Vw.dirname(qs()),{recursive:!0}),await xd.writeFile(qs(),`${JSON.stringify(r,null,2)}
668
+ `)}return}await Ww(async()=>{let n=await Uw(),s=r.build?await r.build(n,t):null;Sd(Ed(r.event,s)),r.afterEmit&&await r.afterEmit(n,t)})}var Kn=h(()=>{"use strict";Gs();c(it,"runHook")});async function Fa(r){try{let{stdout:e}=await G(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Gj(){let r=await Fa("gh api user --jq .login");return r.success&&r.output||(r=await Fa("git config --global github.user"),r.success&&r.output)?r.output:null}async function Bj(){let r=await Fa("git config user.name");return r.success&&r.output?r.output:null}async function qj(){let r=await Fa("git config user.email");return r.success&&r.output?r.output:null}async function Bs(){let[r,e,t]=await Promise.all([Gj(),Bj(),qj()]);return{github:r,email:t,name:e||r||"Unknown"}}var Ha=h(()=>{"use strict";Re();c(Fa,"execCommand");c(Gj,"detectGitHubUsername");c(Bj,"detectGitName");c(qj,"detectGitEmail");c(Bs,"detect")});var sn={};A(sn,{default:()=>P});import Cd from"node:fs/promises";import Vj from"node:path";import*as Ua from"jsonc-parser";function Bw(r){let e=[],t=Ua.parse(r,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let n=e[0];throw new SyntaxError(`JSON parse error at offset ${n.offset}: ${Ua.printParseErrorCode(n.error)}`)}return t}var Rd,Jj,P,Q=h(()=>{"use strict";lr();H();le();J();_e();Ha();ge();c(Bw,"parseJsonc");Rd=class{static{c(this,"ConfigManager")}async readConfig(e){try{let t=_.getLocalConfigPath(e),n=await Cd.readFile(t,"utf-8");return Bw(n)}catch(t){return W(t)||console.warn(`Warning: Could not read config at ${e}: ${Ge(t)}`),null}}async writeConfig(e,t){let n=_.getLocalConfigPath(e);await fe(n,t)}async readGlobalConfig(e){try{let t=_.getGlobalProjectConfigPath(e),n=await Cd.readFile(t,"utf-8");return Bw(n)}catch(t){return W(t)||console.warn(`Warning: Could not read global config for ${e}: ${Ge(t)}`),null}}async writeGlobalConfig(e,t){let n=_.getGlobalProjectConfigPath(e);await fe(n,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let n=T();t={projectId:e,authors:[],version:te,lastSync:n},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let n=_.generateProjectId(e),s=_.getGlobalProjectPath(n),o=_.getDisplayPath(s),i=T(),a={projectId:n,dataPath:o,showMetrics:!0};await this.writeConfig(e,a);let l={projectId:n,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:te,created:i,lastSync:i};return await this.writeGlobalConfig(n,l),a}async updateLastSync(e){let t=await this.getProjectId(e),n=await this.readGlobalConfig(t);n&&(n.lastSync=T(),await this.writeGlobalConfig(t,n))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await _.hasLegacyStructure(e))return!1;if(!await _.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=_.getGlobalProjectPath(s.projectId);try{return(await Cd.readdir(Vj.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:n}=await Promise.resolve().then(()=>(Ea(),Sa));if(await n.detect(e)){let o=await n.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return""}async findAuthor(e,t){let n=await this.readGlobalConfig(e);return!n||!n.authors?null:n.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let n=await this.ensureGlobalConfig(e);if(n.authors.some(i=>i.github===t.github))return;let o=T();n.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),n.lastSync=o,await this.writeGlobalConfig(e,n)}async updateAuthorActivity(e,t){let n=await this.readGlobalConfig(e);if(!n||!n.authors)return;let s=n.authors.find(o=>o.github===t);s&&(s.lastActivity=T(),n.lastSync=s.lastActivity,await this.writeGlobalConfig(e,n))}async getCurrentAuthor(e){let t=await Bs(),n=await this.getProjectId(e);return await this.addAuthor(n,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let n=await this.readConfig(e);n&&(n.showMetrics=t,await this.writeConfig(e,n))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let n=_.generateProjectId(e);return{projectId:n,dataPath:_.getDisplayPath(_.getGlobalProjectPath(n))}}},Jj=new Rd,P=Jj});var Id={};A(Id,{PRJCT_HOOKS:()=>Vs,install:()=>jd,status:()=>$d,uninstall:()=>_d});import xd from"node:fs/promises";import Kj from"node:os";import Vw from"node:path";function qs(){let r=process.env.HOME||Kj.homedir();return Vw.join(r,".claude","settings.json")}function Xj(r){let e=r.command?.match(/\bhook\s+(\S+)/);return e?e[1]:null}function zj(r){let e=new Set(Vs.map(n=>n.subcommand)),t=0;for(let n of Object.keys(r)){let s=r[n],o=[];for(let i of s)i.hooks=i.hooks.filter(a=>{if(!Wa(a))return!0;let l=Xj(a);return l&&!e.has(l)?(t++,!1):!0}),i.hooks.length>0&&o.push(i);o.length>0?r[n]=o:delete r[n]}return t}async function Ad(){try{let r=await xd.readFile(qs(),"utf-8"),e=JSON.parse(r);return e&&typeof e=="object"?e:{}}catch(r){if(r.code==="ENOENT")return{};throw r}}async function Jw(r){await xd.mkdir(Vw.dirname(qs()),{recursive:!0}),await xd.writeFile(qs(),`${JSON.stringify(r,null,2)}
669
669
  `,"utf-8")}function Kw(r){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${r} || exit 0`}function Wa(r){return r[Pd]===!0}function Yj(r){if(r[Pd]===!0)return!1;let e=r.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function qw(r){let e={type:"command",command:Kw(r.subcommand),[Pd]:!0};return"ifClause"in r&&r.ifClause&&(e.if=r.ifClause),e}async function jd(){let r=await Ad(),e=r.hooks??{},t=0,n=0;for(let o of Vs){let i=e[o.event]??[],a=Kw(o.subcommand),l=i.find(m=>(m.matcher??"")===o.matcher);l||(l={matcher:o.matcher,hooks:[]},i.push(l));let u=l.hooks.length;l.hooks=l.hooks.filter(m=>!Yj(m));let d=u-l.hooks.length,p=l.hooks.find(m=>Wa(m));if(p){let m=qw(o);p.command===m.command&&p.if===m.if&&d===0?n++:(p.command=m.command,p.if=m.if,t++)}else l.hooks.push(qw(o)),t++;e[o.event]=i}let s=zj(e);return r.hooks=e,await Jw(r),{settingsPath:qs(),hooksWritten:t,alreadyPresent:n,hooksPruned:s}}async function _d(){let r=await Ad();if(!r.hooks)return{settingsPath:qs(),hooksRemoved:0};let e=0;for(let[t,n]of Object.entries(r.hooks)){let s=[];for(let o of n){let i=o.hooks.filter(a=>Wa(a)?(e++,!1):!0);i.length>0&&s.push({...o,hooks:i})}s.length>0?r.hooks[t]=s:delete r.hooks[t]}return Object.keys(r.hooks).length===0&&delete r.hooks,await Jw(r),{settingsPath:qs(),hooksRemoved:e}}async function $d(){let e=(await Ad()).hooks??{},t=0;for(let n of Object.values(e))for(let s of n)for(let o of s.hooks)Wa(o)&&t++;return{installed:t,expected:Vs.length}}var Pd,Vs,Ga=h(()=>{"use strict";c(qs,"settingsPath");Pd="_prjctManaged",Vs=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PreToolUse",matcher:"Edit|Write",subcommand:"pre-edit"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(Xj,"subcommandOf");c(zj,"pruneOrphanedManagedHooks");c(Ad,"readSettings");c(Jw,"writeSettings");c(Kw,"hookCommand");c(Wa,"isPrjctHook");c(Yj,"isLegacyPrjctHook");c(qw,"hookEntryFor");c(jd,"install");c(_d,"uninstall");c($d,"status")});var Nd={};A(Nd,{isSyncCurrent:()=>Md,runSelfHeal:()=>Od});import Dd from"node:fs";import Qj from"node:path";function Zj(){try{return Dd.readFileSync(zw(),"utf-8").trim()}catch{return null}}function e_(r){try{Dd.mkdirSync(Xw(),{recursive:!0}),Dd.writeFileSync(zw(),r,"utf-8")}catch{}}function Md(r){return r?Zj()===r:!0}async function Od(r){if(r&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(nn(),md));await e()}catch{}try{await(await Promise.resolve().then(()=>(Ga(),Id))).install()}catch{}e_(r)}}var Xw,zw,Ba=h(()=>{"use strict";ge();Xw=c(()=>_.getStatePath(),"stampDir"),zw=c(()=>Qj.join(Xw(),"installed-version"),"stampPath");c(Zj,"readStamp");c(e_,"writeStamp");c(Md,"isSyncCurrent");c(Od,"runSelfHeal")});function Js(r){let e=[];for(let{name:t,re:n}of Yw)n.test(r)&&e.push(t);return e}function Qw(r){return r.replace(/[`*_[\](){}<>\\]/g,e=>`\\${e}`)}var Yw,HB,Zo=h(()=>{"use strict";Yw=[{name:"instruction-override",re:/\b(ignore|disregard|override|forget)\b[^.]{0,40}\b(previous|prior|above|system|prompt|instructions?|rules?|constraints?)\b/i},{name:"role-play-injection",re:/\b(you\s+are\s+now|act\s+as|pretend\s+to\s+be|roleplay\s+as|assume\s+the\s+role)\b[^.]{0,40}\b(system|admin|root|developer|operator|jailbreak)\b/i},{name:"jailbreak-phrase",re:/\b(DAN\s+mode|do\s+anything\s+now|without\s+restrictions?|bypass\s+(?:safety|filters?|guidelines?)|jailbreak\s+mode)\b/i},{name:"fake-system-tag",re:/<\s*(?:system|assistant|tool[_-]?call|function[_-]?call)\s*>/i}],HB=Yw.map(r=>r.name);c(Js,"scanForPromptInjection");c(Qw,"escapeMarkdownInline")});function t_(r){return r.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function ei(r){return r.type==="gotcha"?"gotcha":r.tags?.pattern==="recurring-bug"?"recurring-bug":r.type}function ti(r,e=220){let t=r.replace(/\s+/g," ").trim();return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function He(r){let e=(r.content??"").trim();e=e.replace(/^(?:[-*•]\s+|\s+)+/,""),e=e.replace(/^(?:\[\[[^\]]*\]\]|mem[_-]\d+)[\s:,-]*/i,"").trim();let t=e.length;for(let o of[/\n/,/\.\s/,/:\s/,/;\s/,/\s—\s/,/\s\(/]){let i=e.match(o);i&&i.index!==void 0&&i.index>4&&i.index<t&&(t=i.index)}let n=e.slice(0,t).replace(/\s+/g," ").trim();if(n=n.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),n.length>Zw){let o=n.slice(0,Zw),i=o.lastIndexOf(" ");n=`${(i>40?o.slice(0,i):o).trim()}\u2026`}n.length<6&&(n=`${r.type} ${r.id}`);let s=r.tags?.pr;return s&&!new RegExp(`\\b#?${s}\\b`).test(n)&&(n=`${n} (PR #${s})`),n}function An(r,e){return r.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,n)=>{let s=`mem_${n}`,o=e?.idTypeIndex?.get(s),i=e?.idTitleIndex?.get(s),a=e?.idSlugIndex?.get(s),l=i?t_(i):s;return e?.signalIds?.has(s)?`[[signals#^mem-${n}|${l}]]`:a&&o&&e?.perEntryTypes?.has(o)?`[[${a}|${l}]]`:o?`[[${o}#^mem-${n}|${l}]]`:i?`[[${s}|${l}]]`:`\`${s}\``})}function hr(r,e){if(r.length===0)return"> No matching memory entries.";let t=new Map;for(let u of r){let d=t.get(u.type)??[];d.push(u),t.set(u.type,d)}let n=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],s=[],o={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=e?.boundary==="llm",a=c((u,d)=>{if(d.length!==0){s.push(`### ${u.toUpperCase()}`);for(let p of d){let m=Object.entries(p.tags).filter(([R])=>!e?.vault||!qa.has(R)).map(([R,D])=>`${R}=${i?Qw(D):D}`).join(" "),f=o[p.provenance],y=e?.vault?An(p.content,e):p.content,v=m?` _(${e?.vault?An(m,e):m})_`:"",k=p.id.replace(/^mem[_-]/,""),b=e?.vault?` ^mem-${k}`:"",C=`- \`${f}\` [${p.id} \xB7 ${p.type}] ${y}${v}${b}`;i?(s.push(`<user_content id="${p.id}" type="${p.type}">`),s.push(C),s.push("</user_content>")):s.push(C)}s.push("")}},"renderGroup"),l=new Set;for(let u of n){let d=t.get(u);!d||d.length===0||(a(u,d),l.add(u))}for(let[u,d]of t)l.has(u)||a(u,d);return s.join(`
670
670
  `).trim()}var qa,Zw,Xt=h(()=>{"use strict";Zo();qa=new Set(["source","session","window_days","window-days","touches","occurrences","phrase","slug","hash","content-hash","content_hash","key","kind","spec-id","spec_id"]),Zw=72;c(t_,"linkLabel");c(ei,"preventiveLabel");c(ti,"flatDetail");c(He,"deriveTitle");c(An,"linkifyMemRefs");c(hr,"formatMemoryMd")});var tk={};A(tk,{MEMORY_EVENT_RANGE:()=>Xs,REMEMBER_ACTION_PREFIX:()=>Ks,REMEMBER_EVENT_PREFIX:()=>on,REMEMBER_EVENT_RANGE:()=>yr,STATUS_CHANGE_ACTION:()=>wr,TAG_EVENT_TYPE:()=>Ld});function ek(r){return r.slice(0,-1)+String.fromCharCode(r.charCodeAt(r.length-1)+1)}var Va,Ks,on,Ld,Xs,yr,wr,kr=h(()=>{"use strict";Va="memory.",Ks="remember.",on=`${Va}${Ks}`,Ld=`${Va}task.tagged`;c(ek,"prefixUpperBound");Xs=[Va,ek(Va)],yr=[on,ek(on)],wr="status.changed"});import n_ from"node:crypto";function Ke(){return n_.randomUUID()}var Xn=h(()=>{"use strict";c(Ke,"generateUUID")});var Fd,Xr,nk=h(()=>{"use strict";le();X();Fd=class{static{c(this,"SyncPendingStorage")}append(e,t){let n=T(),s=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&S.run(e,`DELETE FROM sync_pending
671
671
  WHERE project_id = ?
@@ -673,7 +673,7 @@ echo "prjct"
673
673
  AND entity_id = ?
674
674
  AND content_hash = ?`,e,t.entityType,t.entityId,t.contentHash),S.run(e,`INSERT INTO sync_pending
675
675
  (project_id, entity_type, entity_id, event_type, content_hash, payload, enqueued_at)
676
- VALUES (?, ?, ?, ?, ?, ?, ?)`,e,t.entityType??null,t.entityId??null,t.eventType??null,t.contentHash??null,s,n),{id:S.get(e,"SELECT last_insert_rowid() AS id")?.id??0,event:t,enqueuedAt:n}}list(e,t){let n=t?"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC LIMIT ?":"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC";return(t?S.query(e,n,e,t):S.query(e,n,e)).map(o=>this.rowToEntry(o))}count(e){return S.get(e,"SELECT COUNT(*) AS n FROM sync_pending WHERE project_id = ?",e)?.n??0}clearUpTo(e,t){if(t<=0)return 0;let n=this.count(e);return S.run(e,"DELETE FROM sync_pending WHERE project_id = ? AND id <= ?",e,t),n-this.count(e)}clearAll(e){S.run(e,"DELETE FROM sync_pending WHERE project_id = ?",e)}clearByIds(e,t){if(t.length===0)return;let n=t.map(()=>"?").join(",");S.run(e,`DELETE FROM sync_pending WHERE project_id = ? AND id IN (${n})`,e,...t)}rowToEntry(e){let t;try{t=JSON.parse(e.payload)}catch{t={type:"unknown.corrupt",path:[],data:null,timestamp:e.enqueued_at,projectId:e.project_id}}return{id:e.id,event:t,enqueuedAt:e.enqueued_at}}},Xr=new Fd});var Hd,It,ni=h(()=>{"use strict";ge();nk();le();J();Hd=class{static{c(this,"SyncEventBus")}async publish(e){Xr.append(e.projectId,e)}async getPending(e){return Xr.list(e).map(t=>t.event)}async clearPending(e){Xr.clearAll(e)}async getPendingEntries(e){return Xr.list(e)}async clearPendingUpTo(e,t){return Xr.clearUpTo(e,t)}async clearPendingByIds(e,t){Xr.clearByIds(e,t)}async updateLastSync(e){let t=_.getLastSyncPath(e),n={timestamp:T(),success:!0};await fe(t,n)}async getLastSync(e){let t=_.getLastSyncPath(e);return await Pe(t,null)}},It=new Hd});var Wd={};A(Wd,{default:()=>xe});import r_ from"node:crypto";import rk from"node:fs/promises";import sk from"node:os";import s_ from"node:path";function ik(){return r_.randomUUID()}var ak,ok,Ud,o_,xe,br=h(()=>{"use strict";ge();J();ak="https://api.prjct.app",ok={apiKey:null,apiUrl:ak,userId:null,email:null,lastAuth:null};c(ik,"freshDeviceId");Ud=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=_.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Pe(this.configPath),t=e??{...ok},n=!1;if(t.deviceId||(t.deviceId=ik(),n=!0),t.hostname||(t.hostname=sk.hostname(),n=!0),this.cachedConfig=t,n&&e)try{await fe(this.configPath,this.cachedConfig),await rk.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??ik()}async getHostname(){return(await this.read()).hostname??sk.hostname()}async write(e){let n={...await this.read(),...e,lastAuth:new Date().toISOString()};await jt(s_.dirname(this.configPath)),await fe(this.configPath,n),await rk.chmod(this.configPath,384),this.cachedConfig=n}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||ak}async saveAuth(e,t,n){await this.write({apiKey:e,userId:t,email:n})}async clearAuth(){this.cachedConfig={...ok},await fe(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},o_=new Ud,xe=o_});var lk={};A(lk,{publishCRUD:()=>ck,publishCRUDSync:()=>jn});import i_ from"node:crypto";function c_(r){let e=r&&typeof r=="object"&&!Array.isArray(r)?JSON.stringify(l_(r)):JSON.stringify(r);return i_.createHash("sha256").update(e).digest("hex")}function l_(r){let e={};for(let t of Object.keys(r).sort())e[t]=r[t];return e}async function u_(){if(Gd)return Gd;try{let{default:r}=await Promise.resolve().then(()=>(br(),Wd)),e=r;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return Gd=t,t}return"unknown-device"}catch{return"unknown-device"}}async function ck(r){try{let e=await u_(),t=c_(r.data),n={type:`${r.entityType}.${a_[r.eventType]}`,path:[r.entityType,r.entityId],data:r.data,timestamp:new Date().toISOString(),projectId:r.projectId,entityType:r.entityType,entityId:r.entityId,eventType:r.eventType,contentHash:t,deviceId:e,originDeviceId:r.originDeviceId??e,revisionCount:r.revisionCount??1};await It.publish(n)}catch{}}function jn(r){ck(r)}var a_,Gd,ri=h(()=>{"use strict";ni();a_={upsert:"updated",delete:"deleted"};c(c_,"hashPayload");c(l_,"sortKeys");Gd=null;c(u_,"resolveDeviceId");c(ck,"publishCRUD");c(jn,"publishCRUDSync")});var zn,Bd,gt,vr=h(()=>{"use strict";Xn();ri();le();X();zn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Bd=class{static{c(this,"ArchiveStorage")}archive(e,t){let n=Ke(),s=T();return j.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),jn({projectId:e,entityType:"archives",entityId:n,eventType:"upsert",data:{id:n,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:s}}),n}archiveMany(e,t){if(t.length===0)return 0;let n=T();return j.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Ke(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?j.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):j.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=j.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=j.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(j.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);j.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return j.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},gt=new Bd});var qd,Xe,Yn=h(()=>{"use strict";Q();kr();vr();X();qd=class{static{c(this,"MemoryService")}async log(e,t,n,s){try{let o=await P.getProjectId(e);return o?{eventId:S.appendEvent(o,`memory.${t}`,{...n,author:s}),projectId:o}:null}catch(o){return console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`),null}}async clear(e){try{let t=await P.getProjectId(e);if(!t)return;S.run(t,"DELETE FROM events WHERE type >= ? AND type < ?",...Xs)}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return S.query(e,"SELECT type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...Xs,t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=S.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?)",...Xs,...yr)?.cnt??0;if(n<=zn.MEMORY_MAX_ENTRIES)return 0;let s=n-zn.MEMORY_MAX_ENTRIES,o=S.query(e,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?) ORDER BY id ASC LIMIT ?",...Xs,...yr,s);return gt.archiveMany(e,o.map((i,a)=>({entityType:"memory_entry",entityId:`memory-${i.timestamp||a}`,entityData:{type:i.type,data:JSON.parse(i.data),timestamp:i.timestamp},summary:i.type.replace("memory.",""),reason:"overflow"}))),S.transaction(e,i=>{let a=i.prepare("DELETE FROM events WHERE id = ?");for(let l of o)a.run(l.id)}),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Xe=new qd});function Vd(r){return!(r.type==="improvement-signal"||r.tags?.pattern==="hot-file")}function uk(r,e){try{return JSON.parse(r)}catch{return e}}function zr(r){let e=r.type.slice(on.length),t=uk(r.data,{});return{id:`mem_${r.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:r.timestamp,source:t.source,provenance:t.provenance??"declared"}}function Ja(r){let e=r.data?uk(r.data,{}):{},t=e.tags??{};return r.type&&(t.type=r.type),{id:`ship_${r.id}`,type:"shipped",content:r.name,tags:t,rememberedAt:r.shipped_at,source:e.taskId,provenance:"extracted"}}function dk(r,e){let t=e.toLowerCase();if(r.content.toLowerCase().includes(t))return!0;for(let n of Object.values(r.tags))if(n.toLowerCase().includes(t))return!0;return!1}function si(r,e){for(let[t,n]of Object.entries(e))if(r.tags[t]!==n)return!1;return!0}function pk(r){let e=new Set,t=[];for(let n of r){let s=n.tags.key;if(!s){t.push(n);continue}let o=`${n.type}::${s}`;e.has(o)||(e.add(o),t.push(n))}return t}function Ka(r){let e=new Set;for(let t of r){t.tags["superseded-by"]&&e.add(t.id);for(let n of["supersedes","duplicates"]){let s=t.tags[n];if(s)for(let o of String(s).matchAll(p_))e.add(`mem_${o[1]}`)}}return e}var d_,zs,p_,Ys=h(()=>{"use strict";kr();d_=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person","spec"],zs=d_;c(Vd,"isModelMemory");c(uk,"safeJson");c(zr,"rowToEntry");c(Ja,"shippedRowToEntry");c(dk,"matchesTopic");c(si,"matchesTags");c(pk,"dedupeLatestByKey");p_=/\bmem[_-](\d+)\b/g;c(Ka,"collectSupersededIds")});var Xd={};A(Xd,{extractCorrectionIds:()=>Kd,extractRefIds:()=>fk,usefulnessService:()=>at});function fk(r,e){let t=new Set;for(let n of v_){let s=e[n];if(s)for(let o of String(s).matchAll(Jd))t.add(`mem_${o[1]}`)}for(let n of r.matchAll(Jd))t.add(`mem_${n[1]}`);for(let n of Kd(e))t.delete(n);return[...t]}function Kd(r){let e=new Set;for(let t of S_){let n=r[t];if(n)for(let s of String(n).matchAll(Jd))e.add(`mem_${s[1]}`)}return[...e]}function mk(r,e,t,n,s){S.run(r,`INSERT INTO memory_usefulness (memory_id, score, ${n}, last_used_at)
676
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,e,t.entityType??null,t.entityId??null,t.eventType??null,t.contentHash??null,s,n),{id:S.get(e,"SELECT last_insert_rowid() AS id")?.id??0,event:t,enqueuedAt:n}}list(e,t){let n=t?"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC LIMIT ?":"SELECT * FROM sync_pending WHERE project_id = ? ORDER BY id ASC";return(t?S.query(e,n,e,t):S.query(e,n,e)).map(o=>this.rowToEntry(o))}count(e){return S.get(e,"SELECT COUNT(*) AS n FROM sync_pending WHERE project_id = ?",e)?.n??0}clearUpTo(e,t){if(t<=0)return 0;let n=this.count(e);return S.run(e,"DELETE FROM sync_pending WHERE project_id = ? AND id <= ?",e,t),n-this.count(e)}clearAll(e){S.run(e,"DELETE FROM sync_pending WHERE project_id = ?",e)}clearByIds(e,t){if(t.length===0)return;let n=t.map(()=>"?").join(",");S.run(e,`DELETE FROM sync_pending WHERE project_id = ? AND id IN (${n})`,e,...t)}rowToEntry(e){let t;try{t=JSON.parse(e.payload)}catch{t={type:"unknown.corrupt",path:[],data:null,timestamp:e.enqueued_at,projectId:e.project_id}}return{id:e.id,event:t,enqueuedAt:e.enqueued_at}}},Xr=new Fd});var Hd,It,ni=h(()=>{"use strict";ge();nk();le();J();Hd=class{static{c(this,"SyncEventBus")}async publish(e){Xr.append(e.projectId,e)}async getPending(e){return Xr.list(e).map(t=>t.event)}async clearPending(e){Xr.clearAll(e)}async getPendingEntries(e){return Xr.list(e)}async clearPendingUpTo(e,t){return Xr.clearUpTo(e,t)}async clearPendingByIds(e,t){Xr.clearByIds(e,t)}async updateLastSync(e){let t=_.getLastSyncPath(e),n={timestamp:T(),success:!0};await fe(t,n)}async getLastSync(e){let t=_.getLastSyncPath(e);return await Pe(t,null)}},It=new Hd});var Wd={};A(Wd,{default:()=>Ee});import r_ from"node:crypto";import rk from"node:fs/promises";import sk from"node:os";import s_ from"node:path";function ik(){return r_.randomUUID()}var ak,ok,Ud,o_,Ee,br=h(()=>{"use strict";ge();J();ak="https://api.prjct.app",ok={apiKey:null,apiUrl:ak,userId:null,email:null,lastAuth:null};c(ik,"freshDeviceId");Ud=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=_.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Pe(this.configPath),t=e??{...ok},n=!1;if(t.deviceId||(t.deviceId=ik(),n=!0),t.hostname||(t.hostname=sk.hostname(),n=!0),this.cachedConfig=t,n&&e)try{await fe(this.configPath,this.cachedConfig),await rk.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??ik()}async getHostname(){return(await this.read()).hostname??sk.hostname()}async write(e){let n={...await this.read(),...e,lastAuth:new Date().toISOString()};await jt(s_.dirname(this.configPath)),await fe(this.configPath,n),await rk.chmod(this.configPath,384),this.cachedConfig=n}async hasAuth(){let e=await this.read();return e.apiKey!==null&&e.apiKey.length>0}async getApiKey(){return(await this.read()).apiKey}async getApiUrl(){return(await this.read()).apiUrl||ak}async saveAuth(e,t,n){await this.write({apiKey:e,userId:t,email:n})}async clearAuth(){this.cachedConfig={...ok},await fe(this.configPath,this.cachedConfig)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:e.apiKey?`${e.apiKey.substring(0,12)}...`:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},o_=new Ud,Ee=o_});var lk={};A(lk,{publishCRUD:()=>ck,publishCRUDSync:()=>jn});import i_ from"node:crypto";function c_(r){let e=r&&typeof r=="object"&&!Array.isArray(r)?JSON.stringify(l_(r)):JSON.stringify(r);return i_.createHash("sha256").update(e).digest("hex")}function l_(r){let e={};for(let t of Object.keys(r).sort())e[t]=r[t];return e}async function u_(){if(Gd)return Gd;try{let{default:r}=await Promise.resolve().then(()=>(br(),Wd)),e=r;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return Gd=t,t}return"unknown-device"}catch{return"unknown-device"}}async function ck(r){try{let e=await u_(),t=c_(r.data),n={type:`${r.entityType}.${a_[r.eventType]}`,path:[r.entityType,r.entityId],data:r.data,timestamp:new Date().toISOString(),projectId:r.projectId,entityType:r.entityType,entityId:r.entityId,eventType:r.eventType,contentHash:t,deviceId:e,originDeviceId:r.originDeviceId??e,revisionCount:r.revisionCount??1};await It.publish(n)}catch{}}function jn(r){ck(r)}var a_,Gd,ri=h(()=>{"use strict";ni();a_={upsert:"updated",delete:"deleted"};c(c_,"hashPayload");c(l_,"sortKeys");Gd=null;c(u_,"resolveDeviceId");c(ck,"publishCRUD");c(jn,"publishCRUDSync")});var zn,Bd,gt,vr=h(()=>{"use strict";Xn();ri();le();X();zn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Bd=class{static{c(this,"ArchiveStorage")}archive(e,t){let n=Ke(),s=T();return j.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",n,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),jn({projectId:e,entityType:"archives",entityId:n,eventType:"upsert",data:{id:n,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:s}}),n}archiveMany(e,t){if(t.length===0)return 0;let n=T();return j.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Ke(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,n,i.reason)}),t.length}getArchived(e,t,n=50){return t?j.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,n):j.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",n)}getStats(e){let t=j.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),n={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in n&&(n[o]=s.count),n.total+=s.count}return n}restore(e,t){let n=j.get(e,"SELECT * FROM archives WHERE id = ?",t);return n?(j.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(n.entity_data)):null}pruneOldArchives(e,t){let n=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);j.run(e,"DELETE FROM archives WHERE archived_at < ?",n);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return j.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},gt=new Bd});var qd,Xe,Yn=h(()=>{"use strict";Q();kr();vr();X();qd=class{static{c(this,"MemoryService")}async log(e,t,n,s){try{let o=await P.getProjectId(e);return o?{eventId:S.appendEvent(o,`memory.${t}`,{...n,author:s}),projectId:o}:null}catch(o){return console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`),null}}async clear(e){try{let t=await P.getProjectId(e);if(!t)return;S.run(t,"DELETE FROM events WHERE type >= ? AND type < ?",...Xs)}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return S.query(e,"SELECT type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...Xs,t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(n){return console.error(`Memory read error: ${n instanceof Error?n.message:String(n)}`),[]}}async capEntries(e){try{let n=S.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?)",...Xs,...yr)?.cnt??0;if(n<=zn.MEMORY_MAX_ENTRIES)return 0;let s=n-zn.MEMORY_MAX_ENTRIES,o=S.query(e,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?) ORDER BY id ASC LIMIT ?",...Xs,...yr,s);return gt.archiveMany(e,o.map((i,a)=>({entityType:"memory_entry",entityId:`memory-${i.timestamp||a}`,entityData:{type:i.type,data:JSON.parse(i.data),timestamp:i.timestamp},summary:i.type.replace("memory.",""),reason:"overflow"}))),S.transaction(e,i=>{let a=i.prepare("DELETE FROM events WHERE id = ?");for(let l of o)a.run(l.id)}),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},Xe=new qd});function Vd(r){return!(r.type==="improvement-signal"||r.tags?.pattern==="hot-file")}function uk(r,e){try{return JSON.parse(r)}catch{return e}}function zr(r){let e=r.type.slice(on.length),t=uk(r.data,{});return{id:`mem_${r.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:r.timestamp,source:t.source,provenance:t.provenance??"declared"}}function Ja(r){let e=r.data?uk(r.data,{}):{},t=e.tags??{};return r.type&&(t.type=r.type),{id:`ship_${r.id}`,type:"shipped",content:r.name,tags:t,rememberedAt:r.shipped_at,source:e.taskId,provenance:"extracted"}}function dk(r,e){let t=e.toLowerCase();if(r.content.toLowerCase().includes(t))return!0;for(let n of Object.values(r.tags))if(n.toLowerCase().includes(t))return!0;return!1}function si(r,e){for(let[t,n]of Object.entries(e))if(r.tags[t]!==n)return!1;return!0}function pk(r){let e=new Set,t=[];for(let n of r){let s=n.tags.key;if(!s){t.push(n);continue}let o=`${n.type}::${s}`;e.has(o)||(e.add(o),t.push(n))}return t}function Ka(r){let e=new Set;for(let t of r){t.tags["superseded-by"]&&e.add(t.id);for(let n of["supersedes","duplicates"]){let s=t.tags[n];if(s)for(let o of String(s).matchAll(p_))e.add(`mem_${o[1]}`)}}return e}var d_,zs,p_,Ys=h(()=>{"use strict";kr();d_=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person","spec"],zs=d_;c(Vd,"isModelMemory");c(uk,"safeJson");c(zr,"rowToEntry");c(Ja,"shippedRowToEntry");c(dk,"matchesTopic");c(si,"matchesTags");c(pk,"dedupeLatestByKey");p_=/\bmem[_-](\d+)\b/g;c(Ka,"collectSupersededIds")});var Xd={};A(Xd,{extractCorrectionIds:()=>Kd,extractRefIds:()=>fk,usefulnessService:()=>at});function fk(r,e){let t=new Set;for(let n of v_){let s=e[n];if(s)for(let o of String(s).matchAll(Jd))t.add(`mem_${o[1]}`)}for(let n of r.matchAll(Jd))t.add(`mem_${n[1]}`);for(let n of Kd(e))t.delete(n);return[...t]}function Kd(r){let e=new Set;for(let t of S_){let n=r[t];if(n)for(let s of String(n).matchAll(Jd))e.add(`mem_${s[1]}`)}return[...e]}function mk(r,e,t,n,s){S.run(r,`INSERT INTO memory_usefulness (memory_id, score, ${n}, last_used_at)
677
677
  VALUES (?, ?, 1, ?)
678
678
  ON CONFLICT(memory_id) DO UPDATE SET
679
679
  score = score + ?, ${n} = ${n} + 1, last_used_at = excluded.last_used_at`,e,t,s,t)}function Xa(r,e,t,n){S.run(r,`INSERT INTO memory_usefulness (memory_id, score, last_used_at)
@@ -682,7 +682,7 @@ echo "prjct"
682
682
  score = score + ?, last_used_at = excluded.last_used_at`,e,t,n,t)}var m_,f_,g_,h_,y_,w_,k_,b_,v_,S_,Jd,at,Qn=h(()=>{"use strict";X();m_=45,f_=1,g_=.4,h_=2.5,y_=-2.5,w_=-.5,k_=-1.3,b_=864e5,v_=["resolves","relates","supersedes","superseded-by","duplicates","spec"],S_=["corrects","contradicts"],Jd=/\bmem[_-](\d+)\b/g;c(fk,"extractRefIds");c(Kd,"extractCorrectionIds");c(mk,"bump");c(Xa,"addScore");at={recordReferences(r,e,t,n=new Date().toISOString()){try{for(let s of fk(e,t))mk(r,s,f_,"ref_count",n)}catch{}},recordCorrection(r,e,t=new Date().toISOString()){try{for(let n of Kd(e))Xa(r,n,y_,t)}catch{}},recordFetch(r,e,t=new Date().toISOString()){try{mk(r,e,g_,"fetch_count",t)}catch{}},recordSurfaced(r,e,t,n=new Date().toISOString()){if(!(!t||e.length===0))try{for(let s of e)S.run(r,`INSERT OR IGNORE INTO memory_surface_log (memory_id, task_id, created_at)
683
683
  VALUES (?, ?, ?)`,s,t,n)}catch{}},penalizeSurfaced(r,e,t=new Date().toISOString()){if(!e)return 0;try{let n=S.query(r,"SELECT memory_id FROM memory_surface_log WHERE task_id = ?",e);for(let s of n)Xa(r,s.memory_id,w_,t);return n.length}catch{return 0}},penalizeSkillMiss(r,e,t=new Date().toISOString()){try{Xa(r,e,k_,t)}catch{}},creditShippedTask(r,e,t=new Date().toISOString()){if(!e)return 0;try{let n=S.query(r,"SELECT memory_id FROM memory_surface_log WHERE task_id = ?",e);for(let s of n)Xa(r,s.memory_id,h_,t);return S.run(r,"DELETE FROM memory_surface_log WHERE task_id = ?",e),n.length}catch{return 0}},decayedScores(r,e=Date.now()){let t=new Map,n;try{n=S.query(r,"SELECT memory_id, score, last_used_at FROM memory_usefulness")}catch{return t}for(let s of n){let o=Date.parse(s.last_used_at),i=Number.isNaN(o)?1:.5**(Math.max(0,e-o)/b_/m_);t.set(s.memory_id,s.score*i)}return t},rerank(r,e,t=Date.now()){if(e.length<2)return e;let n;try{n=this.decayedScores(r,t)}catch{return e}if(n.size===0)return e;let s=Math.max(1,...n.values()),o=4,i=e.length,a=e.map((l,u)=>{let d=(n.get(l.id)??0)/s;return{entry:l,i:u,rankScore:i-u+o*d}});return a.sort((l,u)=>u.rankScore-l.rankScore||l.i-u.i),a.map(l=>l.entry)}}});var za={};A(za,{projectMemory:()=>N});function R_(r){try{let e=S.query(r,`SELECT id, tags FROM memories
684
684
  WHERE deleted_at IS NULL
685
- AND (tags LIKE '%supersede%' OR tags LIKE '%duplicates%')`),t=[];for(let n of e)if(n.tags)try{let s=JSON.parse(n.tags);s&&typeof s=="object"&&t.push({id:n.id,tags:s})}catch{}return Ka(t)}catch{return new Set}}var E_,T_,C_,N,Ee=h(()=>{"use strict";Yn();X();La();xa();Ys();kr();E_=25,T_=4,C_=100;c(R_,"collectMirrorSupersededIds");N={async remember(r,e){let t=e.tags??{},n=e.provenance??"declared",s=mr(e.content),o=e.projectId;if(!o)try{let{default:a}=await Promise.resolve().then(()=>(Q(),sn));o=(await a.readConfig(r))?.projectId}catch{}if(o)try{if(S.get(o,"SELECT id FROM memories WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",s,e.type))return}catch{}let i=await Xe.log(r,`${Ks}${e.type}`,{content:e.content,tags:t,source:e.source,provenance:n});if(i?.eventId!=null)try{let a=`mem_${i.eventId}`,l=new Date().toISOString(),d=(e.content.split(`
685
+ AND (tags LIKE '%supersede%' OR tags LIKE '%duplicates%')`),t=[];for(let n of e)if(n.tags)try{let s=JSON.parse(n.tags);s&&typeof s=="object"&&t.push({id:n.id,tags:s})}catch{}return Ka(t)}catch{return new Set}}var E_,T_,C_,N,Te=h(()=>{"use strict";Yn();X();La();xa();Ys();kr();E_=25,T_=4,C_=100;c(R_,"collectMirrorSupersededIds");N={async remember(r,e){let t=e.tags??{},n=e.provenance??"declared",s=mr(e.content),o=e.projectId;if(!o)try{let{default:a}=await Promise.resolve().then(()=>(Q(),sn));o=(await a.readConfig(r))?.projectId}catch{}if(o)try{if(S.get(o,"SELECT id FROM memories WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",s,e.type))return}catch{}let i=await Xe.log(r,`${Ks}${e.type}`,{content:e.content,tags:t,source:e.source,provenance:n});if(i?.eventId!=null)try{let a=`mem_${i.eventId}`,l=new Date().toISOString(),d=(e.content.split(`
686
686
  `)[0]??e.content).slice(0,80);S.run(i.projectId,`INSERT OR IGNORE INTO memories
687
687
  (id, project_id, title, content, tags, type, provenance, content_hash,
688
688
  user_triggered, created_at, updated_at)
@@ -773,7 +773,7 @@ No changes between runs.`;let e=[];e.push("## Analysis Diff"),(r.beforeCommit||r
773
773
  `)}
774
774
  `)}let n=["# Workflows",""];n.push("Workflow definitions stored in SQLite, rendered as Markdown for inspection. To edit, see the per-workflow page."),n.push("");for(let[s,o]of t){let i=o.filter(a=>a.enabled).length;n.push(`- [${s}](${s}.md) \u2014 ${i} active rule(s)`)}return e.set("workflows/index.md",`${n.join(`
775
775
  `)}
776
- `),{files:e,commandCount:t.size}}var ob=h(()=>{"use strict";c(sb,"buildWorkflowFiles")});function eo(r){let e=[];for(let{name:t,re:n}of ib)n.test(r)&&e.push(t);return e}var ib,$2,oc=h(()=>{"use strict";ib=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/}],$2=ib.map(r=>r.name);c(eo,"scanForSecrets")});import O$ from"node:path";function pb(r){let e=r.toLowerCase();return cb.exts.has(e)?"install poppler (`brew install poppler`) for PDF text, or convert it to .txt":lb.exts.has(e)?"install tesseract (`brew install tesseract`) for image OCR, or add a sidecar .txt note":ab.exts.has(e)?"rich-doc extraction needs macOS `textutil`; on other platforms convert to .txt/.md":"convert it to a supported text format (.txt/.md)"}async function mb(r,e=ub){let t=O$.extname(r).toLowerCase();for(let n of e)if(n.exts.has(t))try{let s=(await n.extract(r)).trim();if(s)return{text:s,tool:n.label}}catch{}return null}var pp,ab,cb,lb,ub,db,fb=h(()=>{"use strict";Ce();pp={timeout:3e4,maxBuffer:64*1024*1024},ab={label:"textutil",exts:new Set([".docx",".doc",".rtf",".rtfd",".html",".htm",".odt",".pages",".webarchive"]),async extract(r){if(process.platform!=="darwin")throw new Error("textutil is macOS-only");let{stdout:e}=await re("textutil",["-convert","txt","-stdout",r],pp);return e}},cb={label:"pdftotext",exts:new Set([".pdf"]),async extract(r){let{stdout:e}=await re("pdftotext",["-q","-nopgbrk",r,"-"],pp);return e}},lb={label:"tesseract",exts:new Set([".png",".jpg",".jpeg",".tif",".tiff",".bmp",".webp"]),async extract(r){let{stdout:e}=await re("tesseract",[r,"stdout"],pp);return e}},ub=[ab,cb,lb],db=new Set(ub.flatMap(r=>[...r.exts]));c(pb,"extractHint");c(mb,"extractText")});import un from"node:fs/promises";import to from"node:path";async function ui(r){await L$(r);let e=await P.readConfig(r).catch(()=>null);return await _.getWikiPath(r,e?.vaultPath)}async function L$(r){let e=await P.readConfig(r).catch(()=>null);if(e?.vaultPath&&e.vaultPath.trim().length>0)return{moved:!1,reason:"user-override"};let t=_.getLegacyWikiPath(r);if(!await hb(t))return{moved:!1,reason:"no-legacy"};let s=await _.getWikiPath(r);if(await hb(s))return console.error(`\u26A0 prjct: legacy wiki at ${t} was NOT migrated \u2014 ${s} already has content.
776
+ `),{files:e,commandCount:t.size}}var ob=h(()=>{"use strict";c(sb,"buildWorkflowFiles")});function eo(r){let e=[];for(let{name:t,re:n}of ib)n.test(r)&&e.push(t);return e}var ib,$2,oc=h(()=>{"use strict";ib=[{name:"sk-\u2026 token",re:/\bsk-[A-Za-z0-9_-]{16,}/},{name:"GitHub PAT",re:/\bghp_[A-Za-z0-9]{30,}/},{name:"GitHub server PAT",re:/\bghs_[A-Za-z0-9]{30,}/},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"Slack token",re:/\bxox[abps]-[A-Za-z0-9-]{10,}/},{name:"bearer JWT-ish",re:/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\b/}],$2=ib.map(r=>r.name);c(eo,"scanForSecrets")});import O$ from"node:path";function pb(r){let e=r.toLowerCase();return cb.exts.has(e)?"install poppler (`brew install poppler`) for PDF text, or convert it to .txt":lb.exts.has(e)?"install tesseract (`brew install tesseract`) for image OCR, or add a sidecar .txt note":ab.exts.has(e)?"rich-doc extraction needs macOS `textutil`; on other platforms convert to .txt/.md":"convert it to a supported text format (.txt/.md)"}async function mb(r,e=ub){let t=O$.extname(r).toLowerCase();for(let n of e)if(n.exts.has(t))try{let s=(await n.extract(r)).trim();if(s)return{text:s,tool:n.label}}catch{}return null}var pp,ab,cb,lb,ub,db,fb=h(()=>{"use strict";Re();pp={timeout:3e4,maxBuffer:64*1024*1024},ab={label:"textutil",exts:new Set([".docx",".doc",".rtf",".rtfd",".html",".htm",".odt",".pages",".webarchive"]),async extract(r){if(process.platform!=="darwin")throw new Error("textutil is macOS-only");let{stdout:e}=await re("textutil",["-convert","txt","-stdout",r],pp);return e}},cb={label:"pdftotext",exts:new Set([".pdf"]),async extract(r){let{stdout:e}=await re("pdftotext",["-q","-nopgbrk",r,"-"],pp);return e}},lb={label:"tesseract",exts:new Set([".png",".jpg",".jpeg",".tif",".tiff",".bmp",".webp"]),async extract(r){let{stdout:e}=await re("tesseract",[r,"stdout"],pp);return e}},ub=[ab,cb,lb],db=new Set(ub.flatMap(r=>[...r.exts]));c(pb,"extractHint");c(mb,"extractText")});import un from"node:fs/promises";import to from"node:path";async function ui(r){await L$(r);let e=await P.readConfig(r).catch(()=>null);return await _.getWikiPath(r,e?.vaultPath)}async function L$(r){let e=await P.readConfig(r).catch(()=>null);if(e?.vaultPath&&e.vaultPath.trim().length>0)return{moved:!1,reason:"user-override"};let t=_.getLegacyWikiPath(r);if(!await hb(t))return{moved:!1,reason:"no-legacy"};let s=await _.getWikiPath(r);if(await hb(s))return console.error(`\u26A0 prjct: legacy wiki at ${t} was NOT migrated \u2014 ${s} already has content.
777
777
  Merge manually or set \`vaultPath\` in .prjct/prjct.config.json to choose one.`),{moved:!1,reason:"conflict",from:t,to:s};await un.mkdir(to.dirname(s),{recursive:!0});let i=await F$(t,s);return await H$(r),console.error(`\u2139 prjct: migrated Obsidian vault
778
778
  from: ${_.getDisplayPath(t)}
779
779
  to: ${_.getDisplayPath(s)}
@@ -785,7 +785,7 @@ ${gb}
785
785
  `),p=eo(d);if(p.length>0&&!e.force){n.skipped.push({file:a,reason:`secret-like content (${p.join(", ")}). Remove or re-run with --force.`});continue}let m=Js(d);if(m.length>0&&!e.force){n.skipped.push({file:a,reason:`prompt-injection-like content (${m.join(", ")}). Notes are inlined into LLM context \u2014 refuse by default. Remove or re-run with --force.`});continue}for(let f of u.entries)await N.remember(r,{type:f.type,content:f.content,tags:f.tags});await Tb(i,o,a),n.ingested+=u.entries.length}catch(l){n.errors.push({file:a,error:l instanceof Error?l.message:String(l)})}}return n}function q$(r,e){let t=vt.extname(r).toLowerCase(),n=B$.has(t),s=/^---\s*\r?\n/.test(e);if(n&&s){let i=z$(e);return i.ok?{ok:!0,entries:[i.note]}:{ok:!1,error:i.error}}let o=e.trim();return o?{ok:!0,entries:Eb(r,o)}:{ok:!1,error:"empty file"}}function Eb(r,e,t={}){let n={file:r,origin:"ingest",...t},s=V$(e.trim());if(s.length===1)return[{type:wb,tags:n,content:s[0]}];let o=J$(r);return s.map((i,a)=>({type:wb,tags:{...n,doc:o,part:`${a+1}/${s.length}`},content:i}))}function V$(r){if(r.length<=kb)return[r];let e=r.split(/\r?\n\s*\r?\n/),t=[],n="",s=c(()=>{n.trim()&&t.push(n.trim()),n=""},"flush");for(let o of e){let i=o.trim();if(i){if(i.length>kb){s();for(let a=0;a<i.length;a+=gp)t.push(i.slice(a,a+gp));continue}n&&n.length+i.length+2>gp&&s(),n=n?`${n}
786
786
 
787
787
  ${i}`:i}}return s(),t.length>0?t:[r]}function J$(r){return r.toLowerCase().replace(/\.[^.]+$/,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"doc"}async function kp(r){let e=await vb(r);await Dt.mkdir(e,{recursive:!0});let t=vt.join(e,ic);await Dt.stat(t).then(()=>!0,()=>!1)||await Dt.writeFile(t,K$,"utf-8")}async function X$(r){let e;try{e=await Dt.readdir(r)}catch{return[]}let t=[];for(let n of e){if(n.startsWith(".")||n===yp||n===ic)continue;let s=vt.extname(n).toLowerCase();!bb.has(s)&&!db.has(s)||t.push(vt.join(r,n))}return t}async function Tb(r,e,t){await Dt.mkdir(e,{recursive:!0});let n=vt.join(e,t);await Dt.rename(r,n)}function Cb(){let r=new Date,e=c(t=>String(t).padStart(2,"0"),"pad");return`${r.getUTCFullYear()}${e(r.getUTCMonth()+1)}${e(r.getUTCDate())}-${e(r.getUTCHours())}${e(r.getUTCMinutes())}${e(r.getUTCSeconds())}`}function z$(r){let e=r.match(/^---\s*\r?\n([\s\S]*?)\r?\n---\s*\r?\n?([\s\S]*)$/);if(!e)return{ok:!1,error:"no frontmatter (expected leading `---` block)"};let[,t,n]=e,{type:s,tags:o,error:i}=Y$(t);if(i)return{ok:!1,error:i};if(!s)return{ok:!1,error:"missing `type` in frontmatter"};if(!/^[a-z][a-z0-9-]*$/.test(s))return{ok:!1,error:`invalid type '${s}'. Lowercase letters + dashes only. Base types: ${zs.join(", ")}`};let a=n.trim();return a?{ok:!0,note:{type:s,tags:o,content:a}}:{ok:!1,error:"body is empty"}}function Y$(r){let e=r.split(/\r?\n/),t,n={},s=!1;for(let o of e){if(o.trim()==="")continue;if(s&&/^\s+/.test(o)){let u=o.trim(),d=u.indexOf(":");if(d>0){let p=u.slice(0,d).trim(),m=hp(u.slice(d+1).trim());p&&(n[p]=m)}continue}s=!1;let i=o.indexOf(":");if(i<=0)continue;let a=o.slice(0,i).trim(),l=hp(o.slice(i+1).trim());if(a==="type")t=l.toLowerCase();else if(a==="tags")if(l)for(let u of l.split(",")){let d=u.trim(),p=d.indexOf("="),m=d.indexOf(":"),f=p>0?p:m;f<=0||(n[d.slice(0,f).trim()]=d.slice(f+1).trim())}else s=!0}return{type:t,tags:n}}function hp(r){return r.startsWith('"')&&r.endsWith('"')||r.startsWith("'")&&r.endsWith("'")?r.slice(1,-1):r}async function bp(r,e){let t={ingested:[],skipped:[],errors:[]},n=e!==void 0?e:await P.readConfig(r).catch(()=>null);if(!n?.projectId)return t;let s=n.projectId,o=await Sb(r),i=await eI(o);if(i.length===0)return t;let a=vt.join(o,yp,Cb());for(let l of i){let u=vt.basename(l);try{let d=await Dt.readFile(l,"utf-8"),p=Z$(d);if(!p.ok){t.skipped.push({file:u,reason:p.error});continue}let m=p.workflow,f=oe.getRulesForCommand(s,m.command);for(let y of f)oe.removeRule(s,y.id);for(let y of m.rules)oe.addRule(s,{type:y.type,command:m.command,position:y.position,action:y.action,description:y.description,enabled:!0,timeoutMs:6e4,sortOrder:y.sortOrder,createdAt:new Date().toISOString(),trustSource:"imported"});await Tb(l,a,u),t.ingested.push({command:m.command,rulesReplaced:m.rules.length})}catch(d){t.errors.push({file:u,error:d instanceof Error?d.message:String(d)})}}return t}async function vp(r){let e=await Sb(r);await Dt.mkdir(e,{recursive:!0});let t=vt.join(e,ic);await Dt.stat(t).then(()=>!0,()=>!1)||await Dt.writeFile(t,Q$,"utf-8")}function Z$(r){let e=r.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);if(!e)return{ok:!1,error:"missing frontmatter (---name: foo---)"};let t=e[1],n=e[2],s=t.match(/^\s*name\s*:\s*(\S+)/m);if(!s)return{ok:!1,error:"frontmatter missing 'name' field"};let o=hp(s[1].trim()),i=[],a={gates:{type:"gate",position:"before"},steps:{type:"step",position:"before"},hooks:{type:"hook",position:"before"},instructions:{type:"instruction",position:"before"}},l=/^##\s+(\w+)/gm,u=[...n.matchAll(l)];for(let d=0;d<u.length;d++){let p=u[d],m=p[1].toLowerCase(),f=a[m];if(!f)continue;let y=p.index+p[0].length,v=d+1<u.length?u[d+1].index:n.length,k=n.slice(y,v),b=0;for(let C of k.split(`
788
- `)){let R=C.trim();if(!R.startsWith("-"))continue;let D=R.replace(/^-\s*/,""),V=D.match(/^`([^`]+)`(?:\s*[—-]+\s*(.+))?$/),M="",Y=null;V?(M=V[1].trim(),Y=(V[2]??"").trim()||null):M=D.trim(),M&&(i.push({type:f.type,action:M,description:Y,sortOrder:b,position:f.position,whenExpr:null}),b+=1)}}return i.length===0?{ok:!1,error:"no rules found (expected ## Gates / ## Steps / ## Hooks / ## Instructions)"}:{ok:!0,workflow:{command:o,rules:i}}}async function eI(r){let e;try{e=await Dt.readdir(r)}catch{return[]}let t=[];for(let n of e){if(n.startsWith(".")||n.startsWith("_")||n===ic||n==="index.md"||!n.endsWith(".md"))continue;let s=vt.join(r,n);(await Dt.stat(s)).isFile()&&t.push(s)}return t}var W$,G$,yp,ic,bb,B$,wb,kb,gp,K$,Q$,ac=h(()=>{"use strict";Q();Ys();Ee();Zn();Zo();oc();fb();fp();W$="captured",G$="workflows",yp="_ingested",ic="README.md",bb=new Set([".md",".markdown",".mdx",".txt",".text",".json",".yaml",".yml",".csv",".tsv",".log",".rst",".org"]),B$=new Set([".md",".markdown",".mdx"]),wb="source",kb=2200,gp=1500;c(vb,"resolveCapturedRoot");c(Sb,"resolveWorkflowsRoot");c(wp,"ingestCapturedNotes");c(q$,"buildEntries");c(Eb,"buildDocEntries");c(V$,"chunkText");c(J$,"slugifyName");c(kp,"ensureCapturedReadme");K$=`# Captured notes (Obsidian dropzone)
788
+ `)){let R=C.trim();if(!R.startsWith("-"))continue;let D=R.replace(/^-\s*/,""),V=D.match(/^`([^`]+)`(?:\s*[—-]+\s*(.+))?$/),M="",Y=null;V?(M=V[1].trim(),Y=(V[2]??"").trim()||null):M=D.trim(),M&&(i.push({type:f.type,action:M,description:Y,sortOrder:b,position:f.position,whenExpr:null}),b+=1)}}return i.length===0?{ok:!1,error:"no rules found (expected ## Gates / ## Steps / ## Hooks / ## Instructions)"}:{ok:!0,workflow:{command:o,rules:i}}}async function eI(r){let e;try{e=await Dt.readdir(r)}catch{return[]}let t=[];for(let n of e){if(n.startsWith(".")||n.startsWith("_")||n===ic||n==="index.md"||!n.endsWith(".md"))continue;let s=vt.join(r,n);(await Dt.stat(s)).isFile()&&t.push(s)}return t}var W$,G$,yp,ic,bb,B$,wb,kb,gp,K$,Q$,ac=h(()=>{"use strict";Q();Ys();Te();Zn();Zo();oc();fb();fp();W$="captured",G$="workflows",yp="_ingested",ic="README.md",bb=new Set([".md",".markdown",".mdx",".txt",".text",".json",".yaml",".yml",".csv",".tsv",".log",".rst",".org"]),B$=new Set([".md",".markdown",".mdx"]),wb="source",kb=2200,gp=1500;c(vb,"resolveCapturedRoot");c(Sb,"resolveWorkflowsRoot");c(wp,"ingestCapturedNotes");c(q$,"buildEntries");c(Eb,"buildDocEntries");c(V$,"chunkText");c(J$,"slugifyName");c(kp,"ensureCapturedReadme");K$=`# Captured notes (Obsidian dropzone)
789
789
 
790
790
  Drop a file here, run \`prjct context wiki sync\`, and it becomes project
791
791
  memory \u2014 searchable and vectorized into the DB. Processed files move to
@@ -833,7 +833,7 @@ ${zs.map(r=>`- \`${r}\``).join(`
833
833
  - Secret-like content (API keys, JWTs) is refused unless you pass
834
834
  \`--force\` to \`prjct context wiki sync\`.
835
835
  - Files already in \`_ingested/\` are ignored.
836
- `;c(X$,"listNoteFiles");c(Tb,"moveToArchive");c(Cb,"timestampSlug");c(z$,"parseNote");c(Y$,"parseFrontmatter");c(hp,"stripQuotes");c(bp,"ingestWorkflowEdits");c(vp,"ensureWorkflowsReadme");Q$='# Workflows (Obsidian dropzone)\n\nDrop a markdown file here to OVERRIDE a workflow\'s rules in SQLite. Format:\n\n```markdown\n---\nname: ship\n---\n\n## Gates\n- `git branch --show-current | grep -vE "^(main|master)$"` \u2014 Prevent shipping from main branch\n\n## Steps\n- `version:bump` \u2014 Bump version (stack-aware)\n- `changelog:add` \u2014 Append CHANGELOG entry\n- `git:commit` \u2014 Commit ship\n- `git:push` \u2014 Push to origin\n```\n\n## How it works\n\n1. You drop `workflows/<name>.md` here.\n2. Stop hook (or `prjct context wiki sync`) reads it.\n3. ALL existing rules for that workflow are deleted from SQLite.\n4. New rules from your file are inserted.\n5. Wiki regenerates \u2192 `_generated/workflows/<name>.md` reflects your edits.\n6. Your file moves to `_ingested/<timestamp>/` so this folder stays clean.\n\n## Schema\n\n- Frontmatter `name:` is required (the workflow command: ship, task, sync, \u2026)\n- Sections: `## Gates`, `## Steps`, `## Hooks`, `## Instructions` (any subset)\n- Each bullet: `- \\`<action>\\` \u2014 <description>` (description optional)\n- Order within a section is preserved as sortOrder\n\n## Notes\n\n- This is destructive: SQLite rules for the named workflow are REPLACED, not merged.\n- To restore a built-in workflow, run `prjct workflow reset <name>`.\n- `README.md` and `index.md` are ignored.\n- Files in `_ingested/` are ignored.\n';c(Z$,"parseWorkflowMarkdown");c(eI,"listWorkflowFiles")});import{z as Te}from"zod";var Rr,tI,nI,er,cc=h(()=>{"use strict";Rr=["draft","reviewed","in_progress","shipped","archived"],tI=Te.object({verdict:Te.enum(["pass","fail"]),notes:Te.string(),ts:Te.string()}),nI=Te.object({risk:Te.string().min(1),mitigation:Te.string().min(1)}),er=Te.object({goal:Te.string().min(1),eli10:Te.string().default(""),stakes:Te.string().default(""),acceptance_criteria:Te.array(Te.string().min(1)).default([]),scope:Te.array(Te.string()).default([]),out_of_scope:Te.array(Te.string()).default([]),risks:Te.array(nI).default([]),test_plan:Te.array(Te.string()).default([]),reviews:Te.record(Te.string(),tI).optional(),selected_reviewers:Te.array(Te.string()).default([]),linked_tasks:Te.array(Te.string()).default([]),notes:Te.string().default(""),tasks_created_at:Te.string().nullable().default(null)})});var xb={};A(xb,{specStorage:()=>Ae});var Sp,Ae,di=h(()=>{"use strict";Xn();cc();le();X();Sp=class{static{c(this,"SpecStorage")}nextUpdatedAt(e,t){let n=T(),o=S.get(e,"SELECT updated_at FROM specs WHERE id = ?",t)?.updated_at;return!o||n>o?n:new Date(new Date(o).getTime()+1).toISOString()}create(e,t){let n=Ke(),s=T(),o=er.parse(t.content);return S.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
836
+ `;c(X$,"listNoteFiles");c(Tb,"moveToArchive");c(Cb,"timestampSlug");c(z$,"parseNote");c(Y$,"parseFrontmatter");c(hp,"stripQuotes");c(bp,"ingestWorkflowEdits");c(vp,"ensureWorkflowsReadme");Q$='# Workflows (Obsidian dropzone)\n\nDrop a markdown file here to OVERRIDE a workflow\'s rules in SQLite. Format:\n\n```markdown\n---\nname: ship\n---\n\n## Gates\n- `git branch --show-current | grep -vE "^(main|master)$"` \u2014 Prevent shipping from main branch\n\n## Steps\n- `version:bump` \u2014 Bump version (stack-aware)\n- `changelog:add` \u2014 Append CHANGELOG entry\n- `git:commit` \u2014 Commit ship\n- `git:push` \u2014 Push to origin\n```\n\n## How it works\n\n1. You drop `workflows/<name>.md` here.\n2. Stop hook (or `prjct context wiki sync`) reads it.\n3. ALL existing rules for that workflow are deleted from SQLite.\n4. New rules from your file are inserted.\n5. Wiki regenerates \u2192 `_generated/workflows/<name>.md` reflects your edits.\n6. Your file moves to `_ingested/<timestamp>/` so this folder stays clean.\n\n## Schema\n\n- Frontmatter `name:` is required (the workflow command: ship, task, sync, \u2026)\n- Sections: `## Gates`, `## Steps`, `## Hooks`, `## Instructions` (any subset)\n- Each bullet: `- \\`<action>\\` \u2014 <description>` (description optional)\n- Order within a section is preserved as sortOrder\n\n## Notes\n\n- This is destructive: SQLite rules for the named workflow are REPLACED, not merged.\n- To restore a built-in workflow, run `prjct workflow reset <name>`.\n- `README.md` and `index.md` are ignored.\n- Files in `_ingested/` are ignored.\n';c(Z$,"parseWorkflowMarkdown");c(eI,"listWorkflowFiles")});import{z as Ce}from"zod";var Rr,tI,nI,er,cc=h(()=>{"use strict";Rr=["draft","reviewed","in_progress","shipped","archived"],tI=Ce.object({verdict:Ce.enum(["pass","fail"]),notes:Ce.string(),ts:Ce.string()}),nI=Ce.object({risk:Ce.string().min(1),mitigation:Ce.string().min(1)}),er=Ce.object({goal:Ce.string().min(1),eli10:Ce.string().default(""),stakes:Ce.string().default(""),acceptance_criteria:Ce.array(Ce.string().min(1)).default([]),scope:Ce.array(Ce.string()).default([]),out_of_scope:Ce.array(Ce.string()).default([]),risks:Ce.array(nI).default([]),test_plan:Ce.array(Ce.string()).default([]),reviews:Ce.record(Ce.string(),tI).optional(),selected_reviewers:Ce.array(Ce.string()).default([]),linked_tasks:Ce.array(Ce.string()).default([]),notes:Ce.string().default(""),tasks_created_at:Ce.string().nullable().default(null)})});var xb={};A(xb,{specStorage:()=>Ae});var Sp,Ae,di=h(()=>{"use strict";Xn();cc();le();X();Sp=class{static{c(this,"SpecStorage")}nextUpdatedAt(e,t){let n=T(),o=S.get(e,"SELECT updated_at FROM specs WHERE id = ?",t)?.updated_at;return!o||n>o?n:new Date(new Date(o).getTime()+1).toISOString()}create(e,t){let n=Ke(),s=T(),o=er.parse(t.content);return S.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
837
837
  VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,t.title,JSON.stringify(o),t.tags?JSON.stringify(t.tags):null,s,s),{id:n,title:t.title,status:"draft",content:o,tags:t.tags??{},createdAt:s,updatedAt:s,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null}}get(e,t){let n=S.get(e,"SELECT * FROM specs WHERE id = ?",t);return n?this.rowToSpec(n):null}list(e,t={}){let n="SELECT * FROM specs WHERE 1=1",s=[];return t.status&&(n+=" AND status = ?",s.push(t.status)),!t.includeArchived&&!t.status&&(n+=" AND status != 'archived'"),n+=" ORDER BY created_at DESC",S.query(e,n,...s).map(i=>this.rowToSpec(i))}search(e,t){let n=`%${t}%`;return S.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(o=>this.rowToSpec(o))}updateContent(e,t,n){let s=er.parse(n),o=this.nextUpdatedAt(e,t);return S.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(s),o,t),this.get(e,t)}casUpdate(e,t,n,s){let o=er.parse(n),i=this.nextUpdatedAt(e,t);return S.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(o),i,t,s).changes===1}setStatus(e,t,n){if(!Rr.includes(n))throw new Error(`invalid spec status: ${n}`);let s=this.nextUpdatedAt(e,t),o=[],i=[n,s];n==="shipped"&&(o.push("shipped_at = ?"),i.push(s)),n==="archived"&&(o.push("archived_at = ?"),i.push(s));let a=["status = ?","updated_at = ?",...o].join(", ");return i.push(t),S.run(e,`UPDATE specs SET ${a} WHERE id = ?`,...i),this.get(e,t)}setShippedPr(e,t,n){return S.run(e,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}setShippedSha(e,t,n){return S.run(e,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}linkTask(e,t,n){let s=this.get(e,t);if(!s)return null;if(s.content.linked_tasks.includes(n))return s;let o={...s.content,linked_tasks:[...s.content.linked_tasks,n]};return this.updateContent(e,t,o)}delete(e,t){return this.get(e,t)?(S.run(e,"DELETE FROM specs WHERE id = ?",t),!0):!1}count(e){let t=S.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),n={total:0,draft:0,shipped:0};for(let s of t)n.total+=s.n,s.status==="draft"&&(n.draft=s.n),s.status==="shipped"&&(n.shipped=s.n);return n}rowToSpec(e){return{id:e.id,title:e.title,status:Rr.includes(e.status)?e.status:"draft",content:er.parse(JSON.parse(e.content)),tags:e.tags?JSON.parse(e.tags):{},createdAt:e.created_at,updatedAt:e.updated_at,shippedAt:e.shipped_at,shippedPr:e.shipped_pr,shippedSha:e.shipped_sha,archivedAt:e.archived_at}}},Ae=new Sp});import{z as x}from"zod";var rI,lc,sI,oI,Ep,Ab,jb,_b,$b,Pb,iI,aI,cI,Ib,lI,Db,uc=h(()=>{"use strict";Ts();rI=x.enum(["low","medium","high","critical"]),lc=x.enum(["feature","bug","improvement","chore"]),sI=x.enum(["active","backlog","previously_active"]),oI=x.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Ep=x.object({title:x.string(),description:x.string(),filesChanged:x.array(x.object({path:x.string(),action:x.enum(["created","modified","deleted"])})),whatWasDone:x.array(x.string()).min(1),outputForNextAgent:x.string().min(1),notes:x.string().optional()}),Ab=x.object({output:x.string().min(1,"Subtask output is required"),summary:Ep}),jb=x.object({id:x.string(),description:x.string(),domain:x.string(),agent:x.string(),status:oI,dependsOn:x.array(x.string()),startedAt:x.string().optional(),completedAt:x.string().optional(),output:x.string().optional(),summary:Ep.optional(),skipReason:x.string().optional(),blockReason:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional()}),_b=x.object({completed:x.number(),total:x.number(),percentage:x.number()}),$b=x.object({id:x.string(),description:x.string(),type:lc.optional(),startedAt:x.string(),sessionId:x.string(),featureId:x.string().optional(),subtasks:x.array(jb).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:_b.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),linkedSpecId:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:Lo.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional(),parentDescription:x.string().optional(),branch:x.string().optional(),prUrl:x.string().optional()}),Pb=x.object({id:x.string(),description:x.string(),status:x.literal("paused"),startedAt:x.string(),pausedAt:x.string(),pauseReason:x.string().optional(),type:lc.optional(),sessionId:x.string().optional(),featureId:x.string().optional(),subtasks:x.array(jb).optional(),currentSubtaskIndex:x.number().optional(),subtaskProgress:_b.optional(),linearId:x.string().optional(),linearUuid:x.string().optional(),estimatedPoints:x.number().optional(),estimatedMinutes:x.number().optional(),modelMetadata:Lo.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional()}),iI=x.object({stackConfirmed:x.array(x.string()).optional(),patternsDiscovered:x.array(x.string()).optional(),agentAccuracy:x.array(x.object({agent:x.string(),rating:x.enum(["helpful","neutral","inaccurate"]),note:x.string().optional()})).optional(),issuesEncountered:x.array(x.string()).optional()}),aI=x.object({taskId:x.string(),title:x.string(),classification:lc,startedAt:x.string(),completedAt:x.string(),subtaskCount:x.number(),subtaskSummaries:x.array(Ep),outcome:x.string(),branchName:x.string(),linearId:x.string().optional(),linearUuid:x.string().optional(),prUrl:x.string().optional(),feedback:iI.optional(),tokensIn:x.number().optional(),tokensOut:x.number().optional()}),cI=$b.extend({workspaceId:x.string(),worktreePath:x.string().optional(),agentSessionId:x.string().optional(),jiraId:x.string().optional(),jiraUuid:x.string().optional(),dispatchedFrom:x.string().optional()}),Ib=x.object({currentTask:$b.nullable(),previousTask:Pb.nullable().optional(),pausedTasks:x.array(Pb).optional(),taskHistory:x.array(aI).optional(),activeTasks:x.array(cI).optional(),lastUpdated:x.string()}),lI=x.object({id:x.string(),description:x.string(),body:x.string().optional(),priority:rI,type:lc,featureId:x.string().optional(),originFeature:x.string().optional(),completed:x.boolean(),completedAt:x.string().optional(),createdAt:x.string(),section:sI,agent:x.string().optional(),groupName:x.string().optional(),groupId:x.string().optional()}),Db=x.object({tasks:x.array(lI),lastUpdated:x.string()})});function Nb(r){return[...r].sort((e,t)=>{let n=Ob[e.section]-Ob[t.section];return n!==0?n:Mb[e.priority]-Mb[t.priority]})}function Tp(r,e){let t=new Set;return r.filter(n=>{let s=e(n);return t.has(s)?!1:(t.add(s),!0)})}var Mb,Ob,Cp=h(()=>{"use strict";Mb={critical:0,high:1,medium:2,low:3},Ob={active:0,previously_active:1,backlog:2};c(Nb,"sortBySectionAndPriority");c(Tp,"uniqueBy")});var Lb={};A(Lb,{queueStorage:()=>St});var Rp,St,Zr=h(()=>{"use strict";Xn();uc();Cp();le();vr();Er();Rp=class extends ct{static{c(this,"QueueStorage")}constructor(){super("queue.json",Db)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(n=>n.section==="active"&&!n.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(n=>n.section==="backlog"&&!n.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return Nb(t)[0]||null}async addTask(e,t){let n={...t,id:Ke(),createdAt:T(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,n],lastUpdated:T()})),await this.publishEvent(e,"queue.task_added",{taskId:n.id,description:n.description,priority:n.priority,section:n.section}),n}async addTasks(e,t){let n=T(),s=t.map(o=>({...o,id:Ke(),createdAt:n,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:n})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(o=>({id:o.id,description:o.description}))}),s}async removeTask(e,t){await this.update(e,n=>({tasks:n.tasks.filter(s=>s.id!==t),lastUpdated:T()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async deleteByFeatureId(e,t){let n=0;return await this.update(e,s=>{let o=s.tasks.length,i=s.tasks.filter(a=>a.featureId!==t);return n=o-i.length,{tasks:i,lastUpdated:T()}}),n>0&&await this.publishEvent(e,"queue.tasks_removed_by_feature",{featureId:t,count:n}),n}async completeTask(e,t){let n=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(n={...i,completed:!0,completedAt:T()},n):i),lastUpdated:T()})),n){let s=n;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return n}async moveToSection(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:n}:o),lastUpdated:T()}))}async setPriority(e,t,n){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:T()}))}async getTask(e,t){return(await this.read(e)).tasks.find(s=>s.id===t)||null}async updateTask(e,t,n){let s=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(s={...i,...n},s):i),lastUpdated:T()})),s&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),s}async clearCompleted(e){let n=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(o=>!o.completed),lastUpdated:T()})),n}async removeStaleCompleted(e){let t=await this.read(e),n=Ms(zn.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<n);if(s.length===0)return 0;gt.archiveMany(e,s.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:T()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}},St=new Rp});var Fb={};A(Fb,{CREW_RUN_KEY_PREFIX:()=>Ap,CrewRunSchema:()=>xp,crewRunStorage:()=>pc,default:()=>jp});import{z as dn}from"zod";function dc(r){return`${Ap}${r}`}var Ap,xp,Pp,pc,jp,mc=h(()=>{"use strict";Xn();le();X();Ap="crew-run:",xp=dn.object({id:dn.string().min(1),spec_id:dn.string().nullable().default(null),task_id:dn.string().nullable().default(null),started_at:dn.string().min(1),ended_at:dn.string().min(1),implementer_summary:dn.string().default(""),files_touched:dn.array(dn.string()).default([]),reviewer_verdict:dn.enum(["APPROVED","CHANGES_REQUESTED"]),reviewer_notes:dn.string().nullable().default(null)});c(dc,"keyFor");Pp=class{static{c(this,"CrewRunStorage")}record(e,t){let n=t.runId??Ke(),s=S.getDoc(e,dc(n));if(s)return s;let o=T(),i=xp.parse({id:n,spec_id:t.specId??null,task_id:t.taskId??null,started_at:t.startedAt??o,ended_at:t.endedAt??o,implementer_summary:t.implementerSummary,files_touched:t.filesTouched,reviewer_verdict:t.reviewerVerdict,reviewer_notes:t.reviewerNotes??null});return S.setDoc(e,dc(n),i),i}get(e,t){return S.getDoc(e,dc(t))}list(e){return S.listDocsByPrefix(e,Ap).map(n=>xp.parse(n.data))}delete(e,t){S.deleteDoc(e,dc(t))}},pc=new Pp,jp=pc});var Hb={};A(Hb,{TEAM_ENROLLMENT_KEY:()=>fc,TeamEnrollmentSchema:()=>_p,default:()=>hc,serializeCanonical:()=>gc,teamEnrollmentStorage:()=>no});import{z as pi}from"zod";function gc(r){let e=Object.keys(r).sort(),t={};for(let n of e)t[n]=r[n];return JSON.stringify(t)}var fc,_p,$p,no,hc,yc=h(()=>{"use strict";X();fc="team:enrollment",_p=pi.object({required:pi.boolean(),minVersion:pi.string().min(1),enrolledAt:pi.string().min(1),enrolledBy:pi.string().nullable().default(null)}),$p=class{static{c(this,"TeamEnrollmentStorage")}get(e){let t=S.getDoc(e,fc);return t===null?null:_p.parse(t)}set(e,t){let n=_p.parse(t);S.setDoc(e,fc,n)}clear(e){S.deleteDoc(e,fc)}};c(gc,"serializeCanonical");no=new $p,hc=no});var xr={};A(xr,{generateWiki:()=>Mp,regenerateWikiDeferred:()=>mi});import Ip from"node:fs/promises";import Dp from"node:path";function Ub(r,e,t){let n=Date.now();try{let s=e(),o=Date.now()-n;return console.log(JSON.stringify({builder:r,status:"ok",ms:o})),{result:s,ok:!0,ms:o}}catch(s){let o=Date.now()-n,i=s instanceof Error?s.message:String(s);return console.log(JSON.stringify({builder:r,status:"error",ms:o,error:i})),{result:t(s),ok:!1,ms:o}}}async function Mp(r,e){let t=await ui(r),n=Dp.join(t,wc);await Ip.mkdir(n,{recursive:!0});let s=Dp.join(n,ip),o=await Mk(r,e);if(await Ip.readFile(s,"utf-8").catch(()=>null)===o){let U=await ap(n);return{wikiRoot:t,filesWritten:0,filesSkipped:Object.keys(U).length,filesRemoved:0}}let{specStorage:a}=await Promise.resolve().then(()=>(di(),xb)),{queueStorage:l}=await Promise.resolve().then(()=>(Zr(),Lb)),{default:u}=await Promise.resolve().then(()=>(mc(),Fb)),{teamEnrollmentStorage:d}=await Promise.resolve().then(()=>(yc(),Hb)),[p,m,f,y,v,k,b]=await Promise.all([Sk.getAll(e),Promise.resolve(N.allEntriesForIndex(e)),Ze.getActive(e).catch(()=>null),Promise.resolve(ht.getActive(e)).catch(()=>null),Promise.resolve(oe.getAllRules(e)).catch(()=>[]),Promise.resolve(a.list(e,{includeArchived:!0})).catch(()=>[]),l.getTasks(e).catch(()=>[])]),C=(()=>{try{return u.list(e)}catch{return[]}})(),R=(()=>{try{return d.get(e)}catch{return null}})(),D=m.filter(U=>U.type!=="shipped"),V=D.filter(Cr),M=D.filter(U=>!Cr(U)),Y=new Map;for(let U of p)Y.set(`ships/${lt(U.name)}.md`,zk(U));for(let[U,ye]of Yk(D,m))Y.set(U,ye);for(let[U,ye]of Qk(D,m))Y.set(U,ye);let Fn=Xk(m),ar=Kk(V,Fn);ar&&Y.set("signals.md",ar);for(let[U,ye]of nb(k,b,Fn))Y.set(U,ye);let Ss=Ub("crew-runs",()=>uI(C),()=>new Map);for(let[U,ye]of Ss.result)Y.set(U,ye);let Gt=Ub("team",()=>dI(R),()=>null);Gt.result!==null&&Y.set("team.md",Gt.result);let vn=y?.patterns??f?.patterns??[],cr=y?.antiPatterns??f?.antiPatterns??[],Fr=Hk(vn,cr);Fr&&Y.set("patterns.md",Fr);let Zt=(y?Uk(y):null)??Ak(D);Zt&&Y.set("architecture.md",Zt);let Qi=Ik(D);if(Qi&&Y.set("developer.md",Qi),y){let U=Wk(y);U&&Y.set("tech-debt.md",U);let ye=Gk(y);ye&&Y.set("insights.md",ye)}let Zi=sb(v);for(let[U,ye]of Zi.files)Y.set(U,ye);let hu=Zi.commandCount,ea=ht.getAllFull(e);for(let[U,ye]of _k(ea))Y.set(U,ye);let Do=await eb(r);for(let[U,ye]of Do)Y.set(U,ye);let yu=Do.size>0?Do.size-1:0,de=new Map;for(let U of M)de.set(U.type,(de.get(U.type)??0)+1);let Mo=new Map;for(let U of Y.keys()){let ye=U.match(/^tags\/(.+)\.md$/);ye&&Mo.set(ye[1],0)}for(let U of M)for(let ye of Object.keys(U.tags)){let Sn=lt(ye);Mo.has(Sn)&&Mo.set(Sn,(Mo.get(Sn)??0)+1)}let iy=c(U=>({slug:Fn.idSlugIndex?.get(U.id)??"",title:Fn.idTitleIndex?.get(U.id)??U.id}),"noteRef");Y.set("index.md",Lk({ships:p,memoryTypeCounts:de,tagKeyCounts:Mo,patternsCount:vn.length,antiPatternsCount:cr.length,llmAnalysis:y,archiveCount:op(ea).size,releaseCount:yu,workflowCount:hu,signalsCount:V.length,recentDecisions:M.filter(U=>U.type==="decision").slice(0,5).map(iy).filter(U=>U.slug),topGotchas:M.filter(U=>U.type==="gotcha").slice(0,5).map(iy).filter(U=>U.slug)}));let ay=await ap(n),ta={},wu=0,cy=0,ku=0,bu=[];for(let[U,ye]of Y){let Sn=Ck(ye);if(ta[U]=Sn,ay[U]===Sn){cy++;continue}bu.push([U,ye])}let na=64;for(let U=0;U<bu.length;U+=na){let ye=bu.slice(U,U+na);await Promise.all(ye.map(([Sn,rA])=>li(n,Sn,rA))),wu+=ye.length}let vu=[];for(let U of Object.keys(ay))ta[U]||vu.push(U);for(let U=0;U<vu.length;U+=na){let ye=vu.slice(U,U+na);await Promise.all(ye.map(Sn=>qk(n,Sn))),ku+=ye.length}let tA=await Vk(n,ta);ku+=tA,await li(n,tc,`${JSON.stringify(ta,null,2)}
838
838
  `),await li(n,ip,o);let nA=Dp.join(t,"README.md");return await Ip.stat(nA).then(()=>!0,()=>!1)||(await li(t,"README.md",`# Project Wiki
839
839
 
@@ -845,8 +845,8 @@ Open this folder as an Obsidian vault to browse project memory.
845
845
  `),wu++),await kp(r),await vp(r),await Ek(t).catch(()=>{}),{wikiRoot:t,filesWritten:wu,filesSkipped:cy,filesRemoved:ku}}function uI(r){let e=new Map;for(let t of r){let n=t.spec_id??t.task_id??t.id,s=t.started_at.replace(/[:.]/g,"-"),o=`crew-runs/${n}-${s}.md`,i=[`# Crew run \u2014 ${n}`,"",`- **run-id**: \`${t.id}\``,`- **spec**: ${t.spec_id?`\`${t.spec_id}\``:"_(none)_"}`,`- **task**: ${t.task_id?`\`${t.task_id}\``:"_(none)_"}`,`- **started**: ${t.started_at}`,`- **ended**: ${t.ended_at}`,`- **verdict**: **${t.reviewer_verdict}**`,"","## Implementer summary","",t.implementer_summary,"","## Files touched","",t.files_touched.length===0?"_(none recorded)_":t.files_touched.map(a=>`- \`${a}\``).join(`
846
846
  `),...t.reviewer_notes?["","## Reviewer notes","",t.reviewer_notes]:[],""].join(`
847
847
  `);e.set(o,i)}return e}function dI(r){return r===null?null:["# Team enrollment","",`- **required**: ${r.required}`,`- **minVersion**: \`${r.minVersion}\``,`- **enrolledAt**: ${r.enrolledAt}`,`- **enrolledBy**: ${r.enrolledBy??"_(unspecified)_"}`,"",'Authoritative source: `kv_store["team:enrollment"]`. The `.prjct/team.json` file in the repo is a derived mirror written atomically by `prjct team` (the pre-commit hook reads it because it must work before prjct is installed). Do not hand-edit the mirror \u2014 run `prjct team check` to detect/heal drift.',""].join(`
848
- `)}async function mi(r,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{Mp(r,e).catch(()=>{})});return}try{await Mp(r,e)}catch{}}var wc,$n=h(()=>{"use strict";Ee();Tr();Yr();Qr();Zn();Tk();_n();jk();$k();Dk();Ok();Fk();Bk();Jk();Zk();tb();cp();rb();ob();ac();fp();wc="_generated";c(Ub,"runBuilder");c(Mp,"generateWiki");c(uI,"buildCrewRunFiles");c(dI,"buildTeamFile");c(mi,"regenerateWikiDeferred")});async function kc(r){try{let{stdout:e}=await G("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function Wb(r,e=20){try{let{stdout:t}=await G("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
849
- `).filter(n=>n.length>0).slice(0,e)}catch{return[]}}var bc=h(()=>{"use strict";Ce();c(kc,"getGitBranch");c(Wb,"getModifiedFiles")});var fi,Op,es,Np=h(()=>{"use strict";fi={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"}},Op=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){if(t){let s=(e?.activeTasks??[]).find(o=>o.workspaceId===t);return s?this.statusToState(s):"idle"}let n=e?.currentTask;return n?this.statusToState(n):(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(fi[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 fi[e]}getPrompt(e){return fi[e].prompt}getValidCommands(e){return fi[e].transitions}formatNextSteps(e){return fi[e].transitions.map(n=>{switch(n){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 ${n}`}})}},es=new Op});async function Gb(r,e,t){let n=await r.read(e);if(!n.currentTask)return null;r.validateTransition(n,"pause");let s={...n.currentTask,status:"paused",pausedAt:T(),pauseReason:t},o=r.getPausedTasksFromState(n),i=[s,...o].slice(0,r.maxPausedTasks);return await r.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:T()})),await r.publish(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async function Bb(r,e,t){let n=await r.read(e),s=r.getPausedTasksFromState(n);if(s.length===0)return null;r.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(f=>f.id===t),o===-1))return null;let i=s[o],a=s.filter((f,y)=>y!==o),{status:l,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:T(),sessionId:i.sessionId??Ke()};return await r.update(e,f=>({...f,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:T()})),await r.publish(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}async function qb(r,e){let t=await r.read(e),n=r.getPausedTasksFromState(t),s=Date.now()-r.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async function Vb(r,e){let t=await r.read(e),n=r.getPausedTasksFromState(t),s=Date.now()-r.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];gt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await r.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:T()}));for(let a of o)await r.publish(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}var Jb=h(()=>{"use strict";Xn();le();vr();c(Gb,"pauseTask");c(Bb,"resumeTask");c(qb,"getStalePausedTasks");c(Vb,"archiveStalePausedTasks")});async function Kb(r,e){await r.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:T()}))}async function Xb(r,e){let t=await r.read(e),n=r.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async function zb(r,e){let t=await r.read(e);return r.getPausedTasksFromState(t)[0]||null}async function Yb(r,e){let t=await r.read(e);return r.getPausedTasksFromState(t)}async function Lp(r,e){let t=await r.read(e);return r.getTaskHistoryFromState(t)}async function Qb(r,e){let t=await r.read(e);return r.getTaskHistoryFromState(t)[0]||null}async function Zb(r,e,t){let n=await r.read(e);return r.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async function ev(r,e){let n=(await Lp(r,e)).filter(m=>m.feedback),s=[],o=[],i=[],a=[];for(let m of n){let f=m.feedback;Array.isArray(f.stackConfirmed)&&s.push(...f.stackConfirmed),Array.isArray(f.patternsDiscovered)&&o.push(...f.patternsDiscovered),Array.isArray(f.agentAccuracy)&&i.push(...f.agentAccuracy),Array.isArray(f.issuesEncountered)&&a.push(...f.issuesEncountered)}let l=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,f])=>f>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}var tv=h(()=>{"use strict";le();c(Kb,"clearTask");c(Xb,"hasTask");c(zb,"getPausedTask");c(Yb,"getAllPausedTasks");c(Lp,"getTaskHistory");c(Qb,"getMostRecentTask");c(Zb,"getTaskHistoryByType");c(ev,"getAggregatedFeedback")});async function nv(r,e,t){let n=await r.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?T():void 0,dependsOn:o.dependsOn||[]}));await r.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:T()})),await r.publish(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function rv(r,e,t){let n=Ab.safeParse(t);if(!n.success){let y=n.error.issues.map(v=>`${v.path.join(".")}: ${v.message}`);throw new Error(`Subtask completion requires handoff data:
848
+ `)}async function mi(r,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{Mp(r,e).catch(()=>{})});return}try{await Mp(r,e)}catch{}}var wc,$n=h(()=>{"use strict";Te();Tr();Yr();Qr();Zn();Tk();_n();jk();$k();Dk();Ok();Fk();Bk();Jk();Zk();tb();cp();rb();ob();ac();fp();wc="_generated";c(Ub,"runBuilder");c(Mp,"generateWiki");c(uI,"buildCrewRunFiles");c(dI,"buildTeamFile");c(mi,"regenerateWikiDeferred")});async function kc(r){try{let{stdout:e}=await G("git branch --show-current",{cwd:r});return e.trim()||void 0}catch{return}}async function Wb(r,e=20){try{let{stdout:t}=await G("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:r});return t.trim().split(`
849
+ `).filter(n=>n.length>0).slice(0,e)}catch{return[]}}var bc=h(()=>{"use strict";Re();c(kc,"getGitBranch");c(Wb,"getModifiedFiles")});var fi,Op,es,Np=h(()=>{"use strict";fi={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"}},Op=class{static{c(this,"WorkflowStateMachine")}getCurrentState(e,t){if(t){let s=(e?.activeTasks??[]).find(o=>o.workspaceId===t);return s?this.statusToState(s):"idle"}let n=e?.currentTask;return n?this.statusToState(n):(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(fi[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 fi[e]}getPrompt(e){return fi[e].prompt}getValidCommands(e){return fi[e].transitions}formatNextSteps(e){return fi[e].transitions.map(n=>{switch(n){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 ${n}`}})}},es=new Op});async function Gb(r,e,t){let n=await r.read(e);if(!n.currentTask)return null;r.validateTransition(n,"pause");let s={...n.currentTask,status:"paused",pausedAt:T(),pauseReason:t},o=r.getPausedTasksFromState(n),i=[s,...o].slice(0,r.maxPausedTasks);return await r.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:T()})),await r.publish(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:i.length}),s}async function Bb(r,e,t){let n=await r.read(e),s=r.getPausedTasksFromState(n);if(s.length===0)return null;r.validateTransition(n,"resume");let o=0;if(t&&(o=s.findIndex(f=>f.id===t),o===-1))return null;let i=s[o],a=s.filter((f,y)=>y!==o),{status:l,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:T(),sessionId:i.sessionId??Ke()};return await r.update(e,f=>({...f,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:T()})),await r.publish(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}async function qb(r,e){let t=await r.read(e),n=r.getPausedTasksFromState(t),s=Date.now()-r.stalenessThresholdDays*24*60*60*1e3;return n.filter(o=>new Date(o.pausedAt).getTime()<s)}async function Vb(r,e){let t=await r.read(e),n=r.getPausedTasksFromState(t),s=Date.now()-r.stalenessThresholdDays*24*60*60*1e3,o=n.filter(a=>new Date(a.pausedAt).getTime()<s),i=n.filter(a=>new Date(a.pausedAt).getTime()>=s);if(o.length===0)return[];gt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await r.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:T()}));for(let a of o)await r.publish(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}var Jb=h(()=>{"use strict";Xn();le();vr();c(Gb,"pauseTask");c(Bb,"resumeTask");c(qb,"getStalePausedTasks");c(Vb,"archiveStalePausedTasks")});async function Kb(r,e){await r.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:T()}))}async function Xb(r,e){let t=await r.read(e),n=r.getPausedTasksFromState(t);return t.currentTask!==null||n.length>0}async function zb(r,e){let t=await r.read(e);return r.getPausedTasksFromState(t)[0]||null}async function Yb(r,e){let t=await r.read(e);return r.getPausedTasksFromState(t)}async function Lp(r,e){let t=await r.read(e);return r.getTaskHistoryFromState(t)}async function Qb(r,e){let t=await r.read(e);return r.getTaskHistoryFromState(t)[0]||null}async function Zb(r,e,t){let n=await r.read(e);return r.getTaskHistoryFromState(n).filter(o=>o.classification===t)}async function ev(r,e){let n=(await Lp(r,e)).filter(m=>m.feedback),s=[],o=[],i=[],a=[];for(let m of n){let f=m.feedback;Array.isArray(f.stackConfirmed)&&s.push(...f.stackConfirmed),Array.isArray(f.patternsDiscovered)&&o.push(...f.patternsDiscovered),Array.isArray(f.agentAccuracy)&&i.push(...f.agentAccuracy),Array.isArray(f.issuesEncountered)&&a.push(...f.issuesEncountered)}let l=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,f])=>f>=2).map(([m])=>m);return{stackConfirmed:l,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}var tv=h(()=>{"use strict";le();c(Kb,"clearTask");c(Xb,"hasTask");c(zb,"getPausedTask");c(Yb,"getAllPausedTasks");c(Lp,"getTaskHistory");c(Qb,"getMostRecentTask");c(Zb,"getTaskHistoryByType");c(ev,"getAggregatedFeedback")});async function nv(r,e,t){let n=await r.read(e);if(!n.currentTask)return;let s=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?T():void 0,dependsOn:o.dependsOn||[]}));await r.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:s.length,percentage:0}},lastUpdated:T()})),await r.publish(e,"subtasks.created",{taskId:n.currentTask.id,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function rv(r,e,t){let n=Ab.safeParse(t);if(!n.success){let y=n.error.issues.map(v=>`${v.path.join(".")}: ${v.message}`);throw new Error(`Subtask completion requires handoff data:
850
850
  ${y.join(`
851
851
  `)}`)}let{output:s,summary:o}=n.data,i=await r.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:T(),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:T()}),await r.update(e,y=>({...y,currentTask:{...y.currentTask,subtasks:u,currentSubtaskIndex:f<p?f:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:T()})),await r.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 sv(r,e){let t=await r.read(e);if(!t.currentTask?.subtasks)return null;let n=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[n]||null}async function ov(r,e){let t=await r.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[n]||null}async function Fp(r,e){let t=await r.read(e);if(!t.currentTask?.subtasks)return null;let n=(t.currentTask.currentSubtaskIndex||0)-1;return n<0?null:t.currentTask.subtasks[n]||null}async function iv(r,e){let t=await Fp(r,e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async function av(r,e){return(await r.read(e)).currentTask?.subtasks||[]}async function cv(r,e){return(await r.read(e)).currentTask?.subtaskProgress||null}async function lv(r,e){return((await r.read(e)).currentTask?.subtasks?.length||0)>0}async function uv(r,e){let t=await r.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(n=>n.status==="completed"||n.status==="failed"||n.status==="skipped"):!0}async function dv(r,e,t){let n=await r.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"failed",completedAt:T(),output:`Failed: ${t}`};let a=s+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:T()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await r.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:s,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:T()})),await r.publish(e,"subtask.failed",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<l?i[a]:null}async function pv(r,e,t){let n=await r.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"skipped",completedAt:T(),output:`Skipped: ${t}`,skipReason:t};let a=s+1,l=i.length;a<l&&(i[a]={...i[a],status:"in_progress",startedAt:T()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/l*100);return await r.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:s,subtaskProgress:{completed:u,total:l,percentage:d}},lastUpdated:T()})),await r.publish(e,"subtask.skipped",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<l?i[a]:null}async function mv(r,e,t){let n=await r.read(e);if(!n.currentTask?.subtasks)return null;let s=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[s];if(!o)return null;let i=[...n.currentTask.subtasks];i[s]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=s+1,l=i.length;return a<l&&(i[a]={...i[a],status:"in_progress",startedAt:T()}),await r.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<l?a:s},lastUpdated:T()})),await r.publish(e,"subtask.blocked",{taskId:n.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<l?i[a]:null}var fv=h(()=>{"use strict";uc();le();c(nv,"createSubtasks");c(rv,"completeSubtask");c(sv,"getCurrentSubtask");c(ov,"getNextSubtask");c(Fp,"getPreviousSubtask");c(iv,"getPreviousHandoff");c(av,"getSubtasks");c(cv,"getSubtaskProgress");c(lv,"hasSubtasks");c(uv,"areAllSubtasksComplete");c(dv,"failSubtask");c(pv,"skipSubtask");c(mv,"blockSubtask")});async function gv(r,e,t,n){let s={...t,workspaceId:n,startedAt:T()};return await r.update(e,o=>{if((o.activeTasks||[]).some(i=>i.workspaceId===n))throw new Error("A task is already active in this workspace");return{...o,activeTasks:[...o.activeTasks||[],s],lastUpdated:T()}}),await r.publish(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId,workspaceId:n}),s}async function hv(r,e,t){return((await r.read(e)).activeTasks||[]).find(s=>s.workspaceId===t)??null}async function yv(r,e,t,n){let o=((await r.read(e)).activeTasks||[]).find(a=>a.workspaceId===t);if(!o)return null;let i=T();return await r.update(e,a=>{let l=(a.activeTasks||[]).find(p=>p.workspaceId===t)??o,d=[r.createTaskHistoryEntry(l,i,n),...r.getTaskHistoryFromState(a)].slice(0,r.maxTaskHistory);return{...a,activeTasks:(a.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:i}}),await r.publish(e,"task.completed",{taskId:o.id,description:o.description,startedAt:o.startedAt,completedAt:i,workspaceId:t}),o}async function wv(r,e){return(await r.read(e)).activeTasks||[]}async function kv(r,e){return((await r.read(e)).activeTasks||[]).length}async function bv(r,e,t,n){let o=((await r.read(e)).activeTasks||[]).find(i=>i.workspaceId===t);return o?(await r.update(e,i=>({...i,activeTasks:(i.activeTasks||[]).map(a=>a.workspaceId===t?{...a,...n,workspaceId:t}:a),lastUpdated:T()})),{...o,...n,workspaceId:t}):null}async function vv(r,e,t,n,s){let o=await r.read(e);if(s){if(!(o.activeTasks||[]).some(l=>l.workspaceId===s))return null;let a=null;return await r.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)+n;return a={tokensIn:d,tokensOut:p},{...u,tokensIn:d,tokensOut:p}}),lastUpdated:T()})),a}if(!o.currentTask)return null;let i=null;return await r.update(e,a=>{if(!a.currentTask)return a;let l=(a.currentTask.tokensIn||0)+t,u=(a.currentTask.tokensOut||0)+n;return i={tokensIn:l,tokensOut:u},{...a,currentTask:{...a.currentTask,tokensIn:l,tokensOut:u},lastUpdated:T()}}),i}var Sv=h(()=>{"use strict";le();c(gv,"startTaskInWorkspace");c(hv,"getCurrentTaskForWorkspace");c(yv,"completeTaskInWorkspace");c(wv,"getActiveTasks");c(kv,"getActiveTaskCount");c(bv,"updateWorkspaceTask");c(vv,"addTokens")});var Hp,K,Et=h(()=>{"use strict";uc();le();Np();Jb();tv();fv();Sv();Er();Hp=class extends ct{static{c(this,"StateStorage")}constructor(){super("state.json",Ib)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t,n){let s=es.getCurrentState(e,n),o=es.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 n=await this.read(e);this.validateTransition(n,"task");let s={...t,startedAt:T()};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:T()})),await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let n=await this.read(e);if(!n.currentTask)return null;let s={...n.currentTask,...t};return await this.update(e,o=>({...o,currentTask:s,lastUpdated:T()})),s}async completeTask(e,t){let n=await this.read(e),s=n.currentTask;if(!s)return null;this.validateTransition(n,"done");let o=T(),i=this.createTaskHistoryEntry(s,o,t),a=this.getTaskHistoryFromState(n),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,n){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 n&&(i.feedback=n),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 Gb(this.lifecycleBackend(),e,t)}async resumeTask(e,t){return Bb(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 qb(this.lifecycleBackend(),e)}async archiveStalePausedTasks(e){return Vb(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 Kb(this.queryBackend(),e)}async hasTask(e){return Xb(this.queryBackend(),e)}async getPausedTask(e){return zb(this.queryBackend(),e)}async getAllPausedTasks(e){return Yb(this.queryBackend(),e)}async getTaskHistory(e){return Lp(this.queryBackend(),e)}async getMostRecentTask(e){return Qb(this.queryBackend(),e)}async getTaskHistoryByType(e,t){return Zb(this.queryBackend(),e,t)}async getAggregatedFeedback(e){return ev(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,n){let s=await this.read(e);return this.validateTransition(s,"task",n),gv(this.workspaceBackend(),e,t,n)}async getCurrentTaskForWorkspace(e,t){return hv(this.workspaceBackend(),e,t)}async completeTaskInWorkspace(e,t,n){return yv(this.workspaceBackend(),e,t,n)}async getActiveTasks(e){return wv(this.workspaceBackend(),e)}async getActiveTaskCount(e){return kv(this.workspaceBackend(),e)}async updateWorkspaceTask(e,t,n){return bv(this.workspaceBackend(),e,t,n)}async addTokens(e,t,n,s){return vv(this.workspaceBackend(),e,t,n,s)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(e,t){return nv(this.subtaskBackend(),e,t)}async completeSubtask(e,t){return rv(this.subtaskBackend(),e,t)}async getCurrentSubtask(e){return sv(this.subtaskBackend(),e)}async getNextSubtask(e){return ov(this.subtaskBackend(),e)}async getPreviousSubtask(e){return Fp(this.subtaskBackend(),e)}async getPreviousHandoff(e){return iv(this.subtaskBackend(),e)}async getSubtasks(e){return av(this.subtaskBackend(),e)}async getSubtaskProgress(e){return cv(this.subtaskBackend(),e)}async hasSubtasks(e){return lv(this.subtaskBackend(),e)}async areAllSubtasksComplete(e){return uv(this.subtaskBackend(),e)}async failSubtask(e,t){return dv(this.subtaskBackend(),e,t)}async skipSubtask(e,t){return pv(this.subtaskBackend(),e,t)}async blockSubtask(e,t){return mv(this.subtaskBackend(),e,t)}},K=new Hp});import Ev from"node:path";var hI,yI,vc,Tv=h(()=>{"use strict";le();J();hI=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],yI=`# Changelog
852
852
 
@@ -885,7 +885,7 @@ ${a}`}return`${s}
885
885
 
886
886
  ${e}`}formatKeepAChangelogEntry(e,t){let n=[`## [${e.version}] - ${t}`];if(n.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){n.push(`### ${s}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push("### Added"),n.push(`- ${e.description}`),n.push(""));return n.join(`
887
887
  `)}formatMarkdownEntry(e,t){let n=[`## ${e.version} - ${t}`];if(n.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){n.push(`### ${s}`);for(let i of o)n.push(`- ${i}`);n.push("")}else e.description&&(n.push(`- ${e.description}`),n.push(""));return n.join(`
888
- `)}}});import ts from"node:path";function Up(r){return/^\d+\.\d+\.\d+/.test(r)}function ns(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return r;let[,t,n,s,o]=e;if(o){let i=o.split("."),a=i.length-1;return/^\d+$/.test(i[a])?(i[a]=String(Number(i[a])+1),`${t}.${n}.${s}-${i.join(".")}`):`${t}.${n}.${s}-${o}.1`}return`${t}.${n}.${Number(s)+1}`}function wI(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${e[1]}.${Number(e[2])+1}.0`:r}function kI(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${Number(e[1])+1}.0.0`:r}function bI(r,e){return e==="major"?kI(r):e==="minor"?wI(r):ns(r)}function Pv(r){let e=(r??"").toLowerCase().trim();return e?/^[a-z]+(\([^)]*\))?!:/.test(e)||e.includes("breaking change")?"major":/^(fix|chore|docs|refactor|perf|style|test|build|ci|revert)(\([^)]*\))?:/.test(e)?"patch":"minor":"patch"}function Cv(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Rv(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function xv(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Sc,Av=h(()=>{"use strict";Ce();J();Sc=class{static{c(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(e="patch"){let t=await this.detect();if(t.file){let s=await this.readVersionFromGitHead(t.file,t.format);if(s&&this.isAheadOf(t.current,s))return t.current}let n=bI(t.current,e);return await this.writeVersion({...t,next:n}),n}async readVersionFromGitHead(e,t){try{let n=ts.relative(this.projectPath,e),{stdout:s}=await re("git",["show",`HEAD:${n}`],{cwd:this.projectPath});if(t==="json")return JSON.parse(s).version??null;if(t==="plaintext"){let o=s.trim();return Up(o)?o:null}return t==="toml"?Cv(s)??Rv(s):t==="xml"?xv(s):null}catch{return null}}isAheadOf(e,t){let n=e.split(".").map(o=>Number.parseInt(o,10)||0),s=t.split(".").map(o=>Number.parseInt(o,10)||0);for(let o=0;o<3;o++){let i=n[o]??0,a=s[o]??0;if(i>a)return!0;if(i<a)return!1}return!1}async fromPackageJson(){let e=ts.join(this.projectPath,"package.json"),t=await Pe(e,null);return t?.version?{current:t.version,next:ns(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=ts.join(this.projectPath,"Cargo.toml"),t=await At(e,"");if(!t)return null;let n=Cv(t);return n?{current:n,next:ns(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=ts.join(this.projectPath,"pyproject.toml"),t=await At(e,"");if(!t)return null;let n=Rv(t);return n?{current:n,next:ns(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await Gn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=ts.join(this.projectPath,e[0]),n=await At(t,"");if(!n)return null;let s=xv(n);return s?{current:s,next:ns(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=ts.join(this.projectPath,e),n=await At(t,"");if(!n)return null;let s=n.trim();return Up(s)?{current:s,next:ns(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await G("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
888
+ `)}}});import ts from"node:path";function Up(r){return/^\d+\.\d+\.\d+/.test(r)}function ns(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return r;let[,t,n,s,o]=e;if(o){let i=o.split("."),a=i.length-1;return/^\d+$/.test(i[a])?(i[a]=String(Number(i[a])+1),`${t}.${n}.${s}-${i.join(".")}`):`${t}.${n}.${s}-${o}.1`}return`${t}.${n}.${Number(s)+1}`}function wI(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${e[1]}.${Number(e[2])+1}.0`:r}function kI(r){let e=r.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${Number(e[1])+1}.0.0`:r}function bI(r,e){return e==="major"?kI(r):e==="minor"?wI(r):ns(r)}function Pv(r){let e=(r??"").toLowerCase().trim();return e?/^[a-z]+(\([^)]*\))?!:/.test(e)||e.includes("breaking change")?"major":/^(fix|chore|docs|refactor|perf|style|test|build|ci|revert)(\([^)]*\))?:/.test(e)?"patch":"minor":"patch"}function Cv(r){let e=r.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Rv(r){let e=r.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let n=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}let t=r.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let n=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(n)return n[1]}return null}function xv(r){return r.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Sc,Av=h(()=>{"use strict";Re();J();Sc=class{static{c(this,"VersionService")}projectPath;constructor(e){this.projectPath=e}async detect(){let e=[()=>this.fromPackageJson(),()=>this.fromCargoToml(),()=>this.fromPyprojectToml(),()=>this.fromCsproj(),()=>this.fromVersionFile("VERSION"),()=>this.fromVersionFile("version.txt"),()=>this.fromGitTag()];for(let t of e){let n=await t();if(n)return n}return this.createFallbackVersion()}async bump(e="patch"){let t=await this.detect();if(t.file){let s=await this.readVersionFromGitHead(t.file,t.format);if(s&&this.isAheadOf(t.current,s))return t.current}let n=bI(t.current,e);return await this.writeVersion({...t,next:n}),n}async readVersionFromGitHead(e,t){try{let n=ts.relative(this.projectPath,e),{stdout:s}=await re("git",["show",`HEAD:${n}`],{cwd:this.projectPath});if(t==="json")return JSON.parse(s).version??null;if(t==="plaintext"){let o=s.trim();return Up(o)?o:null}return t==="toml"?Cv(s)??Rv(s):t==="xml"?xv(s):null}catch{return null}}isAheadOf(e,t){let n=e.split(".").map(o=>Number.parseInt(o,10)||0),s=t.split(".").map(o=>Number.parseInt(o,10)||0);for(let o=0;o<3;o++){let i=n[o]??0,a=s[o]??0;if(i>a)return!0;if(i<a)return!1}return!1}async fromPackageJson(){let e=ts.join(this.projectPath,"package.json"),t=await Pe(e,null);return t?.version?{current:t.version,next:ns(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=ts.join(this.projectPath,"Cargo.toml"),t=await At(e,"");if(!t)return null;let n=Cv(t);return n?{current:n,next:ns(n),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=ts.join(this.projectPath,"pyproject.toml"),t=await At(e,"");if(!t)return null;let n=Rv(t);return n?{current:n,next:ns(n),file:e,format:"toml"}:null}async fromCsproj(){let e=await Gn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=ts.join(this.projectPath,e[0]),n=await At(t,"");if(!n)return null;let s=xv(n);return s?{current:s,next:ns(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=ts.join(this.projectPath,e),n=await At(t,"");if(!n)return null;let s=n.trim();return Up(s)?{current:s,next:ns(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await G("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
889
889
  `);for(let n of t){let s=n.trim().replace(/^v/,"");if(Up(s))return{current:s,next:ns(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=ts.join(this.projectPath,"VERSION");return await Wn(e,`0.1.0
890
890
  `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await re("git",["tag",`v${e.next}`],{cwd:this.projectPath});return}switch(e.format){case"json":await this.writeJsonVersion(e.file,e.next);break;case"toml":await this.writeTomlVersion(e.file,e.next);break;case"xml":await this.writeXmlVersion(e.file,e.next);break;case"plaintext":await Wn(e.file,`${e.next}
891
891
  `);break}}async writeJsonVersion(e,t){let n=await Pe(e,{});n&&(n.version=t,await fe(e,n))}async writeTomlVersion(e,t){let n=await At(e,"");if(!n)return;let s=n.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Wn(e,s)}async writeXmlVersion(e,t){let n=await At(e,"");if(!n)return;let s=n.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Wn(e,s)}};c(Up,"isSemver");c(ns,"bumpPatch");c(wI,"bumpMinor");c(kI,"bumpMajor");c(bI,"bumpVersion");c(Pv,"inferBumpLevel");c(Cv,"parseTomlVersion");c(Rv,"parsePyprojectVersion");c(xv,"parseCsprojVersion")});function vI(r){let e=r.split(/\s+/).map(n=>n.trim()).filter(Boolean),t=[];for(let n of e){let s=n.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(s){t.push({kind:"tags",key:s[1],op:s[2],value:s[3]});continue}let o=n.match(/^branch([=~])(.+)$/);if(o){t.push({kind:"branch",op:o[1],value:o[2]});continue}let i=n.match(/^files:(.+)$/);i&&t.push({kind:"files",op:"~",value:i[1]})}return t}function SI(r){let e=jv.get(r);if(e)return e;let t="";for(let s=0;s<r.length;s++){let o=r[s];o==="*"?r[s+1]==="*"?(t+=".*",s++):t+="[^/]*":/[.+^${}()|[\]\\]/.test(o)?t+=`\\${o}`:t+=o}let n=new RegExp(`^${t}$`);return jv.set(r,n),n}function EI(r,e){if(r.kind==="tags"){let t=e.tags[r.key??""]??"";return r.op==="="?t===r.value:t.toLowerCase().includes(r.value.toLowerCase())}if(r.kind==="branch")return r.op==="="?e.branch===r.value:e.branch.toLowerCase().includes(r.value.toLowerCase());if(r.kind==="files"){let t=SI(r.value);return e.filesChanged.some(n=>t.test(n))}return!0}function _v(r,e){if(!r||!r.trim())return!0;let t=vI(r);return t.length===0?!0:t.every(n=>EI(n,e))}var jv,$v=h(()=>{"use strict";c(vI,"parseWhen");jv=new Map;c(SI,"globToRegex");c(EI,"matchCondition");c(_v,"evaluateWhen")});import{execSync as TI}from"node:child_process";import CI from"node:fs/promises";import Wp from"node:path";import Mt from"chalk";async function AI(r,e,t){let n=await K.getCurrentTask(r);if(!n)throw new Error(`Cannot transition to '${t}': no active task`);await Xe.log(e,wr,{taskId:n.id,from:n.type??null,to:t,source:"workflow"})}async function jI(r,e){if(r.trustSource==="imported")throw new Error(`Refusing to run imported rule without approval: ${r.description||r.action}. Re-create the rule locally if you trust it.`);await G(r.action,{timeout:r.timeoutMs,cwd:e,env:{...process.env}})}async function _I(r,e,t){if(r.trustSource==="imported")throw new Error(`Refusing to run imported script rule without approval: ${r.description||r.action}.`);let n=r.action.slice(Mv.length).trim();if(!n)throw new Error(`Empty script path in action '${r.action}'`);let s=Wp.resolve(e,".prjct/workflows",n),o=Wp.resolve(e,".prjct/workflows");if(!s.startsWith(`${o}${Wp.sep}`)&&s!==o)throw new Error(`Script path escapes workflows dir: ${n}`);try{await CI.access(s)}catch{throw new Error(`Script not found: .prjct/workflows/${n}`)}await G(`bash ${JSON.stringify(s)}`,{timeout:r.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:t.branch,PRJCT_FILES_CHANGED:t.filesChanged.join(","),PRJCT_TAGS:Object.entries(t.tags).map(([i,a])=>`${i}=${a}`).join(",")}})}function $I(r){let e=r.action.slice(Ov.length).trim(),t=e.indexOf(":");if(t===-1)return`Call MCP tool ${JSON.stringify(e)} (server unspecified \u2014 re-author rule with format \`mcp:<server>:<tool>[:<args>]\`).`;let n=e.slice(0,t),s=e.slice(t+1),o=s.indexOf(":"),i=o===-1?s:s.slice(0,o),a=o===-1?"":s.slice(o+1),l=r.description?` (${r.description})`:"";return a?`Call MCP \`${n}.${i}\` with args ${a}${l}.`:`Call MCP \`${n}.${i}\`${l}.`}async function II(r){try{let{default:e}=await Promise.resolve().then(()=>(Q(),sn)),n=(await e.readConfig(r))?.persona;if(!n)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let s=[`You are **${n.role}** in this project.`];return n.focus&&s.push(`Focus: ${n.focus}.`),n.mcps&&n.mcps.length>0&&s.push(`MCPs available: ${n.mcps.join(", ")}.`),n.packs&&n.packs.length>0&&s.push(`Active packs: ${n.packs.join(", ")}.`),s.join(" ")}catch(e){return`Could not resolve persona: ${w(e)}`}}async function DI(r,e){let t=new Sc(r),n=Pv(typeof e.feature=="string"?e.feature:void 0),s=await t.bump(n);e.version=s}async function MI(r,e){let t=typeof e.version=="string"?e.version:null,n=typeof e.feature=="string"?e.feature:null;if(!t)throw new Error("changelog:add requires a prior version:bump step (no version in runContext)");if(!n)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new vc(r).addFeature(t,n)}function OI(r,e){return r.replace(/\$([A-Z_]+)/g,(t,n)=>{let s=n.toLowerCase(),o=e[s];return typeof o=="string"?o:""})}async function NI(r,e,t){let s=r.slice(Bp.length).replace(/^:/,"").trim()||(t.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),o=`${OI(s,t)}
@@ -901,7 +901,7 @@ ${w(D)}
901
901
  `}},"runHook");for(let R of v)await b(R);k.length>0&&await Promise.all(k.map(b));let C=p.filter(R=>R.type==="step");for(let R of C){console.log(`
902
902
  ${Mt.dim(`[step] ${e}: ${R.action}`)}`);try{let D=Date.now();await Gp(R,r,l,d,s,o);let V=Date.now()-D,M=V>1e3?`${(V/1e3).toFixed(1)}s`:`${V}ms`;console.log(`${Mt.green("\u2713")} ${Mt.dim(`step passed (${M})`)}`),s.stepsRun.push(R.description||R.action)}catch(D){return console.log(`${Mt.red("\u2717")} step failed: ${R.action}`),s.gatesFailed.push(R.description||R.action),s.success=!1,s.output+=`Step failed: ${R.action}
903
903
  ${w(D)}
904
- `,s}}return s}var Iv,Mv,Ov,RI,Dv,xI,Bp,PI,Ec=h(()=>{"use strict";kr();Tv();Yn();Av();bc();X();Et();Zn();H();Ce();$v();Iv="status:",Mv="script:",Ov="mcp:",RI="persona:context",Dv="version:bump",xI="changelog:add",Bp="git:commit",PI="git:push";c(AI,"runStatusTransition");c(jI,"runShellAction");c(_I,"runScriptAction");c($I,"buildMcpInstruction");c(II,"buildPersonaInstruction");c(DI,"runVersionBump");c(MI,"runChangelogAdd");c(OI,"expandTemplate");c(NI,"runGitCommit");c(LI,"runGitPush");c(Gp,"runRuleAction");c(FI,"buildWhenContext");c(HI,"resolveBranch");c(UI,"resolveChangedFiles");c(WI,"resolveActiveTags");c(tr,"executeWorkflowRules")});import rs from"chalk";var Nv,GI,BI,In,Lv=h(()=>{"use strict";Be();Nv=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],GI=80,BI={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Nv,speed:GI},cli:{header:c(()=>`${rs.cyan.bold("\u26A1")} ${rs.cyan("prjct")}`,"header"),footer:c(()=>rs.dim("\u26A1 prjct"),"footer"),spin:c((r,e)=>`${rs.cyan("\u26A1")} ${rs.cyan("prjct")} ${rs.cyan(Nv[r%10])} ${rs.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:c((r="claude")=>Ca(r).commitFooter,"getCommitFooter"),getSignature:c((r="claude")=>Ca(r).signature,"getSignature")},In=BI});var Hv={};A(Hv,{OUTPUT_TIERS:()=>Fv,default:()=>g,formatForHuman:()=>KI,getOutputTier:()=>VI,getTierConfig:()=>Cc,limitLines:()=>Tc,setOutputTier:()=>qI,setQuietMode:()=>JI});import pe from"chalk";function qI(r){so=r}function VI(){return so}function Cc(){return Fv[so]}function JI(r){Tt=r}function Tc(r,e){let t=e??Cc().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
904
+ `,s}}return s}var Iv,Mv,Ov,RI,Dv,xI,Bp,PI,Ec=h(()=>{"use strict";kr();Tv();Yn();Av();bc();X();Et();Zn();H();Re();$v();Iv="status:",Mv="script:",Ov="mcp:",RI="persona:context",Dv="version:bump",xI="changelog:add",Bp="git:commit",PI="git:push";c(AI,"runStatusTransition");c(jI,"runShellAction");c(_I,"runScriptAction");c($I,"buildMcpInstruction");c(II,"buildPersonaInstruction");c(DI,"runVersionBump");c(MI,"runChangelogAdd");c(OI,"expandTemplate");c(NI,"runGitCommit");c(LI,"runGitPush");c(Gp,"runRuleAction");c(FI,"buildWhenContext");c(HI,"resolveBranch");c(UI,"resolveChangedFiles");c(WI,"resolveActiveTags");c(tr,"executeWorkflowRules")});import rs from"chalk";var Nv,GI,BI,In,Lv=h(()=>{"use strict";Be();Nv=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],GI=80,BI={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:Nv,speed:GI},cli:{header:c(()=>`${rs.cyan.bold("\u26A1")} ${rs.cyan("prjct")}`,"header"),footer:c(()=>rs.dim("\u26A1 prjct"),"footer"),spin:c((r,e)=>`${rs.cyan("\u26A1")} ${rs.cyan("prjct")} ${rs.cyan(Nv[r%10])} ${rs.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:c((r="claude")=>Ca(r).commitFooter,"getCommitFooter"),getSignature:c((r="claude")=>Ca(r).signature,"getSignature")},In=BI});var Hv={};A(Hv,{OUTPUT_TIERS:()=>Fv,default:()=>g,formatForHuman:()=>KI,getOutputTier:()=>VI,getTierConfig:()=>Cc,limitLines:()=>Tc,setOutputTier:()=>qI,setQuietMode:()=>JI});import pe from"chalk";function qI(r){so=r}function VI(){return so}function Cc(){return Fv[so]}function JI(r){Tt=r}function Tc(r,e){let t=e??Cc().maxLines;if(t===1/0||t===0)return r;let n=r.split(`
905
905
  `);if(n.length<=t)return r;let s=n.slice(0,t),o=n.length-t;return`${s.join(`
906
906
  `)}
907
907
  ${pe.dim(`...${o} more lines`)}`}function KI(r){let e=Cc();if(so==="silent")return"";if(so==="verbose")return JSON.stringify(r,null,2);if(typeof r!="object"||r===null)return zt(String(r),e.maxCharsPerLine);let t=r;if("identifier"in t&&"title"in t){let o=[];return o.push(`${t.identifier}: ${zt(String(t.title),e.maxCharsPerLine-10)}`),t.status&&o.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&o.push(`Priority: ${t.priority}`),t.url&&so==="compact"&&o.push(pe.dim(String(t.url))),Tc(o.join(`
@@ -938,7 +938,7 @@ that travel with this project:
938
938
  When in doubt: capture is always safe; ship is never silent.`,t0=`${gi}
939
939
  ${e0}
940
940
  ${hi}
941
- `;c(Bv,"writeProjectClaudeMd")});function xc(r,e,t){if(t.md){console.log(`> ${e}`);return}g[r](e)}function L(r,e={}){return n0(r,e),{success:!1,error:r}}function $(r,e={}){return pn(r,e),{success:!1,error:r}}function Le(r,e){let t=w(r);return e&&pn(t,e),{success:!1,error:t}}var n0,Kp,pn,Ot,he=h(()=>{"use strict";H();ae();c(xc,"notify");n0=c((r,e={})=>xc("warn",r,e),"notifyWarn"),Kp=c((r,e={})=>xc("info",r,e),"notifyInfo"),pn=c((r,e={})=>xc("fail",r,e),"notifyFail"),Ot=c((r,e={})=>xc("done",r,e),"notifyDone");c(L,"failWith");c($,"failHard");c(Le,"failFromError")});import ut from"node:path";async function r0(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await E(ut.join(r,"pnpm-lock.yaml"))?"pnpm":await E(ut.join(r,"yarn.lock"))?"yarn":await E(ut.join(r,"bun.lockb"))||await E(ut.join(r,"bun.lock"))?"bun":(await E(ut.join(r,"package-lock.json")),"npm")}function Vv(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function s0(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function oo(r,e){for(let s of o0)if(await E(ut.join(r,s)))return s;let n=(e??await Gn(r)).find(s=>s.endsWith(i0));if(n)return n}async function nr(r){for(let e of a0)if(await E(ut.join(r,e)))return e}async function Pc(r){let e=ut.join(r,"package.json"),t=await Pe(e,null);if(t){let a=await r0(r,t),l=t.scripts||{},u={stack:"js",packageManager:a};return l.lint&&(u.lint={tool:a,command:Vv(a,"lint")}),l.typecheck&&(u.typecheck={tool:a,command:Vv(a,"typecheck")}),l.test&&(u.test={tool:a,command:s0(a)}),u.versionFile=await oo(r),u.changelogFile=await nr(r),u}if(await E(ut.join(r,"pytest.ini"))){let a=await oo(r),l=await nr(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}let n=await At(ut.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await oo(r),l=await nr(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}if(await E(ut.join(r,"Cargo.toml"))){let a=await nr(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await E(ut.join(r,"go.mod"))){let a=await oo(r),l=await nr(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:l}}let s=await Gn(r);if(s.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await oo(r,s),l=await nr(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:l}}if(await E(ut.join(r,"pom.xml"))){let a=await nr(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await E(ut.join(r,"gradlew"))&&(await E(ut.join(r,"build.gradle"))||await E(ut.join(r,"build.gradle.kts")))){let a=await nr(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await oo(r),i=await nr(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var o0,i0,a0,Xp=h(()=>{"use strict";J();c(r0,"detectPackageManager");c(Vv,"pmRun");c(s0,"pmTest");o0=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],i0=".csproj",a0=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];c(oo,"detectVersionFile");c(nr,"detectChangelogFile");c(Pc,"detectProjectCommands")});import Ac from"node:fs/promises";import zp from"node:os";import Pr from"node:path";async function Qp(r){try{let e=await Ac.readdir(r);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=Pr.join(r,"package.json"),n=JSON.parse(await Ac.readFile(t,"utf-8")),s={...n.dependencies,...n.devDependencies};if(n.bin)return"cli-tool";if(n.main&&!s.react&&!s.vue&&!s.angular&&!s.express&&!s.hono)return"library";if((s.react||s.vue)&&(s.express||s.hono||s.fastify))return"fullstack";if(s.react||s.vue||s["@angular/core"]||s.next||s.nuxt)return"web-app";if(s.express||s.hono||s.fastify||s.koa||s.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(n=>["main.py","app.py","server.py"].includes(n))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function Zp(r){let e=[];await dr(Pr.join(zp.homedir(),".claude"))&&e.push("claude"),await E(Pr.join(r,".cursorrules"))&&e.push("cursor"),await E(Pr.join(r,".windsurfrules"))&&e.push("windsurf"),await E(Pr.join(r,".github","copilot-instructions.md"))&&e.push("copilot"),await dr(Pr.join(zp.homedir(),".gemini"))&&e.push("gemini");try{let{execAsync:t}=await Promise.resolve().then(()=>(Ce(),Mu));await t("which codex"),e.push("codex")}catch{await dr(Pr.join(zp.homedir(),".codex"))&&e.push("codex")}return e.length>0?e:["claude"]}async function em(r){let e={language:"Unknown",technologies:[]};try{let t=await Ac.readdir(r);if(t.includes("package.json")){let n=Pr.join(r,"package.json"),s=JSON.parse(await Ac.readFile(n,"utf-8")),o={...s.dependencies,...s.devDependencies};e.language=o.typescript?"TypeScript":"JavaScript",o.next?e.framework="Next.js":o.nuxt?e.framework="Nuxt":o.react?e.framework="React":o.vue?e.framework="Vue":o["@angular/core"]?e.framework="Angular":o.express?e.framework="Express":o.hono?e.framework="Hono":o.fastify?e.framework="Fastify":(o.nestjs||o["@nestjs/core"])&&(e.framework="NestJS"),o.bun||o["@types/bun"]||s.engines?.bun?e.runtime="Bun":e.runtime="Node.js",t.includes("bun.lockb")?e.packageManager="Bun":t.includes("pnpm-lock.yaml")?e.packageManager="pnpm":t.includes("yarn.lock")?e.packageManager="Yarn":t.includes("package-lock.json")&&(e.packageManager="npm"),(o.prisma||o["@prisma/client"])&&e.technologies.push("Prisma"),(o.drizzle||o["drizzle-orm"])&&e.technologies.push("Drizzle"),o.tailwindcss&&e.technologies.push("Tailwind CSS"),o.zod&&e.technologies.push("Zod"),(o.trpc||o["@trpc/server"])&&e.technologies.push("tRPC")}else t.includes("pyproject.toml")||t.includes("requirements.txt")?e.language="Python":t.includes("go.mod")?e.language="Go":t.includes("Cargo.toml")?e.language="Rust":(t.includes("pom.xml")||t.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var yi,Yp,Jv=h(()=>{"use strict";J();yi=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Yp=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}];c(Qp,"detectProjectType");c(Zp,"detectInstalledAgents");c(em,"detectStack")});import*as we from"@clack/prompts";import os from"chalk";var wi,Kv=h(()=>{"use strict";ae();Jv();wi=class{static{c(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){we.intro(os.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:c(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:c(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:c(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:c(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:c(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return we.outro(os.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){g.spin("Auto-detecting project configuration..."),this.detectedType=await Qp(this.projectPath),this.confirmedType=this.detectedType;let e=await Zp(this.projectPath);return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await em(this.projectPath),this.confirmedStack=this.detectedStack,g.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await Qp(this.projectPath);let e=yi.findIndex(n=>n.value===this.detectedType),t=await we.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:yi.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?yi[e].value:void 0});return we.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await Zp(this.projectPath),t=await we.multiselect({message:"Which AI agents do you use?",options:Yp.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return we.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await em(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);we.note(e,"Detected stack");let t=await we.confirm({message:"Is this stack correct?",initialValue:!0});if(we.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await we.group({language:c(()=>we.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:c(()=>we.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:c(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await we.group({verbosity:c(()=>we.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:c(()=>we.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:c(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${os.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${os.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${os.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${os.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${os.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
941
+ `;c(Bv,"writeProjectClaudeMd")});function xc(r,e,t){if(t.md){console.log(`> ${e}`);return}g[r](e)}function L(r,e={}){return n0(r,e),{success:!1,error:r}}function $(r,e={}){return pn(r,e),{success:!1,error:r}}function Le(r,e){let t=w(r);return e&&pn(t,e),{success:!1,error:t}}var n0,Kp,pn,Ot,he=h(()=>{"use strict";H();ae();c(xc,"notify");n0=c((r,e={})=>xc("warn",r,e),"notifyWarn"),Kp=c((r,e={})=>xc("info",r,e),"notifyInfo"),pn=c((r,e={})=>xc("fail",r,e),"notifyFail"),Ot=c((r,e={})=>xc("done",r,e),"notifyDone");c(L,"failWith");c($,"failHard");c(Le,"failFromError")});import ut from"node:path";async function r0(r,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await E(ut.join(r,"pnpm-lock.yaml"))?"pnpm":await E(ut.join(r,"yarn.lock"))?"yarn":await E(ut.join(r,"bun.lockb"))||await E(ut.join(r,"bun.lock"))?"bun":(await E(ut.join(r,"package-lock.json")),"npm")}function Vv(r,e){return r==="yarn"?`yarn ${e}`:r==="pnpm"?`pnpm run ${e}`:r==="bun"?`bun run ${e}`:`npm run ${e}`}function s0(r){return r==="yarn"?"yarn test":r==="pnpm"?"pnpm test":r==="bun"?"bun test":"npm test"}async function oo(r,e){for(let s of o0)if(await E(ut.join(r,s)))return s;let n=(e??await Gn(r)).find(s=>s.endsWith(i0));if(n)return n}async function nr(r){for(let e of a0)if(await E(ut.join(r,e)))return e}async function Pc(r){let e=ut.join(r,"package.json"),t=await Pe(e,null);if(t){let a=await r0(r,t),l=t.scripts||{},u={stack:"js",packageManager:a};return l.lint&&(u.lint={tool:a,command:Vv(a,"lint")}),l.typecheck&&(u.typecheck={tool:a,command:Vv(a,"typecheck")}),l.test&&(u.test={tool:a,command:s0(a)}),u.versionFile=await oo(r),u.changelogFile=await nr(r),u}if(await E(ut.join(r,"pytest.ini"))){let a=await oo(r),l=await nr(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}let n=await At(ut.join(r,"pyproject.toml"),"");if(n.includes("[tool.pytest")||n.includes("pytest")){let a=await oo(r),l=await nr(r);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:a,changelogFile:l}}if(await E(ut.join(r,"Cargo.toml"))){let a=await nr(r);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:a}}if(await E(ut.join(r,"go.mod"))){let a=await oo(r),l=await nr(r);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:a,changelogFile:l}}let s=await Gn(r);if(s.some(a=>a.endsWith(".sln")||a.endsWith(".csproj")||a.endsWith(".fsproj"))){let a=await oo(r,s),l=await nr(r);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:a,changelogFile:l}}if(await E(ut.join(r,"pom.xml"))){let a=await nr(r);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:a}}if(await E(ut.join(r,"gradlew"))&&(await E(ut.join(r,"build.gradle"))||await E(ut.join(r,"build.gradle.kts")))){let a=await nr(r);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:a}}let o=await oo(r),i=await nr(r);return{stack:"unknown",versionFile:o,changelogFile:i}}var o0,i0,a0,Xp=h(()=>{"use strict";J();c(r0,"detectPackageManager");c(Vv,"pmRun");c(s0,"pmTest");o0=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],i0=".csproj",a0=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];c(oo,"detectVersionFile");c(nr,"detectChangelogFile");c(Pc,"detectProjectCommands")});import Ac from"node:fs/promises";import zp from"node:os";import Pr from"node:path";async function Qp(r){try{let e=await Ac.readdir(r);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=Pr.join(r,"package.json"),n=JSON.parse(await Ac.readFile(t,"utf-8")),s={...n.dependencies,...n.devDependencies};if(n.bin)return"cli-tool";if(n.main&&!s.react&&!s.vue&&!s.angular&&!s.express&&!s.hono)return"library";if((s.react||s.vue)&&(s.express||s.hono||s.fastify))return"fullstack";if(s.react||s.vue||s["@angular/core"]||s.next||s.nuxt)return"web-app";if(s.express||s.hono||s.fastify||s.koa||s.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(n=>["main.py","app.py","server.py"].includes(n))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function Zp(r){let e=[];await dr(Pr.join(zp.homedir(),".claude"))&&e.push("claude"),await E(Pr.join(r,".cursorrules"))&&e.push("cursor"),await E(Pr.join(r,".windsurfrules"))&&e.push("windsurf"),await E(Pr.join(r,".github","copilot-instructions.md"))&&e.push("copilot"),await dr(Pr.join(zp.homedir(),".gemini"))&&e.push("gemini");try{let{execAsync:t}=await Promise.resolve().then(()=>(Re(),Mu));await t("which codex"),e.push("codex")}catch{await dr(Pr.join(zp.homedir(),".codex"))&&e.push("codex")}return e.length>0?e:["claude"]}async function em(r){let e={language:"Unknown",technologies:[]};try{let t=await Ac.readdir(r);if(t.includes("package.json")){let n=Pr.join(r,"package.json"),s=JSON.parse(await Ac.readFile(n,"utf-8")),o={...s.dependencies,...s.devDependencies};e.language=o.typescript?"TypeScript":"JavaScript",o.next?e.framework="Next.js":o.nuxt?e.framework="Nuxt":o.react?e.framework="React":o.vue?e.framework="Vue":o["@angular/core"]?e.framework="Angular":o.express?e.framework="Express":o.hono?e.framework="Hono":o.fastify?e.framework="Fastify":(o.nestjs||o["@nestjs/core"])&&(e.framework="NestJS"),o.bun||o["@types/bun"]||s.engines?.bun?e.runtime="Bun":e.runtime="Node.js",t.includes("bun.lockb")?e.packageManager="Bun":t.includes("pnpm-lock.yaml")?e.packageManager="pnpm":t.includes("yarn.lock")?e.packageManager="Yarn":t.includes("package-lock.json")&&(e.packageManager="npm"),(o.prisma||o["@prisma/client"])&&e.technologies.push("Prisma"),(o.drizzle||o["drizzle-orm"])&&e.technologies.push("Drizzle"),o.tailwindcss&&e.technologies.push("Tailwind CSS"),o.zod&&e.technologies.push("Zod"),(o.trpc||o["@trpc/server"])&&e.technologies.push("tRPC")}else t.includes("pyproject.toml")||t.includes("requirements.txt")?e.language="Python":t.includes("go.mod")?e.language="Go":t.includes("Cargo.toml")?e.language="Rust":(t.includes("pom.xml")||t.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var yi,Yp,Jv=h(()=>{"use strict";J();yi=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Yp=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"}];c(Qp,"detectProjectType");c(Zp,"detectInstalledAgents");c(em,"detectStack")});import*as we from"@clack/prompts";import os from"chalk";var wi,Kv=h(()=>{"use strict";ae();Jv();wi=class{static{c(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){we.intro(os.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:c(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:c(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:c(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:c(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:c(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return we.outro(os.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){g.spin("Auto-detecting project configuration..."),this.detectedType=await Qp(this.projectPath),this.confirmedType=this.detectedType;let e=await Zp(this.projectPath);return this.selectedAgents=e.length>0?e:["claude"],this.detectedStack=await em(this.projectPath),this.confirmedStack=this.detectedStack,g.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await Qp(this.projectPath);let e=yi.findIndex(n=>n.value===this.detectedType),t=await we.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:yi.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValue:e>=0?yi[e].value:void 0});return we.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await Zp(this.projectPath),t=await we.multiselect({message:"Which AI agents do you use?",options:Yp.map(n=>({label:n.title,hint:n.description,value:n.value})),initialValues:e,required:!0});return we.isCancel(t)?(this.handleCancel(),!1):(this.selectedAgents=t.length>0?t:["claude"],!0)}async stepStack(){this.detectedStack=await em(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);we.note(e,"Detected stack");let t=await we.confirm({message:"Is this stack correct?",initialValue:!0});if(we.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let n=await we.group({language:c(()=>we.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:c(()=>we.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:c(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:n.language||this.detectedStack.language,framework:n.framework||void 0}}return!0}async stepPreferences(){let e=await we.group({verbosity:c(()=>we.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:c(()=>we.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:c(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${os.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${os.cyan("AI Agents:")} ${this.selectedAgents.map(n=>this.getAgentLabel(n)).join(", ")}`,`${os.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${os.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${os.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
942
942
  `);we.note(e,"Configuration Summary");let t=await we.confirm({message:"Generate configuration with these settings?",initialValue:!0});return we.isCancel(t)||!t?(we.isCancel(t)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,we.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return yi.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Yp.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});var Zv={};A(Zv,{UpdateChecker:()=>_c,default:()=>io,getUpdateNotificationSync:()=>p0,triggerBackgroundRefreshIfStale:()=>m0});import{spawn as c0}from"node:child_process";import tm from"node:fs";import l0 from"node:https";import jc from"node:path";import Ar from"chalk";function d0(r,e){let t=r.split(".").map(Number),n=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]||0,i=n[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Yv(){try{let r=tm.readFileSync(zv(),"utf-8");return JSON.parse(r)}catch{return null}}function Qv(r,e){let t=`Update available! ${r} \u2192 ${e}`,n="prjct upgrade",s=Math.max(t.length,`Run: ${n}`.length)+4,o=`\u250C${"\u2500".repeat(s)}\u2510`,i=`\u2514${"\u2500".repeat(s)}\u2518`,a=c(l=>`\u2502 ${l}${" ".repeat(s-l.length-2)}\u2502`,"pad");return["",Ar.yellow(o),Ar.yellow(a("")),Ar.yellow(`\u2502 ${Ar.bold(t)}${" ".repeat(s-t.length-2)}\u2502`),Ar.yellow(`\u2502 Run: ${Ar.cyan(n)}${" ".repeat(s-n.length-7)}\u2502`),Ar.yellow(a("")),Ar.yellow(i),""].join(`
943
943
  `)}function p0(r){if(!r)return null;let e=Yv();return!e?.latestVersion||d0(e.latestVersion,r)<=0?null:Qv(r,e.latestVersion)}function m0(){try{let e=Yv();if(e?.lastCheck&&Date.now()-e.lastCheck<u0)return}catch{}try{tm.mkdirSync(Xv(),{recursive:!0})}catch{return}let r=jc.join(mt,"assets","scripts","refresh-update.mjs");if(tm.existsSync(r))try{c0(process.execPath,[r,zv()],{detached:!0,stdio:"ignore"}).unref()}catch{}}var _c,io,Xv,zv,u0,$c=h(()=>{"use strict";H();J();_e();ge();_c=class{static{c(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=_.globalConfigDir,this.cacheFile=jc.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=jc.join(__dirname,"..","..","package.json");return(await Pe(e))?.version??null}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let n={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=l0.request(n,o=>{let i="";o.on("data",a=>{i+=a}),o.on("end",()=>{try{if(o.statusCode===200){let a=JSON.parse(i);e(a.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(a){t(a)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let n=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=n[o]||0,a=s[o]||0;if(i>a)return 1;if(i<a)return-1}return 0}async readCache(){try{if(await E(this.cacheFile))return await Pe(this.cacheFile)}catch{}return null}async writeCache(e){try{await fe(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),n=Date.now();if(t?.lastCheck&&n-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:n,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:Qv(e.currentVersion,e.latestVersion)}},io=_c,Xv=c(()=>_.globalConfigDir,"updateCacheDir"),zv=c(()=>jc.join(Xv(),"update-cache.json"),"updateCacheFile"),u0=1440*60*1e3;c(d0,"compareSemver");c(Yv,"readCacheSync");c(Qv,"formatUpdateBanner");c(p0,"getUpdateNotificationSync");c(m0,"triggerBackgroundRefreshIfStale")});import eS from"node:path";async function h0(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let r=process.cwd();if(await E(eS.join(r,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await E(eS.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function y0(){return{...f0}}function w0(){return{...g0}}async function tS(){return Ic||(Ic=await h0()?y0():w0(),Ic)}var Ic,f0,g0,nS=h(()=>{"use strict";J();Ic=null,f0={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"/p:",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},g0={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};c(h0,"isClaudeEnvironment");c(y0,"getClaudeAgent");c(w0,"getTerminalAgent");c(tS,"detect")});import Dc from"node:fs/promises";var nm,rS,sS=h(()=>{"use strict";H();J();nm=class{static{c(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let n={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${n[t]||n.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${w(t)}`)}return await Dc.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(n){console.warn(`MCP writeFile failed, falling back to fs: ${w(n)}`)}await Dc.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${w(t)}`)}return await Dc.readdir(e)}async fileExists(e){return E(e)}async createDirectory(e){await Dc.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
944
944
  ${e.map((t,n)=>`${n+1}. ${t}`).join(`
@@ -985,7 +985,7 @@ Or type /p:help to see all options`,stuck:`Let's break it down:
985
985
 
986
986
  Or: /p:now | /p:task | /p:idea`}[e]||`What would you like to do?
987
987
 
988
- Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},rS=nm});function oS(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&b0.has(e.code))return!0;if(e.code&&aS.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function v0(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&aS.has(e.code))}function iS(r,e,t){let n=jr.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(jr.delete(r),!1):!0:!1}function rm(r,e){let t=jr.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),jr.set(r,t)}function S0(r){jr.delete(r)}var b0,aS,jr,Mc,cS,QX,lS=h(()=>{"use strict";b0=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),aS=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);c(oS,"isTransientError");c(v0,"isPermanentError");jr=new Map;c(iS,"isCircuitOpen");c(rm,"recordFailure");c(S0,"recordSuccess");Mc=class{static{c(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(iS(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return S0(t),o}catch(o){if(n=o,s++,v0(o))throw rm(t,this.options.circuitBreakerThreshold),o;if(!(oS(o)&&s<this.options.maxAttempts))throw rm(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,a))}throw rm(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return oS(e)}isCircuitOpen(e){return iS(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return jr.get(e)}resetCircuit(e){jr.delete(e)}resetAllCircuits(){jr.clear()}},cS=new Mc({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),QX=new Mc({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var E0,sm,Oc,uS=h(()=>{"use strict";lr();nS();sS();lS();E0=["claude"],sm=class{static{c(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await cS.execute(async()=>{if(this.agentInfo=await tS(),!this.agentInfo?.isSupported)throw Uo.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!E0.includes(e))throw Uo.notSupported(this.agentInfo?.type??"unknown");return this.agent=new rS,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Oc=new sm});var om,im,dS=h(()=>{"use strict";om=class{static{c(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},im=new om});var q,Re=h(()=>{"use strict";$c();uS();dS();Yn();Nc();q=class{static{c(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new io,this.updateNotificationShown=!1}get agent(){return Oc.getAgent()}get agentInfo(){return Oc.getInfo()}get currentAuthor(){return Dn.getCurrentAuthor()}async initializeAgent(){return Oc.initialize()}async ensureProjectInit(e){return Dn.ensureInit(e)}async ensureAuthor(){return Dn.ensureAuthor()}async getGlobalProjectPath(e){return Dn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();await Xe.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Dn.isEmptyDirectory(e)}async _detectExistingCode(e){return Dn.hasExistingCode(e)}_breakdownFeatureTasks(e){return im.breakdownFeature(e)}_detectBugSeverity(e){return im.detectBugSeverity(e)}}});import Yt from"node:fs/promises";import mn from"node:path";var am,T0,et,pS=h(()=>{"use strict";H();Ce();J();am=class{static{c(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=mn.join(this.projectPath,"package.json"),t=await Yt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(W(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=mn.join(this.projectPath,"Cargo.toml");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readRequirements(){try{let e=mn.join(this.projectPath,"requirements.txt");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readGoMod(){try{let e=mn.join(this.projectPath,"go.mod");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readGemfile(){try{let e=mn.join(this.projectPath,"Gemfile");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readMixExs(){try{let e=mn.join(this.projectPath,"mix.exs");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readPomXml(){try{let e=mn.join(this.projectPath,"pom.xml");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readComposerJson(){try{let e=mn.join(this.projectPath,"composer.json"),t=await Yt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(W(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=mn.join(this.projectPath,"pyproject.toml");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await G('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
988
+ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(start|empez|begin|quiero|want|let'?s|voy)/i.test(t)?{intent:"start",command:"now"}:/^(done|termin|finish|acab|complete|listo|ya)/i.test(t)?{intent:"complete",command:"done"}:/^(ship|deploy|launch|public)/i.test(t)?{intent:"ship",command:"ship"}:/^(idea|think|thought|ocurr|tengo)/i.test(t)?{intent:"idea",command:"idea"}:/(show|see|view|muestra|ver).*(progress|status|recap|avance)/i.test(t)||/^(progress|status|recap|avance)/i.test(t)?{intent:"status",command:"recap"}:/^(stuck|help|ayud|atascado|perdido)/i.test(t)?{intent:"stuck",command:"stuck"}:/(what|que).*(next|sigue|after|despues)/i.test(t)||/^(next|sigue)/i.test(t)?{intent:"next",command:"next"}:{intent:"unknown",command:null}}},rS=nm});function oS(r){if(!r||typeof r!="object")return!1;let e=r;if(e.code&&b0.has(e.code))return!0;if(e.code&&aS.has(e.code))return!1;if(e.message){let t=e.message.toLowerCase();if(t.includes("timeout")||t.includes("timed out"))return!0}return!1}function v0(r){if(!r||typeof r!="object")return!1;let e=r;return!!(e.code&&aS.has(e.code))}function iS(r,e,t){let n=jr.get(r);return n&&n.consecutiveFailures>=e&&n.openedAt?Date.now()-n.openedAt>=t?(jr.delete(r),!1):!0:!1}function rm(r,e){let t=jr.get(r)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),jr.set(r,t)}function S0(r){jr.delete(r)}var b0,aS,jr,Mc,cS,QX,lS=h(()=>{"use strict";b0=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),aS=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);c(oS,"isTransientError");c(v0,"isPermanentError");jr=new Map;c(iS,"isCircuitOpen");c(rm,"recordFailure");c(S0,"recordSuccess");Mc=class{static{c(this,"RetryPolicy")}options;constructor(e={}){this.options={maxAttempts:e.maxAttempts??3,baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??8e3,circuitBreakerThreshold:e.circuitBreakerThreshold??5,circuitBreakerTimeoutMs:e.circuitBreakerTimeoutMs??6e4}}async execute(e,t="default"){if(iS(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let n,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return S0(t),o}catch(o){if(n=o,s++,v0(o))throw rm(t,this.options.circuitBreakerThreshold),o;if(!(oS(o)&&s<this.options.maxAttempts))throw rm(t,this.options.circuitBreakerThreshold),o;let a=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,a))}throw rm(t,this.options.circuitBreakerThreshold),n}isTransientError(e){return oS(e)}isCircuitOpen(e){return iS(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return jr.get(e)}resetCircuit(e){jr.delete(e)}resetAllCircuits(){jr.clear()}},cS=new Mc({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),QX=new Mc({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var E0,sm,Oc,uS=h(()=>{"use strict";lr();nS();sS();lS();E0=["claude"],sm=class{static{c(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await cS.execute(async()=>{if(this.agentInfo=await tS(),!this.agentInfo?.isSupported)throw Uo.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!E0.includes(e))throw Uo.notSupported(this.agentInfo?.type??"unknown");return this.agent=new rS,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},Oc=new sm});var om,im,dS=h(()=>{"use strict";om=class{static{c(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},im=new om});var q,xe=h(()=>{"use strict";$c();uS();dS();Yn();Nc();q=class{static{c(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new io,this.updateNotificationShown=!1}get agent(){return Oc.getAgent()}get agentInfo(){return Oc.getInfo()}get currentAuthor(){return Dn.getCurrentAuthor()}async initializeAgent(){return Oc.initialize()}async ensureProjectInit(e){return Dn.ensureInit(e)}async ensureAuthor(){return Dn.ensureAuthor()}async getGlobalProjectPath(e){return Dn.getGlobalPath(e)}async logToMemory(e,t,n){let s=await this.ensureAuthor();await Xe.log(e,t,n,s.name)}async _detectEmptyDirectory(e){return Dn.isEmptyDirectory(e)}async _detectExistingCode(e){return Dn.hasExistingCode(e)}_breakdownFeatureTasks(e){return im.breakdownFeature(e)}_detectBugSeverity(e){return im.detectBugSeverity(e)}}});import Yt from"node:fs/promises";import mn from"node:path";var am,T0,et,pS=h(()=>{"use strict";H();Re();J();am=class{static{c(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=mn.join(this.projectPath,"package.json"),t=await Yt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(W(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=mn.join(this.projectPath,"Cargo.toml");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readRequirements(){try{let e=mn.join(this.projectPath,"requirements.txt");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readGoMod(){try{let e=mn.join(this.projectPath,"go.mod");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readGemfile(){try{let e=mn.join(this.projectPath,"Gemfile");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readMixExs(){try{let e=mn.join(this.projectPath,"mix.exs");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readPomXml(){try{let e=mn.join(this.projectPath,"pom.xml");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async readComposerJson(){try{let e=mn.join(this.projectPath,"composer.json"),t=await Yt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(W(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=mn.join(this.projectPath,"pyproject.toml");return await Yt.readFile(e,"utf-8")}catch(e){if(W(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await G('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/.next/*" | sed "s/.*\\./\\./" | sort | uniq -c | sort -rn',{cwd:this.projectPath}),t={};return e.trim().split(`
989
989
  `).filter(Boolean).forEach(n=>{let s=n.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await Yt.readdir(this.projectPath),t=[/^package\.json$/,/^Cargo\.toml$/,/^go\.mod$/,/^requirements\.txt$/,/^Gemfile$/,/^mix\.exs$/,/^pom\.xml$/,/^composer\.json$/,/^pyproject\.toml$/,/^tsconfig.*\.json$/,/^\..*rc(\.json|\.js|\.cjs)?$/,/^Dockerfile$/,/^docker-compose.*\.ya?ml$/,/^\.env.*$/];return e.filter(n=>t.some(s=>s.test(n)))}catch(e){if(W(e))return[];throw e}}async listDirectories(){try{return(await Yt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(W(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await G(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await G("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await G('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:n}=await G('git log --reverse --pretty=format:"%ar" | head -1',{cwd:this.projectPath});return{totalCommits:parseInt(e.trim(),10)||0,contributors:parseInt(t.trim(),10)||0,age:n.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await G('find . -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" | wc -l',{cwd:this.projectPath});return parseInt(e.trim(),10)||0}catch{return 0}}async fileExists(e){return E(mn.join(this.projectPath,e))}async readFile(e){try{let t=mn.join(this.projectPath,e);return await Yt.readFile(t,"utf-8")}catch(t){if(W(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await G(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
990
990
  `).filter(Boolean)}catch{return[]}}},T0=new am,et=T0});var cm=h(()=>{"use strict"});import C0 from"node:fs/promises";import R0 from"node:path";function ao(r){return r.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function x0(r,e){let t=[],n=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of n)t.push(...ao(m));let s=[/export\s+(?:async\s+)?function\s+(\w+)/g,/export\s+class\s+(\w+)/g,/export\s+interface\s+(\w+)/g,/export\s+type\s+(\w+)/g,/export\s+(?:const|let|var)\s+(\w+)/g,/export\s+default\s+(?:class|function)\s+(\w+)/g];for(let m of s){let f;for(;(f=m.exec(r))!==null;)f[1]&&t.push(...ao(f[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let f;for(;(f=m.exec(r))!==null;)f[1]&&t.push(...ao(f[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,a;for(;(a=i.exec(r))!==null;){let m=a[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(...ao(m));else{let f=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...ao(f))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(r))!==null;){let m=u[1].toLowerCase().split(/\s+/).filter(f=>f.length>2);t.push(...m)}let d=/\/\*\*?([\s\S]*?)\*\//g,p;for(;(p=d.exec(r))!==null;){let m=p[1].replace(/@\w+/g,"").replace(/\*/g,"").toLowerCase().split(/\s+/).filter(f=>f.length>2&&/^[a-z]+$/.test(f));t.push(...m)}return t.filter(m=>m.length>1&&!gS.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function P0(r){return r.split(/\s+/).flatMap(e=>ao(e)).filter(e=>e.length>1&&!gS.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function A0(r){let e=await Un(r),t={},n={},s=0,o=await Wr(e,50,async a=>{try{let l=await C0.readFile(R0.join(r,a),"utf-8"),u=x0(l,a);return u.length>0?{filePath:a,tokens:u}:null}catch{return null}});for(let{filePath:a,tokens:l}of o){t[a]={tokens:l,length:l.length},s+=l.length;let u=new Map;for(let d of l)u.set(d,(u.get(d)||0)+1);for(let[d,p]of u)n[d]||(n[d]=[]),n[d].push({path:a,tf:p})}let i=Object.keys(t).length;return{documents:t,invertedIndex:n,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function j0(r,e){return Math.log((e-r+.5)/(r+.5)+1)}function _0(r,e){let t=P0(r);if(t.length===0)return[];let n=new Map;for(let s of t){let o=e.invertedIndex[s];if(!o)continue;let i=j0(o.length,e.totalDocs);for(let{path:a,tf:l}of o){let u=e.documents[a];if(!u)continue;let d=l*(1.2+1),p=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);n.set(a,(n.get(a)||0)+m)}}return Array.from(n.entries()).map(([s,o])=>({path:s,score:o})).sort((s,o)=>o.score-s.score)}function $0(r,e){let t={invertedIndex:e.invertedIndex,avgDocLength:e.avgDocLength,totalDocs:e.totalDocs,builtAt:e.builtAt,docLengths:Object.fromEntries(Object.entries(e.documents).map(([n,s])=>[n,s.length]))};S.setDoc(r,lm,t),Lc.delete(r)}function Fc(r){let e=S.get(r,"SELECT updated_at FROM kv_store WHERE key = ?",lm);if(!e)return Lc.delete(r),null;let t=Lc.get(r);if(t&&t.updatedAt===e.updated_at)return t.index;let n=S.getDoc(r,lm);if(!n)return null;let s={};for(let[i,a]of Object.entries(n.docLengths))s[i]={tokens:[],length:a};let o={documents:s,invertedIndex:n.invertedIndex,avgDocLength:n.avgDocLength,totalDocs:n.totalDocs,builtAt:n.builtAt};return Lc.set(r,{index:o,updatedAt:e.updated_at}),o}async function hS(r,e){let t=await A0(r);return $0(e,t),t}function yS(r,e,t=15){let n=Fc(r);return n?_0(e,n).slice(0,t):[]}var gS,lm,Lc,Hc=h(()=>{"use strict";cm();X();J();gS=new Set(["the","a","an","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","of","in","to","for","with","on","at","from","by","as","or","and","but","if","not","no","so","up","out","this","that","it","its","all","any","import","export","default","const","let","var","function","class","interface","type","return","new","true","false","null","undefined","void","async","await","static","public","private","protected","readonly","string","number","boolean","object","array"]);c(ao,"splitIdentifier");c(x0,"tokenizeFile");c(P0,"tokenizeQuery");c(A0,"buildIndex");c(j0,"idf");c(_0,"score");lm="bm25-index",Lc=new Map;c($0,"saveIndex");c(Fc,"loadIndex");c(hS,"indexProject");c(yS,"queryFiles")});import wS from"node:fs/promises";import kS from"node:path";async function dm(r,e,t,n){let[s,o,i,a]=await Promise.all([M0(r,e,n),O0(r),N0(r),L0(r)]);return{project:{name:n.name,ecosystem:n.ecosystem,languages:n.languages,frameworks:n.frameworks,fileCount:n.fileCount,projectType:n.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,I0).map(l=>({message:l.message,date:l.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:s,existingPatterns:o,taskHistory:i,previousAnalysis:a??void 0}}async function M0(r,e,t){let n=[],s=[...t.frameworks.map(a=>a.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=yS(r,s,um*2);for(let a of o){if(n.length>=um)break;try{let l=kS.join(e,a.path),u=await wS.readFile(l,"utf-8");u.length>Uc*3?n.push({path:a.path,content:`${u.slice(0,Uc)}
991
991
  // ... truncated`,reason:`BM25 score: ${a.score.toFixed(2)} (truncated, ${u.length} chars)`}):n.push({path:a.path,content:u.slice(0,Uc),reason:`BM25 score: ${a.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let a of i){if(n.length>=um)break;if(!n.some(l=>l.path===a))try{let l=kS.join(e,a),u=await wS.readFile(l,"utf-8");n.push({path:a,content:u.slice(0,Uc),reason:"entry point"})}catch{}}return n}async function O0(r){try{let e=await Ze.getActive(r);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function N0(r){try{return(await K.getTaskHistory(r)).slice(0,D0).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function L0(r){try{let e=ht.getActiveSummary(r);return Promise.resolve(e)}catch(e){return B.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var Uc,um,I0,D0,bS=h(()=>{"use strict";Hc();Tr();Yr();Et();$t();Uc=800,um=6,I0=8,D0=5;c(dm,"buildAnalysisPayload");c(M0,"selectCodeSamples");c(O0,"getExistingPatterns");c(N0,"getTaskHistory");c(L0,"getPreviousAnalysisSummary")});import pm from"node:fs/promises";import vS from"node:os";import mm from"node:path";function F0(){return process.env.PRJCT_TEST_MODE==="1"?mm.join(vS.tmpdir(),"prjct-codex-test","config.toml"):mm.join(vS.homedir(),".codex","config.toml")}function SS(r){return`"${r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function H0(r=js.prjct){let e=(r.args??[]).map(SS).join(", ");return[ES,"[mcp_servers.prjct]",`command = ${SS(r.command)}`,`args = [${e}]`,fm,""].join(`
@@ -994,7 +994,7 @@ Type /p:help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
994
994
 
995
995
  ${t}`:n=t}return n===e?{path:r,changed:!1}:(await pm.mkdir(mm.dirname(r),{recursive:!0}),await pm.writeFile(r,n,"utf-8"),{path:r,changed:!0})}var ES,fm,CS=h(()=>{"use strict";ha();ES="# prjct:mcp:start - managed by prjct, do not edit between markers",fm="# prjct:mcp:end";c(F0,"getCodexConfigTomlPath");c(SS,"tomlString");c(H0,"buildPrjctMcpTomlBlock");c(TS,"ensureCodexMcpServer")});async function Wc(r={}){r.silent||console.log(`
996
996
  \u{1F50C} Configuring MCP servers...`);try{await Tn.install();let e=r.verifyContext7===!1?null:await Tn.verify();r.silent||(e?.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e?.message||""}`),console.log(" It will activate on the next time you open your AI client.")))}catch(e){r.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${w(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of U0)try{let t=_s();await Ly(e.name,t)?r.silent||console.log(e.ready):(await Ny(e.name,js[e.name]),r.silent||console.log(e.added))}catch(t){r.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${w(t)}`),console.log(e.manual))}try{if((await Rn()).installed){let t=await TS();r.silent||(t.skipped==="user-managed"?console.log("\u2705 prjct MCP already configured for Codex (user-managed)"):t.changed?console.log("\u2705 prjct MCP added to ~/.codex/config.toml"):console.log("\u2705 prjct MCP already configured for Codex"))}}catch(e){r.silent||(console.log(`\u26A0\uFE0F Codex MCP setup failed: ${w(e)}`),console.log(" Run `prjct start` again to retry."))}}var U0,gm=h(()=>{"use strict";Be();Is();H();CS();ha();U0=[{name:"prjct",ready:"\u2705 prjct MCP already configured",added:"\u2705 prjct MCP added to mcp.json",failed:"prjct MCP setup failed",manual:" Run `prjct start` again to retry."}];c(Wc,"setupMcpServers")});async function G0(r,e=100){try{let{stdout:t}=await G(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:r,maxBuffer:10485760}),n=[],s=null;for(let o of t.split(`
997
- `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&n.push(s),s=new Set):i&&s&&B0(i)&&s.add(i)}return s&&s.size>0&&s.size<=30&&n.push(s),n}catch{return[]}}function B0(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function q0(r,e=100){let t=await G0(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let l of a)n.set(l,(n.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=V0(a[l],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[l,u]=i.split("\0"),d=n.get(l)||0,p=n.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,f=m>0?a/m:0;f<.1||(o[l]||(o[l]={}),o[u]||(o[u]={}),o[l][u]=f,o[u][l]=f)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function V0(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function J0(r,e){S.setDoc(r,hm,e),Gc.delete(r)}function PS(r){let e=S.get(r,"SELECT updated_at FROM kv_store WHERE key = ?",hm);if(!e)return Gc.delete(r),null;let t=Gc.get(r);if(t&&t.updatedAt===e.updated_at)return t.matrix;let n=S.getDoc(r,hm);return n&&Gc.set(r,{matrix:n,updatedAt:e.updated_at}),n}async function AS(r,e,t=100){let n=await q0(r,t);return J0(e,n),n}var hm,Gc,ym=h(()=>{"use strict";cm();X();Ce();c(G0,"parseGitLog");c(B0,"isSourceFile");c(q0,"buildMatrix");c(V0,"pairKey");hm="cochange-index",Gc=new Map;c(J0,"saveMatrix");c(PS,"loadMatrix");c(AS,"indexCoChanges")});import jS from"node:fs/promises";import co from"node:path";function K0(r){let e=[],t,n=new RegExp(Py.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function X0(r,e,t){let n;if(r.startsWith("@/"))n=co.join(t,"src",r.slice(2));else{let s=co.dirname(co.join(t,e));n=co.resolve(s,r)}for(let s of xy){let o=n+s;try{if((await jS.stat(o)).isFile())return co.relative(t,o)}catch{}}return null}async function z0(r){let e=await Un(r),t={},n={},s=0,o=await Wr(e,50,async i=>{try{let a=await jS.readFile(co.join(r,i),"utf-8"),l=K0(a),u=[];for(let d of l){let p=await X0(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,s+=a.length;for(let l of a)n[l]||(n[l]=[]),n[l].push(i)}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function Y0(r,e){S.setDoc(r,wm,e),Bc.delete(r)}function qc(r){let e=S.get(r,"SELECT updated_at FROM kv_store WHERE key = ?",wm);if(!e)return Bc.delete(r),null;let t=Bc.get(r);if(t&&t.updatedAt===e.updated_at)return t.graph;let n=S.getDoc(r,wm);return n&&Bc.set(r,{graph:n,updatedAt:e.updated_at}),n}async function _S(r,e){let t=await z0(r);return Y0(e,t),t}var wm,Bc,Vc=h(()=>{"use strict";Ou();X();J();c(K0,"extractImportSources");c(X0,"resolveImport");c(z0,"buildGraph");wm="import-graph",Bc=new Map;c(Y0,"saveGraph");c(qc,"loadGraph");c(_S,"indexImports")});import{z as Z}from"zod";var Q0,Z0,$S,eD,tD,nD,rD,sD,IS,DS=h(()=>{"use strict";Q0=Z.enum(["low","medium","high"]),Z0=Z.enum(["pending","converted","completed","archived","dormant"]),$S=Z.enum(["high","medium","low"]),eD=Z.object({impact:$S,effort:$S}),tD=Z.object({frontend:Z.string().optional(),backend:Z.string().optional(),payments:Z.string().optional(),ai:Z.string().optional(),deploy:Z.string().optional(),other:Z.array(Z.string()).optional()}),nD=Z.object({name:Z.string(),description:Z.string()}),rD=Z.object({name:Z.string(),description:Z.string().optional()}),sD=Z.object({id:Z.string(),text:Z.string(),details:Z.string().optional(),priority:Q0,status:Z0,tags:Z.array(Z.string()),addedAt:Z.string(),completedAt:Z.string().optional(),convertedTo:Z.string().optional(),source:Z.string().optional(),sourceFiles:Z.array(Z.string()).optional(),painPoints:Z.array(Z.string()).optional(),solutions:Z.array(Z.string()).optional(),filesAffected:Z.array(Z.string()).optional(),impactEffort:eD.optional(),implementationNotes:Z.string().optional(),stack:tD.optional(),modules:Z.array(nD).optional(),roles:Z.array(rD).optional(),risks:Z.array(Z.string()).optional(),risksCount:Z.number().optional()}),IS=Z.object({ideas:Z.array(sD),lastUpdated:Z.string()})});var km,is,Jc=h(()=>{"use strict";DS();Xn();le();vr();Er();km=class extends ct{static{c(this,"IdeasStorage")}constructor(){super("ideas.json",IS)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:Ke(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:T()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:T()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:T()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:T()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:T()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:T()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:T()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,l)=>new Date(l.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(l=>!o.has(l.id)),lastUpdated:T()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Ms(zn.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;gt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:T()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},is=new km});import oD from"node:fs/promises";function I(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function fn(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function Nt(r){try{let e=await oD.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(W(e)||e instanceof SyntaxError)return null;throw e}}var Kc,Xc,zc=h(()=>{"use strict";H();c(I,"toStr");c(fn,"toNum");c(Nt,"readJsonSafe");Kc=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],Xc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}]});import Lt from"node:fs/promises";import _r from"node:path";async function MS(r,e,t){let n=_r.join(e,"checksums.json"),s=await Nt(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=j.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[l,u]of Object.entries(o))a.run(l,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function OS(r,e,t){let n=_r.join(e,"file-scores.json"),s=await Nt(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=j.getDb(r),a=i.prepare(`
997
+ `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&n.push(s),s=new Set):i&&s&&B0(i)&&s.add(i)}return s&&s.size>0&&s.size<=30&&n.push(s),n}catch{return[]}}function B0(r){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(r)&&!r.includes("node_modules/")}async function q0(r,e=100){let t=await G0(r,e),n=new Map,s=new Map;for(let i of t){let a=Array.from(i);for(let l of a)n.set(l,(n.get(l)||0)+1);for(let l=0;l<a.length;l++)for(let u=l+1;u<a.length;u++){let d=V0(a[l],a[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,a]of s){let[l,u]=i.split("\0"),d=n.get(l)||0,p=n.get(u)||0;if(d<2||p<2)continue;let m=d+p-a,f=m>0?a/m:0;f<.1||(o[l]||(o[l]={}),o[u]||(o[u]={}),o[l][u]=f,o[u][l]=f)}return{matrix:o,commitsAnalyzed:t.length,filesAnalyzed:n.size,builtAt:new Date().toISOString()}}function V0(r,e){return r<e?`${r}\0${e}`:`${e}\0${r}`}function J0(r,e){S.setDoc(r,hm,e),Gc.delete(r)}function PS(r){let e=S.get(r,"SELECT updated_at FROM kv_store WHERE key = ?",hm);if(!e)return Gc.delete(r),null;let t=Gc.get(r);if(t&&t.updatedAt===e.updated_at)return t.matrix;let n=S.getDoc(r,hm);return n&&Gc.set(r,{matrix:n,updatedAt:e.updated_at}),n}async function AS(r,e,t=100){let n=await q0(r,t);return J0(e,n),n}var hm,Gc,ym=h(()=>{"use strict";cm();X();Re();c(G0,"parseGitLog");c(B0,"isSourceFile");c(q0,"buildMatrix");c(V0,"pairKey");hm="cochange-index",Gc=new Map;c(J0,"saveMatrix");c(PS,"loadMatrix");c(AS,"indexCoChanges")});import jS from"node:fs/promises";import co from"node:path";function K0(r){let e=[],t,n=new RegExp(Py.source,"g");for(;(t=n.exec(r))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function X0(r,e,t){let n;if(r.startsWith("@/"))n=co.join(t,"src",r.slice(2));else{let s=co.dirname(co.join(t,e));n=co.resolve(s,r)}for(let s of xy){let o=n+s;try{if((await jS.stat(o)).isFile())return co.relative(t,o)}catch{}}return null}async function z0(r){let e=await Un(r),t={},n={},s=0,o=await Wr(e,50,async i=>{try{let a=await jS.readFile(co.join(r,i),"utf-8"),l=K0(a),u=[];for(let d of l){let p=await X0(d,i,r);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:a}of o){t[i]=a,s+=a.length;for(let l of a)n[l]||(n[l]=[]),n[l].push(i)}return{forward:t,reverse:n,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function Y0(r,e){S.setDoc(r,wm,e),Bc.delete(r)}function qc(r){let e=S.get(r,"SELECT updated_at FROM kv_store WHERE key = ?",wm);if(!e)return Bc.delete(r),null;let t=Bc.get(r);if(t&&t.updatedAt===e.updated_at)return t.graph;let n=S.getDoc(r,wm);return n&&Bc.set(r,{graph:n,updatedAt:e.updated_at}),n}async function _S(r,e){let t=await z0(r);return Y0(e,t),t}var wm,Bc,Vc=h(()=>{"use strict";Ou();X();J();c(K0,"extractImportSources");c(X0,"resolveImport");c(z0,"buildGraph");wm="import-graph",Bc=new Map;c(Y0,"saveGraph");c(qc,"loadGraph");c(_S,"indexImports")});import{z as Z}from"zod";var Q0,Z0,$S,eD,tD,nD,rD,sD,IS,DS=h(()=>{"use strict";Q0=Z.enum(["low","medium","high"]),Z0=Z.enum(["pending","converted","completed","archived","dormant"]),$S=Z.enum(["high","medium","low"]),eD=Z.object({impact:$S,effort:$S}),tD=Z.object({frontend:Z.string().optional(),backend:Z.string().optional(),payments:Z.string().optional(),ai:Z.string().optional(),deploy:Z.string().optional(),other:Z.array(Z.string()).optional()}),nD=Z.object({name:Z.string(),description:Z.string()}),rD=Z.object({name:Z.string(),description:Z.string().optional()}),sD=Z.object({id:Z.string(),text:Z.string(),details:Z.string().optional(),priority:Q0,status:Z0,tags:Z.array(Z.string()),addedAt:Z.string(),completedAt:Z.string().optional(),convertedTo:Z.string().optional(),source:Z.string().optional(),sourceFiles:Z.array(Z.string()).optional(),painPoints:Z.array(Z.string()).optional(),solutions:Z.array(Z.string()).optional(),filesAffected:Z.array(Z.string()).optional(),impactEffort:eD.optional(),implementationNotes:Z.string().optional(),stack:tD.optional(),modules:Z.array(nD).optional(),roles:Z.array(rD).optional(),risks:Z.array(Z.string()).optional(),risksCount:Z.number().optional()}),IS=Z.object({ideas:Z.array(sD),lastUpdated:Z.string()})});var km,is,Jc=h(()=>{"use strict";DS();Xn();le();vr();Er();km=class extends ct{static{c(this,"IdeasStorage")}constructor(){super("ideas.json",IS)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(n=>n.status==="pending")}async addIdea(e,t,n={}){let s={id:Ke(),text:t,status:"pending",priority:n.priority||"medium",tags:n.tags||[],addedAt:T()};return await this.update(e,o=>({ideas:[s,...o.ideas],lastUpdated:T()})),await this.publishEvent(e,"idea.created",{ideaId:s.id,text:s.text,priority:s.priority}),s}async getById(e,t){return(await this.read(e)).ideas.find(s=>s.id===t)}async convertToFeature(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:n}:o),lastUpdated:T()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:n})}async archive(e,t){await this.update(e,n=>({ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:T()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:n}:o),lastUpdated:T()}))}async addTags(e,t,n){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...n])]}:o),lastUpdated:T()}))}async removeIdea(e,t){await this.update(e,n=>({ideas:n.ideas.filter(s=>s.id!==t),lastUpdated:T()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(n=>n.status==="pending").length,converted:t.ideas.filter(n=>n.status==="converted").length,archived:t.ideas.filter(n=>n.status==="archived").length}}async cleanup(e){let n=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(n.length<=50)return{removed:0};let s=n.sort((a,l)=>new Date(l.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(s.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(l=>!o.has(l.id)),lastUpdated:T()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),n=Ms(zn.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<n);if(s.length===0)return 0;gt.archiveMany(e,s.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(s.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:T()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},is=new km});import oD from"node:fs/promises";function I(r){return r==null?null:typeof r=="string"?r:typeof r=="number"||typeof r=="boolean"||typeof r=="bigint"?String(r):JSON.stringify(r)}function fn(r){if(r==null)return null;if(typeof r=="number")return r;if(typeof r=="string"){let e=Number(r);return Number.isNaN(e)?null:e}return null}async function Nt(r){try{let e=await oD.readFile(r,"utf-8");return JSON.parse(e)}catch(e){if(W(e)||e instanceof SyntaxError)return null;throw e}}var Kc,Xc,zc=h(()=>{"use strict";H();c(I,"toStr");c(fn,"toNum");c(Nt,"readJsonSafe");Kc=[{filename:"state.json",key:"state"},{filename:"queue.json",key:"queue"},{filename:"ideas.json",key:"ideas"},{filename:"shipped.json",key:"shipped"},{filename:"metrics.json",key:"metrics"},{filename:"velocity.json",key:"velocity"},{filename:"analysis.json",key:"analysis"},{filename:"roadmap.json",key:"roadmap"},{filename:"session.json",key:"session"},{filename:"issues.json",key:"issues"}],Xc=[{filename:"project-index.json",key:"project-index"},{filename:"domains.json",key:"domains"},{filename:"categories-cache.json",key:"categories-cache"}]});import Lt from"node:fs/promises";import _r from"node:path";async function MS(r,e,t){let n=_r.join(e,"checksums.json"),s=await Nt(n);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=j.getDb(r),a=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[l,u]of Object.entries(o))a.run(l,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function OS(r,e,t){let n=_r.join(e,"file-scores.json"),s=await Nt(n);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=j.getDb(r),a=i.prepare(`
998
998
  INSERT OR REPLACE INTO index_files
999
999
  (path, score, size, mtime, language, categories, domain)
1000
1000
  VALUES (?, ?, ?, ?, NULL,
@@ -1094,8 +1094,8 @@ ${r.body(e)}`}function PD(){return process.env.HOME||CD.homedir()}var Cm,Rm,nE,r
1094
1094
  `).filter(d=>d.trim()).length),a){let d=a.stdout.trim().split(`
1095
1095
  `).filter(Boolean);e.hasChanges=d.length>0;for(let p of d){let m=p.substring(0,2),f=p.substring(3);m.startsWith("A")||m.startsWith("M ")?e.stagedFiles.push(f):m.includes("M")?e.modifiedFiles.push(f):m.startsWith("??")&&e.untrackedFiles.push(f)}}return l&&(e.recentCommits=l.stdout.split(`
1096
1096
  `).filter(Boolean).map(d=>{let[p,m,f]=d.split("|");return{hash:p,message:m,date:f}})),u&&(e.weeklyCommits=u.stdout.split(`
1097
- `).filter(d=>d.trim()).length),!s&&!o&&!a&&B.debug("Git analysis failed (not a git repo?)"),e}async function gn(r,e){let t=await E(Mm.join(r,e));return t||B.debug("File not found",{filename:e}),t}async function IE(r){let e={fileCount:0,version:"0.0.0",name:Mm.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],n=await Un(r,{skipDotfiles:!0});e.fileCount=n.filter(s=>t.some(o=>s.endsWith(o))).length}catch(t){B.debug("File count failed",{path:r,error:Ge(t)}),e.fileCount=0}try{let t=Mm.join(r,"package.json"),n=await Pe(t);if(!n)throw new Error("No package.json found");e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript",n.devDependencies?.typescript||await gn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:Ge(t)})}return await gn(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await gn(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await gn(r,"requirements.txt")||await gn(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function DE(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await gn(r,"bun.lockb")||await gn(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await gn(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await gn(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await gn(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await gn(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function ME(r){return new il(r).detect()}var OE=h(()=>{"use strict";lr();Ce();J();$t();_E();c($E,"analyzeGit");c(gn,"fileExistsInProject");c(IE,"gatherStats");c(DE,"detectCommands");c(ME,"detectStack")});import NE from"node:fs/promises";import Om from"node:path";var LE,Nm,FE,HE=h(()=>{"use strict";Et();H();Ce();LE={async jsonFilesValid(r){let e=Date.now(),t=[],n=Om.basename(r);try{await K.read(n)}catch(s){W(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Om.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await NE.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await NE.readFile(Om.join(t,i),"utf-8");for(let l of n)if(l.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!W(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Nm=class{static{c(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,l=[LE.jsonFilesValid(t),LE.noSensitiveData(t)];for(let m of l){let f=await m;if(o.push(f),!f.passed&&i){a=n?.checks?.filter(y=>y.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&n?.checks)for(let m of n.checks){if(m.enabled===!1){a++;continue}let f=await this.runCustomCheck(m,e);if(o.push(f),!f.passed&&i){let y=n.checks.slice(n.checks.indexOf(m)+1);a+=y.filter(v=>v.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await G(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},FE=new Nm});import{z as al}from"zod";function KD(){let r=Je(UE);if(!r)throw new Error(`Missing bundled crew checkpoints template: ${UE}`);return r}var cl,UE,JD,Lm,rr,WE,Fm=h(()=>{"use strict";En();le();X();cl="crew:checkpoints",UE="crew/CHECKPOINTS.md",JD=al.object({content:al.string(),source:al.enum(["default","user","migrated"]),updated_at:al.string().min(1)});c(KD,"getBundledDefault");Lm=class{static{c(this,"CheckpointsStorage")}get(e){let t=S.getDoc(e,cl);return t===null?{content:KD(),source:"default",updated_at:T()}:JD.parse(t)}hasCustomization(e){return S.hasDoc(e,cl)}set(e,t,n="user"){let s={content:t,source:n,updated_at:T()};return S.setDoc(e,cl,s),s}reset(e){S.deleteDoc(e,cl)}},rr=new Lm,WE=rr});var KE={};A(KE,{legacyCrewSweep:()=>QD});import GE from"node:fs/promises";import BE from"node:path";function XD(r){let e={required:r.required,minVersion:r.minVersion,enrolledAt:r.enrolledAt};return r.enrolledBy!==null&&(e.enrolledBy=r.enrolledBy),`${JSON.stringify(e,null,2)}
1098
- `}async function qE(r){try{return(await GE.stat(r)).mtimeMs}catch{return null}}async function VE(r){try{return await GE.readFile(r,"utf-8")}catch{return null}}function JE(r,e){return S.getDoc(r,e)}function ul(r,e,t){S.setDoc(r,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function dl(r,e,t){try{let{projectMemory:n}=await Promise.resolve().then(()=>(Ee(),za));await n.remember(r,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(n){B.debug("Legacy sweep inbox capture failed (non-critical)",{error:n instanceof Error?n.message:String(n)})}}async function zD(r,e,t){let n=BE.join(r,bi),s=await qE(n);if(s===null)return;let o=JE(e,Hm);if(o===null){let i=await VE(n);if(i===null){t.errors.push({file:bi,reason:"read failed"});return}try{WE.set(e,i,"migrated"),ul(e,Hm,s),t.checkpointsMigrated=!0,await dl(r,"Legacy .prjct/CHECKPOINTS.md migrated into kv_store crew:checkpoints. Manage with 'prjct crew checkpoints show|set|reset|export'. Original file left in place (not authoritative).",{"migration:v2.19.8":"1",topic:"crew-checkpoints"})}catch(a){t.errors.push({file:bi,reason:a instanceof Error?a.message:String(a)})}return}s>o.mtime_ms&&(await dl(r,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${bi}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),ul(e,Hm,s),t.checkpointsHandEditWarned=!0)}async function YD(r,e,t){let n=BE.join(r,ll),s=await qE(n);if(s===null)return;let o=JE(e,Um),i=hc.get(e);if(o===null){let a=await VE(n);if(a===null){t.errors.push({file:ll,reason:"read failed"});return}try{if(i===null){let l=JSON.parse(a),u={required:l.required===!0,minVersion:typeof l.minVersion=="string"?l.minVersion:"0.0.0",enrolledAt:typeof l.enrolledAt=="string"?l.enrolledAt:new Date().toISOString(),enrolledBy:typeof l.enrolledBy=="string"?l.enrolledBy:null};hc.set(e,u),await Gr(n,XD(u)),t.teamMigrated=!0,await dl(r,"Legacy .prjct/team.json adopted into kv_store team:enrollment. The disk file is now a derived mirror \u2014 do not hand-edit; run 'prjct team check' to detect drift.",{"migration:v2.19.8":"1",topic:"team-enrollment"})}ul(e,Um,s)}catch(l){t.errors.push({file:ll,reason:l instanceof Error?l.message:String(l)})}return}s>o.mtime_ms&&(await dl(r,".prjct/team.json hand-edited after migration \u2014 your edit was NOT applied (file is a derived mirror). Run 'prjct team check' to rewrite the mirror from DB, or 'prjct team' to re-enroll with new values.",{"migration:v2.19.8":"1",topic:"team-enrollment",state:"hand-edited"}),ul(e,Um,s),t.teamHandEditWarned=!0)}async function QD(r,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await zD(r,e,t).catch(n=>{t.errors.push({file:bi,reason:n instanceof Error?n.message:String(n)})}),await YD(r,e,t).catch(n=>{t.errors.push({file:ll,reason:n instanceof Error?n.message:String(n)})}),t}var bi,ll,Hm,Um,XE=h(()=>{"use strict";Fm();X();yc();J();$t();bi=".prjct/CHECKPOINTS.md",ll=".prjct/team.json",Hm="migration:v2.19.8:last-flagged-checkpoints",Um="migration:v2.19.8:last-flagged-team";c(XD,"renderMirror");c(qE,"statMtimeMs");c(VE,"tryReadFile");c(JE,"readFlag");c(ul,"writeFlag");c(dl,"captureInboxWarning");c(zD,"sweepCheckpoints");c(YD,"sweepTeamJson");c(QD,"legacyCrewSweep")});import ZD from"node:fs/promises";import zE from"node:path";function Wm(r,e){let t,n=new Promise((s,o)=>{t=setTimeout(()=>o(new Error(`sync phase '${e}' timed out after ${YE}ms`)),YE)});return Promise.race([r,n]).finally(()=>{t&&clearTimeout(t)})}async function Ft(r,e){let t=Date.now();B.debug("sync phase start",{phase:r});try{let n=await e();return B.debug("sync phase done",{phase:r,ms:Date.now()-t}),n}catch(n){throw B.debug("sync phase failed",{phase:r,ms:Date.now()-t,error:Ge(n)}),n}}var YE,Gm,$r,pl=h(()=>{"use strict";gm();Hc();ym();Vc();lr();Be();Hs();nn();Q();ge();Tr();Jc();Yr();Em();Zr();Qr();Et();VS();J();$t();Is();rE();sE();pE();SE();AE();OE();HE();YE=Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||6e4;c(Wm,"withTimeout");c(Ft,"phase");Gm=class{static{c(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await P.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:Zc(),stats:el(),commands:tl(),stack:nl(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=_.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await ZD.rm(zE.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Rn()).installed){let M=await qr({autoRepair:!0});M.verified||B.warn(`Codex p. router not ready: ${M.message||"verification failed"}`)}await Ft("mcp-defaults",()=>Wc({silent:!0,verifyContext7:!1}));try{s=await Ft("context7",()=>Tn.ensureReady())}catch(M){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:Zc(),stats:el(),commands:tl(),stack:nl(),context7:{installed:s.installed,verified:!1,message:Ge(M)},error:`Context7 MCP is required but not ready: ${Ge(M)}. Run 'prjct start' to repair.`}}await CE(this.globalPath),process.env.PRJCT_SKIP_JSON_MIGRATION==="1"||(await Ft("migrate",()=>Wm(Yc(this.projectId),"migrate")),await Ft("sweep",async()=>{try{let M=await Qc(this.projectId);M>0&&B.info("Swept legacy JSON files into SQLite",{swept:M})}catch(M){B.debug("Legacy JSON sweep failed (non-critical)",{error:Ge(M)})}})),process.env.PRJCT_SKIP_CREW_SWEEP!=="1"&&await Ft("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:M}=await Promise.resolve().then(()=>(XE(),KE)),Y=await M(this.projectPath,this.projectId);(Y.checkpointsMigrated||Y.teamMigrated||Y.checkpointsHandEditWarned||Y.teamHandEditWarned||Y.errors.length>0)&&B.info("Legacy crew sweep ran",{checkpointsMigrated:Y.checkpointsMigrated,teamMigrated:Y.teamMigrated,checkpointsHandEditWarned:Y.checkpointsHandEditWarned,teamHandEditWarned:Y.teamHandEditWarned,errors:Y.errors.length})}catch(M){B.debug("Legacy crew sweep failed (non-critical)",{error:Ge(M)})}});let[l,u,d,p]=await Ft("gather",()=>Wm(Promise.all([$E(this.projectPath),IE(this.projectPath),DE(this.projectPath),ME(this.projectPath)]),"gather")),{shouldRebuildIndexes:m,changedDomains:f,incrementalInfo:y}=await Ft("incremental",()=>dE({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));m&&await Ft("index",async()=>{try{await Wm(Promise.all([hS(this.projectPath,this.projectId),_S(this.projectPath,this.projectId),AS(this.projectPath,this.projectId)]),"index")}catch(M){B.debug("File ranking index build failed (non-critical)",{error:Ge(M)})}});let v,k=Date.now();B.debug("sync phase start",{phase:"skills"});try{let[M,Y,Fn,ar,Ss,Gt,vn,cr,Fr,Zt,Qi]=await Promise.all([Promise.resolve(ht.getActive(this.projectId)).catch(()=>null),Ze.getActive(this.projectId).catch(()=>null),bt.getRecent(this.projectId,3).catch(()=>[]),qS.getMetrics(this.projectId).catch(()=>null),St.getBacklog(this.projectId).catch(()=>[]),K.getTaskHistory(this.projectId).catch(()=>[]),K.getAllPausedTasks(this.projectId).catch(()=>[]),K.getAggregatedFeedback(this.projectId).catch(()=>null),K.getCurrentTask(this.projectId).catch(()=>null),is.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),bt.getCount(this.projectId).catch(()=>0)]),Zi={backlogCount:Ss.length,completedTaskCount:Gt.length,pausedTaskCount:vn.length,hasActiveTask:!!Fr},hu=M?M.patterns.map(de=>({name:de.name,description:de.description,location:de.locations?.[0]})):(Y?.patterns??[]).filter(de=>de.source!=="repo").map(de=>({name:de.name,description:de.description,location:de.location})),ea=M?M.antiPatterns.map(de=>({issue:de.issue,file:de.files?.[0]??"multiple",suggestion:de.suggestion,severity:de.severity??"medium"})):(Y?.antiPatterns??[]).filter(de=>de.source!=="repo").map(de=>({issue:de.issue,file:de.file,suggestion:de.suggestion,severity:de.severity??"medium"})),Do=M?.commands?{install:M.commands.install??d.install,run:d.run,test:M.commands.test??d.test,build:M.commands.build??d.build,dev:M.commands.dev??d.dev,lint:M.commands.lint??d.lint,format:M.commands.format??d.format}:d,yu={version:u.version,fileCount:u.fileCount,patterns:hu,antiPatterns:ea,recentShipped:Fn.map(de=>({name:de.name,type:de.type??"feature",duration:de.duration,filesChanged:de.changes?.length})),velocity:ar?{avgPoints:ar.averageVelocity,trend:ar.velocityTrend,accuracy:ar.estimationAccuracy}:null,backlogCount:Ss.length,knownGotchas:cr?.knownGotchas??[],userPatterns:cr?.patternsDiscovered??[],pausedTasks:vn.map(de=>({description:de.description,pausedAt:de.pausedAt??""})),ideasCount:Zt?.pending??0,shippedCount:Qi};v=await nE.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:Do,stack:p},Zi,yu)}catch(M){B.debug("Native skill generation failed (non-critical)",{error:Ge(M)})}B.debug("sync phase done",{phase:"skills",ms:Date.now()-k}),await Ft("update-files",()=>Promise.all([RE({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:l,stats:u}),xE({projectId:this.projectId,projectPath:this.projectPath,stats:u,stack:p}),Promise.resolve(PE(this.projectId,l,u)),bE(this.projectId,this.projectPath,l,u,p,s.verified)]));let b=await Ze.getActive(this.projectId),C={patterns:b?.patterns?.length||0,antiPatterns:b?.antiPatterns?.length||0,criticalAntiPatterns:b?.antiPatterns?.filter(M=>M.severity==="high").length||0},R=Date.now()-n,D=await Ft("metrics",()=>kE(this.projectId,u,R));await Ft("archive",()=>vE(this.projectId)),await Ft("install-global",async()=>{await Fe.installGlobalConfig(),await Fe.syncCommands()});let V;return await Ft("verify",async()=>{try{let M=await P.readConfig(this.projectPath);V=await FE.verify(this.projectPath,this.globalPath,M?.verification)}catch(M){B.debug("Verification failed (non-critical)",{error:Ge(M)})}}),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:d,stack:p,context7:{installed:s.installed,verified:s.verified,message:s.message},analysisSummary:C,syncMetrics:D,verification:V,incremental:y,generatedSkills:v}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:Zc(),stats:el(),commands:tl(),stack:nl(),context7:{installed:s.installed,verified:s.verified,message:s.message},error:Ge(o)}}}async getCliVersion(){try{let e=zE.join(__dirname,"..","..","package.json");return(await Pe(e))?.version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:Ge(e)}),"0.0.0"}}},$r=new Gm});function eM(){return"---"}function tM(){return`---
1097
+ `).filter(d=>d.trim()).length),!s&&!o&&!a&&B.debug("Git analysis failed (not a git repo?)"),e}async function gn(r,e){let t=await E(Mm.join(r,e));return t||B.debug("File not found",{filename:e}),t}async function IE(r){let e={fileCount:0,version:"0.0.0",name:Mm.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],n=await Un(r,{skipDotfiles:!0});e.fileCount=n.filter(s=>t.some(o=>s.endsWith(o))).length}catch(t){B.debug("File count failed",{path:r,error:Ge(t)}),e.fileCount=0}try{let t=Mm.join(r,"package.json"),n=await Pe(t);if(!n)throw new Error("No package.json found");e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript",n.devDependencies?.typescript||await gn(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:Ge(t)})}return await gn(r,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await gn(r,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await gn(r,"requirements.txt")||await gn(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function DE(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await gn(r,"bun.lockb")||await gn(r,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await gn(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await gn(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await gn(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await gn(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function ME(r){return new il(r).detect()}var OE=h(()=>{"use strict";lr();Re();J();$t();_E();c($E,"analyzeGit");c(gn,"fileExistsInProject");c(IE,"gatherStats");c(DE,"detectCommands");c(ME,"detectStack")});import NE from"node:fs/promises";import Om from"node:path";var LE,Nm,FE,HE=h(()=>{"use strict";Et();H();Re();LE={async jsonFilesValid(r){let e=Date.now(),t=[],n=Om.basename(r);try{await K.read(n)}catch(s){W(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Om.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await NE.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await NE.readFile(Om.join(t,i),"utf-8");for(let l of n)if(l.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!W(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Nm=class{static{c(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,l=[LE.jsonFilesValid(t),LE.noSensitiveData(t)];for(let m of l){let f=await m;if(o.push(f),!f.passed&&i){a=n?.checks?.filter(y=>y.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&n?.checks)for(let m of n.checks){if(m.enabled===!1){a++;continue}let f=await this.runCustomCheck(m,e);if(o.push(f),!f.passed&&i){let y=n.checks.slice(n.checks.indexOf(m)+1);a+=y.filter(v=>v.enabled!==!1).length;break}}let d=o.filter(m=>!m.passed).length,p=o.filter(m=>m.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:p,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await G(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},FE=new Nm});import{z as al}from"zod";function KD(){let r=Je(UE);if(!r)throw new Error(`Missing bundled crew checkpoints template: ${UE}`);return r}var cl,UE,JD,Lm,rr,WE,Fm=h(()=>{"use strict";En();le();X();cl="crew:checkpoints",UE="crew/CHECKPOINTS.md",JD=al.object({content:al.string(),source:al.enum(["default","user","migrated"]),updated_at:al.string().min(1)});c(KD,"getBundledDefault");Lm=class{static{c(this,"CheckpointsStorage")}get(e){let t=S.getDoc(e,cl);return t===null?{content:KD(),source:"default",updated_at:T()}:JD.parse(t)}hasCustomization(e){return S.hasDoc(e,cl)}set(e,t,n="user"){let s={content:t,source:n,updated_at:T()};return S.setDoc(e,cl,s),s}reset(e){S.deleteDoc(e,cl)}},rr=new Lm,WE=rr});var KE={};A(KE,{legacyCrewSweep:()=>QD});import GE from"node:fs/promises";import BE from"node:path";function XD(r){let e={required:r.required,minVersion:r.minVersion,enrolledAt:r.enrolledAt};return r.enrolledBy!==null&&(e.enrolledBy=r.enrolledBy),`${JSON.stringify(e,null,2)}
1098
+ `}async function qE(r){try{return(await GE.stat(r)).mtimeMs}catch{return null}}async function VE(r){try{return await GE.readFile(r,"utf-8")}catch{return null}}function JE(r,e){return S.getDoc(r,e)}function ul(r,e,t){S.setDoc(r,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function dl(r,e,t){try{let{projectMemory:n}=await Promise.resolve().then(()=>(Te(),za));await n.remember(r,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(n){B.debug("Legacy sweep inbox capture failed (non-critical)",{error:n instanceof Error?n.message:String(n)})}}async function zD(r,e,t){let n=BE.join(r,bi),s=await qE(n);if(s===null)return;let o=JE(e,Hm);if(o===null){let i=await VE(n);if(i===null){t.errors.push({file:bi,reason:"read failed"});return}try{WE.set(e,i,"migrated"),ul(e,Hm,s),t.checkpointsMigrated=!0,await dl(r,"Legacy .prjct/CHECKPOINTS.md migrated into kv_store crew:checkpoints. Manage with 'prjct crew checkpoints show|set|reset|export'. Original file left in place (not authoritative).",{"migration:v2.19.8":"1",topic:"crew-checkpoints"})}catch(a){t.errors.push({file:bi,reason:a instanceof Error?a.message:String(a)})}return}s>o.mtime_ms&&(await dl(r,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${bi}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),ul(e,Hm,s),t.checkpointsHandEditWarned=!0)}async function YD(r,e,t){let n=BE.join(r,ll),s=await qE(n);if(s===null)return;let o=JE(e,Um),i=hc.get(e);if(o===null){let a=await VE(n);if(a===null){t.errors.push({file:ll,reason:"read failed"});return}try{if(i===null){let l=JSON.parse(a),u={required:l.required===!0,minVersion:typeof l.minVersion=="string"?l.minVersion:"0.0.0",enrolledAt:typeof l.enrolledAt=="string"?l.enrolledAt:new Date().toISOString(),enrolledBy:typeof l.enrolledBy=="string"?l.enrolledBy:null};hc.set(e,u),await Gr(n,XD(u)),t.teamMigrated=!0,await dl(r,"Legacy .prjct/team.json adopted into kv_store team:enrollment. The disk file is now a derived mirror \u2014 do not hand-edit; run 'prjct team check' to detect drift.",{"migration:v2.19.8":"1",topic:"team-enrollment"})}ul(e,Um,s)}catch(l){t.errors.push({file:ll,reason:l instanceof Error?l.message:String(l)})}return}s>o.mtime_ms&&(await dl(r,".prjct/team.json hand-edited after migration \u2014 your edit was NOT applied (file is a derived mirror). Run 'prjct team check' to rewrite the mirror from DB, or 'prjct team' to re-enroll with new values.",{"migration:v2.19.8":"1",topic:"team-enrollment",state:"hand-edited"}),ul(e,Um,s),t.teamHandEditWarned=!0)}async function QD(r,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await zD(r,e,t).catch(n=>{t.errors.push({file:bi,reason:n instanceof Error?n.message:String(n)})}),await YD(r,e,t).catch(n=>{t.errors.push({file:ll,reason:n instanceof Error?n.message:String(n)})}),t}var bi,ll,Hm,Um,XE=h(()=>{"use strict";Fm();X();yc();J();$t();bi=".prjct/CHECKPOINTS.md",ll=".prjct/team.json",Hm="migration:v2.19.8:last-flagged-checkpoints",Um="migration:v2.19.8:last-flagged-team";c(XD,"renderMirror");c(qE,"statMtimeMs");c(VE,"tryReadFile");c(JE,"readFlag");c(ul,"writeFlag");c(dl,"captureInboxWarning");c(zD,"sweepCheckpoints");c(YD,"sweepTeamJson");c(QD,"legacyCrewSweep")});import ZD from"node:fs/promises";import zE from"node:path";function Wm(r,e){let t,n=new Promise((s,o)=>{t=setTimeout(()=>o(new Error(`sync phase '${e}' timed out after ${YE}ms`)),YE)});return Promise.race([r,n]).finally(()=>{t&&clearTimeout(t)})}async function Ft(r,e){let t=Date.now();B.debug("sync phase start",{phase:r});try{let n=await e();return B.debug("sync phase done",{phase:r,ms:Date.now()-t}),n}catch(n){throw B.debug("sync phase failed",{phase:r,ms:Date.now()-t,error:Ge(n)}),n}}var YE,Gm,$r,pl=h(()=>{"use strict";gm();Hc();ym();Vc();lr();Be();Hs();nn();Q();ge();Tr();Jc();Yr();Em();Zr();Qr();Et();VS();J();$t();Is();rE();sE();pE();SE();AE();OE();HE();YE=Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||6e4;c(Wm,"withTimeout");c(Ft,"phase");Gm=class{static{c(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await P.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:Zc(),stats:el(),commands:tl(),stack:nl(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=_.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await ZD.rm(zE.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await Rn()).installed){let M=await qr({autoRepair:!0});M.verified||B.warn(`Codex p. router not ready: ${M.message||"verification failed"}`)}await Ft("mcp-defaults",()=>Wc({silent:!0,verifyContext7:!1}));try{s=await Ft("context7",()=>Tn.ensureReady())}catch(M){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:Zc(),stats:el(),commands:tl(),stack:nl(),context7:{installed:s.installed,verified:!1,message:Ge(M)},error:`Context7 MCP is required but not ready: ${Ge(M)}. Run 'prjct start' to repair.`}}await CE(this.globalPath),process.env.PRJCT_SKIP_JSON_MIGRATION==="1"||(await Ft("migrate",()=>Wm(Yc(this.projectId),"migrate")),await Ft("sweep",async()=>{try{let M=await Qc(this.projectId);M>0&&B.info("Swept legacy JSON files into SQLite",{swept:M})}catch(M){B.debug("Legacy JSON sweep failed (non-critical)",{error:Ge(M)})}})),process.env.PRJCT_SKIP_CREW_SWEEP!=="1"&&await Ft("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:M}=await Promise.resolve().then(()=>(XE(),KE)),Y=await M(this.projectPath,this.projectId);(Y.checkpointsMigrated||Y.teamMigrated||Y.checkpointsHandEditWarned||Y.teamHandEditWarned||Y.errors.length>0)&&B.info("Legacy crew sweep ran",{checkpointsMigrated:Y.checkpointsMigrated,teamMigrated:Y.teamMigrated,checkpointsHandEditWarned:Y.checkpointsHandEditWarned,teamHandEditWarned:Y.teamHandEditWarned,errors:Y.errors.length})}catch(M){B.debug("Legacy crew sweep failed (non-critical)",{error:Ge(M)})}});let[l,u,d,p]=await Ft("gather",()=>Wm(Promise.all([$E(this.projectPath),IE(this.projectPath),DE(this.projectPath),ME(this.projectPath)]),"gather")),{shouldRebuildIndexes:m,changedDomains:f,incrementalInfo:y}=await Ft("incremental",()=>dE({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));m&&await Ft("index",async()=>{try{await Wm(Promise.all([hS(this.projectPath,this.projectId),_S(this.projectPath,this.projectId),AS(this.projectPath,this.projectId)]),"index")}catch(M){B.debug("File ranking index build failed (non-critical)",{error:Ge(M)})}});let v,k=Date.now();B.debug("sync phase start",{phase:"skills"});try{let[M,Y,Fn,ar,Ss,Gt,vn,cr,Fr,Zt,Qi]=await Promise.all([Promise.resolve(ht.getActive(this.projectId)).catch(()=>null),Ze.getActive(this.projectId).catch(()=>null),bt.getRecent(this.projectId,3).catch(()=>[]),qS.getMetrics(this.projectId).catch(()=>null),St.getBacklog(this.projectId).catch(()=>[]),K.getTaskHistory(this.projectId).catch(()=>[]),K.getAllPausedTasks(this.projectId).catch(()=>[]),K.getAggregatedFeedback(this.projectId).catch(()=>null),K.getCurrentTask(this.projectId).catch(()=>null),is.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),bt.getCount(this.projectId).catch(()=>0)]),Zi={backlogCount:Ss.length,completedTaskCount:Gt.length,pausedTaskCount:vn.length,hasActiveTask:!!Fr},hu=M?M.patterns.map(de=>({name:de.name,description:de.description,location:de.locations?.[0]})):(Y?.patterns??[]).filter(de=>de.source!=="repo").map(de=>({name:de.name,description:de.description,location:de.location})),ea=M?M.antiPatterns.map(de=>({issue:de.issue,file:de.files?.[0]??"multiple",suggestion:de.suggestion,severity:de.severity??"medium"})):(Y?.antiPatterns??[]).filter(de=>de.source!=="repo").map(de=>({issue:de.issue,file:de.file,suggestion:de.suggestion,severity:de.severity??"medium"})),Do=M?.commands?{install:M.commands.install??d.install,run:d.run,test:M.commands.test??d.test,build:M.commands.build??d.build,dev:M.commands.dev??d.dev,lint:M.commands.lint??d.lint,format:M.commands.format??d.format}:d,yu={version:u.version,fileCount:u.fileCount,patterns:hu,antiPatterns:ea,recentShipped:Fn.map(de=>({name:de.name,type:de.type??"feature",duration:de.duration,filesChanged:de.changes?.length})),velocity:ar?{avgPoints:ar.averageVelocity,trend:ar.velocityTrend,accuracy:ar.estimationAccuracy}:null,backlogCount:Ss.length,knownGotchas:cr?.knownGotchas??[],userPatterns:cr?.patternsDiscovered??[],pausedTasks:vn.map(de=>({description:de.description,pausedAt:de.pausedAt??""})),ideasCount:Zt?.pending??0,shippedCount:Qi};v=await nE.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:Do,stack:p},Zi,yu)}catch(M){B.debug("Native skill generation failed (non-critical)",{error:Ge(M)})}B.debug("sync phase done",{phase:"skills",ms:Date.now()-k}),await Ft("update-files",()=>Promise.all([RE({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:l,stats:u}),xE({projectId:this.projectId,projectPath:this.projectPath,stats:u,stack:p}),Promise.resolve(PE(this.projectId,l,u)),bE(this.projectId,this.projectPath,l,u,p,s.verified)]));let b=await Ze.getActive(this.projectId),C={patterns:b?.patterns?.length||0,antiPatterns:b?.antiPatterns?.length||0,criticalAntiPatterns:b?.antiPatterns?.filter(M=>M.severity==="high").length||0},R=Date.now()-n,D=await Ft("metrics",()=>kE(this.projectId,u,R));await Ft("archive",()=>vE(this.projectId)),await Ft("install-global",async()=>{await Fe.installGlobalConfig(),await Fe.syncCommands()});let V;return await Ft("verify",async()=>{try{let M=await P.readConfig(this.projectPath);V=await FE.verify(this.projectPath,this.globalPath,M?.verification)}catch(M){B.debug("Verification failed (non-critical)",{error:Ge(M)})}}),{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:d,stack:p,context7:{installed:s.installed,verified:s.verified,message:s.message},analysisSummary:C,syncMetrics:D,verification:V,incremental:y,generatedSkills:v}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:Zc(),stats:el(),commands:tl(),stack:nl(),context7:{installed:s.installed,verified:s.verified,message:s.message},error:Ge(o)}}}async getCliVersion(){try{let e=zE.join(__dirname,"..","..","package.json");return(await Pe(e))?.version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:Ge(e)}),"0.0.0"}}},$r=new Gm});function eM(){return"---"}function tM(){return`---
1099
1099
  prjct v${da()}`}function O(...r){return qm(eM(),...r.filter(Boolean),tM())}function QE(r,e){let t=`| ${r.join(" | ")} |`,n=`|${r.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,n,...s].join(`
1100
1100
  `)}function ZE(r,e=""){return`\`\`\`${e}
1101
1101
  ${r}
@@ -1128,7 +1128,7 @@ Next:`));for(let o of s){let i=Si.cyan(o.cmd.padEnd(12));console.log(Si.dim(` $
1128
1128
  `).slice(0,5).forEach(a=>{if(a.trim()){let[l,,u,d]=a.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1129
1129
  `),t.push("Based on detected stack, consider generating specialized agents using `/p:sync`.\n"),t.push(`---
1130
1130
  `),t.push("*This analysis was generated automatically. For updated information, run `/p:analyze` again.*\n"),t.join(`
1131
- `)}var Km=h(()=>{"use strict";nn();sl();Yn();le();Ei();ae();c(fT,"showSyncResult");c(gT,"getSessionActivity");c(fo,"formatTokens");c(Jm,"formatDuration");c(hT,"generateSparkline");c(yT,"generateStatsMarkdown");c(wT,"generateAnalysisSummary")});async function kT(r=process.cwd(),e={}){try{let t=await me(r);if(!t.ok)return t.result;let n=t.value,s=await po.getSummary(n),o=await po.getDailyStats(n,30),i=await gT(n),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=j.getDoc(n,"project")?.name||"Unknown"}catch{}let u=await po.read(n),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: ${fo(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${rl(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Jm(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=hT(o);if(console.log(` ${p} ${fo(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=yT(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)),Le(t)}}async function bT(r=process.cwd(),e={}){try{let t=await me(r);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let n=t.value,s=await Ze.diff(n);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(O("## 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(O(Ya(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(wk(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 n=w(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):e.md?console.log(O("## Diff Failed",`> ${n}`)):g.fail(n),{success:!1,error:n}}}var vT=h(()=>{"use strict";sl();Qa();Tr();X();jm();H();he();dt();ae();Km();Qt();c(kT,"stats");c(bT,"diff")});var hl={};A(hl,{AnalysisCommands:()=>Xm});import ST from"node:fs/promises";var ET,Xm,yl=h(()=>{"use strict";pS();Q();ge();Qa();bS();pl();Tr();Yr();H();le();he();dt();Ei();ae();cT();mT();vT();Km();Re();Qt();ET=`{version:1, commitHash, analyzedAt,
1131
+ `)}var Km=h(()=>{"use strict";nn();sl();Yn();le();Ei();ae();c(fT,"showSyncResult");c(gT,"getSessionActivity");c(fo,"formatTokens");c(Jm,"formatDuration");c(hT,"generateSparkline");c(yT,"generateStatsMarkdown");c(wT,"generateAnalysisSummary")});async function kT(r=process.cwd(),e={}){try{let t=await me(r);if(!t.ok)return t.result;let n=t.value,s=await po.getSummary(n),o=await po.getDailyStats(n,30),i=await gT(n),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=j.getDoc(n,"project")?.name||"Unknown"}catch{}let u=await po.read(n),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: ${fo(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${rl(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${Jm(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=hT(o);if(console.log(` ${p} ${fo(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=yT(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)),Le(t)}}async function bT(r=process.cwd(),e={}){try{let t=await me(r);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let n=t.value,s=await Ze.diff(n);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(O("## 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(O(Ya(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(wk(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 n=w(t);return e.json?console.log(JSON.stringify({success:!1,error:n})):e.md?console.log(O("## Diff Failed",`> ${n}`)):g.fail(n),{success:!1,error:n}}}var vT=h(()=>{"use strict";sl();Qa();Tr();X();jm();H();he();dt();ae();Km();Qt();c(kT,"stats");c(bT,"diff")});var hl={};A(hl,{AnalysisCommands:()=>Xm});import ST from"node:fs/promises";var ET,Xm,yl=h(()=>{"use strict";pS();Q();ge();Qa();bS();pl();Tr();Yr();H();le();he();dt();Ei();ae();cT();mT();vT();Km();xe();Qt();ET=`{version:1, commitHash, analyzedAt,
1132
1132
  architecture:{style:"monolith|monorepo|microservices|modular-monolith", insights:[], domains:[]},
1133
1133
  patterns:[{name, description, locations:[], confidence:0-1, category:"architecture|data-flow|error-handling|testing"}],
1134
1134
  antiPatterns:[{issue, reasoning, files:[], suggestion, severity:"low|medium|high", confidence:0-1}] (flag over-engineering too: speculative abstractions, premature config, needless deps),
@@ -1164,9 +1164,9 @@ _No path-shaped scope entries found. Reviewers judge the spec body alone._`,a=[]
1164
1164
  NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
1165
1165
  END { for (f in files) print files[f], lastmod[f], f }
1166
1166
  '`,{cwd:r,maxBuffer:10485760}),n=Math.floor(Date.now()/1e3),s=t.trim().split(`
1167
- `).filter(Boolean);for(let o of s){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),l=parseInt(i[2],10),u=i[3],d=Math.floor((n-l)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function SM(r,e,t,n){let s=[],o=0,i=0,a=0,l=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let k of e){d.includes(k)&&(o+=.3,s.push(`keyword:${k}`));for(let b of p)if(b.includes(k)||k.includes(b)){o+=.15;break}}o=Math.min(1,o);for(let[k,b]of Object.entries(xT))for(let C of b)if(d.includes(C)&&e.some(D=>b.includes(D)||D.includes(k)||k.includes(D))){i+=.4,s.push(`domain:${k}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,s.push("recent:1d")):m.daysAgo<=3?(a=.8,s.push("recent:3d")):m.daysAgo<=7?(a=.6,s.push("recent:1w")):m.daysAgo<=30&&(a=.3,s.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let f=wl.basename(r).toLowerCase();if((f.includes("index")||f.includes("main")||f.includes("app")||f.includes("entry"))&&(l=.5,s.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(l=Math.max(l,.3),s.some(k=>k.startsWith("import:"))||s.push("import:1")),n){let k=n.get(r);k!==void 0&&(u=(k+1)/2,k>0?s.push("history:boosted"):k<0&&s.push("history:penalized"))}let v=n&&n.size>0?o*.54+i*.18+a*.13+l*.05+u*.1:o*.6+i*.2+a*.15+l*.05;return{path:r,score:Math.min(1,v),reasons:[...new Set(s)]}}function EM(r){let e=r.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var IT=h(()=>{"use strict";H();Ce();$t();_T();c($T,"findRelevantFiles");c(kM,"extractKeywords");c(bM,"getAllCodeFiles");c(vM,"getGitRecency");c(SM,"scoreFile");c(EM,"isTestFile")});var MT={};A(MT,{inferSpecContext:()=>RM,warnNoContextMatch:()=>AM});async function RM(r,e,t){let[n,s]=await Promise.all([$T(r,t,{maxFiles:DT*4,minScore:CM}).catch(()=>({files:[]})),Promise.resolve(N.recall(e,{topic:r,limit:TM})).catch(()=>[])]),o=xM(n.files.map(l=>l.path),DT);return o.length===0&&s.length===0?{notesBlock:"",paths:[],memoryHits:0,empty:!0}:{notesBlock:PM(r,o,s),paths:o,memoryHits:s.length,empty:!1}}function xM(r,e){let t=new Set,n=[];for(let s of r){let o=s.split("/").slice(0,2).join("/");if(!t.has(o)&&(t.add(o),n.push(s),n.length>=e))break}return n}function PM(r,e,t){let n=[];if(n.push("<!-- auto-context:tentative -->"),n.push("## Existing context (auto-inferred)"),n.push(""),n.push(`_Inferred from title "${r}". Validate before audit \u2014 entries tagged tentative._`),n.push(""),e.length>0){n.push("### Likely paths");for(let s of e)n.push(`- \`${s}\``);n.push("")}if(t.length>0){n.push("### Relevant prior memory");for(let s of t){let o=s.content.length>140?`${s.content.slice(0,137)}\u2026`:s.content,i=Object.entries(s.tags).map(([a,l])=>`${a}:${l}`).join(" ");n.push(`- **${s.type}**${i?` _(${i})_`:""} \u2014 ${o}`)}n.push("")}return n.push("<!-- /auto-context -->"),n.join(`
1167
+ `).filter(Boolean);for(let o of s){let i=o.match(/^(\d+)\s+(\d+)\s+(.+)$/);if(i){let a=parseInt(i[1],10),l=parseInt(i[2],10),u=i[3],d=Math.floor((n-l)/86400);e.set(u,{commits:a,daysAgo:d})}}}catch{}return e}function SM(r,e,t,n){let s=[],o=0,i=0,a=0,l=0,u=0,d=r.toLowerCase(),p=d.split("/").join(" ").split(/[^a-z0-9]+/);for(let k of e){d.includes(k)&&(o+=.3,s.push(`keyword:${k}`));for(let b of p)if(b.includes(k)||k.includes(b)){o+=.15;break}}o=Math.min(1,o);for(let[k,b]of Object.entries(xT))for(let C of b)if(d.includes(C)&&e.some(D=>b.includes(D)||D.includes(k)||k.includes(D))){i+=.4,s.push(`domain:${k}`);break}i=Math.min(1,i);let m=t.get(r);m&&(m.daysAgo<=1?(a=1,s.push("recent:1d")):m.daysAgo<=3?(a=.8,s.push("recent:3d")):m.daysAgo<=7?(a=.6,s.push("recent:1w")):m.daysAgo<=30&&(a=.3,s.push("recent:1m")),m.commits>=5&&(a=Math.min(1,a+.2)));let f=wl.basename(r).toLowerCase();if((f.includes("index")||f.includes("main")||f.includes("app")||f.includes("entry"))&&(l=.5,s.push("import:0")),(d.includes("/core/")||d.includes("/shared/")||d.includes("/lib/"))&&(l=Math.max(l,.3),s.some(k=>k.startsWith("import:"))||s.push("import:1")),n){let k=n.get(r);k!==void 0&&(u=(k+1)/2,k>0?s.push("history:boosted"):k<0&&s.push("history:penalized"))}let v=n&&n.size>0?o*.54+i*.18+a*.13+l*.05+u*.1:o*.6+i*.2+a*.15+l*.05;return{path:r,score:Math.min(1,v),reasons:[...new Set(s)]}}function EM(r){let e=r.toLowerCase();return e.includes(".test.")||e.includes(".spec.")||e.includes("__tests__")||e.includes("__mocks__")||e.includes("/tests/")||e.includes("/test/")||e.endsWith("_test.go")||e.endsWith("_test.py")}var IT=h(()=>{"use strict";H();Re();$t();_T();c($T,"findRelevantFiles");c(kM,"extractKeywords");c(bM,"getAllCodeFiles");c(vM,"getGitRecency");c(SM,"scoreFile");c(EM,"isTestFile")});var MT={};A(MT,{inferSpecContext:()=>RM,warnNoContextMatch:()=>AM});async function RM(r,e,t){let[n,s]=await Promise.all([$T(r,t,{maxFiles:DT*4,minScore:CM}).catch(()=>({files:[]})),Promise.resolve(N.recall(e,{topic:r,limit:TM})).catch(()=>[])]),o=xM(n.files.map(l=>l.path),DT);return o.length===0&&s.length===0?{notesBlock:"",paths:[],memoryHits:0,empty:!0}:{notesBlock:PM(r,o,s),paths:o,memoryHits:s.length,empty:!1}}function xM(r,e){let t=new Set,n=[];for(let s of r){let o=s.split("/").slice(0,2).join("/");if(!t.has(o)&&(t.add(o),n.push(s),n.length>=e))break}return n}function PM(r,e,t){let n=[];if(n.push("<!-- auto-context:tentative -->"),n.push("## Existing context (auto-inferred)"),n.push(""),n.push(`_Inferred from title "${r}". Validate before audit \u2014 entries tagged tentative._`),n.push(""),e.length>0){n.push("### Likely paths");for(let s of e)n.push(`- \`${s}\``);n.push("")}if(t.length>0){n.push("### Relevant prior memory");for(let s of t){let o=s.content.length>140?`${s.content.slice(0,137)}\u2026`:s.content,i=Object.entries(s.tags).map(([a,l])=>`${a}:${l}`).join(" ");n.push(`- **${s.type}**${i?` _(${i})_`:""} \u2014 ${o}`)}n.push("")}return n.push("<!-- /auto-context -->"),n.join(`
1168
1168
  `)}function AM(r,e){let t={level:"warn",code:"no_context_match",message:`No codebase or memory context matched "${r}"`,suggestion:e??"Fill spec.notes manually or run with `--skip-context` next time."};process.stderr.write(`${JSON.stringify(t)}
1169
- `)}var DT,TM,CM,OT=h(()=>{"use strict";Ee();IT();DT=5,TM=8,CM=.15;c(RM,"inferSpecContext");c(xM,"dedupeTopDirs");c(PM,"buildNotesBlock");c(AM,"warnNoContextMatch")});var af={};A(af,{breakdownSpecToTasks:()=>jM});async function jM(r,e,t){let n=t.content.acceptance_criteria;if(n.length===0)return{taskIds:[],skippedReason:"no_acceptance_criteria"};if(t.content.tasks_created_at!==null)return{taskIds:[],skippedReason:"already_broken_down"};let s=!1;if(t.content.linked_tasks.length>0){s=!0,await St.deleteByFeatureId(r,t.id);let a={...t.content,linked_tasks:[]};Ae.updateContent(r,t.id,a)}let o=await St.addTasks(r,n.map(a=>({description:_M(a),body:a,priority:"medium",type:"feature",section:"backlog",featureId:t.id,groupId:t.id,groupName:t.title})));for(let a of o)Ae.linkTask(r,t.id,a.id);let i=Ae.get(r,t.id);if(i){let a={...i.content,tasks_created_at:T()};Ae.updateContent(r,t.id,a)}return await N.remember(e,{type:"spec",content:`Auto-breakdown: ${o.length} tasks created from ${t.title}${s?" (recovered from partial)":""}`,tags:{spec_id:t.id,event:"auto_breakdown",task_count:String(o.length),...s?{recovered:"partial"}:{}},source:t.id}),{taskIds:o.map(a=>a.id),...s?{recoveredFromPartial:!0}:{}}}function _M(r){let e=r.replace(/\s+/g," ").trim();return e.length<=140?e:`${e.slice(0,137)}\u2026`}var cf=h(()=>{"use strict";Ee();Zr();di();le();c(jM,"breakdownSpecToTasks");c(_M,"truncateForDescription")});var uf={};A(uf,{specService:()=>Ct});async function $M(r){try{let{stdout:e}=await re("git",["rev-parse","HEAD"],{cwd:r}),t=e.trim();return/^[0-9a-f]{7,40}$/.test(t)?t:null}catch{return null}}var lf,Ct,kl=h(()=>{"use strict";Q();Ee();di();cc();le();Ce();of();c($M,"readGitHead");lf=class{static{c(this,"SpecService")}async create(e,t){let n=await this.requireProjectId(e),s=t.content.notes??"";if(t.autoContext!==!1&&!s.trim()){let{inferSpecContext:l,warnNoContextMatch:u}=await Promise.resolve().then(()=>(OT(),MT)),d=await l(t.title,n,e);d.empty?u(t.title):s=d.notesBlock}let i=er.parse({goal:t.content.goal,eli10:t.content.eli10??"",stakes:t.content.stakes??"",acceptance_criteria:t.content.acceptance_criteria??[],scope:t.content.scope??[],out_of_scope:t.content.out_of_scope??[],risks:t.content.risks??[],test_plan:t.content.test_plan??[],reviews:t.content.reviews,linked_tasks:t.content.linked_tasks??[],notes:s}),a=Ae.create(n,{title:t.title,content:i,tags:t.tags});return await N.remember(e,{type:"spec",content:`${a.title}
1169
+ `)}var DT,TM,CM,OT=h(()=>{"use strict";Te();IT();DT=5,TM=8,CM=.15;c(RM,"inferSpecContext");c(xM,"dedupeTopDirs");c(PM,"buildNotesBlock");c(AM,"warnNoContextMatch")});var af={};A(af,{breakdownSpecToTasks:()=>jM});async function jM(r,e,t){let n=t.content.acceptance_criteria;if(n.length===0)return{taskIds:[],skippedReason:"no_acceptance_criteria"};if(t.content.tasks_created_at!==null)return{taskIds:[],skippedReason:"already_broken_down"};let s=!1;if(t.content.linked_tasks.length>0){s=!0,await St.deleteByFeatureId(r,t.id);let a={...t.content,linked_tasks:[]};Ae.updateContent(r,t.id,a)}let o=await St.addTasks(r,n.map(a=>({description:_M(a),body:a,priority:"medium",type:"feature",section:"backlog",featureId:t.id,groupId:t.id,groupName:t.title})));for(let a of o)Ae.linkTask(r,t.id,a.id);let i=Ae.get(r,t.id);if(i){let a={...i.content,tasks_created_at:T()};Ae.updateContent(r,t.id,a)}return await N.remember(e,{type:"spec",content:`Auto-breakdown: ${o.length} tasks created from ${t.title}${s?" (recovered from partial)":""}`,tags:{spec_id:t.id,event:"auto_breakdown",task_count:String(o.length),...s?{recovered:"partial"}:{}},source:t.id}),{taskIds:o.map(a=>a.id),...s?{recoveredFromPartial:!0}:{}}}function _M(r){let e=r.replace(/\s+/g," ").trim();return e.length<=140?e:`${e.slice(0,137)}\u2026`}var cf=h(()=>{"use strict";Te();Zr();di();le();c(jM,"breakdownSpecToTasks");c(_M,"truncateForDescription")});var uf={};A(uf,{specService:()=>Ct});async function $M(r){try{let{stdout:e}=await re("git",["rev-parse","HEAD"],{cwd:r}),t=e.trim();return/^[0-9a-f]{7,40}$/.test(t)?t:null}catch{return null}}var lf,Ct,kl=h(()=>{"use strict";Q();Te();di();cc();le();Re();of();c($M,"readGitHead");lf=class{static{c(this,"SpecService")}async create(e,t){let n=await this.requireProjectId(e),s=t.content.notes??"";if(t.autoContext!==!1&&!s.trim()){let{inferSpecContext:l,warnNoContextMatch:u}=await Promise.resolve().then(()=>(OT(),MT)),d=await l(t.title,n,e);d.empty?u(t.title):s=d.notesBlock}let i=er.parse({goal:t.content.goal,eli10:t.content.eli10??"",stakes:t.content.stakes??"",acceptance_criteria:t.content.acceptance_criteria??[],scope:t.content.scope??[],out_of_scope:t.content.out_of_scope??[],risks:t.content.risks??[],test_plan:t.content.test_plan??[],reviews:t.content.reviews,linked_tasks:t.content.linked_tasks??[],notes:s}),a=Ae.create(n,{title:t.title,content:i,tags:t.tags});return await N.remember(e,{type:"spec",content:`${a.title}
1170
1170
 
1171
1171
  Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},source:a.id,provenance:"declared"}),a}async get(e,t){let n=await this.requireProjectId(e);return Ae.get(n,t)}async list(e,t={}){let n=await this.requireProjectId(e);return Ae.list(n,t)}async setStatus(e,t,n){let s=await this.requireProjectId(e),o=Ae.setStatus(s,t,n);return o&&await N.remember(e,{type:"spec",content:`Spec status \u2192 ${n}: ${o.title}`,tags:{spec_id:t,status:n,event:"status_change"},source:t}),o}async update(e,t,n){let s=await this.requireProjectId(e);return Ae.updateContent(s,t,n)}async recordReview(e,t,n,s){let o=await this.requireProjectId(e),i=3,a=50,l=0,u=!1,d=null;for(;l<i;){let p=Ae.get(o,t);if(!p)return null;let m={...s,ts:T()},f={...p.content,reviews:{...p.content.reviews??{},[n]:m}};if(Ae.casUpdate(o,t,f,p.updatedAt)){u=!0,d=Ae.get(o,t);break}l++,l<i&&await new Promise(v=>setTimeout(v,a))}if(!u)throw new Error(`SPEC_RECORD_REVIEW_CONFLICT_RETRY_EXHAUSTED: ${i} retries failed for spec ${t}`);if(d&&RT(d.content)&&d.status==="draft"){let p=Ae.setStatus(o,t,"reviewed");if(p){let{breakdownSpecToTasks:m}=await Promise.resolve().then(()=>(cf(),af));return await m(o,e,p),Ae.get(o,t)}return p}return d}async linkTask(e,t,n){let s=await this.requireProjectId(e);return Ae.linkTask(s,t,n)}async ship(e,t,n){let s=await this.requireProjectId(e);n!==void 0&&Ae.setShippedPr(s,t,n);let o=await $M(e);return o&&Ae.setShippedSha(s,t,o),Ae.setStatus(s,t,"shipped")}unmetCriteria(e,t=new Set){return e.content.acceptance_criteria.filter(n=>!t.has(n))}async setSelectedReviewers(e,t,n){let s=await this.requireProjectId(e),o=Ae.get(s,t);return o?Ae.updateContent(s,t,{...o.content,selected_reviewers:n}):null}async requireProjectId(e){let t=await P.readConfig(e);if(!t?.projectId)throw new Error("not a prjct project (run `prjct init` first)");return t.projectId}},Ct=new lf});function IM(r){if(r==null)return null;if(typeof r=="string")return r;try{return JSON.stringify(r)}catch{return null}}var NT,LT=h(()=>{"use strict";X();NT={async upsert(r,e){let t=e.name||"";if(!t)return;let n=e.description??null,s=IM(e.metadata),o=e.enabled===0?0:1,i=e.is_builtin===1?1:0,a=new Date().toISOString(),l=S.get(r,"SELECT id, is_builtin FROM custom_workflows WHERE name = ?",t);if(l){if(l.is_builtin===1)return;S.run(r,"UPDATE custom_workflows SET description = ?, metadata = ?, enabled = ?, updated_at = ? WHERE name = ? AND is_builtin = 0",n,s,o,a,t);return}S.run(r,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1172
1172
  VALUES (?, ?, ?, ?, ?, ?, ?)`,t,n,e.created_at||a,a,i,o,s)},async delete(r,e){let t=e.name||"";t&&S.run(r,"UPDATE custom_workflows SET enabled = 0 WHERE name = ? AND is_builtin = 0",t)}};c(IM,"serializeMetadata")});var FT,HT=h(()=>{"use strict";Jc();FT={async upsert(r,e){let t=e.id||"";if(!t)return;let n=e.title||e.text||"",s=e.priority||"medium",o=e.status||"active";await is.update(r,i=>{let a=i.ideas.findIndex(p=>p.id===t),u={id:t,text:n,priority:s,status:o==="archived"?"archived":"pending",addedAt:i.ideas[a]?.addedAt??new Date().toISOString(),tags:i.ideas[a]?.tags??[]},d=a>=0?i.ideas.map((p,m)=>m===a?{...p,...u}:p):[...i.ideas,u];return{...i,ideas:d}})},async delete(r,e){let t=e.id||"";t&&await is.update(r,n=>({...n,ideas:n.ideas.map(s=>s.id===t?{...s,status:"archived"}:s)}))}}});function DM(r){if(!r)return{};if(typeof r=="string")try{return JSON.parse(r)}catch{return{}}return typeof r=="object"?r:{}}function Ti(r,e,t){return r[e]??r[t]??""}var UT,WT=h(()=>{"use strict";xa();kr();X();c(DM,"asTags");c(Ti,"field");UT={async upsert(r,e){let t=Ti(e,"content","content"),n=Ti(e,"type","type");if(!t||!n)return;let s=DM(e.tags),o=Ti(e,"provenance","provenance")||"declared",i=e.source??null,a=mr(t);if(S.get(r,"SELECT id FROM memories WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",a,n))return;let u=S.appendEvent(r,`memory.${Ks}${n}`,{content:t,tags:s,source:i,provenance:o});if(u==null)return;let d=`mem_${u}`,p=new Date().toISOString(),m=(t.split(`
@@ -1180,7 +1180,7 @@ Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},sourc
1180
1180
  VALUES (?, ?, ?, ?)
1181
1181
  ON CONFLICT(entity_type, entity_id) DO UPDATE SET
1182
1182
  content_hash = excluded.content_hash,
1183
- applied_at = excluded.applied_at`,e,t,n,T())}catch{}}function tC(r,e,t){if(!(!e||!t))try{S.run(r,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}var nC=h(()=>{"use strict";X();le();c(ZT,"getApplied");c(eC,"recordApplied");c(tC,"clearApplied")});function NM(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function LM(r){let e={};for(let[t,n]of Object.entries(r))e[NM(t)]=n;return e}function FM(r,e){let[t,n]=e.type.split("."),s=ls(e.entityType)??ls(t);if(!s)return null;let i=e.eventType==="delete"||n==="deleted"||n==="archived"||n==="removed"?"delete":"upsert",a=e.data||{},l=LM(a),u=e.entityId||l.id||a.id||"",d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:r},project_id:r};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function rC(r,e){return e.map(t=>FM(r,t)).filter(t=>t!==null)}var sC=h(()=>{"use strict";vl();c(NM,"camelToSnake");c(LM,"snakeCaseKeys");c(FM,"mapCliEventToWebFormat");c(rC,"mapCliEventsToWebFormat")});var mf,go,ff=h(()=>{"use strict";Aa();br();sC();mf=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:n,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=rC(e,t),a=await this.fetchWithRetry(`${n}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async pullEvents(e,t,n){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a={projectId:e};typeof t=="number"&&t>0&&(a.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(a)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:n,deviceId:s}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(n,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ns("API_REQUEST"));try{let{apiUrl:n,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${n}/health`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await xe.hasAuth()}async getAuthHeaders(){let[e,t,n]=await Promise.all([xe.getApiUrl(),xe.getApiKey(),xe.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:n}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,n=0){let s=new AbortController,o=setTimeout(()=>s.abort(),Ns("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),a&&l.status>=500&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ns("API_REQUEST")}ms)`);if(a&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),n=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",n,e.status):e.status===402?this.createError("PAYMENT_REQUIRED",n,e.status):this.createError("API_ERROR",n,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,n){return{code:e,message:t,status:n}}sleep(e){return new Promise(t=>setTimeout(t,e))}},go=new mf});var hf={};A(hf,{syncCursorStorage:()=>HM});var gf,HM,yf=h(()=>{"use strict";le();X();gf=class{static{c(this,"SyncCursorStorage")}get(e,t=null,n=null){if(!n)return null;let s=S.get(e,`SELECT * FROM sync_cursors
1183
+ applied_at = excluded.applied_at`,e,t,n,T())}catch{}}function tC(r,e,t){if(!(!e||!t))try{S.run(r,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}var nC=h(()=>{"use strict";X();le();c(ZT,"getApplied");c(eC,"recordApplied");c(tC,"clearApplied")});function NM(r){return r.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function LM(r){let e={};for(let[t,n]of Object.entries(r))e[NM(t)]=n;return e}function FM(r,e){let[t,n]=e.type.split("."),s=ls(e.entityType)??ls(t);if(!s)return null;let i=e.eventType==="delete"||n==="deleted"||n==="archived"||n==="removed"?"delete":"upsert",a=e.data||{},l=LM(a),u=e.entityId||l.id||a.id||"",d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:r},project_id:r};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function rC(r,e){return e.map(t=>FM(r,t)).filter(t=>t!==null)}var sC=h(()=>{"use strict";vl();c(NM,"camelToSnake");c(LM,"snakeCaseKeys");c(FM,"mapCliEventToWebFormat");c(rC,"mapCliEventsToWebFormat")});var mf,go,ff=h(()=>{"use strict";Aa();br();sC();mf=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:n,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=rC(e,t),a=await this.fetchWithRetry(`${n}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async pullEvents(e,t,n){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a={projectId:e};typeof t=="number"&&t>0&&(a.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(a)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:n,deviceId:s}=await this.getAuthHeaders();if(!n)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(n,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ns("API_REQUEST"));try{let{apiUrl:n,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${n}/health`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Ee.hasAuth()}async getAuthHeaders(){let[e,t,n]=await Promise.all([Ee.getApiUrl(),Ee.getApiKey(),Ee.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:n}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,n=0){let s=new AbortController,o=setTimeout(()=>s.abort(),Ns("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),a&&l.status>=500&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ns("API_REQUEST")}ms)`);if(a&&n<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**n,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,n+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),n=t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?this.createError("AUTH_REQUIRED",n,e.status):e.status===402?this.createError("PAYMENT_REQUIRED",n,e.status):this.createError("API_ERROR",n,e.status)}catch{return this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,n){return{code:e,message:t,status:n}}sleep(e){return new Promise(t=>setTimeout(t,e))}},go=new mf});var hf={};A(hf,{syncCursorStorage:()=>HM});var gf,HM,yf=h(()=>{"use strict";le();X();gf=class{static{c(this,"SyncCursorStorage")}get(e,t=null,n=null){if(!n)return null;let s=S.get(e,`SELECT * FROM sync_cursors
1184
1184
  WHERE project_id = ?
1185
1185
  AND device_id = ?
1186
1186
  AND ${t===null?"user_id IS NULL":"user_id = ?"}`,...t===null?[e,n]:[e,n,t]);return s?this.rowToCursor(s):null}touch(e,t=null,n=null){if(!n)return;let s=T();this.upsert({userId:t,deviceId:n,projectId:e,lastEventId:this.getLastEventId(e,t,n),updatedAt:s})}advance(e,t,n={}){let s=n.userId??null,o=n.deviceId??null;if(!o)return;let i=this.getLastEventId(e,s,o);t<=i||this.upsert({userId:s,deviceId:o,projectId:e,lastEventId:t,updatedAt:T()})}getLastEventId(e,t,n){return S.get(e,`SELECT last_event_id FROM sync_cursors
@@ -1191,24 +1191,24 @@ Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},sourc
1191
1191
  WHERE project_id = ? AND device_id = ? AND user_id IS NULL`,n,T(),e,t)}upsert(e){S.run(e.projectId,`INSERT INTO sync_cursors (user_id, device_id, project_id, last_event_id, updated_at)
1192
1192
  VALUES (?, ?, ?, ?, ?)
1193
1193
  ON CONFLICT(user_id, device_id, project_id)
1194
- DO UPDATE SET last_event_id = excluded.last_event_id, updated_at = excluded.updated_at`,e.userId,e.deviceId,e.projectId,e.lastEventId,e.updatedAt)}rowToCursor(e){return{userId:e.user_id,deviceId:e.device_id,projectId:e.project_id,lastEventId:e.last_event_id,updatedAt:e.updated_at}}},HM=new gf});function UM(r){if(oC.has(r))return;oC.add(r);let t=zT.has(r)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${r}' (${t}). code=no_local_handler`)}function WM(r){let e=r.data??{},t=r.content_hash??r.contentHash;if(r.entity_type){let i=(r.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:r.entity_type,eventType:i,data:e,contentHash:t}}if(r.entityType){let i=r.eventType||"upsert";return{entityType:r.entityType,eventType:i==="delete"?"delete":"upsert",data:e,contentHash:t}}let[n,s]=(r.type||"").split("."),o=s==="deleted"||s==="archived"||s==="removed";return{entityType:ls(n)||n||"unknown",eventType:o?"delete":"upsert",data:e,contentHash:t}}function iC(r){return r instanceof Error?r.message:r&&typeof r=="object"&&"message"in r?String(r.message):"Unknown error"}var oC,wf,GM,hn,Ci=h(()=>{"use strict";ni();br();YT();vl();nC();ff();oC=new Set;c(UM,"warnNoLocalHandler");c(WM,"normalizeEventShape");c(iC,"errorMessage");wf=class{static{c(this,"SyncManager")}async hasAuth(){return await xe.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await go.getStatus(e)}catch{return null}}async sync(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let n={success:!0,skipped:!1},s=await this.push(e,t);s.success&&!s.skipped&&(n.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let o=await this.pull(e);return o.success&&!o.skipped&&(n.pulled={count:o.count||0,syncedAt:o.syncedAt||new Date().toISOString()}),(!s.success||!o.success)&&(n.success=!1,n.error=s.error||o.error),n}async push(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let n=await It.getPending(e),s=t?.include?n.filter(l=>{let u=ls(l.entityType)??ls(l.type?.split(".")[0]);return u?QT(u,t.include):!0}):n;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let o=await this.createProjectLinkEvent(e),i=o?[o,...s]:s,a=await go.pushEvents(e,i);if(a.success)return await It.clearPending(e),await It.updateLastSync(e),{success:!0,skipped:!1,count:a.processed,syncedAt:a.syncedAt};{let l=a.processed,u=a.errors.length,d=a.errors.map(p=>p.error).join(", ");return{success:!1,skipped:!1,count:l,syncedAt:a.syncedAt,error:`${u} events failed: ${d}`}}}catch(n){return{success:!1,skipped:!1,reason:"error",error:iC(n)}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(yf(),hf)),n=await xe.read(),s=n.deviceId??null,o=n.userId??null,a=(s?t.get(e,o,s):null)?.lastEventId??0,l=await go.pullEvents(e,a);if(l.events.length===0)return await It.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=a;for(let p of l.events){let m=[p.event_id,p.eventId];for(let f of m)typeof f=="number"&&f>d&&(d=f)}return s&&d>a&&t.advance(e,d,{userId:o,deviceId:s}),await It.updateLastSync(e),{success:!0,skipped:!1,count:l.events.length,applied:u,syncedAt:l.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:iC(t)}}}async applyPulledEvents(e,t){let n=0;for(let s of t)try{await this.applyEvent(e,s),n++}catch(o){let i=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return n}async applyRealtimeEvent(e,t){try{let n=await xe.read(),s=n.deviceId??null,o=t.origin_device_id??t.originDeviceId;if(s&&o&&o===s)return!1;await this.applyEvent(e,t);let i=typeof t.event_id=="number"?t.event_id:typeof t.eventId=="number"?t.eventId:null;if(i!==null){let{syncCursorStorage:a}=await Promise.resolve().then(()=>(yf(),hf)),l=n.userId??null,u=n.deviceId??null;if(u){let d=a.get(e,l,u);(!d||i>d.lastEventId)&&a.advance(e,i,{userId:l,deviceId:u})}}return!0}catch(n){return console.error("[realtime] apply failed:",n instanceof Error?n.message:n),!1}}async applyEvent(e,t){let{entityType:n,eventType:s,data:o,contentHash:i}=WM(t),a=o.id??"",l=pf[n];if(!l){UM(n);return}if(s==="delete"){await l.delete(e,o),a&&tC(e,n,a);return}i&&this.alreadyApplied(e,n,a,i)||(await l.upsert(e,o),i&&a&&eC(e,n,a,i))}alreadyApplied(e,t,n,s){if(!n)return!1;let o=ZT(e,t,n);return o!==null&&o===s}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},GM=new wf,hn=GM});var kf={};A(kf,{flushIfLinked:()=>BM});async function BM(r,e){try{let t=e??null;if(!t){let{default:s}=await Promise.resolve().then(()=>(Q(),sn));t=await s.readConfig(r).catch(()=>null)}if(!t?.projectId||!t.cloud?.enabled||t.cloud.paused)return{ran:!1};if(!await hn.hasAuth())return{ran:!1};let n=await hn.sync(t.projectId,{include:t.cloud.include??{}});return{ran:!0,pushed:n.pushed?.count??0,pulled:n.pulled?.count??0,error:n.success?void 0:n.error}}catch{return{ran:!1}}}var bf=h(()=>{"use strict";Ci();c(BM,"flushIfLinked")});var El={};A(El,{ShippingCommands:()=>vf,seedCodeShipRules:()=>Ef});import{existsSync as aC}from"node:fs";import cC from"node:path";function lC(r){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>aC(cC.join(r,t)))}function Sf(r){return aC(cC.join(r,".git"))}async function Ef(r,e){if(!lC(e))return!1;let t=new Date().toISOString(),n=oe.getRulesForCommand(r,"ship"),s=new Set(n.map(d=>d.action)),i=n.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,a=[];Sf(e)&&a.push({action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",timeoutMs:5e3});let l=[{action:"version:bump",description:"Bump version (stack-aware)",timeoutMs:1e4},{action:"changelog:add",description:"Append CHANGELOG entry",timeoutMs:1e4}];Sf(e)&&(l.push({action:"git:commit",description:"Commit ship",timeoutMs:15e3}),l.push({action:"git:push",description:"Push to origin",timeoutMs:3e4}));let u=0;for(let d of a)s.has(d.action)||(oe.addRule(r,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)s.has(d.action)||(oe.addRule(r,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function qM(r,e,t,n){if(n.intent==="proceed"||n.intent==="register-only")return null;if(!t.some(a=>a.type==="step"&&a.position==="before"))return{question:"No `ship` workflow steps are configured for this project. What should ship do?",options:["register-only","seed-code-workflow","abort"],state:{rulesCount:t.length,looksLikeCode:lC(e)}};if(await sr(r,e))return null;let i=await JM(e);return i?{question:`No active task, and PR #${i.number} ("${i.title}") is OPEN for this branch. Continue ship anyway?`,options:["proceed","abort"],state:{openPr:i.number,branch:i.branch}}:null}function VM(r,e){if(e){let t=O(z("Clarification needed",r.question),z("Options",Me(r.options.map(n=>`\`prjct ship --intent=${n}\``))),r.state?z("State",Me(Object.entries(r.state).map(([n,s])=>`${n}: ${JSON.stringify(s)}`))):null);console.log(t);return}console.log(`
1194
+ DO UPDATE SET last_event_id = excluded.last_event_id, updated_at = excluded.updated_at`,e.userId,e.deviceId,e.projectId,e.lastEventId,e.updatedAt)}rowToCursor(e){return{userId:e.user_id,deviceId:e.device_id,projectId:e.project_id,lastEventId:e.last_event_id,updatedAt:e.updated_at}}},HM=new gf});function UM(r){if(oC.has(r))return;oC.add(r);let t=zT.has(r)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${r}' (${t}). code=no_local_handler`)}function WM(r){let e=r.data??{},t=r.content_hash??r.contentHash;if(r.entity_type){let i=(r.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:r.entity_type,eventType:i,data:e,contentHash:t}}if(r.entityType){let i=r.eventType||"upsert";return{entityType:r.entityType,eventType:i==="delete"?"delete":"upsert",data:e,contentHash:t}}let[n,s]=(r.type||"").split("."),o=s==="deleted"||s==="archived"||s==="removed";return{entityType:ls(n)||n||"unknown",eventType:o?"delete":"upsert",data:e,contentHash:t}}function iC(r){return r instanceof Error?r.message:r&&typeof r=="object"&&"message"in r?String(r.message):"Unknown error"}var oC,wf,GM,hn,Ci=h(()=>{"use strict";ni();br();YT();vl();nC();ff();oC=new Set;c(UM,"warnNoLocalHandler");c(WM,"normalizeEventShape");c(iC,"errorMessage");wf=class{static{c(this,"SyncManager")}async hasAuth(){return await Ee.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await go.getStatus(e)}catch{return null}}async sync(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let n={success:!0,skipped:!1},s=await this.push(e,t);s.success&&!s.skipped&&(n.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let o=await this.pull(e);return o.success&&!o.skipped&&(n.pulled={count:o.count||0,syncedAt:o.syncedAt||new Date().toISOString()}),(!s.success||!o.success)&&(n.success=!1,n.error=s.error||o.error),n}async push(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let n=await It.getPending(e),s=t?.include?n.filter(l=>{let u=ls(l.entityType)??ls(l.type?.split(".")[0]);return u?QT(u,t.include):!0}):n;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let o=await this.createProjectLinkEvent(e),i=o?[o,...s]:s,a=await go.pushEvents(e,i);if(a.success)return await It.clearPending(e),await It.updateLastSync(e),{success:!0,skipped:!1,count:a.processed,syncedAt:a.syncedAt};{let l=a.processed,u=a.errors.length,d=a.errors.map(p=>p.error).join(", ");return{success:!1,skipped:!1,count:l,syncedAt:a.syncedAt,error:`${u} events failed: ${d}`}}}catch(n){return{success:!1,skipped:!1,reason:"error",error:iC(n)}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(yf(),hf)),n=await Ee.read(),s=n.deviceId??null,o=n.userId??null,a=(s?t.get(e,o,s):null)?.lastEventId??0,l=await go.pullEvents(e,a);if(l.events.length===0)return await It.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=a;for(let p of l.events){let m=[p.event_id,p.eventId];for(let f of m)typeof f=="number"&&f>d&&(d=f)}return s&&d>a&&t.advance(e,d,{userId:o,deviceId:s}),await It.updateLastSync(e),{success:!0,skipped:!1,count:l.events.length,applied:u,syncedAt:l.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:iC(t)}}}async applyPulledEvents(e,t){let n=0;for(let s of t)try{await this.applyEvent(e,s),n++}catch(o){let i=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return n}async applyRealtimeEvent(e,t){try{let n=await Ee.read(),s=n.deviceId??null,o=t.origin_device_id??t.originDeviceId;if(s&&o&&o===s)return!1;await this.applyEvent(e,t);let i=typeof t.event_id=="number"?t.event_id:typeof t.eventId=="number"?t.eventId:null;if(i!==null){let{syncCursorStorage:a}=await Promise.resolve().then(()=>(yf(),hf)),l=n.userId??null,u=n.deviceId??null;if(u){let d=a.get(e,l,u);(!d||i>d.lastEventId)&&a.advance(e,i,{userId:l,deviceId:u})}}return!0}catch(n){return console.error("[realtime] apply failed:",n instanceof Error?n.message:n),!1}}async applyEvent(e,t){let{entityType:n,eventType:s,data:o,contentHash:i}=WM(t),a=o.id??"",l=pf[n];if(!l){UM(n);return}if(s==="delete"){await l.delete(e,o),a&&tC(e,n,a);return}i&&this.alreadyApplied(e,n,a,i)||(await l.upsert(e,o),i&&a&&eC(e,n,a,i))}alreadyApplied(e,t,n,s){if(!n)return!1;let o=ZT(e,t,n);return o!==null&&o===s}async createProjectLinkEvent(e){try{return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},GM=new wf,hn=GM});var kf={};A(kf,{flushIfLinked:()=>BM});async function BM(r,e){try{let t=e??null;if(!t){let{default:s}=await Promise.resolve().then(()=>(Q(),sn));t=await s.readConfig(r).catch(()=>null)}if(!t?.projectId||!t.cloud?.enabled||t.cloud.paused)return{ran:!1};if(!await hn.hasAuth())return{ran:!1};let n=await hn.sync(t.projectId,{include:t.cloud.include??{}});return{ran:!0,pushed:n.pushed?.count??0,pulled:n.pulled?.count??0,error:n.success?void 0:n.error}}catch{return{ran:!1}}}var bf=h(()=>{"use strict";Ci();c(BM,"flushIfLinked")});var El={};A(El,{ShippingCommands:()=>vf,seedCodeShipRules:()=>Ef});import{existsSync as aC}from"node:fs";import cC from"node:path";function lC(r){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>aC(cC.join(r,t)))}function Sf(r){return aC(cC.join(r,".git"))}async function Ef(r,e){if(!lC(e))return!1;let t=new Date().toISOString(),n=oe.getRulesForCommand(r,"ship"),s=new Set(n.map(d=>d.action)),i=n.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,a=[];Sf(e)&&a.push({action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",timeoutMs:5e3});let l=[{action:"version:bump",description:"Bump version (stack-aware)",timeoutMs:1e4},{action:"changelog:add",description:"Append CHANGELOG entry",timeoutMs:1e4}];Sf(e)&&(l.push({action:"git:commit",description:"Commit ship",timeoutMs:15e3}),l.push({action:"git:push",description:"Push to origin",timeoutMs:3e4}));let u=0;for(let d of a)s.has(d.action)||(oe.addRule(r,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)s.has(d.action)||(oe.addRule(r,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function qM(r,e,t,n){if(n.intent==="proceed"||n.intent==="register-only")return null;if(!t.some(a=>a.type==="step"&&a.position==="before"))return{question:"No `ship` workflow steps are configured for this project. What should ship do?",options:["register-only","seed-code-workflow","abort"],state:{rulesCount:t.length,looksLikeCode:lC(e)}};if(await sr(r,e))return null;let i=await JM(e);return i?{question:`No active task, and PR #${i.number} ("${i.title}") is OPEN for this branch. Continue ship anyway?`,options:["proceed","abort"],state:{openPr:i.number,branch:i.branch}}:null}function VM(r,e){if(e){let t=O(z("Clarification needed",r.question),z("Options",Me(r.options.map(n=>`\`prjct ship --intent=${n}\``))),r.state?z("State",Me(Object.entries(r.state).map(([n,s])=>`${n}: ${JSON.stringify(s)}`))):null);console.log(t);return}console.log(`
1195
1195
  \u26A0\uFE0F ${r.question}`),console.log(`
1196
- Options:`);for(let t of r.options)console.log(` prjct ship --intent=${t}`)}async function JM(r){if(!Sf(r))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(Ce(),Mu)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:r,timeout:3e3}),n=t.toString().trim();if(!n)return null;let{stdout:s}=await e("gh",["pr","list","--head",n,"--state","open","--json","number,title","--limit","1"],{cwd:r,timeout:5e3}),o=JSON.parse(s.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:n}}catch{return null}}var Sl,vf,Tl=h(()=>{"use strict";pl();as();X();Qr();Zn();H();le();he();dt();Ei();ae();Ec();Re();Qt();Sl="ship:in_progress",vf=class extends q{static{c(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=s.value;try{let C=j.getDoc(o,Sl);C?.version&&(await bt.getByVersion(o,C.version)||(await bt.addShipped(o,{name:C.feature,version:C.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${C.feature} (v${C.version})`)),j.deleteDoc(o,Sl))}catch{}let i=e,a=await sr(o,t),l=a?.linkedSpecId;if(a&&(i||(i=a.description||"current work"),await Tf(o,t)),i||(i="current work"),l&&!n.noSpecGate)try{let{specService:C}=await Promise.resolve().then(()=>(kl(),uf)),R=await C.get(t,l);if(R&&R.content.acceptance_criteria.length>0){let D=[];D.push(""),D.push(`## Spec acceptance gate \u2014 \`${R.title}\` (${R.id.slice(0,8)})`),D.push(""),D.push("Walk each criterion. STOP if any is unmet."),D.push("");for(let V of R.content.acceptance_criteria)D.push(`- [ ] ${V}`);D.push(""),D.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),D.push(""),console.log(D.join(`
1197
- `))}}catch{}let u=oe.getRulesForCommand(o,"ship");if(n.intent==="seed-code-workflow"){if(!await Ef(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=oe.getRulesForCommand(o,"ship")}!u.some(C=>C.type==="step"&&C.position==="before")&&n.intent!=="register-only"&&await Ef(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=oe.getRulesForCommand(o,"ship"));let p=await qM(o,t,u,n);if(p)return VM(p,n.md===!0),{success:!1,clarification:p};let m={feature:i},f=await tr(o,"ship","before",{projectPath:t,skipRules:n.skipHooks,runContext:m});if(!f.success)return{success:!1,error:`Ship blocked: ${f.gatesFailed.length>0?f.gatesFailed.join(", "):"unknown step"}`};let y=typeof m.version=="string"?m.version:"unversioned";try{j.setDoc(o,Sl,{feature:i,version:y,startedAt:T()})}catch{}await bt.addShipped(o,{name:i,version:y});try{j.deleteDoc(o,Sl)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:y,timestamp:T()});let v=await tr(o,"ship","after",{projectPath:t,skipRules:n.skipHooks,runContext:m}),k=[...f.instructions,...v.instructions];try{await $r.sync(t)}catch(C){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(C))}try{let{regenerateWikiDeferred:C}=await Promise.resolve().then(()=>($n(),xr));await C(t,o)}catch(C){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",w(C))}let b=f.stepsRun.length+v.stepsRun.length;if(n.md){let C=ml("ship",!0),R=O(je(`Shipped: ${i}`,`Version: ${y}`),z("Results",Me([`Version: ${y}`,`Workflow steps run: ${b>0?[...f.stepsRun,...v.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${f.hooksFailed.length+v.hooksFailed.length}`])),k.length>0?z("Agent Instructions",Me(k)):null,qe(C.map(D=>({label:D.desc,command:D.cmd}))));console.log(R)}else g.done(`v${y} shipped`),mo("ship");if(a?.id)try{let{usefulnessService:C}=await Promise.resolve().then(()=>(Qn(),Xd));C.creditShippedTask(o,a.id)}catch{}return(async()=>{try{let{flushIfLinked:C}=await Promise.resolve().then(()=>(bf(),kf));await C(t)}catch{}})(),{success:!0,feature:i,version:y}}catch(s){return g.fail(w(s)),Le(s)}}};c(lC,"isCodeProject");c(Sf,"isGitRepo");c(Ef,"seedCodeShipRules");c(qM,"buildClarification");c(VM,"renderClarification");c(JM,"findOpenPrForBranch")});var Cl={};A(Cl,{PlanningCommands:()=>Rf});async function KM(){if(!Cf){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(yl(),hl));Cf=new r}return Cf}var Cf,Rf,Rl=h(()=>{"use strict";Ha();nn();Q();ge();Gv();qv();Zn();H();he();ae();Xp();Kv();Re();Cf=null;c(KM,"getAnalysisCommands");Rf=class extends q{static{c(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await P.isConfigured(t))return g.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new wi(t).runNonInteractive());else if(a=await new wi(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await Bs(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await P.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,n),g.step(2,4,"Creating structure..."),await _.ensureProjectStructure(p),await this._seedShipWorkflow(p,t);let m=await this._detectEmptyDirectory(t),f=await this._detectExistingCode(t);if(f||!m){g.step(3,4,"Analyzing project...");let k=await KM();if((await k.analyze({},t)).success)return g.step(4,4,"Generating agents..."),await k.sync(t),g.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let y=n.idea;if(m&&!f){if(!y)return g.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};g.spin("architect mode...");let{projectMemory:k}=await Promise.resolve().then(()=>(Ee(),za));return await k.remember(t,{type:"idea",content:y,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await Fe.installGlobalConfig(),g.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:y,wizard:a}}await Fe.installGlobalConfig(),await Bv(t).catch(()=>{});let v=!1;try{let{detectCodex:k}=await Promise.resolve().then(()=>(Be(),_t));((await k()).installed||a?.agents.includes("codex"))&&(await Wv(t),v=!0)}catch{}return g.done("initialized"),this._printNextSteps(a,{agentsMdWritten:v}),{success:!0,projectId:p,wizard:a}}catch(n){return g.fail(w(n)),Le(n)}}_printNextSteps(e,t={}){console.log(""),console.log(" \u2713 skill installed at ~/.claude/skills/prjct/"),console.log(" \u2713 project CLAUDE.md updated with routing block"),t.agentsMdWritten&&console.log(" \u2713 project AGENTS.md updated with routing block (Codex & friends)"),console.log(""),console.log(" You don't run prjct commands. Claude does."),console.log(""),console.log(" Just describe what you're doing \u2014 Claude reads the intent and"),console.log(" runs the right verb. Routine captures (decision, learning,"),console.log(" gotcha, idea) save automatically; ship and other destructive"),console.log(" verbs surface a one-line plan and wait for your OK."),console.log(""),console.log(" If you want to drive manually:"),console.log(" prjct sync Refresh context + skill body"),console.log(" prjct task Start a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e&&e.agents.length>0&&(console.log(` Detected agents: ${e.agents.join(", ")}`),console.log("")),console.log(" Docs: https://prjct.app/docs"),console.log("")}async _applyInitialPacksAndPersona(e,t){let{activatePacks:n,detectSuggestedPacks:s}=await Promise.resolve().then(()=>(nf(),CT)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await s(e)),o.length>0&&await n(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(Q(),sn))).default,a=await i.readConfig(e);if(a){let l=a.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...a,persona:l})}}}async _seedShipWorkflow(e,t){let n=await Pc(t),s=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(Tl(),El));await o(e,t),s=oe.getRulesForCommand(e,"ship").reduce((i,a)=>Math.max(i,a.sortOrder??0),0)+1,oe.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),n.lint&&oe.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),n.test&&oe.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var xf,Dn,uC,Nc=h(()=>{"use strict";lr();Ha();Q();ge();H();J();ae();xf=class{static{c(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await P.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(Ea(),Sa));if(await o.detect(e)){let a=await o.getMainWorktree(e);if(a&&a!==e&&await P.isConfigured(a))return await o.setup(e,a),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Rl(),Cl)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await P.getProjectId(e);if(!t)throw ca.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await _.ensureProjectStructure(t),_.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Bs();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await Gn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return W(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Gn(e)).some(s=>t.includes(s))}catch(t){return W(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await P.isConfigured(e)}async needsMigration(e){return await P.needsMigration(e)}},Dn=new xf,uC=Dn});import XM from"node:fs/promises";import dC from"node:path";async function pC(r){try{return await XM.realpath(r)}catch{return r}}function Pf(r,e){return`${r} \xB7 ${e??"(detached)"}`}async function us(r){let e=Date.now(),t=mC.get(r);if(t&&e-t.at<zM)return t.ctx;let n=await YM(r);return mC.set(r,{ctx:n,at:e}),n}async function YM(r){let e="",t="",n="",s;try{let{stdout:u}=await re("git",["rev-parse","--show-toplevel","--git-dir","--git-common-dir","--abbrev-ref","HEAD"],{cwd:r}),[d="",p="",m="",f=""]=u.trim().split(`
1198
- `);e=d.trim(),t=p.trim(),n=m.trim(),s=f.trim()&&f.trim()!=="HEAD"?f.trim():void 0}catch{let u=await pC(r);return{workspaceId:Ht,worktreePath:u,shortId:Ht,isMain:!0,label:Pf(Ht)}}let o=dC.resolve(r,t)===dC.resolve(r,n),i=await pC(e||r);if(o)return{workspaceId:Ht,worktreePath:i,shortId:Ht,branch:s,isMain:!0,label:Pf(Ht,s)};let a=_a(i),l=a.slice(0,6);return{workspaceId:a,worktreePath:i,shortId:l,branch:s,isMain:!1,label:Pf(l,s)}}var Ht,mC,zM,Af=h(()=>{"use strict";Ce();zo();Ht="main";c(pC,"safeRealpath");c(Pf,"buildLabel");mC=new Map,zM=5e3;c(us,"deriveWorkspace");c(YM,"computeWorkspace")});var $f={};A($f,{completeActiveTask:()=>Tf,readLastStatus:()=>Ri,resolveActiveTask:()=>sr,setTaskStatus:()=>_f,startTask:()=>jf});async function jf(r,e,t,n={}){let s=await tr(r,"task","before",{projectPath:e,skipRules:n.skipHooks});if(!s.success)return{ok:!1,blocked:s.gatesFailed.length>0?`Blocked: ${s.gatesFailed.join(", ")}`:`Hook failed: ${s.hooksFailed.join(", ")}`};let o=/^[A-Z]+-\d+$/.test(t)?t:void 0,i=Ke(),a=n.spec,l=await us(e),u={id:i,description:t,sessionId:Ke(),linearId:o,linkedSpecId:a};if(l.isMain?await K.startTask(r,u):await K.startTaskInWorkspace(r,{...u,branch:l.branch,workspaceId:l.workspaceId,worktreePath:l.worktreePath},l.workspaceId),a)try{let{specService:m}=await Promise.resolve().then(()=>(kl(),uf));await m.linkTask(e,a,i)}catch{}let d=await uC.ensureAuthor();await Xe.log(e,"task_started",{task:t,taskId:i,timestamp:T()},d.name),await tr(r,"task","after",{projectPath:e,skipRules:n.skipHooks});let p=await kc(e).catch(()=>"");return{ok:!0,taskId:i,description:t,branch:p,linearId:o,linkedSpecId:a,instructions:s.instructions}}async function _f(r,e,t){let n=t.toLowerCase(),s=QM.includes(n),o=await us(e);if(!o.isMain){let l=await K.getCurrentTaskForWorkspace(r,o.workspaceId);if(!l)return{ok:!1,reason:"no-active-task"};if(n==="done"||n==="completed"){let u=await Ri(r,l.id);return await Xe.log(e,wr,{taskId:l.id,from:u??null,to:t,workspaceId:o.workspaceId}),await K.completeTaskInWorkspace(r,o.workspaceId),{ok:!0,taskId:l.id,status:t}}return{ok:!1,reason:"unsupported",message:`'${t}' isn't supported for a worktree task yet \u2014 only 'done'. (pause/resume per-worktree is a planned follow-up)`}}if(s&&!await K.getCurrentTask(r)){let u=await K.resumeTask(r);if(u)return await Xe.log(e,wr,{taskId:u.id,from:"paused",to:t}),{ok:!0,taskId:u.id,status:t}}let i=await K.getCurrentTask(r);if(!i)return{ok:!1,reason:"no-active-task"};let a=await Ri(r,i.id);await Xe.log(e,wr,{taskId:i.id,from:a??null,to:t});try{n==="done"||n==="completed"?await K.completeTask(r):n==="paused"||n==="pause"?await K.pauseTask(r):s&&(await K.getCurrentTask(r)||await K.resumeTask(r))}catch{}return{ok:!0,taskId:i.id,status:t}}async function sr(r,e){let t=await us(e);return t.isMain?K.getCurrentTask(r):K.getCurrentTaskForWorkspace(r,t.workspaceId)}async function Tf(r,e,t){let n=await us(e);return n.isMain?K.completeTask(r,t):K.completeTaskInWorkspace(r,n.workspaceId,t)}async function Ri(r,e){try{let{default:t}=await Promise.resolve().then(()=>(X(),fr)),n=t.query(r,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${wr}`);for(let s of n)try{let o=JSON.parse(s.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var QM,as=h(()=>{"use strict";kr();Xn();bc();Et();le();Ec();Yn();Nc();Af();QM=["active","resume","in_progress","working"];c(jf,"startTask");c(_f,"setTaskStatus");c(sr,"resolveActiveTask");c(Tf,"completeActiveTask");c(Ri,"readLastStatus")});var hC={};A(hC,{buildSessionContext:()=>Pl,buildSubagentDigest:()=>If,runSessionStartHook:()=>Df});async function Pl(r,e,t={}){let n=e??await P.readConfig(r);if(!n?.projectId)return null;let s=n.persona,o=t.digest?eO(n.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(rO(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),o&&(s&&i.push(""),i.push(o)),i.join(`
1196
+ Options:`);for(let t of r.options)console.log(` prjct ship --intent=${t}`)}async function JM(r){if(!Sf(r))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(Re(),Mu)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:r,timeout:3e3}),n=t.toString().trim();if(!n)return null;let{stdout:s}=await e("gh",["pr","list","--head",n,"--state","open","--json","number,title","--limit","1"],{cwd:r,timeout:5e3}),o=JSON.parse(s.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:n}}catch{return null}}var Sl,vf,Tl=h(()=>{"use strict";pl();as();X();Qr();Zn();H();le();he();dt();Ei();ae();Ec();xe();Qt();Sl="ship:in_progress",vf=class extends q{static{c(this,"ShippingCommands")}async ship(e,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=s.value;try{let C=j.getDoc(o,Sl);C?.version&&(await bt.getByVersion(o,C.version)||(await bt.addShipped(o,{name:C.feature,version:C.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${C.feature} (v${C.version})`)),j.deleteDoc(o,Sl))}catch{}let i=e,a=await sr(o,t),l=a?.linkedSpecId;if(a&&(i||(i=a.description||"current work"),await Tf(o,t)),i||(i="current work"),l&&!n.noSpecGate)try{let{specService:C}=await Promise.resolve().then(()=>(kl(),uf)),R=await C.get(t,l);if(R&&R.content.acceptance_criteria.length>0){let D=[];D.push(""),D.push(`## Spec acceptance gate \u2014 \`${R.title}\` (${R.id.slice(0,8)})`),D.push(""),D.push("Walk each criterion. STOP if any is unmet."),D.push("");for(let V of R.content.acceptance_criteria)D.push(`- [ ] ${V}`);D.push(""),D.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),D.push(""),console.log(D.join(`
1197
+ `))}}catch{}let u=oe.getRulesForCommand(o,"ship");if(n.intent==="seed-code-workflow"){if(!await Ef(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=oe.getRulesForCommand(o,"ship")}!u.some(C=>C.type==="step"&&C.position==="before")&&n.intent!=="register-only"&&await Ef(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=oe.getRulesForCommand(o,"ship"));let p=await qM(o,t,u,n);if(p)return VM(p,n.md===!0),{success:!1,clarification:p};let m={feature:i},f=await tr(o,"ship","before",{projectPath:t,skipRules:n.skipHooks,runContext:m});if(!f.success)return{success:!1,error:`Ship blocked: ${f.gatesFailed.length>0?f.gatesFailed.join(", "):"unknown step"}`};let y=typeof m.version=="string"?m.version:"unversioned";try{j.setDoc(o,Sl,{feature:i,version:y,startedAt:T()})}catch{}await bt.addShipped(o,{name:i,version:y});try{j.deleteDoc(o,Sl)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:y,timestamp:T()});let v=await tr(o,"ship","after",{projectPath:t,skipRules:n.skipHooks,runContext:m}),k=[...f.instructions,...v.instructions];try{await $r.sync(t)}catch(C){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(C))}try{let{regenerateWikiDeferred:C}=await Promise.resolve().then(()=>($n(),xr));await C(t,o)}catch(C){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",w(C))}let b=f.stepsRun.length+v.stepsRun.length;if(n.md){let C=ml("ship",!0),R=O(je(`Shipped: ${i}`,`Version: ${y}`),z("Results",Me([`Version: ${y}`,`Workflow steps run: ${b>0?[...f.stepsRun,...v.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${f.hooksFailed.length+v.hooksFailed.length}`])),k.length>0?z("Agent Instructions",Me(k)):null,qe(C.map(D=>({label:D.desc,command:D.cmd}))));console.log(R)}else g.done(`v${y} shipped`),mo("ship");if(a?.id)try{let{usefulnessService:C}=await Promise.resolve().then(()=>(Qn(),Xd));C.creditShippedTask(o,a.id)}catch{}return(async()=>{try{let{flushIfLinked:C}=await Promise.resolve().then(()=>(bf(),kf));await C(t)}catch{}})(),{success:!0,feature:i,version:y}}catch(s){return g.fail(w(s)),Le(s)}}};c(lC,"isCodeProject");c(Sf,"isGitRepo");c(Ef,"seedCodeShipRules");c(qM,"buildClarification");c(VM,"renderClarification");c(JM,"findOpenPrForBranch")});var Cl={};A(Cl,{PlanningCommands:()=>Rf});async function KM(){if(!Cf){let{AnalysisCommands:r}=await Promise.resolve().then(()=>(yl(),hl));Cf=new r}return Cf}var Cf,Rf,Rl=h(()=>{"use strict";Ha();nn();Q();ge();Gv();qv();Zn();H();he();ae();Xp();Kv();xe();Cf=null;c(KM,"getAnalysisCommands");Rf=class extends q{static{c(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let n={};if(typeof e=="string"||e===null?n={idea:e}:n=e,await this.initializeAgent(),await P.isConfigured(t))return g.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=n.yes||!o||process.env.CI==="true",a=null;if(i)o&&n.yes&&(a=await new wi(t).runNonInteractive());else if(a=await new wi(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await Bs(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await P.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,n),g.step(2,4,"Creating structure..."),await _.ensureProjectStructure(p),await this._seedShipWorkflow(p,t);let m=await this._detectEmptyDirectory(t),f=await this._detectExistingCode(t);if(f||!m){g.step(3,4,"Analyzing project...");let k=await KM();if((await k.analyze({},t)).success)return g.step(4,4,"Generating agents..."),await k.sync(t),g.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let y=n.idea;if(m&&!f){if(!y)return g.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};g.spin("architect mode...");let{projectMemory:k}=await Promise.resolve().then(()=>(Te(),za));return await k.remember(t,{type:"idea",content:y,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await Fe.installGlobalConfig(),g.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:y,wizard:a}}await Fe.installGlobalConfig(),await Bv(t).catch(()=>{});let v=!1;try{let{detectCodex:k}=await Promise.resolve().then(()=>(Be(),_t));((await k()).installed||a?.agents.includes("codex"))&&(await Wv(t),v=!0)}catch{}return g.done("initialized"),this._printNextSteps(a,{agentsMdWritten:v}),{success:!0,projectId:p,wizard:a}}catch(n){return g.fail(w(n)),Le(n)}}_printNextSteps(e,t={}){console.log(""),console.log(" \u2713 skill installed at ~/.claude/skills/prjct/"),console.log(" \u2713 project CLAUDE.md updated with routing block"),t.agentsMdWritten&&console.log(" \u2713 project AGENTS.md updated with routing block (Codex & friends)"),console.log(""),console.log(" You don't run prjct commands. Claude does."),console.log(""),console.log(" Just describe what you're doing \u2014 Claude reads the intent and"),console.log(" runs the right verb. Routine captures (decision, learning,"),console.log(" gotcha, idea) save automatically; ship and other destructive"),console.log(" verbs surface a one-line plan and wait for your OK."),console.log(""),console.log(" If you want to drive manually:"),console.log(" prjct sync Refresh context + skill body"),console.log(" prjct task Start a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e&&e.agents.length>0&&(console.log(` Detected agents: ${e.agents.join(", ")}`),console.log("")),console.log(" Docs: https://prjct.app/docs"),console.log("")}async _applyInitialPacksAndPersona(e,t){let{activatePacks:n,detectSuggestedPacks:s}=await Promise.resolve().then(()=>(nf(),CT)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await s(e)),o.length>0&&await n(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(Q(),sn))).default,a=await i.readConfig(e);if(a){let l=a.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...a,persona:l})}}}async _seedShipWorkflow(e,t){let n=await Pc(t),s=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(Tl(),El));await o(e,t),s=oe.getRulesForCommand(e,"ship").reduce((i,a)=>Math.max(i,a.sortOrder??0),0)+1,oe.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),n.lint&&oe.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),n.test&&oe.addRule(e,{type:"step",command:"ship",position:"before",action:`${n.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var xf,Dn,uC,Nc=h(()=>{"use strict";lr();Ha();Q();ge();H();J();ae();xf=class{static{c(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await P.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(Ea(),Sa));if(await o.detect(e)){let a=await o.getMainWorktree(e);if(a&&a!==e&&await P.isConfigured(a))return await o.setup(e,a),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(Rl(),Cl)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await P.getProjectId(e);if(!t)throw ca.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await _.ensureProjectStructure(t),_.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Bs();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await Gn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return W(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Gn(e)).some(s=>t.includes(s))}catch(t){return W(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await P.isConfigured(e)}async needsMigration(e){return await P.needsMigration(e)}},Dn=new xf,uC=Dn});import XM from"node:fs/promises";import dC from"node:path";async function pC(r){try{return await XM.realpath(r)}catch{return r}}function Pf(r,e){return`${r} \xB7 ${e??"(detached)"}`}async function us(r){let e=Date.now(),t=mC.get(r);if(t&&e-t.at<zM)return t.ctx;let n=await YM(r);return mC.set(r,{ctx:n,at:e}),n}async function YM(r){let e="",t="",n="",s;try{let{stdout:u}=await re("git",["rev-parse","--show-toplevel","--git-dir","--git-common-dir","--abbrev-ref","HEAD"],{cwd:r}),[d="",p="",m="",f=""]=u.trim().split(`
1198
+ `);e=d.trim(),t=p.trim(),n=m.trim(),s=f.trim()&&f.trim()!=="HEAD"?f.trim():void 0}catch{let u=await pC(r);return{workspaceId:Ht,worktreePath:u,shortId:Ht,isMain:!0,label:Pf(Ht)}}let o=dC.resolve(r,t)===dC.resolve(r,n),i=await pC(e||r);if(o)return{workspaceId:Ht,worktreePath:i,shortId:Ht,branch:s,isMain:!0,label:Pf(Ht,s)};let a=_a(i),l=a.slice(0,6);return{workspaceId:a,worktreePath:i,shortId:l,branch:s,isMain:!1,label:Pf(l,s)}}var Ht,mC,zM,Af=h(()=>{"use strict";Re();zo();Ht="main";c(pC,"safeRealpath");c(Pf,"buildLabel");mC=new Map,zM=5e3;c(us,"deriveWorkspace");c(YM,"computeWorkspace")});var $f={};A($f,{completeActiveTask:()=>Tf,readLastStatus:()=>Ri,resolveActiveTask:()=>sr,setTaskStatus:()=>_f,startTask:()=>jf});async function jf(r,e,t,n={}){let s=await tr(r,"task","before",{projectPath:e,skipRules:n.skipHooks});if(!s.success)return{ok:!1,blocked:s.gatesFailed.length>0?`Blocked: ${s.gatesFailed.join(", ")}`:`Hook failed: ${s.hooksFailed.join(", ")}`};let o=/^[A-Z]+-\d+$/.test(t)?t:void 0,i=Ke(),a=n.spec,l=await us(e),u={id:i,description:t,sessionId:Ke(),linearId:o,linkedSpecId:a};if(l.isMain?await K.startTask(r,u):await K.startTaskInWorkspace(r,{...u,branch:l.branch,workspaceId:l.workspaceId,worktreePath:l.worktreePath},l.workspaceId),a)try{let{specService:m}=await Promise.resolve().then(()=>(kl(),uf));await m.linkTask(e,a,i)}catch{}let d=await uC.ensureAuthor();await Xe.log(e,"task_started",{task:t,taskId:i,timestamp:T()},d.name),await tr(r,"task","after",{projectPath:e,skipRules:n.skipHooks});let p=await kc(e).catch(()=>"");return{ok:!0,taskId:i,description:t,branch:p,linearId:o,linkedSpecId:a,instructions:s.instructions}}async function _f(r,e,t){let n=t.toLowerCase(),s=QM.includes(n),o=await us(e);if(!o.isMain){let l=await K.getCurrentTaskForWorkspace(r,o.workspaceId);if(!l)return{ok:!1,reason:"no-active-task"};if(n==="done"||n==="completed"){let u=await Ri(r,l.id);return await Xe.log(e,wr,{taskId:l.id,from:u??null,to:t,workspaceId:o.workspaceId}),await K.completeTaskInWorkspace(r,o.workspaceId),{ok:!0,taskId:l.id,status:t}}return{ok:!1,reason:"unsupported",message:`'${t}' isn't supported for a worktree task yet \u2014 only 'done'. (pause/resume per-worktree is a planned follow-up)`}}if(s&&!await K.getCurrentTask(r)){let u=await K.resumeTask(r);if(u)return await Xe.log(e,wr,{taskId:u.id,from:"paused",to:t}),{ok:!0,taskId:u.id,status:t}}let i=await K.getCurrentTask(r);if(!i)return{ok:!1,reason:"no-active-task"};let a=await Ri(r,i.id);await Xe.log(e,wr,{taskId:i.id,from:a??null,to:t});try{n==="done"||n==="completed"?await K.completeTask(r):n==="paused"||n==="pause"?await K.pauseTask(r):s&&(await K.getCurrentTask(r)||await K.resumeTask(r))}catch{}return{ok:!0,taskId:i.id,status:t}}async function sr(r,e){let t=await us(e);return t.isMain?K.getCurrentTask(r):K.getCurrentTaskForWorkspace(r,t.workspaceId)}async function Tf(r,e,t){let n=await us(e);return n.isMain?K.completeTask(r,t):K.completeTaskInWorkspace(r,n.workspaceId,t)}async function Ri(r,e){try{let{default:t}=await Promise.resolve().then(()=>(X(),fr)),n=t.query(r,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${wr}`);for(let s of n)try{let o=JSON.parse(s.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var QM,as=h(()=>{"use strict";kr();Xn();bc();Et();le();Ec();Yn();Nc();Af();QM=["active","resume","in_progress","working"];c(jf,"startTask");c(_f,"setTaskStatus");c(sr,"resolveActiveTask");c(Tf,"completeActiveTask");c(Ri,"readLastStatus")});var hC={};A(hC,{buildSessionContext:()=>Pl,buildSubagentDigest:()=>If,runSessionStartHook:()=>Df});async function Pl(r,e,t={}){let n=e??await P.readConfig(r);if(!n?.projectId)return null;let s=n.persona,o=t.digest?eO(n.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(rO(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),o&&(s&&i.push(""),i.push(o)),i.join(`
1199
1199
  `)}function eO(r){let e=[],t=[];try{e=at.rerank(r,N.recall(r,{types:["gotcha","anti-pattern"],limit:xl*4})).slice(0,xl),t=at.rerank(r,N.recall(r,{types:["decision"],limit:xl*4})).slice(0,xl)}catch{return null}let n=gC(r,new Set([...e,...t].map(o=>o.id)));if(e.length===0&&t.length===0&&!n)return null;let s=["## What this project already knows",""];if(s.push("> Carried across sessions and model updates \u2014 this survived even if your conversation context did not."),e.length>0){s.push("","**Traps to avoid:**");for(let o of e)s.push(`- ${He(o)} \`${o.id}\``)}if(t.length>0){s.push("","**Decisions in force:**");for(let o of t)s.push(`- ${He(o)} \`${o.id}\``)}return n&&s.push("","**Keeps being missed:**",`- ${He(n.entry)} \`${n.entry.id}\` \u2014 flagged relevant-but-unused ${n.count}\xD7. Apply it or supersede it.`),s.push("","> Resolve any `mem_id` with `prjct search <id>`. Who the developer is lives in `developer.md` in the vault."),Jn(s.join(`
1200
1200
  `),ZM)}function gC(r,e){try{let t=N.recall(r,{types:["improvement-signal"],tags:{kind:"skill-miss"},limit:50,dedupeByKey:!1}),n=new Map;for(let a of t){let l=a.tags?.relates;l&&n.set(l,(n.get(l)??0)+1)}let s=null,o=0;for(let[a,l]of n)l>o&&(s=a,o=l);if(!s||o<tO||e.has(s))return null;let i=N.getById(r,s);return i?{entry:i,count:o}:null}catch{return null}}async function If(r){let e=await P.readConfig(r).catch(()=>null);if(!e?.projectId)return null;let t=["# prjct: subagent context"];e.persona?.role&&t.push(`Role in this project: ${e.persona.role}`);try{let{resolveActiveTask:n}=await Promise.resolve().then(()=>(as(),$f)),s=await n(e.projectId,r);s&&t.push(`Active task (this worktree): ${s.description}`)}catch{}try{let n=at.rerank(e.projectId,N.recall(e.projectId,{types:["gotcha","anti-pattern"],limit:fC*4})).slice(0,fC);if(n.length>0){t.push("Traps to avoid:");for(let o of n)t.push(`- ${He(o)} \`${o.id}\``)}let s=gC(e.projectId,new Set(n.map(o=>o.id)));s&&t.push(`Keeps being missed: ${He(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:Jn(t.join(`
1201
1201
  `),nO)}function rO(r){let e=[];return e.push(`## Your role in this project: **${r.role}**`),r.focus&&e.push(`Focus: ${r.focus}`),r.mcps&&r.mcps.length>0&&e.push(`Available MCPs this project expects: ${r.mcps.join(", ")}`),r.packs&&r.packs.length>0&&e.push(`Active packs: ${r.packs.join(", ")}`),e.join(`
1202
- `)}function Df(r=process.cwd(),e){let t=null;return it({event:"SessionStart",projectPath:r,build:c(async(n,s)=>{t=await P.readConfig(s).catch(()=>null);let o=n.source??"startup";return Pl(s,t,{digest:o==="startup"||o==="clear"||o==="compact"})},"build"),afterEmit:c(async(n,s)=>{t?.projectId&&await mi(s,t.projectId).catch(()=>{}),Md(te)||await Od(te).catch(()=>{});try{let{maybeAutoUpdate:o}=await Promise.resolve().then(()=>(Ru(),Cu));o(te)}catch{}},"afterEmit")},e)}var ZM,xl,tO,nO,fC,xi=h(()=>{"use strict";Q();Ba();Xt();Ee();Qn();$n();_e();Kn();Gs();ZM=1400,xl=3;c(Pl,"buildSessionContext");c(eO,"buildKnowledgeDigest");tO=2;c(gC,"findRepeatMissedEntry");nO=500,fC=2;c(If,"buildSubagentDigest");c(rO,"formatPersona");c(Df,"runSessionStartHook")});var yC={};A(yC,{runCwdChangedHook:()=>Mf});function Mf(r=process.cwd(),e){return it({event:"CwdChanged",projectPath:r,build:c(async(t,n)=>{let s=t.cwd||n;return Pl(s)},"build")},e)}var Of=h(()=>{"use strict";Kn();xi();c(Mf,"runCwdChangedHook")});var wC={};A(wC,{runPostEditHook:()=>Nf});function Nf(r=process.cwd(),e){return it({event:"PostToolUse",projectPath:r,afterEmit:c(async(t,n)=>{let s=t.tool_input?.file_path;if(!(!s||!(await P.readConfig(n))?.projectId))try{await Xe.log(n,"post_edit",{file:s,tool:t.tool_name??"unknown"})}catch{}},"afterEmit")},e)}var Lf=h(()=>{"use strict";Q();Yn();Kn();c(Nf,"runPostEditHook")});var kC={};A(kC,{runPreCommitHook:()=>Ff});import{execSync as sO}from"node:child_process";function aO(r){try{return sO("git diff --cached --name-only",{cwd:r,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
1202
+ `)}function Df(r=process.cwd(),e){let t=null;return it({event:"SessionStart",projectPath:r,build:c(async(n,s)=>{t=await P.readConfig(s).catch(()=>null);let o=n.source??"startup";return Pl(s,t,{digest:o==="startup"||o==="clear"||o==="compact"})},"build"),afterEmit:c(async(n,s)=>{t?.projectId&&await mi(s,t.projectId).catch(()=>{}),Md(te)||await Od(te).catch(()=>{});try{let{maybeAutoUpdate:o}=await Promise.resolve().then(()=>(Ru(),Cu));o(te)}catch{}},"afterEmit")},e)}var ZM,xl,tO,nO,fC,xi=h(()=>{"use strict";Q();Ba();Xt();Te();Qn();$n();_e();Kn();Gs();ZM=1400,xl=3;c(Pl,"buildSessionContext");c(eO,"buildKnowledgeDigest");tO=2;c(gC,"findRepeatMissedEntry");nO=500,fC=2;c(If,"buildSubagentDigest");c(rO,"formatPersona");c(Df,"runSessionStartHook")});var yC={};A(yC,{runCwdChangedHook:()=>Mf});function Mf(r=process.cwd(),e){return it({event:"CwdChanged",projectPath:r,build:c(async(t,n)=>{let s=t.cwd||n;return Pl(s)},"build")},e)}var Of=h(()=>{"use strict";Kn();xi();c(Mf,"runCwdChangedHook")});var wC={};A(wC,{runPostEditHook:()=>Nf});function Nf(r=process.cwd(),e){return it({event:"PostToolUse",projectPath:r,afterEmit:c(async(t,n)=>{let s=t.tool_input?.file_path;if(!(!s||!(await P.readConfig(n))?.projectId))try{await Xe.log(n,"post_edit",{file:s,tool:t.tool_name??"unknown"})}catch{}},"afterEmit")},e)}var Lf=h(()=>{"use strict";Q();Yn();Kn();c(Nf,"runPostEditHook")});var kC={};A(kC,{runPreCommitHook:()=>Ff});import{execSync as sO}from"node:child_process";function aO(r){try{return sO("git diff --cached --name-only",{cwd:r,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
1203
1203
  `).map(e=>e.trim()).filter(Boolean)}catch{return[]}}function cO(r){let e=new Set;for(let t of r){let n=t.split("/").filter(Boolean);for(let s of n){let o=s.replace(/\.[^.]+$/,"").toLowerCase();o.length>=3&&e.add(o)}}return[...e]}function lO(r,e){let t=r.content.toLowerCase();if(e.some(n=>t.includes(n)))return!0;for(let n of Object.values(r.tags)){let s=n.toLowerCase();if(e.some(o=>s.includes(o)))return!0}return!1}async function uO(r){let e=await P.readConfig(r);if(!e?.projectId)return null;let t=aO(r);if(t.length===0)return null;let n=cO(t);if(n.length===0)return null;let s;try{s=N.recall(e.projectId,{types:["anti-pattern","gotcha"],limit:50})}catch{return null}let o=s.filter(l=>lO(l,n)).slice(0,iO);if(o.length===0)return null;let i=["# prjct: heads-up for this commit",""];i.push(`${o.length} anti-pattern/gotcha entr${o.length===1?"y":"ies"} match the staged files.`),i.push(""),i.push(hr(o)),i.push(""),i.push("> Nudge, not block. Proceed if you think it still applies.");let a=i.join(`
1204
- `);return Jn(a,oO)}function Ff(r=process.cwd(),e){return it({event:"PreToolUse",projectPath:r,build:c(async(t,n)=>{let s=t.tool_input?.command??"";return/\bgit\s+commit\b/.test(s)?uO(n):null},"build")},e)}var oO,iO,Hf=h(()=>{"use strict";Q();Xt();Ee();Kn();Gs();oO=1200,iO=3;c(aO,"stagedFiles");c(cO,"pathFragments");c(lO,"mentionsFragment");c(uO,"buildPreCommitContext");c(Ff,"runPreCommitHook")});async function ho(r,e,t){if(t.length!==0)try{let{resolveActiveTask:n}=await Promise.resolve().then(()=>(as(),$f)),s=await n(r,e);s?.id&&at.recordSurfaced(r,t,s.id)}catch{}}var Al=h(()=>{"use strict";Qn();c(ho,"recordSurfacedForActiveTask")});var bC={};A(bC,{runPreEditHook:()=>Uf});async function mO(r,e){let t=await P.readConfig(r);if(!t?.projectId)return null;let n;try{n=N.recallForFile(t.projectId,e,pO)}catch{return null}if(n.length===0)return null;ho(t.projectId,r,n.map(i=>i.id));let o=[`# prjct: heads-up before editing \`${e.split("/").pop()??e}\``,""];o.push(`${n.length} preventive memory entr${n.length===1?"y":"ies"} recorded against this file:`),o.push("");for(let i of n)o.push(`- **[${ei(i)}] ${He(i)}** \u2014 ${ti(i.content)} \`${i.id}\``);return o.push(""),o.push("> Nudge, not block. Apply if it still holds; proceed if not."),Jn(o.join(`
1205
- `),dO)}function Uf(r=process.cwd(),e){return it({event:"PreToolUse",projectPath:r,build:c(async(t,n)=>{let s=t.tool_input?.file_path?.trim();return s?mO(n,s):null},"build")},e)}var dO,pO,Wf=h(()=>{"use strict";Q();Xt();Ee();Al();Kn();Gs();dO=1200,pO=3;c(mO,"buildPreEditContext");c(Uf,"runPreEditHook")});var EC={};A(EC,{collectActiveTasks:()=>Pi,formatActiveTaskLine:()=>SC,formatActiveTaskList:()=>fO});function vC(r,e){let t=r===Ht?Ht:r.slice(0,6);return{shortId:t,label:`${t} \xB7 ${e??"(detached)"}`}}async function Pi(r,e){let t=await us(e),n=[],s=await K.getCurrentTask(r);if(s){let{shortId:i,label:a}=vC(Ht,s.branch);n.push({id:s.id,description:s.description,workspaceId:Ht,shortId:i,label:a,branch:s.branch,linearId:s.linearId,startedAt:s.startedAt,isCurrent:t.workspaceId===Ht})}for(let i of await K.getActiveTasks(r)){if(i.workspaceId===Ht)continue;let{shortId:a,label:l}=vC(i.workspaceId,i.branch);n.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 n.sort((i,a)=>Number(a.isCurrent)-Number(i.isCurrent)),{current:n.find(i=>i.isCurrent)??null,all:n}}function SC(r){let e=r.isCurrent?"\u2192":" ",t=r.isCurrent?" (this worktree)":"";return`${e} ${r.label} ${r.description}${t}`}function fO(r){if(r.all.length===0)return"No active task.";if(r.all.length===1&&r.current){let t=r.current;return`Active: ${t.description}
1204
+ `);return Jn(a,oO)}function Ff(r=process.cwd(),e){return it({event:"PreToolUse",projectPath:r,build:c(async(t,n)=>{let s=t.tool_input?.command??"";return/\bgit\s+commit\b/.test(s)?uO(n):null},"build")},e)}var oO,iO,Hf=h(()=>{"use strict";Q();Xt();Te();Kn();Gs();oO=1200,iO=3;c(aO,"stagedFiles");c(cO,"pathFragments");c(lO,"mentionsFragment");c(uO,"buildPreCommitContext");c(Ff,"runPreCommitHook")});async function ho(r,e,t){if(t.length!==0)try{let{resolveActiveTask:n}=await Promise.resolve().then(()=>(as(),$f)),s=await n(r,e);s?.id&&at.recordSurfaced(r,t,s.id)}catch{}}var Al=h(()=>{"use strict";Qn();c(ho,"recordSurfacedForActiveTask")});var bC={};A(bC,{runPreEditHook:()=>Uf});async function mO(r,e){let t=await P.readConfig(r);if(!t?.projectId)return null;let n;try{n=N.recallForFile(t.projectId,e,pO)}catch{return null}if(n.length===0)return null;ho(t.projectId,r,n.map(i=>i.id));let o=[`# prjct: heads-up before editing \`${e.split("/").pop()??e}\``,""];o.push(`${n.length} preventive memory entr${n.length===1?"y":"ies"} recorded against this file:`),o.push("");for(let i of n)o.push(`- **[${ei(i)}] ${He(i)}** \u2014 ${ti(i.content)} \`${i.id}\``);return o.push(""),o.push("> Nudge, not block. Apply if it still holds; proceed if not."),Jn(o.join(`
1205
+ `),dO)}function Uf(r=process.cwd(),e){return it({event:"PreToolUse",projectPath:r,build:c(async(t,n)=>{let s=t.tool_input?.file_path?.trim();return s?mO(n,s):null},"build")},e)}var dO,pO,Wf=h(()=>{"use strict";Q();Xt();Te();Al();Kn();Gs();dO=1200,pO=3;c(mO,"buildPreEditContext");c(Uf,"runPreEditHook")});var EC={};A(EC,{collectActiveTasks:()=>Pi,formatActiveTaskLine:()=>SC,formatActiveTaskList:()=>fO});function vC(r,e){let t=r===Ht?Ht:r.slice(0,6);return{shortId:t,label:`${t} \xB7 ${e??"(detached)"}`}}async function Pi(r,e){let t=await us(e),n=[],s=await K.getCurrentTask(r);if(s){let{shortId:i,label:a}=vC(Ht,s.branch);n.push({id:s.id,description:s.description,workspaceId:Ht,shortId:i,label:a,branch:s.branch,linearId:s.linearId,startedAt:s.startedAt,isCurrent:t.workspaceId===Ht})}for(let i of await K.getActiveTasks(r)){if(i.workspaceId===Ht)continue;let{shortId:a,label:l}=vC(i.workspaceId,i.branch);n.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 n.sort((i,a)=>Number(a.isCurrent)-Number(i.isCurrent)),{current:n.find(i=>i.isCurrent)??null,all:n}}function SC(r){let e=r.isCurrent?"\u2192":" ",t=r.isCurrent?" (this worktree)":"";return`${e} ${r.label} ${r.description}${t}`}function fO(r){if(r.all.length===0)return"No active task.";if(r.all.length===1&&r.current){let t=r.current;return`Active: ${t.description}
1206
1206
  Workspace: ${t.label}`}let e=[`Active tasks (${r.all.length})`];for(let t of r.all)e.push(SC(t));return e.join(`
1207
1207
  `)}var jl=h(()=>{"use strict";Et();Af();c(vC,"labelFor");c(Pi,"collectActiveTasks");c(SC,"formatActiveTaskLine");c(fO,"formatActiveTaskList")});var xC={};A(xC,{_resetGitSnapshotCacheForTests:()=>kO,buildProjectState:()=>CC,buildTopicalCue:()=>RC,runPromptHook:()=>Gf});import gO from"node:path";async function CC(r,e){let t=e!==void 0?e:await P.readConfig(r);if(!t?.projectId)return null;let n=["# prjct: project state"],s=!1;try{let o=await Pi(t.projectId,r);if(o.current){let a=TC(o.current.startedAt);n.push(`- Active task: "${o.current.description}" (${a}) [${o.current.label}]`),s=!0}let i=o.all.filter(a=>!a.isCurrent);i.length>0&&(n.push(`- ${i.length} task(s) active in other workspace(s)`),s=!0)}catch{}if(await E(gO.join(r,".git"))){let o=await bO(r);if(o.branch){let i=[];o.modified>0&&i.push(`${o.modified} modified`),o.staged>0&&i.push(`${o.staged} staged`),o.untracked>0&&i.push(`${o.untracked} untracked`);let a=i.length>0?` \u2014 working tree ${i.join(", ")}`:"",l=o.ahead>0?`${a?",":" \u2014"} ${o.ahead} unpushed`:"";n.push(`- Branch: ${o.branch}${a}${l}`),s=!0}}try{let o=await bt.getRecent(t.projectId,1);if(o.length>0){let i=o[0],a=TC(i.shippedAt??""),l=i.version?`v${i.version}`:i.name;n.push(`- Last ship: ${l} (${a})`),s=!0}}catch{}try{let o=N.countByType(t.projectId,"inbox");o>0&&(n.push(`- Inbox: ${o} items pending`),s=!0)}catch{}return s?n.join(`
1208
1208
  `):null}function RC(r,e,t){try{let n=Gw(e);if(n.length===0)return null;let o=N.searchFts(r,n,yO).find(i=>i.type==="gotcha"||i.type==="anti-pattern");return o?(t&&ho(r,t,[o.id]),`> Trap on this topic: ${He(o)} \`${o.id}\``):null}catch{return null}}function kO(){Ai.clear()}async function bO(r){let e=Ai.get(r);if(e&&e.expiresAt>Date.now())return e.snapshot;let t=await vO(r);return Ai.size>32&&Ai.clear(),Ai.set(r,{snapshot:t,expiresAt:Date.now()+wO}),t}async function vO(r){let e={branch:"",modified:0,staged:0,untracked:0,ahead:0},t=c(async d=>{try{return(await re("git",d,{cwd:r,timeout:2e3})).stdout.trim()}catch{return""}},"safe"),[n,s,o]=await Promise.all([t(["branch","--show-current"]),t(["status","--porcelain"]),t(["rev-list","--count","@{u}..HEAD"])]);if(!n)return e;let i=0,a=0,l=0;for(let d of s.split(`
1209
1209
  `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?l++:(p[0]!==" "&&p[0]!=="?"&&a++,p[1]!==" "&&i++)}let u=Number.parseInt(o,10)||0;return{branch:n,modified:i,staged:a,untracked:l,ahead:u}}function TC(r){if(!r)return"unknown";let e=Date.parse(r);if(Number.isNaN(e))return"unknown";let t=Math.max(0,Math.floor((Date.now()-e)/864e5));return t<1?"today":t<2?"yesterday":t<30?`${t}d ago`:`${Math.floor(t/30)}mo ago`}function Gf(r=process.cwd(),e){return it({event:"UserPromptSubmit",projectPath:r,build:c(async(t,n)=>{let s=(t.prompt??"").trim();if(!s)return null;let o=await P.readConfig(n),i=await CC(n,o);if(!i)return null;let a=o?.projectId?RC(o.projectId,s,n):null;return Jn(a?`${i}
1210
1210
 
1211
- ${a}`:i,hO)},"build")},e)}var hO,yO,wO,Ai,Bf=h(()=>{"use strict";Q();Xt();Ee();jl();Al();Qr();Ce();J();Kn();Gs();hO=900,yO=8;c(CC,"buildProjectState");c(RC,"buildTopicalCue");wO=3e3,Ai=new Map;c(kO,"_resetGitSnapshotCacheForTests");c(bO,"captureGit");c(vO,"captureGitUncached");c(TC,"formatRelative");c(Gf,"runPromptHook")});function Vf(r){let e=r.trim();if(/^sk-or-/i.test(e))return{baseUrl:"https://openrouter.ai/api/v1",provider:"OpenRouter"};if(!/^sk-ant-/i.test(e)&&!/^(gsk_|gpg_)/i.test(e)){if(/^sk-/i.test(e))return{baseUrl:"https://api.openai.com/v1",provider:"OpenAI"};if(/^pa-/i.test(e))return{baseUrl:"https://api.voyageai.com/v1",provider:"Voyage"}}}function SO(r){if(!(typeof r!="string"||!r.trim()))try{let e=JSON.parse(r);if(e&&typeof e=="object"&&!Array.isArray(e)){let t={};for(let[n,s]of Object.entries(e))t[n]=String(s);return Object.keys(t).length?t:void 0}}catch{}}function ds(){let r=Pt(Jf),e=Pt($l);if(r!=="openai-compatible"||!e)return null;let t=Pt(Xf),n=Pt(Kf),s=Pt(Yf);return{provider:"openai-compatible",baseUrl:String(Pt(_l)??qf),model:String(e),authHeader:n!=null?String(n):void 0,authScheme:t!=null?String(t):void 0,extraHeaders:SO(Pt(zf)),query:s!=null?String(s):void 0}}function Qf(r){let e=ds();if(Oe(Jf,"openai-compatible"),r.baseUrl?.trim()?Oe(_l,r.baseUrl.trim()):e||Oe(_l,qf),r.model?.trim()?Oe($l,r.model.trim()):e||Oe($l,Il),r.authHeader!==void 0&&Oe(Kf,r.authHeader.trim()||void 0),r.authScheme!==void 0&&Oe(Xf,r.authScheme),r.query!==void 0&&Oe(Yf,r.query.trim()||void 0),r.extraHeaders!==void 0){let n=Object.keys(r.extraHeaders).length>0;Oe(zf,n?JSON.stringify(r.extraHeaders):void 0)}return ds()}function Zf(){Oe(Jf,void 0),Oe(_l,void 0),Oe($l,void 0),Oe(Kf,void 0),Oe(Xf,void 0),Oe(zf,void 0),Oe(Yf,void 0)}var qf,Il,Jf,_l,$l,Kf,Xf,zf,Yf,eg=h(()=>{"use strict";ia();qf="https://api.openai.com/v1",Il="text-embedding-3-small";c(Vf,"detectBaseUrlFromKey");Jf="embeddings.provider",_l="embeddings.baseUrl",$l="embeddings.model",Kf="embeddings.authHeader",Xf="embeddings.authScheme",zf="embeddings.headers",Yf="embeddings.query";c(SO,"parseHeaders");c(ds,"resolveGlobalEmbeddings");c(Qf,"setGlobalEmbeddings");c(Zf,"clearGlobalEmbeddings")});import ji from"node:fs";import PC from"node:path";function _i(){return PC.join(en(),"config","embeddings.key")}function Dl(){return process.platform==="darwin"}async function AC(){try{let{stdout:r}=await re("security",["find-generic-password","-a",rg,"-s",ng,"-w"]);return r.trim()||null}catch{return null}}function jC(){try{return ji.readFileSync(_i(),"utf-8").trim()||null}catch{return null}}async function _C(){if(Dr!==void 0)return Dr;let r=process.env[tg]?.trim();return r?(Dr=r,Dr):(Dr=(Dl()?await AC():null)??jC(),Dr)}async function $C(){return process.env[tg]?.trim()?"env":Dl()&&await AC()?"keychain":jC()?"file":"none"}async function IC(r){let e=r.trim();if(Dr=e,Dl())try{return await re("security",["add-generic-password","-U","-a",rg,"-s",ng,"-w",e]),"keychain"}catch{}ji.mkdirSync(PC.dirname(_i()),{recursive:!0}),ji.writeFileSync(_i(),e,{mode:384});try{ji.chmodSync(_i(),384)}catch{}return"file"}async function DC(){if(Dr=null,Dl())try{await re("security",["delete-generic-password","-a",rg,"-s",ng])}catch{}try{ji.rmSync(_i())}catch{}}var tg,ng,rg,Dr,Ml=h(()=>{"use strict";Es();Ce();tg="PRJCT_EMBEDDINGS_API_KEY",ng="prjct-embeddings",rg="prjct";c(_i,"keyFilePath");c(Dl,"isDarwin");c(AC,"readKeychain");c(jC,"readFileKey");c(_C,"getEmbeddingsKey");c($C,"getKeyLocation");c(IC,"setEmbeddingsKey");c(DC,"clearEmbeddingsKey")});function EO(r){let e=r?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new Ol(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}function TO(r,e,t,n,s={}){let o=r.replace(/\/+$/,""),i=s.query?.trim().replace(/^\?/,""),a=`${o}/embeddings${i?`?${i}`:""}`,l={"content-type":"application/json",...s.extraHeaders??{}};if(n){let u=s.authHeader?.trim()||"authorization",d=s.authScheme??"Bearer";l[u]=d?`${d} ${n}`:n}return{url:a,init:{method:"POST",headers:l,body:JSON.stringify({model:e,input:t})}}}function xO(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function PO(r,e,t){let n=[];if(r.length<e)return n.push(r),n;for(let s=e;s<=t;s++)for(let o=0;o+s<=r.length;o++)n.push(r.slice(o,o+s));return n}function AO(r){let e=new Float64Array($i),t=(r.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,RO);for(let o of t){let i=PO(`<${o}>`,3,5);i.push(o);for(let a of i){let l=xO(a),u=l%$i,d=l&65536?1:-1;e[u]+=d}}let n=0;for(let o=0;o<$i;o++)n+=e[o]*e[o];n=Math.sqrt(n)||1;let s=new Array($i);for(let o=0;o<$i;o++)s[o]=e[o]/n;return s}function Nl(r){let e=EO(r);if(e)return e;let t=ds();return t?new Ol(t.baseUrl,t.model,{authHeader:t.authHeader,authScheme:t.authScheme,extraHeaders:t.extraHeaders,query:t.query}):new og}function jO(r){return Buffer.from(new Float32Array(r).buffer)}function _O(r){let e=Uint8Array.from(r);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function sg(r){let e=0;for(let t=0;t<r.length;t++)e+=r[t]*r[t];return Math.sqrt(e)}function $O(r,e){let t=Math.min(r.length,e.length),n=0;for(let s=0;s<t;s++)n+=r[s]*e[s];return n}var Ol,CO,$i,RO,og,IO,DO,MC,Ii,Ll=h(()=>{"use strict";Ys();Ee();X();eg();Ml();eg();Ml();c(EO,"resolveProvider");c(TO,"buildEmbeddingsRequest");Ol=class{constructor(e,t,n={}){this.baseUrl=e;this.model=t;this.auth=n}baseUrl;model;auth;static{c(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let t=await _C(),{url:n,init:s}=TO(this.baseUrl,this.model,e,t,this.auth),o=await fetch(n,s);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(a=>a.embedding)}},CO="local-subword-v1",$i=256,RO=800;c(xO,"fnv1a");c(PO,"charNGrams");c(AO,"embedLocal");og=class{static{c(this,"LocalSubwordEmbeddingProvider")}model=CO;isLocal=!0;async embed(e){return e.map(t=>AO(t))}};c(Nl,"resolveActiveProvider");c(jO,"packVector");c(_O,"unpackVector");c(sg,"l2Norm");c($O,"dot");IO=2e3,DO=10,MC=new Map,Ii={isEnabled(r){return!0},store(r,e,t,n,s){S.run(r,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
1211
+ ${a}`:i,hO)},"build")},e)}var hO,yO,wO,Ai,Bf=h(()=>{"use strict";Q();Xt();Te();jl();Al();Qr();Re();J();Kn();Gs();hO=900,yO=8;c(CC,"buildProjectState");c(RC,"buildTopicalCue");wO=3e3,Ai=new Map;c(kO,"_resetGitSnapshotCacheForTests");c(bO,"captureGit");c(vO,"captureGitUncached");c(TC,"formatRelative");c(Gf,"runPromptHook")});function Vf(r){let e=r.trim();if(/^sk-or-/i.test(e))return{baseUrl:"https://openrouter.ai/api/v1",provider:"OpenRouter"};if(!/^sk-ant-/i.test(e)&&!/^(gsk_|gpg_)/i.test(e)){if(/^sk-/i.test(e))return{baseUrl:"https://api.openai.com/v1",provider:"OpenAI"};if(/^pa-/i.test(e))return{baseUrl:"https://api.voyageai.com/v1",provider:"Voyage"}}}function SO(r){if(!(typeof r!="string"||!r.trim()))try{let e=JSON.parse(r);if(e&&typeof e=="object"&&!Array.isArray(e)){let t={};for(let[n,s]of Object.entries(e))t[n]=String(s);return Object.keys(t).length?t:void 0}}catch{}}function ds(){let r=Pt(Jf),e=Pt($l);if(r!=="openai-compatible"||!e)return null;let t=Pt(Xf),n=Pt(Kf),s=Pt(Yf);return{provider:"openai-compatible",baseUrl:String(Pt(_l)??qf),model:String(e),authHeader:n!=null?String(n):void 0,authScheme:t!=null?String(t):void 0,extraHeaders:SO(Pt(zf)),query:s!=null?String(s):void 0}}function Qf(r){let e=ds();if(Oe(Jf,"openai-compatible"),r.baseUrl?.trim()?Oe(_l,r.baseUrl.trim()):e||Oe(_l,qf),r.model?.trim()?Oe($l,r.model.trim()):e||Oe($l,Il),r.authHeader!==void 0&&Oe(Kf,r.authHeader.trim()||void 0),r.authScheme!==void 0&&Oe(Xf,r.authScheme),r.query!==void 0&&Oe(Yf,r.query.trim()||void 0),r.extraHeaders!==void 0){let n=Object.keys(r.extraHeaders).length>0;Oe(zf,n?JSON.stringify(r.extraHeaders):void 0)}return ds()}function Zf(){Oe(Jf,void 0),Oe(_l,void 0),Oe($l,void 0),Oe(Kf,void 0),Oe(Xf,void 0),Oe(zf,void 0),Oe(Yf,void 0)}var qf,Il,Jf,_l,$l,Kf,Xf,zf,Yf,eg=h(()=>{"use strict";ia();qf="https://api.openai.com/v1",Il="text-embedding-3-small";c(Vf,"detectBaseUrlFromKey");Jf="embeddings.provider",_l="embeddings.baseUrl",$l="embeddings.model",Kf="embeddings.authHeader",Xf="embeddings.authScheme",zf="embeddings.headers",Yf="embeddings.query";c(SO,"parseHeaders");c(ds,"resolveGlobalEmbeddings");c(Qf,"setGlobalEmbeddings");c(Zf,"clearGlobalEmbeddings")});import ji from"node:fs";import PC from"node:path";function _i(){return PC.join(en(),"config","embeddings.key")}function Dl(){return process.platform==="darwin"}async function AC(){try{let{stdout:r}=await re("security",["find-generic-password","-a",rg,"-s",ng,"-w"]);return r.trim()||null}catch{return null}}function jC(){try{return ji.readFileSync(_i(),"utf-8").trim()||null}catch{return null}}async function _C(){if(Dr!==void 0)return Dr;let r=process.env[tg]?.trim();return r?(Dr=r,Dr):(Dr=(Dl()?await AC():null)??jC(),Dr)}async function $C(){return process.env[tg]?.trim()?"env":Dl()&&await AC()?"keychain":jC()?"file":"none"}async function IC(r){let e=r.trim();if(Dr=e,Dl())try{return await re("security",["add-generic-password","-U","-a",rg,"-s",ng,"-w",e]),"keychain"}catch{}ji.mkdirSync(PC.dirname(_i()),{recursive:!0}),ji.writeFileSync(_i(),e,{mode:384});try{ji.chmodSync(_i(),384)}catch{}return"file"}async function DC(){if(Dr=null,Dl())try{await re("security",["delete-generic-password","-a",rg,"-s",ng])}catch{}try{ji.rmSync(_i())}catch{}}var tg,ng,rg,Dr,Ml=h(()=>{"use strict";Es();Re();tg="PRJCT_EMBEDDINGS_API_KEY",ng="prjct-embeddings",rg="prjct";c(_i,"keyFilePath");c(Dl,"isDarwin");c(AC,"readKeychain");c(jC,"readFileKey");c(_C,"getEmbeddingsKey");c($C,"getKeyLocation");c(IC,"setEmbeddingsKey");c(DC,"clearEmbeddingsKey")});function EO(r){let e=r?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new Ol(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}function TO(r,e,t,n,s={}){let o=r.replace(/\/+$/,""),i=s.query?.trim().replace(/^\?/,""),a=`${o}/embeddings${i?`?${i}`:""}`,l={"content-type":"application/json",...s.extraHeaders??{}};if(n){let u=s.authHeader?.trim()||"authorization",d=s.authScheme??"Bearer";l[u]=d?`${d} ${n}`:n}return{url:a,init:{method:"POST",headers:l,body:JSON.stringify({model:e,input:t})}}}function xO(r){let e=2166136261;for(let t=0;t<r.length;t++)e^=r.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function PO(r,e,t){let n=[];if(r.length<e)return n.push(r),n;for(let s=e;s<=t;s++)for(let o=0;o+s<=r.length;o++)n.push(r.slice(o,o+s));return n}function AO(r){let e=new Float64Array($i),t=(r.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,RO);for(let o of t){let i=PO(`<${o}>`,3,5);i.push(o);for(let a of i){let l=xO(a),u=l%$i,d=l&65536?1:-1;e[u]+=d}}let n=0;for(let o=0;o<$i;o++)n+=e[o]*e[o];n=Math.sqrt(n)||1;let s=new Array($i);for(let o=0;o<$i;o++)s[o]=e[o]/n;return s}function Nl(r){let e=EO(r);if(e)return e;let t=ds();return t?new Ol(t.baseUrl,t.model,{authHeader:t.authHeader,authScheme:t.authScheme,extraHeaders:t.extraHeaders,query:t.query}):new og}function jO(r){return Buffer.from(new Float32Array(r).buffer)}function _O(r){let e=Uint8Array.from(r);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function sg(r){let e=0;for(let t=0;t<r.length;t++)e+=r[t]*r[t];return Math.sqrt(e)}function $O(r,e){let t=Math.min(r.length,e.length),n=0;for(let s=0;s<t;s++)n+=r[s]*e[s];return n}var Ol,CO,$i,RO,og,IO,DO,MC,Ii,Ll=h(()=>{"use strict";Ys();Te();X();eg();Ml();eg();Ml();c(EO,"resolveProvider");c(TO,"buildEmbeddingsRequest");Ol=class{constructor(e,t,n={}){this.baseUrl=e;this.model=t;this.auth=n}baseUrl;model;auth;static{c(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let t=await _C(),{url:n,init:s}=TO(this.baseUrl,this.model,e,t,this.auth),o=await fetch(n,s);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(a=>a.embedding)}},CO="local-subword-v1",$i=256,RO=800;c(xO,"fnv1a");c(PO,"charNGrams");c(AO,"embedLocal");og=class{static{c(this,"LocalSubwordEmbeddingProvider")}model=CO;isLocal=!0;async embed(e){return e.map(t=>AO(t))}};c(Nl,"resolveActiveProvider");c(jO,"packVector");c(_O,"unpackVector");c(sg,"l2Norm");c($O,"dot");IO=2e3,DO=10,MC=new Map,Ii={isEnabled(r){return!0},store(r,e,t,n,s){S.run(r,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
1212
1212
  VALUES (?, ?, ?, ?, ?, ?)
1213
1213
  ON CONFLICT(memory_id) DO UPDATE SET
1214
1214
  vector = excluded.vector, model = excluded.model,
@@ -1216,13 +1216,13 @@ ${a}`:i,hO)},"build")},e)}var hO,yO,wO,Ai,Bf=h(()=>{"use strict";Q();Xt();Ee();j
1216
1216
  WHERE model = ? ORDER BY rowid DESC LIMIT ?`,o.model,IO)}catch{return[]}let l=sg(i);if(l===0)return[];let u=a.map(p=>{let m=_O(p.vector),f=l*(p.norm??sg(m));return{id:p.memory_id,score:f===0?0:$O(i,m)/f}}).sort((p,m)=>m.score-p.score).slice(0,n),d=[];for(let p of u){let m=N.getById(r,p.id);m&&d.push(m)}return d}}});function Mr(r){let e=[];for(let t of r.split(`
1217
1217
  `)){let n=t.trim();if(n)try{let s=JSON.parse(n);s&&typeof s=="object"&&e.push(s)}catch{}}return e}var Di=h(()=>{"use strict";c(Mr,"parseTranscriptJsonl")});import MO from"node:crypto";import OO from"node:fs/promises";async function LC(r,e,t,n={}){let s;if(n.preloadedLines)s=n.preloadedLines;else{let d="";try{d=await OO.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}s=UO(d)}let o=WO(s);if(o.length===0)return{signalsRecorded:0,signalsSkipped:0};let i=JO(r),a=FC(r)??void 0,l=0,u=0;for(let d of o.slice(0,NO)){let p=VO(d.excerpt).slice(0,12);if(i.has(p)){u++;continue}try{await N.remember(r,{type:"improvement-signal",content:qO(d),tags:{source:NC,category:d.category,...t?{session:t}:{},key:p},provenance:"extracted",projectId:a}),l++}catch{u++}}return{signalsRecorded:l,signalsSkipped:u}}function UO(r){return Mr(r)}function WO(r){let e=[],t="";for(let n of r){let s=n.role??n.message?.role,o=BO(n.content??n.message?.content);if(!o)continue;if(s==="assistant"){t=o;continue}if(s!=="user")continue;let i=o.slice(0,300),a=GO(i);a&&e.push({excerpt:o.slice(0,OC).trim(),category:a,precedingAssistantPreview:t.slice(0,OC).trim()})}return e}function GO(r){return HO.some(e=>e.test(r))?"complaint":LO.some(e=>e.test(r))?"negation":FO.some(e=>e.test(r))?"correction":null}function BO(r){return typeof r=="string"?r:Array.isArray(r)?r.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(`
1218
1218
  `).trim():""}function qO(r){return[`[${r.category}] User pushback: "${r.excerpt}"`,r.precedingAssistantPreview?`Following assistant action: "${r.precedingAssistantPreview.slice(0,200)}"`:null].filter(t=>!!t).join(`
1219
- `)}function VO(r){let e=r.toLowerCase().replace(/\s+/g," ").trim();return MO.createHash("sha256").update(e).digest("hex")}function JO(r){try{let e=FC(r);if(!e)return new Set;let t=N.recall(e,{types:["improvement-signal"],tags:{source:NC},limit:100,dedupeByKey:!1}),n=new Set;for(let s of t){let o=s.tags.key;o&&n.add(o)}return n}catch{return new Set}}function FC(r){try{let e=tt("node:fs"),n=tt("node:path").join(r,".prjct","prjct.config.json"),s=e.readFileSync(n,"utf-8");return JSON.parse(s).projectId??null}catch{return null}}var NC,NO,OC,LO,FO,HO,HC=h(()=>{"use strict";Ee();Di();NC="friction-detector",NO=5,OC=400,LO=[/^\s*no[,.!\s]/i,/^\s*nope\b/i,/^\s*así no\b/i,/^\s*espera\b/i,/^\s*stop\b/i,/^\s*wait\b/i,/^\s*cancel\b/i],FO=[/\bshould be\b/i,/\brather than\b/i,/\binstead\b/i,/\bmás bien\b/i,/\ben realidad\b/i],HO=[/\bdoesn'?t work\b/i,/\bno funciona\b/i,/\bbroken\b/i,/\bestá roto\b/i,/\bagain\b.*\bsame\b/i];c(LC,"detectFriction");c(UO,"parseJsonl");c(WO,"extractSignals");c(GO,"classify");c(BO,"textOf");c(qO,"formatSignal");c(VO,"hashSignal");c(JO,"projectMemoryHashes");c(FC,"projectIdFromPath")});import{execFile as KO}from"node:child_process";import{promisify as XO}from"node:util";function ZO(r){let e=r?.lean?.mode;if(e&&UC.includes(e))return e;let t=process.env.PRJCT_LEAN_MODE?.toLowerCase();return t&&UC.includes(t)?t:"off"}async function GC(r,e){let t={active:!1,total:0,previous:0,persisted:!1},n=e!==void 0?e:await P.readConfig(r).catch(()=>null);if(!n?.projectId||ZO(n)==="off")return t;t.active=!0;try{let s=await eN(r);if(t.total=s,s===0)return t;let o=tN(n.projectId);t.previous=o;let i=s-o;o>0&&i>=QO&&(await N.remember(r,{type:"lean-debt",content:`Lean debt growing: \`lean:\` markers rose by ${i} (now ${s}, was ${o}). Deferred simplifications are accumulating \u2014 consider a leaning pass via \`prjct lean debt\`.`,tags:{source:WC,pattern:YO,total:String(s),previous:String(o),delta:String(i)},provenance:"inferred",projectId:n.projectId}),t.persisted=!0)}catch{}return t}async function eN(r){try{let{stdout:e}=await zO("git",["grep","-cI","-e","lean:"],{cwd:r,maxBuffer:16777216}),t=0;for(let n of e.split(`
1220
- `)){let s=n.lastIndexOf(":");if(s<=0)continue;let o=Number.parseInt(n.slice(s+1),10);Number.isFinite(o)&&(t+=o)}return t}catch(e){if(e.code===1)return 0;throw e}}function tN(r){try{let{prjctDb:e}=(X(),ze(fr)),t=e.query(r,"SELECT data FROM events WHERE type = 'memory.remember.lean-debt' ORDER BY id DESC LIMIT 50");for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}if(!s||typeof s!="object")continue;let o=s.tags;if(!o||o.source!==WC)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}var zO,WC,YO,QO,UC,BC=h(()=>{"use strict";Q();Ee();zO=XO(KO),WC="lean-detector",YO="lean-debt-growth",QO=3,UC=["off","lite","full","ultra"];c(ZO,"effectiveMode");c(GC,"detectAndPersistLeanDebt");c(eN,"measureLeanMarkers");c(tN,"collectPreviousSnapshot")});import{execFile as nN}from"node:child_process";import rN from"node:path";import{promisify as sN}from"node:util";async function XC(r,e){let t={scanned:0,hotFiles:[],persisted:0,skipped:[],errors:[]},n=e!==void 0?e:await P.readConfig(r).catch(()=>null);if(!n?.projectId)return t.errors.push("no project config"),t;try{let s=await pN(r);if(t.scanned+=s.length,t.hotFiles=s,s.length>0){let o=yN(n.projectId);for(let i of s){if(o.has(i.path)){t.skipped.push({reason:"already-marked-this-window",file:i.path});continue}try{await N.remember(r,{type:"learning",content:`Hot file: \`${i.path}\` \u2014 ${i.touches} touches in the last ${Fl} days. Worth a refactor pass or a deliberate decision about why it churns this often.`,tags:{source:VC,pattern:oN,file:i.path,touches:String(i.touches),window_days:String(Fl)},provenance:"inferred"}),t.persisted+=1}catch(a){t.errors.push(`remember failed for ${i.path}: ${a.message}`)}}}}catch(s){t.errors.push(`hot-file detection failed: ${s.message}`)}try{let s=fN(n.projectId);if(s.length>0){let o=wN(n.projectId);for(let i of s){if(o.has(i.topic)){t.skipped.push({reason:"recurring-bug-already-marked",file:i.topic});continue}try{await N.remember(r,{type:"learning",content:`Recurring bug pattern: gotchas tagged \`topic:${i.topic}\` reported ${i.occurrences} times in the last ${Hl} days. Likely a real underlying issue \u2014 consider a focused investigation before patching the next instance.`,tags:{source:JC,pattern:iN,topic:i.topic,occurrences:String(i.occurrences),window_days:String(Hl)},provenance:"inferred"}),t.persisted+=1}catch(a){t.errors.push(`remember failed for recurring ${i.topic}: ${a.message}`)}}}}catch(s){t.errors.push(`recurring-bug detection failed: ${s.message}`)}try{let s=await gN(r);if(s.totalCount>0){let o=hN(n.projectId),i=s.totalCount-o;if(o>0&&i>=uN)try{await N.remember(r,{type:"learning",content:`Tech debt growing: TODO/FIXME/XXX count rose by ${i} (now ${s.totalCount}, was ${o}). Consider a focused debt-reduction pass before adding more features.`,tags:{source:KC,pattern:aN,total:String(s.totalCount),previous:String(o),delta:String(i)},provenance:"inferred"}),t.persisted+=1}catch(a){t.errors.push(`remember failed for tech-debt: ${a.message}`)}}}catch(s){t.errors.push(`tech-debt detection failed: ${s.message}`)}return t}async function pN(r){let{stdout:e}=await qC("git",["log",`--since=${Fl}.days.ago`,"--name-only","--pretty=format:","-z"],{cwd:r,maxBuffer:16777216}),t=new Map;for(let s of e.split("\0")){let o=s.trim();o&&(mN(o)||t.set(o,(t.get(o)??0)+1))}let n=[];for(let[s,o]of t)o<cN||n.push({path:s,touches:o});return n.sort((s,o)=>o.touches-s.touches),n}function mN(r){let e=rN.basename(r);for(let t of dN)if(t.test(r)||t.test(e))return!0;return!1}function fN(r){try{let{prjctDb:e}=(X(),ze(fr)),t=new Date(Date.now()-Hl*24*60*60*1e3).toISOString(),n=e.query(r,"SELECT data, timestamp FROM events WHERE type = 'memory.remember.gotcha' AND timestamp >= ? ORDER BY id DESC LIMIT 500",t),s=new Map;for(let i of n){let a;try{a=JSON.parse(i.data)}catch{continue}if(!a||typeof a!="object")continue;let l=a.tags;if(!l||l.source==="transcript-auto")continue;let u=typeof l.topic=="string"?l.topic:void 0,d=typeof l.area=="string"?l.area:void 0,p=u??d;p&&s.set(p,(s.get(p)??0)+1)}let o=[];for(let[i,a]of s)a<lN||o.push({topic:i,occurrences:a});return o.sort((i,a)=>a.occurrences-i.occurrences),o}catch{return[]}}async function gN(r){try{let{stdout:e}=await qC("git",["grep","-cE","\\b(TODO|FIXME|XXX)\\b"],{cwd:r,maxBuffer:16777216}),t=0;for(let n of e.split(`
1221
- `)){let s=n.lastIndexOf(":");if(s<=0)continue;let o=Number.parseInt(n.slice(s+1),10);Number.isFinite(o)&&(t+=o)}return{totalCount:t}}catch(e){if(e.code===1)return{totalCount:0};throw e}}function hN(r){try{let{prjctDb:e}=(X(),ze(fr)),t=e.query(r,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 50");for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}if(!s||typeof s!="object")continue;let o=s.tags;if(!o||o.source!==KC)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}function yN(r){let e=new Set;try{let{prjctDb:t}=(X(),ze(fr)),n=t.query(r,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),s=Date.now()-Fl*24*60*60*1e3;for(let o of n){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==VC)continue;let l=a.file,u=i.rememberedAt;if(typeof l=="string"){if(typeof u=="string"){let d=Date.parse(u);if(!Number.isNaN(d)&&d<s)continue}e.add(l)}}}catch{}return e}function wN(r){let e=new Set;try{let{prjctDb:t}=(X(),ze(fr)),n=t.query(r,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),s=Date.now()-Hl*24*60*60*1e3;for(let o of n){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==JC)continue;let l=a.topic,u=i.rememberedAt;if(typeof l=="string"){if(typeof u=="string"){let d=Date.parse(u);if(!Number.isNaN(d)&&d<s)continue}e.add(l)}}}catch{}return e}var qC,oN,VC,iN,JC,aN,KC,Fl,cN,Hl,lN,uN,dN,zC=h(()=>{"use strict";Q();Ee();qC=sN(nN),oN="hot-file",VC="pattern-detector-auto",iN="recurring-bug",JC="pattern-detector-recurring",aN="tech-debt-growth",KC="pattern-detector-debt",Fl=7,cN=3,Hl=30,lN=2,uN=5,dN=[/^package(-lock)?\.json$/,/^bun\.lock(b)?$/,/^pnpm-lock\.yaml$/,/^yarn\.lock$/,/^CHANGELOG\.md$/,/^\.gitignore$/,/\.snap$/,/^dist\//,/^node_modules\//];c(XC,"detectAndPersistPatterns");c(pN,"detectHotFiles");c(mN,"isIgnored");c(fN,"detectRecurringBugs");c(gN,"measureTechDebt");c(hN,"collectPreviousDebtSnapshot");c(yN,"collectAlreadyMarkedHotFiles");c(wN,"collectAlreadyMarkedRecurringBugs")});import Mi from"node:fs/promises";import YC from"node:path";function bN(r=process.env){let e=(r.PRJCT_CLEANUP_AGGRESSIVENESS??"standard").toLowerCase();return kN[e==="conservative"||e==="standard"||e==="aggressive"?e:"standard"]}async function vN(r,e){let t=Date.now()-e*24*60*60*1e3,s=N.recall(r,{types:["inbox"],limit:200}).filter(i=>Date.parse(i.rememberedAt)<t);if(s.length===0)return 0;let o=0;for(let i of s)try{gt.archive(r,{entityType:"memory_entry",entityId:i.id,entityData:{type:i.type,content:i.content,tags:i.tags,rememberedAt:i.rememberedAt},summary:i.content.slice(0,80),reason:`inbox-age-out (>${e}d)`});let a=i.id.startsWith("mem_")?i.id.slice(4):null;a&&S.run(r,"UPDATE events SET type = ? WHERE id = ?","memory.archived.inbox",Number(a)),o++}catch{}return o}async function SN(r,e){if(e===null)return 0;let t=YC.join(_.getGlobalProjectPath(r),"checkpoints"),n=[];try{n=await Mi.readdir(t)}catch{return 0}let s=Date.now()-e*24*60*60*1e3,o=0;for(let i of n){if(!i.endsWith(".json"))continue;let a=YC.join(t,i);try{(await Mi.stat(a)).mtimeMs<s&&(await Mi.unlink(a),o++)}catch{}}return o}async function EN(){let{getVerifyCachePath:r}=await Promise.resolve().then(()=>(Is(),Wy)),e=r();try{let t=await Mi.stat(e);if((Date.now()-t.mtimeMs)/(1440*60*1e3)>7)return await Mi.unlink(e),!0}catch{}return!1}async function QC(r){let e=bN(),t={inboxArchived:0,archivesPruned:0,checkpointsRemoved:0,context7CacheRotated:!1};try{t.inboxArchived=await vN(r,e.inboxDays)}catch{}try{t.archivesPruned=gt.pruneOldArchives(r,e.archivesDays)}catch{}try{t.checkpointsRemoved=await SN(r,e.checkpointsDays)}catch{}try{t.context7CacheRotated=await EN()}catch{}return t}async function ZC(r,e){if(e.inboxArchived+e.archivesPruned+e.checkpointsRemoved+(e.context7CacheRotated?1:0)===0)return;let n=[e.inboxArchived>0?`${e.inboxArchived} inbox archived`:null,e.archivesPruned>0?`${e.archivesPruned} archives pruned`:null,e.checkpointsRemoved>0?`${e.checkpointsRemoved} checkpoints removed`:null,e.context7CacheRotated?"context7 cache rotated":null].filter(s=>!!s).join(", ");S.appendEvent(r,"memory.remember.system-event",{content:`Session cleanup: ${n}`,tags:{source:"session-cleanup",key:"last-cleanup"},provenance:"extracted"})}var kN,eR=h(()=>{"use strict";ge();Ee();vr();X();kN={conservative:{inboxDays:30,archivesDays:180,checkpointsDays:null},standard:{inboxDays:14,archivesDays:90,checkpointsDays:30},aggressive:{inboxDays:7,archivesDays:30,checkpointsDays:14}};c(bN,"resolveProfile");c(vN,"archiveAgedInbox");c(SN,"pruneOldCheckpoints");c(EN,"rotateContext7Cache");c(QC,"runSessionCleanup");c(ZC,"recordCleanupReport")});import TN from"node:crypto";import CN from"node:fs/promises";async function iR(r,e,t,n={}){let s;if(n.preloadedLines)s=n.preloadedLines;else{let y="";try{y=await CN.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}s=DN(y)}let o=WN(r);if(!o)return{signalsRecorded:0,signalsSkipped:0};let i=MN(s);if(!i)return{signalsRecorded:0,signalsSkipped:0};let a;try{a=HN(o,t)}catch{return{signalsRecorded:0,signalsSkipped:0}}if(a.length===0)return{signalsRecorded:0,signalsSkipped:0};let l=[];try{l=await Wb(r)}catch{l=[]}let u=new Set;try{let y=Date.now()-jN;for(let v of pc.list(o))if(!(Date.parse(v.ended_at)<=y))for(let k of v.files_touched)u.add(k)}catch{u=new Set}let d=IN(i,l,a,u);if(d.length===0)return{signalsRecorded:0,signalsSkipped:0};let p=UN(o),m=0,f=0;for(let y of d.slice(0,RN)){let v=FN(y.memId,y.excerpt).slice(0,12);if(p.has(v)){f++;continue}try{await N.remember(r,{type:"improvement-signal",content:LN(y),tags:{source:rR,kind:"skill-miss",category:"skill-miss",relates:y.memId,file:y.evidenceFile,key:v,...t?{session:t}:{}},provenance:"extracted",projectId:o}),at.penalizeSkillMiss(o,y.memId),m++}catch{f++}}return{signalsRecorded:m,signalsSkipped:f}}function IN(r,e,t,n=new Set){let s=tR(r);if(s.size===0)return[];let o=e.filter(l=>!n.has(l)),i=Ul(o),a=[];for(let l of t){let u=tR(`${l.content} ${l.fileTag}`);if(u.size===0)continue;let d=l.fileTag!==""&&o.some(k=>nR(k,l.fileTag))||[...i].some(k=>u.has(k)),p=NN(u),m=0;for(let k of u)p.has(k)||s.has(k)&&m++;if(!(d||m>=_N)||[...p].some(k=>s.has(k)))continue;let v=l.fileTag!==""&&o.some(k=>nR(k,l.fileTag))?l.fileTag:o.find(k=>[...Ul([k])].some(b=>u.has(b)))??"";a.push({miss:{memId:l.id,memType:l.type,excerpt:l.content.replace(/\s+/g," ").trim().slice(0,xN),evidenceFile:v,reason:d?"path-overlap-unused":"topic-overlap-unused"},rank:d?2:1,overlap:m})}return a.sort((l,u)=>u.rank-l.rank||u.overlap-l.overlap),a.map(l=>l.miss)}function DN(r){return Mr(r)}function MN(r){let e=[];for(let t of r){let n=t.role??t.message?.role;if(n!=="user"&&n!=="assistant")continue;let s=ON(t.content??t.message?.content);s&&e.push(s)}return e.join(`
1219
+ `)}function VO(r){let e=r.toLowerCase().replace(/\s+/g," ").trim();return MO.createHash("sha256").update(e).digest("hex")}function JO(r){try{let e=FC(r);if(!e)return new Set;let t=N.recall(e,{types:["improvement-signal"],tags:{source:NC},limit:100,dedupeByKey:!1}),n=new Set;for(let s of t){let o=s.tags.key;o&&n.add(o)}return n}catch{return new Set}}function FC(r){try{let e=tt("node:fs"),n=tt("node:path").join(r,".prjct","prjct.config.json"),s=e.readFileSync(n,"utf-8");return JSON.parse(s).projectId??null}catch{return null}}var NC,NO,OC,LO,FO,HO,HC=h(()=>{"use strict";Te();Di();NC="friction-detector",NO=5,OC=400,LO=[/^\s*no[,.!\s]/i,/^\s*nope\b/i,/^\s*así no\b/i,/^\s*espera\b/i,/^\s*stop\b/i,/^\s*wait\b/i,/^\s*cancel\b/i],FO=[/\bshould be\b/i,/\brather than\b/i,/\binstead\b/i,/\bmás bien\b/i,/\ben realidad\b/i],HO=[/\bdoesn'?t work\b/i,/\bno funciona\b/i,/\bbroken\b/i,/\bestá roto\b/i,/\bagain\b.*\bsame\b/i];c(LC,"detectFriction");c(UO,"parseJsonl");c(WO,"extractSignals");c(GO,"classify");c(BO,"textOf");c(qO,"formatSignal");c(VO,"hashSignal");c(JO,"projectMemoryHashes");c(FC,"projectIdFromPath")});import{execFile as KO}from"node:child_process";import{promisify as XO}from"node:util";function ZO(r){let e=r?.lean?.mode;if(e&&UC.includes(e))return e;let t=process.env.PRJCT_LEAN_MODE?.toLowerCase();return t&&UC.includes(t)?t:"off"}async function GC(r,e){let t={active:!1,total:0,previous:0,persisted:!1},n=e!==void 0?e:await P.readConfig(r).catch(()=>null);if(!n?.projectId||ZO(n)==="off")return t;t.active=!0;try{let s=await eN(r);if(t.total=s,s===0)return t;let o=tN(n.projectId);t.previous=o;let i=s-o;o>0&&i>=QO&&(await N.remember(r,{type:"lean-debt",content:`Lean debt growing: \`lean:\` markers rose by ${i} (now ${s}, was ${o}). Deferred simplifications are accumulating \u2014 consider a leaning pass via \`prjct lean debt\`.`,tags:{source:WC,pattern:YO,total:String(s),previous:String(o),delta:String(i)},provenance:"inferred",projectId:n.projectId}),t.persisted=!0)}catch{}return t}async function eN(r){try{let{stdout:e}=await zO("git",["grep","-cI","-e","lean:"],{cwd:r,maxBuffer:16777216}),t=0;for(let n of e.split(`
1220
+ `)){let s=n.lastIndexOf(":");if(s<=0)continue;let o=Number.parseInt(n.slice(s+1),10);Number.isFinite(o)&&(t+=o)}return t}catch(e){if(e.code===1)return 0;throw e}}function tN(r){try{let{prjctDb:e}=(X(),ze(fr)),t=e.query(r,"SELECT data FROM events WHERE type = 'memory.remember.lean-debt' ORDER BY id DESC LIMIT 50");for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}if(!s||typeof s!="object")continue;let o=s.tags;if(!o||o.source!==WC)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}var zO,WC,YO,QO,UC,BC=h(()=>{"use strict";Q();Te();zO=XO(KO),WC="lean-detector",YO="lean-debt-growth",QO=3,UC=["off","lite","full","ultra"];c(ZO,"effectiveMode");c(GC,"detectAndPersistLeanDebt");c(eN,"measureLeanMarkers");c(tN,"collectPreviousSnapshot")});import{execFile as nN}from"node:child_process";import rN from"node:path";import{promisify as sN}from"node:util";async function XC(r,e){let t={scanned:0,hotFiles:[],persisted:0,skipped:[],errors:[]},n=e!==void 0?e:await P.readConfig(r).catch(()=>null);if(!n?.projectId)return t.errors.push("no project config"),t;try{let s=await pN(r);if(t.scanned+=s.length,t.hotFiles=s,s.length>0){let o=yN(n.projectId);for(let i of s){if(o.has(i.path)){t.skipped.push({reason:"already-marked-this-window",file:i.path});continue}try{await N.remember(r,{type:"learning",content:`Hot file: \`${i.path}\` \u2014 ${i.touches} touches in the last ${Fl} days. Worth a refactor pass or a deliberate decision about why it churns this often.`,tags:{source:VC,pattern:oN,file:i.path,touches:String(i.touches),window_days:String(Fl)},provenance:"inferred"}),t.persisted+=1}catch(a){t.errors.push(`remember failed for ${i.path}: ${a.message}`)}}}}catch(s){t.errors.push(`hot-file detection failed: ${s.message}`)}try{let s=fN(n.projectId);if(s.length>0){let o=wN(n.projectId);for(let i of s){if(o.has(i.topic)){t.skipped.push({reason:"recurring-bug-already-marked",file:i.topic});continue}try{await N.remember(r,{type:"learning",content:`Recurring bug pattern: gotchas tagged \`topic:${i.topic}\` reported ${i.occurrences} times in the last ${Hl} days. Likely a real underlying issue \u2014 consider a focused investigation before patching the next instance.`,tags:{source:JC,pattern:iN,topic:i.topic,occurrences:String(i.occurrences),window_days:String(Hl)},provenance:"inferred"}),t.persisted+=1}catch(a){t.errors.push(`remember failed for recurring ${i.topic}: ${a.message}`)}}}}catch(s){t.errors.push(`recurring-bug detection failed: ${s.message}`)}try{let s=await gN(r);if(s.totalCount>0){let o=hN(n.projectId),i=s.totalCount-o;if(o>0&&i>=uN)try{await N.remember(r,{type:"learning",content:`Tech debt growing: TODO/FIXME/XXX count rose by ${i} (now ${s.totalCount}, was ${o}). Consider a focused debt-reduction pass before adding more features.`,tags:{source:KC,pattern:aN,total:String(s.totalCount),previous:String(o),delta:String(i)},provenance:"inferred"}),t.persisted+=1}catch(a){t.errors.push(`remember failed for tech-debt: ${a.message}`)}}}catch(s){t.errors.push(`tech-debt detection failed: ${s.message}`)}return t}async function pN(r){let{stdout:e}=await qC("git",["log",`--since=${Fl}.days.ago`,"--name-only","--pretty=format:","-z"],{cwd:r,maxBuffer:16777216}),t=new Map;for(let s of e.split("\0")){let o=s.trim();o&&(mN(o)||t.set(o,(t.get(o)??0)+1))}let n=[];for(let[s,o]of t)o<cN||n.push({path:s,touches:o});return n.sort((s,o)=>o.touches-s.touches),n}function mN(r){let e=rN.basename(r);for(let t of dN)if(t.test(r)||t.test(e))return!0;return!1}function fN(r){try{let{prjctDb:e}=(X(),ze(fr)),t=new Date(Date.now()-Hl*24*60*60*1e3).toISOString(),n=e.query(r,"SELECT data, timestamp FROM events WHERE type = 'memory.remember.gotcha' AND timestamp >= ? ORDER BY id DESC LIMIT 500",t),s=new Map;for(let i of n){let a;try{a=JSON.parse(i.data)}catch{continue}if(!a||typeof a!="object")continue;let l=a.tags;if(!l||l.source==="transcript-auto")continue;let u=typeof l.topic=="string"?l.topic:void 0,d=typeof l.area=="string"?l.area:void 0,p=u??d;p&&s.set(p,(s.get(p)??0)+1)}let o=[];for(let[i,a]of s)a<lN||o.push({topic:i,occurrences:a});return o.sort((i,a)=>a.occurrences-i.occurrences),o}catch{return[]}}async function gN(r){try{let{stdout:e}=await qC("git",["grep","-cE","\\b(TODO|FIXME|XXX)\\b"],{cwd:r,maxBuffer:16777216}),t=0;for(let n of e.split(`
1221
+ `)){let s=n.lastIndexOf(":");if(s<=0)continue;let o=Number.parseInt(n.slice(s+1),10);Number.isFinite(o)&&(t+=o)}return{totalCount:t}}catch(e){if(e.code===1)return{totalCount:0};throw e}}function hN(r){try{let{prjctDb:e}=(X(),ze(fr)),t=e.query(r,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 50");for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}if(!s||typeof s!="object")continue;let o=s.tags;if(!o||o.source!==KC)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}function yN(r){let e=new Set;try{let{prjctDb:t}=(X(),ze(fr)),n=t.query(r,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),s=Date.now()-Fl*24*60*60*1e3;for(let o of n){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==VC)continue;let l=a.file,u=i.rememberedAt;if(typeof l=="string"){if(typeof u=="string"){let d=Date.parse(u);if(!Number.isNaN(d)&&d<s)continue}e.add(l)}}}catch{}return e}function wN(r){let e=new Set;try{let{prjctDb:t}=(X(),ze(fr)),n=t.query(r,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),s=Date.now()-Hl*24*60*60*1e3;for(let o of n){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==JC)continue;let l=a.topic,u=i.rememberedAt;if(typeof l=="string"){if(typeof u=="string"){let d=Date.parse(u);if(!Number.isNaN(d)&&d<s)continue}e.add(l)}}}catch{}return e}var qC,oN,VC,iN,JC,aN,KC,Fl,cN,Hl,lN,uN,dN,zC=h(()=>{"use strict";Q();Te();qC=sN(nN),oN="hot-file",VC="pattern-detector-auto",iN="recurring-bug",JC="pattern-detector-recurring",aN="tech-debt-growth",KC="pattern-detector-debt",Fl=7,cN=3,Hl=30,lN=2,uN=5,dN=[/^package(-lock)?\.json$/,/^bun\.lock(b)?$/,/^pnpm-lock\.yaml$/,/^yarn\.lock$/,/^CHANGELOG\.md$/,/^\.gitignore$/,/\.snap$/,/^dist\//,/^node_modules\//];c(XC,"detectAndPersistPatterns");c(pN,"detectHotFiles");c(mN,"isIgnored");c(fN,"detectRecurringBugs");c(gN,"measureTechDebt");c(hN,"collectPreviousDebtSnapshot");c(yN,"collectAlreadyMarkedHotFiles");c(wN,"collectAlreadyMarkedRecurringBugs")});import Mi from"node:fs/promises";import YC from"node:path";function bN(r=process.env){let e=(r.PRJCT_CLEANUP_AGGRESSIVENESS??"standard").toLowerCase();return kN[e==="conservative"||e==="standard"||e==="aggressive"?e:"standard"]}async function vN(r,e){let t=Date.now()-e*24*60*60*1e3,s=N.recall(r,{types:["inbox"],limit:200}).filter(i=>Date.parse(i.rememberedAt)<t);if(s.length===0)return 0;let o=0;for(let i of s)try{gt.archive(r,{entityType:"memory_entry",entityId:i.id,entityData:{type:i.type,content:i.content,tags:i.tags,rememberedAt:i.rememberedAt},summary:i.content.slice(0,80),reason:`inbox-age-out (>${e}d)`});let a=i.id.startsWith("mem_")?i.id.slice(4):null;a&&S.run(r,"UPDATE events SET type = ? WHERE id = ?","memory.archived.inbox",Number(a)),o++}catch{}return o}async function SN(r,e){if(e===null)return 0;let t=YC.join(_.getGlobalProjectPath(r),"checkpoints"),n=[];try{n=await Mi.readdir(t)}catch{return 0}let s=Date.now()-e*24*60*60*1e3,o=0;for(let i of n){if(!i.endsWith(".json"))continue;let a=YC.join(t,i);try{(await Mi.stat(a)).mtimeMs<s&&(await Mi.unlink(a),o++)}catch{}}return o}async function EN(){let{getVerifyCachePath:r}=await Promise.resolve().then(()=>(Is(),Wy)),e=r();try{let t=await Mi.stat(e);if((Date.now()-t.mtimeMs)/(1440*60*1e3)>7)return await Mi.unlink(e),!0}catch{}return!1}async function QC(r){let e=bN(),t={inboxArchived:0,archivesPruned:0,checkpointsRemoved:0,context7CacheRotated:!1};try{t.inboxArchived=await vN(r,e.inboxDays)}catch{}try{t.archivesPruned=gt.pruneOldArchives(r,e.archivesDays)}catch{}try{t.checkpointsRemoved=await SN(r,e.checkpointsDays)}catch{}try{t.context7CacheRotated=await EN()}catch{}return t}async function ZC(r,e){if(e.inboxArchived+e.archivesPruned+e.checkpointsRemoved+(e.context7CacheRotated?1:0)===0)return;let n=[e.inboxArchived>0?`${e.inboxArchived} inbox archived`:null,e.archivesPruned>0?`${e.archivesPruned} archives pruned`:null,e.checkpointsRemoved>0?`${e.checkpointsRemoved} checkpoints removed`:null,e.context7CacheRotated?"context7 cache rotated":null].filter(s=>!!s).join(", ");S.appendEvent(r,"memory.remember.system-event",{content:`Session cleanup: ${n}`,tags:{source:"session-cleanup",key:"last-cleanup"},provenance:"extracted"})}var kN,eR=h(()=>{"use strict";ge();Te();vr();X();kN={conservative:{inboxDays:30,archivesDays:180,checkpointsDays:null},standard:{inboxDays:14,archivesDays:90,checkpointsDays:30},aggressive:{inboxDays:7,archivesDays:30,checkpointsDays:14}};c(bN,"resolveProfile");c(vN,"archiveAgedInbox");c(SN,"pruneOldCheckpoints");c(EN,"rotateContext7Cache");c(QC,"runSessionCleanup");c(ZC,"recordCleanupReport")});import TN from"node:crypto";import CN from"node:fs/promises";async function iR(r,e,t,n={}){let s;if(n.preloadedLines)s=n.preloadedLines;else{let y="";try{y=await CN.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}s=DN(y)}let o=WN(r);if(!o)return{signalsRecorded:0,signalsSkipped:0};let i=MN(s);if(!i)return{signalsRecorded:0,signalsSkipped:0};let a;try{a=HN(o,t)}catch{return{signalsRecorded:0,signalsSkipped:0}}if(a.length===0)return{signalsRecorded:0,signalsSkipped:0};let l=[];try{l=await Wb(r)}catch{l=[]}let u=new Set;try{let y=Date.now()-jN;for(let v of pc.list(o))if(!(Date.parse(v.ended_at)<=y))for(let k of v.files_touched)u.add(k)}catch{u=new Set}let d=IN(i,l,a,u);if(d.length===0)return{signalsRecorded:0,signalsSkipped:0};let p=UN(o),m=0,f=0;for(let y of d.slice(0,RN)){let v=FN(y.memId,y.excerpt).slice(0,12);if(p.has(v)){f++;continue}try{await N.remember(r,{type:"improvement-signal",content:LN(y),tags:{source:rR,kind:"skill-miss",category:"skill-miss",relates:y.memId,file:y.evidenceFile,key:v,...t?{session:t}:{}},provenance:"extracted",projectId:o}),at.penalizeSkillMiss(o,y.memId),m++}catch{f++}}return{signalsRecorded:m,signalsSkipped:f}}function IN(r,e,t,n=new Set){let s=tR(r);if(s.size===0)return[];let o=e.filter(l=>!n.has(l)),i=Ul(o),a=[];for(let l of t){let u=tR(`${l.content} ${l.fileTag}`);if(u.size===0)continue;let d=l.fileTag!==""&&o.some(k=>nR(k,l.fileTag))||[...i].some(k=>u.has(k)),p=NN(u),m=0;for(let k of u)p.has(k)||s.has(k)&&m++;if(!(d||m>=_N)||[...p].some(k=>s.has(k)))continue;let v=l.fileTag!==""&&o.some(k=>nR(k,l.fileTag))?l.fileTag:o.find(k=>[...Ul([k])].some(b=>u.has(b)))??"";a.push({miss:{memId:l.id,memType:l.type,excerpt:l.content.replace(/\s+/g," ").trim().slice(0,xN),evidenceFile:v,reason:d?"path-overlap-unused":"topic-overlap-unused"},rank:d?2:1,overlap:m})}return a.sort((l,u)=>u.rank-l.rank||u.overlap-l.overlap),a.map(l=>l.miss)}function DN(r){return Mr(r)}function MN(r){let e=[];for(let t of r){let n=t.role??t.message?.role;if(n!=="user"&&n!=="assistant")continue;let s=ON(t.content??t.message?.content);s&&e.push(s)}return e.join(`
1222
1222
  `).toLowerCase()}function ON(r){return typeof r=="string"?r:Array.isArray(r)?r.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(`
1223
1223
  `).trim():""}function tR(r){let e=new Set;for(let t of r.toLowerCase().split(/[^a-z0-9]+/))t.length<sR||oR.has(t)||e.add(t);return e}function NN(r){let e=[...r].filter(n=>n.length>=$N);if(e.length>0)return new Set(e);let t="";for(let n of r)(n.length>t.length||n.length===t.length&&n<t)&&(t=n);return t?new Set([t]):new Set}function Ul(r){let e=new Set;for(let t of r)for(let n of t.split("/")){let s=n.replace(/\.[a-z0-9]+$/i,"").toLowerCase();s.length>=sR&&!oR.has(s)&&e.add(s)}return e}function nR(r,e){let t=Ul([r]);for(let n of Ul([e]))if(t.has(n))return!0;return!1}function LN(r){let e=r.evidenceFile!==""?`touched \`${r.evidenceFile}\``:"worked the same area";return[`[skill-miss] Unused project knowledge (${r.memType}, ${r.memId}): "${r.excerpt}"`,`This session ${e} but never referenced it. Apply it, or supersede it via: prjct remember decision "<resolution>" --tags resolves:skill-miss,relates:${r.memId}`].join(`
1224
- `)}function FN(r,e){let t=`${r}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return TN.createHash("sha256").update(t).digest("hex")}function HN(r,e){let t=N.recall(r,{types:[...PN],limit:120}),n=Date.now()-AN,s=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>n||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 UN(r){try{let e=N.recall(r,{types:["improvement-signal"],tags:{source:rR},limit:100,dedupeByKey:!1}),t=new Set;for(let n of e)n.tags.key&&t.add(n.tags.key);return t}catch{return new Set}}function WN(r){try{let e=tt("node:fs"),n=tt("node:path").join(r,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(n,"utf-8")).projectId??null}catch{return null}}var rR,RN,xN,PN,AN,jN,_N,sR,$N,oR,aR=h(()=>{"use strict";Ee();bc();mc();Di();Qn();rR="skill-miss-detector",RN=3,xN=280,PN=["decision","gotcha","anti-pattern"],AN=5400*1e3,jN=360*60*1e3,_N=2,sR=5,$N=8,oR=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(iR,"detectSkillMisses");c(IN,"analyze");c(DN,"parseJsonl");c(MN,"transcriptTextOf");c(ON,"textOf");c(tR,"tokenize");c(NN,"signatureOf");c(Ul,"fileStems");c(nR,"sharesStem");c(LN,"formatSkillMiss");c(FN,"hashKey");c(HN,"recallCandidates");c(UN,"existingSkillMissKeys");c(WN,"projectIdFromPath")});import GN from"node:crypto";import BN from"node:fs/promises";async function pR(r,e,t,n={}){let s={scanned:0,ingested:0,skipped:[],errors:[]},o=n.preloadedConfig!==void 0?n.preloadedConfig:await P.readConfig(r).catch(()=>null);if(!o?.projectId)return s.errors.push("no project config"),s;let i;if(n.preloadedLines)i=n.preloadedLines;else{let p;try{p=await BN.readFile(e,"utf-8")}catch(m){return s.errors.push(`transcript read failed: ${m.message}`),s}i=Mr(p)}let a=JN(i);if(s.scanned=a.length,a.length===0)return s;let l=zN(a);if(l.length===0)return s;let u=ZN(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 N.remember(r,{type:p.type,content:p.content,tags:{source:uR,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 JN(r){let e=[];for(let t of r){let n=KN(t);if(n!=="assistant")continue;let s=XN(t);!s||s.length<dR||e.push({role:n,text:s})}return e}function KN(r){let e=r.role;if(typeof e=="string")return lR(e);let t=r.message;if(t&&typeof t=="object"&&"role"in t){let s=t.role;if(typeof s=="string")return lR(s)}let n=r.type;return n==="assistant"||n==="user"||n==="system"?n:null}function lR(r){let e=r.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}function XN(r){let e=r.content;if(e===void 0&&r.message&&typeof r.message=="object"&&(e=r.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let s=n;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(`
1225
- `).trim()}return""}function zN(r){let e=[],t=new Set;for(let n of r){let s=YN(n.text);for(let o of s){if(e.length>=qN)return e;if(o.length<dR)continue;let i=o.toLowerCase(),a=VN.find(d=>i.includes(d.phrase));if(!a)continue;let l=o.length>cR?`${o.slice(0,cR)}\u2026`:o,u=QN(l);t.has(u)||(t.add(u),e.push({type:a.type,content:l,hash:u,matchedPhrase:a.phrase}))}}return e}function YN(r){return r.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}function QN(r){return GN.createHash("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}function ZN(r){let e=new Set;try{let{prjctDb:t}=(X(),ze(fr)),{REMEMBER_EVENT_RANGE:n}=(kr(),ze(tk)),s=t.query(r,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...n);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!==uR)continue;let l=a.hash;typeof l=="string"&&e.add(l)}}catch{}return e}var uR,dR,cR,qN,VN,mR=h(()=>{"use strict";Q();Ee();Di();uR="transcript-auto",dR=80,cR=1500,qN=12,VN=[{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(pR,"ingestTranscript");c(JN,"projectMessages");c(KN,"inferRole");c(lR,"normalizeRole");c(XN,"extractText");c(zN,"extractCandidates");c(YN,"splitParagraphs");c(QN,"hashContent");c(ZN,"collectExistingAutoHashes")});var fR={};A(fR,{runStopHook:()=>ig});import eL from"node:fs/promises";function ig(r=process.cwd(),e){return it({event:"Stop",projectPath:r,afterEmit:c(async(t,n)=>{let s=await P.readConfig(n).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await eL.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Mr(i))}try{await wp(n)}catch{}try{await bp(n,s)}catch{}if(t.transcript_path)try{await pR(n,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await XC(n,s)}catch{}try{await GC(n,s)}catch{}try{let i=await QC(s.projectId);await ZC(s.projectId,i)}catch{}if(t.transcript_path)try{if((await LC(n,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:a}=await Promise.resolve().then(()=>(jl(),EC)),u=(await a(s.projectId,n)).current?.id;u&&at.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await iR(n,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await Ii.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(bf(),kf));await i(n,s)}catch{}await mi(n,s.projectId).catch(()=>{})},"afterEmit")},e)}var ag=h(()=>{"use strict";Q();Ll();HC();BC();zC();eR();aR();Di();mR();Qn();$n();ac();Kn();c(ig,"runStopHook")});var gR={};A(gR,{runSubagentStartHook:()=>cg});function cg(r=process.cwd(),e){return it({event:"SubagentStart",projectPath:r,build:c((t,n)=>If(n),"build")},e)}var lg=h(()=>{"use strict";Kn();xi();c(cg,"runSubagentStartHook")});var yR={};A(yR,{HOOK_RUNNERS:()=>hR,getHookRunner:()=>ug});function ug(r){return r?hR[r]:void 0}var hR,dg=h(()=>{"use strict";Of();Lf();Hf();Wf();Bf();xi();ag();lg();hR={"session-start":Df,prompt:Gf,"pre-commit":Ff,"pre-edit":Uf,"post-edit":Nf,stop:ig,"subagent-start":cg,"cwd-changed":Mf};c(ug,"getHookRunner")});var Oi,yn,tL,wR,pg,Wl=h(()=>{"use strict";Oi={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}},yn=[{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"],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 falls back to current work"]},{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 Claude Code hooks (~/.claude/settings.json merge-safe)",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Writes 7 passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Remove with `prjct claude uninstall`"]},{name:"help",group:"core",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 an analysis JSON blob produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <jsonPath>"},params:"<jsonPathOrInline>",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:"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(([r,e])=>({name:r,group:"setup",description:e,usage:{claude:null,terminal:`prjct ${r}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],tL={"-h":"help","--help":"help","-v":"version","--version":"version"},wR=new Set(yn.filter(r=>r.routingMode==="cold-only").map(r=>r.name)),pg=new Set([...yn.filter(r=>r.routingMode==="bin-only").map(r=>r.name),...Object.entries(tL).filter(([,r])=>yn.some(e=>e.name===r&&e.routingMode==="bin-only")).map(([r])=>r)])});var kR={};A(kR,{BIN_COMMANDS_SET:()=>rL,REGISTERED_VERBS_SET:()=>nL,SHIM_SKIP_SET:()=>sL});var nL,rL,sL,bR=h(()=>{"use strict";Wl();nL=new Set(yn.filter(r=>r.routing).map(r=>r.name)),rL=pg,sL=new Set([...pg,...wR])});var ER={};A(ER,{sessionTracker:()=>Ni});var vR,SR,mg,Ni,fg=h(()=>{"use strict";fa();X();Bo();le();vR=50,SR=200,mg=class{static{c(this,"SessionTracker")}async read(e){try{return j.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){j.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Ds(e.lastActivity,t)}async touch(e){let t=await this.read(e),n=T();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=T();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>vR&&(s.current.commands=s.current.commands.slice(-vR)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=T();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>SR&&(s.current.files=s.current.files.slice(-SR)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,l=t.config.idleTimeoutMs,u=Math.max(0,l-a),d=n.commands.map(f=>f.command),p=new Set(n.files.filter(f=>f.operation==="read").map(f=>f.path)).size,m=new Set(n.files.filter(f=>f.operation==="write").map(f=>f.path)).size;return{active:!0,id:n.id,duration:Vo(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Vo(u),commandCount:n.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}},Ni=new mg});var CR={};A(CR,{default:()=>Li,performanceTracker:()=>TR});var iL,gg,TR,Li,hg=h(()=>{"use strict";X();iL=BigInt(300*1e9),gg=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 n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,n]of this.marks)e-n>iL&&this.marks.delete(t)}recordTiming(e,t,n,s){S.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)S.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}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 n=t.toISOString();return S.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(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}},TR=new gg,Li=TR});function RR(r){let e=r.trim();for(let{type:t,patterns:n}of aL){let s=e.match(n);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 Gl(r){let e=r.trim();if(e.startsWith('"')){let n=e.indexOf('"',1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}if(e.startsWith("'")){let n=e.indexOf("'",1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function xR(r,e){let t=e.toLowerCase();return r.filter(n=>n.action.toLowerCase().includes(t)||(n.description?.toLowerCase().includes(t)??!1)||n.command.toLowerCase().includes(t)||String(n.id)===t)}var aL,yg=h(()=>{"use strict";aL=[{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(RR,"detectIntent");c(Gl,"parseAction");c(xR,"searchRules")});var Or,wg=h(()=>{"use strict";Or={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function Bl(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var kg,PR,bg=h(()=>{"use strict";kg=["task","done","ship","sync"],PR=["before","after"];c(Bl,"newRuleDefaults")});async function jR(r,e,t){let[n,s]=Gl(r);if(!n||!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||!PR.includes(i))return L('Position must be "before" or "after"',t);let l=gl(e,a,t);if(!l.ok)return l.result;let u=oe.addRule(e,{type:"hook",command:l.value.name,position:i,action:n,timeoutMs:Or.HOOK_DEFAULT_MS,...Bl()});return t.md?console.log(O(je("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${n}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):Ot(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${n}`),{success:!0,ruleId:u}}async function _R(r,e,t){let n=r.trim().split(/\s+/)[0]?.toLowerCase(),s=gl(e,n,t);if(!s.ok)return s.result;let o=r.slice(r.indexOf(s.value.name)+s.value.name.length).trim(),[i]=Gl(o);if(!i)return L('Usage: prjct workflow gate <command> "shell command"',t);let a=oe.addRule(e,{type:"gate",command:s.value.name,position:"before",action:i,timeoutMs:Or.GATE_DEFAULT_MS,...Bl()});return t.md?console.log(O(je("Gate Added",`#${a} [gate] before ${s.value.name} \u2192 \`${i}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${a} --md`}]))):Ot(`gate #${a} added: before ${s.value.name} \u2192 ${i}`),{success:!0,ruleId:a}}async function $R(r,e,t){let n=r.trim().split(/\s+/)[0]?.toLowerCase(),s=gl(e,n,t);if(!s.ok)return s.result;let o=r.slice(r.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]=Gl(l);if(!u)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=oe.addRule(e,{type:"instruction",command:s.value.name,position:a,action:u,timeoutMs:Or.INSTRUCTION_MS,...Bl()});return t.md?console.log(O(je("Instruction Added",`#${d} [instruction] ${a} ${s.value.name} \u2192 \`${u}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):Ot(`instruction #${d} added: ${a} ${s.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function IR(r,e,t){let n=parseInt(r.trim(),10);return Number.isNaN(n)?L("Usage: prjct workflow rm <rule-id>",t):oe.removeRule(e,n)?(t.md?console.log(O(je("Rule Removed",`Removed rule #${n}`))):Ot(`removed rule #${n}`),{success:!0}):L(`Rule #${n} not found`,t)}async function DR(r,e){let t=oe.resetRules(r),n=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(O(je("Rules Reset",n))):Ot(`reset: ${n.toLowerCase()}`),{success:!0,count:t}}async function MR(r,e,t){let n=r.trim(),s=parseInt(n,10);if(!Number.isNaN(s)){let d=oe.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}`):pn(p),{success:!0,message:p}}return oe.updateRule(e,s,{enabled:!1}),t.md?console.log(O(je("Rule Disabled",`#${s} [${d.type}] ${d.action}`),qe([{label:"Re-enable this rule",command:`prjct workflow enable ${s} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):Ot(`disabled rule #${s}: ${d.action}`),{success:!0,ruleId:s}}let o=oe.getAllRules(e),i=xR(o,n);if(i.length===0)return L(`No rules matching "${n}"`,t);if(i.length===1){let d=i[0];return oe.updateRule(e,d.id,{enabled:!1}),t.md?console.log(O(je("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):Ot(`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(O(z("Multiple matches",`${i.length} rules match "${n}"`),Me(d),qe(a.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{pn(`${i.length} rules match "${n}" \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 OR=h(()=>{"use strict";Zn();he();dt();wg();Qt();yg();bg();c(jR,"workflowAdd");c(_R,"workflowGate");c($R,"workflowInstruction");c(IR,"workflowRm");c(DR,"workflowReset");c(MR,"workflowDisable")});function NR(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),n=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(R=>` ${R.enabled?y:"o"} #${R.id} ${R.action}`),k=[m,...v],C=Math.max(...k.map(R=>R.length))+2;u.push(`+${"-".repeat(C)}+`);for(let R of k)u.push(`| ${R.padEnd(C-1)}|`);u.push(`+${"-".repeat(C)}+`)},"drawBox"),p=c(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),n.length>0&&(d("INSTRUCTIONS (before)",n,"\u{1F4CB}"),p(u)),s.length>0&&(d("HOOKS (before)",s,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1224
+ `)}function FN(r,e){let t=`${r}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return TN.createHash("sha256").update(t).digest("hex")}function HN(r,e){let t=N.recall(r,{types:[...PN],limit:120}),n=Date.now()-AN,s=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>n||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 UN(r){try{let e=N.recall(r,{types:["improvement-signal"],tags:{source:rR},limit:100,dedupeByKey:!1}),t=new Set;for(let n of e)n.tags.key&&t.add(n.tags.key);return t}catch{return new Set}}function WN(r){try{let e=tt("node:fs"),n=tt("node:path").join(r,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(n,"utf-8")).projectId??null}catch{return null}}var rR,RN,xN,PN,AN,jN,_N,sR,$N,oR,aR=h(()=>{"use strict";Te();bc();mc();Di();Qn();rR="skill-miss-detector",RN=3,xN=280,PN=["decision","gotcha","anti-pattern"],AN=5400*1e3,jN=360*60*1e3,_N=2,sR=5,$N=8,oR=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(iR,"detectSkillMisses");c(IN,"analyze");c(DN,"parseJsonl");c(MN,"transcriptTextOf");c(ON,"textOf");c(tR,"tokenize");c(NN,"signatureOf");c(Ul,"fileStems");c(nR,"sharesStem");c(LN,"formatSkillMiss");c(FN,"hashKey");c(HN,"recallCandidates");c(UN,"existingSkillMissKeys");c(WN,"projectIdFromPath")});import GN from"node:crypto";import BN from"node:fs/promises";async function pR(r,e,t,n={}){let s={scanned:0,ingested:0,skipped:[],errors:[]},o=n.preloadedConfig!==void 0?n.preloadedConfig:await P.readConfig(r).catch(()=>null);if(!o?.projectId)return s.errors.push("no project config"),s;let i;if(n.preloadedLines)i=n.preloadedLines;else{let p;try{p=await BN.readFile(e,"utf-8")}catch(m){return s.errors.push(`transcript read failed: ${m.message}`),s}i=Mr(p)}let a=JN(i);if(s.scanned=a.length,a.length===0)return s;let l=zN(a);if(l.length===0)return s;let u=ZN(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 N.remember(r,{type:p.type,content:p.content,tags:{source:uR,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 JN(r){let e=[];for(let t of r){let n=KN(t);if(n!=="assistant")continue;let s=XN(t);!s||s.length<dR||e.push({role:n,text:s})}return e}function KN(r){let e=r.role;if(typeof e=="string")return lR(e);let t=r.message;if(t&&typeof t=="object"&&"role"in t){let s=t.role;if(typeof s=="string")return lR(s)}let n=r.type;return n==="assistant"||n==="user"||n==="system"?n:null}function lR(r){let e=r.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}function XN(r){let e=r.content;if(e===void 0&&r.message&&typeof r.message=="object"&&(e=r.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let s=n;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(`
1225
+ `).trim()}return""}function zN(r){let e=[],t=new Set;for(let n of r){let s=YN(n.text);for(let o of s){if(e.length>=qN)return e;if(o.length<dR)continue;let i=o.toLowerCase(),a=VN.find(d=>i.includes(d.phrase));if(!a)continue;let l=o.length>cR?`${o.slice(0,cR)}\u2026`:o,u=QN(l);t.has(u)||(t.add(u),e.push({type:a.type,content:l,hash:u,matchedPhrase:a.phrase}))}}return e}function YN(r){return r.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}function QN(r){return GN.createHash("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}function ZN(r){let e=new Set;try{let{prjctDb:t}=(X(),ze(fr)),{REMEMBER_EVENT_RANGE:n}=(kr(),ze(tk)),s=t.query(r,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...n);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!==uR)continue;let l=a.hash;typeof l=="string"&&e.add(l)}}catch{}return e}var uR,dR,cR,qN,VN,mR=h(()=>{"use strict";Q();Te();Di();uR="transcript-auto",dR=80,cR=1500,qN=12,VN=[{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(pR,"ingestTranscript");c(JN,"projectMessages");c(KN,"inferRole");c(lR,"normalizeRole");c(XN,"extractText");c(zN,"extractCandidates");c(YN,"splitParagraphs");c(QN,"hashContent");c(ZN,"collectExistingAutoHashes")});var fR={};A(fR,{runStopHook:()=>ig});import eL from"node:fs/promises";function ig(r=process.cwd(),e){return it({event:"Stop",projectPath:r,afterEmit:c(async(t,n)=>{let s=await P.readConfig(n).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await eL.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Mr(i))}try{await wp(n)}catch{}try{await bp(n,s)}catch{}if(t.transcript_path)try{await pR(n,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await XC(n,s)}catch{}try{await GC(n,s)}catch{}try{let i=await QC(s.projectId);await ZC(s.projectId,i)}catch{}if(t.transcript_path)try{if((await LC(n,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:a}=await Promise.resolve().then(()=>(jl(),EC)),u=(await a(s.projectId,n)).current?.id;u&&at.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await iR(n,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await Ii.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(bf(),kf));await i(n,s)}catch{}await mi(n,s.projectId).catch(()=>{})},"afterEmit")},e)}var ag=h(()=>{"use strict";Q();Ll();HC();BC();zC();eR();aR();Di();mR();Qn();$n();ac();Kn();c(ig,"runStopHook")});var gR={};A(gR,{runSubagentStartHook:()=>cg});function cg(r=process.cwd(),e){return it({event:"SubagentStart",projectPath:r,build:c((t,n)=>If(n),"build")},e)}var lg=h(()=>{"use strict";Kn();xi();c(cg,"runSubagentStartHook")});var yR={};A(yR,{HOOK_RUNNERS:()=>hR,getHookRunner:()=>ug});function ug(r){return r?hR[r]:void 0}var hR,dg=h(()=>{"use strict";Of();Lf();Hf();Wf();Bf();xi();ag();lg();hR={"session-start":Df,prompt:Gf,"pre-commit":Ff,"pre-edit":Uf,"post-edit":Nf,stop:ig,"subagent-start":cg,"cwd-changed":Mf};c(ug,"getHookRunner")});var Oi,yn,tL,wR,pg,Wl=h(()=>{"use strict";Oi={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}},yn=[{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"],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 falls back to current work"]},{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 Claude Code hooks (~/.claude/settings.json merge-safe)",usage:{claude:"/p:install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Writes 7 passive hooks: SessionStart, UserPromptSubmit, \u2026","Idempotent; existing non-prjct hooks stay intact","Remove with `prjct claude uninstall`"]},{name:"help",group:"core",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 an analysis JSON blob produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <jsonPath>"},params:"<jsonPathOrInline>",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:"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(([r,e])=>({name:r,group:"setup",description:e,usage:{claude:null,terminal:`prjct ${r}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],tL={"-h":"help","--help":"help","-v":"version","--version":"version"},wR=new Set(yn.filter(r=>r.routingMode==="cold-only").map(r=>r.name)),pg=new Set([...yn.filter(r=>r.routingMode==="bin-only").map(r=>r.name),...Object.entries(tL).filter(([,r])=>yn.some(e=>e.name===r&&e.routingMode==="bin-only")).map(([r])=>r)])});var kR={};A(kR,{BIN_COMMANDS_SET:()=>rL,REGISTERED_VERBS_SET:()=>nL,SHIM_SKIP_SET:()=>sL});var nL,rL,sL,bR=h(()=>{"use strict";Wl();nL=new Set(yn.filter(r=>r.routing).map(r=>r.name)),rL=pg,sL=new Set([...pg,...wR])});var ER={};A(ER,{sessionTracker:()=>Ni});var vR,SR,mg,Ni,fg=h(()=>{"use strict";fa();X();Bo();le();vR=50,SR=200,mg=class{static{c(this,"SessionTracker")}async read(e){try{return j.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){j.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return Ds(e.lastActivity,t)}async touch(e){let t=await this.read(e),n=T();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=n,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:n,lastActivity:n,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,n){let s=await this.read(e);if(!s.current)return;let o=T();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:n}),s.current.commands.length>vR&&(s.current.commands=s.current.commands.slice(-vR)),await this.write(e,s)}async trackFile(e,t,n){let s=await this.read(e);if(!s.current)return;let o=T();s.current.lastActivity=o,s.current.files.push({path:t,operation:n,timestamp:o}),s.current.files.length>SR&&(s.current.files=s.current.files.slice(-SR)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let n=t.current,s=Date.now(),o=new Date(n.createdAt).getTime(),i=new Date(n.lastActivity).getTime(),a=s-i,l=t.config.idleTimeoutMs,u=Math.max(0,l-a),d=n.commands.map(f=>f.command),p=new Set(n.files.filter(f=>f.operation==="read").map(f=>f.path)).size,m=new Set(n.files.filter(f=>f.operation==="write").map(f=>f.path)).size;return{active:!0,id:n.id,duration:Vo(s-o),idleSince:n.lastActivity,idleMs:a,expiresIn:Vo(u),commandCount:n.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}},Ni=new mg});var CR={};A(CR,{default:()=>Li,performanceTracker:()=>TR});var iL,gg,TR,Li,hg=h(()=>{"use strict";X();iL=BigInt(300*1e9),gg=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 n=process.hrtime.bigint();return this.marks.delete(e),Number(n-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,n]of this.marks)e-n>iL&&this.marks.delete(t)}recordTiming(e,t,n,s){S.appendEvent(e,`perf.${t}`,{metric:t,value:Math.round(n*100)/100,unit:"ms",context:s})}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let n=this.snapshotMemory(),s=[{metric:"heap_used",value:n.heapUsed,unit:"bytes"},{metric:"heap_total",value:n.heapTotal,unit:"bytes"},{metric:"rss",value:n.rss,unit:"bytes"},{metric:"external_memory",value:n.external,unit:"bytes"}];for(let o of s)S.appendEvent(e,`perf.${o.metric}`,{metric:o.metric,value:o.value,unit:o.unit,context:t});return n}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 n=t.toISOString();return S.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",n).map(o=>({...JSON.parse(o.data),timestamp:o.timestamp}))}getReport(e,t=7){let n=new Date;n.setDate(n.getDate()-t),n.setHours(0,0,0,0);let s=this.getMetrics(e,n),o={period:`${t}d`},i=s.filter(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}},TR=new gg,Li=TR});function RR(r){let e=r.trim();for(let{type:t,patterns:n}of aL){let s=e.match(n);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 Gl(r){let e=r.trim();if(e.startsWith('"')){let n=e.indexOf('"',1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}if(e.startsWith("'")){let n=e.indexOf("'",1);return n===-1?[e.slice(1),""]:[e.slice(1,n),e.slice(n+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function xR(r,e){let t=e.toLowerCase();return r.filter(n=>n.action.toLowerCase().includes(t)||(n.description?.toLowerCase().includes(t)??!1)||n.command.toLowerCase().includes(t)||String(n.id)===t)}var aL,yg=h(()=>{"use strict";aL=[{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(RR,"detectIntent");c(Gl,"parseAction");c(xR,"searchRules")});var Or,wg=h(()=>{"use strict";Or={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function Bl(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var kg,PR,bg=h(()=>{"use strict";kg=["task","done","ship","sync"],PR=["before","after"];c(Bl,"newRuleDefaults")});async function jR(r,e,t){let[n,s]=Gl(r);if(!n||!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||!PR.includes(i))return L('Position must be "before" or "after"',t);let l=gl(e,a,t);if(!l.ok)return l.result;let u=oe.addRule(e,{type:"hook",command:l.value.name,position:i,action:n,timeoutMs:Or.HOOK_DEFAULT_MS,...Bl()});return t.md?console.log(O(je("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${n}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):Ot(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${n}`),{success:!0,ruleId:u}}async function _R(r,e,t){let n=r.trim().split(/\s+/)[0]?.toLowerCase(),s=gl(e,n,t);if(!s.ok)return s.result;let o=r.slice(r.indexOf(s.value.name)+s.value.name.length).trim(),[i]=Gl(o);if(!i)return L('Usage: prjct workflow gate <command> "shell command"',t);let a=oe.addRule(e,{type:"gate",command:s.value.name,position:"before",action:i,timeoutMs:Or.GATE_DEFAULT_MS,...Bl()});return t.md?console.log(O(je("Gate Added",`#${a} [gate] before ${s.value.name} \u2192 \`${i}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${a} --md`}]))):Ot(`gate #${a} added: before ${s.value.name} \u2192 ${i}`),{success:!0,ruleId:a}}async function $R(r,e,t){let n=r.trim().split(/\s+/)[0]?.toLowerCase(),s=gl(e,n,t);if(!s.ok)return s.result;let o=r.slice(r.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]=Gl(l);if(!u)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=oe.addRule(e,{type:"instruction",command:s.value.name,position:a,action:u,timeoutMs:Or.INSTRUCTION_MS,...Bl()});return t.md?console.log(O(je("Instruction Added",`#${d} [instruction] ${a} ${s.value.name} \u2192 \`${u}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):Ot(`instruction #${d} added: ${a} ${s.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function IR(r,e,t){let n=parseInt(r.trim(),10);return Number.isNaN(n)?L("Usage: prjct workflow rm <rule-id>",t):oe.removeRule(e,n)?(t.md?console.log(O(je("Rule Removed",`Removed rule #${n}`))):Ot(`removed rule #${n}`),{success:!0}):L(`Rule #${n} not found`,t)}async function DR(r,e){let t=oe.resetRules(r),n=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(O(je("Rules Reset",n))):Ot(`reset: ${n.toLowerCase()}`),{success:!0,count:t}}async function MR(r,e,t){let n=r.trim(),s=parseInt(n,10);if(!Number.isNaN(s)){let d=oe.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}`):pn(p),{success:!0,message:p}}return oe.updateRule(e,s,{enabled:!1}),t.md?console.log(O(je("Rule Disabled",`#${s} [${d.type}] ${d.action}`),qe([{label:"Re-enable this rule",command:`prjct workflow enable ${s} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):Ot(`disabled rule #${s}: ${d.action}`),{success:!0,ruleId:s}}let o=oe.getAllRules(e),i=xR(o,n);if(i.length===0)return L(`No rules matching "${n}"`,t);if(i.length===1){let d=i[0];return oe.updateRule(e,d.id,{enabled:!1}),t.md?console.log(O(je("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):Ot(`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(O(z("Multiple matches",`${i.length} rules match "${n}"`),Me(d),qe(a.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{pn(`${i.length} rules match "${n}" \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 OR=h(()=>{"use strict";Zn();he();dt();wg();Qt();yg();bg();c(jR,"workflowAdd");c(_R,"workflowGate");c($R,"workflowInstruction");c(IR,"workflowRm");c(DR,"workflowReset");c(MR,"workflowDisable")});function NR(r,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),n=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(R=>` ${R.enabled?y:"o"} #${R.id} ${R.action}`),k=[m,...v],C=Math.max(...k.map(R=>R.length))+2;u.push(`+${"-".repeat(C)}+`);for(let R of k)u.push(`| ${R.padEnd(C-1)}|`);u.push(`+${"-".repeat(C)}+`)},"drawBox"),p=c(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),n.length>0&&(d("INSTRUCTIONS (before)",n,"\u{1F4CB}"),p(u)),s.length>0&&(d("HOOKS (before)",s,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${r.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),a.length>0&&(p(u),d("HOOKS (after)",a,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1226
1226
  `)}var LR=h(()=>{"use strict";c(NR,"buildFlowDiagram")});async function FR(r){return r.md?console.log(O(z("Workflow Help","Manage hooks, gates, and steps for your workflow"),z("Commands",Me(["`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)",Me(['`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 ql(r,e,t){let n=r!==null&&kg.includes(r),s=n?oe.getRulesForCommand(e,r):oe.getAllRules(e);if(s.length===0)return t.md?console.log(O(z("Workflow Rules","No rules configured"),qe([{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'}]))):(pn("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=n?[r]:kg,i=[];for(let u of o){let d=s.filter(p=>p.command===u);d.length!==0&&i.push(NR(u,d))}let a=n?`Workflow: ${r}`:"Workflow Rules",l=`${s.length} rule${s.length!==1?"s":""}`;console.log(O(z(a,l),i.length>0?ZE(i.join(`
1227
1227
 
1228
1228
  `),""):null,qe([{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=n?`WORKFLOW RULES: ${r.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 HR=h(()=>{"use strict";Zn();he();dt();LR();bg();c(FR,"workflowHelp");c(ql,"workflowShow")});import vg from"node:fs/promises";import cL from"node:os";import Vl from"node:path";var Sg,Eg,UR=h(()=>{"use strict";H();J();Sg=class{static{c(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Vl.join(cL.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await vg.mkdir(this.commandsPath,{recursive:!0});let n=Vl.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await vg.writeFile(n,s,"utf-8"),{success:!0,path:n}}catch(n){return{success:!1,error:w(n)}}}async deleteWorkflowTemplate(e){try{let t=Vl.join(this.commandsPath,`${e}.md`);return await vg.unlink(t),{success:!0}}catch(t){return W(t)?{success:!0}:{success:!1,error:w(t)}}}async templateExists(e){let t=Vl.join(this.commandsPath,`${e}.md`);return E(t)}buildTemplateContent(e,t){return`---
@@ -1266,33 +1266,33 @@ Run with: p. ${o}`)),{success:!0,workflowId:a,name:o,templatePath:l.path}):(yt.d
1266
1266
  `))),s.length>0&&i.push(z("Custom Workflows",s.map(o).join(`
1267
1267
  `))),console.log(O(...i,qe([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(Ot(`${t.length} workflow${t.length!==1?"s":""}`),n.length>0){console.log(`
1268
1268
  Built-in:`);for(let i of n)console.log(` ${i.name} \u2014 ${i.description}`)}if(s.length>0){console.log(`
1269
- Custom:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}async function qR(r,e,t){let n=r.trim();if(!n)return L("Usage: prjct workflow delete <name>",t);try{return yt.deleteWorkflow(e,n)?(await Eg.deleteWorkflowTemplate(n),t.md?console.log(O(je("Workflow Deleted",`Deleted workflow: ${n}`))):Ot(`deleted workflow: ${n}`),{success:!0}):L(`Workflow '${n}' not found`,t)}catch(s){return L(w(s),t)}}var VR=h(()=>{"use strict";UR();ii();Zn();H();he();dt();Xp();wg();c(WR,"workflowInit");c(GR,"workflowCreate");c(BR,"workflowList");c(qR,"workflowDelete")});var Cg={};A(Cg,{WorkflowCommands:()=>Tg});var Tg,Rg=h(()=>{"use strict";jl();as();ii();H();he();dt();Ei();ae();Ec();Re();Qt();yg();OR();HR();VR();Tg=class extends q{static{c(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=s.value;if(!e)return this._showActiveTask(o,t,n);let i=await jf(o,t,e,{skipHooks:n.skipHooks,spec:n.spec});if(!i.ok)return{success:!1,error:i.blocked??"Task start blocked"};let a=i.description??e,l=i.taskId??"",u=i.linearId,d=i.branch??"",p=i.instructions??[];return n.md?console.log(O(vi({description:a,status:"active"}),z("State",Me([`Task: \`${l}\``,d?`Branch: \`${d}\``:null,u?`Linear: \`${u}\``:null,p.length>0?`Agent instructions: ${p.length}`:null].filter(m=>m!==null))),p.length>0?z("Agent Instructions",Me(p)):null,qe([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(g.done(`Task: ${a}`),sT("working"),mo("task")),{success:!0,task:a,taskId:l}}catch(s){let o=w(s);return n.md?console.log(`> ${o}`):g.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t,n){let s=await Pi(e,t),o=s.current,i=s.all.filter(a=>!a.isCurrent);if(!o){let a='no active task. `prjct task "<description>"` to start one.',l=i.length>0?`
1269
+ Custom:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}async function qR(r,e,t){let n=r.trim();if(!n)return L("Usage: prjct workflow delete <name>",t);try{return yt.deleteWorkflow(e,n)?(await Eg.deleteWorkflowTemplate(n),t.md?console.log(O(je("Workflow Deleted",`Deleted workflow: ${n}`))):Ot(`deleted workflow: ${n}`),{success:!0}):L(`Workflow '${n}' not found`,t)}catch(s){return L(w(s),t)}}var VR=h(()=>{"use strict";UR();ii();Zn();H();he();dt();Xp();wg();c(WR,"workflowInit");c(GR,"workflowCreate");c(BR,"workflowList");c(qR,"workflowDelete")});var Cg={};A(Cg,{WorkflowCommands:()=>Tg});var Tg,Rg=h(()=>{"use strict";jl();as();ii();H();he();dt();Ei();ae();Ec();xe();Qt();yg();OR();HR();VR();Tg=class extends q{static{c(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=s.value;if(!e)return this._showActiveTask(o,t,n);let i=await jf(o,t,e,{skipHooks:n.skipHooks,spec:n.spec});if(!i.ok)return{success:!1,error:i.blocked??"Task start blocked"};let a=i.description??e,l=i.taskId??"",u=i.linearId,d=i.branch??"",p=i.instructions??[];return n.md?console.log(O(vi({description:a,status:"active"}),z("State",Me([`Task: \`${l}\``,d?`Branch: \`${d}\``:null,u?`Linear: \`${u}\``:null,p.length>0?`Agent instructions: ${p.length}`:null].filter(m=>m!==null))),p.length>0?z("Agent Instructions",Me(p)):null,qe([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(g.done(`Task: ${a}`),sT("working"),mo("task")),{success:!0,task:a,taskId:l}}catch(s){let o=w(s);return n.md?console.log(`> ${o}`):g.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t,n){let s=await Pi(e,t),o=s.current,i=s.all.filter(a=>!a.isCurrent);if(!o){let a='no active task. `prjct task "<description>"` to start one.',l=i.length>0?`
1270
1270
  ${i.length} active in other workspace(s):
1271
1271
  ${i.map(d=>` ${d.label} ${d.description}`).join(`
1272
- `)}`:"",u=a+l;return n.md?console.log(`> ${u}`):g.info(u),{success:!0,message:"no active task"}}if(n.md)console.log(O(vi({description:o.description,status:"active"}),z("State",Me([`Task: \`${o.id}\``,`Workspace: \`${o.label}\``,o.branch?`Branch: \`${o.branch}\``:null,o.linearId?`Linear: \`${o.linearId}\``:null,`Started: ${o.startedAt}`,i.length>0?`Other active workspaces: ${i.length}`:null].filter(a=>a!==null))),i.length>0?z("Other Active Workspaces",Me(i.map(a=>`${a.label} \u2014 ${a.description}`))):null));else{g.info(`Active: ${o.description}`),g.info(`Workspace: ${o.label}`);for(let a of i)g.info(` other: ${a.label} \u2014 ${a.description}`)}return{success:!0,currentTask:o}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await me(t,n);if(!s.ok)return s.result;let o=s.value,i=e?.trim()??"";if(!i)return ql(null,o,n);let a=RR(i);switch(a.type){case"add":return jR(a.args,o,n);case"gate":return _R(a.args,o,n);case"instruction":return $R(a.args,o,n);case"remove":return IR(a.args,o,n);case"disable":return MR(a.args,o,n);case"reset":return DR(o,n);case"init":return WR(o,t,n);case"help":return FR(n);case"create":return GR(a.args,o,t,n);case"list":return BR(o,n);case"delete":return qR(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return ql(a.args||null,o,n);default:return ql(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${w(s)}`):g.fail(w(s)),Le(s)}}async run(e,t=process.cwd(),n={}){try{let s=await me(t,n);if(!s.ok)return s.result;let o=s.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let a=yt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let l=await tr(o,i,"before",{projectPath:t});if(!l.success){if(n.md)tT("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(g.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await tr(o,i,"after",{projectPath:t}),n.md?console.log(O(je(`Workflow: ${i}`,a.description||""),qe([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):g.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=w(s);return n.md?console.log(`> Error: ${o}`):g.fail(o),{success:!1,error:o}}}}});var Pg={};A(Pg,{SetupCommands:()=>xg});import lL from"node:fs/promises";import uL from"node:http";import dL from"node:path";import ce from"chalk";var xg,Ag=h(()=>{"use strict";nn();Q();ge();br();ff();Ci();H();Ce();J();he();ae();_e();Re();gm();xg=class extends q{static{c(this,"SetupCommands")}async auth(e=null,t={}){let n=e?.split(" ")[0]||"status",s=e?.split(" ").slice(1)||[];switch(n){case"login":{let o=s[0];if(!o)return t.md||g.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=s.indexOf("--url");return a!==-1&&s[a+1]&&(i=s[a+1]),await xe.write({apiKey:o,...i?{apiUrl:i}:{}}),await go.testConnection()?(t.md||(g.done("Connected! API key saved"),g.info(ce.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1272
+ `)}`:"",u=a+l;return n.md?console.log(`> ${u}`):g.info(u),{success:!0,message:"no active task"}}if(n.md)console.log(O(vi({description:o.description,status:"active"}),z("State",Me([`Task: \`${o.id}\``,`Workspace: \`${o.label}\``,o.branch?`Branch: \`${o.branch}\``:null,o.linearId?`Linear: \`${o.linearId}\``:null,`Started: ${o.startedAt}`,i.length>0?`Other active workspaces: ${i.length}`:null].filter(a=>a!==null))),i.length>0?z("Other Active Workspaces",Me(i.map(a=>`${a.label} \u2014 ${a.description}`))):null));else{g.info(`Active: ${o.description}`),g.info(`Workspace: ${o.label}`);for(let a of i)g.info(` other: ${a.label} \u2014 ${a.description}`)}return{success:!0,currentTask:o}}async workflow(e=null,t=process.cwd(),n={}){try{let s=await me(t,n);if(!s.ok)return s.result;let o=s.value,i=e?.trim()??"";if(!i)return ql(null,o,n);let a=RR(i);switch(a.type){case"add":return jR(a.args,o,n);case"gate":return _R(a.args,o,n);case"instruction":return $R(a.args,o,n);case"remove":return IR(a.args,o,n);case"disable":return MR(a.args,o,n);case"reset":return DR(o,n);case"init":return WR(o,t,n);case"help":return FR(n);case"create":return GR(a.args,o,t,n);case"list":return BR(o,n);case"delete":return qR(a.args,o,n);case"run":return this.run(a.args,t,n);case"view":return ql(a.args||null,o,n);default:return ql(i.split(/\s+/)[0]?.toLowerCase()||null,o,n)}}catch(s){return n.md?console.log(`> Error: ${w(s)}`):g.fail(w(s)),Le(s)}}async run(e,t=process.cwd(),n={}){try{let s=await me(t,n);if(!s.ok)return s.result;let o=s.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return n.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let a=yt.getWorkflow(o,i);if(!a||!a.enabled){let u=`Workflow '${i}' not found`;return n.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let l=await tr(o,i,"before",{projectPath:t});if(!l.success){if(n.md)tT("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(g.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await tr(o,i,"after",{projectPath:t}),n.md?console.log(O(je(`Workflow: ${i}`,a.description||""),qe([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):g.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=w(s);return n.md?console.log(`> Error: ${o}`):g.fail(o),{success:!1,error:o}}}}});var Pg={};A(Pg,{SetupCommands:()=>xg});import lL from"node:fs/promises";import uL from"node:http";import dL from"node:path";import ce from"chalk";var xg,Ag=h(()=>{"use strict";nn();Q();ge();br();ff();Ci();H();Re();J();he();ae();_e();xe();gm();xg=class extends q{static{c(this,"SetupCommands")}async auth(e=null,t={}){let n=e?.split(" ")[0]||"status",s=e?.split(" ").slice(1)||[];switch(n){case"login":{let o=s[0];if(!o)return t.md||g.fail("Usage: prjct login [--url <url>]"),{success:!1,message:t.md?"## Error\nUsage: `prjct login [--url <url>]`":""};let i,a=s.indexOf("--url");return a!==-1&&s[a+1]&&(i=s[a+1]),await Ee.write({apiKey:o,...i?{apiUrl:i}:{}}),await go.testConnection()?(t.md||(g.done("Connected! API key saved"),g.info(ce.dim(`Key: ${o.substring(0,12)}...`))),{success:!0,message:t.md?`## Auth
1273
1273
  - **Status**: Connected
1274
1274
  - **Key**: \`${o.substring(0,12)}...\`
1275
1275
  - **API**: ${i||"default"}`:""}):(t.md||(g.warn("API key saved, but server is unreachable"),g.info(ce.dim(`Key: ${o.substring(0,12)}...`)),g.info(ce.dim("The key will be used when the server becomes available"))),{success:!0,message:t.md?`## Auth
1276
1276
  - **Status**: Key saved (server unreachable)
1277
- - **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await xe.clearAuth(),t.md||g.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1278
- - **Status**: Logged out`:""};default:{let o=await xe.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
1277
+ - **Key**: \`${o.substring(0,12)}...\``:""})}case"logout":return await Ee.clearAuth(),t.md||g.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
1278
+ - **Status**: Logged out`:""};default:{let o=await Ee.getStatus();return t.md?{success:!0,message:o.authenticated?`## Auth Status
1279
1279
  - **Authenticated**: Yes
1280
1280
  - **Email**: ${o.email||"N/A"}
1281
1281
  - **Key**: \`${o.apiKeyPrefix}\`
1282
1282
  - **Last auth**: ${o.lastAuth||"N/A"}`:"## Auth Status\n- **Authenticated**: No\n- Run `prjct login` to connect"}:(o.authenticated?g.box("Auth Status",`Email: ${o.email||"N/A"}
1283
1283
  Key: ${o.apiKeyPrefix}
1284
- Since: ${o.lastAuth||"N/A"}`):(g.info("Not authenticated"),g.info(`Run ${ce.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await xe.getStatus();if(t.authenticated)return e.md||(g.box("Already Authenticated",`Email: ${t.email}
1284
+ Since: ${o.lastAuth||"N/A"}`):(g.info("Not authenticated"),g.info(`Run ${ce.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await Ee.getStatus();if(t.authenticated)return e.md||(g.box("Already Authenticated",`Email: ${t.email}
1285
1285
  Key: ${t.apiKeyPrefix}`),g.info(`Run ${ce.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
1286
1286
  - **Email**: ${t.email}
1287
1287
  - **Key**: \`${t.apiKeyPrefix}\`
1288
1288
 
1289
- Run \`prjct logout\` first to re-authenticate.`:""};let n=e.url||process.env.PRJCT_WEB_URL||"http://localhost:3000";return new Promise(s=>{let o=uL.createServer(async(i,a)=>{let l=new URL(i.url||"/","http://127.0.0.1");if(l.pathname==="/callback"){let u=l.searchParams.get("key"),d=l.searchParams.get("email"),p=l.searchParams.get("user_id");if(u){await xe.saveAuth(u,p||"",d||"");let m=`${n}/api`;await xe.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(g.step(3,3,"Connected"),g.stop(),g.box("Authentication Complete",`Email: ${d}
1289
+ Run \`prjct logout\` first to re-authenticate.`:""};let n=e.url||process.env.PRJCT_WEB_URL||"http://localhost:5173";return new Promise(s=>{let o=uL.createServer(async(i,a)=>{let l=new URL(i.url||"/","http://127.0.0.1");if(l.pathname==="/callback"){let u=l.searchParams.get("key"),d=l.searchParams.get("email"),p=l.searchParams.get("user_id");if(u){await Ee.saveAuth(u,p||"",d||"");let m=`${n}/api`;await Ee.write({apiUrl:m}),a.writeHead(200,{"Content-Type":"text/html"}),a.end(this.buildSuccessPage(d||"",u.substring(0,12)))}else a.writeHead(400,{"Content-Type":"text/html"}),a.end(this.buildErrorPage("No API key received"));o.close(),u?(e.md||(g.step(3,3,"Connected"),g.stop(),g.box("Authentication Complete",`Email: ${d}
1290
1290
  Key: ${u.substring(0,12)}...
1291
1291
  Status: Connected`)),await this.autoSync(),s({success:!0,message:e.md?`## Authenticated
1292
1292
  - **Email**: ${d}
1293
1293
  - **Key**: \`${u.substring(0,12)}...\``:""})):(e.md||g.fail("Authentication failed: no API key received"),s({success:!1,message:e.md?`## Error
1294
1294
  Authentication failed: no API key received`:""}));return}a.writeHead(404),a.end("Not found")});o.listen(0,"127.0.0.1",async()=>{let i=o.address();if(!i||typeof i=="string"){o.close(),e.md||g.fail("Failed to start callback server"),s({success:!1,message:e.md?`## Error
1295
- Failed to start callback server`:""});return}let a=i.port,l=`${n}/login?redirect=${encodeURIComponent(`/api/auth/cli-login?port=${a}`)}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(ce.dim(l));let u=process.platform,d=u==="darwin"?`open "${l}"`:u==="win32"?`start "${l}"`:`xdg-open "${l}"`;try{await G(d)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${l}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${ce.cyan("prjct login")} to try again`)),s({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return(await xe.getStatus()).authenticated?(await xe.clearAuth(),g.done("Logged out"),{success:!0,message:""}):(g.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await P.readConfig(process.cwd()).catch(()=>null),t=e?.projectId;if(!t||!e.cloud?.enabled||e.cloud.paused)return;g.spin("Syncing project...");let n=await hn.sync(t,{include:e.cloud.include??{}});if(g.stop(),n.success&&!n.skipped){let s=n.pushed?.count||0,o=n.pulled?.count||0;s>0||o>0?g.done(`Synced (${s} pushed, ${o} pulled)`):g.done("Synced \u2014 everything up to date")}}catch{g.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
1295
+ Failed to start callback server`:""});return}let a=i.port,l=await Ee.getDeviceId(),u=await Ee.getHostname(),d=new URLSearchParams({port:String(a),device_id:l,hostname:u}),p=`${n}/auth/cli?${d.toString()}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(ce.dim(p));let m=process.platform,f=m==="darwin"?`open "${p}"`:m==="win32"?`start "${p}"`:`xdg-open "${p}"`;try{await G(f)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${p}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{o.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${ce.cyan("prjct login")} to try again`)),s({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return(await Ee.getStatus()).authenticated?(await Ee.clearAuth(),g.done("Logged out"),{success:!0,message:""}):(g.info("Already logged out"),{success:!0,message:""})}async autoSync(){try{let e=await P.readConfig(process.cwd()).catch(()=>null),t=e?.projectId;if(!t||!e.cloud?.enabled||e.cloud.paused)return;g.spin("Syncing project...");let n=await hn.sync(t,{include:e.cloud.include??{}});if(g.stop(),n.success&&!n.skipped){let s=n.pushed?.count||0,o=n.pulled?.count||0;s>0||o>0?g.done(`Synced (${s} pushed, ${o} pulled)`):g.done("Synced \u2014 everything up to date")}}catch{g.stop()}}buildSuccessPage(e,t){return`<!DOCTYPE html>
1296
1296
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
1297
1297
  <title>prjct CLI Connected</title>
1298
1298
  <style>
@@ -1423,10 +1423,10 @@ fi
1423
1423
  echo "\u26A1 prjct"
1424
1424
  `;await lL.writeFile(n,s,{mode:493});let o={};if(await E(t))try{o=await Pe(t)??{}}catch{}return o.statusLine={type:"command",command:n},await fe(t,o),{success:!0}}catch(e){return Le(e)}}showAsciiArt(){console.log(ce.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ce.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(ce.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(ce.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ce.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(ce.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(ce.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${ce.bold.cyan("prjct")}${ce.magenta("/")}${ce.green("cli")} ${ce.dim.white(`v${te} installed`)}`),console.log(""),console.log(` ${ce.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${ce.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${ce.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(ce.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(ce.bold.cyan("\u{1F680} Quick Start")),console.log(ce.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ce.bold("1.")} Initialize your project:`),console.log(` ${ce.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${ce.bold("2.")} Start your first task:`),console.log(` ${ce.green('prjct task "build auth"')}`),console.log(""),console.log(` ${ce.bold("3.")} Ship & celebrate:`),console.log(` ${ce.green('prjct ship "user login"')}`),console.log(""),console.log(ce.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${ce.dim("Documentation:")} ${ce.cyan("https://prjct.app")}`),console.log(` ${ce.dim("Report issues:")} ${ce.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(ce.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import{execFileSync as Fi}from"node:child_process";import pL from"node:os";import ps from"node:path";function yo(){try{return!!Fi("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})}catch{return!1}}function Jl(r){try{return Fi("which",[r],{stdio:"pipe"}),!0}catch{return!1}}function jg(){let r=[process.argv[1],process.execPath].filter(Boolean);for(let e of r){let t=e;try{t=tt("node:fs").realpathSync(e)}catch{}if(t.includes("/.bun/install/global")||t.includes("/.bun/bin/"))return"bun";if(t.includes("/Library/pnpm/")||t.includes("/.pnpm/")||t.includes("/.local/share/pnpm/"))return"pnpm";if(t.includes("/.yarn/")||t.includes("/yarn/global"))return"yarn"}return null}function Kl(){let r=jg();if(r&&Jl(r))return Mn[r];for(let e of["bun","pnpm","npm","yarn"])if(Jl(e))return Mn[e];throw new Error("No supported package manager found in PATH (tried npm, pnpm, bun, yarn). Install one and re-run, or upgrade manually: bun add -g prjct-cli@latest")}function Hi(){let r=[];for(let e of[Mn.bun,Mn.pnpm,Mn.npm,Mn.yarn]){let t=e.getInstallRoot();if(!t)continue;let n=ps.join(t,"prjct-cli","package.json");try{let s=JSON.parse(tt("node:fs").readFileSync(n,"utf-8"));s?.name==="prjct-cli"&&typeof s.version=="string"&&r.push({pm:e,version:s.version})}catch{}}return r}function JR(){try{let{existsSync:r,realpathSync:e,readFileSync:t}=tt("node:fs"),n=(()=>{try{return e(ps.resolve(__dirname,"..","..",".."))}catch{return""}})(),s=[Mn.bun.getInstallRoot(),Mn.pnpm.getInstallRoot(),Mn.npm.getInstallRoot(),Mn.yarn.getInstallRoot()].filter(o=>!!o);for(let o of s){let i=ps.join(o,"prjct-cli"),a=ps.join(i,"package.json");if(!r(a))continue;let l=i;try{l=e(i)}catch{}if(n&&l===n)continue;try{if(JSON.parse(t(ps.join(l,"package.json"),"utf-8"))?.name!=="prjct-cli")continue}catch{continue}ju(l);let{resetBundle:u}=(En(),ze(Du));u();return}}catch{}}var mL,Mn,_g=h(()=>{"use strict";_e();mL=pL.homedir(),Mn={npm:{name:"npm",installArgs:["install","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Fi("npm",["root","-g"],{encoding:"utf-8",stdio:"pipe"}).trim()}catch{return null}},"getInstallRoot")},pnpm:{name:"pnpm",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>{try{return Fi("pnpm",["root","-g"],{encoding:"utf-8",stdio:"pipe"}).trim()}catch{return null}},"getInstallRoot")},bun:{name:"bun",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:c(()=>ps.join(mL,".bun","install","global","node_modules"),"getInstallRoot")},yarn:{name:"yarn",installArgs:["global","add","prjct-cli@latest"],getInstallRoot:c(()=>{try{let r=Fi("yarn",["global","dir"],{encoding:"utf-8",stdio:"pipe"}).trim();return ps.join(r,"node_modules")}catch{return null}},"getInstallRoot")}};c(yo,"isHomebrewInstall");c(Jl,"isOnPath");c(jg,"detectInstallerFromRunningBinary");c(Kl,"selectPackageManager");c(Hi,"getAllInstalledLocations");c(JR,"redirectToInstalledPackage")});import{execSync as KR}from"node:child_process";import{realpathSync as $g}from"node:fs";import XR from"node:path";import fL from"node:readline";function hL(){try{let r=KR("command -v prjct",{stdio:"pipe",shell:"/bin/sh"}).toString().trim();if(!r)return null;try{return $g(r)}catch{return r}}catch{return null}}function yL(){try{return $g(XR.resolve(__dirname,"..","..",".."))}catch{return""}}function wL(){let r=hL(),e=jg(),t=yL(),n=[];if(!r&&!e)return{winner:null,removable:[],skipped:[{pm:"(all)",reason:"cannot resolve the PATH-winning binary \u2014 refusing to remove"}]};let s=r?.includes("/Cellar/")||r?.includes("/homebrew/"),o=s?"brew":e,i=[];for(let a of Hi()){if(a.pm.name===e){n.push({pm:a.pm.name,reason:"PATH winner \u2014 kept"});continue}let l=a.pm.getInstallRoot();if(l&&t){let u=XR.join(l,"prjct-cli");try{u=$g(u)}catch{}if(u===t){n.push({pm:a.pm.name,reason:"resolves to the dev source tree (link) \u2014 kept"});continue}}i.push({pm:a.pm.name,version:a.version})}return yo()&&!s?i.push({pm:"brew",version:"(homebrew)"}):yo()&&s&&n.push({pm:"brew",reason:"PATH winner \u2014 kept"}),{winner:o,removable:i,skipped:n}}function kL(r){let e=r==="brew"?"brew uninstall prjct-cli":gL[r];try{return KR(e,{stdio:"pipe",shell:"/bin/sh"}),{ok:!0}}catch(t){return{ok:!1,error:`${r}: ${t.message.split(`
1425
1425
  `)[0]}`}}}async function bL(r){let e=fL.createInterface({input:process.stdin,output:process.stdout});try{let t=await new Promise(n=>e.question(`${r} [y/N] `,n));return/^y(es)?$/i.test(t.trim())}finally{e.close()}}async function zR(r,e,t){let n=[],s=[];if(r==="off")return n.push("Install consolidation skipped (--no-cleanup)"),{details:n,errors:s};let o=wL();if(o.removable.length===0)return n.push(o.skipped.some(u=>u.pm==="(all)")?`Consolidation skipped \u2014 ${o.skipped[0].reason}`:"Single install \u2014 nothing to consolidate"),{details:n,errors:s};let i=o.removable.map(u=>`${u.pm} (${u.version})`).join(", ");if(n.push(`Winner: ${o.winner??"unknown"} \u2014 redundant copies: ${i}`),e){for(let u of o.removable)n.push(`Would remove ${u.pm} copy`);return{details:n,errors:s}}let a=process.stdin.isTTY===!0&&process.stdout.isTTY===!0;if(!(r==="force"||t||a&&await bL(`Remove ${o.removable.length} redundant prjct install(s) [${i}], keeping ${o.winner}?`)))return a?n.push("Consolidation declined \u2014 left all installs in place"):n.push(`Multiple installs detected [${i}]. Run \`prjct upgrade --yes\` to consolidate (kept ${o.winner}).`),{details:n,errors:s};for(let u of o.removable){let d=kL(u.pm);d.ok?n.push(`Removed redundant ${u.pm} install`):s.push(d.error??`failed to remove ${u.pm}`)}for(let u of o.skipped)n.push(`Kept ${u.pm}: ${u.reason}`);return{details:n,errors:s}}var gL,YR=h(()=>{"use strict";_g();gL={npm:"npm uninstall -g prjct-cli",pnpm:"pnpm remove -g prjct-cli",bun:"bun remove -g prjct-cli",yarn:"yarn global remove prjct-cli"};c(hL,"pathWinnerReal");c(yL,"sourceRoot");c(wL,"planCleanup");c(kL,"removeOne");c(bL,"confirm");c(zR,"consolidateInstalls")});import wo from"chalk";function QR(r,e){let t=r.phase1.success&&r.phase2.success,n=[...r.phase1.errors,...r.phase2.errors];console.log("");let s=[{label:"Package",result:r.phase1,fatal:!0},{label:"Cleanup",result:r.phase2,fatal:!0},{label:"Daemon",result:r.phase3,fatal:!1}];for(let{label:o,result:i,fatal:a}of s){let l=i.success?wo.green("\u2713"):a?wo.red("\u2717"):wo.yellow("\u26A0");console.log(` ${l} ${wo.bold(o)}`);for(let u of i.details)console.log(` ${wo.dim(u)}`);for(let u of i.errors)console.log(` ${wo.yellow("\u26A0")} ${u}`)}return console.log(""),e?g.done("Dry run complete \u2014 no changes made"):t?g.done("System updated"):g.warn(`Updated with ${n.length} error(s)`),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}function ZR(r,e){let t=r.phase1.success&&r.phase2.success,n=[];n.push(e?"# Update (Dry Run)":"# System Update"),n.push("");let s=[{label:"Package Update",result:r.phase1,fatal:!0},{label:"Global Cleanup",result:r.phase2,fatal:!0},{label:"Daemon Restart",result:r.phase3,fatal:!1}];for(let{label:o,result:i,fatal:a}of s){let l=i.success?"OK":a?"FAILED":"WARNING";n.push(`## ${o} (${l})`);for(let u of i.details)n.push(`- ${u}`);for(let u of i.errors)n.push(`- WARNING: ${u}`);n.push("")}return e||n.push(t?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(n.join(`
1426
- `)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}var ex=h(()=>{"use strict";ae();c(QR,"formatTerminalOutput");c(ZR,"formatMdOutput")});var Og={};A(Og,{UpdateCommands:()=>Mg});import{execFileSync as tx}from"node:child_process";import Ig from"node:fs/promises";import Dg from"node:path";var Mg,Ng=h(()=>{"use strict";nn();Da();ge();$c();Em();H();he();ae();_e();Re();YR();ex();_g();Mg=class extends q{static{c(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.md===!0,o=e.cleanup===!1?"off":e.cleanup===!0?"force":"auto",i=e.yes===!0||e.y===!0,a={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(!n)try{let{isDaemonRunning:l,stopDaemon:u,forceKillDaemon:d}=await Promise.resolve().then(()=>(Kt(),Jt));await l()&&(await u()||d())}catch{}if(s||g.step(1,3,"Updating package..."),a.phase1=await this.phasePackageUpdate(n),s||g.stop(),!n&&a.phase1.success&&JR(),s||g.step(2,3,"Cleaning up all projects..."),a.phase2=await this.phaseGlobalCleanup(n,o,i),s||g.stop(),s||g.step(3,3,"Restarting daemon..."),a.phase3=await this.phaseDaemonRestart(n),s||g.stop(),!n){try{await Yo.updateVersion(te)}catch{}try{await new io().writeCache({lastCheck:0,latestVersion:""})}catch{}}return s?ZR(a,n):QR(a,n)}catch(l){return s||g.stop(),g.fail(w(l)),Le(l)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},n=Hi();if(e){if(yo()){let o;try{o=Kl().name}catch(i){o="<none-available>",t.errors.push(w(i))}t.details.push("Would uninstall homebrew formula"),t.details.push(`Would install via ${o}`)}else if(n.length===0){let o;try{o=Kl().name}catch(i){o="<none-available>",t.errors.push(w(i))}t.details.push(`Would install via ${o}`)}else for(let{pm:o,version:i}of n)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(yo())try{tx("brew",["uninstall","prjct-cli"],{stdio:["pipe","pipe","ignore"]}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}let o;n.length>0?o=n.map(d=>d.pm):o=[Kl()];let i=null;try{let d=(await new io().getLatestVersion())?.trim();d&&/^\d+\.\d+\.\d+/.test(d)&&(i=`prjct-cli@${d}`)}catch{}for(let d of o){if(!Jl(d.name)){t.errors.push(`${d.name} is not on PATH but has a prjct-cli install. Either install ${d.name} or remove that copy.`);continue}try{let p=i?d.installArgs.map(m=>m==="prjct-cli@latest"?i:m):d.installArgs;tx(d.name,p,{stdio:"pipe"}),t.details.push(`${d.name} install complete${i?` (${i})`:""}`)}catch(p){t.errors.push(`${d.name}: ${w(p)}`)}}let a=Hi(),l=new Map(n.map(d=>[d.pm.name,d.version])),u=[];for(let{pm:d,version:p}of a){let m=l.get(d.name);m&&m!==p?u.push(`${d.name}: ${m} \u2192 ${p}`):m||u.push(`${d.name}: installed v${p}`)}if(u.length>1)for(let d of u)t.details.push(d);else u.length===1?t.details.push(u[0]):a.length>0&&t.details.push(`v${a[0].version} (already latest)`)}catch(s){t.success=!1,t.errors.push(w(s))}return t}async phaseGlobalCleanup(e,t="auto",n=!1){let s={success:!0,details:[],errors:[]},o=await this.getAllProjectIds();if(o.length===0)s.details.push("No projects found");else{let i=0,a=0;for(let l of o)if(!e)try{let u=await Yc(l),d=await Qc(l);if(i+=u.migratedFiles.length,a+=d,u.errors.length>0)for(let p of u.errors)s.errors.push(`${l.slice(0,8)}: ${p.file}: ${p.error}`)}catch(u){s.errors.push(`${l.slice(0,8)}: ${w(u)}`)}if(e)s.details.push(`Would migrate ${o.length} project(s)`);else{let l=[`${o.length} project(s) checked`];i>0&&l.push(`${i} files migrated`),a>0&&l.push(`${a} leftovers swept`),s.details.push(l.join(", "))}}if(e)s.details.push("Would clean all legacy artifacts"),s.details.push("Would reinstall editor commands"),s.details.push("Would reinstall global config (all providers)");else{try{let a=await new xn().cleanupAllLegacy();a.cleaned.length>0&&s.details.push(`Cleaned ${a.cleaned.length} legacy artifact(s)`)}catch(i){s.errors.push(`Legacy cleanup: ${w(i)}`)}try{let a=await new xn().installCommands();s.details.push(`Editor commands reinstalled (${a.installed?.length||0} providers)`)}catch(i){s.errors.push(`Commands: ${w(i)}`)}try{await new xn().installGlobalConfig(),s.details.push("Global config updated (prjct section replaced)")}catch(i){s.errors.push(`Global config: ${w(i)}`)}try{let{detectAllProviders:i}=await Promise.resolve().then(()=>(Be(),_t)),a=await i(),l=Dg.join(tt("node:os").homedir());if(a.gemini.installed){let u=Dg.join(l,".gemini","GEMINI.md");try{let d=await Ig.readFile(u,"utf-8"),p="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",m="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(d.includes(p)&&d.includes(m)){let{getTemplateContent:f}=await Promise.resolve().then(()=>(En(),Du)),y=f("global/GEMINI.md");if(y?.includes(p)&&y.includes(m)){let v=y.substring(y.indexOf(p),y.indexOf(m)+m.length),k=d.substring(0,d.indexOf(p)),b=d.substring(d.indexOf(m)+m.length),C=k+v+b,R="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",D="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(C.includes(R)&&C.includes(D)){let V=C.substring(0,C.indexOf(R)),M=C.substring(C.indexOf(D)+D.length);C=`${(V+M).replace(/\n{3,}/g,`
1426
+ `)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}var ex=h(()=>{"use strict";ae();c(QR,"formatTerminalOutput");c(ZR,"formatMdOutput")});var Og={};A(Og,{UpdateCommands:()=>Mg});import{execFileSync as tx}from"node:child_process";import Ig from"node:fs/promises";import Dg from"node:path";var Mg,Ng=h(()=>{"use strict";nn();Da();ge();$c();Em();H();he();ae();_e();xe();YR();ex();_g();Mg=class extends q{static{c(this,"UpdateCommands")}async update(e={},t=process.cwd()){let n=e["dry-run"]===!0,s=e.md===!0,o=e.cleanup===!1?"off":e.cleanup===!0?"force":"auto",i=e.yes===!0||e.y===!0,a={phase1:{success:!0,details:[],errors:[]},phase2:{success:!0,details:[],errors:[]},phase3:{success:!0,details:[],errors:[]}};try{if(!n)try{let{isDaemonRunning:l,stopDaemon:u,forceKillDaemon:d}=await Promise.resolve().then(()=>(Kt(),Jt));await l()&&(await u()||d())}catch{}if(s||g.step(1,3,"Updating package..."),a.phase1=await this.phasePackageUpdate(n),s||g.stop(),!n&&a.phase1.success&&JR(),s||g.step(2,3,"Cleaning up all projects..."),a.phase2=await this.phaseGlobalCleanup(n,o,i),s||g.stop(),s||g.step(3,3,"Restarting daemon..."),a.phase3=await this.phaseDaemonRestart(n),s||g.stop(),!n){try{await Yo.updateVersion(te)}catch{}try{await new io().writeCache({lastCheck:0,latestVersion:""})}catch{}}return s?ZR(a,n):QR(a,n)}catch(l){return s||g.stop(),g.fail(w(l)),Le(l)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[]},n=Hi();if(e){if(yo()){let o;try{o=Kl().name}catch(i){o="<none-available>",t.errors.push(w(i))}t.details.push("Would uninstall homebrew formula"),t.details.push(`Would install via ${o}`)}else if(n.length===0){let o;try{o=Kl().name}catch(i){o="<none-available>",t.errors.push(w(i))}t.details.push(`Would install via ${o}`)}else for(let{pm:o,version:i}of n)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(yo())try{tx("brew",["uninstall","prjct-cli"],{stdio:["pipe","pipe","ignore"]}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}let o;n.length>0?o=n.map(d=>d.pm):o=[Kl()];let i=null;try{let d=(await new io().getLatestVersion())?.trim();d&&/^\d+\.\d+\.\d+/.test(d)&&(i=`prjct-cli@${d}`)}catch{}for(let d of o){if(!Jl(d.name)){t.errors.push(`${d.name} is not on PATH but has a prjct-cli install. Either install ${d.name} or remove that copy.`);continue}try{let p=i?d.installArgs.map(m=>m==="prjct-cli@latest"?i:m):d.installArgs;tx(d.name,p,{stdio:"pipe"}),t.details.push(`${d.name} install complete${i?` (${i})`:""}`)}catch(p){t.errors.push(`${d.name}: ${w(p)}`)}}let a=Hi(),l=new Map(n.map(d=>[d.pm.name,d.version])),u=[];for(let{pm:d,version:p}of a){let m=l.get(d.name);m&&m!==p?u.push(`${d.name}: ${m} \u2192 ${p}`):m||u.push(`${d.name}: installed v${p}`)}if(u.length>1)for(let d of u)t.details.push(d);else u.length===1?t.details.push(u[0]):a.length>0&&t.details.push(`v${a[0].version} (already latest)`)}catch(s){t.success=!1,t.errors.push(w(s))}return t}async phaseGlobalCleanup(e,t="auto",n=!1){let s={success:!0,details:[],errors:[]},o=await this.getAllProjectIds();if(o.length===0)s.details.push("No projects found");else{let i=0,a=0;for(let l of o)if(!e)try{let u=await Yc(l),d=await Qc(l);if(i+=u.migratedFiles.length,a+=d,u.errors.length>0)for(let p of u.errors)s.errors.push(`${l.slice(0,8)}: ${p.file}: ${p.error}`)}catch(u){s.errors.push(`${l.slice(0,8)}: ${w(u)}`)}if(e)s.details.push(`Would migrate ${o.length} project(s)`);else{let l=[`${o.length} project(s) checked`];i>0&&l.push(`${i} files migrated`),a>0&&l.push(`${a} leftovers swept`),s.details.push(l.join(", "))}}if(e)s.details.push("Would clean all legacy artifacts"),s.details.push("Would reinstall editor commands"),s.details.push("Would reinstall global config (all providers)");else{try{let a=await new xn().cleanupAllLegacy();a.cleaned.length>0&&s.details.push(`Cleaned ${a.cleaned.length} legacy artifact(s)`)}catch(i){s.errors.push(`Legacy cleanup: ${w(i)}`)}try{let a=await new xn().installCommands();s.details.push(`Editor commands reinstalled (${a.installed?.length||0} providers)`)}catch(i){s.errors.push(`Commands: ${w(i)}`)}try{await new xn().installGlobalConfig(),s.details.push("Global config updated (prjct section replaced)")}catch(i){s.errors.push(`Global config: ${w(i)}`)}try{let{detectAllProviders:i}=await Promise.resolve().then(()=>(Be(),_t)),a=await i(),l=Dg.join(tt("node:os").homedir());if(a.gemini.installed){let u=Dg.join(l,".gemini","GEMINI.md");try{let d=await Ig.readFile(u,"utf-8"),p="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",m="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(d.includes(p)&&d.includes(m)){let{getTemplateContent:f}=await Promise.resolve().then(()=>(En(),Du)),y=f("global/GEMINI.md");if(y?.includes(p)&&y.includes(m)){let v=y.substring(y.indexOf(p),y.indexOf(m)+m.length),k=d.substring(0,d.indexOf(p)),b=d.substring(d.indexOf(m)+m.length),C=k+v+b,R="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",D="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(C.includes(R)&&C.includes(D)){let V=C.substring(0,C.indexOf(R)),M=C.substring(C.indexOf(D)+D.length);C=`${(V+M).replace(/\n{3,}/g,`
1427
1427
 
1428
1428
  `).trim()}
1429
- `}await Ig.writeFile(u,C,"utf-8"),s.details.push("Gemini global config updated")}}}catch{}}}catch{}}try{let i=await zR(t,e,n);s.details.push(...i.details),s.errors.push(...i.errors)}catch(i){s.errors.push(`install consolidation skipped: ${w(i)}`)}return s.errors.length>0&&(s.success=!1),s}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:n,stopDaemon:s,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Kt(),Jt));await n()?(await s()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)"));let a=await i();t.details.push(a?"Daemon restarted":"Daemon will start automatically on next use")}catch(n){t.success=!1,t.errors.push(w(n))}return t}async getAllProjectIds(){let e=Dg.join(_.getGlobalBasePath(),"projects");try{return(await Ig.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});async function nx(r,e,t={}){let{topic:n,types:s,tags:o}=t,i=t.limit??30,a=[];if(n){let l=n.split(/\s+/).filter(Boolean);try{let u=N.searchFts(e,l,i);s&&(u=u.filter(d=>s.includes(d.type))),o&&(u=u.filter(d=>si(d,o))),a=u}catch{a=[]}}if(a.length<i){let l=new Set(a.map(d=>d.id)),u=N.recall(e,{topic:n,types:s,tags:o,limit:i});for(let d of u)if(!l.has(d.id)&&(a.push(d),a.length>=i))break}if(n)try{let l=await P.readConfig(r);if(l&&Ii.isEnabled(l)){let u=await Ii.semanticSearch(e,n,l,10);if(u.length>0){let d=new Set(a.map(m=>m.id)),p=u.filter(m=>!d.has(m.id));s&&(p=p.filter(m=>s.includes(m.type))),o&&(p=p.filter(m=>si(m,o))),a=[...p,...a].slice(0,i)}}}catch{}if(a.length>1&&(a=at.rerank(e,a)),t.expandLinks!==!1&&a.length>0){let l=N.expandWithLinks(e,a,5);l.length>0&&(a=a.concat(l))}try{let l=await K.getCurrentTask(e);l?.id&&at.recordSurfaced(e,a.map(u=>u.id),l.id)}catch{}return a}var rx=h(()=>{"use strict";Q();Ll();Qn();Et();Ys();Ee();c(nx,"enrichedRecall")});var Lg={};A(Lg,{runContextTool:()=>vL});async function vL(r,e,t){let[n,...s]=r;try{switch(n){case"memory":return await sx(s,t,{kind:"memory"});case"learnings":return await sx(s,t,{kind:"learnings"});case"wiki":return await SL(t,s);case"help":return{tool:"error",result:{error:TL(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}}catch(o){return{tool:"error",result:{error:w(o),code:"EXECUTION_ERROR"}}}}async function SL(r,e=[]){let t=await P.getProjectId(r);if(!t)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};if(e[0]==="sync")return EL(r,t,e.slice(1));let{generateWiki:s}=await Promise.resolve().then(()=>($n(),xr)),{wikiRoot:o,filesWritten:i}=await s(r,t);return{tool:"wiki",result:{markdown:`> Wiki rebuilt at \`${o}\` \u2014 ${i} files. Read \`${o}/_generated/index.md\` with the Read tool.`,entryCount:i}}}async function EL(r,e,t){let n=t.includes("--force"),{ingestCapturedNotes:s}=await Promise.resolve().then(()=>(ac(),Rb)),{regenerateWikiDeferred:o}=await Promise.resolve().then(()=>($n(),xr)),i=await s(r,{force:n});i.ingested>0&&await o(r,e);let a=[];if(a.push(`> Ingested ${i.ingested} note(s) from \`.prjct/wiki/captured/\`.`),i.skipped.length>0){a.push("","**Skipped:**");for(let l of i.skipped)a.push(`- \`${l.file}\` \u2014 ${l.reason}`)}if(i.errors.length>0){a.push("","**Errors:**");for(let l of i.errors)a.push(`- \`${l.file}\` \u2014 ${l.error}`)}return i.ingested===0&&i.skipped.length===0&&i.errors.length===0&&a.push("","Nothing to ingest. Drop markdown notes with frontmatter into `.prjct/wiki/captured/` and re-run."),{tool:"wiki",result:{markdown:a.join(`
1429
+ `}await Ig.writeFile(u,C,"utf-8"),s.details.push("Gemini global config updated")}}}catch{}}}catch{}}try{let i=await zR(t,e,n);s.details.push(...i.details),s.errors.push(...i.errors)}catch(i){s.errors.push(`install consolidation skipped: ${w(i)}`)}return s.errors.length>0&&(s.success=!1),s}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:n,stopDaemon:s,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Kt(),Jt));await n()?(await s()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)"));let a=await i();t.details.push(a?"Daemon restarted":"Daemon will start automatically on next use")}catch(n){t.success=!1,t.errors.push(w(n))}return t}async getAllProjectIds(){let e=Dg.join(_.getGlobalBasePath(),"projects");try{return(await Ig.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")).map(n=>n.name)}catch{return[]}}}});async function nx(r,e,t={}){let{topic:n,types:s,tags:o}=t,i=t.limit??30,a=[];if(n){let l=n.split(/\s+/).filter(Boolean);try{let u=N.searchFts(e,l,i);s&&(u=u.filter(d=>s.includes(d.type))),o&&(u=u.filter(d=>si(d,o))),a=u}catch{a=[]}}if(a.length<i){let l=new Set(a.map(d=>d.id)),u=N.recall(e,{topic:n,types:s,tags:o,limit:i});for(let d of u)if(!l.has(d.id)&&(a.push(d),a.length>=i))break}if(n)try{let l=await P.readConfig(r);if(l&&Ii.isEnabled(l)){let u=await Ii.semanticSearch(e,n,l,10);if(u.length>0){let d=new Set(a.map(m=>m.id)),p=u.filter(m=>!d.has(m.id));s&&(p=p.filter(m=>s.includes(m.type))),o&&(p=p.filter(m=>si(m,o))),a=[...p,...a].slice(0,i)}}}catch{}if(a.length>1&&(a=at.rerank(e,a)),t.expandLinks!==!1&&a.length>0){let l=N.expandWithLinks(e,a,5);l.length>0&&(a=a.concat(l))}try{let l=await K.getCurrentTask(e);l?.id&&at.recordSurfaced(e,a.map(u=>u.id),l.id)}catch{}return a}var rx=h(()=>{"use strict";Q();Ll();Qn();Et();Ys();Te();c(nx,"enrichedRecall")});var Lg={};A(Lg,{runContextTool:()=>vL});async function vL(r,e,t){let[n,...s]=r;try{switch(n){case"memory":return await sx(s,t,{kind:"memory"});case"learnings":return await sx(s,t,{kind:"learnings"});case"wiki":return await SL(t,s);case"help":return{tool:"error",result:{error:TL(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${n}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}}catch(o){return{tool:"error",result:{error:w(o),code:"EXECUTION_ERROR"}}}}async function SL(r,e=[]){let t=await P.getProjectId(r);if(!t)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};if(e[0]==="sync")return EL(r,t,e.slice(1));let{generateWiki:s}=await Promise.resolve().then(()=>($n(),xr)),{wikiRoot:o,filesWritten:i}=await s(r,t);return{tool:"wiki",result:{markdown:`> Wiki rebuilt at \`${o}\` \u2014 ${i} files. Read \`${o}/_generated/index.md\` with the Read tool.`,entryCount:i}}}async function EL(r,e,t){let n=t.includes("--force"),{ingestCapturedNotes:s}=await Promise.resolve().then(()=>(ac(),Rb)),{regenerateWikiDeferred:o}=await Promise.resolve().then(()=>($n(),xr)),i=await s(r,{force:n});i.ingested>0&&await o(r,e);let a=[];if(a.push(`> Ingested ${i.ingested} note(s) from \`.prjct/wiki/captured/\`.`),i.skipped.length>0){a.push("","**Skipped:**");for(let l of i.skipped)a.push(`- \`${l.file}\` \u2014 ${l.reason}`)}if(i.errors.length>0){a.push("","**Errors:**");for(let l of i.errors)a.push(`- \`${l.file}\` \u2014 ${l.error}`)}return i.ingested===0&&i.skipped.length===0&&i.errors.length===0&&a.push("","Nothing to ingest. Drop markdown notes with frontmatter into `.prjct/wiki/captured/` and re-run."),{tool:"wiki",result:{markdown:a.join(`
1430
1430
  `),entryCount:i.ingested}}}async function sx(r,e,t){let n=await P.getProjectId(e);if(!n)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};let s=r.filter(u=>!u.startsWith("-")).join(" ").trim()||void 0,o=(()=>{let u=r.find(d=>d.startsWith("--id"));if(u){let d=u.includes("=")?u.split("=")[1]:r[r.indexOf(u)+1];if(d)return d}return s&&/^mem[_-]?\d+$/i.test(s)?s:void 0})();if(o){let u=N.getById(n,o);u&&at.recordFetch(n,u.id);let d=u?N.expandWithLinks(n,[u],5):[],p=u?[u,...d]:[];return{tool:t.kind,result:{markdown:u?hr(p):`> No memory entry with id \`${o}\` (it may have aged out or never existed).`,entryCount:p.length,topic:o}}}let i=["learning","anti-pattern","gotcha"],a=t.kind==="learnings"?i:void 0,l=await nx(e,n,{topic:s,types:a,limit:30});return{tool:t.kind,result:{markdown:hr(l),entryCount:l.length,topic:s}}}function TL(){return`
1431
1431
  prjct context \u2014 memory-bound context subtools
1432
1432
 
@@ -1452,18 +1452,18 @@ NOTE: File-oriented subtools (files, signatures, imports, recent,
1452
1452
  summary) were removed in alpha.12 \u2014 Claude has Glob/Grep/Read/git
1453
1453
  natively and re-implementing them in prjct was harness. The
1454
1454
  underlying functions still exist for the orchestrator + MCP surface.
1455
- `.trim()}var Fg=h(()=>{"use strict";Q();rx();Xt();Ee();Qn();H();c(vL,"runContextTool");c(SL,"runWikiTool");c(EL,"runWikiSyncTool");c(sx,"runMemoryTool");c(TL,"getHelpText")});var zl={};A(zl,{ContextCommands:()=>Xl,contextCommands:()=>ox,default:()=>xL});import CL from"node:fs/promises";import RL from"node:path";var Xl,ox,xL,Yl=h(()=>{"use strict";Q();ge();Et();H();dt();Xl=class{static{c(this,"ContextCommands")}async context(e=null,t=process.cwd(),n={}){try{let s=await P.readConfig(t);if(!s||!s.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `prjct init` first."};let o=s.projectId,i=_.getGlobalProjectPath(o),a=await K.read(o),l=a?.currentTask?{id:a.currentTask.id,description:a.currentTask.description,startedAt:a.currentTask.startedAt,subtasks:a.currentTask.subtasks?.map(p=>({id:p.id,description:p.description,status:p.status,domain:p.domain})),currentSubtaskIndex:a.currentTask.currentSubtaskIndex}:null,u=await this.loadRepoAnalysis(i),d={projectId:o,globalPath:i,currentTask:l,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:u?.ecosystem||"unknown",frameworks:u?.frameworks||[],hasTests:u?.hasTests||!1,technologies:u?.technologies||[]}};return n.md?console.log(this.formatContextMd(d)):console.log(JSON.stringify(d)),{success:!0,message:""}}catch(s){return{success:!1,message:`Context error: ${w(s)}`}}}async search(e=null,t=process.cwd(),n={}){let s=await P.getProjectId(t);if(!s)return{success:!1,message:"No prjct project. Run `prjct init` first."};let o=(e??"").trim();if(!o)return{success:!1,message:"search requires a query"};let{runContextTool:i}=await Promise.resolve().then(()=>(Fg(),Lg)),a=await i(["memory",o],s,t),l=a.tool!=="error",u=n.md?a.result.markdown??"":JSON.stringify(a,null,2);return{success:l,message:u}}formatContextMd(e){let t=[];if(t.push(z("Project",qm(Bm("ID",e.projectId),Bm("Path",e.globalPath)))),e.currentTask){let n=e.currentTask;if(t.push(vi({description:n.description,status:"in-progress"})),n.subtasks&&n.subtasks.length>0){let s=n.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(s.join(`
1456
- `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(z("Stack",Ir({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),O(...t)}async loadRepoAnalysis(e){try{let t=RL.join(e,"analysis","repo-analysis.json"),n=await CL.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return W(t),null}}},ox=new Xl,xL=ox});var Ug={};A(Ug,{PrimitiveCommands:()=>Hg});function AL(r){let e=r.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let n=t.indexOf(":");return n<=0?null:[t.slice(0,n),t.slice(n+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}function jL(r){if(!r)return{};let e={};for(let t of r.split(",")){let n=t.trim(),s=n.indexOf(":");s>0&&(e[n.slice(0,s)]=n.slice(s+1))}return e}function _L(r){let e=r.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let n=e.slice(0,t).toLowerCase().trim();if(!n||!/^[a-z][a-z0-9-]*$/.test(n))return{ok:!1,error:`invalid type '${n}'. Lowercase letters + dashes only. Base types: ${zs.join(", ")}`};let s=n,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:s,content:o}:{ok:!1,error:"content is required"}}var PL,Hg,Wg=h(()=>{"use strict";Ys();Ee();Yn();as();Et();H();he();ae();Zo();oc();Re();Qt();PL=["feature","bug","improvement","chore"],Hg=class extends q{static{c(this,"PrimitiveCommands")}async status(e=null,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;if(e){let d=await _f(s.value,t,e);if(!d.ok){if(d.reason==="unsupported")return n.md?console.log(`> ${d.message}`):g.fail(d.message),{success:!1,error:d.message};let m=await fl(s.value,n,t);return m.ok?{success:!1,error:"No active task"}:m.result}let p=`status \u2192 ${e}`;return n.md?console.log(`\u2713 ${p}`):g.done(p),{success:!0,taskId:d.taskId,status:e}}if(!await sr(s.value,t)){let d=await K.getPausedTasks(s.value);if(d.length>0){let p=d[0],m=`Task: ${p.id} | Type: ${p.type??"unset"} | Status: paused`;return n.md?console.log(m):g.info(m),{success:!0,taskId:p.id,status:"paused"}}}let i=await fl(s.value,n,t);if(!i.ok)return i.result;let a=i.value,l=await Ri(s.value,a.id),u=`Task: ${a.id} | Type: ${a.type??"unset"} | Status: ${l??"active"}`;return n.md?console.log(u):g.info(u),{success:!0,taskId:a.id,status:l??"active"}}catch(s){let o=w(s);return $(o)}}async tag(e=null,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=await fl(s.value,n,t);if(!o.ok)return o.result;if(!e)return g.info("Usage: prjct tag <key:value> [<key:value>...]"),{success:!1,error:"No tags provided"};let i=AL(e);if(Object.keys(i).length===0)return g.fail("no valid k:v pairs (expected `key:value`)"),{success:!1,error:"Invalid tag format"};let a=i.type;a&&PL.includes(a)&&await K.updateCurrentTask(s.value,{type:a}),await Xe.log(t,"task.tagged",{taskId:o.value.id,tags:i});let l=Object.entries(i).map(([u,d])=>`${u}=${d}`).join(", ");return n.md?console.log(`\u2713 tagged ${l}`):g.done(`tagged ${l}`),{success:!0,taskId:o.value.id,tags:i}}catch(s){let o=w(s);return $(o)}}async remember(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return g.info(`Usage: prjct remember <type> "<content>" [--tags k:v,...]
1457
- Types: ${zs.join(" | ")}`),{success:!1,error:"Missing args"};let o=_L(e);if(!o.ok)return $(o.error);let{type:i,content:a}=o,l=eo(a);if(l.length>0&&!n.force){let y=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${y}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Js(a);if(u.length>0&&!n.force)return g.fail(`refusing to store memory that looks like prompt injection (${u.join(", ")}). Entries are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let d=jL(n.tags),p=await me(t);if(!p.ok)return p.result;let m=await sr(p.value,t);await N.remember(t,{type:i,content:a,tags:d,source:m?.id});let{regenerateWikiDeferred:f}=await Promise.resolve().then(()=>($n(),xr));return await f(t,p.value),n.md?console.log(`\u2713 remembered ${i}: ${a}`):g.done(`remembered ${i}`),{success:!0,type:i,content:a,tags:d}}catch(s){let o=w(s);return $(o)}}async forget(e=null,t=process.cwd(),n={}){try{let s=(e??"").trim();if(!s)return g.info("Usage: prjct forget <id> (e.g. prjct forget mem_1234)"),{success:!1,error:"Missing id"};let o=await me(t);if(!o.ok)return o.result;if(!N.forget(o.value,s))return n.md?console.log(`\u2717 no memory entry matched ${s}`):g.fail(`no memory entry matched ${s}`),{success:!1,error:`No memory entry matched ${s}`};let{regenerateWikiDeferred:a}=await Promise.resolve().then(()=>($n(),xr));return await a(t,o.value),n.md?console.log(`\u2713 forgot ${s}`):g.done(`forgot ${s}`),{success:!0,id:s}}catch(s){let o=w(s);return $(o)}}};c(AL,"parseTagPairs");c(jL,"parseFlagTags");c(_L,"parseRememberArgs")});var Ql={};A(Ql,{SeedCommands:()=>Gg});var Gg,Zl=h(()=>{"use strict";Ym();nf();H();he();ae();Re();Gg=class extends q{static{c(this,"SeedCommands")}async seed(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list",i=s.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,n);case"remove":return this.remove(i||null,t,n);case"list":return this.list(null,t,n);case"suggest":return this.suggest(null,t,n);default:return g.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),n={}){try{if(!e)return g.info(`Usage: prjct seed add <pack>[,<pack>...]
1455
+ `.trim()}var Fg=h(()=>{"use strict";Q();rx();Xt();Te();Qn();H();c(vL,"runContextTool");c(SL,"runWikiTool");c(EL,"runWikiSyncTool");c(sx,"runMemoryTool");c(TL,"getHelpText")});var zl={};A(zl,{ContextCommands:()=>Xl,contextCommands:()=>ox,default:()=>xL});import CL from"node:fs/promises";import RL from"node:path";var Xl,ox,xL,Yl=h(()=>{"use strict";Q();ge();Et();H();dt();Xl=class{static{c(this,"ContextCommands")}async context(e=null,t=process.cwd(),n={}){try{let s=await P.readConfig(t);if(!s||!s.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `prjct init` first."};let o=s.projectId,i=_.getGlobalProjectPath(o),a=await K.read(o),l=a?.currentTask?{id:a.currentTask.id,description:a.currentTask.description,startedAt:a.currentTask.startedAt,subtasks:a.currentTask.subtasks?.map(p=>({id:p.id,description:p.description,status:p.status,domain:p.domain})),currentSubtaskIndex:a.currentTask.currentSubtaskIndex}:null,u=await this.loadRepoAnalysis(i),d={projectId:o,globalPath:i,currentTask:l,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:u?.ecosystem||"unknown",frameworks:u?.frameworks||[],hasTests:u?.hasTests||!1,technologies:u?.technologies||[]}};return n.md?console.log(this.formatContextMd(d)):console.log(JSON.stringify(d)),{success:!0,message:""}}catch(s){return{success:!1,message:`Context error: ${w(s)}`}}}async search(e=null,t=process.cwd(),n={}){let s=await P.getProjectId(t);if(!s)return{success:!1,message:"No prjct project. Run `prjct init` first."};let o=(e??"").trim();if(!o)return{success:!1,message:"search requires a query"};let{runContextTool:i}=await Promise.resolve().then(()=>(Fg(),Lg)),a=await i(["memory",o],s,t),l=a.tool!=="error",u=n.md?a.result.markdown??"":JSON.stringify(a,null,2);return{success:l,message:u}}formatContextMd(e){let t=[];if(t.push(z("Project",qm(Bm("ID",e.projectId),Bm("Path",e.globalPath)))),e.currentTask){let n=e.currentTask;if(t.push(vi({description:n.description,status:"in-progress"})),n.subtasks&&n.subtasks.length>0){let s=n.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(s.join(`
1456
+ `))}}else t.push("> No active task");return e.repoAnalysis&&t.push(z("Stack",Ir({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),O(...t)}async loadRepoAnalysis(e){try{let t=RL.join(e,"analysis","repo-analysis.json"),n=await CL.readFile(t,"utf-8"),s=JSON.parse(n);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return W(t),null}}},ox=new Xl,xL=ox});var Ug={};A(Ug,{PrimitiveCommands:()=>Hg});function AL(r){let e=r.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let n=t.indexOf(":");return n<=0?null:[t.slice(0,n),t.slice(n+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}function jL(r){if(!r)return{};let e={};for(let t of r.split(",")){let n=t.trim(),s=n.indexOf(":");s>0&&(e[n.slice(0,s)]=n.slice(s+1))}return e}function _L(r){let e=r.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let n=e.slice(0,t).toLowerCase().trim();if(!n||!/^[a-z][a-z0-9-]*$/.test(n))return{ok:!1,error:`invalid type '${n}'. Lowercase letters + dashes only. Base types: ${zs.join(", ")}`};let s=n,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:s,content:o}:{ok:!1,error:"content is required"}}var PL,Hg,Wg=h(()=>{"use strict";Ys();Te();Yn();as();Et();H();he();ae();Zo();oc();xe();Qt();PL=["feature","bug","improvement","chore"],Hg=class extends q{static{c(this,"PrimitiveCommands")}async status(e=null,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;if(e){let d=await _f(s.value,t,e);if(!d.ok){if(d.reason==="unsupported")return n.md?console.log(`> ${d.message}`):g.fail(d.message),{success:!1,error:d.message};let m=await fl(s.value,n,t);return m.ok?{success:!1,error:"No active task"}:m.result}let p=`status \u2192 ${e}`;return n.md?console.log(`\u2713 ${p}`):g.done(p),{success:!0,taskId:d.taskId,status:e}}if(!await sr(s.value,t)){let d=await K.getPausedTasks(s.value);if(d.length>0){let p=d[0],m=`Task: ${p.id} | Type: ${p.type??"unset"} | Status: paused`;return n.md?console.log(m):g.info(m),{success:!0,taskId:p.id,status:"paused"}}}let i=await fl(s.value,n,t);if(!i.ok)return i.result;let a=i.value,l=await Ri(s.value,a.id),u=`Task: ${a.id} | Type: ${a.type??"unset"} | Status: ${l??"active"}`;return n.md?console.log(u):g.info(u),{success:!0,taskId:a.id,status:l??"active"}}catch(s){let o=w(s);return $(o)}}async tag(e=null,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=await fl(s.value,n,t);if(!o.ok)return o.result;if(!e)return g.info("Usage: prjct tag <key:value> [<key:value>...]"),{success:!1,error:"No tags provided"};let i=AL(e);if(Object.keys(i).length===0)return g.fail("no valid k:v pairs (expected `key:value`)"),{success:!1,error:"Invalid tag format"};let a=i.type;a&&PL.includes(a)&&await K.updateCurrentTask(s.value,{type:a}),await Xe.log(t,"task.tagged",{taskId:o.value.id,tags:i});let l=Object.entries(i).map(([u,d])=>`${u}=${d}`).join(", ");return n.md?console.log(`\u2713 tagged ${l}`):g.done(`tagged ${l}`),{success:!0,taskId:o.value.id,tags:i}}catch(s){let o=w(s);return $(o)}}async remember(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return g.info(`Usage: prjct remember <type> "<content>" [--tags k:v,...]
1457
+ Types: ${zs.join(" | ")}`),{success:!1,error:"Missing args"};let o=_L(e);if(!o.ok)return $(o.error);let{type:i,content:a}=o,l=eo(a);if(l.length>0&&!n.force){let y=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${y}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Js(a);if(u.length>0&&!n.force)return g.fail(`refusing to store memory that looks like prompt injection (${u.join(", ")}). Entries are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let d=jL(n.tags),p=await me(t);if(!p.ok)return p.result;let m=await sr(p.value,t);await N.remember(t,{type:i,content:a,tags:d,source:m?.id});let{regenerateWikiDeferred:f}=await Promise.resolve().then(()=>($n(),xr));return await f(t,p.value),n.md?console.log(`\u2713 remembered ${i}: ${a}`):g.done(`remembered ${i}`),{success:!0,type:i,content:a,tags:d}}catch(s){let o=w(s);return $(o)}}async forget(e=null,t=process.cwd(),n={}){try{let s=(e??"").trim();if(!s)return g.info("Usage: prjct forget <id> (e.g. prjct forget mem_1234)"),{success:!1,error:"Missing id"};let o=await me(t);if(!o.ok)return o.result;if(!N.forget(o.value,s))return n.md?console.log(`\u2717 no memory entry matched ${s}`):g.fail(`no memory entry matched ${s}`),{success:!1,error:`No memory entry matched ${s}`};let{regenerateWikiDeferred:a}=await Promise.resolve().then(()=>($n(),xr));return await a(t,o.value),n.md?console.log(`\u2713 forgot ${s}`):g.done(`forgot ${s}`),{success:!0,id:s}}catch(s){let o=w(s);return $(o)}}};c(AL,"parseTagPairs");c(jL,"parseFlagTags");c(_L,"parseRememberArgs")});var Ql={};A(Ql,{SeedCommands:()=>Gg});var Gg,Zl=h(()=>{"use strict";Ym();nf();H();he();ae();xe();Gg=class extends q{static{c(this,"SeedCommands")}async seed(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list",i=s.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,n);case"remove":return this.remove(i||null,t,n);case"list":return this.list(null,t,n);case"suggest":return this.suggest(null,t,n);default:return g.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),n={}){try{if(!e)return g.info(`Usage: prjct seed add <pack>[,<pack>...]
1458
1458
  Available: ${zm.join(", ")}`),{success:!1,error:"No pack given"};let s=e.split(",").map(a=>a.trim()).filter(Boolean),o=await Zm(t,s,{suggestPersona:n.suggestPersona??!1}),i=`activated: ${o.activated.join(", ")||"none"}${o.skipped.length?` \u2022 unknown: ${o.skipped.join(", ")}`:""}`;return n.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(s){let o=w(s);return $(o)}}async remove(e=null,t=process.cwd(),n={}){try{if(!e)return g.info("Usage: prjct seed remove <pack>[,<pack>...]"),{success:!1,error:"No pack given"};let s=e.split(",").map(a=>a.trim()).filter(Boolean),o=await ef(t,s),i=`deactivated: ${o.deactivated.join(", ")||"none"}${o.notActive.length?` \u2022 not active: ${o.notActive.join(", ")}`:""}`;return n.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(s){let o=w(s);return $(o)}}async list(e=null,t=process.cwd(),n={}){try{let s=await tf(t);if(s.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${zm.join(", ")}`;return n.md?console.log(`> ${o}`):g.info(o),{success:!0,active:[]}}if(n.md){let o=["# Active packs",""];for(let i of s)o.push(`## ${i.name}`),o.push(i.description),o.push(`- memory types: ${i.memoryTypes.join(", ")||"\u2014"}`),o.push(`- workflow slots: ${i.slots.join(", ")||"\u2014"}`),o.push("");console.log(o.join(`
1459
1459
  `))}else for(let o of s)g.info(`${o.name}: ${o.description}`),g.info(` memory: ${o.memoryTypes.join(", ")||"\u2014"}`),g.info(` slots: ${o.slots.join(", ")||"\u2014"}`);return{success:!0,active:s}}catch(s){let o=w(s);return $(o)}}async suggest(e=null,t=process.cwd(),n={}){try{let s=await Qm(t),o=s.map(i=>{let a=cs[i];return{name:i,description:a?.description??""}});if(n.md){let i=["# Suggested packs for this project",""];for(let a of o)i.push(`- **${a.name}** \u2014 ${a.description}`);i.push(""),i.push(`Activate with: \`prjct seed add ${s.join(",")}\``),console.log(i.join(`
1460
- `))}else g.info(`Suggested: ${s.join(", ")}`),g.info(`Activate: prjct seed add ${s.join(",")}`);return{success:!0,suggested:s}}catch(s){let o=w(s);return $(o)}}}});var Ui={};A(Ui,{InstallCommands:()=>Bg});var Bg,Wi=h(()=>{"use strict";Ga();H();he();ae();Re();Bg=class extends q{static{c(this,"InstallCommands")}async install(e=null,t=process.cwd(),n={}){try{let s=await jd(),o=Vs.length,i=s.hooksPruned>0?`, ${s.hooksPruned} retired removed`:"",a=`installed ${s.hooksWritten} new, ${s.alreadyPresent} already present${i} (total ${o} hooks)`;return n.md?console.log(["# prjct hooks installed","",`Wrote to \`${s.settingsPath}\`.`,"",`- new: ${s.hooksWritten}`,`- already present: ${s.alreadyPresent}`,`- retired removed: ${s.hooksPruned}`,`- total expected: ${o}`,"","> Only `_prjctManaged: true` entries were touched. Your other hooks are untouched."].join(`
1460
+ `))}else g.info(`Suggested: ${s.join(", ")}`),g.info(`Activate: prjct seed add ${s.join(",")}`);return{success:!0,suggested:s}}catch(s){let o=w(s);return $(o)}}}});var Ui={};A(Ui,{InstallCommands:()=>Bg});var Bg,Wi=h(()=>{"use strict";Ga();H();he();ae();xe();Bg=class extends q{static{c(this,"InstallCommands")}async install(e=null,t=process.cwd(),n={}){try{let s=await jd(),o=Vs.length,i=s.hooksPruned>0?`, ${s.hooksPruned} retired removed`:"",a=`installed ${s.hooksWritten} new, ${s.alreadyPresent} already present${i} (total ${o} hooks)`;return n.md?console.log(["# prjct hooks installed","",`Wrote to \`${s.settingsPath}\`.`,"",`- new: ${s.hooksWritten}`,`- already present: ${s.alreadyPresent}`,`- retired removed: ${s.hooksPruned}`,`- total expected: ${o}`,"","> Only `_prjctManaged: true` entries were touched. Your other hooks are untouched."].join(`
1461
1461
  `)):(g.done(a),g.info(`settings: ${s.settingsPath}`)),{success:!0,hooksWritten:s.hooksWritten}}catch(s){let o=w(s);return $(o)}}async uninstall(e=null,t=process.cwd(),n={}){try{let s=await _d(),o=`removed ${s.hooksRemoved} prjct hook(s)`;return n.md?console.log(`# prjct hooks removed
1462
1462
 
1463
1463
  - removed: ${s.hooksRemoved}
1464
1464
  - settings: \`${s.settingsPath}\`
1465
- `):g.done(o),{success:!0,hooksRemoved:s.hooksRemoved}}catch(s){let o=w(s);return $(o)}}async status(e=null,t=process.cwd()){try{let n=await $d();return{success:!0,installed:n.installed,expected:n.expected}}catch(n){return Le(n)}}}});var Vg={};A(Vg,{CaptureCommands:()=>qg});function $L(r){if(!r)return{};let e={};for(let t of r.split(",")){let n=t.trim(),s=n.indexOf(":");s>0&&(e[n.slice(0,s)]=n.slice(s+1))}return e}var qg,Jg=h(()=>{"use strict";Ee();H();he();ae();Zo();oc();Re();qg=class extends q{static{c(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return g.info('Usage: prjct capture "<anything>" [--tags k:v,...]'),{success:!1,error:"Content required"};let s=e.trim(),o=eo(s);if(o.length>0&&!n.force)return g.fail(`refusing to capture content that looks like a secret (${o.join(", ")}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"};let i=Js(s);if(i.length>0&&!n.force)return g.fail(`refusing to capture content that looks like prompt injection (${i.join(", ")}). Captures are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let a=$L(n.tags),l=await this.ensureProjectInit(t);if(!l.success)return l;await N.remember(t,{type:"inbox",content:s,tags:a,provenance:"declared"});let u=s.length>60?`${s.slice(0,57)}\u2026`:s;return n.md?console.log(`\u2713 captured: ${u}`):g.done(`captured: ${u}`),{success:!0,type:"inbox",content:s,tags:a}}catch(s){let o=w(s);return $(o)}}};c($L,"parseFlagTags")});import Kg from"node:fs";import IL from"node:os";import eu from"node:path";var DL,Xg,ms,ix=h(()=>{"use strict";DL=[{name:"claude_ai_PostHog",displayName:"PostHog",description:"Product analytics, dashboards, feature flags, surveys",estimatedTools:280},{name:"claude_ai_Atlassian",displayName:"Atlassian (Jira + Confluence)",description:"Jira issues, Confluence pages, Compass components",estimatedTools:40},{name:"claude_ai_Supabase",displayName:"Supabase",description:"Postgres projects, migrations, edge functions, branches",estimatedTools:30},{name:"claude_ai_Google_Drive",displayName:"Google Drive",description:"Read files from your Drive (auth-gated)",estimatedTools:2},{name:"claude_ai_Linear",displayName:"Linear",description:"Issues, projects, comments",estimatedTools:25},{name:"claude_ai_GitHub",displayName:"GitHub",description:"Repos, PRs, issues (claude.ai integration, separate from gh CLI)",estimatedTools:35},{name:"claude_ai_Notion",displayName:"Notion",description:"Pages, databases, blocks",estimatedTools:20},{name:"claude_ai_Slack",displayName:"Slack",description:"Messages, channels, threads",estimatedTools:15}],Xg=class{static{c(this,"McpService")}async list(e){let t=new Set(this.readDenied(e).map(i=>i.serverName)),n=[];for(let i of DL)n.push({name:i.name,displayName:i.displayName,source:"cloud",description:i.description,estimatedTools:i.estimatedTools,denied:t.has(i.name)});let s=this.readJson(eu.join(e,".mcp.json"));if(s?.mcpServers)for(let i of Object.keys(s.mcpServers))n.push({name:i,displayName:i,source:"project",description:"stdio server declared in .mcp.json",estimatedTools:0,denied:t.has(i)});let o=this.readJson(eu.join(IL.homedir(),".claude.json"));if(o?.mcpServers)for(let i of Object.keys(o.mcpServers))n.push({name:i,displayName:i,source:"global",description:"stdio server declared in ~/.claude.json",estimatedTools:0,denied:t.has(i)});return n}async deny(e,t){let n=this.localSettingsPath(e),s=this.readJson(n)??{},o=s.deniedMcpServers??[];return o.some(a=>a.serverName===t)?{alreadyDenied:!0,settingsPath:n}:(s.deniedMcpServers=[...o,{serverName:t}],this.writeJson(n,s),{alreadyDenied:!1,settingsPath:n})}async allow(e,t){let n=this.localSettingsPath(e),s=this.readJson(n)??{},o=s.deniedMcpServers??[],i=o.filter(a=>a.serverName!==t);return i.length===o.length?{wasDenied:!1,settingsPath:n}:(i.length===0?delete s.deniedMcpServers:s.deniedMcpServers=i,this.writeJson(n,s),{wasDenied:!0,settingsPath:n})}async setEnabled(e,t,n){let s=this.localSettingsPath(e),o=this.readJson(s)??{},i=new Set((o.deniedMcpServers??[]).map(p=>p.serverName)),a=new Set(t),l=new Set(i);for(let p of n)a.has(p)?l.delete(p):l.add(p);let u=[],d=[];for(let p of n){let m=i.has(p),f=l.has(p);!m&&f?u.push(p):m&&!f&&d.push(p)}return u.length===0&&d.length===0?{nowDenied:u,nowAllowed:d,settingsPath:s}:(l.size===0?delete o.deniedMcpServers:o.deniedMcpServers=Array.from(l).map(p=>({serverName:p})),this.writeJson(s,o),{nowDenied:u,nowAllowed:d,settingsPath:s})}localSettingsPath(e){return eu.join(e,".claude","settings.local.json")}readDenied(e){return this.readJson(this.localSettingsPath(e))?.deniedMcpServers??[]}readJson(e){try{let t=Kg.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}writeJson(e,t){Kg.mkdirSync(eu.dirname(e),{recursive:!0}),Kg.writeFileSync(e,`${JSON.stringify(t,null,2)}
1466
- `,"utf-8")}},ms=new Xg});var Yg={};A(Yg,{McpCommands:()=>zg});import*as Rt from"@clack/prompts";import or from"chalk";var zg,Qg=h(()=>{"use strict";ix();H();he();dt();ae();Re();zg=class extends q{static{c(this,"McpCommands")}async mcp(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??null,i=s[1]??null;if(o===null)return!n.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,n);switch(o){case"list":return this.list(t,n);case"status":return this.status(t,n);case"deny":return this.deny(i,t,n);case"allow":return this.allow(i,t,n);default:return g.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await ms.list(e);if(t.length===0)return g.info("No MCP servers detected for this project."),{success:!0,servers:[]};let n=c(b=>b.reduce((C,R)=>C+R.estimatedTools,0),"sumTools"),s=t.filter(b=>!b.denied),o=n(s),i=n(t),a=e.split("/").pop()??"this project";Rt.intro(or.cyan.bold(`MCP servers \u2014 ${a}`)),Rt.note([`${s.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,or.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
1465
+ `):g.done(o),{success:!0,hooksRemoved:s.hooksRemoved}}catch(s){let o=w(s);return $(o)}}async status(e=null,t=process.cwd()){try{let n=await $d();return{success:!0,installed:n.installed,expected:n.expected}}catch(n){return Le(n)}}}});var Vg={};A(Vg,{CaptureCommands:()=>qg});function $L(r){if(!r)return{};let e={};for(let t of r.split(",")){let n=t.trim(),s=n.indexOf(":");s>0&&(e[n.slice(0,s)]=n.slice(s+1))}return e}var qg,Jg=h(()=>{"use strict";Te();H();he();ae();Zo();oc();xe();qg=class extends q{static{c(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return g.info('Usage: prjct capture "<anything>" [--tags k:v,...]'),{success:!1,error:"Content required"};let s=e.trim(),o=eo(s);if(o.length>0&&!n.force)return g.fail(`refusing to capture content that looks like a secret (${o.join(", ")}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"};let i=Js(s);if(i.length>0&&!n.force)return g.fail(`refusing to capture content that looks like prompt injection (${i.join(", ")}). Captures are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let a=$L(n.tags),l=await this.ensureProjectInit(t);if(!l.success)return l;await N.remember(t,{type:"inbox",content:s,tags:a,provenance:"declared"});let u=s.length>60?`${s.slice(0,57)}\u2026`:s;return n.md?console.log(`\u2713 captured: ${u}`):g.done(`captured: ${u}`),{success:!0,type:"inbox",content:s,tags:a}}catch(s){let o=w(s);return $(o)}}};c($L,"parseFlagTags")});import Kg from"node:fs";import IL from"node:os";import eu from"node:path";var DL,Xg,ms,ix=h(()=>{"use strict";DL=[{name:"claude_ai_PostHog",displayName:"PostHog",description:"Product analytics, dashboards, feature flags, surveys",estimatedTools:280},{name:"claude_ai_Atlassian",displayName:"Atlassian (Jira + Confluence)",description:"Jira issues, Confluence pages, Compass components",estimatedTools:40},{name:"claude_ai_Supabase",displayName:"Supabase",description:"Postgres projects, migrations, edge functions, branches",estimatedTools:30},{name:"claude_ai_Google_Drive",displayName:"Google Drive",description:"Read files from your Drive (auth-gated)",estimatedTools:2},{name:"claude_ai_Linear",displayName:"Linear",description:"Issues, projects, comments",estimatedTools:25},{name:"claude_ai_GitHub",displayName:"GitHub",description:"Repos, PRs, issues (claude.ai integration, separate from gh CLI)",estimatedTools:35},{name:"claude_ai_Notion",displayName:"Notion",description:"Pages, databases, blocks",estimatedTools:20},{name:"claude_ai_Slack",displayName:"Slack",description:"Messages, channels, threads",estimatedTools:15}],Xg=class{static{c(this,"McpService")}async list(e){let t=new Set(this.readDenied(e).map(i=>i.serverName)),n=[];for(let i of DL)n.push({name:i.name,displayName:i.displayName,source:"cloud",description:i.description,estimatedTools:i.estimatedTools,denied:t.has(i.name)});let s=this.readJson(eu.join(e,".mcp.json"));if(s?.mcpServers)for(let i of Object.keys(s.mcpServers))n.push({name:i,displayName:i,source:"project",description:"stdio server declared in .mcp.json",estimatedTools:0,denied:t.has(i)});let o=this.readJson(eu.join(IL.homedir(),".claude.json"));if(o?.mcpServers)for(let i of Object.keys(o.mcpServers))n.push({name:i,displayName:i,source:"global",description:"stdio server declared in ~/.claude.json",estimatedTools:0,denied:t.has(i)});return n}async deny(e,t){let n=this.localSettingsPath(e),s=this.readJson(n)??{},o=s.deniedMcpServers??[];return o.some(a=>a.serverName===t)?{alreadyDenied:!0,settingsPath:n}:(s.deniedMcpServers=[...o,{serverName:t}],this.writeJson(n,s),{alreadyDenied:!1,settingsPath:n})}async allow(e,t){let n=this.localSettingsPath(e),s=this.readJson(n)??{},o=s.deniedMcpServers??[],i=o.filter(a=>a.serverName!==t);return i.length===o.length?{wasDenied:!1,settingsPath:n}:(i.length===0?delete s.deniedMcpServers:s.deniedMcpServers=i,this.writeJson(n,s),{wasDenied:!0,settingsPath:n})}async setEnabled(e,t,n){let s=this.localSettingsPath(e),o=this.readJson(s)??{},i=new Set((o.deniedMcpServers??[]).map(p=>p.serverName)),a=new Set(t),l=new Set(i);for(let p of n)a.has(p)?l.delete(p):l.add(p);let u=[],d=[];for(let p of n){let m=i.has(p),f=l.has(p);!m&&f?u.push(p):m&&!f&&d.push(p)}return u.length===0&&d.length===0?{nowDenied:u,nowAllowed:d,settingsPath:s}:(l.size===0?delete o.deniedMcpServers:o.deniedMcpServers=Array.from(l).map(p=>({serverName:p})),this.writeJson(s,o),{nowDenied:u,nowAllowed:d,settingsPath:s})}localSettingsPath(e){return eu.join(e,".claude","settings.local.json")}readDenied(e){return this.readJson(this.localSettingsPath(e))?.deniedMcpServers??[]}readJson(e){try{let t=Kg.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}writeJson(e,t){Kg.mkdirSync(eu.dirname(e),{recursive:!0}),Kg.writeFileSync(e,`${JSON.stringify(t,null,2)}
1466
+ `,"utf-8")}},ms=new Xg});var Yg={};A(Yg,{McpCommands:()=>zg});import*as Rt from"@clack/prompts";import or from"chalk";var zg,Qg=h(()=>{"use strict";ix();H();he();dt();ae();xe();zg=class extends q{static{c(this,"McpCommands")}async mcp(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??null,i=s[1]??null;if(o===null)return!n.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,n);switch(o){case"list":return this.list(t,n);case"status":return this.status(t,n);case"deny":return this.deny(i,t,n);case"allow":return this.allow(i,t,n);default:return g.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await ms.list(e);if(t.length===0)return g.info("No MCP servers detected for this project."),{success:!0,servers:[]};let n=c(b=>b.reduce((C,R)=>C+R.estimatedTools,0),"sumTools"),s=t.filter(b=>!b.denied),o=n(s),i=n(t),a=e.split("/").pop()??"this project";Rt.intro(or.cyan.bold(`MCP servers \u2014 ${a}`)),Rt.note([`${s.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,or.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
1467
1467
  `),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((b,C)=>{if(b.source!==C.source){let R=["cloud","project","global"];return R.indexOf(b.source)-R.indexOf(C.source)}return C.estimatedTools-b.estimatedTools}),d=await Rt.multiselect({message:"Keep enabled in this project:",options:u.map(b=>({value:b.name,label:this.optionLabel(b,l[b.source]),hint:b.description})),initialValues:u.filter(b=>!b.denied).map(b=>b.name),required:!1});if(Rt.isCancel(d))return Rt.cancel("No changes."),{success:!0,cancelled:!0};let p=d,m=await ms.setEnabled(e,p,t.map(b=>b.name)),f=n(t.filter(b=>p.includes(b.name))),y=f-o;if(m.nowDenied.length===0&&m.nowAllowed.length===0)return Rt.outro(or.dim("No changes.")),{success:!0,unchanged:!0};let v=[];m.nowDenied.length>0&&v.push(or.red(`\u2717 denied (${m.nowDenied.length}): ${m.nowDenied.join(", ")}`)),m.nowAllowed.length>0&&v.push(or.green(`\u2713 allowed (${m.nowAllowed.length}): ${m.nowAllowed.join(", ")}`));let k=y>0?"+":"";return v.push(""),v.push(`Tools loaded: ${o} \u2192 ${f} (${or.bold(`${k}${y}`)})`),Rt.note(v.join(`
1468
1468
  `),`Wrote ${this.relativeSettingsPath(m.settingsPath,e)}`),Rt.outro(or.yellow("Restart Claude Code to apply (MCP config is cached at session start).")),{success:!0,...m,beforeTools:o,afterTools:f}}catch(t){let n=w(t);return $(n)}}optionLabel(e,t){let n=e.estimatedTools>0?or.dim(` ~${e.estimatedTools} tools`):"";return`${or.dim(`[${t}]`)} ${e.displayName}${n}`}relativeSettingsPath(e,t){return e.startsWith(t)?e.slice(t.length+1):e}async list(e,t){try{let n=await ms.list(e);return t.md?console.log(this.formatMd(n,!1)):this.formatTerminal(n,!1),{success:!0,servers:n}}catch(n){let s=w(n);return $(s)}}async status(e,t){try{let s=(await ms.list(e)).filter(o=>o.denied);return t.md?console.log(this.formatMd(s,!0)):this.formatTerminal(s,!0),{success:!0,denied:s}}catch(n){let s=w(n);return $(s)}}async deny(e,t,n){if(!e)return g.fail("Usage: prjct mcp deny <serverName>"),{success:!1,error:"Missing serverName"};try{let s=await ms.deny(t,e),o=s.alreadyDenied?"already denied":"denied",i=`${e} ${o} in this project`;return n.md?console.log(O(z("Done",i),z("What to do next",this.restartHint(s.settingsPath)))):(g.done(i),console.log(this.restartHint(s.settingsPath))),{success:!0,...s}}catch(s){let o=w(s);return $(o)}}async allow(e,t,n){if(!e)return g.fail("Usage: prjct mcp allow <serverName>"),{success:!1,error:"Missing serverName"};try{let s=await ms.allow(t,e),o=s.wasDenied?`${e} re-allowed in this project`:`${e} was not denied \u2014 nothing to change`;return n.md?console.log(O(z("Done",o),s.wasDenied?z("What to do next",this.restartHint(s.settingsPath)):null)):(g.done(o),s.wasDenied&&console.log(this.restartHint(s.settingsPath))),{success:!0,...s}}catch(s){let o=w(s);return $(o)}}formatTerminal(e,t){if(e.length===0){t?g.info("No MCP servers denied in this project."):g.info("No MCP servers detected.");return}let n=e.filter(o=>o.denied).reduce((o,i)=>o+i.estimatedTools,0),s=e.filter(o=>!o.denied).reduce((o,i)=>o+i.estimatedTools,0);t||console.log(`
1469
1469
  MCP servers \u2014 this project (${process.cwd().split("/").pop()})
@@ -1481,7 +1481,7 @@ Nothing to show.
1481
1481
  `}return`${r.replace(/\s+$/,"")}
1482
1482
 
1483
1483
  ${e}
1484
- `}var Zg,ax,cx,th,LL,rh=h(()=>{"use strict";Q();Ee();yc();H();J();he();dt();ae();_e();Re();Zg=OL(ML),ax="<!-- prjct-team:start - DO NOT REMOVE THIS MARKER -->",cx="<!-- prjct-team:end - DO NOT REMOVE THIS MARKER -->";c(eh,"renderTeamMirror");th=class extends q{static{c(this,"TeamCommands")}async team(e=null,t=process.cwd(),n={}){if(e==="check")return this.check(t,n);try{let s={required:n.required===!0,minVersion:n.minVersion??te??"0.0.0",enrolledAt:new Date().toISOString(),enrolledBy:null},o=ko.join(t,".prjct","team.json"),i=ko.join(t,".claude","CLAUDE.md"),a=await this.ensureProjectInit(t);if(!a.success)return a;let l=await P.getProjectId(t);if(!l)return $("No prjct project. Run `prjct init` first.",n);no.set(l,s);try{await Gr(o,eh(s))}catch(C){let R=w(C);await N.remember(t,{type:"inbox",content:`team.json mirror write failed: ${R}`,tags:{"mirror-drift":"1"},provenance:"declared"}).catch(()=>{})}await fs.mkdir(ko.dirname(i),{recursive:!0});let u=FL(s),d="";try{d=await fs.readFile(i,"utf-8")}catch{}let p=HL(d,u,ax,cx);await fs.writeFile(i,p,"utf-8");let m=!1,f=[o,i];try{await Zg("git rev-parse --show-toplevel",{cwd:t});let C=null;n.enforce===!0&&(C=ko.join(t,".githooks","pre-commit"),await fs.mkdir(ko.dirname(C),{recursive:!0}),await fs.writeFile(C,LL,"utf-8"),await fs.chmod(C,493),await Zg("git config core.hooksPath .githooks",{cwd:t}),f.push(C)),await Zg(`git add ${f.map(R=>JSON.stringify(R)).join(" ")}`,{cwd:t}),m=!0}catch{}let y=n.enforce?" + pre-commit enforce":"",v=`${s.required?"\u2713 team mode (required)":"\u2713 team mode (optional)"}${y} \u2014 minVersion ${s.minVersion}`,k=m?`Staged: ${f.map(C=>C.replace(`${t}/`,"")).join(", ")}`:"Files written but not staged (no git repo or git missing).",b=["1. Review the diff: `git diff --staged`",'2. Commit: `git commit -m "chore: enroll repo in prjct team mode"`',"3. Push: `git push`","4. Teammates run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` (or `npm install -g prjct-cli@latest`).",...n.enforce?["5. **Each teammate** runs `git config core.hooksPath .githooks` once (or `prjct team --enforce` to do it automatically)."]:[]].join(`
1484
+ `}var Zg,ax,cx,th,LL,rh=h(()=>{"use strict";Q();Te();yc();H();J();he();dt();ae();_e();xe();Zg=OL(ML),ax="<!-- prjct-team:start - DO NOT REMOVE THIS MARKER -->",cx="<!-- prjct-team:end - DO NOT REMOVE THIS MARKER -->";c(eh,"renderTeamMirror");th=class extends q{static{c(this,"TeamCommands")}async team(e=null,t=process.cwd(),n={}){if(e==="check")return this.check(t,n);try{let s={required:n.required===!0,minVersion:n.minVersion??te??"0.0.0",enrolledAt:new Date().toISOString(),enrolledBy:null},o=ko.join(t,".prjct","team.json"),i=ko.join(t,".claude","CLAUDE.md"),a=await this.ensureProjectInit(t);if(!a.success)return a;let l=await P.getProjectId(t);if(!l)return $("No prjct project. Run `prjct init` first.",n);no.set(l,s);try{await Gr(o,eh(s))}catch(C){let R=w(C);await N.remember(t,{type:"inbox",content:`team.json mirror write failed: ${R}`,tags:{"mirror-drift":"1"},provenance:"declared"}).catch(()=>{})}await fs.mkdir(ko.dirname(i),{recursive:!0});let u=FL(s),d="";try{d=await fs.readFile(i,"utf-8")}catch{}let p=HL(d,u,ax,cx);await fs.writeFile(i,p,"utf-8");let m=!1,f=[o,i];try{await Zg("git rev-parse --show-toplevel",{cwd:t});let C=null;n.enforce===!0&&(C=ko.join(t,".githooks","pre-commit"),await fs.mkdir(ko.dirname(C),{recursive:!0}),await fs.writeFile(C,LL,"utf-8"),await fs.chmod(C,493),await Zg("git config core.hooksPath .githooks",{cwd:t}),f.push(C)),await Zg(`git add ${f.map(R=>JSON.stringify(R)).join(" ")}`,{cwd:t}),m=!0}catch{}let y=n.enforce?" + pre-commit enforce":"",v=`${s.required?"\u2713 team mode (required)":"\u2713 team mode (optional)"}${y} \u2014 minVersion ${s.minVersion}`,k=m?`Staged: ${f.map(C=>C.replace(`${t}/`,"")).join(", ")}`:"Files written but not staged (no git repo or git missing).",b=["1. Review the diff: `git diff --staged`",'2. Commit: `git commit -m "chore: enroll repo in prjct team mode"`',"3. Push: `git push`","4. Teammates run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` (or `npm install -g prjct-cli@latest`).",...n.enforce?["5. **Each teammate** runs `git config core.hooksPath .githooks` once (or `prjct team --enforce` to do it automatically)."]:[]].join(`
1485
1485
  `);return n.md?console.log(O(z("Team mode enrolled",v),z("Files",k),z("Next",b))):(g.done(v),console.log(k),console.log(`
1486
1486
  Next steps:`),console.log(b)),{success:!0,teamConfig:s,staged:m,teamPath:o,claudeMdPath:i}}catch(s){let o=w(s);return $(o)}}async check(e=process.cwd(),t={}){try{let n=await this.ensureProjectInit(e);if(!n.success)return n;let s=await P.getProjectId(e);if(!s)return $("No prjct project. Run `prjct init` first.",t);let o=ko.join(e,".prjct","team.json"),i=no.get(s),a=null;try{a=await fs.readFile(o,"utf-8")}catch{a=null}if(i===null&&a!==null){let u;try{u=JSON.parse(a)}catch{return L(`cannot parse ${o} \u2014 fix or delete the file before running team check again`,t)}let d={required:typeof u.required=="boolean"?u.required:!1,minVersion:typeof u.minVersion=="string"?u.minVersion:te??"0.0.0",enrolledAt:typeof u.enrolledAt=="string"?u.enrolledAt:new Date().toISOString(),enrolledBy:typeof u.enrolledBy=="string"?u.enrolledBy:null};no.set(s,d),await Gr(o,eh(d));let p="\u2713 team check: migrated disk \u2192 DB; mirror rewritten";return t.md?console.log(`> ${p}`):g.done(p),{success:!0,healed:!0,migrated:!0}}if(i!==null){let u=gc(i);if((a===null?null:NL(a,i))===u){let m="\u2713 team check: mirror in sync";return t.md?console.log(`> ${m}`):g.done(m),{success:!0,healed:!1}}await Gr(o,eh(i));let p="\u2713 team check: drift detected; mirror rewritten from DB";return t.md?console.log(`> ${p}`):g.done(p),{success:!0,healed:!0}}let l="\u2713 team check: no enrollment configured";return t.md?console.log(`> ${l}`):g.done(l),{success:!0,healed:!1,empty:!0}}catch(n){return $(w(n),t)}}};c(NL,"canonicalizeDiskTeamJson");LL=`#!/usr/bin/env sh
1487
1487
  # prjct team enforce \u2014 blocks commits when team.json says required:true
@@ -1507,12 +1507,12 @@ if ! command -v prjct >/dev/null 2>&1; then
1507
1507
  fi
1508
1508
 
1509
1509
  exit 0
1510
- `;c(FL,"teamClaudeMdBlock");c(HL,"upsertBetweenMarkers")});var oh={};A(oh,{ConfigCommands:()=>sh});function UL(r){let e=r.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(r);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(r)?t:r}var sh,ih=h(()=>{"use strict";ia();dt();ae();Re();sh=class extends q{static{c(this,"ConfigCommands")}async config(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list";switch(o){case"list":return this.list(n);case"get":return this.get(s[1],n);case"set":return this.set(s[1],s.slice(2).join(" "),n);case"unset":return this.unset(s[1],n);default:return g.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=gy(),n=Object.keys(t).sort();if(e.md){let s=n.length===0?"_No global config set._":n.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
1511
- `);console.log(O(z("Global config",s),z("Path",`\`${yy()}\``)))}else if(n.length===0)g.info("No global config set.");else for(let s of n)console.log(` ${s} = ${JSON.stringify(t[s])}`);return{success:!0,config:t}}get(e,t){if(!e)return g.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let n=Pt(e);return t.md?console.log(O(z(e,n===void 0?"_(unset)_":`\`${JSON.stringify(n)}\``))):n===void 0?g.info("(unset)"):console.log(JSON.stringify(n)),{success:!0,key:e,value:n}}set(e,t,n){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let s=UL(t);Oe(e,s);let o=`${e} = ${JSON.stringify(s)}`;return n.md?console.log(O(z("Set",o))):g.done(o),{success:!0,key:e,value:s}}unset(e,t){if(!e)return g.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};hy(e);let n=`Removed ${e}`;return t.md?console.log(O(z("Unset",n))):g.done(n),{success:!0,key:e}}};c(UL,"parseValue")});var ch={};A(ch,{EmbeddingsCommands:()=>ah});function WL(r){if(/\b401\b|invalid_api_key|incorrect api key|unauthor/i.test(r))return"The endpoint rejected the key (401). The base URL must match the key's provider \u2014 e.g. an OpenRouter key (sk-or-\u2026) needs `--base-url https://openrouter.ai/api/v1`, not OpenAI's. Re-set with: prjct embeddings set --key <api-key> --base-url <url>";if(/\b404\b|not found/i.test(r))return"No /embeddings route at that base URL (404). Check the base URL is the provider's OpenAI-compatible root (e.g. https://openrouter.ai/api/v1, https://api.openai.com/v1).";if(/ENOTFOUND|ECONNREFUSED|fetch failed|getaddrinfo|ETIMEDOUT/i.test(r))return"Could not reach the endpoint. Check the base URL and your network: prjct embeddings status"}function Nr(r,e){let t=r.indexOf(`--${e}`);if(t>=0&&r[t+1])return r[t+1];let n=r.find(s=>s.startsWith(`--${e}=`));return n?n.slice(e.length+3):void 0}function GL(r){if(!r?.trim())return;let e={};for(let t of r.split(",")){let n=t.indexOf("=");if(n<=0)continue;let s=t.slice(0,n).trim(),o=t.slice(n+1).trim();s&&(e[s]=o)}return Object.keys(e).length?e:void 0}var ah,lh=h(()=>{"use strict";Ll();Ml();H();he();ae();Re();c(WL,"embeddingsFailureHint");c(Nr,"flag");c(GL,"parseHeaderPairs");ah=class extends q{static{c(this,"EmbeddingsCommands")}async embeddings(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"status";switch(o){case"set":return this.set(s.slice(1),n);case"status":return this.status(n);case"test":return this.test(n);case"clear":return this.clear(n);default:return $(`Unknown subcommand '${o}'. Use: set --key <K> [--model <M>] [--base-url <U>] | status | test | clear`)}}async set(e,t){let n=t.key??Nr(e,"key"),s=t.model??Nr(e,"model"),o=t.baseUrl??Nr(e,"base-url")??Nr(e,"baseUrl"),i;if(!o&&n){let y=Vf(n);y&&(o=y.baseUrl,i=y.provider)}let a=t.authHeader??Nr(e,"auth-header"),l=t.authScheme??Nr(e,"auth-scheme"),u=l===void 0?void 0:/^none$/i.test(l)?"":l,d=GL(t.headers??Nr(e,"headers")),p=t.query??Nr(e,"query");if(!n&&!s&&!o&&a===void 0&&u===void 0&&!d&&p===void 0)return $('Nothing to set. Usage: prjct embeddings set --key <api-key> [--model <id>] [--base-url <url>] [--auth-header <h>] [--auth-scheme <s|none>] [--headers "k=v,..."] [--query <qs>]');let m;if(n)try{m=await IC(n)}catch(y){return $(`Could not store the key securely: ${w(y)}`)}let f=Qf({model:s,baseUrl:o,authHeader:a,authScheme:u,extraHeaders:d,query:p});return g.done("Global embeddings configured (applies to all projects)"),i&&g.info(`detected: ${i} (from key prefix)`),g.info(`provider: ${f.provider}`),g.info(`model: ${f.model}`),g.info(`base URL: ${f.baseUrl}`),f.authHeader&&g.info(`auth hdr: ${f.authHeader}`),f.authScheme!==void 0&&g.info(`auth: ${f.authScheme?f.authScheme:"(raw key, no scheme)"}`),f.query&&g.info(`query: ${f.query}`),f.extraHeaders&&g.info(`headers: ${Object.keys(f.extraHeaders).join(", ")}`),m&&g.info(`api key: stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`),g.info("Each project re-vectorizes on its next session (Stop hook). Run `prjct embeddings test` to validate now."),{success:!0}}async status(e){let t=ds(),n=await $C();return t?(g.done("Global embeddings: configured"),g.info(`provider: ${t.provider}`),g.info(`model: ${t.model}`),g.info(`base URL: ${t.baseUrl}`),t.authHeader&&g.info(`auth hdr: ${t.authHeader}`),t.authScheme!==void 0&&g.info(`auth: ${t.authScheme?t.authScheme:"(raw key, no scheme)"}`),t.query&&g.info(`query: ${t.query}`),t.extraHeaders&&g.info(`headers: ${Object.keys(t.extraHeaders).join(", ")}`),g.info(`api key: ${n==="none"?"MISSING \u2014 set with `prjct embeddings set --key <api-key>`":`present (${n})`}`),{success:!0,configured:!0}):(g.info("Global embeddings: not configured \u2014 using the built-in local subword embedder."),g.info(`api key: ${n==="none"?"none":`present (${n})`}`),g.info("Set one with: prjct embeddings set --key <api-key>"),{success:!0,configured:!1})}async test(e){let t=Nl(null);try{let[n]=await t.embed(["prjct embeddings connectivity probe"]);return!n||n.length===0?$(`Provider '${t.model}' returned an empty vector.`,e):(g.done(`OK \u2014 '${t.model}' returned a ${n.length}-dim vector.`),t.isLocal&&g.info("This is the local embedder. Set a key to upgrade: prjct embeddings set --key <api-key>"),{success:!0,model:t.model,dims:n.length})}catch(n){let s=w(n);pn(`Embedding test failed for '${t.model}'.`,e),Kp(s,e);let o=WL(s);return o&&Kp(o,e),{success:!1,error:s}}}async clear(e){return await DC(),Zf(),g.done("Cleared global embeddings \u2014 semantic recall falls back to the local embedder."),g.info(`(Default model when you reconfigure: ${Il}.)`),{success:!0}}}});var dh={};A(dh,{GuardCommands:()=>uh});var uh,ph=h(()=>{"use strict";Xt();Ee();Al();ae();Re();Qt();uh=class extends q{static{c(this,"GuardCommands")}async guard(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean)[0];if(!s){let u="Usage: prjct guard <file> \u2014 surfaces preventive memory before you edit it.";return n.md?console.log(`> ${u}`):g.fail(u),{success:!1,error:"Missing file argument"}}let o=await me(t,n);if(!o.ok)return o.result;let i=typeof n.limit=="number"&&n.limit>0?n.limit:3,a;try{a=N.recallForFile(o.value,s,i)}catch{a=[]}ho(o.value,t,a.map(u=>u.id));let l=s.split("/").pop()??s;if(a.length===0){let u=`No preventive memory recorded against \`${l}\` \u2014 clear to edit.`;return n.md?console.log(`> ${u}`):g.done(`No preventive memory for ${l} \u2014 clear to edit.`),{success:!0,file:s,hits:0}}if(n.md){let u=[`# prjct: heads up before editing \`${l}\``,"","Preventive memory recorded against this file \u2014 check before you change it:",""];for(let d of a)u.push(`- **[${ei(d)}] ${He(d)}** \u2014 ${ti(d.content)} \`${d.id}\``);u.push("","> Surfaced as prevention. Apply if relevant; ignore if not."),console.log(u.join(`
1510
+ `;c(FL,"teamClaudeMdBlock");c(HL,"upsertBetweenMarkers")});var oh={};A(oh,{ConfigCommands:()=>sh});function UL(r){let e=r.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(r);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(r)?t:r}var sh,ih=h(()=>{"use strict";ia();dt();ae();xe();sh=class extends q{static{c(this,"ConfigCommands")}async config(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list";switch(o){case"list":return this.list(n);case"get":return this.get(s[1],n);case"set":return this.set(s[1],s.slice(2).join(" "),n);case"unset":return this.unset(s[1],n);default:return g.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=gy(),n=Object.keys(t).sort();if(e.md){let s=n.length===0?"_No global config set._":n.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
1511
+ `);console.log(O(z("Global config",s),z("Path",`\`${yy()}\``)))}else if(n.length===0)g.info("No global config set.");else for(let s of n)console.log(` ${s} = ${JSON.stringify(t[s])}`);return{success:!0,config:t}}get(e,t){if(!e)return g.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let n=Pt(e);return t.md?console.log(O(z(e,n===void 0?"_(unset)_":`\`${JSON.stringify(n)}\``))):n===void 0?g.info("(unset)"):console.log(JSON.stringify(n)),{success:!0,key:e,value:n}}set(e,t,n){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let s=UL(t);Oe(e,s);let o=`${e} = ${JSON.stringify(s)}`;return n.md?console.log(O(z("Set",o))):g.done(o),{success:!0,key:e,value:s}}unset(e,t){if(!e)return g.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};hy(e);let n=`Removed ${e}`;return t.md?console.log(O(z("Unset",n))):g.done(n),{success:!0,key:e}}};c(UL,"parseValue")});var ch={};A(ch,{EmbeddingsCommands:()=>ah});function WL(r){if(/\b401\b|invalid_api_key|incorrect api key|unauthor/i.test(r))return"The endpoint rejected the key (401). The base URL must match the key's provider \u2014 e.g. an OpenRouter key (sk-or-\u2026) needs `--base-url https://openrouter.ai/api/v1`, not OpenAI's. Re-set with: prjct embeddings set --key <api-key> --base-url <url>";if(/\b404\b|not found/i.test(r))return"No /embeddings route at that base URL (404). Check the base URL is the provider's OpenAI-compatible root (e.g. https://openrouter.ai/api/v1, https://api.openai.com/v1).";if(/ENOTFOUND|ECONNREFUSED|fetch failed|getaddrinfo|ETIMEDOUT/i.test(r))return"Could not reach the endpoint. Check the base URL and your network: prjct embeddings status"}function Nr(r,e){let t=r.indexOf(`--${e}`);if(t>=0&&r[t+1])return r[t+1];let n=r.find(s=>s.startsWith(`--${e}=`));return n?n.slice(e.length+3):void 0}function GL(r){if(!r?.trim())return;let e={};for(let t of r.split(",")){let n=t.indexOf("=");if(n<=0)continue;let s=t.slice(0,n).trim(),o=t.slice(n+1).trim();s&&(e[s]=o)}return Object.keys(e).length?e:void 0}var ah,lh=h(()=>{"use strict";Ll();Ml();H();he();ae();xe();c(WL,"embeddingsFailureHint");c(Nr,"flag");c(GL,"parseHeaderPairs");ah=class extends q{static{c(this,"EmbeddingsCommands")}async embeddings(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"status";switch(o){case"set":return this.set(s.slice(1),n);case"status":return this.status(n);case"test":return this.test(n);case"clear":return this.clear(n);default:return $(`Unknown subcommand '${o}'. Use: set --key <K> [--model <M>] [--base-url <U>] | status | test | clear`)}}async set(e,t){let n=t.key??Nr(e,"key"),s=t.model??Nr(e,"model"),o=t.baseUrl??Nr(e,"base-url")??Nr(e,"baseUrl"),i;if(!o&&n){let y=Vf(n);y&&(o=y.baseUrl,i=y.provider)}let a=t.authHeader??Nr(e,"auth-header"),l=t.authScheme??Nr(e,"auth-scheme"),u=l===void 0?void 0:/^none$/i.test(l)?"":l,d=GL(t.headers??Nr(e,"headers")),p=t.query??Nr(e,"query");if(!n&&!s&&!o&&a===void 0&&u===void 0&&!d&&p===void 0)return $('Nothing to set. Usage: prjct embeddings set --key <api-key> [--model <id>] [--base-url <url>] [--auth-header <h>] [--auth-scheme <s|none>] [--headers "k=v,..."] [--query <qs>]');let m;if(n)try{m=await IC(n)}catch(y){return $(`Could not store the key securely: ${w(y)}`)}let f=Qf({model:s,baseUrl:o,authHeader:a,authScheme:u,extraHeaders:d,query:p});return g.done("Global embeddings configured (applies to all projects)"),i&&g.info(`detected: ${i} (from key prefix)`),g.info(`provider: ${f.provider}`),g.info(`model: ${f.model}`),g.info(`base URL: ${f.baseUrl}`),f.authHeader&&g.info(`auth hdr: ${f.authHeader}`),f.authScheme!==void 0&&g.info(`auth: ${f.authScheme?f.authScheme:"(raw key, no scheme)"}`),f.query&&g.info(`query: ${f.query}`),f.extraHeaders&&g.info(`headers: ${Object.keys(f.extraHeaders).join(", ")}`),m&&g.info(`api key: stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`),g.info("Each project re-vectorizes on its next session (Stop hook). Run `prjct embeddings test` to validate now."),{success:!0}}async status(e){let t=ds(),n=await $C();return t?(g.done("Global embeddings: configured"),g.info(`provider: ${t.provider}`),g.info(`model: ${t.model}`),g.info(`base URL: ${t.baseUrl}`),t.authHeader&&g.info(`auth hdr: ${t.authHeader}`),t.authScheme!==void 0&&g.info(`auth: ${t.authScheme?t.authScheme:"(raw key, no scheme)"}`),t.query&&g.info(`query: ${t.query}`),t.extraHeaders&&g.info(`headers: ${Object.keys(t.extraHeaders).join(", ")}`),g.info(`api key: ${n==="none"?"MISSING \u2014 set with `prjct embeddings set --key <api-key>`":`present (${n})`}`),{success:!0,configured:!0}):(g.info("Global embeddings: not configured \u2014 using the built-in local subword embedder."),g.info(`api key: ${n==="none"?"none":`present (${n})`}`),g.info("Set one with: prjct embeddings set --key <api-key>"),{success:!0,configured:!1})}async test(e){let t=Nl(null);try{let[n]=await t.embed(["prjct embeddings connectivity probe"]);return!n||n.length===0?$(`Provider '${t.model}' returned an empty vector.`,e):(g.done(`OK \u2014 '${t.model}' returned a ${n.length}-dim vector.`),t.isLocal&&g.info("This is the local embedder. Set a key to upgrade: prjct embeddings set --key <api-key>"),{success:!0,model:t.model,dims:n.length})}catch(n){let s=w(n);pn(`Embedding test failed for '${t.model}'.`,e),Kp(s,e);let o=WL(s);return o&&Kp(o,e),{success:!1,error:s}}}async clear(e){return await DC(),Zf(),g.done("Cleared global embeddings \u2014 semantic recall falls back to the local embedder."),g.info(`(Default model when you reconfigure: ${Il}.)`),{success:!0}}}});var dh={};A(dh,{GuardCommands:()=>uh});var uh,ph=h(()=>{"use strict";Xt();Te();Al();ae();xe();Qt();uh=class extends q{static{c(this,"GuardCommands")}async guard(e=null,t=process.cwd(),n={}){let s=(e??"").trim().split(/\s+/).filter(Boolean)[0];if(!s){let u="Usage: prjct guard <file> \u2014 surfaces preventive memory before you edit it.";return n.md?console.log(`> ${u}`):g.fail(u),{success:!1,error:"Missing file argument"}}let o=await me(t,n);if(!o.ok)return o.result;let i=typeof n.limit=="number"&&n.limit>0?n.limit:3,a;try{a=N.recallForFile(o.value,s,i)}catch{a=[]}ho(o.value,t,a.map(u=>u.id));let l=s.split("/").pop()??s;if(a.length===0){let u=`No preventive memory recorded against \`${l}\` \u2014 clear to edit.`;return n.md?console.log(`> ${u}`):g.done(`No preventive memory for ${l} \u2014 clear to edit.`),{success:!0,file:s,hits:0}}if(n.md){let u=[`# prjct: heads up before editing \`${l}\``,"","Preventive memory recorded against this file \u2014 check before you change it:",""];for(let d of a)u.push(`- **[${ei(d)}] ${He(d)}** \u2014 ${ti(d.content)} \`${d.id}\``);u.push("","> Surfaced as prevention. Apply if relevant; ignore if not."),console.log(u.join(`
1512
1512
  `))}else{g.info(`\u26A0 ${a.length} preventive memory entr${a.length===1?"y":"ies"} for ${l}:`);for(let u of a)g.info(` \u2022 [${ei(u)}] ${He(u)} \u2014 ${ti(u.content,120)} (${u.id})`)}return{success:!0,file:s,hits:a.length}}}});var px={};A(px,{buildInventory:()=>JL,renderInventoryMd:()=>ZL});import lx from"node:fs/promises";import bo from"node:path";async function JL(r,e){let t=Ae.list(e,{includeArchived:!0}),n={};for(let d of t)n[d.status]=(n[d.status]??0)+1;let s=new Map,o=new Set;for(let d of t){let p=KL(d);if(!p)continue;o.add(p);let m=s.get(p)??[];m.push(d),s.set(p,m)}let i=await XL(r);for(let d of i)o.add(d);let a=[],l=[];for(let d of[...o].sort()){let p=s.get(d)??[],m=await zL(r,d),f=await YL(r,d,p),y=p.length>0?p.reduce((k,b)=>b.updatedAt>k?b.updatedAt:k,""):null,v=!1;for(let k of p.filter(b=>b.status==="shipped")){let b=await QL(r,k);l.push({specId:k.id,title:k.title,status:k.status,drift:b.drift,locChanged:b.locChanged,cosmeticOnly:b.cosmeticOnly}),b.drift===!0?v=!0:b.drift==="unknown"&&v===!1&&(v="unknown")}a.push({module:d,specCount:p.length,coveredFiles:f,totalFiles:m,coveredPct:m===0?null:Math.round(f/m*1e4)/100,lastUpdated:y||null,drift:v})}let u=a.filter(d=>d.specCount===0).map(d=>d.module);return{generatedAt:new Date().toISOString(),projectPath:r,totalSpecs:t.length,byStatus:n,modules:a,driftDetail:l,uncoveredModules:u}}function KL(r){let e=r.content.scope[0];if(!e)return null;let t=e.match(/([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+)/);if(!t)return null;let n=t[1].split("/").slice(0,2);return n.length===2?n.join("/"):null}async function XL(r){let e=bo.join(r,"core");try{return(await lx.readdir(e,{withFileTypes:!0})).filter(n=>n.isDirectory()&&!n.name.startsWith(".")&&!n.name.startsWith("__")).map(n=>`core/${n.name}`)}catch{return[]}}async function zL(r,e){let t=bo.join(r,e),n=0;try{await mh(t,async s=>{let o=bo.relative(r,s);ux(o)||dx(o)&&n++})}catch{}return n}async function YL(r,e,t){let n=bo.join(r,e),s=new Set;for(let i of t)for(let a of i.content.scope){let l=a.match(/[a-zA-Z0-9_./-]+\.[a-z]+/);l&&s.add(l[0])}let o=0;try{await mh(n,async i=>{let a=bo.relative(r,i);if(!ux(a)&&dx(a)){for(let l of s)if(a===l||a.startsWith(l.endsWith("/")?l:`${l}/`)){o++;break}}})}catch{}return o}async function mh(r,e){let t;try{t=await lx.readdir(r,{withFileTypes:!0})}catch{return}for(let n of t){if(n.name.startsWith(".")||n.name==="node_modules"||n.name==="dist")continue;let s=bo.join(r,n.name);n.isDirectory()?await mh(s,e):n.isFile()&&await e(s)}}function ux(r){return VL.some(e=>e.test(r))}function dx(r){return/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(r)}async function QL(r,e){if(!e.shippedSha)return{drift:"unknown"};let t=e.content.scope.map(o=>o.match(/[a-zA-Z0-9_./-]+\.[a-z]+/)?.[0]??o.match(/[a-zA-Z0-9_./-]+\//)?.[0]).filter(o=>!!o);if(t.length===0)return{drift:"unknown"};let n=0;try{let{stdout:o}=await re("git",["diff","--shortstat",`${e.shippedSha}..HEAD`,"--",...t],{cwd:r}),i=o.match(/(\d+) insertions?/),a=o.match(/(\d+) deletions?/);n=(i?Number.parseInt(i[1],10):0)+(a?Number.parseInt(a[1],10):0)}catch{return{drift:"unknown"}}if(n<=BL)return{drift:!1,locChanged:n,cosmeticOnly:!1};let s=!0;try{let{stdout:o}=await re("git",["log","--format=%s",`${e.shippedSha}..HEAD`,"--",...t],{cwd:r}),i=o.split(`
1513
1513
  `).filter(Boolean);if(i.length===0)return{drift:!1,locChanged:n,cosmeticOnly:!0};s=i.every(a=>qL.test(a))}catch{s=!1}return{drift:!s,locChanged:n,cosmeticOnly:s}}function ZL(r){let e=[];if(e.push("# Spec inventory"),e.push(""),e.push(`_${r.totalSpecs} specs across ${r.modules.length} modules \xB7 generated ${r.generatedAt}_`),e.push(""),Object.keys(r.byStatus).length>0){e.push("## By status");for(let[t,n]of Object.entries(r.byStatus))e.push(`- ${t}: ${n}`);e.push("")}e.push("## Coverage by module"),e.push(""),e.push("| Module | Specs | Files | Covered | % | Drift | Last updated |"),e.push("|---|---|---|---|---|---|---|");for(let t of r.modules){let n=t.coveredPct===null?"n/a":`${t.coveredPct}%`,s=t.drift===!0?"\u26A0\uFE0F yes":t.drift==="unknown"?"\u2754":"\u2713",o=t.lastUpdated?t.lastUpdated.slice(0,10):"\u2014";e.push(`| \`${t.module}\` | ${t.specCount} | ${t.totalFiles} | ${t.coveredFiles} | ${n} | ${s} | ${o} |`)}if(r.uncoveredModules.length>0){e.push(""),e.push("## Modules with NO specs");for(let t of r.uncoveredModules)e.push(`- \`${t}\``)}return e.join(`
1514
- `)}var BL,qL,VL,mx=h(()=>{"use strict";di();Ce();BL=5,qL=/^(chore|style|format|fmt|docs|typo)(\(|:|!)/i,VL=[/(^|\/)types\.ts$/,/(^|\/)types\//,/\/__tests__\//,/\.d\.ts$/,/(^|\/)index\.ts$/,/\.test\.ts$/,/\.spec\.ts$/];c(JL,"buildInventory");c(KL,"inferModule");c(XL,"listTopLevelModules");c(zL,"countModuleFiles");c(YL,"countCoveredFiles");c(mh,"walk");c(ux,"excluded");c(dx,"isCodeFile");c(QL,"driftForSpec");c(ZL,"renderInventoryMd")});var gh={};A(gh,{SpecCommands:()=>fh,renderAuditDispatch:()=>sf});function eF(r){if(!r)return{};let e={};for(let t of r.split(",")){let n=t.trim(),s=n.indexOf(":");s>0&&(e[n.slice(0,s)]=n.slice(s+1))}return e}function tF(r){let e=r.content,t=[`# ${r.title}`,"",`**id:** \`${r.id}\` \xB7 **status:** ${r.status} \xB7 **created:** ${r.createdAt}`,"","## Goal",e.goal];if(e.eli10&&t.push("","## ELI10",e.eli10),e.stakes&&t.push("","## Stakes",e.stakes),e.acceptance_criteria.length>0){t.push("","## Acceptance criteria");for(let n of e.acceptance_criteria)t.push(`- [ ] ${n}`)}if(e.scope.length>0){t.push("","## Scope");for(let n of e.scope)t.push(`- ${n}`)}if(e.out_of_scope.length>0){t.push("","## Out of scope");for(let n of e.out_of_scope)t.push(`- ${n}`)}if(e.risks.length>0){t.push("","## Risks");for(let n of e.risks)t.push(`- **${n.risk}** \u2014 ${n.mitigation}`)}if(e.test_plan.length>0){t.push("","## Test plan");for(let n of e.test_plan)t.push(`- ${n}`)}if(e.reviews&&Object.keys(e.reviews).length>0){t.push("","## Reviews");for(let[n,s]of Object.entries(e.reviews))t.push(`- **${n}:** ${s.verdict} \u2014 ${s.notes} _(${s.ts})_`)}return e.linked_tasks.length>0&&t.push("","## Linked tasks",...e.linked_tasks.map(n=>`- ${n}`)),e.notes&&t.push("","## Notes",e.notes),t.join(`
1515
- `)}var fh,hh=h(()=>{"use strict";Q();of();kl();H();cc();he();ae();Re();fh=class extends q{static{c(this,"SpecCommands")}async draft(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return g.info('Usage: prjct spec "<title>" [--goal "..."] [--tags k:v,...]'),{success:!1,error:"Title required"};let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=n.goal?.trim()||e.trim(),i=eF(n.tags),a=await Ct.create(t,{title:e.trim(),content:{goal:o},tags:i,autoContext:!n.skipContext});return n.md?console.log(`\u2713 spec drafted: ${a.title}
1514
+ `)}var BL,qL,VL,mx=h(()=>{"use strict";di();Re();BL=5,qL=/^(chore|style|format|fmt|docs|typo)(\(|:|!)/i,VL=[/(^|\/)types\.ts$/,/(^|\/)types\//,/\/__tests__\//,/\.d\.ts$/,/(^|\/)index\.ts$/,/\.test\.ts$/,/\.spec\.ts$/];c(JL,"buildInventory");c(KL,"inferModule");c(XL,"listTopLevelModules");c(zL,"countModuleFiles");c(YL,"countCoveredFiles");c(mh,"walk");c(ux,"excluded");c(dx,"isCodeFile");c(QL,"driftForSpec");c(ZL,"renderInventoryMd")});var gh={};A(gh,{SpecCommands:()=>fh,renderAuditDispatch:()=>sf});function eF(r){if(!r)return{};let e={};for(let t of r.split(",")){let n=t.trim(),s=n.indexOf(":");s>0&&(e[n.slice(0,s)]=n.slice(s+1))}return e}function tF(r){let e=r.content,t=[`# ${r.title}`,"",`**id:** \`${r.id}\` \xB7 **status:** ${r.status} \xB7 **created:** ${r.createdAt}`,"","## Goal",e.goal];if(e.eli10&&t.push("","## ELI10",e.eli10),e.stakes&&t.push("","## Stakes",e.stakes),e.acceptance_criteria.length>0){t.push("","## Acceptance criteria");for(let n of e.acceptance_criteria)t.push(`- [ ] ${n}`)}if(e.scope.length>0){t.push("","## Scope");for(let n of e.scope)t.push(`- ${n}`)}if(e.out_of_scope.length>0){t.push("","## Out of scope");for(let n of e.out_of_scope)t.push(`- ${n}`)}if(e.risks.length>0){t.push("","## Risks");for(let n of e.risks)t.push(`- **${n.risk}** \u2014 ${n.mitigation}`)}if(e.test_plan.length>0){t.push("","## Test plan");for(let n of e.test_plan)t.push(`- ${n}`)}if(e.reviews&&Object.keys(e.reviews).length>0){t.push("","## Reviews");for(let[n,s]of Object.entries(e.reviews))t.push(`- **${n}:** ${s.verdict} \u2014 ${s.notes} _(${s.ts})_`)}return e.linked_tasks.length>0&&t.push("","## Linked tasks",...e.linked_tasks.map(n=>`- ${n}`)),e.notes&&t.push("","## Notes",e.notes),t.join(`
1515
+ `)}var fh,hh=h(()=>{"use strict";Q();of();kl();H();cc();he();ae();xe();fh=class extends q{static{c(this,"SpecCommands")}async draft(e=null,t=process.cwd(),n={}){try{if(!e||!e.trim())return g.info('Usage: prjct spec "<title>" [--goal "..."] [--tags k:v,...]'),{success:!1,error:"Title required"};let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=n.goal?.trim()||e.trim(),i=eF(n.tags),a=await Ct.create(t,{title:e.trim(),content:{goal:o},tags:i,autoContext:!n.skipContext});return n.md?console.log(`\u2713 spec drafted: ${a.title}
1516
1516
 
1517
1517
  spec_id: ${a.id}
1518
1518
  status: ${a.status}
@@ -1530,17 +1530,17 @@ scope:`);for(let i of o.content.scope)console.log(` - ${i}`)}if(o.content.out_o
1530
1530
  out of scope:`);for(let i of o.content.out_of_scope)console.log(` - ${i}`)}if(o.content.risks.length>0){console.log(`
1531
1531
  risks:`);for(let i of o.content.risks)console.log(` - ${i.risk} \u2192 ${i.mitigation}`)}if(o.content.test_plan.length>0){console.log(`
1532
1532
  test plan:`);for(let i of o.content.test_plan)console.log(` - ${i}`)}}return{success:!0,spec:o}}catch(s){return $(w(s))}}async update(e=null,t=process.cwd(),n={}){try{if(!e)return L(`Usage: prjct spec update <id> --json '{"goal": "...", ...}'`);let s=typeof n.json=="string"?n.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 Ct.get(t,e);if(!a)return L(`spec not found: ${e}`);let l=er.parse({...a.content,...i}),u=await Ct.update(t,e,l);return u?(n.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 $(w(s))}}async setStatus(e=null,t=process.cwd(),n={}){try{if(!e)return L("Usage: prjct spec set-status <id> <status>");let s=n.status;if(!s||!Rr.includes(s))return L(`status must be one of: ${Rr.join(", ")}`);let o=await this.ensureProjectInit(t);return o.success?await Ct.setStatus(t,e,s)?(n.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 $(w(s))}}async recordReview(e=null,t=process.cwd(),n={}){try{if(!e)return L('Usage: prjct spec record-review <id> --reviewer <lens> --verdict <pass|fail> --notes "..."');let s=n.reviewer?.trim().toLowerCase(),o=n.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 Ct.recordReview(t,e,s,{verdict:o,notes:n.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 n.md?console.log(`\u2713 ${u}`):g.done(u),{success:!0,specId:e,status:a.status}}catch(s){return $(w(s))}}async linkTask(e=null,t=process.cwd(),n={}){try{if(!e||!n.taskId)return L("Usage: prjct spec link-task <spec-id> --task-id <id>");let s=await this.ensureProjectInit(t);return s.success?await Ct.linkTask(t,e,n.taskId)?(n.md?console.log(`\u2713 linked task ${n.taskId} to spec ${e}`):g.done("linked task \u2192 spec"),{success:!0,specId:e,taskId:n.taskId}):L(`spec not found: ${e}`):s}catch(s){return $(w(s))}}async ship(e=null,t=process.cwd(),n={}){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=n.pr!==void 0?Number(n.pr):void 0,i=await Ct.ship(t,e,o!==void 0&&Number.isFinite(o)?o:void 0);return i?(n.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 $(w(s))}}async audit(e=null,t=process.cwd(),n={}){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 Ct.get(t,e);if(!o)return L(`spec not found: ${e}`);let i=typeof n.lenses=="string"&&n.lenses.trim()!==""?n.lenses.split(",").map(l=>l.trim().toLowerCase()).filter(Boolean):rf(o.content);await Ct.setSelectedReviewers(t,e,i);let a=sf(o.id,o.title,o.content,i);return console.log(a),{success:!0,specId:e,dispatch:"emitted"}}catch(s){return $(w(s))}}async breakdown(e=null,t=process.cwd(),n={}){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 Ct.get(t,e);if(!o)return L(`spec not found: ${e}`);let i=new Set(["reviewed","shipped","archived"]);if(!i.has(o.status)&&n.force!==!0)return process.stderr.write(`error: spec status is '${o.status}'; breakdown requires 'reviewed' or later. Re-run with --force if intentional.
1533
- `),process.exitCode=2,{success:!1,error:`spec status '${o.status}' is below the breakdown gate`};let a=n.force===!0&&!i.has(o.status),l=await P.getProjectId(t);if(!l)return $("No prjct project. Run `prjct init` first.");let{breakdownSpecToTasks:u}=await Promise.resolve().then(()=>(cf(),af)),d=await u(l,t,o),p=null;if(a){let{projectMemory:f}=await Promise.resolve().then(()=>(Ee(),za)),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 $(w(s))}}async inventory(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let{default:o}=await Promise.resolve().then(()=>(Q(),sn)),a=(await o.readConfig(t))?.projectId;if(!a)return L("not a prjct project");let{buildInventory:l,renderInventoryMd:u}=await Promise.resolve().then(()=>(mx(),px)),d=await l(t,a);if(n.json)console.log(JSON.stringify(d,null,2));else if(n.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 $(w(s))}}};c(eF,"parseFlagTags");c(tF,"renderSpecMarkdown")});var gs,yh=h(()=>{"use strict";gs=class{static{c(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(Rg(),Cg)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(Rl(),Cl)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(Tl(),El)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(yl(),hl)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(Ag(),Pg)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(Ng(),Og)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(Yl(),zl)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(Wg(),Ug)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(Zl(),Ql)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(Wi(),Ui)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(Jg(),Vg)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(Qg(),Yg)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(rh(),nh)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(ih(),oh)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(lh(),ch)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(ph(),dh)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(hh(),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(),n={}){return(await this.workflowG()).now(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return(await this.workflowG()).workflow(e,t,n)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),n={}){return(await this.shippingG()).ship(e,t,{...n})}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(),n={}){return(await this.analysisG()).saveLlmAnalysis(e,t,n)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),n={}){return(await this.contextCmdsG()).context(e,t,n)}async search(e=null,t=process.cwd(),n={}){return(await this.contextCmdsG()).search(e,t,n)}async status(e=null,t=process.cwd(),n={}){return(await this.primitivesCmdsG()).status(e,t,n)}async tag(e=null,t=process.cwd(),n={}){return(await this.primitivesCmdsG()).tag(e,t,n)}async remember(e=null,t=process.cwd(),n={}){return(await this.primitivesCmdsG()).remember(e,t,n)}async forget(e=null,t=process.cwd(),n={}){return(await this.primitivesCmdsG()).forget(e,t,n)}async seed(e=null,t=process.cwd(),n={}){return(await this.seedCmdsG()).seed(e,t,n)}async install(e=null,t=process.cwd(),n={}){return(await this.installCmdsG()).install(null,t,n)}async capture(e=null,t=process.cwd(),n={}){return(await this.captureCmdsG()).capture(e,t,n)}async mcp(e=null,t=process.cwd(),n={}){return(await this.mcpCmdsG()).mcp(e,t,n)}async team(e=null,t=process.cwd(),n={}){return(await this.teamCmdsG()).team(e,t,n)}async config(e=null,t=process.cwd(),n={}){return(await this.configCmdsG()).config(e,t,n)}async embeddings(e=null,t=process.cwd(),n={}){return(await this.embeddingsCmdsG()).embeddings(e,t,n)}async guard(e=null,t=process.cwd(),n={}){return(await this.guardCmdsG()).guard(e,t,n)}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,n){return(await this.workflowG()).logToMemory(e,t,n)}async spec(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).draft(e,t,n)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).show(e,t,n)}async specUpdate(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).update(e,t,n)}async specSetStatus(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).setStatus(e,t,n)}async specRecordReview(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).recordReview(e,t,n)}async specLinkTask(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).linkTask(e,t,n)}async specShip(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).ship(e,t,n)}async specAudit(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).audit(e,t,n)}async specBreakdown(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).breakdown(e,t,n)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}}});var wh,We,vo=h(()=>{"use strict";Q();ge();H();le();wh=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,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,n,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=c(async()=>{if(o)return o;let l=await t(),u=l[n];if(typeof u!="function")throw new Error(`${n} 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 n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,l)=>n.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 P.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:_.getGlobalProjectPath(t),timestamp:T()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:T()};else try{o=await this.buildContext(n)}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,n,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(n)}catch(a){return{success:!1,error:w(a)}}return o(t,n,s)}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:T()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:T()};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()}},We=new wh});import{execFileSync as fx}from"node:child_process";import tu from"node:fs/promises";import Gi from"node:path";async function hx(r){let e=0;try{let t=await tu.readdir(r,{withFileTypes:!0});for(let n of t){let s=Gi.join(r,n.name);if(n.isDirectory())e+=await hx(s);else try{let o=await tu.stat(s);e+=o.size}catch{}}}catch{}return e}function kh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function nF(r){try{return(await tu.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function yx(){let r={homebrew:!1,npm:!1};try{fx("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{fx("npm",["list","-g","prjct-cli","--depth=0"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function wx(){let r=[],e=pd(),t=_.getGlobalBasePath(),n=await E(t),s=n?await nF(Gi.join(t,"projects")):0,o=n?await hx(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=Gi.join(e.claude.config,"CLAUDE.md");r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await gx(i)}),r.push({path:e.claude.router,type:"file",description:"Claude router",exists:await E(e.claude.router)});let a=Gi.join(e.claude.config,"prjct-statusline.sh");r.push({path:a,type:"file",description:"Status line script",exists:await E(a)}),r.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await E(e.gemini.router)});let l=Gi.join(e.gemini.config,"GEMINI.md");return await gx(l)&&r.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function gx(r){if(!await E(r))return!1;try{let e=await tu.readFile(r,"utf-8");return e.includes(nu)&&e.includes(Bi)}catch{return!1}}var nu,Bi,bh=h(()=>{"use strict";nn();ge();J();nu="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Bi="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";c(hx,"getDirectorySize");c(kh,"formatSize");c(nF,"countDirectoryItems");c(yx,"detectInstallation");c(wx,"gatherUninstallItems");c(gx,"hasMarkerSection")});import{execFileSync as kx}from"node:child_process";import ir from"node:fs/promises";import rF from"node:os";import ru from"node:path";import sF from"node:readline";async function bx(r,e){await ir.mkdir(e,{recursive:!0});let t=await ir.readdir(r,{withFileTypes:!0});for(let n of t){let s=ru.join(r,n.name),o=ru.join(e,n.name);n.isDirectory()?await bx(s,o):await ir.copyFile(s,o)}}async function vx(){let r=rF.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ru.join(r,`.prjct-backup-${e}`);try{await ir.mkdir(t,{recursive:!0});let n=_.getGlobalBasePath();return await E(n)&&await bx(n,ru.join(t,".prjct-cli")),t}catch{return null}}async function oF(r){try{let e=await ir.readFile(r,"utf-8");if(!e.includes(nu)||!e.includes(Bi))return!1;let t=e.indexOf(nu),n=e.indexOf(Bi)+Bi.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1533
+ `),process.exitCode=2,{success:!1,error:`spec status '${o.status}' is below the breakdown gate`};let a=n.force===!0&&!i.has(o.status),l=await P.getProjectId(t);if(!l)return $("No prjct project. Run `prjct init` first.");let{breakdownSpecToTasks:u}=await Promise.resolve().then(()=>(cf(),af)),d=await u(l,t,o),p=null;if(a){let{projectMemory:f}=await Promise.resolve().then(()=>(Te(),za)),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 $(w(s))}}async inventory(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let{default:o}=await Promise.resolve().then(()=>(Q(),sn)),a=(await o.readConfig(t))?.projectId;if(!a)return L("not a prjct project");let{buildInventory:l,renderInventoryMd:u}=await Promise.resolve().then(()=>(mx(),px)),d=await l(t,a);if(n.json)console.log(JSON.stringify(d,null,2));else if(n.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 $(w(s))}}};c(eF,"parseFlagTags");c(tF,"renderSpecMarkdown")});var gs,yh=h(()=>{"use strict";gs=class{static{c(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(Rg(),Cg)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(Rl(),Cl)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(Tl(),El)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(yl(),hl)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(Ag(),Pg)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(Ng(),Og)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(Yl(),zl)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(Wg(),Ug)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(Zl(),Ql)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(Wi(),Ui)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(Jg(),Vg)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(Qg(),Yg)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(rh(),nh)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(ih(),oh)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(lh(),ch)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(ph(),dh)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(hh(),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(),n={}){return(await this.workflowG()).now(e,t,n)}async workflowPrefs(e=null,t=process.cwd(),n={}){return(await this.workflowG()).workflow(e,t,n)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),n={}){return(await this.shippingG()).ship(e,t,{...n})}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(),n={}){return(await this.analysisG()).saveLlmAnalysis(e,t,n)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),n={}){return(await this.contextCmdsG()).context(e,t,n)}async search(e=null,t=process.cwd(),n={}){return(await this.contextCmdsG()).search(e,t,n)}async status(e=null,t=process.cwd(),n={}){return(await this.primitivesCmdsG()).status(e,t,n)}async tag(e=null,t=process.cwd(),n={}){return(await this.primitivesCmdsG()).tag(e,t,n)}async remember(e=null,t=process.cwd(),n={}){return(await this.primitivesCmdsG()).remember(e,t,n)}async forget(e=null,t=process.cwd(),n={}){return(await this.primitivesCmdsG()).forget(e,t,n)}async seed(e=null,t=process.cwd(),n={}){return(await this.seedCmdsG()).seed(e,t,n)}async install(e=null,t=process.cwd(),n={}){return(await this.installCmdsG()).install(null,t,n)}async capture(e=null,t=process.cwd(),n={}){return(await this.captureCmdsG()).capture(e,t,n)}async mcp(e=null,t=process.cwd(),n={}){return(await this.mcpCmdsG()).mcp(e,t,n)}async team(e=null,t=process.cwd(),n={}){return(await this.teamCmdsG()).team(e,t,n)}async config(e=null,t=process.cwd(),n={}){return(await this.configCmdsG()).config(e,t,n)}async embeddings(e=null,t=process.cwd(),n={}){return(await this.embeddingsCmdsG()).embeddings(e,t,n)}async guard(e=null,t=process.cwd(),n={}){return(await this.guardCmdsG()).guard(e,t,n)}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,n){return(await this.workflowG()).logToMemory(e,t,n)}async spec(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).draft(e,t,n)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).show(e,t,n)}async specUpdate(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).update(e,t,n)}async specSetStatus(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).setStatus(e,t,n)}async specRecordReview(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).recordReview(e,t,n)}async specLinkTask(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).linkTask(e,t,n)}async specShip(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).ship(e,t,n)}async specAudit(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).audit(e,t,n)}async specBreakdown(e=null,t=process.cwd(),n={}){return(await this.specCmdsG()).breakdown(e,t,n)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}}});var wh,We,vo=h(()=>{"use strict";Q();ge();H();le();wh=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,n){this.handlerFns.set(e,t),this.setMeta(e,n)}setMeta(e,t){let n=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:n,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,n,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=c(async()=>{if(o)return o;let l=await t(),u=l[n];if(typeof u!="function")throw new Error(`${n} 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 n of this.categories.keys())t[n]=e.filter(s=>s.group===n).length;return{total:e.length,implemented:e.filter(n=>n.implemented).length,withTemplates:e.filter(n=>n.hasTemplate).length,claudeOnly:e.filter(n=>n.usage.claude&&!n.usage.terminal).length,terminalOnly:e.filter(n=>!n.usage.claude&&n.usage.terminal).length,both:e.filter(n=>n.usage.claude&&n.usage.terminal).length,requiresInit:e.filter(n=>n.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),n=t.map(a=>a.name),s=n.filter((a,l)=>n.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 P.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:_.getGlobalProjectPath(t),timestamp:T()}}async execute(e,t,n=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:n,globalPath:"",timestamp:T()};else try{o=await this.buildContext(n)}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,n,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(n)}catch(a){return{success:!1,error:w(a)}}return o(t,n,s)}async executeWithoutProject(e,t,n=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:n,globalPath:"",timestamp:T()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:n,globalPath:"",timestamp:T()};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()}},We=new wh});import{execFileSync as fx}from"node:child_process";import tu from"node:fs/promises";import Gi from"node:path";async function hx(r){let e=0;try{let t=await tu.readdir(r,{withFileTypes:!0});for(let n of t){let s=Gi.join(r,n.name);if(n.isDirectory())e+=await hx(s);else try{let o=await tu.stat(s);e+=o.size}catch{}}}catch{}return e}function kh(r){if(r===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(r)/Math.log(1024));return`${(r/1024**t).toFixed(1)} ${e[t]}`}async function nF(r){try{return(await tu.readdir(r,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function yx(){let r={homebrew:!1,npm:!1};try{fx("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})&&(r.homebrew=!0,r.homebrewFormula="prjct-cli")}catch{}try{fx("npm",["list","-g","prjct-cli","--depth=0"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).includes("prjct-cli")&&(r.npm=!0)}catch{}return r}async function wx(){let r=[],e=pd(),t=_.getGlobalBasePath(),n=await E(t),s=n?await nF(Gi.join(t,"projects")):0,o=n?await hx(t):0;r.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:n});let i=Gi.join(e.claude.config,"CLAUDE.md");r.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await gx(i)}),r.push({path:e.claude.router,type:"file",description:"Claude router",exists:await E(e.claude.router)});let a=Gi.join(e.claude.config,"prjct-statusline.sh");r.push({path:a,type:"file",description:"Status line script",exists:await E(a)}),r.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await E(e.gemini.router)});let l=Gi.join(e.gemini.config,"GEMINI.md");return await gx(l)&&r.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),r}async function gx(r){if(!await E(r))return!1;try{let e=await tu.readFile(r,"utf-8");return e.includes(nu)&&e.includes(Bi)}catch{return!1}}var nu,Bi,bh=h(()=>{"use strict";nn();ge();J();nu="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Bi="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";c(hx,"getDirectorySize");c(kh,"formatSize");c(nF,"countDirectoryItems");c(yx,"detectInstallation");c(wx,"gatherUninstallItems");c(gx,"hasMarkerSection")});import{execFileSync as kx}from"node:child_process";import ir from"node:fs/promises";import rF from"node:os";import ru from"node:path";import sF from"node:readline";async function bx(r,e){await ir.mkdir(e,{recursive:!0});let t=await ir.readdir(r,{withFileTypes:!0});for(let n of t){let s=ru.join(r,n.name),o=ru.join(e,n.name);n.isDirectory()?await bx(s,o):await ir.copyFile(s,o)}}async function vx(){let r=rF.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=ru.join(r,`.prjct-backup-${e}`);try{await ir.mkdir(t,{recursive:!0});let n=_.getGlobalBasePath();return await E(n)&&await bx(n,ru.join(t,".prjct-cli")),t}catch{return null}}async function oF(r){try{let e=await ir.readFile(r,"utf-8");if(!e.includes(nu)||!e.includes(Bi))return!1;let t=e.indexOf(nu),n=e.indexOf(Bi)+Bi.length,s=e.substring(0,t)+e.substring(n);return s=s.replace(/\n{3,}/g,`
1534
1534
 
1535
1535
  `).trim(),!s||s.trim().length===0?await ir.unlink(r):await ir.writeFile(r,`${s}
1536
1536
  `,"utf-8"),!0}catch{return!1}}async function Sx(r,e,t){let n=[],s=[];for(let o of r)if(o.exists)try{o.type==="section"?await oF(o.path)&&n.push(o.path):o.type==="directory"?(await ir.rm(o.path,{recursive:!0,force:!0}),n.push(o.path)):o.type==="file"&&(await ir.unlink(o.path),n.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}try{await new xn().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||kx("brew",["uninstall",e.homebrewFormula],{stdio:"pipe"}),n.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||kx("npm",["uninstall","-g","prjct-cli"],{stdio:"pipe"}),n.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:n,errors:s}}async function Ex(r){let e=sF.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(r,n=>{e.close(),t(n.toLowerCase()==="uninstall")})})}var Tx=h(()=>{"use strict";nn();ge();H();J();bh();c(bx,"copyDirectory");c(vx,"createBackup");c(oF,"removePrjctSection");c(Sx,"performUninstall");c(Ex,"promptConfirmation")});var Sh={};A(Sh,{UninstallCommands:()=>vh,uninstall:()=>Cx});import $e from"chalk";async function Cx(r={},e=process.cwd()){let t=await wx(),n=yx(),s=t.filter(l=>l.exists);if(s.length===0&&!n.homebrew&&!n.npm)return console.log($e.yellow(`
1537
1537
  No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let o=s.reduce((l,u)=>l+(u.size||0),0);console.log(""),console.log($e.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log($e.white("The following will be permanently deleted:")),console.log("");for(let l of s){let u=_.getDisplayPath(l.path),d="";l.type==="section"?d=$e.dim("(section only)"):l.size&&(d=$e.dim(`(${kh(l.size)})`)),console.log(` ${$e.cyan(u.padEnd(35))} ${d}`),console.log(` ${$e.dim(l.description)}`),console.log("")}if(n.homebrew&&(console.log(` ${$e.cyan("Homebrew".padEnd(35))} ${$e.dim("prjct-cli formula")}`),console.log("")),n.npm&&(console.log(` ${$e.cyan("npm global".padEnd(35))} ${$e.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log($e.dim(` Total size: ${kh(o)}`)),console.log("")),r.dryRun)return console.log($e.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(r.backup){console.log($e.blue("Creating backup..."));let l=await vx();l?(console.log($e.green(`Backup created: ${_.getDisplayPath(l)}`)),console.log("")):console.log($e.yellow("Failed to create backup, continuing..."))}if(!r.force&&(console.log($e.yellow('Type "uninstall" to confirm:')),!await Ex("> ")))return console.log($e.yellow(`
1538
1538
  Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log($e.blue("Removing prjct..."));let{deleted:i,errors:a}=await Sx(t,n,r);if(console.log(""),i.length>0&&console.log($e.green(`Removed ${i.length} items`)),a.length>0){console.log($e.yellow(`
1539
- ${a.length} errors:`));for(let l of a)console.log($e.red(` - ${l}`))}return console.log(""),console.log($e.green("prjct has been uninstalled.")),console.log($e.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var vh,Eh=h(()=>{"use strict";ge();Re();Tx();bh();c(Cx,"uninstall");vh=class extends q{static{c(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Cx(e,t)}}});var Mx={};A(Mx,{LeanCommands:()=>Th,_internal:()=>dF});function jx(r){let e=r?.lean?.mode;if(e&&qi.includes(e))return e;let t=process.env.PRJCT_LEAN_MODE?.toLowerCase();return t&&qi.includes(t)?t:"off"}async function So(r,e){try{let{stdout:t}=await re("git",e,{cwd:r,maxBuffer:33554432});return t}catch{return null}}async function aF(r){let e="",t=(await So(r,["rev-parse","--abbrev-ref","origin/HEAD"]))?.trim();if(t&&t!=="origin/HEAD")e=t;else for(let s of["main","master"])if(await So(r,["rev-parse","--verify","--quiet",s])!==null){e=s;break}return e&&(await So(r,["merge-base",e,"HEAD"]))?.trim()||null}async function cF(r){let e=await aF(r),t=e??"HEAD",n=await So(r,["diff","--name-status",t])??"",s=await So(r,["diff",t])??"";return{base:e?e.slice(0,7):null,nameStatus:n,diff:s}}async function lF(r){let e=await So(r,["grep","-nI","-e",Px]);return e?e.split(`
1539
+ ${a.length} errors:`));for(let l of a)console.log($e.red(` - ${l}`))}return console.log(""),console.log($e.green("prjct has been uninstalled.")),console.log($e.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var vh,Eh=h(()=>{"use strict";ge();xe();Tx();bh();c(Cx,"uninstall");vh=class extends q{static{c(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return Cx(e,t)}}});var Mx={};A(Mx,{LeanCommands:()=>Th,_internal:()=>dF});function jx(r){let e=r?.lean?.mode;if(e&&qi.includes(e))return e;let t=process.env.PRJCT_LEAN_MODE?.toLowerCase();return t&&qi.includes(t)?t:"off"}async function So(r,e){try{let{stdout:t}=await re("git",e,{cwd:r,maxBuffer:33554432});return t}catch{return null}}async function aF(r){let e="",t=(await So(r,["rev-parse","--abbrev-ref","origin/HEAD"]))?.trim();if(t&&t!=="origin/HEAD")e=t;else for(let s of["main","master"])if(await So(r,["rev-parse","--verify","--quiet",s])!==null){e=s;break}return e&&(await So(r,["merge-base",e,"HEAD"]))?.trim()||null}async function cF(r){let e=await aF(r),t=e??"HEAD",n=await So(r,["diff","--name-status",t])??"",s=await So(r,["diff",t])??"";return{base:e?e.slice(0,7):null,nameStatus:n,diff:s}}async function lF(r){let e=await So(r,["grep","-nI","-e",Px]);return e?e.split(`
1540
1540
  `).map(t=>t.trim()).filter(Boolean).map(t=>{let n=t.match(/^([^:]+):(\d+):/);return n?`${n[1]}:${n[2]}`:t}).slice(0,100):[]}function $x(){return{loc:0,addedFiles:0,newDeps:0,leanMarkers:0}}function Ix(r,e){let t=$x();for(let s of e.split(`
1541
1541
  `))/^A\s/.test(s)&&(t.addedFiles+=1);let n=!1;for(let s of r.split(`
1542
1542
  `)){if(s.startsWith("+++ ")){n=/\/package\.json$|^\+\+\+ b\/package\.json$/.test(s);continue}s.startsWith("+++")||s.startsWith("---")||((s.startsWith("+")||s.startsWith("-"))&&(t.loc+=1),s.startsWith("+")&&(n&&uF.test(s)&&(t.newDeps+=1),new RegExp(`\\b${Px}`,"i").test(s)&&(t.leanMarkers+=1)))}return t}function Dx(r){let e=[];return r.newDeps>0&&e.push(`${r.newDeps} new dependency(ies) \u2014 verify none replaces a stdlib/native/one-liner.`),r.addedFiles>=Ax&&e.push(`${r.addedFiles} new files \u2014 check for speculative abstraction / premature structure.`),r.leanMarkers>0&&e.push(`${r.leanMarkers} new \`lean:\` marker(s) \u2014 deferred simplifications; track via \`prjct lean debt\`.`),e}function xx(r,e){let t=[`- LOC changed: ${r.loc}`,`- New files: ${r.addedFiles}`,`- New deps: ${r.newDeps}`,`- New \`lean:\` markers: ${r.leanMarkers}`];if(e.length>0){t.push("","Flags:");for(let n of e)t.push(` - ${n}`)}else t.push("","_No blunt smells \u2014 the heuristic is clean; the rubric pass may still find subtler over-engineering._");return t.join(`
1543
- `)}var qi,Px,Rx,Ax,iF,Th,uF,_x,dF,Ox=h(()=>{"use strict";Q();Ee();Yr();H();Ce();he();dt();ae();Re();qi=["off","lite","full","ultra"],Px="lean:",Rx=24e3,Ax=5,iF=["Apply the lean decision ladder to this diff, in order:","1. Does this need to exist at all? (YAGNI \u2014 delete beats add)","2. Does the standard library already provide it?","3. Is there a native platform feature for it?","4. Does an already-installed dependency cover it? (never add one for a trivial need)","5. Can it be one line? Only then write minimal code.","Flag: speculative abstractions (interface/factory with one implementation),","premature config, needless new dependencies, clever over boring.","NON-NEGOTIABLE \u2014 never flag away: input/trust-boundary validation, data-loss","handling, security, accessibility, edge-case correctness, explicitly-asked scope."].join(`
1543
+ `)}var qi,Px,Rx,Ax,iF,Th,uF,_x,dF,Ox=h(()=>{"use strict";Q();Te();Yr();H();Re();he();dt();ae();xe();qi=["off","lite","full","ultra"],Px="lean:",Rx=24e3,Ax=5,iF=["Apply the lean decision ladder to this diff, in order:","1. Does this need to exist at all? (YAGNI \u2014 delete beats add)","2. Does the standard library already provide it?","3. Is there a native platform feature for it?","4. Does an already-installed dependency cover it? (never add one for a trivial need)","5. Can it be one line? Only then write minimal code.","Flag: speculative abstractions (interface/factory with one implementation),","premature config, needless new dependencies, clever over boring.","NON-NEGOTIABLE \u2014 never flag away: input/trust-boundary validation, data-loss","handling, security, accessibility, edge-case correctness, explicitly-asked scope."].join(`
1544
1544
  `),Th=class extends q{static{c(this,"LeanCommands")}async lean(e=null,t=process.cwd(),n={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.showStatus(t,n);if(qi.includes(o))return this.setMode(o,t,n);switch(o){case"review":return this.review(t,n);case"audit":return this.audit(t,n);case"debt":return this.debt(t,n);default:return L(`Unknown lean subcommand "${o}". Use: review, audit, debt, or ${qi.join("|")}.`,n)}}async showStatus(e,t){let n=await P.readConfig(e).catch(()=>null);if(!n?.projectId)return $("No prjct project here \u2014 run `prjct init` first.",t);let s=jx(n),o=[`Mode: ${s}${s==="off"?" (guidance + lean-debt detector dormant)":""}`,"Set: prjct lean off|lite|full|ultra","Review: prjct lean review \u2014 over-engineering in the current diff","Audit: prjct lean audit \u2014 repo-wide, over stored analysis","Debt: prjct lean debt \u2014 deferred `lean:` simplifications"];return t.md?console.log(O("## Lean",`> **Mode**: \`${s}\``,o.slice(1).join(`
1545
1545
  `))):g.info(`Lean \u2014 ${o.join(`
1546
1546
  `)}`),{success:!0,mode:s}}async setMode(e,t,n){let s=await P.readConfig(t).catch(()=>null);if(!s?.projectId)return $("No prjct project here \u2014 run `prjct init` first.",n);s.lean={mode:e},await P.writeConfig(t,s);let o=e==="off"?"Lean mode off \u2014 guidance and the lean-debt detector are dormant.":`Lean mode \u2192 ${e}. Guidance biases toward YAGNI/KISS; the Stop-hook lean-debt detector is armed.`;return n.md?console.log(O("## Lean",`> ${o}`)):g.done(o),{success:!0,mode:e}}async review(e,t){try{if(!(await P.readConfig(e).catch(()=>null))?.projectId)return $("No prjct project here \u2014 run `prjct init` first.",t);let s=await cF(e);if(!s||!s.diff.trim()&&!s.nameStatus.trim()){let l="lean review: no changeset to review (nothing ahead of base, no working changes).";return console.log(t.md?O("## Lean review",`> ${l}`):l),{success:!0,smells:$x()}}let o=Ix(s.diff,s.nameStatus),i=Dx(o),a=s.diff.length>Rx?`${s.diff.slice(0,Rx)}
@@ -1563,7 +1563,7 @@ ${s.map(l=>`- ${l.content.split(`
1563
1563
  > none logged.`,a=o.length>0?`### \`lean:\` markers in source (${o.length})
1564
1564
  ${o.map(l=>`- \`${l}\``).join(`
1565
1565
  `)}`:"### `lean:` markers in source\n> none found.";console.log(O("## Lean debt",i,a))}else{g.info(`Lean debt \u2014 ${s.length} logged, ${o.length} \`lean:\` markers in source`);for(let i of s)g.info(` \u2022 ${i.content.split(`
1566
- `)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(n){return $(w(n),t)}}};c(jx,"effectiveMode");c(So,"safeGit");c(aF,"resolveBase");c(cF,"collectReviewDiff");c(lF,"scanLeanMarkers");uF=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,_x=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;c($x,"emptySmells");c(Ix,"scanDiffSmells");c(Dx,"leanFlags");c(xx,"formatSmells");dF={effectiveMode:jx,scanDiffSmells:Ix,leanFlags:Dx,LEAN_MODES:qi,MANY_NEW_FILES:Ax,OVER_ENGINEERING_RE:_x}});import pF from"node:path";function Ch(){return pF.join(_.getStatePath(),"cloud-linked.json")}async function su(){let r=await Pe(Ch(),[]);return Array.isArray(r)?r.filter(e=>e?.projectId&&e?.projectPath):[]}async function Nx(r,e){let n=(await su()).filter(s=>s.projectId!==r);n.push({projectId:r,projectPath:e}),await jt(_.getStatePath()),await fe(Ch(),n)}async function Lx(r){let e=await su();await jt(_.getStatePath()),await fe(Ch(),e.filter(t=>t.projectId!==r))}var Rh=h(()=>{"use strict";ge();J();c(Ch,"registryPath");c(su,"listLinkedProjects");c(Nx,"addLinkedProject");c(Lx,"removeLinkedProject")});function Fx(){return typeof globalThis.WebSocket=="function"}function mF(r,e,t,n){let s=r.replace(/\/$/,"").replace(/^http/,"ws"),o=new URLSearchParams({key:t,device:n,project:e});return`${s}/ws?${o.toString()}`}function fF(r,e,t){let n=Math.min(t,e*2**r);return Math.round(Math.random()*n)}var ou,Hx=h(()=>{"use strict";c(Fx,"hasGlobalWebSocket");c(mF,"buildRealtimeUrl");c(fF,"backoffDelay");ou=class{static{c(this,"RealtimeClient")}opts;ws=null;_state="idle";attempt=0;stopped=!1;reconnectTimer=null;constructor(e){this.opts={...e,wsFactory:e.wsFactory??(t=>new globalThis.WebSocket(t)),baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??3e4}}get state(){return this._state}start(){this.stopped||this._state==="connecting"||this._state==="open"||this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.closeSocket(),this._state="closed"}connect(){this._state=this.attempt===0?"connecting":"reconnecting";let e=mF(this.opts.apiUrl,this.opts.projectId,this.opts.apiKey,this.opts.deviceId),t;try{t=this.opts.wsFactory(e)}catch{this.scheduleReconnect();return}this.ws=t,t.onopen=()=>{this._state="open",this.attempt=0},t.onmessage=n=>{this.handleMessage(n?.data)},t.onerror=()=>{},t.onclose=()=>{this.stopped||this.scheduleReconnect()}}async handleMessage(e){let t;try{t=typeof e=="string"?JSON.parse(e):e}catch{return}if(!t||typeof t!="object")return;let n=t;if(n.type==="event"&&n.event&&typeof n.event=="object")try{await this.opts.apply(this.opts.projectId,n.event)}catch{}}scheduleReconnect(){if(this.stopped)return;this.closeSocket(),this._state="reconnecting";let e=fF(this.attempt,this.opts.baseDelayMs,this.opts.maxDelayMs);this.attempt+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.stopped||this.connect()},e),this.reconnectTimer?.unref?.()}closeSocket(){if(!this.ws)return;let e=this.ws;e.onopen=null,e.onmessage=null,e.onclose=null,e.onerror=null;try{e.close()}catch{}this.ws=null}}});var xh,iu,hs,Ph=h(()=>{"use strict";br();Rh();Hx();Ci();xh=class{static{c(this,"RealtimeManager")}clients=new Map;available(){return process.env.PRJCT_IN_DAEMON==="1"&&Fx()}async startAll(){if(!this.available())return;let e=await su();for(let t of e)try{await this.start(t.projectId,t.projectPath)}catch{}}async start(e,t){if(!this.available()||this.clients.has(e))return;let{default:n}=await Promise.resolve().then(()=>(Q(),sn)),s=await n.readConfig(t).catch(()=>null);if(!s?.cloud?.enabled||s.cloud.paused)return;let o=await xe.read();if(!o.apiKey)return;let[i,a]=await Promise.all([xe.getApiUrl(),xe.getDeviceId()]),l=new ou({projectId:e,apiUrl:i,apiKey:o.apiKey,deviceId:a,apply:c((u,d)=>hn.applyRealtimeEvent(u,d),"apply")});this.clients.set(e,l),l.start()}stop(e){let t=this.clients.get(e);t&&(t.stop(),this.clients.delete(e))}stopAll(){for(let e of this.clients.values())e.stop();this.clients.clear()}status(e){return this.clients.get(e)?.state??"disabled"}},iu=new xh,hs=iu});var Ux={};A(Ux,{CloudCommands:()=>Ah});var gF,Ah,Wx=h(()=>{"use strict";ni();Q();br();Rh();vl();Ph();Ci();H();he();dt();ae();Re();gF=["link","unlink","status","sync","pull","pause","resume"],Ah=class extends q{static{c(this,"CloudCommands")}async cloud(e=null,t=process.cwd(),n={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.status(t,n);switch(o){case"link":return this.link(t,n);case"unlink":return this.unlink(t,n);case"sync":return this.runSync(t,n);case"pull":return this.runPull(t,n);case"pause":return this.setPaused(!0,t,n);case"resume":return this.setPaused(!1,t,n);default:return L(`Unknown cloud subcommand "${o}". Use: ${gF.join(", ")}.`,n)}}async readProject(e){let t=await P.readConfig(e).catch(()=>null);return t?.projectId?t:null}async link(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);if(!await xe.hasAuth())return $("Not authenticated. Run `prjct login`, then `prjct cloud link`.",t);n.cloud={enabled:!0,paused:!1,linkedAt:n.cloud?.linkedAt??new Date().toISOString(),include:n.cloud?.include},await P.writeConfig(e,n),await Nx(n.projectId,e),await hs.start(n.projectId,e).catch(()=>{});let s=await hn.sync(n.projectId,{include:n.cloud.include??{}});return this.reportSync("Linked",s,t,{extra:"Project is now linked. It will also sync on `prjct ship` and at session end."})}async unlink(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);if(!n.cloud?.enabled){let o="Already local-only \u2014 nothing to unlink.";return console.log(t.md?O("## Cloud",`> ${o}`):o),{success:!0,linked:!1}}n.cloud={...n.cloud,enabled:!1,paused:!1},await P.writeConfig(e,n),hs.stop(n.projectId),await Lx(n.projectId);let s="Unlinked \u2014 this project is local-only again. Local data was not touched.";return t.md?console.log(O("## Cloud",`> ${s}`)):g.done(s),{success:!0,linked:!1}}async runSync(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(n,t);if(s)return s;let o=await hn.sync(n.projectId,{include:n.cloud?.include??{}});return this.reportSync("Synced",o,t)}async runPull(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(n,t);if(s)return s;try{let o=await hn.pull(n.projectId);if(!o.success)return L(`Pull failed: ${o.error??"unknown error"}`,t);let i=`Pulled ${o.count??0} change(s) (${o.applied??0} applied).`;return t.md?console.log(O("## Cloud pull",`> ${i}`)):g.done(i),{success:!0,pulled:o.count??0,applied:o.applied??0}}catch(o){return $(w(o),t)}}async setPaused(e,t,n){let s=await this.readProject(t);if(!s)return $("No prjct project here \u2014 run `prjct init` first.",n);if(!s.cloud?.enabled)return L("Not linked \u2014 nothing to pause/resume. Run `prjct cloud link` first.",n);s.cloud={...s.cloud,paused:e},await P.writeConfig(t,s),e?hs.stop(s.projectId):await hs.start(s.projectId,t).catch(()=>{});let o=e?"Cloud sync paused. Resume with `prjct cloud resume`.":"Cloud sync resumed.";return n.md?console.log(O("## Cloud",`> ${o}`)):g.done(o),{success:!0,paused:e}}async status(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);let s=await xe.hasAuth(),o=n.cloud,i=!!o?.enabled,a=!!o?.paused,l=(await It.getPending(n.projectId)).length,u=await It.getLastSync(n.projectId),d={...bl,...o?.include??{}},p=Object.entries(d).filter(([,y])=>y).map(([y])=>y),m=s?i?a?"linked, paused":"linked, active":"local-only (run `prjct cloud link`)":"not authenticated (run `prjct login`)",f=i?hs.available()?hs.status(n.projectId):"requires daemon":"n/a";return t.md?console.log(O("## Cloud status",`> **State**: ${m}`,[`- Authenticated: ${s?"yes":"no"}`,`- Linked: ${i?"yes":"no"}${o?.linkedAt?` (since ${o.linkedAt})`:""}`,`- Realtime: ${f}`,`- Pending events: ${l}`,`- Last sync: ${u?.timestamp??"never"}`,`- Syncing groups: ${p.join(", ")}`].join(`
1566
+ `)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(n){return $(w(n),t)}}};c(jx,"effectiveMode");c(So,"safeGit");c(aF,"resolveBase");c(cF,"collectReviewDiff");c(lF,"scanLeanMarkers");uF=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,_x=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;c($x,"emptySmells");c(Ix,"scanDiffSmells");c(Dx,"leanFlags");c(xx,"formatSmells");dF={effectiveMode:jx,scanDiffSmells:Ix,leanFlags:Dx,LEAN_MODES:qi,MANY_NEW_FILES:Ax,OVER_ENGINEERING_RE:_x}});import pF from"node:path";function Ch(){return pF.join(_.getStatePath(),"cloud-linked.json")}async function su(){let r=await Pe(Ch(),[]);return Array.isArray(r)?r.filter(e=>e?.projectId&&e?.projectPath):[]}async function Nx(r,e){let n=(await su()).filter(s=>s.projectId!==r);n.push({projectId:r,projectPath:e}),await jt(_.getStatePath()),await fe(Ch(),n)}async function Lx(r){let e=await su();await jt(_.getStatePath()),await fe(Ch(),e.filter(t=>t.projectId!==r))}var Rh=h(()=>{"use strict";ge();J();c(Ch,"registryPath");c(su,"listLinkedProjects");c(Nx,"addLinkedProject");c(Lx,"removeLinkedProject")});function Fx(){return typeof globalThis.WebSocket=="function"}function mF(r,e,t,n){let s=r.replace(/\/$/,"").replace(/^http/,"ws"),o=new URLSearchParams({key:t,device:n,project:e});return`${s}/ws?${o.toString()}`}function fF(r,e,t){let n=Math.min(t,e*2**r);return Math.round(Math.random()*n)}var ou,Hx=h(()=>{"use strict";c(Fx,"hasGlobalWebSocket");c(mF,"buildRealtimeUrl");c(fF,"backoffDelay");ou=class{static{c(this,"RealtimeClient")}opts;ws=null;_state="idle";attempt=0;stopped=!1;reconnectTimer=null;constructor(e){this.opts={...e,wsFactory:e.wsFactory??(t=>new globalThis.WebSocket(t)),baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??3e4}}get state(){return this._state}start(){this.stopped||this._state==="connecting"||this._state==="open"||this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.closeSocket(),this._state="closed"}connect(){this._state=this.attempt===0?"connecting":"reconnecting";let e=mF(this.opts.apiUrl,this.opts.projectId,this.opts.apiKey,this.opts.deviceId),t;try{t=this.opts.wsFactory(e)}catch{this.scheduleReconnect();return}this.ws=t,t.onopen=()=>{this._state="open",this.attempt=0},t.onmessage=n=>{this.handleMessage(n?.data)},t.onerror=()=>{},t.onclose=()=>{this.stopped||this.scheduleReconnect()}}async handleMessage(e){let t;try{t=typeof e=="string"?JSON.parse(e):e}catch{return}if(!t||typeof t!="object")return;let n=t;if(n.type==="event"&&n.event&&typeof n.event=="object")try{await this.opts.apply(this.opts.projectId,n.event)}catch{}}scheduleReconnect(){if(this.stopped)return;this.closeSocket(),this._state="reconnecting";let e=fF(this.attempt,this.opts.baseDelayMs,this.opts.maxDelayMs);this.attempt+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.stopped||this.connect()},e),this.reconnectTimer?.unref?.()}closeSocket(){if(!this.ws)return;let e=this.ws;e.onopen=null,e.onmessage=null,e.onclose=null,e.onerror=null;try{e.close()}catch{}this.ws=null}}});var xh,iu,hs,Ph=h(()=>{"use strict";br();Rh();Hx();Ci();xh=class{static{c(this,"RealtimeManager")}clients=new Map;available(){return process.env.PRJCT_IN_DAEMON==="1"&&Fx()}async startAll(){if(!this.available())return;let e=await su();for(let t of e)try{await this.start(t.projectId,t.projectPath)}catch{}}async start(e,t){if(!this.available()||this.clients.has(e))return;let{default:n}=await Promise.resolve().then(()=>(Q(),sn)),s=await n.readConfig(t).catch(()=>null);if(!s?.cloud?.enabled||s.cloud.paused)return;let o=await Ee.read();if(!o.apiKey)return;let[i,a]=await Promise.all([Ee.getApiUrl(),Ee.getDeviceId()]),l=new ou({projectId:e,apiUrl:i,apiKey:o.apiKey,deviceId:a,apply:c((u,d)=>hn.applyRealtimeEvent(u,d),"apply")});this.clients.set(e,l),l.start()}stop(e){let t=this.clients.get(e);t&&(t.stop(),this.clients.delete(e))}stopAll(){for(let e of this.clients.values())e.stop();this.clients.clear()}status(e){return this.clients.get(e)?.state??"disabled"}},iu=new xh,hs=iu});var Ux={};A(Ux,{CloudCommands:()=>Ah});var gF,Ah,Wx=h(()=>{"use strict";ni();Q();br();Rh();vl();Ph();Ci();H();he();dt();ae();xe();gF=["link","unlink","status","sync","pull","pause","resume"],Ah=class extends q{static{c(this,"CloudCommands")}async cloud(e=null,t=process.cwd(),n={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.status(t,n);switch(o){case"link":return this.link(t,n);case"unlink":return this.unlink(t,n);case"sync":return this.runSync(t,n);case"pull":return this.runPull(t,n);case"pause":return this.setPaused(!0,t,n);case"resume":return this.setPaused(!1,t,n);default:return L(`Unknown cloud subcommand "${o}". Use: ${gF.join(", ")}.`,n)}}async readProject(e){let t=await P.readConfig(e).catch(()=>null);return t?.projectId?t:null}async link(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);if(!await Ee.hasAuth())return $("Not authenticated. Run `prjct login`, then `prjct cloud link`.",t);n.cloud={enabled:!0,paused:!1,linkedAt:n.cloud?.linkedAt??new Date().toISOString(),include:n.cloud?.include},await P.writeConfig(e,n),await Nx(n.projectId,e),await hs.start(n.projectId,e).catch(()=>{});let s=await hn.sync(n.projectId,{include:n.cloud.include??{}});return this.reportSync("Linked",s,t,{extra:"Project is now linked. It will also sync on `prjct ship` and at session end."})}async unlink(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);if(!n.cloud?.enabled){let o="Already local-only \u2014 nothing to unlink.";return console.log(t.md?O("## Cloud",`> ${o}`):o),{success:!0,linked:!1}}n.cloud={...n.cloud,enabled:!1,paused:!1},await P.writeConfig(e,n),hs.stop(n.projectId),await Lx(n.projectId);let s="Unlinked \u2014 this project is local-only again. Local data was not touched.";return t.md?console.log(O("## Cloud",`> ${s}`)):g.done(s),{success:!0,linked:!1}}async runSync(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(n,t);if(s)return s;let o=await hn.sync(n.projectId,{include:n.cloud?.include??{}});return this.reportSync("Synced",o,t)}async runPull(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(n,t);if(s)return s;try{let o=await hn.pull(n.projectId);if(!o.success)return L(`Pull failed: ${o.error??"unknown error"}`,t);let i=`Pulled ${o.count??0} change(s) (${o.applied??0} applied).`;return t.md?console.log(O("## Cloud pull",`> ${i}`)):g.done(i),{success:!0,pulled:o.count??0,applied:o.applied??0}}catch(o){return $(w(o),t)}}async setPaused(e,t,n){let s=await this.readProject(t);if(!s)return $("No prjct project here \u2014 run `prjct init` first.",n);if(!s.cloud?.enabled)return L("Not linked \u2014 nothing to pause/resume. Run `prjct cloud link` first.",n);s.cloud={...s.cloud,paused:e},await P.writeConfig(t,s),e?hs.stop(s.projectId):await hs.start(s.projectId,t).catch(()=>{});let o=e?"Cloud sync paused. Resume with `prjct cloud resume`.":"Cloud sync resumed.";return n.md?console.log(O("## Cloud",`> ${o}`)):g.done(o),{success:!0,paused:e}}async status(e,t){let n=await this.readProject(e);if(!n)return $("No prjct project here \u2014 run `prjct init` first.",t);let s=await Ee.hasAuth(),o=n.cloud,i=!!o?.enabled,a=!!o?.paused,l=(await It.getPending(n.projectId)).length,u=await It.getLastSync(n.projectId),d={...bl,...o?.include??{}},p=Object.entries(d).filter(([,y])=>y).map(([y])=>y),m=s?i?a?"linked, paused":"linked, active":"local-only (run `prjct cloud link`)":"not authenticated (run `prjct login`)",f=i?hs.available()?hs.status(n.projectId):"requires daemon":"n/a";return t.md?console.log(O("## Cloud status",`> **State**: ${m}`,[`- Authenticated: ${s?"yes":"no"}`,`- Linked: ${i?"yes":"no"}${o?.linkedAt?` (since ${o.linkedAt})`:""}`,`- Realtime: ${f}`,`- Pending events: ${l}`,`- Last sync: ${u?.timestamp??"never"}`,`- Syncing groups: ${p.join(", ")}`].join(`
1567
1567
  `))):g.info([`Cloud \u2014 ${m}`,` Authenticated: ${s?"yes":"no"}`,` Linked: ${i?"yes":"no"}${o?.linkedAt?` (since ${o.linkedAt})`:""}`,` Realtime: ${f}`,` Pending events: ${l}`,` Last sync: ${u?.timestamp??"never"}`,` Syncing groups: ${p.join(", ")}`].join(`
1568
1568
  `)),{success:!0,linked:i,paused:a,authed:s,pending:l,realtime:f}}gate(e,t){return e.cloud?.enabled?e.cloud.paused?L("Cloud sync is paused. Run `prjct cloud resume` first.",t):null:L("This project is not linked. Run `prjct cloud link` first.",t)}reportSync(e,t,n,s){if(!t.success)return L(`${e} with errors: ${t.error??"unknown error"}`,n);let o=t.pushed?.count??0,i=t.pulled?.count??0,a=`${e} \u2014 ${o} pushed, ${i} pulled.`;return n.md?console.log(O("## Cloud",`> ${a}`,...s?.extra?[s.extra]:[])):(g.done(a),s?.extra&&g.info(s.extra)),{success:!0,pushed:o,pulled:i}}}});function Bx(){for(let r of Gx)r()}function Ve(r){let e;return Gx.push(()=>{e=void 0}),()=>e??=r().catch(t=>{throw e=void 0,t})}function yF(){for(let[r,e]of Object.entries(Oi))We.registerCategory(r,e)}function wF(){if(!We.has("work")){yF();for(let r of yn)r.routing&&We.registerLazyMethod(r.name,hF[r.routing.group],r.routing.method,r)}}var Gx,hF,jh=h(()=>{"use strict";Wl();vo();Gx=[];c(Bx,"resetGroupLoaders");c(Ve,"lazy");hF={workflow:Ve(async()=>new(await Promise.resolve().then(()=>(Rg(),Cg))).WorkflowCommands),planning:Ve(async()=>new(await Promise.resolve().then(()=>(Rl(),Cl))).PlanningCommands),shipping:Ve(async()=>new(await Promise.resolve().then(()=>(Tl(),El))).ShippingCommands),analysis:Ve(async()=>new(await Promise.resolve().then(()=>(yl(),hl))).AnalysisCommands),setup:Ve(async()=>new(await Promise.resolve().then(()=>(Ag(),Pg))).SetupCommands),context:Ve(async()=>new(await Promise.resolve().then(()=>(Yl(),zl))).ContextCommands),primitives:Ve(async()=>new(await Promise.resolve().then(()=>(Wg(),Ug))).PrimitiveCommands),seed:Ve(async()=>new(await Promise.resolve().then(()=>(Zl(),Ql))).SeedCommands),install:Ve(async()=>new(await Promise.resolve().then(()=>(Wi(),Ui))).InstallCommands),capture:Ve(async()=>new(await Promise.resolve().then(()=>(Jg(),Vg))).CaptureCommands),mcp:Ve(async()=>new(await Promise.resolve().then(()=>(Qg(),Yg))).McpCommands),team:Ve(async()=>new(await Promise.resolve().then(()=>(rh(),nh))).TeamCommands),config:Ve(async()=>new(await Promise.resolve().then(()=>(ih(),oh))).ConfigCommands),uninstall:Ve(async()=>new(await Promise.resolve().then(()=>(Eh(),Sh))).UninstallCommands),update:Ve(async()=>new(await Promise.resolve().then(()=>(Ng(),Og))).UpdateCommands),spec:Ve(async()=>new(await Promise.resolve().then(()=>(hh(),gh))).SpecCommands),embeddings:Ve(async()=>new(await Promise.resolve().then(()=>(lh(),ch))).EmbeddingsCommands),guard:Ve(async()=>new(await Promise.resolve().then(()=>(ph(),dh))).GuardCommands),lean:Ve(async()=>new(await Promise.resolve().then(()=>(Ox(),Mx))).LeanCommands),cloud:Ve(async()=>new(await Promise.resolve().then(()=>(Wx(),Ux))).CloudCommands)};c(yF,"registerCategories");c(wF,"registerAllCommands");wF()});function Vi(r){let e=We.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=kF(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function kF(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}var _h=h(()=>{"use strict";vo();c(Vi,"findClosestCommand");c(kF,"editDistance")});function bF(r){return r.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function au(r,e){let t=c(s=>r[s]!==void 0?r[s]:r[bF(s)],"pick"),n={md:r.md===!0};for(let s of e.booleans??[])n[s]=t(s)===!0;for(let s of e.strings??[]){let o=t(s);n[s]=o!=null&&o!==!1&&o!==""?String(o):void 0}for(let s of e.numbers??[]){let o=t(s),i=o!=null&&o!==!1&&o!==""?Number(o):Number.NaN;n[s]=Number.isNaN(i)?void 0:i}return n}var $h=h(()=>{"use strict";c(bF,"kebab");c(au,"mapOptions")});function lu(r){return Object.hasOwn(cu,r)}function qx(r){let e=cu[r];return e?`'prjct ${r}' was removed in v2.
1569
1569
  \u2192 Use: ${e.replacement}
@@ -1693,7 +1693,7 @@ ${o.split(`
1693
1693
  `).map(a=>a.trim()).filter(Boolean),o=(await e(async()=>(await re("git",["diff","--stat"],{cwd:r})).stdout,"")).trim(),i=(await e(async()=>(await G("git log --oneline -10",{cwd:r})).stdout,"")).split(`
1694
1694
  `).map(a=>a.trim()).filter(Boolean);return{branch:t||"unknown",head:n||null,statusShort:s,diffStat:o,recentLog:i}}function zF(r,e){let t=[];if(t.push(`Restoring: ${e}`),t.push(`Title: ${r.title}`),t.push(`Branch: ${r.git.branch}`),t.push(`Saved at: ${r.createdAt}`),r.notes&&(t.push(""),t.push("Notes:"),t.push(r.notes)),r.git.statusShort.length>0){t.push(""),t.push("Working tree at save time:");for(let n of r.git.statusShort.slice(0,20))t.push(` ${n}`)}if(r.git.recentLog.length>0){t.push(""),t.push("Recent commits:");for(let n of r.git.recentLog)t.push(` ${n}`)}return t.join(`
1695
1695
  `)}function YF(r,e){let t=[];if(t.push(`## context-restore \u2014 \`${e}\``),t.push(""),t.push(`- **Title**: ${r.title}`),t.push(`- **Branch**: ${r.git.branch}`),t.push(`- **Saved at**: ${r.createdAt}`),t.push(""),r.notes&&(t.push("### Notes"),t.push(""),t.push(r.notes),t.push("")),r.git.statusShort.length>0){t.push("### Working tree at save time"),t.push(""),t.push("```");for(let n of r.git.statusShort.slice(0,20))t.push(n);t.push("```"),t.push("")}if(r.git.recentLog.length>0){t.push("### Recent commits"),t.push("");for(let n of r.git.recentLog)t.push(`- ${n}`)}return t.join(`
1696
- `)}var VF,Uh,Gh=h(()=>{"use strict";ge();H();Ce();he();ae();Re();Qt();VF=50,Uh=class extends q{static{c(this,"ContextCheckpointCommands")}async save(e,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=(e??"untitled").trim().slice(0,200)||"untitled",i=await XF(t),a={version:1,title:o,createdAt:new Date().toISOString(),git:i,notes:(n.notes??"").trim()},l=bP(s.value);await Xi.mkdir(l,{recursive:!0});let u=JF(a.createdAt,o),d=ws.join(l,u);return await Xi.writeFile(d,JSON.stringify(a,null,2),"utf-8"),n.md?console.log(`## context-save
1696
+ `)}var VF,Uh,Gh=h(()=>{"use strict";ge();H();Re();he();ae();xe();Qt();VF=50,Uh=class extends q{static{c(this,"ContextCheckpointCommands")}async save(e,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=(e??"untitled").trim().slice(0,200)||"untitled",i=await XF(t),a={version:1,title:o,createdAt:new Date().toISOString(),git:i,notes:(n.notes??"").trim()},l=bP(s.value);await Xi.mkdir(l,{recursive:!0});let u=JF(a.createdAt,o),d=ws.join(l,u);return await Xi.writeFile(d,JSON.stringify(a,null,2),"utf-8"),n.md?console.log(`## context-save
1697
1697
 
1698
1698
  - **Title**: ${o}
1699
1699
  - **Branch**: ${i.branch}
@@ -1713,25 +1713,25 @@ ${m}
1713
1713
  ${a}`.split(`
1714
1714
  `).map(u=>u.trim()).find(u=>u.length>0);return{dimension:e,status:"fail",durationMs:Date.now()-t,diagnostic:l??w(o)}}}function tH(r){if(r.length===0)return 0;let e=0,t=0;for(let n of r)n.status!=="skipped"&&(t+=n.dimension.weight,n.status==="pass"&&(e+=n.dimension.weight));return t===0?0:Math.round(e/t*100)}function nH(r){return r==="pass"?"\u2713":r==="fail"?"\u2717":"\xB7"}function rH(r,e){if(e.length===0)return"health: no quality dimensions detected (add typecheck/lint/test/knip scripts to package.json)";let t=[];t.push(`health: ${r}/100`);for(let n of e){let s=n.durationMs>1e3?`${(n.durationMs/1e3).toFixed(1)}s`:`${n.durationMs}ms`,o=n.status==="fail"&&n.diagnostic?` \u2014 ${n.diagnostic.slice(0,80)}`:"";t.push(` ${nH(n.status)} ${n.dimension.name.padEnd(10)} ${s}${o}`)}return t.join(`
1715
1715
  `)}function sH(r,e){if(e.length===0)return"## Health\n\n_No quality dimensions detected. Add `typecheck`, `lint`, `test`, or `knip` scripts to `package.json`._\n";let t=[];t.push(`## Health \u2014 ${r}/100`),t.push(""),t.push("| Dimension | Status | Duration | Notes |"),t.push("|---|---|---|---|");for(let n of e){let s=n.durationMs>1e3?`${(n.durationMs/1e3).toFixed(1)}s`:`${n.durationMs}ms`,o=n.status==="fail"&&n.diagnostic?n.diagnostic.slice(0,100).replaceAll("|","\\|"):"";t.push(`| ${n.dimension.name} | ${n.status} | ${s} | ${o} |`)}return t.join(`
1716
- `)}var QF,Bh,EP=h(()=>{"use strict";H();Ce();J();he();Re();QF=[{name:"typecheck",scriptName:"typecheck",description:"TypeScript types",weight:25},{name:"lint",scriptName:"lint",description:"Lint rules",weight:20},{name:"tests",scriptName:"test",description:"Test suite",weight:35},{name:"dead-code",scriptName:"knip",description:"Dead-code scan",weight:20}],Bh=class extends q{static{c(this,"HealthCommands")}async health(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await ZF(t),i=[];for(let u of o)i.push(await eH(t,u));let a=tH(i);return n.md?console.log(sH(a,i)):console.log(rH(a,i)),{success:i.every(u=>u.status!=="fail"),score:a,results:i.length}}catch(s){let o=w(s);return $(o)}}};c(ZF,"detectDimensions");c(eH,"runDimension");c(tH,"computeScore");c(nH,"statusIcon");c(rH,"formatText");c(sH,"formatMarkdown")});var CP={};A(CP,{RetroCommands:()=>qh});import oH from"node:path";function iH(r){let t=(r??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let n=Number.parseInt(t[1],10);if(!Number.isFinite(n)||n<=0||n>365)return null;let s=t[2],o=new Date;if(s==="h"){let l=new Date(o.getTime()-n*60*60*1e3);return{label:`${n}h`,sinceIso:TP(l),hours:n}}let i=new Date(o.getFullYear(),o.getMonth(),o.getDate()),a=new Date(i.getTime()-n*24*60*60*1e3);return{label:`${n}d`,sinceIso:TP(a),hours:n*24}}function TP(r){let e=c(t=>`${t}`.padStart(2,"0"),"pad");return`${r.getFullYear()}-${e(r.getMonth()+1)}-${e(r.getDate())}T${e(r.getHours())}:${e(r.getMinutes())}:${e(r.getSeconds())}`}async function aH(r,e){let t="";try{t=(await re("git",["log",`--since=${e}`,"--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s"],{cwd:r,maxBuffer:16777216})).stdout}catch(n){let s=n.stderr??n.message??"";if(/does not have any commits|unknown revision|bad revision|HEAD/i.test(s))return[];throw n}return t.split(`
1716
+ `)}var QF,Bh,EP=h(()=>{"use strict";H();Re();J();he();xe();QF=[{name:"typecheck",scriptName:"typecheck",description:"TypeScript types",weight:25},{name:"lint",scriptName:"lint",description:"Lint rules",weight:20},{name:"tests",scriptName:"test",description:"Test suite",weight:35},{name:"dead-code",scriptName:"knip",description:"Dead-code scan",weight:20}],Bh=class extends q{static{c(this,"HealthCommands")}async health(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await ZF(t),i=[];for(let u of o)i.push(await eH(t,u));let a=tH(i);return n.md?console.log(sH(a,i)):console.log(rH(a,i)),{success:i.every(u=>u.status!=="fail"),score:a,results:i.length}}catch(s){let o=w(s);return $(o)}}};c(ZF,"detectDimensions");c(eH,"runDimension");c(tH,"computeScore");c(nH,"statusIcon");c(rH,"formatText");c(sH,"formatMarkdown")});var CP={};A(CP,{RetroCommands:()=>qh});import oH from"node:path";function iH(r){let t=(r??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let n=Number.parseInt(t[1],10);if(!Number.isFinite(n)||n<=0||n>365)return null;let s=t[2],o=new Date;if(s==="h"){let l=new Date(o.getTime()-n*60*60*1e3);return{label:`${n}h`,sinceIso:TP(l),hours:n}}let i=new Date(o.getFullYear(),o.getMonth(),o.getDate()),a=new Date(i.getTime()-n*24*60*60*1e3);return{label:`${n}d`,sinceIso:TP(a),hours:n*24}}function TP(r){let e=c(t=>`${t}`.padStart(2,"0"),"pad");return`${r.getFullYear()}-${e(r.getMonth()+1)}-${e(r.getDate())}T${e(r.getHours())}:${e(r.getMinutes())}:${e(r.getSeconds())}`}async function aH(r,e){let t="";try{t=(await re("git",["log",`--since=${e}`,"--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s"],{cwd:r,maxBuffer:16777216})).stdout}catch(n){let s=n.stderr??n.message??"";if(/does not have any commits|unknown revision|bad revision|HEAD/i.test(s))return[];throw n}return t.split(`
1717
1717
  `).filter(Boolean).map(n=>{let[s,o,i,a,...l]=n.split(" ");return{hash:s??"",authorName:o??"unknown",authorEmail:i??"",date:a??"",subject:l.join(" ")??""}}).filter(n=>n.hash)}function cH(r){let e=new Map;for(let t of r){let n=t.authorEmail||t.authorName,s=e.get(n);s||(s={name:t.authorName,email:t.authorEmail,commits:0,insertions:0,deletions:0,files:0,firstCommit:t.date,lastCommit:t.date},e.set(n,s)),s.commits++,t.date<s.firstCommit&&(s.firstCommit=t.date),t.date>s.lastCommit&&(s.lastCommit=t.date)}return Array.from(e.values()).sort((t,n)=>n.commits-t.commits)}function lH(r,e,t){if(e.length===0)return`No commits in the last ${r.label}.`;let n=[];n.push(`Retro \u2014 last ${r.label} \xB7 ${e.length} commits \xB7 ${t.length} contributors`),n.push("");for(let s of t)n.push(` ${s.commits.toString().padStart(3)} ${s.name} <${s.email}>`);n.push(""),n.push("Recent commits:");for(let s of e.slice(0,10))n.push(` ${s.hash.slice(0,7)} ${s.subject}`);return n.join(`
1718
1718
  `)}function uH(r,e,t){if(e.length===0)return`## Retro \u2014 last ${r.label}
1719
1719
 
1720
1720
  _No commits in the window._
1721
1721
  `;let n=[];n.push(`## Retro \u2014 last ${r.label}`),n.push(""),n.push(`- **Commits**: ${e.length}`),n.push(`- **Contributors**: ${t.length}`),n.push(""),n.push("### Per contributor"),n.push(""),n.push("| Author | Commits | First | Last |"),n.push("|---|---|---|---|");for(let s of t)n.push(`| ${s.name} | ${s.commits} | ${s.firstCommit.slice(0,10)} | ${s.lastCommit.slice(0,10)} |`);n.push(""),n.push("### Recent commits"),n.push("");for(let s of e.slice(0,15))n.push(`- \`${s.hash.slice(0,7)}\` ${s.subject} \u2014 _${s.authorName}_`);return n.join(`
1722
- `)}var qh,RP=h(()=>{"use strict";H();Ce();J();he();ae();Re();qh=class extends q{static{c(this,"RetroCommands")}async retro(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!await E(oH.join(t,".git")))return g.fail("Not in a git repository \u2014 `prjct retro` needs git history."),{success:!1,error:"Not a git repo"};let o=iH(e);if(!o)return g.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await aH(t,o.sinceIso),a=cH(i);return n.md?console.log(uH(o,i,a)):console.log(lH(o,i,a)),{success:!0,window:o.label,commits:i.length,contributors:a.length}}catch(s){let o=w(s);return $(o)}}};c(iH,"parseWindow");c(TP,"toLocalIso");c(aH,"readCommits");c(cH,"groupByAuthor");c(lH,"formatText");c(uH,"formatMarkdown")});var xP={};A(xP,{SkillAdherenceCommands:()=>Vh});function dH(r){let t=(r??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let n=Number.parseInt(t[1],10);return!Number.isFinite(n)||n<=0||n>365?null:t[2]==="h"?{label:`${n}h`,hours:n}:{label:`${n}d`,hours:n*24}}function pH(r){return(r.split(`
1722
+ `)}var qh,RP=h(()=>{"use strict";H();Re();J();he();ae();xe();qh=class extends q{static{c(this,"RetroCommands")}async retro(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!await E(oH.join(t,".git")))return g.fail("Not in a git repository \u2014 `prjct retro` needs git history."),{success:!1,error:"Not a git repo"};let o=iH(e);if(!o)return g.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await aH(t,o.sinceIso),a=cH(i);return n.md?console.log(uH(o,i,a)):console.log(lH(o,i,a)),{success:!0,window:o.label,commits:i.length,contributors:a.length}}catch(s){let o=w(s);return $(o)}}};c(iH,"parseWindow");c(TP,"toLocalIso");c(aH,"readCommits");c(cH,"groupByAuthor");c(lH,"formatText");c(uH,"formatMarkdown")});var xP={};A(xP,{SkillAdherenceCommands:()=>Vh});function dH(r){let t=(r??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let n=Number.parseInt(t[1],10);return!Number.isFinite(n)||n<=0||n>365?null:t[2]==="h"?{label:`${n}h`,hours:n}:{label:`${n}d`,hours:n*24}}function pH(r){return(r.split(`
1723
1723
  `)[0]??"").replace(/^\[skill-miss\]\s*/,"").trim()}function mH(r,e,t,n,s){if(t===0)return`Skill adherence \u2014 last ${r}: no skill-misses captured. Clean.`;let o=[];o.push(`Skill adherence \u2014 last ${r} \xB7 ${t} miss${t===1?"":"es"} \xB7 ${n} resolved \xB7 ${(s*100).toFixed(0)}% addressed`),o.push("");for(let i of e.slice(0,20)){let a=i.resolved?"\u2713":"\xB7",l=i.file?` (${i.file})`:"";o.push(` ${a} ${i.memId}${l} ${i.excerpt.slice(0,100)}`)}return o.join(`
1724
1724
  `)}function fH(r,e,t,n,s,o){if(t===0)return`## Skill adherence \u2014 last ${r}
1725
1725
 
1726
1726
  _No skill-misses captured in the window._
1727
1727
  `;let i=[];i.push(`## Skill adherence \u2014 last ${r}`),i.push(""),i.push(`- **Skill-misses**: ${t}`),i.push(`- **Resolved**: ${n} (${(s*100).toFixed(0)}% addressed)`),i.push(`- **Resolution decisions logged**: ${o}`),i.push(""),i.push("| State | Memory | File | Signal |"),i.push("|---|---|---|---|");for(let a of e.slice(0,30)){let l=a.resolved?"\u2713 resolved":"\xB7 open",u=a.file||"\u2014",d=a.excerpt.slice(0,110).replace(/\|/g,"\\|");i.push(`| ${l} | ${a.memId} | ${u} | ${d} |`)}return i.join(`
1728
- `)}var Vh,PP=h(()=>{"use strict";Q();Ee();H();he();ae();Re();Vh=class extends q{static{c(this,"SkillAdherenceCommands")}async skillAdherence(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=dH(e);if(!o)return g.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await P.readConfig(t);if(!i?.projectId)return g.fail("No prjct project here \u2014 run `prjct start` first."),{success:!1,error:"No project"};let a=Date.now()-o.hours*60*60*1e3,l=N.recall(i.projectId,{types:["improvement-signal"],tags:{source:"skill-miss-detector"},limit:300,dedupeByKey:!1}).filter(v=>Date.parse(v.rememberedAt)>=a),u=N.recall(i.projectId,{types:["decision"],tags:{resolves:"skill-miss"},limit:300,dedupeByKey:!1}).filter(v=>Date.parse(v.rememberedAt)>=a),d=new Set(u.map(v=>v.tags.relates).filter(v=>!!v)),p=l.map(v=>({memId:v.tags.relates??"\u2014",excerpt:pH(v.content),file:v.tags.file??"",rememberedAt:v.rememberedAt,resolved:v.tags.relates?d.has(v.tags.relates):!1})),m=p.length,f=p.filter(v=>v.resolved).length,y=m===0?1:f/m;return n.md?console.log(fH(o.label,p,m,f,y,u.length)):console.log(mH(o.label,p,m,f,y)),{success:!0,window:o.label,misses:m,resolved:f,adherence:Number(y.toFixed(2))}}catch(s){return $(w(s))}}};c(dH,"parseWindow");c(pH,"firstLine");c(mH,"formatText");c(fH,"formatMarkdown")});var _P={};A(_P,{ReviewRiskCommands:()=>Jh,_internal:()=>EH});async function kH(r,e){let{stdout:t}=await re("git",e,{cwd:r});return t.trim()}async function jo(r,e){try{return await kH(r,e)}catch{return null}}async function bH(r){let e="",t=await jo(r,["rev-parse","--abbrev-ref","origin/HEAD"]);if(t&&t!=="origin/HEAD")e=t;else for(let f of["main","master"])if(await jo(r,["rev-parse","--verify","--quiet",f])!==null){e=f;break}if(!e)return null;let n=await jo(r,["merge-base",e,"HEAD"]);if(!n)return null;let s=await jo(r,["rev-parse","HEAD"]);if(!s||s===n)return null;let o=await jo(r,["diff","--shortstat",`${n}..HEAD`]);if(o===null)return null;let i=o.match(/(\d+) files? changed/),a=o.match(/(\d+) insertions?/),l=o.match(/(\d+) deletions?/),u=i?Number.parseInt(i[1],10):0,d=(a?Number.parseInt(a[1],10):0)+(l?Number.parseInt(l[1],10):0),p=await jo(r,["diff","--name-only",`${n}..HEAD`])??"",m=[...new Set(p.split(`
1728
+ `)}var Vh,PP=h(()=>{"use strict";Q();Te();H();he();ae();xe();Vh=class extends q{static{c(this,"SkillAdherenceCommands")}async skillAdherence(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=dH(e);if(!o)return g.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await P.readConfig(t);if(!i?.projectId)return g.fail("No prjct project here \u2014 run `prjct start` first."),{success:!1,error:"No project"};let a=Date.now()-o.hours*60*60*1e3,l=N.recall(i.projectId,{types:["improvement-signal"],tags:{source:"skill-miss-detector"},limit:300,dedupeByKey:!1}).filter(v=>Date.parse(v.rememberedAt)>=a),u=N.recall(i.projectId,{types:["decision"],tags:{resolves:"skill-miss"},limit:300,dedupeByKey:!1}).filter(v=>Date.parse(v.rememberedAt)>=a),d=new Set(u.map(v=>v.tags.relates).filter(v=>!!v)),p=l.map(v=>({memId:v.tags.relates??"\u2014",excerpt:pH(v.content),file:v.tags.file??"",rememberedAt:v.rememberedAt,resolved:v.tags.relates?d.has(v.tags.relates):!1})),m=p.length,f=p.filter(v=>v.resolved).length,y=m===0?1:f/m;return n.md?console.log(fH(o.label,p,m,f,y,u.length)):console.log(mH(o.label,p,m,f,y)),{success:!0,window:o.label,misses:m,resolved:f,adherence:Number(y.toFixed(2))}}catch(s){return $(w(s))}}};c(dH,"parseWindow");c(pH,"firstLine");c(mH,"formatText");c(fH,"formatMarkdown")});var _P={};A(_P,{ReviewRiskCommands:()=>Jh,_internal:()=>EH});async function kH(r,e){let{stdout:t}=await re("git",e,{cwd:r});return t.trim()}async function jo(r,e){try{return await kH(r,e)}catch{return null}}async function bH(r){let e="",t=await jo(r,["rev-parse","--abbrev-ref","origin/HEAD"]);if(t&&t!=="origin/HEAD")e=t;else for(let f of["main","master"])if(await jo(r,["rev-parse","--verify","--quiet",f])!==null){e=f;break}if(!e)return null;let n=await jo(r,["merge-base",e,"HEAD"]);if(!n)return null;let s=await jo(r,["rev-parse","HEAD"]);if(!s||s===n)return null;let o=await jo(r,["diff","--shortstat",`${n}..HEAD`]);if(o===null)return null;let i=o.match(/(\d+) files? changed/),a=o.match(/(\d+) insertions?/),l=o.match(/(\d+) deletions?/),u=i?Number.parseInt(i[1],10):0,d=(a?Number.parseInt(a[1],10):0)+(l?Number.parseInt(l[1],10):0),p=await jo(r,["diff","--name-only",`${n}..HEAD`])??"",m=[...new Set(p.split(`
1729
1729
  `).filter(Boolean).map(f=>f.includes("/")?f.slice(0,f.indexOf("/")):"."))].sort();return{base:n.slice(0,7),files:u,loc:d,dirs:m}}function AP(r){return r.files<=gH&&r.loc<=hH?"trivial":r.files<=yH&&r.loc<=wH?"normal":"large"}function Kh(r){return r==="trivial"?"direct":r==="normal"?"single":"split"}function jP(r,e){return r==="direct"?"Small + low-risk \u2014 fine to land directly or as one tiny PR.":r==="single"?"Cohesive \u2014 one reviewable PR.":`Large \u2014 hard to review in one pass. Consider stacked PRs.${e.dirs.length>1?` Natural split lines: ${e.dirs.join(", ")}.`:" Consider splitting by concern even within this area."}`}function vH(r,e,t){return[`Review risk: ${e.toUpperCase()} \u2014 ${r.files} files, ${r.loc} LOC vs ${r.base}`,`Delivery: ${t} \u2014 ${jP(t,r)}`,"(advisory \u2014 you decide; nothing was changed)"].join(`
1730
1730
  `)}function SH(r,e,t){return["## Review risk","",`- **Tier**: ${e}`,`- **Changeset**: ${r.files} files, ${r.loc} LOC (vs \`${r.base}\`)`,`- **Dirs touched**: ${r.dirs.join(", ")||"\u2014"}`,`- **Suggested delivery**: \`${t}\` \u2014 ${jP(t,r)}`,"","_Advisory only \u2014 no gate, nothing changed._"].join(`
1731
- `)}var gH,hH,yH,wH,Jh,EH,$P=h(()=>{"use strict";H();Ce();he();Re();gH=2,hH=20,yH=10,wH=400,Jh=class extends q{static{c(this,"ReviewRiskCommands")}async reviewRisk(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await bH(t);if(!o){let l="review-risk: no comparable changeset (no base branch or nothing committed).";return console.log(n.md?`## Review risk
1731
+ `)}var gH,hH,yH,wH,Jh,EH,$P=h(()=>{"use strict";H();Re();he();xe();gH=2,hH=20,yH=10,wH=400,Jh=class extends q{static{c(this,"ReviewRiskCommands")}async reviewRisk(e=null,t=process.cwd(),n={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await bH(t);if(!o){let l="review-risk: no comparable changeset (no base branch or nothing committed).";return console.log(n.md?`## Review risk
1732
1732
 
1733
1733
  _${l}_
1734
- `:l),{success:!0,tier:"trivial",files:0,loc:0,geometry:Kh("trivial")}}let i=AP(o),a=Kh(i);return console.log(n.md?SH(o,i,a):vH(o,i,a)),{success:!0,tier:i,files:o.files,loc:o.loc,geometry:a}}catch(s){return $(w(s))}}};c(kH,"git");c(jo,"safeGit");c(bH,"computeChangeset");c(AP,"tierOf");c(Kh,"geometryOf");c(jP,"suggestion");c(vH,"formatText");c(SH,"formatMd");EH={tierOf:AP,geometryOf:Kh}});function zh(){return{version:1,entries:{}}}function pu(r){let e=S.getDoc(r,IP);return!e||e.version!==1||typeof e.entries!="object"||e.entries===null?zh():e}function Xh(r,e){S.setDoc(r,IP,e)}function _o(r){return/^[a-zA-Z0-9_-]+$/.test(r)&&r.length>0&&r.length<=80}function DP(r){return TH.includes(r)}var IP,TH,$o,MP=h(()=>{"use strict";X();IP="prefs:questions",TH=["always-ask","never-ask","auto-decide"];c(zh,"emptyDoc");c(pu,"read");c(Xh,"write");c(_o,"isValidQuestionId");c(DP,"isValidPreference");$o={set(r,e){if(!_o(e.questionId))throw new Error(`Invalid questionId "${e.questionId}". Must be alphanumeric with - or _, 1-80 chars.`);let t={questionId:e.questionId,preference:e.preference,setAt:new Date().toISOString(),reason:e.reason?.trim()||void 0},n=pu(r);return n.entries[e.questionId]=t,Xh(r,n),t},get(r,e){return pu(r).entries[e]??null},list(r){let e=pu(r);return Object.values(e.entries).sort((t,n)=>n.setAt.localeCompare(t.setAt))},check(r,e){let t=this.get(r,e);if(!t)return"ASK_NORMALLY";switch(t.preference){case"never-ask":return"NEVER_ASK";case"auto-decide":return"AUTO_DECIDE";default:return"ASK_NORMALLY"}},clear(r,e){let t=pu(r);if(!e){let n=Object.keys(t.entries).length;return Xh(r,zh()),n}return t.entries[e]?(delete t.entries[e],Xh(r,t),1):0}}});var OP={};A(OP,{PreferencesCommands:()=>Yh});var Yh,NP=h(()=>{"use strict";MP();H();he();ae();Re();Qt();Yh=class extends q{static{c(this,"PreferencesCommands")}async prefs(e,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=e[0]??"list",i=e.slice(1);switch(o){case"list":return this.handleList(s.value,n);case"get":return this.handleGet(s.value,i,n);case"check":return this.handleCheck(s.value,i);case"set":return this.handleSet(s.value,i,n);case"clear":return this.handleClear(s.value,i,n);default:return g.fail(`Unknown prefs subcommand: ${o}. Use: list, get, check, set, clear.`),{success:!1,error:`Unknown subcommand: ${o}`}}}catch(s){let o=w(s);return $(o)}}handleList(e,t){let n=$o.list(e);if(t.md)if(n.length===0)console.log(`## Question preferences
1734
+ `:l),{success:!0,tier:"trivial",files:0,loc:0,geometry:Kh("trivial")}}let i=AP(o),a=Kh(i);return console.log(n.md?SH(o,i,a):vH(o,i,a)),{success:!0,tier:i,files:o.files,loc:o.loc,geometry:a}}catch(s){return $(w(s))}}};c(kH,"git");c(jo,"safeGit");c(bH,"computeChangeset");c(AP,"tierOf");c(Kh,"geometryOf");c(jP,"suggestion");c(vH,"formatText");c(SH,"formatMd");EH={tierOf:AP,geometryOf:Kh}});function zh(){return{version:1,entries:{}}}function pu(r){let e=S.getDoc(r,IP);return!e||e.version!==1||typeof e.entries!="object"||e.entries===null?zh():e}function Xh(r,e){S.setDoc(r,IP,e)}function _o(r){return/^[a-zA-Z0-9_-]+$/.test(r)&&r.length>0&&r.length<=80}function DP(r){return TH.includes(r)}var IP,TH,$o,MP=h(()=>{"use strict";X();IP="prefs:questions",TH=["always-ask","never-ask","auto-decide"];c(zh,"emptyDoc");c(pu,"read");c(Xh,"write");c(_o,"isValidQuestionId");c(DP,"isValidPreference");$o={set(r,e){if(!_o(e.questionId))throw new Error(`Invalid questionId "${e.questionId}". Must be alphanumeric with - or _, 1-80 chars.`);let t={questionId:e.questionId,preference:e.preference,setAt:new Date().toISOString(),reason:e.reason?.trim()||void 0},n=pu(r);return n.entries[e.questionId]=t,Xh(r,n),t},get(r,e){return pu(r).entries[e]??null},list(r){let e=pu(r);return Object.values(e.entries).sort((t,n)=>n.setAt.localeCompare(t.setAt))},check(r,e){let t=this.get(r,e);if(!t)return"ASK_NORMALLY";switch(t.preference){case"never-ask":return"NEVER_ASK";case"auto-decide":return"AUTO_DECIDE";default:return"ASK_NORMALLY"}},clear(r,e){let t=pu(r);if(!e){let n=Object.keys(t.entries).length;return Xh(r,zh()),n}return t.entries[e]?(delete t.entries[e],Xh(r,t),1):0}}});var OP={};A(OP,{PreferencesCommands:()=>Yh});var Yh,NP=h(()=>{"use strict";MP();H();he();ae();xe();Qt();Yh=class extends q{static{c(this,"PreferencesCommands")}async prefs(e,t=process.cwd(),n={}){try{let s=await me(t);if(!s.ok)return s.result;let o=e[0]??"list",i=e.slice(1);switch(o){case"list":return this.handleList(s.value,n);case"get":return this.handleGet(s.value,i,n);case"check":return this.handleCheck(s.value,i);case"set":return this.handleSet(s.value,i,n);case"clear":return this.handleClear(s.value,i,n);default:return g.fail(`Unknown prefs subcommand: ${o}. Use: list, get, check, set, clear.`),{success:!1,error:`Unknown subcommand: ${o}`}}}catch(s){let o=w(s);return $(o)}}handleList(e,t){let n=$o.list(e);if(t.md)if(n.length===0)console.log(`## Question preferences
1735
1735
 
1736
1736
  _No preferences set._
1737
1737
  `);else{let s=n.map(o=>`| ${o.questionId} | ${o.preference} | ${o.setAt} | ${o.reason?o.reason.replaceAll("|","\\|"):""} |`).join(`
@@ -1765,7 +1765,7 @@ ${o}`}async function PH(){let r=Je(LP);if(!r)throw new Error(`Missing crew templ
1765
1765
  `}function $H(r){if(!Yi(r))return r;let e=r.indexOf(ny),t=r.indexOf(zi)+zi.length,n=`${r.slice(0,e)}${r.slice(t)}`;return n=n.replace(/\n{3,}/g,`
1766
1766
 
1767
1767
  `).trimEnd(),n.length>0?`${n}
1768
- `:""}async function ey(r){let e=bn.join(r,ks);try{return await kn.readFile(e,"utf-8")}catch{return null}}async function IH(r){let e=await Promise.all(Zh.map(async a=>({path:a.destRelative,installed:await E(bn.join(r,a.destRelative))}))),t=!1;try{let a=await P.getProjectId(r);a&&(rr.get(a),t=!0)}catch{t=!1}let n={path:"kv_store[crew:checkpoints]",installed:t},s=await ey(r),o={path:ks,installed:s!==null&&Yi(s)},i=e.every(a=>a.installed)&&n.installed&&o.installed;return{agents:e,checkpoints:n,claudeSnippet:o,complete:i}}async function DH(){let r=[];for await(let e of process.stdin)r.push(typeof e=="string"?Buffer.from(e):e);return Buffer.concat(r).toString("utf-8")}var ny,zi,Qh,CH,Zh,xH,LP,ks,ty,HP=h(()=>{"use strict";En();Q();Fm();mc();H();J();he();ae();Re();ny="<!-- prjct:crew:start - DO NOT REMOVE THIS MARKER -->",zi="<!-- prjct:crew:end - DO NOT REMOVE THIS MARKER -->",Qh="<!-- prjct:checkpoints:start - DO NOT EDIT (managed by `prjct crew checkpoints set|reset`) -->",CH="<!-- prjct:checkpoints:end -->";c(RH,"spliceCheckpoints");Zh=[{templateKey:"crew/agents/leader.md",destRelative:".claude/agents/leader.md"},{templateKey:"crew/agents/implementer.md",destRelative:".claude/agents/implementer.md"},{templateKey:"crew/agents/reviewer.md",destRelative:".claude/agents/reviewer.md"}],xH={templateKey:"crew/CHECKPOINTS.md",destRelative:".prjct/CHECKPOINTS.md"},LP="crew/CLAUDE-leader-mode.md",ks="CLAUDE.md";c(PH,"readSnippet");c(AH,"readTemplate");c(jH,"writeFileEnsureDir");c(Yi,"snippetPresent");c(_H,"appendSnippet");c($H,"stripSnippet");c(ey,"readClaudeMd");c(IH,"getStatus");ty=class extends q{static{c(this,"CrewCommands")}async install(e=null,t=process.cwd(),n={}){try{let s=[],o=[],i=await this.ensureProjectInit(t);if(!i.success)return i;let a=await P.getProjectId(t);if(!a)return $("No prjct project. Run `prjct init` first.",n);let l=rr.get(a);for(let k of Zh){let b=bn.join(t,k.destRelative),C=await AH(k.templateKey);k.destRelative===".claude/agents/reviewer.md"&&(C=RH(C,l.content));let R=await E(b);await jH(b,C),R?o.push(`${k.destRelative} (overwritten)`):s.push(k.destRelative)}let u=await PH(),d=bn.join(t,ks),p=await ey(t)??"",m=Yi(p),f=_H(p,u);f!==p?(await kn.writeFile(d,f,"utf-8"),s.push(`${ks} (${m?"snippet refreshed":"snippet appended"})`)):o.push(`${ks} (snippet already current)`);let y=`crew installed (${s.length} written, ${o.length} kept)`,v=["Suggested next step \u2014 wire verification hooks into .claude/settings.json:"," PostToolUse(Edit|Write) \u2192 run your test command"," Stop \u2192 run `prjct check` (when available) or your project test command","Use the /update-config skill or edit settings.json manually."].join(`
1768
+ `:""}async function ey(r){let e=bn.join(r,ks);try{return await kn.readFile(e,"utf-8")}catch{return null}}async function IH(r){let e=await Promise.all(Zh.map(async a=>({path:a.destRelative,installed:await E(bn.join(r,a.destRelative))}))),t=!1;try{let a=await P.getProjectId(r);a&&(rr.get(a),t=!0)}catch{t=!1}let n={path:"kv_store[crew:checkpoints]",installed:t},s=await ey(r),o={path:ks,installed:s!==null&&Yi(s)},i=e.every(a=>a.installed)&&n.installed&&o.installed;return{agents:e,checkpoints:n,claudeSnippet:o,complete:i}}async function DH(){let r=[];for await(let e of process.stdin)r.push(typeof e=="string"?Buffer.from(e):e);return Buffer.concat(r).toString("utf-8")}var ny,zi,Qh,CH,Zh,xH,LP,ks,ty,HP=h(()=>{"use strict";En();Q();Fm();mc();H();J();he();ae();xe();ny="<!-- prjct:crew:start - DO NOT REMOVE THIS MARKER -->",zi="<!-- prjct:crew:end - DO NOT REMOVE THIS MARKER -->",Qh="<!-- prjct:checkpoints:start - DO NOT EDIT (managed by `prjct crew checkpoints set|reset`) -->",CH="<!-- prjct:checkpoints:end -->";c(RH,"spliceCheckpoints");Zh=[{templateKey:"crew/agents/leader.md",destRelative:".claude/agents/leader.md"},{templateKey:"crew/agents/implementer.md",destRelative:".claude/agents/implementer.md"},{templateKey:"crew/agents/reviewer.md",destRelative:".claude/agents/reviewer.md"}],xH={templateKey:"crew/CHECKPOINTS.md",destRelative:".prjct/CHECKPOINTS.md"},LP="crew/CLAUDE-leader-mode.md",ks="CLAUDE.md";c(PH,"readSnippet");c(AH,"readTemplate");c(jH,"writeFileEnsureDir");c(Yi,"snippetPresent");c(_H,"appendSnippet");c($H,"stripSnippet");c(ey,"readClaudeMd");c(IH,"getStatus");ty=class extends q{static{c(this,"CrewCommands")}async install(e=null,t=process.cwd(),n={}){try{let s=[],o=[],i=await this.ensureProjectInit(t);if(!i.success)return i;let a=await P.getProjectId(t);if(!a)return $("No prjct project. Run `prjct init` first.",n);let l=rr.get(a);for(let k of Zh){let b=bn.join(t,k.destRelative),C=await AH(k.templateKey);k.destRelative===".claude/agents/reviewer.md"&&(C=RH(C,l.content));let R=await E(b);await jH(b,C),R?o.push(`${k.destRelative} (overwritten)`):s.push(k.destRelative)}let u=await PH(),d=bn.join(t,ks),p=await ey(t)??"",m=Yi(p),f=_H(p,u);f!==p?(await kn.writeFile(d,f,"utf-8"),s.push(`${ks} (${m?"snippet refreshed":"snippet appended"})`)):o.push(`${ks} (snippet already current)`);let y=`crew installed (${s.length} written, ${o.length} kept)`,v=["Suggested next step \u2014 wire verification hooks into .claude/settings.json:"," PostToolUse(Edit|Write) \u2192 run your test command"," Stop \u2192 run `prjct check` (when available) or your project test command","Use the /update-config skill or edit settings.json manually."].join(`
1769
1769
  `);if(n.md){let k=["# prjct crew installed","",`Wrote to \`${t}\`.`,"","## Files"];for(let b of s)k.push(`- written: \`${b}\``);for(let b of o)k.push(`- kept: \`${b}\``);k.push("","## Next step","",v),console.log(k.join(`
1770
1770
  `))}else{g.done(y);for(let k of s)g.info(`written: ${k}`);for(let k of o)g.info(`kept: ${k}`);console.log(""),console.log(v)}return{success:!0,written:s,skipped:o}}catch(s){let o=w(s);return $(o)}}async uninstall(e=null,t=process.cwd(),n={}){try{let s=[],o=[],i=[...Zh,xH];for(let p of i){let m=bn.join(t,p.destRelative);await E(m)?(await kn.rm(m),s.push(p.destRelative)):o.push(p.destRelative)}let a=bn.join(t,".claude/agents");try{(await kn.readdir(a)).length===0&&await kn.rmdir(a)}catch{}let l=bn.join(t,ks),u=await ey(t);if(u!==null&&Yi(u)){let p=$H(u);await kn.writeFile(l,p,"utf-8"),s.push(`${ks} (snippet stripped)`)}let d=`crew uninstalled (${s.length} removed)`;if(n.md){let p=["# prjct crew uninstalled",""];for(let m of s)p.push(`- removed: \`${m}\``);for(let m of o)p.push(`- not present: \`${m}\``);console.log(p.join(`
1771
1771
  `))}else{g.done(d);for(let p of s)g.info(`removed: ${p}`)}return{success:!0,removed:s,missing:o}}catch(s){let o=w(s);return $(o)}}async status(e=null,t=process.cwd(),n={}){try{let s=await IH(t),o=c(i=>i.installed?"installed":"missing","tag");if(n.md){let i=["# prjct crew status","",`Project: \`${t}\``,`Complete: **${s.complete?"yes":"no"}**`,"","## Pieces"];for(let a of s.agents)i.push(`- ${o(a)}: \`${a.path}\``);i.push(`- ${o(s.checkpoints)}: \`${s.checkpoints.path}\``),i.push(`- ${o(s.claudeSnippet)}: \`${s.claudeSnippet.path}\` (snippet)`),console.log(i.join(`
@@ -1800,7 +1800,7 @@ ${bs.dim("Providers:")}`}var XH,oy=h(()=>{"use strict";XH={ready:bs.green("\u271
1800
1800
  ${s.dim("Run 'prjct start' to configure (CLI providers)")}
1801
1801
  ${s.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1802
1802
  ${s.cyan("https://prjct.app")}
1803
- `)}else return!1;return!0}var zP=h(()=>{"use strict";c(zH,"runBinCommand")});var YP=lA((Dce,YH)=>{YH.exports={name:"prjct-cli",version:"2.49.0",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",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/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var r1={};import QP from"node:os";import gu from"node:path";import vs from"chalk";async function QH(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let n=await Promise.resolve().then(()=>uA(YP()));await t1(n.version),process.exit(0)}if(["-h","--help",void 0].includes(r)&&(n1(),process.exit(0)),r&&lu(r)&&!We.getByName(r)){let n=cu[r];n&&(g.failWithHint({message:`'prjct ${r}' was removed in v2. ${n.note}`,hint:`Use: ${n.replacement}`}),process.exit(1))}if(r&&!We.getByName(r)&&!(e.length===0&&Vi(r)!==null)){let s=[r,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));r="capture",e=[s,...o]}let t=e.includes("--md");t||g.start();try{let n=We.getByName(r);if(!n){let m=Vi(r),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(qo("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:f})),t||g.end(),process.exit(1)}if(n.deprecated){let m=n.replacedBy?`Use 'prjct ${n.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}n.implemented||(g.failWithHint({message:`Command '${r}' 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}=e1(n,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;n.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let a=ZH(n,s);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await P.getProjectId(process.cwd()),l&&(await Ni.expireIfStale(l),await Ni.touch(l))}catch{}let d=new gs,p;if(r==="analyze")p=await d.analyze(o);else if(r==="setup")p=await d.setup(o);else if(r==="update"||r==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,y=We.getByName(r);if(y?.optionSchema)p=await We.executeWithOptions(r,m,process.cwd(),au(o,y.optionSchema));else{let k={spec:c(b=>uu(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 a JSON payload as positional arg"}),"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")}[r];if(k)p=await k(m);else throw new Error(`Command '${r}' has no handler`)}}if(l){let m=Date.now()-u;try{await Ni.trackCommand(l,r,m)}catch{}try{await Li.recordTiming(l,"command_duration",m,{command:r});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await Li.recordTiming(l,"startup_time",y)}await Li.recordMemory(l,{command:r})}catch{}}p?.message&&console.log(p.message),t||g.end(),process.exit(p?.success?0:1)}catch(n){console.error("Error:",w(n)),process.env.DEBUG&&console.error(xu(n)),t||g.end(),process.exit(1)}}function ZH(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return qo("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function e1(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function t1(r){let e=await qn(),t=gu.join(QP.homedir(),".claude","commands","p.md"),n=gu.join(QP.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([E(t),E(n),E(gu.join(process.cwd(),".cursor","commands","sync.md")),E(gu.join(process.cwd(),".cursor"))]),l=await Jo();console.log(sy(r)),console.log(Io("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?vs.dim(` (v${e.claude.version})`):"")),console.log(Io("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?vs.dim(` (v${e.gemini.version})`):"")),console.log(Io("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${vs.dim("(run prjct start)")}`:"")),console.log(Io("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${vs.dim("(use /sync, /task)")}`:a?` ${vs.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
1803
+ `)}else return!1;return!0}var zP=h(()=>{"use strict";c(zH,"runBinCommand")});var YP=lA((Dce,YH)=>{YH.exports={name:"prjct-cli",version:"2.49.1",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",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/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var r1={};import QP from"node:os";import gu from"node:path";import vs from"chalk";async function QH(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let n=await Promise.resolve().then(()=>uA(YP()));await t1(n.version),process.exit(0)}if(["-h","--help",void 0].includes(r)&&(n1(),process.exit(0)),r&&lu(r)&&!We.getByName(r)){let n=cu[r];n&&(g.failWithHint({message:`'prjct ${r}' was removed in v2. ${n.note}`,hint:`Use: ${n.replacement}`}),process.exit(1))}if(r&&!We.getByName(r)&&!(e.length===0&&Vi(r)!==null)){let s=[r,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));r="capture",e=[s,...o]}let t=e.includes("--md");t||g.start();try{let n=We.getByName(r);if(!n){let m=Vi(r),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(qo("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:f})),t||g.end(),process.exit(1)}if(n.deprecated){let m=n.replacedBy?`Use 'prjct ${n.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}n.implemented||(g.failWithHint({message:`Command '${r}' 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}=e1(n,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;n.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let a=ZH(n,s);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await P.getProjectId(process.cwd()),l&&(await Ni.expireIfStale(l),await Ni.touch(l))}catch{}let d=new gs,p;if(r==="analyze")p=await d.analyze(o);else if(r==="setup")p=await d.setup(o);else if(r==="update"||r==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,y=We.getByName(r);if(y?.optionSchema)p=await We.executeWithOptions(r,m,process.cwd(),au(o,y.optionSchema));else{let k={spec:c(b=>uu(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 a JSON payload as positional arg"}),"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")}[r];if(k)p=await k(m);else throw new Error(`Command '${r}' has no handler`)}}if(l){let m=Date.now()-u;try{await Ni.trackCommand(l,r,m)}catch{}try{await Li.recordTiming(l,"command_duration",m,{command:r});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await Li.recordTiming(l,"startup_time",y)}await Li.recordMemory(l,{command:r})}catch{}}p?.message&&console.log(p.message),t||g.end(),process.exit(p?.success?0:1)}catch(n){console.error("Error:",w(n)),process.env.DEBUG&&console.error(xu(n)),t||g.end(),process.exit(1)}}function ZH(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return qo("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function e1(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function t1(r){let e=await qn(),t=gu.join(QP.homedir(),".claude","commands","p.md"),n=gu.join(QP.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([E(t),E(n),E(gu.join(process.cwd(),".cursor","commands","sync.md")),E(gu.join(process.cwd(),".cursor"))]),l=await Jo();console.log(sy(r)),console.log(Io("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?vs.dim(` (v${e.claude.version})`):"")),console.log(Io("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?vs.dim(` (v${e.gemini.version})`):"")),console.log(Io("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${vs.dim("(run prjct start)")}`:"")),console.log(Io("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${vs.dim("(use /sync, /task)")}`:a?` ${vs.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
1804
1804
  ${vs.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1805
1805
  ${vs.cyan("https://prjct.app")}
1806
1806
  `)}function n1(){console.log(`