prjct-cli 2.76.0 → 2.76.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.
@@ -5,14 +5,14 @@ import { dirname as __pathDirname } from 'path';
5
5
  var require = __createRequire(import.meta.url);
6
6
  var __filename = __fileURLToPath(import.meta.url);
7
7
  var __dirname = __pathDirname(__filename);
8
- var Gi=Object.defineProperty;var AP=Object.getOwnPropertyDescriptor;var _P=Object.getOwnPropertyNames;var jP=Object.prototype.hasOwnProperty;var a=(n,e)=>Gi(n,"name",{value:e,configurable:!0}),rt=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var h=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(r){throw t=[r],r}};var N=(n,e)=>{for(var t in e)Gi(n,t,{get:e[t],enumerable:!0})},IP=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of _P(e))!jP.call(n,s)&&s!==t&&Gi(n,s,{get:()=>e[s],enumerable:!(r=AP(e,s))||r.enumerable});return n};var st=n=>IP(Gi({},"__esModule",{value:!0}),n);import{z as yo}from"zod";function NP(n){return MP[n]??bn}function Sh(n){let e=NP(n);return e.model==="opus"&&e.effort==="max"?'Dispatch with the Agent tool using `model: "opus"` and full reasoning effort \u2014 this is the IMPLEMENTER; it writes code and needs the best model.':`Dispatch with the Agent tool using \`model: "${e.model}"\` (NOT the parent's max model). Apply ${e.effort}, not exhaustive, effort \u2014 this is an orchestration/review role: return the verdict, don't over-deliberate. A smaller model at decent effort is correct here and far faster.`}function ko(n,e){let t=n.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=r[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var DP,$P,bn,MP,wo,ls=h(()=>{"use strict";DP={model:"opus",effort:"max"},$P={model:"haiku",effort:"decent"},bn={model:"sonnet",effort:"decent"},MP={implementer:DP,orchestrator:$P,"strategic-review":bn,"architecture-review":bn,"design-review":bn,"spec-review":bn,review:bn,security:bn,investigate:bn,reviewer:bn};a(NP,"getAgentModelPolicy");a(Sh,"renderModelDirective");wo=yo.object({provider:yo.string(),model:yo.string(),cliVersion:yo.string().optional(),recordedAt:yo.string()});a(ko,"compareSemver")});import{z as v}from"zod";var OP,Wi,LP,FP,HP,UP,GP,WP,BP,Yl,Th,Ch,Rh,Ql,xh,Eh,qP,VP,JP,Ph,XP,Ah,Bi=h(()=>{"use strict";ls();OP=v.enum(["low","medium","high","critical"]),Wi=v.enum(["feature","bug","improvement","chore"]),LP=v.enum(["active","backlog","previously_active"]),FP=v.enum(["H0","H1","H2","H3"]),HP=v.enum(["bug","feature","refactor","docs","chore","security","unknown"]),UP=v.enum(["low","medium","high"]),GP=v.enum(["regression-test","focused-tests","docs-if-public-behavior","config-preservation","spec-or-design","edge-cases","scope-check"]),WP=v.enum(["verify-before-done","scope-check","review-before-ship","spec-before-implementation"]),BP=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Yl=v.object({title:v.string(),description:v.string(),filesChanged:v.array(v.object({path:v.string(),action:v.enum(["created","modified","deleted"])})),whatWasDone:v.array(v.string()).min(1),outputForNextAgent:v.string().min(1),notes:v.string().optional()}),Th=v.object({output:v.string().min(1,"Subtask output is required"),summary:Yl}),Ch=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:BP,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:Yl.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),Rh=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),Ql=v.object({level:FP,kind:HP,risk:UP,expectedEvidence:v.array(GP),scopeHints:v.array(v.string()),gates:v.array(WP),rationale:v.string(),createdAt:v.string()}),xh=v.object({id:v.string(),description:v.string(),type:Wi.optional(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(Ch).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:Rh.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),linkedSpecId:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:wo.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional(),parentDescription:v.string().optional(),branch:v.string().optional(),prUrl:v.string().optional(),harness:Ql.optional()}),Eh=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional(),type:Wi.optional(),sessionId:v.string().optional(),featureId:v.string().optional(),subtasks:v.array(Ch).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:Rh.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:wo.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional(),harness:Ql.optional()}),qP=v.object({stackConfirmed:v.array(v.string()).optional(),patternsDiscovered:v.array(v.string()).optional(),agentAccuracy:v.array(v.object({agent:v.string(),rating:v.enum(["helpful","neutral","inaccurate"]),note:v.string().optional()})).optional(),issuesEncountered:v.array(v.string()).optional()}),VP=v.object({taskId:v.string(),title:v.string(),classification:Wi,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(Yl),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:qP.optional(),harness:Ql.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional()}),JP=xh.extend({workspaceId:v.string(),worktreePath:v.string().optional(),agentSessionId:v.string().optional(),jiraId:v.string().optional(),jiraUuid:v.string().optional(),dispatchedFrom:v.string().optional()}),Ph=v.object({currentTask:xh.nullable(),previousTask:Eh.nullable().optional(),pausedTasks:v.array(Eh).optional(),taskHistory:v.array(VP).optional(),activeTasks:v.array(JP).optional(),lastUpdated:v.string()}),XP=v.object({id:v.string(),description:v.string(),body:v.string().optional(),priority:OP,type:Wi,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:LP,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),Ah=v.object({tasks:v.array(XP),lastUpdated:v.string()})});function _h(n){let e=n.getFullYear(),t=(n.getMonth()+1).toString().padStart(2,"0"),r=n.getDate().toString().padStart(2,"0");return`${e}-${t}-${r}`}function jh(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}function T(){return new Date().toISOString()}function us(n){let e=new Date;return e.setDate(e.getDate()-n),e}function Ih(n){let e=Math.floor(n/1e3),t=Math.floor(e/60),r=Math.floor(t/60),s=Math.floor(r/24);return s>0?`${s}d ${r%24}h`:r>0?`${r}h ${t%60}m`:t>0?`${t}m`:`${e}s`}var MU,ie=h(()=>{"use strict";a(_h,"formatDate");a(jh,"getYearMonthDay");a(T,"getTimestamp");a(us,"getDaysAgo");a(Ih,"formatDuration");MU=new Intl.RelativeTimeFormat("en",{numeric:"always"})});var bo,Zl,Ar,eu=h(()=>{"use strict";bo={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"}},Zl=class{static{a(this,"WorkflowStateMachine")}getCurrentState(e,t){if(t){let s=(e?.activeTasks??[]).find(o=>o.workspaceId===t);return s?this.statusToState(s):"idle"}let r=e?.currentTask;return r?this.statusToState(r):(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle"}statusToState(e){switch((typeof e.status=="string"?e.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return"working"}}canTransition(e,t){if(bo[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 bo[e]}getPrompt(e){return bo[e].prompt}getValidCommands(e){return bo[e].transitions}formatNextSteps(e){return bo[e].transitions.map(r=>{switch(r){case"task":return"prjct task <desc> Start new task";case"done":return"prjct status done Complete current task";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${r}`}})}},Ar=new Zl});import zP from"node:crypto";function Xe(){return zP.randomUUID()}var vn=h(()=>{"use strict";a(Xe,"generateUUID")});var Dh,$h,Mh,tu=h(()=>{"use strict";Dh=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"]),$h=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Mh=/(?:import|from)\s+['"]([^'"]+)['"]/g});function KP(n){return n instanceof Error&&"code"in n}function B(n){return KP(n)&&n.code==="ENOENT"}function w(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var W=h(()=>{"use strict";a(KP,"isNodeError");a(B,"isNotFoundError");a(w,"getErrorMessage")});import Lh from"node:fs/promises";async function Fh(n,e){let t;try{t=await Lh.readFile(n,"utf-8")}catch(o){if(B(o))return null;throw o}let r;try{r=JSON.parse(t)}catch{return await Nh(n,t),Oh(n,"Malformed JSON"),null}let s=e.safeParse(r);return s.success?r:(await Nh(n,t),Oh(n,YP(s.error)),null)}async function Nh(n,e){let t=`${n}.backup`;try{await Lh.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function Oh(n,e){console.error(`[prjct] Warning: Corrupted storage file: ${n}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function YP(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Hh=h(()=>{"use strict";W();a(Fh,"safeRead");a(Nh,"createBackup");a(Oh,"logCorruption");a(YP,"formatZodError")});import bt from"node:fs/promises";import vo from"node:path";async function Xn(n,e={}){let t=[],r=e.maxFiles??1/0,s=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=r)return;let c=await bt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of c){if(t.length>=r)break;let u=String(l.name);if(Dh.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!s||!s.has(u)))continue;let d=vo.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(vo.relative(n,d))}}return a(o,"walk"),await o(n),t}async function zn(n,e,t){let r=[];for(let s=0;s<n.length;s+=e){let o=await Promise.all(n.slice(s,s+e).map(t));for(let i of o)i!==null&&r.push(i)}return r}async function Oe(n,e=null,t){if(t)return await Fh(n,t)??e;try{let r=await bt.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(B(r))return e;throw r}}async function Ee(n,e,t=2){let r=vo.dirname(n);await bt.mkdir(r,{recursive:!0});let s=`${JSON.stringify(e,null,t)}
9
- `;await bt.writeFile(n,s,"utf-8")}async function Gt(n,e=""){try{return await bt.readFile(n,"utf-8")}catch(t){if(B(t))return e;throw t}}async function Kn(n,e){let t=vo.dirname(n);await bt.mkdir(t,{recursive:!0}),await bt.writeFile(n,e,"utf-8")}async function ds(n,e){let t=vo.dirname(n);await bt.mkdir(t,{recursive:!0});let r=`${n}.tmp`;await bt.writeFile(r,e,"utf-8"),await bt.rename(r,n)}async function A(n){try{return await bt.access(n),!0}catch(e){if(B(e))return!1;throw e}}async function Be(n){try{return(await bt.stat(n)).isDirectory()}catch(e){if(B(e))return!1;throw e}}async function Pt(n){await bt.mkdir(n,{recursive:!0})}async function Yn(n,e={}){try{let r=await bt.readdir(n,{withFileTypes:!0});return e.filesOnly&&(r=r.filter(s=>s.isFile())),e.dirsOnly&&(r=r.filter(s=>s.isDirectory())),e.extension&&(r=r.filter(s=>s.name.endsWith(e.extension))),r.map(s=>s.name)}catch(t){if(B(t))return[];throw t}}var ee=h(()=>{"use strict";tu();Hh();W();a(Xn,"walkDir");a(zn,"batchProcess");a(Oe,"readJson");a(Ee,"writeJson");a(Gt,"readFile");a(Kn,"writeFile");a(ds,"writeFileAtomic");a(A,"fileExists");a(Be,"dirExists");a(Pt,"ensureDir");a(Yn,"listFiles")});import QP from"node:os";import Uh from"node:path";function ot(){let n=process.env.PRJCT_CLI_HOME?.trim();return n?Uh.resolve(n):Uh.join(QP.homedir(),".prjct-cli")}var Qn=h(()=>{"use strict";a(ot,"resolveCliHome")});import{globSync as ZP}from"node:fs";import ps from"node:fs/promises";import mt from"node:path";async function nu(n){let e={isMonorepo:!1,type:null,rootPath:n,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 r of t)if(await A(mt.join(n,r.file))){e.isMonorepo=!0,e.type=r.type;break}if(!e.isMonorepo){let r=mt.join(n,"package.json");if(await A(r))try{JSON.parse(await ps.readFile(r,"utf-8")).workspaces&&(e.isMonorepo=!0,e.type="npm")}catch{}}return e.isMonorepo&&(e.packages=await ru(n,e.type)),e}async function ru(n,e){let t=[],r=[];try{if(e==="pnpm"){let o=(await ps.readFile(mt.join(n,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);o&&(r=o[1].split(`
10
- `).map(i=>i.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(e==="npm"||e==="lerna"){let s=mt.join(n,"package.json"),o=JSON.parse(await ps.readFile(s,"utf-8"));if(Array.isArray(o.workspaces)?r=o.workspaces:o.workspaces?.packages&&(r=o.workspaces.packages),e==="lerna"){let i=mt.join(n,"lerna.json");if(await A(i)){let c=JSON.parse(await ps.readFile(i,"utf-8"));c.packages&&(r=c.packages)}}}else if(e==="nx")r=["apps/*","libs/*","packages/*"];else if(e==="turborepo"){let s=mt.join(n,"package.json"),o=JSON.parse(await ps.readFile(s,"utf-8"));Array.isArray(o.workspaces)&&(r=o.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let s of r){if(s.startsWith("!"))continue;let o=ZP(s,{cwd:n});for(let i of o){let c=mt.join(n,i),l=mt.join(c,"package.json");if(await A(l))try{let u=JSON.parse(await ps.readFile(l,"utf-8")),d=mt.join(c,"PRJCT.md");t.push({name:u.name||mt.basename(i),path:c,relativePath:i,hasPrjctMd:await A(d)})}catch{}}}}catch{}return t}async function Gh(n,e){if(!e.isMonorepo)return null;let t=mt.resolve(n);for(let r of e.packages){let s=mt.resolve(r.path);if(t.startsWith(s))return r}return null}async function Wh(n){let e=mt.resolve(n),t=mt.parse(e).root;for(;e!==t;){if((await nu(e)).isMonorepo)return e;e=mt.dirname(e)}return null}var Bh=h(()=>{"use strict";ee();a(nu,"detectMonorepo");a(ru,"discoverMonorepoPackages");a(Gh,"findContainingPackage");a(Wh,"findMonorepoRoot")});import eA from"node:os";import qh from"node:path";function At(){let n=process.env.HOME?.trim()||process.env.USERPROFILE?.trim();return n?qh.resolve(n):eA.homedir()}function Le(...n){return qh.join(At(),...n)}var Zn=h(()=>{"use strict";a(At,"resolveUserHome");a(Le,"resolveUserPath")});import Vi from"node:fs";import Vh from"node:path";function Jh(){return Vh.join(ot(),"config")}function Ji(){return Vh.join(Jh(),"global.json")}function Xh(n){try{let e=Vi.statSync(n);return`${n}|${e.mtimeMs}|${e.size}`}catch{return`${n}|absent`}}function ou(){let n=Ji(),e=Xh(n);if(qi!==null&&e===su)return qi;let t={};try{let r=Vi.readFileSync(n,"utf-8"),s=JSON.parse(r);s&&typeof s=="object"&&!Array.isArray(s)&&(t=s)}catch{}return qi=t,su=e,t}function tA(n){Vi.mkdirSync(Jh(),{recursive:!0}),Vi.writeFileSync(Ji(),`${JSON.stringify(n,null,2)}
11
- `,"utf-8"),qi=n,su=Xh(Ji())}function it(n){return ou()[n]}function zh(){return ou()}function _e(n,e){let t=ou();e===void 0?delete t[n]:t[n]=e,tA(t)}function iu(n){_e(n,void 0)}function Kh(){return Ji()}var qi,su,So=h(()=>{"use strict";Qn();a(Jh,"configDir");a(Ji,"configFilePath");qi=null,su="";a(Xh,"fileStamp");a(ou,"readRaw");a(tA,"writeRaw");a(it,"getConfig");a(zh,"getAll");a(_e,"setConfig");a(iu,"unsetConfig");a(Kh,"configPath")});import nA from"node:fs";import er from"node:path";function cu(){let n=it(Yh);return typeof n=="string"&&n.trim().length>0?n:void 0}function Xi(n){let e=au(n);return _e(Yh,e),e}function au(n){let e=n.trim();if(!e)throw new Error("Vault root cannot be empty");return e==="~"?At():e.startsWith(`~${er.sep}`)||e.startsWith("~/")||e.startsWith("~\\")?er.resolve(At(),e.slice(2)):er.resolve(e)}function lu(){return er.join(rA(),"prjct")}function zi(){let n=process.env.PRJCT_VAULT_ROOT?.trim();if(n)return au(n);let e=cu();return e?au(e):lu()}function rA(){let n=At();if(process.platform==="linux"){let e=sA(n);if(e)return e}return er.join(n,"Documents")}function sA(n){let e=process.env.XDG_CONFIG_HOME?.trim()||er.join(n,".config"),t=er.join(e,"user-dirs.dirs");try{let s=nA.readFileSync(t,"utf-8").match(/^XDG_DOCUMENTS_DIR=(['"])(.+)\1/m);if(!s)return;let o=s[2].replace(/^\$HOME(?=\/|$)/,n);return er.resolve(o)}catch{return}}var Yh,Ki=h(()=>{"use strict";Zn();So();Yh="vault-root";a(cu,"getConfiguredVaultRoot");a(Xi,"setConfiguredVaultRoot");a(au,"resolveVaultRootInput");a(lu,"getDefaultVaultRoot");a(zi,"resolveVaultRoot");a(rA,"resolveDocumentsDir");a(sA,"readXdgDocumentsDir")});var uu={};N(uu,{execAsync:()=>q,execFileAsync:()=>G});import{exec as oA,execFile as iA}from"node:child_process";import{promisify as Qh}from"node:util";var q,G,ue=h(()=>{"use strict";q=Qh(oA),G=Qh(iA)});var Yi={};N(Yi,{worktreeService:()=>aA});import du from"node:fs/promises";import dn from"node:path";var Zh,pu,aA,Qi=h(()=>{"use strict";ue();ee();Zh=".worktrees",pu=class{static{a(this,"WorktreeService")}async create(e,t,r={}){let s=await this.getMainWorktree(e),o=dn.join(s,Zh,t),i=r.branch||`feat/${t}`;await du.mkdir(dn.join(s,Zh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await q(`git worktree add "${o}" -b "${i}"${c}`,{cwd:s});let{stdout:l}=await q("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let r=await this.getMainWorktree(e),s;if(t)try{let{stdout:o}=await q("git rev-parse --abbrev-ref HEAD",{cwd:e});s=o.trim()}catch{}if(await q(`git worktree remove "${e}" --force`,{cwd:r}),t&&s&&s!=="main"&&s!=="master")try{await q(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:r}=await q("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(r,t)}async detect(e){try{let{stdout:t}=await q("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await q("git rev-parse --git-dir",{cwd:e}),s=dn.resolve(e,t.trim()),o=dn.resolve(e,r.trim());if(s!==o){let{stdout:i}=await q("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await q("git rev-parse HEAD",{cwd:e}),{stdout:l}=await q("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=dn.basename(u);return{path:u,branch:i.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await q("git worktree list --porcelain",{cwd:e}),s=r.split(`
12
- `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:t}=await q("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let r=dn.join(t,".env");await A(r)&&await du.copyFile(r,dn.join(e,".env"));let s=dn.join(t,".prjct"),o=dn.join(e,".prjct");await A(s)&&!await A(o)&&await du.symlink(s,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),r=[],s=await this.getMainWorktree(e);await q("git worktree prune",{cwd:s});for(let o of t)o.isMain||await A(o.path)||r.push(o.slug);return r}parsePorcelainOutput(e,t){let r=[],s=e.trim().split(`
8
+ var Gi=Object.defineProperty;var AP=Object.getOwnPropertyDescriptor;var _P=Object.getOwnPropertyNames;var jP=Object.prototype.hasOwnProperty;var a=(n,e)=>Gi(n,"name",{value:e,configurable:!0}),rt=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var h=(n,e,t)=>()=>{if(t)throw t[0];try{return n&&(e=n(n=0)),e}catch(r){throw t=[r],r}};var N=(n,e)=>{for(var t in e)Gi(n,t,{get:e[t],enumerable:!0})},IP=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of _P(e))!jP.call(n,s)&&s!==t&&Gi(n,s,{get:()=>e[s],enumerable:!(r=AP(e,s))||r.enumerable});return n};var st=n=>IP(Gi({},"__esModule",{value:!0}),n);import{z as yo}from"zod";function NP(n){return MP[n]??bn}function Sh(n){let e=NP(n);return e.model==="opus"&&e.effort==="max"?'Dispatch with the Agent tool using `model: "opus"` and full reasoning effort \u2014 this is the IMPLEMENTER; it writes code and needs the best model.':`Dispatch with the Agent tool using \`model: "${e.model}"\` (NOT the parent's max model). Apply ${e.effort}, not exhaustive, effort \u2014 this is an orchestration/review role: return the verdict, don't over-deliberate. A smaller model at decent effort is correct here and far faster.`}function ko(n,e){let t=n.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]??0,i=r[s]??0;if(o<i)return-1;if(o>i)return 1}return 0}var DP,$P,bn,MP,wo,ls=h(()=>{"use strict";DP={model:"opus",effort:"max"},$P={model:"haiku",effort:"decent"},bn={model:"sonnet",effort:"decent"},MP={implementer:DP,orchestrator:$P,"strategic-review":bn,"architecture-review":bn,"design-review":bn,"spec-review":bn,review:bn,security:bn,investigate:bn,reviewer:bn};a(NP,"getAgentModelPolicy");a(Sh,"renderModelDirective");wo=yo.object({provider:yo.string(),model:yo.string(),cliVersion:yo.string().optional(),recordedAt:yo.string()});a(ko,"compareSemver")});import{z as v}from"zod";var OP,Wi,LP,FP,HP,UP,GP,WP,BP,Yl,Th,Ch,Rh,Ql,xh,Eh,qP,VP,JP,Ph,XP,Ah,Bi=h(()=>{"use strict";ls();OP=v.enum(["low","medium","high","critical"]),Wi=v.enum(["feature","bug","improvement","chore"]),LP=v.enum(["active","backlog","previously_active"]),FP=v.enum(["H0","H1","H2","H3"]),HP=v.enum(["bug","feature","refactor","docs","chore","security","unknown"]),UP=v.enum(["low","medium","high"]),GP=v.enum(["regression-test","focused-tests","docs-if-public-behavior","config-preservation","spec-or-design","edge-cases","scope-check"]),WP=v.enum(["verify-before-done","scope-check","review-before-ship","spec-before-implementation"]),BP=v.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),Yl=v.object({title:v.string(),description:v.string(),filesChanged:v.array(v.object({path:v.string(),action:v.enum(["created","modified","deleted"])})),whatWasDone:v.array(v.string()).min(1),outputForNextAgent:v.string().min(1),notes:v.string().optional()}),Th=v.object({output:v.string().min(1,"Subtask output is required"),summary:Yl}),Ch=v.object({id:v.string(),description:v.string(),domain:v.string(),agent:v.string(),status:BP,dependsOn:v.array(v.string()),startedAt:v.string().optional(),completedAt:v.string().optional(),output:v.string().optional(),summary:Yl.optional(),skipReason:v.string().optional(),blockReason:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional()}),Rh=v.object({completed:v.number(),total:v.number(),percentage:v.number()}),Ql=v.object({level:FP,kind:HP,risk:UP,expectedEvidence:v.array(GP),scopeHints:v.array(v.string()),gates:v.array(WP),rationale:v.string(),createdAt:v.string()}),xh=v.object({id:v.string(),description:v.string(),type:Wi.optional(),startedAt:v.string(),sessionId:v.string(),featureId:v.string().optional(),subtasks:v.array(Ch).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:Rh.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),linkedSpecId:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:wo.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional(),parentDescription:v.string().optional(),branch:v.string().optional(),prUrl:v.string().optional(),harness:Ql.optional()}),Eh=v.object({id:v.string(),description:v.string(),status:v.literal("paused"),startedAt:v.string(),pausedAt:v.string(),pauseReason:v.string().optional(),type:Wi.optional(),sessionId:v.string().optional(),featureId:v.string().optional(),subtasks:v.array(Ch).optional(),currentSubtaskIndex:v.number().optional(),subtaskProgress:Rh.optional(),linearId:v.string().optional(),linearUuid:v.string().optional(),estimatedPoints:v.number().optional(),estimatedMinutes:v.number().optional(),modelMetadata:wo.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional(),harness:Ql.optional()}),qP=v.object({stackConfirmed:v.array(v.string()).optional(),patternsDiscovered:v.array(v.string()).optional(),agentAccuracy:v.array(v.object({agent:v.string(),rating:v.enum(["helpful","neutral","inaccurate"]),note:v.string().optional()})).optional(),issuesEncountered:v.array(v.string()).optional()}),VP=v.object({taskId:v.string(),title:v.string(),classification:Wi,startedAt:v.string(),completedAt:v.string(),subtaskCount:v.number(),subtaskSummaries:v.array(Yl),outcome:v.string(),branchName:v.string(),linearId:v.string().optional(),linearUuid:v.string().optional(),prUrl:v.string().optional(),feedback:qP.optional(),harness:Ql.optional(),tokensIn:v.number().optional(),tokensOut:v.number().optional()}),JP=xh.extend({workspaceId:v.string(),worktreePath:v.string().optional(),agentSessionId:v.string().optional(),jiraId:v.string().optional(),jiraUuid:v.string().optional(),dispatchedFrom:v.string().optional()}),Ph=v.object({currentTask:xh.nullable(),previousTask:Eh.nullable().optional(),pausedTasks:v.array(Eh).optional(),taskHistory:v.array(VP).optional(),activeTasks:v.array(JP).optional(),lastUpdated:v.string()}),XP=v.object({id:v.string(),description:v.string(),body:v.string().optional(),priority:OP,type:Wi,featureId:v.string().optional(),originFeature:v.string().optional(),completed:v.boolean(),completedAt:v.string().optional(),createdAt:v.string(),section:LP,agent:v.string().optional(),groupName:v.string().optional(),groupId:v.string().optional()}),Ah=v.object({tasks:v.array(XP),lastUpdated:v.string()})});function _h(n){let e=n.getFullYear(),t=(n.getMonth()+1).toString().padStart(2,"0"),r=n.getDate().toString().padStart(2,"0");return`${e}-${t}-${r}`}function jh(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}function T(){return new Date().toISOString()}function us(n){let e=new Date;return e.setDate(e.getDate()-n),e}function Ih(n){let e=Math.floor(n/1e3),t=Math.floor(e/60),r=Math.floor(t/60),s=Math.floor(r/24);return s>0?`${s}d ${r%24}h`:r>0?`${r}h ${t%60}m`:t>0?`${t}m`:`${e}s`}var MU,ie=h(()=>{"use strict";a(_h,"formatDate");a(jh,"getYearMonthDay");a(T,"getTimestamp");a(us,"getDaysAgo");a(Ih,"formatDuration");MU=new Intl.RelativeTimeFormat("en",{numeric:"always"})});var bo,Zl,Ar,eu=h(()=>{"use strict";bo={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"}},Zl=class{static{a(this,"WorkflowStateMachine")}getCurrentState(e,t){if(t){let s=(e?.activeTasks??[]).find(o=>o.workspaceId===t);return s?this.statusToState(s):"idle"}let r=e?.currentTask;return r?this.statusToState(r):(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle"}statusToState(e){switch((typeof e.status=="string"?e.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return"working"}}canTransition(e,t){if(bo[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 bo[e]}getPrompt(e){return bo[e].prompt}getValidCommands(e){return bo[e].transitions}formatNextSteps(e){return bo[e].transitions.map(r=>{switch(r){case"task":return"prjct task <desc> Start new task";case"done":return"prjct status done Complete current task";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${r}`}})}},Ar=new Zl});import zP from"node:crypto";function Xe(){return zP.randomUUID()}var vn=h(()=>{"use strict";a(Xe,"generateUUID")});var Dh,$h,Mh,tu=h(()=>{"use strict";Dh=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"]),$h=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],Mh=/(?:import|from)\s+['"]([^'"]+)['"]/g});function KP(n){return n instanceof Error&&"code"in n}function B(n){return KP(n)&&n.code==="ENOENT"}function w(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var W=h(()=>{"use strict";a(KP,"isNodeError");a(B,"isNotFoundError");a(w,"getErrorMessage")});import Lh from"node:fs/promises";async function Fh(n,e){let t;try{t=await Lh.readFile(n,"utf-8")}catch(o){if(B(o))return null;throw o}let r;try{r=JSON.parse(t)}catch{return await Nh(n,t),Oh(n,"Malformed JSON"),null}let s=e.safeParse(r);return s.success?r:(await Nh(n,t),Oh(n,YP(s.error)),null)}async function Nh(n,e){let t=`${n}.backup`;try{await Lh.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function Oh(n,e){console.error(`[prjct] Warning: Corrupted storage file: ${n}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function YP(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Hh=h(()=>{"use strict";W();a(Fh,"safeRead");a(Nh,"createBackup");a(Oh,"logCorruption");a(YP,"formatZodError")});import bt from"node:fs/promises";import vo from"node:path";async function zn(n,e={}){let t=[],r=e.maxFiles??1/0,s=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=r)return;let c=await bt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of c){if(t.length>=r)break;let u=String(l.name);if(Dh.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!s||!s.has(u)))continue;let d=vo.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(vo.relative(n,d))}}return a(o,"walk"),await o(n),t}async function Kn(n,e,t){let r=[];for(let s=0;s<n.length;s+=e){let o=await Promise.all(n.slice(s,s+e).map(t));for(let i of o)i!==null&&r.push(i)}return r}async function Oe(n,e=null,t){if(t)return await Fh(n,t)??e;try{let r=await bt.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(B(r))return e;throw r}}async function Ee(n,e,t=2){let r=vo.dirname(n);await bt.mkdir(r,{recursive:!0});let s=`${JSON.stringify(e,null,t)}
9
+ `;await bt.writeFile(n,s,"utf-8")}async function Gt(n,e=""){try{return await bt.readFile(n,"utf-8")}catch(t){if(B(t))return e;throw t}}async function Yn(n,e){let t=vo.dirname(n);await bt.mkdir(t,{recursive:!0}),await bt.writeFile(n,e,"utf-8")}async function ds(n,e){let t=vo.dirname(n);await bt.mkdir(t,{recursive:!0});let r=`${n}.tmp`;await bt.writeFile(r,e,"utf-8"),await bt.rename(r,n)}async function A(n){try{return await bt.access(n),!0}catch(e){if(B(e))return!1;throw e}}async function Be(n){try{return(await bt.stat(n)).isDirectory()}catch(e){if(B(e))return!1;throw e}}async function Pt(n){await bt.mkdir(n,{recursive:!0})}async function Qn(n,e={}){try{let r=await bt.readdir(n,{withFileTypes:!0});return e.filesOnly&&(r=r.filter(s=>s.isFile())),e.dirsOnly&&(r=r.filter(s=>s.isDirectory())),e.extension&&(r=r.filter(s=>s.name.endsWith(e.extension))),r.map(s=>s.name)}catch(t){if(B(t))return[];throw t}}var ee=h(()=>{"use strict";tu();Hh();W();a(zn,"walkDir");a(Kn,"batchProcess");a(Oe,"readJson");a(Ee,"writeJson");a(Gt,"readFile");a(Yn,"writeFile");a(ds,"writeFileAtomic");a(A,"fileExists");a(Be,"dirExists");a(Pt,"ensureDir");a(Qn,"listFiles")});import QP from"node:os";import Uh from"node:path";function ot(){let n=process.env.PRJCT_CLI_HOME?.trim();return n?Uh.resolve(n):Uh.join(QP.homedir(),".prjct-cli")}var Zn=h(()=>{"use strict";a(ot,"resolveCliHome")});import{globSync as ZP}from"node:fs";import ps from"node:fs/promises";import mt from"node:path";async function nu(n){let e={isMonorepo:!1,type:null,rootPath:n,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 r of t)if(await A(mt.join(n,r.file))){e.isMonorepo=!0,e.type=r.type;break}if(!e.isMonorepo){let r=mt.join(n,"package.json");if(await A(r))try{JSON.parse(await ps.readFile(r,"utf-8")).workspaces&&(e.isMonorepo=!0,e.type="npm")}catch{}}return e.isMonorepo&&(e.packages=await ru(n,e.type)),e}async function ru(n,e){let t=[],r=[];try{if(e==="pnpm"){let o=(await ps.readFile(mt.join(n,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);o&&(r=o[1].split(`
10
+ `).map(i=>i.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(e==="npm"||e==="lerna"){let s=mt.join(n,"package.json"),o=JSON.parse(await ps.readFile(s,"utf-8"));if(Array.isArray(o.workspaces)?r=o.workspaces:o.workspaces?.packages&&(r=o.workspaces.packages),e==="lerna"){let i=mt.join(n,"lerna.json");if(await A(i)){let c=JSON.parse(await ps.readFile(i,"utf-8"));c.packages&&(r=c.packages)}}}else if(e==="nx")r=["apps/*","libs/*","packages/*"];else if(e==="turborepo"){let s=mt.join(n,"package.json"),o=JSON.parse(await ps.readFile(s,"utf-8"));Array.isArray(o.workspaces)&&(r=o.workspaces)}r.length===0&&(r=["packages/*","apps/*","libs/*"]);for(let s of r){if(s.startsWith("!"))continue;let o=ZP(s,{cwd:n});for(let i of o){let c=mt.join(n,i),l=mt.join(c,"package.json");if(await A(l))try{let u=JSON.parse(await ps.readFile(l,"utf-8")),d=mt.join(c,"PRJCT.md");t.push({name:u.name||mt.basename(i),path:c,relativePath:i,hasPrjctMd:await A(d)})}catch{}}}}catch{}return t}async function Gh(n,e){if(!e.isMonorepo)return null;let t=mt.resolve(n);for(let r of e.packages){let s=mt.resolve(r.path);if(t.startsWith(s))return r}return null}async function Wh(n){let e=mt.resolve(n),t=mt.parse(e).root;for(;e!==t;){if((await nu(e)).isMonorepo)return e;e=mt.dirname(e)}return null}var Bh=h(()=>{"use strict";ee();a(nu,"detectMonorepo");a(ru,"discoverMonorepoPackages");a(Gh,"findContainingPackage");a(Wh,"findMonorepoRoot")});import eA from"node:os";import qh from"node:path";function At(){let n=process.env.HOME?.trim()||process.env.USERPROFILE?.trim();return n?qh.resolve(n):eA.homedir()}function Le(...n){return qh.join(At(),...n)}var er=h(()=>{"use strict";a(At,"resolveUserHome");a(Le,"resolveUserPath")});import Vi from"node:fs";import Vh from"node:path";function Jh(){return Vh.join(ot(),"config")}function Ji(){return Vh.join(Jh(),"global.json")}function Xh(n){try{let e=Vi.statSync(n);return`${n}|${e.mtimeMs}|${e.size}`}catch{return`${n}|absent`}}function ou(){let n=Ji(),e=Xh(n);if(qi!==null&&e===su)return qi;let t={};try{let r=Vi.readFileSync(n,"utf-8"),s=JSON.parse(r);s&&typeof s=="object"&&!Array.isArray(s)&&(t=s)}catch{}return qi=t,su=e,t}function tA(n){Vi.mkdirSync(Jh(),{recursive:!0}),Vi.writeFileSync(Ji(),`${JSON.stringify(n,null,2)}
11
+ `,"utf-8"),qi=n,su=Xh(Ji())}function it(n){return ou()[n]}function zh(){return ou()}function _e(n,e){let t=ou();e===void 0?delete t[n]:t[n]=e,tA(t)}function iu(n){_e(n,void 0)}function Kh(){return Ji()}var qi,su,So=h(()=>{"use strict";Zn();a(Jh,"configDir");a(Ji,"configFilePath");qi=null,su="";a(Xh,"fileStamp");a(ou,"readRaw");a(tA,"writeRaw");a(it,"getConfig");a(zh,"getAll");a(_e,"setConfig");a(iu,"unsetConfig");a(Kh,"configPath")});import nA from"node:fs";import tr from"node:path";function cu(){let n=it(Yh);return typeof n=="string"&&n.trim().length>0?n:void 0}function Xi(n){let e=au(n);return _e(Yh,e),e}function au(n){let e=n.trim();if(!e)throw new Error("Vault root cannot be empty");return e==="~"?At():e.startsWith(`~${tr.sep}`)||e.startsWith("~/")||e.startsWith("~\\")?tr.resolve(At(),e.slice(2)):tr.resolve(e)}function lu(){return tr.join(rA(),"prjct")}function zi(){let n=process.env.PRJCT_VAULT_ROOT?.trim();if(n)return au(n);let e=cu();return e?au(e):lu()}function rA(){let n=At();if(process.platform==="linux"){let e=sA(n);if(e)return e}return tr.join(n,"Documents")}function sA(n){let e=process.env.XDG_CONFIG_HOME?.trim()||tr.join(n,".config"),t=tr.join(e,"user-dirs.dirs");try{let s=nA.readFileSync(t,"utf-8").match(/^XDG_DOCUMENTS_DIR=(['"])(.+)\1/m);if(!s)return;let o=s[2].replace(/^\$HOME(?=\/|$)/,n);return tr.resolve(o)}catch{return}}var Yh,Ki=h(()=>{"use strict";er();So();Yh="vault-root";a(cu,"getConfiguredVaultRoot");a(Xi,"setConfiguredVaultRoot");a(au,"resolveVaultRootInput");a(lu,"getDefaultVaultRoot");a(zi,"resolveVaultRoot");a(rA,"resolveDocumentsDir");a(sA,"readXdgDocumentsDir")});var uu={};N(uu,{execAsync:()=>q,execFileAsync:()=>G});import{exec as oA,execFile as iA}from"node:child_process";import{promisify as Qh}from"node:util";var q,G,ue=h(()=>{"use strict";q=Qh(oA),G=Qh(iA)});var Yi={};N(Yi,{worktreeService:()=>aA});import du from"node:fs/promises";import pn from"node:path";var Zh,pu,aA,Qi=h(()=>{"use strict";ue();ee();Zh=".worktrees",pu=class{static{a(this,"WorktreeService")}async create(e,t,r={}){let s=await this.getMainWorktree(e),o=pn.join(s,Zh,t),i=r.branch||`feat/${t}`;await du.mkdir(pn.join(s,Zh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await q(`git worktree add "${o}" -b "${i}"${c}`,{cwd:s});let{stdout:l}=await q("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let r=await this.getMainWorktree(e),s;if(t)try{let{stdout:o}=await q("git rev-parse --abbrev-ref HEAD",{cwd:e});s=o.trim()}catch{}if(await q(`git worktree remove "${e}" --force`,{cwd:r}),t&&s&&s!=="main"&&s!=="master")try{await q(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:r}=await q("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(r,t)}async detect(e){try{let{stdout:t}=await q("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await q("git rev-parse --git-dir",{cwd:e}),s=pn.resolve(e,t.trim()),o=pn.resolve(e,r.trim());if(s!==o){let{stdout:i}=await q("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await q("git rev-parse HEAD",{cwd:e}),{stdout:l}=await q("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=pn.basename(u);return{path:u,branch:i.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await q("git worktree list --porcelain",{cwd:e}),s=r.split(`
12
+ `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:t}=await q("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let r=pn.join(t,".env");await A(r)&&await du.copyFile(r,pn.join(e,".env"));let s=pn.join(t,".prjct"),o=pn.join(e,".prjct");await A(s)&&!await A(o)&&await du.symlink(s,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),r=[],s=await this.getMainWorktree(e);await q("git worktree prune",{cwd:s});for(let o of t)o.isMain||await A(o.path)||r.push(o.slug);return r}parsePorcelainOutput(e,t){let r=[],s=e.trim().split(`
13
13
 
14
14
  `);for(let o of s){if(!o.trim())continue;let i=o.trim().split(`
15
- `),c="",l="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?c=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(c){let p=c===t||d;r.push({path:c,branch:u,commit:l,isMain:p,slug:p?"main":dn.basename(c)})}}return r}},aA=new pu});import pn from"node:path";function ey(){return zi()}async function ty(n,e){if(e&&e.trim().length>0)return lA(n,e);let t=await cA(n),s=pn.basename(pn.resolve(t)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return pn.join(ey(),s)}function ny(n,e){let r=pn.basename(pn.resolve(n)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",s=e.replace(/-/g,"").slice(0,8);return pn.join(ey(),`${r}-${s}`)}function ry(n){return pn.join(n,".prjct","wiki")}async function cA(n){try{let{worktreeService:e}=await Promise.resolve().then(()=>(Qi(),Yi));return await e.detect(n)&&await e.getMainWorktree(n)||n}catch{return n}}function lA(n,e){let t=e.trim();return(t.startsWith("~/")||t==="~")&&(t=pn.join(At(),t.slice(1))),pn.isAbsolute(t)||(t=pn.resolve(n,t)),t}var sy=h(()=>{"use strict";Ki();Zn();a(ey,"getVaultRoot");a(ty,"getWikiPath");a(ny,"getWikiPathWithProjectHash");a(ry,"getLegacyWikiPath");a(cA,"resolveProjectRootPath");a(lA,"resolveVaultOverride")});var mu=h(()=>{"use strict"});function oy(n,e){let t=typeof n=="string"?new Date(n).getTime():n;return Date.now()-t>e}var Zi,fu=h(()=>{"use strict";a(oy,"isExpired");Zi=class{static{a(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((r,s)=>r[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of t)this.cache.delete(r)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import uA from"node:fs/promises";import dA from"node:path";async function ay(){try{let n=await uA.readFile(iy(),"utf-8"),e=JSON.parse(n);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||oy(e.timestamp,pA)?null:e.detection}catch{return null}}async function cy(n){let e={timestamp:new Date().toISOString(),detection:n};await Ee(iy(),e)}var iy,pA,ly=h(()=>{"use strict";Re();fu();ee();iy=a(()=>dA.join(j.getCachePath(),"providers.json"),"cacheFile"),pA=600*1e3;a(ay,"readProviderCache");a(cy,"writeProviderCache")});var nr={};N(nr,{ClaudeProvider:()=>ea,CursorProvider:()=>py,GeminiProvider:()=>yu,Providers:()=>ms,detectAllProviders:()=>ku,detectAntigravity:()=>gA,detectCodex:()=>tr,detectProvider:()=>hu,getActiveProvider:()=>ta,getProviderBranding:()=>na,selectProvider:()=>hA,validateCliVersion:()=>fy});import gu from"node:path";async function my(n){try{let{stdout:e}=await q(`which ${n}`,{timeout:2e3});return e.trim()}catch{return null}}async function fA(n){try{let{stdout:e}=await q(`${n} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function hu(n){let e=ms[n];if(!e.cliCommand)return{installed:!1};let t=await my(e.cliCommand);if(!t)return{installed:!1};let r=await fA(e.cliCommand),s=fy(n,r||void 0);return{installed:!0,version:r||void 0,path:t,versionWarning:s||void 0}}function fy(n,e){let t=ms[n];return!t.minCliVersion||!e?null:ko(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 ku(n=!1){if(!n){let i=await ay();if(i)return i}let[e,t,r]=await Promise.all([hu("claude"),hu("gemini"),tr()]),s={installed:r.installed},o={claude:e,gemini:t,codex:s};return await cy(o).catch(()=>{}),o}async function ta(n){if(n&&ms[n])return ms[n];let e=await ku(),t=[e.claude.installed?"claude":null,e.gemini.installed?"gemini":null,e.codex.installed?"codex":null].filter(Boolean);return t.length===1?ms[t[0]]:e.claude.installed?ea:e.gemini.installed?yu:e.codex.installed?wu:ea}function na(n){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[n]||"\u26A1 prjct"}}async function gA(){let n=dy.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=gu.join(n,"skills","prjct","SKILL.md"),[t,r]=await Promise.all([A(n),A(e)]);return{installed:t,skillInstalled:r,configPath:t?n:void 0}}async function tr(){let n=wu.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=await my("codex"),t=gu.join(n,"skills","prjct","SKILL.md"),r=await A(t),s=!!e||await A(gu.join(n,"auth.json"));return{installed:s,skillInstalled:r,configPath:s?n:void 0}}async function hA(){let n=await ku();return{provider:n.claude.installed?"claude":n.gemini.installed?"gemini":n.codex.installed?"codex":"claude",detection:n}}var ea,yu,dy,py,mA,wu,ms,_t=h(()=>{"use strict";mu();ls();ue();ee();ly();Zn();ea={name:"claude",displayName:"Claude Code",cliCommand:"claude",get configDir(){return Le(".claude")},contextFile:"CLAUDE.md",get skillsDir(){return Le(".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"},yu={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",get configDir(){return Le(".gemini")},contextFile:"GEMINI.md",get skillsDir(){return Le(".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"},dy={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,get configDir(){return Le(".gemini","antigravity")},contextFile:"ANTIGRAVITY.md",get skillsDir(){return Le(".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"},py={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"},mA={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"},wu={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",get configDir(){return Le(".codex")},contextFile:"AGENTS.md",get skillsDir(){return Le(".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"},ms={claude:ea,gemini:yu,cursor:py,antigravity:dy,windsurf:mA,codex:wu};a(my,"whichCommand");a(fA,"getCliVersion");a(hu,"detectProvider");a(fy,"validateCliVersion");a(ku,"detectAllProviders");a(ta,"getActiveProvider");a(na,"getProviderBranding");a(gA,"detectAntigravity");a(tr,"detectCodex");a(hA,"selectProvider")});var gy={};N(gy,{default:()=>j});import yA from"node:crypto";import ra from"node:fs/promises";import ve from"node:path";var bu,wA,j,Re=h(()=>{"use strict";ie();ee();Qn();Bh();sy();Zn();bu=class{static{a(this,"PathManager")}globalBaseDir;globalConfigDir;constructor(){this.globalBaseDir=ot(),this.globalConfigDir=ve.join(this.globalBaseDir,"config")}get globalProjectsDir(){let e=process.env.PRJCT_PROJECTS_DIR;return e?ve.resolve(e):ve.join(this.globalBaseDir,"projects")}setGlobalBaseDir(e){this.globalBaseDir=ve.resolve(e),this.globalConfigDir=ve.join(this.globalBaseDir,"config")}generateProjectId(e){return yA.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return ve.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return ve.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return ve.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return ve.join(e,".prjct")}async hasLegacyStructure(e){return await Be(this.getLegacyPrjctPath(e))}async hasConfig(e){return await A(this.getLocalConfigPath(e))}async ensureGlobalStructure(){await Pt(this.globalBaseDir),await Pt(this.globalProjectsDir),await Pt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),r=["analysis","memory"];for(let s of r)await Pt(ve.join(t,s));return await Pt(ve.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:r,month:s,day:o}=jh(t);return ve.join(this.getGlobalProjectPath(e),"sessions",r,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let r=this.getSessionPath(e,t);return await Pt(r),r}async listSessions(e,t=null,r=null){let s=ve.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await ra.readdir(s,{withFileTypes:!0});for(let c of i){if(!c.isDirectory()||t&&c.name!==t.toString())continue;let l=ve.join(s,c.name),u=await ra.readdir(l,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||r&&d.name!==r.toString().padStart(2,"0"))continue;let p=ve.join(l,d.name),m=await ra.readdir(p,{withFileTypes:!0});for(let f of m)f.isDirectory()&&o.push({year:c.name,month:d.name,day:f.name,path:ve.join(p,f.name),date:new Date(`${c.name}-${d.name}-${f.name}`)})}}return o.sort((c,l)=>l.date.getTime()-c.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,r=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=r)}getFilePath(e,t,r){return ve.join(this.getGlobalProjectPath(e),t,r)}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 Be(this.getGlobalProjectPath(e))}getDisplayPath(e){let t=At();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return ve.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return ve.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return ve.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return ve.join(this.globalBaseDir,".running")}getDocsPath(){return ve.join(this.globalBaseDir,"docs")}getCachePath(){return ve.join(this.globalBaseDir,"cache")}getStatePath(){return ve.join(this.globalBaseDir,"state")}getStatusLinePath(){return ve.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(_t(),st(nr)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(_t(),st(nr)).getActiveProvider();return(_t(),st(nr)).getGlobalSettingsPath(e.name)}getClaudeDir(){return Le(".claude")}getClaudeSettingsPath(){return ve.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return ve.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return ve.join(this.getGlobalProjectPath(e),"context")}async getWikiPath(e,t){return ty(e,t)}getWikiPathWithProjectHash(e,t){return ny(e,t)}getLegacyWikiPath(e){return ry(e)}async detectMonorepo(e){return nu(e)}async discoverMonorepoPackages(e,t){return ru(e,t)}async findContainingPackage(e,t){return Gh(e,t)}async findMonorepoRoot(e){return Wh(e)}},wA=new bu,j=wA});import kA from"node:crypto";function _r(n){let e=n.toLowerCase().replace(/\s+/g," ").trim();return kA.createHash("sha256").update(e).digest("hex")}var sa=h(()=>{"use strict";a(_r,"memoryFingerprint")});var hy,yy=h(()=>{"use strict";hy=`
15
+ `),c="",l="",u="",d=!1;for(let p of i)p.startsWith("worktree ")?c=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(c){let p=c===t||d;r.push({path:c,branch:u,commit:l,isMain:p,slug:p?"main":pn.basename(c)})}}return r}},aA=new pu});import mn from"node:path";function ey(){return zi()}async function ty(n,e){if(e&&e.trim().length>0)return lA(n,e);let t=await cA(n),s=mn.basename(mn.resolve(t)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project";return mn.join(ey(),s)}function ny(n,e){let r=mn.basename(mn.resolve(n)).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"project",s=e.replace(/-/g,"").slice(0,8);return mn.join(ey(),`${r}-${s}`)}function ry(n){return mn.join(n,".prjct","wiki")}async function cA(n){try{let{worktreeService:e}=await Promise.resolve().then(()=>(Qi(),Yi));return await e.detect(n)&&await e.getMainWorktree(n)||n}catch{return n}}function lA(n,e){let t=e.trim();return(t.startsWith("~/")||t==="~")&&(t=mn.join(At(),t.slice(1))),mn.isAbsolute(t)||(t=mn.resolve(n,t)),t}var sy=h(()=>{"use strict";Ki();er();a(ey,"getVaultRoot");a(ty,"getWikiPath");a(ny,"getWikiPathWithProjectHash");a(ry,"getLegacyWikiPath");a(cA,"resolveProjectRootPath");a(lA,"resolveVaultOverride")});var mu=h(()=>{"use strict"});function oy(n,e){let t=typeof n=="string"?new Date(n).getTime():n;return Date.now()-t>e}var Zi,fu=h(()=>{"use strict";a(oy,"isExpired");Zi=class{static{a(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((r,s)=>r[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of t)this.cache.delete(r)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});import uA from"node:fs/promises";import dA from"node:path";async function ay(){try{let n=await uA.readFile(iy(),"utf-8"),e=JSON.parse(n);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||oy(e.timestamp,pA)?null:e.detection}catch{return null}}async function cy(n){let e={timestamp:new Date().toISOString(),detection:n};await Ee(iy(),e)}var iy,pA,ly=h(()=>{"use strict";Re();fu();ee();iy=a(()=>dA.join(j.getCachePath(),"providers.json"),"cacheFile"),pA=600*1e3;a(ay,"readProviderCache");a(cy,"writeProviderCache")});var rr={};N(rr,{ClaudeProvider:()=>ea,CursorProvider:()=>py,GeminiProvider:()=>yu,Providers:()=>ms,detectAllProviders:()=>ku,detectAntigravity:()=>gA,detectCodex:()=>nr,detectProvider:()=>hu,getActiveProvider:()=>ta,getProviderBranding:()=>na,selectProvider:()=>hA,validateCliVersion:()=>fy});import gu from"node:path";async function my(n){try{let{stdout:e}=await q(`which ${n}`,{timeout:2e3});return e.trim()}catch{return null}}async function fA(n){try{let{stdout:e}=await q(`${n} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function hu(n){let e=ms[n];if(!e.cliCommand)return{installed:!1};let t=await my(e.cliCommand);if(!t)return{installed:!1};let r=await fA(e.cliCommand),s=fy(n,r||void 0);return{installed:!0,version:r||void 0,path:t,versionWarning:s||void 0}}function fy(n,e){let t=ms[n];return!t.minCliVersion||!e?null:ko(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 ku(n=!1){if(!n){let i=await ay();if(i)return i}let[e,t,r]=await Promise.all([hu("claude"),hu("gemini"),nr()]),s={installed:r.installed},o={claude:e,gemini:t,codex:s};return await cy(o).catch(()=>{}),o}async function ta(n){if(n&&ms[n])return ms[n];let e=await ku(),t=[e.claude.installed?"claude":null,e.gemini.installed?"gemini":null,e.codex.installed?"codex":null].filter(Boolean);return t.length===1?ms[t[0]]:e.claude.installed?ea:e.gemini.installed?yu:e.codex.installed?wu:ea}function na(n){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[n]||"\u26A1 prjct"}}async function gA(){let n=dy.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=gu.join(n,"skills","prjct","SKILL.md"),[t,r]=await Promise.all([A(n),A(e)]);return{installed:t,skillInstalled:r,configPath:t?n:void 0}}async function nr(){let n=wu.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=await my("codex"),t=gu.join(n,"skills","prjct","SKILL.md"),r=await A(t),s=!!e||await A(gu.join(n,"auth.json"));return{installed:s,skillInstalled:r,configPath:s?n:void 0}}async function hA(){let n=await ku();return{provider:n.claude.installed?"claude":n.gemini.installed?"gemini":n.codex.installed?"codex":"claude",detection:n}}var ea,yu,dy,py,mA,wu,ms,_t=h(()=>{"use strict";mu();ls();ue();ee();ly();er();ea={name:"claude",displayName:"Claude Code",cliCommand:"claude",get configDir(){return Le(".claude")},contextFile:"CLAUDE.md",get skillsDir(){return Le(".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"},yu={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",get configDir(){return Le(".gemini")},contextFile:"GEMINI.md",get skillsDir(){return Le(".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"},dy={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,get configDir(){return Le(".gemini","antigravity")},contextFile:"ANTIGRAVITY.md",get skillsDir(){return Le(".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"},py={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"},mA={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"},wu={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",get configDir(){return Le(".codex")},contextFile:"AGENTS.md",get skillsDir(){return Le(".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"},ms={claude:ea,gemini:yu,cursor:py,antigravity:dy,windsurf:mA,codex:wu};a(my,"whichCommand");a(fA,"getCliVersion");a(hu,"detectProvider");a(fy,"validateCliVersion");a(ku,"detectAllProviders");a(ta,"getActiveProvider");a(na,"getProviderBranding");a(gA,"detectAntigravity");a(nr,"detectCodex");a(hA,"selectProvider")});var gy={};N(gy,{default:()=>j});import yA from"node:crypto";import ra from"node:fs/promises";import ve from"node:path";var bu,wA,j,Re=h(()=>{"use strict";ie();ee();Zn();Bh();sy();er();bu=class{static{a(this,"PathManager")}globalBaseDir;globalConfigDir;constructor(){this.globalBaseDir=ot(),this.globalConfigDir=ve.join(this.globalBaseDir,"config")}get globalProjectsDir(){let e=process.env.PRJCT_PROJECTS_DIR;return e?ve.resolve(e):ve.join(this.globalBaseDir,"projects")}setGlobalBaseDir(e){this.globalBaseDir=ve.resolve(e),this.globalConfigDir=ve.join(this.globalBaseDir,"config")}generateProjectId(e){return yA.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return ve.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return ve.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return ve.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return ve.join(e,".prjct")}async hasLegacyStructure(e){return await Be(this.getLegacyPrjctPath(e))}async hasConfig(e){return await A(this.getLocalConfigPath(e))}async ensureGlobalStructure(){await Pt(this.globalBaseDir),await Pt(this.globalProjectsDir),await Pt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),r=["analysis","memory"];for(let s of r)await Pt(ve.join(t,s));return await Pt(ve.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:r,month:s,day:o}=jh(t);return ve.join(this.getGlobalProjectPath(e),"sessions",r,s,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let r=this.getSessionPath(e,t);return await Pt(r),r}async listSessions(e,t=null,r=null){let s=ve.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await ra.readdir(s,{withFileTypes:!0});for(let c of i){if(!c.isDirectory()||t&&c.name!==t.toString())continue;let l=ve.join(s,c.name),u=await ra.readdir(l,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||r&&d.name!==r.toString().padStart(2,"0"))continue;let p=ve.join(l,d.name),m=await ra.readdir(p,{withFileTypes:!0});for(let f of m)f.isDirectory()&&o.push({year:c.name,month:d.name,day:f.name,path:ve.join(p,f.name),date:new Date(`${c.name}-${d.name}-${f.name}`)})}}return o.sort((c,l)=>l.date.getTime()-c.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,r=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=r)}getFilePath(e,t,r){return ve.join(this.getGlobalProjectPath(e),t,r)}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 Be(this.getGlobalProjectPath(e))}getDisplayPath(e){let t=At();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return ve.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return ve.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return ve.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return ve.join(this.globalBaseDir,".running")}getDocsPath(){return ve.join(this.globalBaseDir,"docs")}getCachePath(){return ve.join(this.globalBaseDir,"cache")}getStatePath(){return ve.join(this.globalBaseDir,"state")}getStatusLinePath(){return ve.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(_t(),st(rr)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(_t(),st(rr)).getActiveProvider();return(_t(),st(rr)).getGlobalSettingsPath(e.name)}getClaudeDir(){return Le(".claude")}getClaudeSettingsPath(){return ve.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return ve.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return ve.join(this.getGlobalProjectPath(e),"context")}async getWikiPath(e,t){return ty(e,t)}getWikiPathWithProjectHash(e,t){return ny(e,t)}getLegacyWikiPath(e){return ry(e)}async detectMonorepo(e){return nu(e)}async discoverMonorepoPackages(e,t){return ru(e,t)}async findContainingPackage(e,t){return Gh(e,t)}async findMonorepoRoot(e){return Wh(e)}},wA=new bu,j=wA});import kA from"node:crypto";function _r(n){let e=n.toLowerCase().replace(/\s+/g," ").trim();return kA.createHash("sha256").update(e).digest("hex")}var sa=h(()=>{"use strict";a(_r,"memoryFingerprint")});var hy,yy=h(()=>{"use strict";hy=`
16
16
  -- =======================================================================
17
17
  -- Document storage (backward-compatible with JSON file pattern)
18
18
  -- =======================================================================
@@ -667,7 +667,7 @@ CREATE TABLE velocity_sprints (
667
667
 
668
668
  CREATE INDEX IF NOT EXISTS idx_task_pipeline_state_workspace
669
669
  ON task_pipeline_state(project_id, workspace_id, updated_at);
670
- `)},"up")}]});function by(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function vy(){return by()==="bun"}function Sy(){if(by()==="bun")return!0;try{let{execFileSync:n}=rt("node:child_process");return n("bun",["--version"],{stdio:"ignore"}),!0}catch{return!1}}var vu=h(()=>{"use strict";a(by,"detectRuntime");a(vy,"isBun");a(Sy,"isBunAvailable")});function Ey(n){let e=bA(n);return e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA busy_timeout = 5000"),e}function bA(n){if(vy()){let{Database:r}=rt("bun:sqlite");return new r(n,{create:!0})}let e;try{({DatabaseSync:e}=rt("node:sqlite"))}catch(r){throw new Error(`prjct needs SQLite: run on Bun, or Node >=22.5 with --experimental-sqlite (the \`prjct\` launcher sets this automatically \u2014 invoke \`prjct\`, not \`node dist/bin/prjct.mjs\` directly). Underlying error: ${r instanceof Error?r.message:String(r)}`)}let t=new e(n);return vA(t)}function vA(n){let e=0,t=0,r={prepare:a(s=>n.prepare(s),"prepare"),run:a(s=>{n.exec(s)},"run"),close:a(()=>n.close(),"close"),transaction:a(s=>{let o=a(c=>(...l)=>{if(e>0){let u=`prjct_sp_${++t}`;n.exec(`SAVEPOINT ${u}`),e++;try{let d=s(...l.length?l:[r]);return n.exec(`RELEASE ${u}`),d}catch(d){throw n.exec(`ROLLBACK TO ${u}`),n.exec(`RELEASE ${u}`),d}finally{e--}}n.exec(c),e++;try{let u=s(...l.length?l:[r]);return n.exec("COMMIT"),u}catch(u){throw n.exec("ROLLBACK"),u}finally{e--}},"make"),i=o("BEGIN");return i.deferred=o("BEGIN DEFERRED"),i.immediate=o("BEGIN IMMEDIATE"),i.exclusive=o("BEGIN EXCLUSIVE"),i},"transaction")};return r}var Ty=h(()=>{"use strict";vu();a(Ey,"openDatabase");a(bA,"openRaw");a(vA,"adaptNodeSqlite")});var rr={};N(rr,{PrjctDatabase:()=>oa,default:()=>b,prjctDb:()=>I});import Eo from"node:fs";import Cy from"node:path";function Su(n,e){let t=n.transaction(e);return typeof t.immediate=="function"?t.immediate(n):t(n)}function Ry(n){let e=new Date().toISOString();return!n||e>n?e:new Date(new Date(n).getTime()+1).toISOString()}var SA,oa,I,b,J=h(()=>{"use strict";Re();ky();Ty();a(Su,"runImmediate");a(Ry,"monotonicStamp");SA=3,oa=class{static{a(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(e,t){let r=this.statementCache.get(e);r||(r=new Map,this.statementCache.set(e,r));let s=r.get(t);if(s)return s;let o=e.prepare(t);return r.set(t,o),o}getDbPath(e){return Cy.join(j.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=SA&&this.evictLru();let r=this.getDbPath(e),s=Cy.dirname(r);Eo.existsSync(s)||Eo.mkdirSync(s,{recursive:!0});let o=Ey(r);return o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o,r),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(this.statementCache.delete(t),t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(r=>r!==e))}else this.connections.forEach(t=>{this.statementCache.delete(t),t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(this.statementCache.delete(t),t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{this.prepareCached(t,"PRAGMA wal_checkpoint(PASSIVE)").get()}catch{}}exists(e){return Eo.existsSync(this.getDbPath(e))}getDoc(e,t){let r=this.getDb(e),s=this.prepareCached(r,"SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,r){let s=this.getDb(e),o=JSON.stringify(r),i=new Date().toISOString();this.prepareCached(s,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}getDocWithStamp(e,t){let r=this.getDb(e),s=this.prepareCached(r,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(t);return s?{data:JSON.parse(s.data),updatedAt:s.updated_at}:null}nextKvStamp(e,t){let r=this.prepareCached(e,"SELECT updated_at FROM kv_store WHERE key = ?").get(t);return Ry(r?.updated_at)}casSetDoc(e,t,r,s){let o=this.getDb(e),i=JSON.stringify(r),c=this.nextKvStamp(o,t);return s===null?this.prepareCached(o,"INSERT INTO kv_store (key, data, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO NOTHING").run(t,i,c).changes===1:this.prepareCached(o,"UPDATE kv_store SET data = ?, updated_at = ? WHERE key = ? AND updated_at = ?").run(i,c,t,s).changes===1}updateDoc(e,t,r,s){let o=this.getDb(e);return Su(o,()=>{let i=this.prepareCached(o,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(t),c=i?JSON.parse(i.data):s(),l=r(c),u=Ry(i?.updated_at);return this.prepareCached(o,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,JSON.stringify(l),u),l})}deleteDoc(e,t){let r=this.getDb(e);this.prepareCached(r,"DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){let r=this.getDb(e);return this.prepareCached(r,"SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}listDocsByPrefix(e,t){let r=this.getDb(e);return this.prepareCached(r,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(t).map(o=>({key:o.key,data:JSON.parse(o.data)}))}appendEvent(e,t,r,s){let o=this.getDb(e),i=new Date().toISOString(),l=this.prepareCached(o,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(r),i).lastInsertRowid;return typeof l=="bigint"?Number(l):l??null}getEvents(e,t,r=100){let s=this.getDb(e);return t?this.prepareCached(s,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,r):this.prepareCached(s,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(r)}query(e,t,...r){let s=this.getDb(e);return this.prepareCached(s,t).all(...r)}run(e,t,...r){let s=this.getDb(e);return this.prepareCached(s,t).run(...r)}get(e,t,...r){let s=this.getDb(e);return this.prepareCached(s,t).get(...r)??null}transaction(e,t){let r=this.getDb(e);return Su(r,t)}runMigrations(e,t){e.run(`
670
+ `)},"up")}]});function by(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function vy(){return by()==="bun"}function Sy(){if(by()==="bun")return!0;try{let{execFileSync:n}=rt("node:child_process");return n("bun",["--version"],{stdio:"ignore"}),!0}catch{return!1}}var vu=h(()=>{"use strict";a(by,"detectRuntime");a(vy,"isBun");a(Sy,"isBunAvailable")});function Ey(n){let e=bA(n);return e.run("PRAGMA journal_mode = WAL"),e.run("PRAGMA busy_timeout = 5000"),e}function bA(n){if(vy()){let{Database:r}=rt("bun:sqlite");return new r(n,{create:!0})}let e;try{({DatabaseSync:e}=rt("node:sqlite"))}catch(r){throw new Error(`prjct needs SQLite: run on Bun, or Node >=22.5 with --experimental-sqlite (the \`prjct\` launcher sets this automatically \u2014 invoke \`prjct\`, not \`node dist/bin/prjct.mjs\` directly). Underlying error: ${r instanceof Error?r.message:String(r)}`)}let t=new e(n);return vA(t)}function vA(n){let e=0,t=0,r={prepare:a(s=>n.prepare(s),"prepare"),run:a(s=>{n.exec(s)},"run"),close:a(()=>n.close(),"close"),transaction:a(s=>{let o=a(c=>(...l)=>{if(e>0){let u=`prjct_sp_${++t}`;n.exec(`SAVEPOINT ${u}`),e++;try{let d=s(...l.length?l:[r]);return n.exec(`RELEASE ${u}`),d}catch(d){throw n.exec(`ROLLBACK TO ${u}`),n.exec(`RELEASE ${u}`),d}finally{e--}}n.exec(c),e++;try{let u=s(...l.length?l:[r]);return n.exec("COMMIT"),u}catch(u){throw n.exec("ROLLBACK"),u}finally{e--}},"make"),i=o("BEGIN");return i.deferred=o("BEGIN DEFERRED"),i.immediate=o("BEGIN IMMEDIATE"),i.exclusive=o("BEGIN EXCLUSIVE"),i},"transaction")};return r}var Ty=h(()=>{"use strict";vu();a(Ey,"openDatabase");a(bA,"openRaw");a(vA,"adaptNodeSqlite")});var sr={};N(sr,{PrjctDatabase:()=>oa,default:()=>b,prjctDb:()=>I});import Eo from"node:fs";import Cy from"node:path";function Su(n,e){let t=n.transaction(e);return typeof t.immediate=="function"?t.immediate(n):t(n)}function Ry(n){let e=new Date().toISOString();return!n||e>n?e:new Date(new Date(n).getTime()+1).toISOString()}var SA,oa,I,b,J=h(()=>{"use strict";Re();ky();Ty();a(Su,"runImmediate");a(Ry,"monotonicStamp");SA=3,oa=class{static{a(this,"PrjctDatabase")}connections=new Map;accessOrder=[];statementCache=new WeakMap;prepareCached(e,t){let r=this.statementCache.get(e);r||(r=new Map,this.statementCache.set(e,r));let s=r.get(t);if(s)return s;let o=e.prepare(t);return r.set(t,o),o}getDbPath(e){return Cy.join(j.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return this.touchAccessOrder(e),t;this.connections.size>=SA&&this.evictLru();let r=this.getDbPath(e),s=Cy.dirname(r);Eo.existsSync(s)||Eo.mkdirSync(s,{recursive:!0});let o=Ey(r);return o.run("PRAGMA synchronous = NORMAL"),o.run("PRAGMA cache_size = -2000"),o.run("PRAGMA temp_store = MEMORY"),o.run("PRAGMA mmap_size = 33554432"),this.runMigrations(o,r),this.connections.set(e,o),this.touchAccessOrder(e),o}close(e){if(e){let t=this.connections.get(e);t&&(this.statementCache.delete(t),t.close(),this.connections.delete(e),this.accessOrder=this.accessOrder.filter(r=>r!==e))}else this.connections.forEach(t=>{this.statementCache.delete(t),t.close()}),this.connections.clear(),this.accessOrder=[]}touchAccessOrder(e){this.accessOrder=this.accessOrder.filter(t=>t!==e),this.accessOrder.push(e)}evictLru(){if(this.accessOrder.length===0)return;let e=this.accessOrder.shift(),t=this.connections.get(e);t&&(this.statementCache.delete(t),t.close(),this.connections.delete(e))}checkpointAll(){for(let[e,t]of this.connections)try{this.prepareCached(t,"PRAGMA wal_checkpoint(PASSIVE)").get()}catch{}}exists(e){return Eo.existsSync(this.getDbPath(e))}getDoc(e,t){let r=this.getDb(e),s=this.prepareCached(r,"SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,r){let s=this.getDb(e),o=JSON.stringify(r),i=new Date().toISOString();this.prepareCached(s,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,o,i)}getDocWithStamp(e,t){let r=this.getDb(e),s=this.prepareCached(r,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(t);return s?{data:JSON.parse(s.data),updatedAt:s.updated_at}:null}nextKvStamp(e,t){let r=this.prepareCached(e,"SELECT updated_at FROM kv_store WHERE key = ?").get(t);return Ry(r?.updated_at)}casSetDoc(e,t,r,s){let o=this.getDb(e),i=JSON.stringify(r),c=this.nextKvStamp(o,t);return s===null?this.prepareCached(o,"INSERT INTO kv_store (key, data, updated_at) VALUES (?, ?, ?) ON CONFLICT(key) DO NOTHING").run(t,i,c).changes===1:this.prepareCached(o,"UPDATE kv_store SET data = ?, updated_at = ? WHERE key = ? AND updated_at = ?").run(i,c,t,s).changes===1}updateDoc(e,t,r,s){let o=this.getDb(e);return Su(o,()=>{let i=this.prepareCached(o,"SELECT data, updated_at FROM kv_store WHERE key = ?").get(t),c=i?JSON.parse(i.data):s(),l=r(c),u=Ry(i?.updated_at);return this.prepareCached(o,"INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,JSON.stringify(l),u),l})}deleteDoc(e,t){let r=this.getDb(e);this.prepareCached(r,"DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){let r=this.getDb(e);return this.prepareCached(r,"SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}listDocsByPrefix(e,t){let r=this.getDb(e);return this.prepareCached(r,"SELECT key, data FROM kv_store WHERE key LIKE ? || '%' ORDER BY key").all(t).map(o=>({key:o.key,data:JSON.parse(o.data)}))}appendEvent(e,t,r,s){let o=this.getDb(e),i=new Date().toISOString(),l=this.prepareCached(o,"INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(r),i).lastInsertRowid;return typeof l=="bigint"?Number(l):l??null}getEvents(e,t,r=100){let s=this.getDb(e);return t?this.prepareCached(s,"SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,r):this.prepareCached(s,"SELECT * FROM events ORDER BY id DESC LIMIT ?").all(r)}query(e,t,...r){let s=this.getDb(e);return this.prepareCached(s,t).all(...r)}run(e,t,...r){let s=this.getDb(e);return this.prepareCached(s,t).run(...r)}get(e,t,...r){let s=this.getDb(e);return this.prepareCached(s,t).get(...r)??null}transaction(e,t){let r=this.getDb(e);return Su(r,t)}runMigrations(e,t){e.run(`
671
671
  CREATE TABLE IF NOT EXISTS _migrations (
672
672
  version INTEGER PRIMARY KEY,
673
673
  name TEXT NOT NULL,
@@ -774,9 +774,9 @@ public static class PrjctCredentialManager {
774
774
  CredDelete(target, CRED_TYPE_GENERIC, 0);
775
775
  }
776
776
  }
777
- `;a(Au,"powershellArgs");a(_u,"windowsCommand");a(jy,"readWindowsCredentialManager");a(AA,"writeWindowsCredentialManager");a(_A,"clearWindowsCredentialManager");a(jA,"platformGet");a(IA,"platformSet");a(DA,"platformClear");a($A,"platformLocation");a(ju,"activeStore");a(Co,"getAuthToken");a(Iu,"setAuthToken");a(Du,"clearAuthToken")});var Fu={};N(Fu,{default:()=>ce});import MA from"node:crypto";import $u from"node:fs/promises";import Mu from"node:os";import Dy from"node:path";function Nu(){return MA.randomUUID()}function Ou(n){return{...n,apiKey:null}}var My,$y,Lu,NA,ce,En=h(()=>{"use strict";Re();ee();Iy();My="https://cli-api.prjct.app",$y={apiKey:null,apiUrl:My,userId:null,email:null,lastAuth:null};a(Nu,"freshDeviceId");a(Ou,"metadataOnly");Lu=class{static{a(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=j.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig={...this.cachedConfig,apiKey:await Co()},this.cachedConfig;let e=await Oe(this.configPath),t=await Co(),r={...e??$y,apiKey:t},s=!1;if(!t&&e?.apiKey&&(await Iu(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=Nu(),s=!0),r.hostname||(r.hostname=Mu.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await Ee(this.configPath,Ou(this.cachedConfig)),await $u.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Nu()}async getHostname(){return(await this.read()).hostname??Mu.hostname()}async write(e){let t=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await Iu(e.apiKey):await Du());let r={...t,...e,apiKey:await Co(),lastAuth:new Date().toISOString()};await Pt(Dy.dirname(this.configPath)),await Ee(this.configPath,Ou(r)),await $u.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await Co()}async getApiUrl(){return(await this.read()).apiUrl||My}async saveAuth(e,t,r){await this.write({apiKey:e,userId:t,email:r})}async clearAuth(){await Du();let e=this.cachedConfig??await Oe(this.configPath);this.cachedConfig={...$y,deviceId:e?.deviceId??Nu(),hostname:e?.hostname??Mu.hostname()},await Pt(Dy.dirname(this.configPath)),await Ee(this.configPath,Ou(this.cachedConfig)),await $u.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},NA=new Lu,ce=NA});var Oy={};N(Oy,{publishCRUD:()=>Ny,publishCRUDSync:()=>vt});import OA from"node:crypto";function FA(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(HA(n)):JSON.stringify(n);return OA.createHash("sha256").update(e).digest("hex")}function HA(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function UA(){if(Hu)return Hu;try{let{default:n}=await Promise.resolve().then(()=>(En(),Fu)),e=n;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return Hu=t,t}return"unknown-device"}catch{return"unknown-device"}}async function Ny(n){try{let e=await UA(),t=FA(n.data),r={type:`${n.entityType}.${LA[n.eventType]}`,path:[n.entityType,n.entityId],data:n.data,timestamp:new Date().toISOString(),projectId:n.projectId,entityType:n.entityType,entityId:n.entityId,eventType:n.eventType,contentHash:t,deviceId:e,originDeviceId:n.originDeviceId??e,revisionCount:n.revisionCount??1};await jt.publish(r)}catch{}}function vt(n){Ny(n)}var LA,Hu,Dr=h(()=>{"use strict";To();LA={upsert:"updated",delete:"deleted"};a(FA,"hashPayload");a(HA,"sortKeys");Hu=null;a(UA,"resolveDeviceId");a(Ny,"publishCRUD");a(vt,"publishCRUDSync")});var Tn,Uu,ft,sr=h(()=>{"use strict";vn();Dr();ie();J();Tn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Uu=class{static{a(this,"ArchiveStorage")}archive(e,t){let r=Xe(),s=T();return I.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),vt({projectId:e,entityType:"archives",entityId:r,eventType:"upsert",data:{id:r,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:s}}),r}archiveMany(e,t){if(t.length===0)return 0;let r=T();return I.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(Xe(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,r,i.reason)}),t.length}getArchived(e,t,r=50){return t?I.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,r):I.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(e){let t=I.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={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 r&&(r[o]=s.count),r.total+=s.count}return r}restore(e,t){let r=I.get(e,"SELECT * FROM archives WHERE id = ?",t);return r?(I.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(r.entity_data)):null}pruneOldArchives(e,t){let r=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);I.run(e,"DELETE FROM archives WHERE archived_at < ?",r);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return I.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},ft=new Uu});async function Ly(n,e,t){let r={pausedCount:0};if(await n.update(e,o=>{if(!o.currentTask)return o;n.validateTransition(o,"pause"),r.pausedTask={...o.currentTask,status:"paused",pausedAt:T(),pauseReason:t};let i=[r.pausedTask,...n.getPausedTasksFromState(o)].slice(0,n.maxPausedTasks);return r.pausedCount=i.length,{...o,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:T()}}),!r.pausedTask)return null;let s=r.pausedTask;return await n.publish(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:r.pausedCount}),s}async function Fy(n,e,t){let r={remainingPaused:0};if(await n.update(e,o=>{let i=n.getPausedTasksFromState(o);if(i.length===0)return o;n.validateTransition(o,"resume");let c=t?i.findIndex(y=>y.id===t):0;if(c===-1)return o;let l=i[c],u=i.filter((y,R)=>R!==c),{status:d,pausedAt:p,pauseReason:m,...f}=l;return r.currentTask={...f,startedAt:T(),sessionId:l.sessionId??Xe()},r.remainingPaused=u.length,{...o,currentTask:r.currentTask,previousTask:null,pausedTasks:u,lastUpdated:T()}}),!r.currentTask)return null;let s=r.currentTask;return await n.publish(e,"task.resumed",{taskId:s.id,description:s.description,resumedAt:s.startedAt,remainingPaused:r.remainingPaused}),s}async function Hy(n,e){let t=await n.read(e),r=n.getPausedTasksFromState(t),s=Date.now()-n.stalenessThresholdDays*24*60*60*1e3;return r.filter(o=>new Date(o.pausedAt).getTime()<s)}async function Uy(n,e){let t=Date.now()-n.stalenessThresholdDays*24*60*60*1e3,r=[];if(await n.update(e,s=>{let o=n.getPausedTasksFromState(s);if(r=o.filter(c=>new Date(c.pausedAt).getTime()<t),r.length===0)return s;let i=o.filter(c=>new Date(c.pausedAt).getTime()>=t);return{...s,pausedTasks:i,previousTask:null,lastUpdated:T()}}),r.length===0)return[];ft.archiveMany(e,r.map(s=>({entityType:"paused_task",entityId:s.id,entityData:s,summary:s.description,reason:"staleness"})));for(let s of r)await n.publish(e,"task.archived",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:"staleness"});return r}var Gy=h(()=>{"use strict";vn();ie();sr();a(Ly,"pauseTask");a(Fy,"resumeTask");a(Hy,"getStalePausedTasks");a(Uy,"archiveStalePausedTasks")});async function Wy(n,e){await n.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:T()}))}async function By(n,e){let t=await n.read(e),r=n.getPausedTasksFromState(t);return t.currentTask!==null||r.length>0}async function qy(n,e){let t=await n.read(e);return n.getPausedTasksFromState(t)[0]||null}async function Vy(n,e){let t=await n.read(e);return n.getPausedTasksFromState(t)}async function Gu(n,e){let t=await n.read(e);return n.getTaskHistoryFromState(t)}async function Jy(n,e){let t=await n.read(e);return n.getTaskHistoryFromState(t)[0]||null}async function Xy(n,e,t){let r=await n.read(e);return n.getTaskHistoryFromState(r).filter(o=>o.classification===t)}async function zy(n,e){let r=(await Gu(n,e)).filter(m=>m.feedback),s=[],o=[],i=[],c=[];for(let m of r){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)&&c.push(...f.issuesEncountered)}let l=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let m of c)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(c)],knownGotchas:p}}var Ky=h(()=>{"use strict";ie();a(Wy,"clearTask");a(By,"hasTask");a(qy,"getPausedTask");a(Vy,"getAllPausedTasks");a(Gu,"getTaskHistory");a(Jy,"getMostRecentTask");a(Xy,"getTaskHistoryByType");a(zy,"getAggregatedFeedback")});async function ua(n,e,t,r){let s={};return await n.update(e,o=>{if(!o.currentTask?.subtasks)return o;let i=o.currentTask.currentSubtaskIndex||0,c=o.currentTask.subtasks[i];if(!c)return o;let l=[...o.currentTask.subtasks];l[i]=t(c);let u=i+1,d=l.length;u<d&&(l[u]={...l[u],status:"in_progress",startedAt:T()});let p=u<d?l[u]:null,m=r?Qy(r(l),d):void 0;return s.value={taskId:o.currentTask.id,current:l[i],next:p,...m?{progress:m}:{}},{...o,currentTask:{...o.currentTask,subtasks:l,currentSubtaskIndex:u<d?u:i,...m?{subtaskProgress:m}:{}},lastUpdated:T()}}),s.value??null}function Qy(n,e){return{completed:n,total:e,percentage:e>0?Math.round(n/e*100):0}}async function Zy(n,e,t){let r=null,s=[];await n.update(e,o=>o.currentTask?(r=o.currentTask.id,s=t.map((i,c)=>({...i,status:c===0?"in_progress":"pending",startedAt:c===0?T():void 0,dependsOn:i.dependsOn||[]})),{...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:Qy(0,s.length)},lastUpdated:T()}):o),r&&await n.publish(e,"subtasks.created",{taskId:r,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function ew(n,e,t){let r=Th.safeParse(t);if(!r.success){let c=r.error.issues.map(l=>`${l.path.join(".")}: ${l.message}`);throw new Error(`Subtask completion requires handoff data:
777
+ `;a(Au,"powershellArgs");a(_u,"windowsCommand");a(jy,"readWindowsCredentialManager");a(AA,"writeWindowsCredentialManager");a(_A,"clearWindowsCredentialManager");a(jA,"platformGet");a(IA,"platformSet");a(DA,"platformClear");a($A,"platformLocation");a(ju,"activeStore");a(Co,"getAuthToken");a(Iu,"setAuthToken");a(Du,"clearAuthToken")});var Fu={};N(Fu,{default:()=>ce});import MA from"node:crypto";import $u from"node:fs/promises";import Mu from"node:os";import Dy from"node:path";function Nu(){return MA.randomUUID()}function Ou(n){return{...n,apiKey:null}}var My,$y,Lu,NA,ce,En=h(()=>{"use strict";Re();ee();Iy();My="https://cli-api.prjct.app",$y={apiKey:null,apiUrl:My,userId:null,email:null,lastAuth:null};a(Nu,"freshDeviceId");a(Ou,"metadataOnly");Lu=class{static{a(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=j.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig={...this.cachedConfig,apiKey:await Co()},this.cachedConfig;let e=await Oe(this.configPath),t=await Co(),r={...e??$y,apiKey:t},s=!1;if(!t&&e?.apiKey&&(await Iu(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=Nu(),s=!0),r.hostname||(r.hostname=Mu.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await Ee(this.configPath,Ou(this.cachedConfig)),await $u.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Nu()}async getHostname(){return(await this.read()).hostname??Mu.hostname()}async write(e){let t=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await Iu(e.apiKey):await Du());let r={...t,...e,apiKey:await Co(),lastAuth:new Date().toISOString()};await Pt(Dy.dirname(this.configPath)),await Ee(this.configPath,Ou(r)),await $u.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await Co()}async getApiUrl(){return(await this.read()).apiUrl||My}async saveAuth(e,t,r){await this.write({apiKey:e,userId:t,email:r})}async clearAuth(){await Du();let e=this.cachedConfig??await Oe(this.configPath);this.cachedConfig={...$y,deviceId:e?.deviceId??Nu(),hostname:e?.hostname??Mu.hostname()},await Pt(Dy.dirname(this.configPath)),await Ee(this.configPath,Ou(this.cachedConfig)),await $u.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},NA=new Lu,ce=NA});var Oy={};N(Oy,{publishCRUD:()=>Ny,publishCRUDSync:()=>vt});import OA from"node:crypto";function FA(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(HA(n)):JSON.stringify(n);return OA.createHash("sha256").update(e).digest("hex")}function HA(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function UA(){if(Hu)return Hu;try{let{default:n}=await Promise.resolve().then(()=>(En(),Fu)),e=n;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return Hu=t,t}return"unknown-device"}catch{return"unknown-device"}}async function Ny(n){try{let e=await UA(),t=FA(n.data),r={type:`${n.entityType}.${LA[n.eventType]}`,path:[n.entityType,n.entityId],data:n.data,timestamp:new Date().toISOString(),projectId:n.projectId,entityType:n.entityType,entityId:n.entityId,eventType:n.eventType,contentHash:t,deviceId:e,originDeviceId:n.originDeviceId??e,revisionCount:n.revisionCount??1};await jt.publish(r)}catch{}}function vt(n){Ny(n)}var LA,Hu,Dr=h(()=>{"use strict";To();LA={upsert:"updated",delete:"deleted"};a(FA,"hashPayload");a(HA,"sortKeys");Hu=null;a(UA,"resolveDeviceId");a(Ny,"publishCRUD");a(vt,"publishCRUDSync")});var Tn,Uu,ft,or=h(()=>{"use strict";vn();Dr();ie();J();Tn={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Uu=class{static{a(this,"ArchiveStorage")}archive(e,t){let r=Xe(),s=T();return I.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),vt({projectId:e,entityType:"archives",entityId:r,eventType:"upsert",data:{id:r,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:s}}),r}archiveMany(e,t){if(t.length===0)return 0;let r=T();return I.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(Xe(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,r,i.reason)}),t.length}getArchived(e,t,r=50){return t?I.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,r):I.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(e){let t=I.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={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 r&&(r[o]=s.count),r.total+=s.count}return r}restore(e,t){let r=I.get(e,"SELECT * FROM archives WHERE id = ?",t);return r?(I.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(r.entity_data)):null}pruneOldArchives(e,t){let r=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);I.run(e,"DELETE FROM archives WHERE archived_at < ?",r);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return I.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},ft=new Uu});async function Ly(n,e,t){let r={pausedCount:0};if(await n.update(e,o=>{if(!o.currentTask)return o;n.validateTransition(o,"pause"),r.pausedTask={...o.currentTask,status:"paused",pausedAt:T(),pauseReason:t};let i=[r.pausedTask,...n.getPausedTasksFromState(o)].slice(0,n.maxPausedTasks);return r.pausedCount=i.length,{...o,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:T()}}),!r.pausedTask)return null;let s=r.pausedTask;return await n.publish(e,"task.paused",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:t,pausedCount:r.pausedCount}),s}async function Fy(n,e,t){let r={remainingPaused:0};if(await n.update(e,o=>{let i=n.getPausedTasksFromState(o);if(i.length===0)return o;n.validateTransition(o,"resume");let c=t?i.findIndex(y=>y.id===t):0;if(c===-1)return o;let l=i[c],u=i.filter((y,R)=>R!==c),{status:d,pausedAt:p,pauseReason:m,...f}=l;return r.currentTask={...f,startedAt:T(),sessionId:l.sessionId??Xe()},r.remainingPaused=u.length,{...o,currentTask:r.currentTask,previousTask:null,pausedTasks:u,lastUpdated:T()}}),!r.currentTask)return null;let s=r.currentTask;return await n.publish(e,"task.resumed",{taskId:s.id,description:s.description,resumedAt:s.startedAt,remainingPaused:r.remainingPaused}),s}async function Hy(n,e){let t=await n.read(e),r=n.getPausedTasksFromState(t),s=Date.now()-n.stalenessThresholdDays*24*60*60*1e3;return r.filter(o=>new Date(o.pausedAt).getTime()<s)}async function Uy(n,e){let t=Date.now()-n.stalenessThresholdDays*24*60*60*1e3,r=[];if(await n.update(e,s=>{let o=n.getPausedTasksFromState(s);if(r=o.filter(c=>new Date(c.pausedAt).getTime()<t),r.length===0)return s;let i=o.filter(c=>new Date(c.pausedAt).getTime()>=t);return{...s,pausedTasks:i,previousTask:null,lastUpdated:T()}}),r.length===0)return[];ft.archiveMany(e,r.map(s=>({entityType:"paused_task",entityId:s.id,entityData:s,summary:s.description,reason:"staleness"})));for(let s of r)await n.publish(e,"task.archived",{taskId:s.id,description:s.description,pausedAt:s.pausedAt,reason:"staleness"});return r}var Gy=h(()=>{"use strict";vn();ie();or();a(Ly,"pauseTask");a(Fy,"resumeTask");a(Hy,"getStalePausedTasks");a(Uy,"archiveStalePausedTasks")});async function Wy(n,e){await n.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:T()}))}async function By(n,e){let t=await n.read(e),r=n.getPausedTasksFromState(t);return t.currentTask!==null||r.length>0}async function qy(n,e){let t=await n.read(e);return n.getPausedTasksFromState(t)[0]||null}async function Vy(n,e){let t=await n.read(e);return n.getPausedTasksFromState(t)}async function Gu(n,e){let t=await n.read(e);return n.getTaskHistoryFromState(t)}async function Jy(n,e){let t=await n.read(e);return n.getTaskHistoryFromState(t)[0]||null}async function Xy(n,e,t){let r=await n.read(e);return n.getTaskHistoryFromState(r).filter(o=>o.classification===t)}async function zy(n,e){let r=(await Gu(n,e)).filter(m=>m.feedback),s=[],o=[],i=[],c=[];for(let m of r){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)&&c.push(...f.issuesEncountered)}let l=[...new Set(s)],u=[...new Set(o)],d=new Map;for(let m of c)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(c)],knownGotchas:p}}var Ky=h(()=>{"use strict";ie();a(Wy,"clearTask");a(By,"hasTask");a(qy,"getPausedTask");a(Vy,"getAllPausedTasks");a(Gu,"getTaskHistory");a(Jy,"getMostRecentTask");a(Xy,"getTaskHistoryByType");a(zy,"getAggregatedFeedback")});async function ua(n,e,t,r){let s={};return await n.update(e,o=>{if(!o.currentTask?.subtasks)return o;let i=o.currentTask.currentSubtaskIndex||0,c=o.currentTask.subtasks[i];if(!c)return o;let l=[...o.currentTask.subtasks];l[i]=t(c);let u=i+1,d=l.length;u<d&&(l[u]={...l[u],status:"in_progress",startedAt:T()});let p=u<d?l[u]:null,m=r?Qy(r(l),d):void 0;return s.value={taskId:o.currentTask.id,current:l[i],next:p,...m?{progress:m}:{}},{...o,currentTask:{...o.currentTask,subtasks:l,currentSubtaskIndex:u<d?u:i,...m?{subtaskProgress:m}:{}},lastUpdated:T()}}),s.value??null}function Qy(n,e){return{completed:n,total:e,percentage:e>0?Math.round(n/e*100):0}}async function Zy(n,e,t){let r=null,s=[];await n.update(e,o=>o.currentTask?(r=o.currentTask.id,s=t.map((i,c)=>({...i,status:c===0?"in_progress":"pending",startedAt:c===0?T():void 0,dependsOn:i.dependsOn||[]})),{...o,currentTask:{...o.currentTask,subtasks:s,currentSubtaskIndex:0,subtaskProgress:Qy(0,s.length)},lastUpdated:T()}):o),r&&await n.publish(e,"subtasks.created",{taskId:r,subtaskCount:s.length,subtasks:s.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async function ew(n,e,t){let r=Th.safeParse(t);if(!r.success){let c=r.error.issues.map(l=>`${l.path.join(".")}: ${l.message}`);throw new Error(`Subtask completion requires handoff data:
778
778
  ${c.join(`
779
- `)}`)}let{output:s,summary:o}=r.data,i=await ua(n,e,c=>({...c,status:"completed",completedAt:T(),output:s,summary:o}),BA);return i?(await n.publish(e,"subtask.completed",{taskId:i.taskId,subtaskId:i.current.id,description:i.current.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:i.progress}),i.next):null}async function tw(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[r]||null}async function nw(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[r]||null}async function Wu(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=(t.currentTask.currentSubtaskIndex||0)-1;return r<0?null:t.currentTask.subtasks[r]||null}async function rw(n,e){let t=await Wu(n,e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async function sw(n,e){return(await n.read(e)).currentTask?.subtasks||[]}async function ow(n,e){return(await n.read(e)).currentTask?.subtaskProgress||null}async function iw(n,e){return((await n.read(e)).currentTask?.subtasks?.length||0)>0}async function aw(n,e){let t=await n.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(r=>r.status==="completed"||r.status==="failed"||r.status==="skipped"):!0}async function cw(n,e,t){let r=await ua(n,e,s=>({...s,status:"failed",completedAt:T(),output:`Failed: ${t}`}),Yy);return r?(await n.publish(e,"subtask.failed",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,error:t}),r.next):null}async function lw(n,e,t){let r=await ua(n,e,s=>({...s,status:"skipped",completedAt:T(),output:`Skipped: ${t}`,skipReason:t}),Yy);return r?(await n.publish(e,"subtask.skipped",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,reason:t}),r.next):null}async function uw(n,e,t){let r=await ua(n,e,s=>({...s,status:"blocked",output:`Blocked: ${t}`,blockReason:t}));return r?(await n.publish(e,"subtask.blocked",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,blocker:t}),r.next):null}var BA,Yy,dw=h(()=>{"use strict";Bi();ie();BA=a(n=>n.filter(e=>e.status==="completed").length,"countCompleted"),Yy=a(n=>n.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="skipped").length,"countResolved");a(ua,"mutateCurrentSubtask");a(Qy,"progressFrom");a(Zy,"createSubtasks");a(ew,"completeSubtask");a(tw,"getCurrentSubtask");a(nw,"getNextSubtask");a(Wu,"getPreviousSubtask");a(rw,"getPreviousHandoff");a(sw,"getSubtasks");a(ow,"getSubtaskProgress");a(iw,"hasSubtasks");a(aw,"areAllSubtasksComplete");a(cw,"failSubtask");a(lw,"skipSubtask");a(uw,"blockSubtask")});async function pw(n,e,t,r){let s={...t,workspaceId:r,startedAt:T()};return await n.update(e,o=>{if((o.activeTasks||[]).some(i=>i.workspaceId===r))throw new Error("A task is already active in this workspace");return{...o,activeTasks:[...o.activeTasks||[],s],lastUpdated:T()}}),await n.publish(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId,workspaceId:r}),s}async function mw(n,e,t){return((await n.read(e)).activeTasks||[]).find(s=>s.workspaceId===t)??null}async function fw(n,e,t,r){let o=((await n.read(e)).activeTasks||[]).find(c=>c.workspaceId===t);if(!o)return null;let i=T();return await n.update(e,c=>{let l=(c.activeTasks||[]).find(p=>p.workspaceId===t)??o,d=[n.createTaskHistoryEntry(l,i,r),...n.getTaskHistoryFromState(c)].slice(0,n.maxTaskHistory);return{...c,activeTasks:(c.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:i}}),await n.publish(e,"task.completed",{taskId:o.id,description:o.description,startedAt:o.startedAt,completedAt:i,workspaceId:t}),o}async function gw(n,e){return(await n.read(e)).activeTasks||[]}async function hw(n,e){return((await n.read(e)).activeTasks||[]).length}async function yw(n,e,t,r){let o=((await n.read(e)).activeTasks||[]).find(i=>i.workspaceId===t);return o?(await n.update(e,i=>({...i,activeTasks:(i.activeTasks||[]).map(c=>c.workspaceId===t?{...c,...r,workspaceId:t}:c),lastUpdated:T()})),{...o,...r,workspaceId:t}):null}async function ww(n,e,t,r,s){let o=await n.read(e);if(s){if(!(o.activeTasks||[]).some(l=>l.workspaceId===s))return null;let c=null;return await n.update(e,l=>({...l,activeTasks:(l.activeTasks||[]).map(u=>{if(u.workspaceId!==s)return u;let d=(u.tokensIn||0)+t,p=(u.tokensOut||0)+r;return c={tokensIn:d,tokensOut:p},{...u,tokensIn:d,tokensOut:p}}),lastUpdated:T()})),c}if(!o.currentTask)return null;let i=null;return await n.update(e,c=>{if(!c.currentTask)return c;let l=(c.currentTask.tokensIn||0)+t,u=(c.currentTask.tokensOut||0)+r;return i={tokensIn:l,tokensOut:u},{...c,currentTask:{...c.currentTask,tokensIn:l,tokensOut:u},lastUpdated:T()}}),i}var kw=h(()=>{"use strict";ie();a(pw,"startTaskInWorkspace");a(mw,"getCurrentTaskForWorkspace");a(fw,"completeTaskInWorkspace");a(gw,"getActiveTasks");a(hw,"getActiveTaskCount");a(yw,"updateWorkspaceTask");a(ww,"addTokens")});import JA from"node:crypto";function XA(n){let[e,t]=n.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}function zA(n){if(!n||typeof n!="object")return;let e=n;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let r=e[t];if(typeof r=="string"&&r.length>0)return r}}function KA(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(YA(n)):JSON.stringify(n);return JA.createHash("sha256").update(e).digest("hex")}function YA(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function QA(){if(da)return da;try{let{default:n}=await Promise.resolve().then(()=>(En(),Fu)),e=n;return typeof e.getDeviceId=="function"?(da=await e.getDeviceId(),da):"unknown-device"}catch{return"unknown-device"}}var da,at,or=h(()=>{"use strict";To();fu();ie();J();a(XA,"deriveEntityShape");a(zA,"entityIdOf");a(KA,"hashPayload");a(YA,"sortKeys");da=null;a(QA,"_resolveDeviceId");at=class{static{a(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Zi({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1")){let r=this.cache.get(e);if(r!==null)return r}try{let r=I.getDoc(e,this.getStoreKey());if(r!==null)return this.cache.set(e,r),r}catch{}return this.getDefault()}async write(e,t){I.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let r=this.getStoreKey(),s=I.updateDoc(e,r,t,()=>this.getDefault());return this.cache.set(e,s),s}async publishEvent(e,t,r){let s=XA(t),o={type:t,path:[this.filename.replace(".json","")],data:r,timestamp:T(),projectId:e,entityType:s.entityType,entityId:zA(r),eventType:s.eventType,contentHash:KA(r),deviceId:await QA(),revisionCount:1};await jt.publish(o)}async publishEntityEvent(e,t,r,s){let o=`${t}.${r}`,i={...s,timestamp:T()};await this.publishEvent(e,o,i)}async exists(e){try{return I.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Bu,X,It=h(()=>{"use strict";Bi();ie();eu();Gy();Ky();dw();kw();or();Bu=class extends at{static{a(this,"StateStorage")}constructor(){super("state.json",Ph)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t,r){let s=Ar.getCurrentState(e,r),o=Ar.canTransition(s,t);if(!o.valid)throw new Error(`${o.error}. ${o.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async getPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async startTask(e,t){let r={};if(await this.update(e,o=>(this.validateTransition(o,"task"),r.currentTask={...t,startedAt:T()},{...o,currentTask:r.currentTask,lastUpdated:T()})),!r.currentTask)throw new Error("Failed to start task");let s=r.currentTask;return await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let r=null;return await this.update(e,s=>s.currentTask?(r={...s.currentTask,...t},{...s,currentTask:r,lastUpdated:T()}):s),r}async completeTask(e,t){let r=T(),s={};if(await this.update(e,i=>{if(!i.currentTask)return i;this.validateTransition(i,"done"),s.completedTask=i.currentTask;let l=[this.createTaskHistoryEntry(s.completedTask,r,t),...this.getTaskHistoryFromState(i)].slice(0,this.maxTaskHistory);return{...i,currentTask:null,previousTask:null,taskHistory:l,lastUpdated:r}}),!s.completedTask)return null;let o=s.completedTask;return await this.publishEvent(e,"task.completed",{taskId:o.id,description:o.description,startedAt:o.startedAt,completedAt:r}),o}createTaskHistoryEntry(e,t,r){let s=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),o=s.length>0?s.map(c=>c.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,harness:e.harness};return r&&(i.feedback=r),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;lifecycleBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),validateTransition:this.validateTransition.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),maxPausedTasks:this.maxPausedTasks,stalenessThresholdDays:this.stalenessThresholdDays}}async pauseTask(e,t){return Ly(this.lifecycleBackend(),e,t)}async resumeTask(e,t){return Fy(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 Hy(this.lifecycleBackend(),e)}async archiveStalePausedTasks(e){return Uy(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 Wy(this.queryBackend(),e)}async hasTask(e){return By(this.queryBackend(),e)}async getPausedTask(e){return qy(this.queryBackend(),e)}async getAllPausedTasks(e){return Vy(this.queryBackend(),e)}async getTaskHistory(e){return Gu(this.queryBackend(),e)}async getMostRecentTask(e){return Jy(this.queryBackend(),e)}async getTaskHistoryByType(e,t){return Xy(this.queryBackend(),e,t)}async getAggregatedFeedback(e){return zy(this.queryBackend(),e)}workspaceBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),createTaskHistoryEntry:this.createTaskHistoryEntry.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this),maxTaskHistory:this.maxTaskHistory}}async startTaskInWorkspace(e,t,r){let s=await this.read(e);return this.validateTransition(s,"task",r),pw(this.workspaceBackend(),e,t,r)}async getCurrentTaskForWorkspace(e,t){return mw(this.workspaceBackend(),e,t)}async completeTaskInWorkspace(e,t,r){return fw(this.workspaceBackend(),e,t,r)}async getActiveTasks(e){return gw(this.workspaceBackend(),e)}async getActiveTaskCount(e){return hw(this.workspaceBackend(),e)}async updateWorkspaceTask(e,t,r){return yw(this.workspaceBackend(),e,t,r)}async addTokens(e,t,r,s){return ww(this.workspaceBackend(),e,t,r,s)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(e,t){return Zy(this.subtaskBackend(),e,t)}async completeSubtask(e,t){return ew(this.subtaskBackend(),e,t)}async getCurrentSubtask(e){return tw(this.subtaskBackend(),e)}async getNextSubtask(e){return nw(this.subtaskBackend(),e)}async getPreviousSubtask(e){return Wu(this.subtaskBackend(),e)}async getPreviousHandoff(e){return rw(this.subtaskBackend(),e)}async getSubtasks(e){return sw(this.subtaskBackend(),e)}async getSubtaskProgress(e){return ow(this.subtaskBackend(),e)}async hasSubtasks(e){return iw(this.subtaskBackend(),e)}async areAllSubtasksComplete(e){return aw(this.subtaskBackend(),e)}async failSubtask(e,t){return cw(this.subtaskBackend(),e,t)}async skipSubtask(e,t){return lw(this.subtaskBackend(),e,t)}async blockSubtask(e,t){return uw(this.subtaskBackend(),e,t)}},X=new Bu});function ZA(n){return{projectId:n.project_id,taskId:n.task_id,workspaceId:n.workspace_id,classification:n.classification,station:n.station,requiresSpec:n.requires_spec===1,requiresTestsFirst:n.requires_tests_first===1,reason:n.reason,linkedSpecId:n.linked_spec_id,createdAt:n.created_at,updatedAt:n.updated_at}}function bw(n,e){let t=Ro(n,e.taskId,e.workspaceId),r=T(),s=t?.createdAt??r;return I.run(n,`INSERT INTO task_pipeline_state (
779
+ `)}`)}let{output:s,summary:o}=r.data,i=await ua(n,e,c=>({...c,status:"completed",completedAt:T(),output:s,summary:o}),BA);return i?(await n.publish(e,"subtask.completed",{taskId:i.taskId,subtaskId:i.current.id,description:i.current.description,output:s,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:i.progress}),i.next):null}async function tw(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[r]||null}async function nw(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[r]||null}async function Wu(n,e){let t=await n.read(e);if(!t.currentTask?.subtasks)return null;let r=(t.currentTask.currentSubtaskIndex||0)-1;return r<0?null:t.currentTask.subtasks[r]||null}async function rw(n,e){let t=await Wu(n,e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async function sw(n,e){return(await n.read(e)).currentTask?.subtasks||[]}async function ow(n,e){return(await n.read(e)).currentTask?.subtaskProgress||null}async function iw(n,e){return((await n.read(e)).currentTask?.subtasks?.length||0)>0}async function aw(n,e){let t=await n.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(r=>r.status==="completed"||r.status==="failed"||r.status==="skipped"):!0}async function cw(n,e,t){let r=await ua(n,e,s=>({...s,status:"failed",completedAt:T(),output:`Failed: ${t}`}),Yy);return r?(await n.publish(e,"subtask.failed",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,error:t}),r.next):null}async function lw(n,e,t){let r=await ua(n,e,s=>({...s,status:"skipped",completedAt:T(),output:`Skipped: ${t}`,skipReason:t}),Yy);return r?(await n.publish(e,"subtask.skipped",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,reason:t}),r.next):null}async function uw(n,e,t){let r=await ua(n,e,s=>({...s,status:"blocked",output:`Blocked: ${t}`,blockReason:t}));return r?(await n.publish(e,"subtask.blocked",{taskId:r.taskId,subtaskId:r.current.id,description:r.current.description,blocker:t}),r.next):null}var BA,Yy,dw=h(()=>{"use strict";Bi();ie();BA=a(n=>n.filter(e=>e.status==="completed").length,"countCompleted"),Yy=a(n=>n.filter(e=>e.status==="completed"||e.status==="failed"||e.status==="skipped").length,"countResolved");a(ua,"mutateCurrentSubtask");a(Qy,"progressFrom");a(Zy,"createSubtasks");a(ew,"completeSubtask");a(tw,"getCurrentSubtask");a(nw,"getNextSubtask");a(Wu,"getPreviousSubtask");a(rw,"getPreviousHandoff");a(sw,"getSubtasks");a(ow,"getSubtaskProgress");a(iw,"hasSubtasks");a(aw,"areAllSubtasksComplete");a(cw,"failSubtask");a(lw,"skipSubtask");a(uw,"blockSubtask")});async function pw(n,e,t,r){let s={...t,workspaceId:r,startedAt:T()};return await n.update(e,o=>{if((o.activeTasks||[]).some(i=>i.workspaceId===r))throw new Error("A task is already active in this workspace");return{...o,activeTasks:[...o.activeTasks||[],s],lastUpdated:T()}}),await n.publish(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId,workspaceId:r}),s}async function mw(n,e,t){return((await n.read(e)).activeTasks||[]).find(s=>s.workspaceId===t)??null}async function fw(n,e,t,r){let o=((await n.read(e)).activeTasks||[]).find(c=>c.workspaceId===t);if(!o)return null;let i=T();return await n.update(e,c=>{let l=(c.activeTasks||[]).find(p=>p.workspaceId===t)??o,d=[n.createTaskHistoryEntry(l,i,r),...n.getTaskHistoryFromState(c)].slice(0,n.maxTaskHistory);return{...c,activeTasks:(c.activeTasks||[]).filter(p=>p.workspaceId!==t),taskHistory:d,lastUpdated:i}}),await n.publish(e,"task.completed",{taskId:o.id,description:o.description,startedAt:o.startedAt,completedAt:i,workspaceId:t}),o}async function gw(n,e){return(await n.read(e)).activeTasks||[]}async function hw(n,e){return((await n.read(e)).activeTasks||[]).length}async function yw(n,e,t,r){let o=((await n.read(e)).activeTasks||[]).find(i=>i.workspaceId===t);return o?(await n.update(e,i=>({...i,activeTasks:(i.activeTasks||[]).map(c=>c.workspaceId===t?{...c,...r,workspaceId:t}:c),lastUpdated:T()})),{...o,...r,workspaceId:t}):null}async function ww(n,e,t,r,s){let o=await n.read(e);if(s){if(!(o.activeTasks||[]).some(l=>l.workspaceId===s))return null;let c=null;return await n.update(e,l=>({...l,activeTasks:(l.activeTasks||[]).map(u=>{if(u.workspaceId!==s)return u;let d=(u.tokensIn||0)+t,p=(u.tokensOut||0)+r;return c={tokensIn:d,tokensOut:p},{...u,tokensIn:d,tokensOut:p}}),lastUpdated:T()})),c}if(!o.currentTask)return null;let i=null;return await n.update(e,c=>{if(!c.currentTask)return c;let l=(c.currentTask.tokensIn||0)+t,u=(c.currentTask.tokensOut||0)+r;return i={tokensIn:l,tokensOut:u},{...c,currentTask:{...c.currentTask,tokensIn:l,tokensOut:u},lastUpdated:T()}}),i}var kw=h(()=>{"use strict";ie();a(pw,"startTaskInWorkspace");a(mw,"getCurrentTaskForWorkspace");a(fw,"completeTaskInWorkspace");a(gw,"getActiveTasks");a(hw,"getActiveTaskCount");a(yw,"updateWorkspaceTask");a(ww,"addTokens")});import JA from"node:crypto";function XA(n){let[e,t]=n.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}function zA(n){if(!n||typeof n!="object")return;let e=n;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let r=e[t];if(typeof r=="string"&&r.length>0)return r}}function KA(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify(YA(n)):JSON.stringify(n);return JA.createHash("sha256").update(e).digest("hex")}function YA(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function QA(){if(da)return da;try{let{default:n}=await Promise.resolve().then(()=>(En(),Fu)),e=n;return typeof e.getDeviceId=="function"?(da=await e.getDeviceId(),da):"unknown-device"}catch{return"unknown-device"}}var da,at,ir=h(()=>{"use strict";To();fu();ie();J();a(XA,"deriveEntityShape");a(zA,"entityIdOf");a(KA,"hashPayload");a(YA,"sortKeys");da=null;a(QA,"_resolveDeviceId");at=class{static{a(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new Zi({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1")){let r=this.cache.get(e);if(r!==null)return r}try{let r=I.getDoc(e,this.getStoreKey());if(r!==null)return this.cache.set(e,r),r}catch{}return this.getDefault()}async write(e,t){I.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let r=this.getStoreKey(),s=I.updateDoc(e,r,t,()=>this.getDefault());return this.cache.set(e,s),s}async publishEvent(e,t,r){let s=XA(t),o={type:t,path:[this.filename.replace(".json","")],data:r,timestamp:T(),projectId:e,entityType:s.entityType,entityId:zA(r),eventType:s.eventType,contentHash:KA(r),deviceId:await QA(),revisionCount:1};await jt.publish(o)}async publishEntityEvent(e,t,r,s){let o=`${t}.${r}`,i={...s,timestamp:T()};await this.publishEvent(e,o,i)}async exists(e){try{return I.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Bu,X,It=h(()=>{"use strict";Bi();ie();eu();Gy();Ky();dw();kw();ir();Bu=class extends at{static{a(this,"StateStorage")}constructor(){super("state.json",Ph)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t,r){let s=Ar.getCurrentState(e,r),o=Ar.canTransition(s,t);if(!o.valid)throw new Error(`${o.error}. ${o.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async getPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async startTask(e,t){let r={};if(await this.update(e,o=>(this.validateTransition(o,"task"),r.currentTask={...t,startedAt:T()},{...o,currentTask:r.currentTask,lastUpdated:T()})),!r.currentTask)throw new Error("Failed to start task");let s=r.currentTask;return await this.publishEvent(e,"task.started",{taskId:s.id,description:s.description,startedAt:s.startedAt,sessionId:s.sessionId}),s}async updateCurrentTask(e,t){let r=null;return await this.update(e,s=>s.currentTask?(r={...s.currentTask,...t},{...s,currentTask:r,lastUpdated:T()}):s),r}async completeTask(e,t){let r=T(),s={};if(await this.update(e,i=>{if(!i.currentTask)return i;this.validateTransition(i,"done"),s.completedTask=i.currentTask;let l=[this.createTaskHistoryEntry(s.completedTask,r,t),...this.getTaskHistoryFromState(i)].slice(0,this.maxTaskHistory);return{...i,currentTask:null,previousTask:null,taskHistory:l,lastUpdated:r}}),!s.completedTask)return null;let o=s.completedTask;return await this.publishEvent(e,"task.completed",{taskId:o.id,description:o.description,startedAt:o.startedAt,completedAt:r}),o}createTaskHistoryEntry(e,t,r){let s=(e.subtasks||[]).filter(c=>c.status==="completed"&&c.summary).map(c=>c.summary),o=s.length>0?s.map(c=>c.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,harness:e.harness};return r&&(i.feedback=r),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;lifecycleBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),validateTransition:this.validateTransition.bind(this),getPausedTasksFromState:this.getPausedTasksFromState.bind(this),maxPausedTasks:this.maxPausedTasks,stalenessThresholdDays:this.stalenessThresholdDays}}async pauseTask(e,t){return Ly(this.lifecycleBackend(),e,t)}async resumeTask(e,t){return Fy(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 Hy(this.lifecycleBackend(),e)}async archiveStalePausedTasks(e){return Uy(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 Wy(this.queryBackend(),e)}async hasTask(e){return By(this.queryBackend(),e)}async getPausedTask(e){return qy(this.queryBackend(),e)}async getAllPausedTasks(e){return Vy(this.queryBackend(),e)}async getTaskHistory(e){return Gu(this.queryBackend(),e)}async getMostRecentTask(e){return Jy(this.queryBackend(),e)}async getTaskHistoryByType(e,t){return Xy(this.queryBackend(),e,t)}async getAggregatedFeedback(e){return zy(this.queryBackend(),e)}workspaceBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this),createTaskHistoryEntry:this.createTaskHistoryEntry.bind(this),getTaskHistoryFromState:this.getTaskHistoryFromState.bind(this),maxTaskHistory:this.maxTaskHistory}}async startTaskInWorkspace(e,t,r){let s=await this.read(e);return this.validateTransition(s,"task",r),pw(this.workspaceBackend(),e,t,r)}async getCurrentTaskForWorkspace(e,t){return mw(this.workspaceBackend(),e,t)}async completeTaskInWorkspace(e,t,r){return fw(this.workspaceBackend(),e,t,r)}async getActiveTasks(e){return gw(this.workspaceBackend(),e)}async getActiveTaskCount(e){return hw(this.workspaceBackend(),e)}async updateWorkspaceTask(e,t,r){return yw(this.workspaceBackend(),e,t,r)}async addTokens(e,t,r,s){return ww(this.workspaceBackend(),e,t,r,s)}subtaskBackend(){return{read:this.read.bind(this),update:this.update.bind(this),publish:this.publishEvent.bind(this)}}async createSubtasks(e,t){return Zy(this.subtaskBackend(),e,t)}async completeSubtask(e,t){return ew(this.subtaskBackend(),e,t)}async getCurrentSubtask(e){return tw(this.subtaskBackend(),e)}async getNextSubtask(e){return nw(this.subtaskBackend(),e)}async getPreviousSubtask(e){return Wu(this.subtaskBackend(),e)}async getPreviousHandoff(e){return rw(this.subtaskBackend(),e)}async getSubtasks(e){return sw(this.subtaskBackend(),e)}async getSubtaskProgress(e){return ow(this.subtaskBackend(),e)}async hasSubtasks(e){return iw(this.subtaskBackend(),e)}async areAllSubtasksComplete(e){return aw(this.subtaskBackend(),e)}async failSubtask(e,t){return cw(this.subtaskBackend(),e,t)}async skipSubtask(e,t){return lw(this.subtaskBackend(),e,t)}async blockSubtask(e,t){return uw(this.subtaskBackend(),e,t)}},X=new Bu});function ZA(n){return{projectId:n.project_id,taskId:n.task_id,workspaceId:n.workspace_id,classification:n.classification,station:n.station,requiresSpec:n.requires_spec===1,requiresTestsFirst:n.requires_tests_first===1,reason:n.reason,linkedSpecId:n.linked_spec_id,createdAt:n.created_at,updatedAt:n.updated_at}}function bw(n,e){let t=Ro(n,e.taskId,e.workspaceId),r=T(),s=t?.createdAt??r;return I.run(n,`INSERT INTO task_pipeline_state (
780
780
  project_id, task_id, workspace_id, classification, station,
781
781
  requires_spec, requires_tests_first, reason, linked_spec_id,
782
782
  created_at, updated_at
@@ -794,15 +794,15 @@ ${c.join(`
794
794
  `);e=d.trim(),t=p.trim(),r=m.trim(),s=f.trim()&&f.trim()!=="HEAD"?f.trim():void 0}catch{let u=await Sw(n);return{workspaceId:ct,worktreePath:u,shortId:ct,isMain:!0,label:Vu(ct)}}let o=vw.resolve(n,t)===vw.resolve(n,r),i=await Sw(e||n);if(o)return{workspaceId:ct,worktreePath:i,shortId:ct,branch:s,isMain:!0,label:Vu(ct,s)};let c=pa(i),l=c.slice(0,6);return{workspaceId:c,worktreePath:i,shortId:l,branch:s,isMain:!1,label:Vu(l,s)}}var ct,Ew,n_,Ju=h(()=>{"use strict";ue();Po();ct="main";a(Sw,"safeRealpath");a(Vu,"buildLabel");Ew=new Map,n_=5e3;a($r,"deriveWorkspace");a(r_,"computeWorkspace")});var Rw={};N(Rw,{collectActiveTasks:()=>Cn,formatActiveTaskLine:()=>Cw,formatActiveTaskList:()=>s_});function Tw(n,e){let t=n===ct?ct:n.slice(0,6);return{shortId:t,label:`${t} \xB7 ${e??"(detached)"}`}}async function Cn(n,e){let t=await $r(e),r=[],s=await X.getCurrentTask(n);if(s){let{shortId:i,label:c}=Tw(ct,s.branch);r.push({id:s.id,description:s.description,workspaceId:ct,shortId:i,label:c,branch:s.branch,linearId:s.linearId,harness:s.harness,startedAt:s.startedAt,isCurrent:t.workspaceId===ct,pipeline:Ro(n,s.id,ct)??void 0})}for(let i of await X.getActiveTasks(n)){if(i.workspaceId===ct)continue;let{shortId:c,label:l}=Tw(i.workspaceId,i.branch);r.push({id:i.id,description:i.description,workspaceId:i.workspaceId,shortId:c,label:l,branch:i.branch,linearId:i.linearId,harness:i.harness,startedAt:i.startedAt,isCurrent:t.workspaceId===i.workspaceId,pipeline:Ro(n,i.id,i.workspaceId)??void 0})}return r.sort((i,c)=>Number(c.isCurrent)-Number(i.isCurrent)),{current:r.find(i=>i.isCurrent)??null,all:r}}function Cw(n){let e=n.isCurrent?"\u2192":" ",t=n.isCurrent?" (this worktree)":"";return`${e} ${n.label} ${n.description}${t}`}function s_(n){if(n.all.length===0)return"No active task.";if(n.all.length===1&&n.current){let t=n.current,r=t.pipeline?`
795
795
  Pipeline: ${t.pipeline.station}`:"";return`Active: ${t.description}
796
796
  Workspace: ${t.label}${r}`}let e=[`Active tasks (${n.all.length})`];for(let t of n.all)e.push(Cw(t));return e.join(`
797
- `)}var fs=h(()=>{"use strict";It();qu();Ju();a(Tw,"labelFor");a(Cn,"collectActiveTasks");a(Cw,"formatActiveTaskLine");a(s_,"formatActiveTaskList")});function o_(n){return n instanceof gs}function Fe(n){return o_(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var gs,ma,fa,Ao,Rn=h(()=>{"use strict";gs=class extends Error{static{a(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)}},ma=class n extends gs{static{a(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},fa=class n extends gs{static{a(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new n(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new n(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Ao=class n extends gs{static{a(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(o_,"isPrjctError");a(Fe,"getErrorMessage")});function xw(n){let e=n.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Xu(n){let e=n.trim();if(!e)return{};let t=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(t)return{provider:xw(t[1]),repoSlug:t[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:xw(r.host),repoSlug:s}}catch{return{}}}async function i_(n){try{let{stdout:e}=await G("git",["remote","get-url","origin"],{cwd:n});return e.trim()||void 0}catch{return}}async function a_(n){try{let{stdout:e}=await G("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:n});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Mr(n){return typeof n=="string"&&n.length>0?n:void 0}function Pw(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function c_(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}async function ga(n){let e=I.getDoc(n,"project")||{},t=Mr(e.repoPath),{provider:r,repoSlug:s}=t?Xu(await i_(t)||""):{},o=t?await a_(t):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return c_({provider:r,repoSlug:s,currentBranch:Mr(e.currentBranch),defaultBranch:o,stack:Mr(e.stack),techStack:i&&i.length>0?i:void 0,version:Mr(e.version),commitCount:Pw(e.commitCount),fileCount:Pw(e.fileCount),lastCommit:Mr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Mr(e.cliVersion),syncedAt:Mr(e.lastSync)})}var ha=h(()=>{"use strict";J();ue();a(xw,"providerForHost");a(Xu,"parseRemote");a(i_,"gitRemoteUrl");a(a_,"gitDefaultBranch");a(Mr,"str");a(Pw,"num");a(c_,"compact");a(ga,"buildProjectMeta")});import{execFile as l_}from"node:child_process";import u_ from"node:crypto";import{promisify as d_}from"node:util";function f_(n,e=m_){let t=Buffer.from(e.replace(/-/g,""),"hex"),s=u_.createHash("sha1").update(t).update(n,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let o=s.toString("hex");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20,32)}`}async function g_(n){let e;try{let{stdout:s}=await p_("git",["remote","get-url","origin"],{cwd:n});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:t,repoSlug:r}=Xu(e);return!t||!r?null:`${t}:${r}`.toLowerCase()}async function Aw(n){let e=await g_(n);return e?f_(e):null}var p_,m_,_w=h(()=>{"use strict";ha();p_=d_(l_),m_="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(f_,"uuidv5");a(g_,"repoKey");a(Aw,"deriveProjectId")});var wa={};N(wa,{PACKAGE_ROOT:()=>Xt,VERSION:()=>De,getPackageRoot:()=>Ku,getVersion:()=>Or,resetPackageRoot:()=>Yu});import zu from"node:fs";import ya from"node:path";function Ku(){if(hs)return hs;let n=__dirname;for(let e=0;e<5;e++){let t=ya.join(n,"package.json");if(zu.existsSync(t))try{if(JSON.parse(zu.readFileSync(t,"utf-8")).name==="prjct-cli")return hs=n,n}catch{}n=ya.dirname(n)}return hs=ya.join(__dirname,"..","..",".."),hs}function Or(){if(Nr)return Nr;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return Nr=n,Nr;try{let e=ya.join(Ku(),"package.json");return Nr=JSON.parse(zu.readFileSync(e,"utf-8")).version,Nr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",w(e)),"0.0.0"}}function Yu(n){hs=n,Nr=null}var Nr,hs,De,Xt,Ze=h(()=>{"use strict";W();Nr=null,hs=null;a(Ku,"getPackageRoot");a(Or,"getVersion");a(Yu,"resetPackageRoot");De=Or(),Xt=Ku()});async function ka(n){try{let{stdout:e}=await q(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function h_(){let n=await ka("gh api user --jq .login");return n.success&&n.output||(n=await ka("git config --global github.user"),n.success&&n.output)?n.output:null}async function y_(){let n=await ka("git config user.name");return n.success&&n.output?n.output:null}async function w_(){let n=await ka("git config user.email");return n.success&&n.output?n.output:null}async function ys(){let[n,e,t]=await Promise.all([h_(),y_(),w_()]);return{github:n,email:t,name:e||n||"Unknown"}}var ba=h(()=>{"use strict";ue();a(ka,"execCommand");a(h_,"detectGitHubUsername");a(y_,"detectGitName");a(w_,"detectGitEmail");a(ys,"detect")});var ir={};N(ir,{default:()=>x});import Zu from"node:fs/promises";import k_ from"node:path";import*as va from"jsonc-parser";function jw(n){let e=[],t=va.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let r=e[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${va.printParseErrorCode(r.error)}`)}return t}var ed,b_,x,K=h(()=>{"use strict";Rn();_w();W();ie();ee();Ze();ba();Re();a(jw,"parseJsonc");ed=class{static{a(this,"ConfigManager")}async readConfig(e){try{let t=j.getLocalConfigPath(e),r=await Zu.readFile(t,"utf-8");return jw(r)}catch(t){return B(t)||console.warn(`Warning: Could not read config at ${e}: ${Fe(t)}`),null}}async writeConfig(e,t){let r=j.getLocalConfigPath(e);await Ee(r,t)}async readGlobalConfig(e){try{let t=j.getGlobalProjectConfigPath(e),r=await Zu.readFile(t,"utf-8");return jw(r)}catch(t){return B(t)||console.warn(`Warning: Could not read global config for ${e}: ${Fe(t)}`),null}}async writeGlobalConfig(e,t){let r=j.getGlobalProjectConfigPath(e);await Ee(r,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let r=T();t={projectId:e,authors:[],version:De,lastSync:r},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let r=await Aw(e)??j.generateProjectId(e),s=j.getGlobalProjectPath(r),o=j.getDisplayPath(s),i=T(),c={projectId:r,dataPath:o,showMetrics:!0};await this.writeConfig(e,c);let l={projectId:r,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:De,created:i,lastSync:i};return await this.writeGlobalConfig(r,l),c}async updateLastSync(e){let t=await this.getProjectId(e),r=await this.readGlobalConfig(t);r&&(r.lastSync=T(),await this.writeGlobalConfig(t,r))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await j.hasLegacyStructure(e))return!1;if(!await j.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=j.getGlobalProjectPath(s.projectId);try{return(await Zu.readdir(k_.join(o,"core"))).length===0}catch(i){return B(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(Qi(),Yi));if(await r.detect(e)){let o=await r.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return""}async findAuthor(e,t){let r=await this.readGlobalConfig(e);return!r||!r.authors?null:r.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let r=await this.ensureGlobalConfig(e);if(r.authors.some(i=>i.github===t.github))return;let o=T();r.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),r.lastSync=o,await this.writeGlobalConfig(e,r)}async updateAuthorActivity(e,t){let r=await this.readGlobalConfig(e);if(!r||!r.authors)return;let s=r.authors.find(o=>o.github===t);s&&(s.lastActivity=T(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(e,r))}async getCurrentAuthor(e){let t=await ys(),r=await this.getProjectId(e);return await this.addAuthor(r,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let r=await this.readConfig(e);r&&(r.showMetrics=t,await this.writeConfig(e,r))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let r=j.generateProjectId(e);return{projectId:r,dataPath:j.getDisplayPath(j.getGlobalProjectPath(r))}}},b_=new ed,x=b_});var Dw={};N(Dw,{MEMORY_EVENT_RANGE:()=>ks,REMEMBER_ACTION_PREFIX:()=>ws,REMEMBER_EVENT_PREFIX:()=>Wt,REMEMBER_EVENT_RANGE:()=>ar,STATUS_CHANGE_ACTION:()=>cr,TAG_EVENT_TYPE:()=>td});function Iw(n){return n.slice(0,-1)+String.fromCharCode(n.charCodeAt(n.length-1)+1)}var Sa,ws,Wt,td,ks,ar,cr,lr=h(()=>{"use strict";Sa="memory.",ws="remember.",Wt=`${Sa}${ws}`,td=`${Sa}task.tagged`;a(Iw,"prefixUpperBound");ks=[Sa,Iw(Sa)],ar=[Wt,Iw(Wt)],cr="status.changed"});async function bs(n){try{let{stdout:e}=await q("git branch --show-current",{cwd:n});return e.trim()||void 0}catch{return}}async function $w(n,e=20){try{let{stdout:t}=await q("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:n});return t.trim().split(`
797
+ `)}var fs=h(()=>{"use strict";It();qu();Ju();a(Tw,"labelFor");a(Cn,"collectActiveTasks");a(Cw,"formatActiveTaskLine");a(s_,"formatActiveTaskList")});function o_(n){return n instanceof gs}function Fe(n){return o_(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var gs,ma,fa,Ao,Rn=h(()=>{"use strict";gs=class extends Error{static{a(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)}},ma=class n extends gs{static{a(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},fa=class n extends gs{static{a(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new n(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new n(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Ao=class n extends gs{static{a(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(o_,"isPrjctError");a(Fe,"getErrorMessage")});function xw(n){let e=n.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Xu(n){let e=n.trim();if(!e)return{};let t=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(t)return{provider:xw(t[1]),repoSlug:t[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:xw(r.host),repoSlug:s}}catch{return{}}}async function i_(n){try{let{stdout:e}=await G("git",["remote","get-url","origin"],{cwd:n});return e.trim()||void 0}catch{return}}async function a_(n){try{let{stdout:e}=await G("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:n});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Mr(n){return typeof n=="string"&&n.length>0?n:void 0}function Pw(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function c_(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}async function ga(n){let e=I.getDoc(n,"project")||{},t=Mr(e.repoPath),{provider:r,repoSlug:s}=t?Xu(await i_(t)||""):{},o=t?await a_(t):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return c_({provider:r,repoSlug:s,currentBranch:Mr(e.currentBranch),defaultBranch:o,stack:Mr(e.stack),techStack:i&&i.length>0?i:void 0,version:Mr(e.version),commitCount:Pw(e.commitCount),fileCount:Pw(e.fileCount),lastCommit:Mr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Mr(e.cliVersion),syncedAt:Mr(e.lastSync)})}var ha=h(()=>{"use strict";J();ue();a(xw,"providerForHost");a(Xu,"parseRemote");a(i_,"gitRemoteUrl");a(a_,"gitDefaultBranch");a(Mr,"str");a(Pw,"num");a(c_,"compact");a(ga,"buildProjectMeta")});import{execFile as l_}from"node:child_process";import u_ from"node:crypto";import{promisify as d_}from"node:util";function f_(n,e=m_){let t=Buffer.from(e.replace(/-/g,""),"hex"),s=u_.createHash("sha1").update(t).update(n,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let o=s.toString("hex");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20,32)}`}async function g_(n){let e;try{let{stdout:s}=await p_("git",["remote","get-url","origin"],{cwd:n});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:t,repoSlug:r}=Xu(e);return!t||!r?null:`${t}:${r}`.toLowerCase()}async function Aw(n){let e=await g_(n);return e?f_(e):null}var p_,m_,_w=h(()=>{"use strict";ha();p_=d_(l_),m_="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(f_,"uuidv5");a(g_,"repoKey");a(Aw,"deriveProjectId")});var wa={};N(wa,{PACKAGE_ROOT:()=>Xt,VERSION:()=>De,getPackageRoot:()=>Ku,getVersion:()=>Or,resetPackageRoot:()=>Yu});import zu from"node:fs";import ya from"node:path";function Ku(){if(hs)return hs;let n=__dirname;for(let e=0;e<5;e++){let t=ya.join(n,"package.json");if(zu.existsSync(t))try{if(JSON.parse(zu.readFileSync(t,"utf-8")).name==="prjct-cli")return hs=n,n}catch{}n=ya.dirname(n)}return hs=ya.join(__dirname,"..","..",".."),hs}function Or(){if(Nr)return Nr;let n=process.env.PRJCT_VERSION;if(n&&/^\d+\.\d+\.\d+/.test(n))return Nr=n,Nr;try{let e=ya.join(Ku(),"package.json");return Nr=JSON.parse(zu.readFileSync(e,"utf-8")).version,Nr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",w(e)),"0.0.0"}}function Yu(n){hs=n,Nr=null}var Nr,hs,De,Xt,Ze=h(()=>{"use strict";W();Nr=null,hs=null;a(Ku,"getPackageRoot");a(Or,"getVersion");a(Yu,"resetPackageRoot");De=Or(),Xt=Ku()});async function ka(n){try{let{stdout:e}=await q(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function h_(){let n=await ka("gh api user --jq .login");return n.success&&n.output||(n=await ka("git config --global github.user"),n.success&&n.output)?n.output:null}async function y_(){let n=await ka("git config user.name");return n.success&&n.output?n.output:null}async function w_(){let n=await ka("git config user.email");return n.success&&n.output?n.output:null}async function ys(){let[n,e,t]=await Promise.all([h_(),y_(),w_()]);return{github:n,email:t,name:e||n||"Unknown"}}var ba=h(()=>{"use strict";ue();a(ka,"execCommand");a(h_,"detectGitHubUsername");a(y_,"detectGitName");a(w_,"detectGitEmail");a(ys,"detect")});var ar={};N(ar,{default:()=>x});import Zu from"node:fs/promises";import k_ from"node:path";import*as va from"jsonc-parser";function jw(n){let e=[],t=va.parse(n,e,{allowTrailingComma:!0,disallowComments:!1});if(e.length>0){let r=e[0];throw new SyntaxError(`JSON parse error at offset ${r.offset}: ${va.printParseErrorCode(r.error)}`)}return t}var ed,b_,x,K=h(()=>{"use strict";Rn();_w();W();ie();ee();Ze();ba();Re();a(jw,"parseJsonc");ed=class{static{a(this,"ConfigManager")}async readConfig(e){try{let t=j.getLocalConfigPath(e),r=await Zu.readFile(t,"utf-8");return jw(r)}catch(t){return B(t)||console.warn(`Warning: Could not read config at ${e}: ${Fe(t)}`),null}}async writeConfig(e,t){let r=j.getLocalConfigPath(e);await Ee(r,t)}async readGlobalConfig(e){try{let t=j.getGlobalProjectConfigPath(e),r=await Zu.readFile(t,"utf-8");return jw(r)}catch(t){return B(t)||console.warn(`Warning: Could not read global config for ${e}: ${Fe(t)}`),null}}async writeGlobalConfig(e,t){let r=j.getGlobalProjectConfigPath(e);await Ee(r,t)}async ensureGlobalConfig(e){let t=await this.readGlobalConfig(e);if(!t){let r=T();t={projectId:e,authors:[],version:De,lastSync:r},await this.writeGlobalConfig(e,t)}return t}async createConfig(e,t){let r=await Aw(e)??j.generateProjectId(e),s=j.getGlobalProjectPath(r),o=j.getDisplayPath(s),i=T(),c={projectId:r,dataPath:o,showMetrics:!0};await this.writeConfig(e,c);let l={projectId:r,authors:[{name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:i,lastActivity:i}],version:De,created:i,lastSync:i};return await this.writeGlobalConfig(r,l),c}async updateLastSync(e){let t=await this.getProjectId(e),r=await this.readGlobalConfig(t);r&&(r.lastSync=T(),await this.writeGlobalConfig(t,r))}validateConfig(e){return!(!e||!e.projectId||!e.dataPath)}async needsMigration(e){if(!await j.hasLegacyStructure(e))return!1;if(!await j.hasConfig(e))return!0;let s=await this.readConfig(e);if(!s||!s.projectId)return!0;let o=j.getGlobalProjectPath(s.projectId);try{return(await Zu.readdir(k_.join(o,"core"))).length===0}catch(i){return B(i),!0}}async getProjectId(e){let t=await this.readConfig(e);if(t?.projectId)return t.projectId;try{let{worktreeService:r}=await Promise.resolve().then(()=>(Qi(),Yi));if(await r.detect(e)){let o=await r.getMainWorktree(e);if(o!==e){let i=await this.readConfig(o);if(i?.projectId)return i.projectId}}}catch{}return""}async findAuthor(e,t){let r=await this.readGlobalConfig(e);return!r||!r.authors?null:r.authors.find(s=>s.github===t)||null}async addAuthor(e,t){let r=await this.ensureGlobalConfig(e);if(r.authors.some(i=>i.github===t.github))return;let o=T();r.authors.push({name:t.name||"Unknown",email:t.email||"",github:t.github||"",firstContribution:o,lastActivity:o}),r.lastSync=o,await this.writeGlobalConfig(e,r)}async updateAuthorActivity(e,t){let r=await this.readGlobalConfig(e);if(!r||!r.authors)return;let s=r.authors.find(o=>o.github===t);s&&(s.lastActivity=T(),r.lastSync=s.lastActivity,await this.writeGlobalConfig(e,r))}async getCurrentAuthor(e){let t=await ys(),r=await this.getProjectId(e);return await this.addAuthor(r,{name:t.name??void 0,email:t.email??void 0,github:t.github??void 0}),t.github||t.name||"Unknown"}async isConfigured(e){let t=await this.readConfig(e);return this.validateConfig(t)}async getShowMetrics(e){return(await this.readConfig(e))?.showMetrics??!0}async setShowMetrics(e,t){let r=await this.readConfig(e);r&&(r.showMetrics=t,await this.writeConfig(e,r))}async getConfigWithDefaults(e){let t=await this.readConfig(e);if(t)return t;let r=j.generateProjectId(e);return{projectId:r,dataPath:j.getDisplayPath(j.getGlobalProjectPath(r))}}},b_=new ed,x=b_});var Dw={};N(Dw,{MEMORY_EVENT_RANGE:()=>ks,REMEMBER_ACTION_PREFIX:()=>ws,REMEMBER_EVENT_PREFIX:()=>Wt,REMEMBER_EVENT_RANGE:()=>cr,STATUS_CHANGE_ACTION:()=>lr,TAG_EVENT_TYPE:()=>td});function Iw(n){return n.slice(0,-1)+String.fromCharCode(n.charCodeAt(n.length-1)+1)}var Sa,ws,Wt,td,ks,cr,lr,ur=h(()=>{"use strict";Sa="memory.",ws="remember.",Wt=`${Sa}${ws}`,td=`${Sa}task.tagged`;a(Iw,"prefixUpperBound");ks=[Sa,Iw(Sa)],cr=[Wt,Iw(Wt)],lr="status.changed"});async function bs(n){try{let{stdout:e}=await q("git branch --show-current",{cwd:n});return e.trim()||void 0}catch{return}}async function $w(n,e=20){try{let{stdout:t}=await q("git diff --name-only HEAD 2>/dev/null || git diff --name-only 2>/dev/null",{cwd:n});return t.trim().split(`
798
798
  `).filter(r=>r.length>0).slice(0,e)}catch{return[]}}var _o=h(()=>{"use strict";ue();a(bs,"getGitBranch");a($w,"getModifiedFiles")});import Mw from"node:path";var v_,S_,Ea,Nw=h(()=>{"use strict";ie();ee();v_=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"],S_=`# Changelog
799
799
 
800
800
  All notable changes to this project will be documented in this file.
801
801
 
802
802
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
803
803
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
804
- `,Ea=class{static{a(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let r of v_){let s=Mw.join(this.projectPath,r);if(await A(s)){let o=await Gt(s),i=this.detectFormat(o);return{filePath:s,fileName:r,format:i,created:!1}}}let e="CHANGELOG.md",t=Mw.join(this.projectPath,e);return await Kn(t,`${S_}
805
- `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),r=await Gt(t.filePath);if(this.hasVersionEntry(r,e.version,t.format))return;let s=e.date||_h(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(r,e,s):o=this.insertMarkdownEntry(r,e,s),await Kn(t.filePath,o)}hasVersionEntry(e,t,r){let s=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return(r==="keepachangelog"?new RegExp(`^## \\[${s}\\]`,"m"):new RegExp(`^## ${s}\\b`,"m")).test(e)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,r){let s=e.split(`
804
+ `,Ea=class{static{a(this,"ChangelogService")}projectPath;constructor(e){this.projectPath=e}async detect(){for(let r of v_){let s=Mw.join(this.projectPath,r);if(await A(s)){let o=await Gt(s),i=this.detectFormat(o);return{filePath:s,fileName:r,format:i,created:!1}}}let e="CHANGELOG.md",t=Mw.join(this.projectPath,e);return await Yn(t,`${S_}
805
+ `),{filePath:t,fileName:e,format:"keepachangelog",created:!0}}async addEntry(e){let t=await this.detect(),r=await Gt(t.filePath);if(this.hasVersionEntry(r,e.version,t.format))return;let s=e.date||_h(new Date),o;t.format==="keepachangelog"?o=this.insertKeepAChangelogEntry(r,e,s):o=this.insertMarkdownEntry(r,e,s),await Yn(t.filePath,o)}hasVersionEntry(e,t,r){let s=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return(r==="keepachangelog"?new RegExp(`^## \\[${s}\\]`,"m"):new RegExp(`^## ${s}\\b`,"m")).test(e)}async addFeature(e,t){await this.addEntry({version:e,sections:{Added:[t]}})}detectFormat(e){return e.includes("Keep a Changelog")||e.includes("keepachangelog.com")||/^### (?:Added|Changed|Deprecated|Removed|Fixed|Security)\s*$/m.test(e)?"keepachangelog":"markdown"}insertKeepAChangelogEntry(e,t,r){let s=e.split(`
806
806
  `),o=s.findIndex(l=>/^##\s*\[Unreleased\]\s*$/i.test(l));if(o!==-1){let l=s.length;for(let m=o+1;m<s.length;m++)if(/^##\s/.test(s[m])){l=m;break}let u=s.slice(o+1,l).join(`
807
807
  `).trim(),d=this.promoteUnreleasedBody(u,t,r);return`${[...s.slice(0,o),"## [Unreleased]","",d,"",...s.slice(l)].join(`
808
808
  `).replace(/\n{3,}/g,`
@@ -832,12 +832,12 @@ ${c}`}return`${s}
832
832
 
833
833
  ${e}`}formatKeepAChangelogEntry(e,t){let r=[`## [${e.version}] - ${t}`];if(r.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){r.push(`### ${s}`);for(let i of o)r.push(`- ${i}`);r.push("")}else e.description&&(r.push("### Added"),r.push(`- ${e.description}`),r.push(""));return r.join(`
834
834
  `)}formatMarkdownEntry(e,t){let r=[`## ${e.version} - ${t}`];if(r.push(""),e.sections)for(let[s,o]of Object.entries(e.sections)){r.push(`### ${s}`);for(let i of o)r.push(`- ${i}`);r.push("")}else e.description&&(r.push(`- ${e.description}`),r.push(""));return r.join(`
835
- `)}}});var nd,ze,xn=h(()=>{"use strict";K();lr();sr();J();nd=class{static{a(this,"MemoryService")}async log(e,t,r,s){try{let o=await x.getProjectId(e);return o?{eventId:b.appendEvent(o,`memory.${t}`,{...r,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 x.getProjectId(e);if(!t)return;b.run(t,"DELETE FROM events WHERE type >= ? AND type < ?",...ks)}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return b.query(e,"SELECT type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...ks,t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async capEntries(e){try{let r=b.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?)",...ks,...ar)?.cnt??0;if(r<=Tn.MEMORY_MAX_ENTRIES)return 0;let s=r-Tn.MEMORY_MAX_ENTRIES,o=b.query(e,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?) ORDER BY id ASC LIMIT ?",...ks,...ar,s);return ft.archiveMany(e,o.map((i,c)=>({entityType:"memory_entry",entityId:`memory-${i.timestamp||c}`,entityData:{type:i.type,data:JSON.parse(i.data),timestamp:i.timestamp},summary:i.type.replace("memory.",""),reason:"overflow"}))),b.transaction(e,i=>{let c=i.prepare("DELETE FROM events WHERE id = ?");for(let l of o)c.run(l.id)}),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},ze=new nd});import Lr from"node:path";function rd(n){return/^\d+\.\d+\.\d+/.test(n)}function Fr(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return n;let[,t,r,s,o]=e;if(o){let i=o.split("."),c=i.length-1;return/^\d+$/.test(i[c])?(i[c]=String(Number(i[c])+1),`${t}.${r}.${s}-${i.join(".")}`):`${t}.${r}.${s}-${o}.1`}return`${t}.${r}.${Number(s)+1}`}function E_(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${e[1]}.${Number(e[2])+1}.0`:n}function T_(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${Number(e[1])+1}.0.0`:n}function C_(n,e){return e==="major"?T_(n):e==="minor"?E_(n):Fr(n)}function Hw(n){let e=(n??"").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 Ow(n){let e=n.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Lw(n){let e=n.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let r=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(r)return r[1]}let t=n.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let r=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(r)return r[1]}return null}function Fw(n){return n.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Ta,Uw=h(()=>{"use strict";ue();ee();Ta=class{static{a(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 r=await t();if(r)return r}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 r=C_(t.current,e);return await this.writeVersion({...t,next:r}),r}async readVersionFromGitHead(e,t){try{let r=Lr.relative(this.projectPath,e),{stdout:s}=await G("git",["show",`HEAD:${r}`],{cwd:this.projectPath});if(t==="json")return JSON.parse(s).version??null;if(t==="plaintext"){let o=s.trim();return rd(o)?o:null}return t==="toml"?Ow(s)??Lw(s):t==="xml"?Fw(s):null}catch{return null}}isAheadOf(e,t){let r=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=r[o]??0,c=s[o]??0;if(i>c)return!0;if(i<c)return!1}return!1}async fromPackageJson(){let e=Lr.join(this.projectPath,"package.json"),t=await Oe(e,null);return t?.version?{current:t.version,next:Fr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Lr.join(this.projectPath,"Cargo.toml"),t=await Gt(e,"");if(!t)return null;let r=Ow(t);return r?{current:r,next:Fr(r),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Lr.join(this.projectPath,"pyproject.toml"),t=await Gt(e,"");if(!t)return null;let r=Lw(t);return r?{current:r,next:Fr(r),file:e,format:"toml"}:null}async fromCsproj(){let e=await Yn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Lr.join(this.projectPath,e[0]),r=await Gt(t,"");if(!r)return null;let s=Fw(r);return s?{current:s,next:Fr(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Lr.join(this.projectPath,e),r=await Gt(t,"");if(!r)return null;let s=r.trim();return rd(s)?{current:s,next:Fr(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await q("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
836
- `);for(let r of t){let s=r.trim().replace(/^v/,"");if(rd(s))return{current:s,next:Fr(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Lr.join(this.projectPath,"VERSION");return await Kn(e,`0.1.0
837
- `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await G("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 Kn(e.file,`${e.next}
838
- `);break}}async writeJsonVersion(e,t){let r=await Oe(e,{});r&&(r.version=t,await Ee(e,r))}async writeTomlVersion(e,t){let r=await Gt(e,"");if(!r)return;let s=r.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Kn(e,s)}async writeXmlVersion(e,t){let r=await Gt(e,"");if(!r)return;let s=r.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Kn(e,s)}};a(rd,"isSemver");a(Fr,"bumpPatch");a(E_,"bumpMinor");a(T_,"bumpMajor");a(C_,"bumpVersion");a(Hw,"inferBumpLevel");a(Ow,"parseTomlVersion");a(Lw,"parsePyprojectVersion");a(Fw,"parseCsprojVersion")});var sd,gt,jo=h(()=>{"use strict";Dr();J();sd=class{static{a(this,"CustomWorkflowStorage")}createWorkflow(e,t){let r=new Date().toISOString();b.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
835
+ `)}}});var nd,ze,xn=h(()=>{"use strict";K();ur();or();J();nd=class{static{a(this,"MemoryService")}async log(e,t,r,s){try{let o=await x.getProjectId(e);return o?{eventId:b.appendEvent(o,`memory.${t}`,{...r,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 x.getProjectId(e);if(!t)return;b.run(t,"DELETE FROM events WHERE type >= ? AND type < ?",...ks)}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return b.query(e,"SELECT type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...ks,t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async capEntries(e){try{let r=b.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?)",...ks,...cr)?.cnt??0;if(r<=Tn.MEMORY_MAX_ENTRIES)return 0;let s=r-Tn.MEMORY_MAX_ENTRIES,o=b.query(e,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?) ORDER BY id ASC LIMIT ?",...ks,...cr,s);return ft.archiveMany(e,o.map((i,c)=>({entityType:"memory_entry",entityId:`memory-${i.timestamp||c}`,entityData:{type:i.type,data:JSON.parse(i.data),timestamp:i.timestamp},summary:i.type.replace("memory.",""),reason:"overflow"}))),b.transaction(e,i=>{let c=i.prepare("DELETE FROM events WHERE id = ?");for(let l of o)c.run(l.id)}),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},ze=new nd});import Lr from"node:path";function rd(n){return/^\d+\.\d+\.\d+/.test(n)}function Fr(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);if(!e)return n;let[,t,r,s,o]=e;if(o){let i=o.split("."),c=i.length-1;return/^\d+$/.test(i[c])?(i[c]=String(Number(i[c])+1),`${t}.${r}.${s}-${i.join(".")}`):`${t}.${r}.${s}-${o}.1`}return`${t}.${r}.${Number(s)+1}`}function E_(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${e[1]}.${Number(e[2])+1}.0`:n}function T_(n){let e=n.match(/^(\d+)\.(\d+)\.(\d+)/);return e?`${Number(e[1])+1}.0.0`:n}function C_(n,e){return e==="major"?T_(n):e==="minor"?E_(n):Fr(n)}function Hw(n){let e=(n??"").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 Ow(n){let e=n.match(/\[package\]([\s\S]*?)(?=\n\[|\n*$)/);return e?e[1].match(/^\s*version\s*=\s*"([^"]+)"/m)?.[1]??null:null}function Lw(n){let e=n.match(/\[project\]([\s\S]*?)(?=\n\[|\n*$)/);if(e){let r=e[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(r)return r[1]}let t=n.match(/\[tool\.poetry\]([\s\S]*?)(?=\n\[|\n*$)/);if(t){let r=t[1].match(/^\s*version\s*=\s*"([^"]+)"/m);if(r)return r[1]}return null}function Fw(n){return n.match(/<Version>([^<]+)<\/Version>/)?.[1]?.trim()??null}var Ta,Uw=h(()=>{"use strict";ue();ee();Ta=class{static{a(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 r=await t();if(r)return r}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 r=C_(t.current,e);return await this.writeVersion({...t,next:r}),r}async readVersionFromGitHead(e,t){try{let r=Lr.relative(this.projectPath,e),{stdout:s}=await G("git",["show",`HEAD:${r}`],{cwd:this.projectPath});if(t==="json")return JSON.parse(s).version??null;if(t==="plaintext"){let o=s.trim();return rd(o)?o:null}return t==="toml"?Ow(s)??Lw(s):t==="xml"?Fw(s):null}catch{return null}}isAheadOf(e,t){let r=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=r[o]??0,c=s[o]??0;if(i>c)return!0;if(i<c)return!1}return!1}async fromPackageJson(){let e=Lr.join(this.projectPath,"package.json"),t=await Oe(e,null);return t?.version?{current:t.version,next:Fr(t.version),file:e,format:"json"}:null}async fromCargoToml(){let e=Lr.join(this.projectPath,"Cargo.toml"),t=await Gt(e,"");if(!t)return null;let r=Ow(t);return r?{current:r,next:Fr(r),file:e,format:"toml"}:null}async fromPyprojectToml(){let e=Lr.join(this.projectPath,"pyproject.toml"),t=await Gt(e,"");if(!t)return null;let r=Lw(t);return r?{current:r,next:Fr(r),file:e,format:"toml"}:null}async fromCsproj(){let e=await Qn(this.projectPath,{extension:".csproj"});if(e.length===0)return null;let t=Lr.join(this.projectPath,e[0]),r=await Gt(t,"");if(!r)return null;let s=Fw(r);return s?{current:s,next:Fr(s),file:t,format:"xml"}:null}async fromVersionFile(e){let t=Lr.join(this.projectPath,e),r=await Gt(t,"");if(!r)return null;let s=r.trim();return rd(s)?{current:s,next:Fr(s),file:t,format:"plaintext"}:null}async fromGitTag(){try{let{stdout:e}=await q("git tag --sort=-v:refname",{cwd:this.projectPath}),t=e.trim().split(`
836
+ `);for(let r of t){let s=r.trim().replace(/^v/,"");if(rd(s))return{current:s,next:Fr(s),file:null,format:"git-tag"}}}catch{}return null}async createFallbackVersion(){let e=Lr.join(this.projectPath,"VERSION");return await Yn(e,`0.1.0
837
+ `),{current:"0.1.0",next:"0.1.1",file:e,format:"plaintext"}}async writeVersion(e){if(!e.file){e.format==="git-tag"&&await G("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 Yn(e.file,`${e.next}
838
+ `);break}}async writeJsonVersion(e,t){let r=await Oe(e,{});r&&(r.version=t,await Ee(e,r))}async writeTomlVersion(e,t){let r=await Gt(e,"");if(!r)return;let s=r.replace(/^(\s*version\s*=\s*")([^"]+)(")/m,`$1${t}$3`);await Yn(e,s)}async writeXmlVersion(e,t){let r=await Gt(e,"");if(!r)return;let s=r.replace(/(<Version>)([^<]+)(<\/Version>)/,`$1${t}$3`);await Yn(e,s)}};a(rd,"isSemver");a(Fr,"bumpPatch");a(E_,"bumpMinor");a(T_,"bumpMajor");a(C_,"bumpVersion");a(Hw,"inferBumpLevel");a(Ow,"parseTomlVersion");a(Lw,"parsePyprojectVersion");a(Fw,"parseCsprojVersion")});var sd,gt,jo=h(()=>{"use strict";Dr();J();sd=class{static{a(this,"CustomWorkflowStorage")}createWorkflow(e,t){let r=new Date().toISOString();b.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
839
839
  VALUES (?, ?, ?, ?, 0, 1, ?)`,t.name,t.description??null,r,r,t.metadata?JSON.stringify(t.metadata):null);let s=b.get(e,"SELECT id FROM custom_workflows WHERE name = ?",t.name);if(!s)throw new Error(`Failed to create workflow: ${t.name}`);return vt({projectId:e,entityType:"custom_workflows",entityId:String(s.id),eventType:"upsert",data:{id:s.id,name:t.name,description:t.description??null,metadata:t.metadata??null,created_at:r,updated_at:r,is_builtin:0,enabled:1}}),s.id}getWorkflow(e,t){let r=b.get(e,"SELECT * FROM custom_workflows WHERE name = ?",t);return r?this.rowToWorkflow(r):null}getAllWorkflows(e,t=!1){let r=t?"SELECT * FROM custom_workflows ORDER BY is_builtin DESC, name ASC":"SELECT * FROM custom_workflows WHERE enabled = 1 ORDER BY is_builtin DESC, name ASC";return b.query(e,r).map(o=>this.rowToWorkflow(o))}updateWorkflow(e,t,r){if(!this.getWorkflow(e,t))return!1;let o=new Date().toISOString(),i=[],c=[];if(r.description!==void 0&&(i.push("description = ?"),c.push(r.description)),r.enabled!==void 0&&(i.push("enabled = ?"),c.push(r.enabled?1:0)),r.metadata!==void 0&&(i.push("metadata = ?"),c.push(JSON.stringify(r.metadata))),i.length===0)return!1;i.push("updated_at = ?"),c.push(o),c.push(t),b.run(e,`UPDATE custom_workflows SET ${i.join(", ")} WHERE name = ?`,...c);let l=this.getWorkflow(e,t);return l&&vt({projectId:e,entityType:"custom_workflows",entityId:String(l.id),eventType:"upsert",data:{id:l.id,name:l.name,description:l.description??null,enabled:l.enabled?1:0,metadata:l.metadata??null,updated_at:o}}),!0}deleteWorkflow(e,t){let r=this.getWorkflow(e,t);if(!r)return!1;if(r.isBuiltin)throw new Error(`Cannot delete built-in workflow: ${t}`);return b.run(e,"UPDATE custom_workflows SET enabled = 0 WHERE name = ?",t),vt({projectId:e,entityType:"custom_workflows",entityId:String(r.id),eventType:"delete",data:{id:r.id,name:t}}),!0}isBuiltin(e,t){return this.getWorkflow(e,t)?.isBuiltin??!1}isReservedName(e){let t=["task","done","ship","sync"],r=["add","rm","gate","list","create","delete","run","help","reset","init"];return t.includes(e)||r.includes(e)}isValidName(e){return/^[a-z0-9-]+$/.test(e)}rowToWorkflow(e){return{id:e.id,name:e.name,description:e.description,createdAt:e.created_at,updatedAt:e.updated_at,isBuiltin:e.is_builtin===1,enabled:e.enabled===1,metadata:e.metadata?JSON.parse(e.metadata):null}}},gt=new sd});function od(n){let e=n.trust_source==="imported"?"imported":"local",t=R_.includes(n.type)?n.type:"step";return{id:n.id,type:t,command:n.command,position:n.position,action:n.action,description:n.description,enabled:n.enabled===1,timeoutMs:n.timeout_ms,createdAt:n.created_at,sortOrder:n.sort_order,whenExpr:n.when_expr??null,parallel:n.parallel===null?!0:n.parallel===1,trustSource:e}}var R_,id,re,Pn=h(()=>{"use strict";Dr();jo();J();R_=["hook","gate","step","instruction"];a(od,"rowToRule");id=class{static{a(this,"WorkflowRuleStorage")}addRule(e,t){let r=I.get(e,"SELECT MAX(sort_order) as m FROM workflow_rules WHERE command = ?",t.command),s=t.sortOrder||(r?.m??-1)+1;I.run(e,`INSERT INTO workflow_rules (type, command, position, action, description, enabled, timeout_ms, created_at, sort_order, when_expr, parallel, trust_source)
840
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s,t.whenExpr??null,t.parallel===!1?0:1,t.trustSource??"local");let i=I.get(e,"SELECT last_insert_rowid() as id")?.id??0;return i>0&&vt({projectId:e,entityType:"workflow_rules",entityId:String(i),eventType:"upsert",data:{id:i,type:t.type,command:t.command,position:t.position,action:t.action,description:t.description??null,enabled:t.enabled?1:0,timeout_ms:t.timeoutMs,sort_order:s,when_expr:t.whenExpr??null,parallel:t.parallel===!1?0:1,trust_source:t.trustSource??"local",created_at:t.createdAt}}),i}removeRule(e,t){return I.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(I.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),vt({projectId:e,entityType:"workflow_rules",entityId:String(t),eventType:"delete",data:{id:t}}),!0):!1}updateRule(e,t,r){if(!I.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:a(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:a(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},i=[],c=[];for(let[l,u]of Object.entries(r)){let d=o[l];if(!d)continue;i.push(`${d.column} = ?`);let p=u;c.push(d.transform?d.transform(p):p)}return i.length===0||(c.push(t),I.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...c)),!0}getRuleById(e,t){let r=I.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return r?od(r):null}getRulesForCommand(e,t){let r=gt.getWorkflow(e,t);return!r||!r.enabled?[]:I.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(od)}getAllRules(e){return I.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(od)}resetRules(e){let t=I.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return I.run(e,"DELETE FROM workflow_rules"),t?.c??0}},re=new id});function x_(n){let e=n.split(/\s+/).map(r=>r.trim()).filter(Boolean),t=[];for(let r of e){let s=r.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(s){t.push({kind:"tags",key:s[1],op:s[2],value:s[3]});continue}let o=r.match(/^branch([=~])(.+)$/);if(o){t.push({kind:"branch",op:o[1],value:o[2]});continue}let i=r.match(/^files:(.+)$/);i&&t.push({kind:"files",op:"~",value:i[1]})}return t}function P_(n){let e=Gw.get(n);if(e)return e;let t="";for(let s=0;s<n.length;s++){let o=n[s];o==="*"?n[s+1]==="*"?(t+=".*",s++):t+="[^/]*":/[.+^${}()|[\]\\]/.test(o)?t+=`\\${o}`:t+=o}let r=new RegExp(`^${t}$`);return Gw.set(n,r),r}function A_(n,e){if(n.kind==="tags"){let t=e.tags[n.key??""]??"";return n.op==="="?t===n.value:t.toLowerCase().includes(n.value.toLowerCase())}if(n.kind==="branch")return n.op==="="?e.branch===n.value:e.branch.toLowerCase().includes(n.value.toLowerCase());if(n.kind==="files"){let t=P_(n.value);return e.filesChanged.some(r=>t.test(r))}return!0}function Ww(n,e){if(!n||!n.trim())return!0;let t=x_(n);return t.length===0?!0:t.every(r=>A_(r,e))}var Gw,Bw=h(()=>{"use strict";a(x_,"parseWhen");Gw=new Map;a(P_,"globToRegex");a(A_,"matchCondition");a(Ww,"evaluateWhen")});import{execSync as __}from"node:child_process";import j_ from"node:fs/promises";import ad from"node:path";import Dt from"chalk";async function M_(n,e,t){let r=await X.getCurrentTask(n);if(!r)throw new Error(`Cannot transition to '${t}': no active task`);await ze.log(e,cr,{taskId:r.id,from:r.type??null,to:t,source:"workflow"})}async function N_(n,e){if(n.trustSource==="imported")throw new Error(`Refusing to run imported rule without approval: ${n.description||n.action}. Re-create the rule locally if you trust it.`);await q(n.action,{timeout:n.timeoutMs,cwd:e,env:{...process.env}})}async function O_(n,e,t){if(n.trustSource==="imported")throw new Error(`Refusing to run imported script rule without approval: ${n.description||n.action}.`);let r=n.action.slice(Jw.length).trim();if(!r)throw new Error(`Empty script path in action '${n.action}'`);let s=ad.resolve(e,".prjct/workflows",r),o=ad.resolve(e,".prjct/workflows");if(!s.startsWith(`${o}${ad.sep}`)&&s!==o)throw new Error(`Script path escapes workflows dir: ${r}`);try{await j_.access(s)}catch{throw new Error(`Script not found: .prjct/workflows/${r}`)}await q(`bash ${JSON.stringify(s)}`,{timeout:n.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:t.branch,PRJCT_FILES_CHANGED:t.filesChanged.join(","),PRJCT_TAGS:Object.entries(t.tags).map(([i,c])=>`${i}=${c}`).join(",")}})}function L_(n){let e=n.action.slice(Xw.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 r=e.slice(0,t),s=e.slice(t+1),o=s.indexOf(":"),i=o===-1?s:s.slice(0,o),c=o===-1?"":s.slice(o+1),l=n.description?` (${n.description})`:"";return c?`Call MCP \`${r}.${i}\` with args ${c}${l}.`:`Call MCP \`${r}.${i}\`${l}.`}async function F_(n){try{let{default:e}=await Promise.resolve().then(()=>(K(),ir)),r=(await e.readConfig(n))?.persona;if(!r)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let s=[`You are **${r.role}** in this project.`];return r.focus&&s.push(`Focus: ${r.focus}.`),r.mcps&&r.mcps.length>0&&s.push(`MCPs available: ${r.mcps.join(", ")}.`),r.packs&&r.packs.length>0&&s.push(`Active packs: ${r.packs.join(", ")}.`),s.join(" ")}catch(e){return`Could not resolve persona: ${w(e)}`}}async function H_(n,e){let t=new Ta(n),r=Hw(typeof e.feature=="string"?e.feature:void 0),s=await t.bump(r);e.version=s}async function U_(n,e){let t=typeof e.version=="string"?e.version:null,r=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(!r)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new Ea(n).addFeature(t,r)}function G_(n,e){return n.replace(/\$([A-Z_]+)/g,(t,r)=>{let s=r.toLowerCase(),o=e[s];return typeof o=="string"?o:""})}async function W_(n,e,t){let s=n.slice(ld.length).replace(/^:/,"").trim()||(t.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),o=`${G_(s,t)}
840
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,t.type,t.command,t.position,t.action,t.description??null,t.enabled?1:0,t.timeoutMs,t.createdAt,s,t.whenExpr??null,t.parallel===!1?0:1,t.trustSource??"local");let i=I.get(e,"SELECT last_insert_rowid() as id")?.id??0;return i>0&&vt({projectId:e,entityType:"workflow_rules",entityId:String(i),eventType:"upsert",data:{id:i,type:t.type,command:t.command,position:t.position,action:t.action,description:t.description??null,enabled:t.enabled?1:0,timeout_ms:t.timeoutMs,sort_order:s,when_expr:t.whenExpr??null,parallel:t.parallel===!1?0:1,trust_source:t.trustSource??"local",created_at:t.createdAt}}),i}removeRule(e,t){return I.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t)?(I.run(e,"DELETE FROM workflow_rules WHERE id = ?",t),vt({projectId:e,entityType:"workflow_rules",entityId:String(t),eventType:"delete",data:{id:t}}),!0):!1}updateRule(e,t,r){if(!I.get(e,"SELECT id FROM workflow_rules WHERE id = ?",t))return!1;let o={type:{column:"type"},command:{column:"command"},position:{column:"position"},action:{column:"action"},description:{column:"description"},enabled:{column:"enabled",transform:a(l=>l?1:0,"transform")},timeoutMs:{column:"timeout_ms"},createdAt:{column:"created_at"},sortOrder:{column:"sort_order"},whenExpr:{column:"when_expr"},parallel:{column:"parallel",transform:a(l=>l===!1?0:1,"transform")},trustSource:{column:"trust_source"}},i=[],c=[];for(let[l,u]of Object.entries(r)){let d=o[l];if(!d)continue;i.push(`${d.column} = ?`);let p=u;c.push(d.transform?d.transform(p):p)}return i.length===0||(c.push(t),I.run(e,`UPDATE workflow_rules SET ${i.join(", ")} WHERE id = ?`,...c)),!0}getRuleById(e,t){let r=I.get(e,"SELECT * FROM workflow_rules WHERE id = ?",t);return r?od(r):null}getRulesForCommand(e,t){let r=gt.getWorkflow(e,t);return!r||!r.enabled?[]:I.query(e,"SELECT * FROM workflow_rules WHERE command = ? AND enabled = 1 ORDER BY sort_order ASC",t).map(od)}getAllRules(e){return I.query(e,"SELECT * FROM workflow_rules ORDER BY command ASC, sort_order ASC").map(od)}resetRules(e){let t=I.get(e,"SELECT COUNT(*) as c FROM workflow_rules");return I.run(e,"DELETE FROM workflow_rules"),t?.c??0}},re=new id});function x_(n){let e=n.split(/\s+/).map(r=>r.trim()).filter(Boolean),t=[];for(let r of e){let s=r.match(/^tags:([a-zA-Z0-9_\-.]+)([=~])(.+)$/);if(s){t.push({kind:"tags",key:s[1],op:s[2],value:s[3]});continue}let o=r.match(/^branch([=~])(.+)$/);if(o){t.push({kind:"branch",op:o[1],value:o[2]});continue}let i=r.match(/^files:(.+)$/);i&&t.push({kind:"files",op:"~",value:i[1]})}return t}function P_(n){let e=Gw.get(n);if(e)return e;let t="";for(let s=0;s<n.length;s++){let o=n[s];o==="*"?n[s+1]==="*"?(t+=".*",s++):t+="[^/]*":/[.+^${}()|[\]\\]/.test(o)?t+=`\\${o}`:t+=o}let r=new RegExp(`^${t}$`);return Gw.set(n,r),r}function A_(n,e){if(n.kind==="tags"){let t=e.tags[n.key??""]??"";return n.op==="="?t===n.value:t.toLowerCase().includes(n.value.toLowerCase())}if(n.kind==="branch")return n.op==="="?e.branch===n.value:e.branch.toLowerCase().includes(n.value.toLowerCase());if(n.kind==="files"){let t=P_(n.value);return e.filesChanged.some(r=>t.test(r))}return!0}function Ww(n,e){if(!n||!n.trim())return!0;let t=x_(n);return t.length===0?!0:t.every(r=>A_(r,e))}var Gw,Bw=h(()=>{"use strict";a(x_,"parseWhen");Gw=new Map;a(P_,"globToRegex");a(A_,"matchCondition");a(Ww,"evaluateWhen")});import{execSync as __}from"node:child_process";import j_ from"node:fs/promises";import ad from"node:path";import Dt from"chalk";async function M_(n,e,t){let r=await X.getCurrentTask(n);if(!r)throw new Error(`Cannot transition to '${t}': no active task`);await ze.log(e,lr,{taskId:r.id,from:r.type??null,to:t,source:"workflow"})}async function N_(n,e){if(n.trustSource==="imported")throw new Error(`Refusing to run imported rule without approval: ${n.description||n.action}. Re-create the rule locally if you trust it.`);await q(n.action,{timeout:n.timeoutMs,cwd:e,env:{...process.env}})}async function O_(n,e,t){if(n.trustSource==="imported")throw new Error(`Refusing to run imported script rule without approval: ${n.description||n.action}.`);let r=n.action.slice(Jw.length).trim();if(!r)throw new Error(`Empty script path in action '${n.action}'`);let s=ad.resolve(e,".prjct/workflows",r),o=ad.resolve(e,".prjct/workflows");if(!s.startsWith(`${o}${ad.sep}`)&&s!==o)throw new Error(`Script path escapes workflows dir: ${r}`);try{await j_.access(s)}catch{throw new Error(`Script not found: .prjct/workflows/${r}`)}await q(`bash ${JSON.stringify(s)}`,{timeout:n.timeoutMs,cwd:e,env:{...process.env,PRJCT_BRANCH:t.branch,PRJCT_FILES_CHANGED:t.filesChanged.join(","),PRJCT_TAGS:Object.entries(t.tags).map(([i,c])=>`${i}=${c}`).join(",")}})}function L_(n){let e=n.action.slice(Xw.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 r=e.slice(0,t),s=e.slice(t+1),o=s.indexOf(":"),i=o===-1?s:s.slice(0,o),c=o===-1?"":s.slice(o+1),l=n.description?` (${n.description})`:"";return c?`Call MCP \`${r}.${i}\` with args ${c}${l}.`:`Call MCP \`${r}.${i}\`${l}.`}async function F_(n){try{let{default:e}=await Promise.resolve().then(()=>(K(),ar)),r=(await e.readConfig(n))?.persona;if(!r)return"No persona declared for this project \u2014 `.prjct/prjct.config.json` has no `persona` field.";let s=[`You are **${r.role}** in this project.`];return r.focus&&s.push(`Focus: ${r.focus}.`),r.mcps&&r.mcps.length>0&&s.push(`MCPs available: ${r.mcps.join(", ")}.`),r.packs&&r.packs.length>0&&s.push(`Active packs: ${r.packs.join(", ")}.`),s.join(" ")}catch(e){return`Could not resolve persona: ${w(e)}`}}async function H_(n,e){let t=new Ta(n),r=Hw(typeof e.feature=="string"?e.feature:void 0),s=await t.bump(r);e.version=s}async function U_(n,e){let t=typeof e.version=="string"?e.version:null,r=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(!r)throw new Error("changelog:add requires a feature name in runContext (set by ship before rules run)");await new Ea(n).addFeature(t,r)}function G_(n,e){return n.replace(/\$([A-Z_]+)/g,(t,r)=>{let s=r.toLowerCase(),o=e[s];return typeof o=="string"?o:""})}async function W_(n,e,t){let s=n.slice(ld.length).replace(/^:/,"").trim()||(t.version?"feat: $FEATURE (v$VERSION)":"feat: $FEATURE"),o=`${G_(s,t)}
841
841
 
842
842
  Generated with [p/](https://www.prjct.app/)`;await G("git",["add","."],{cwd:e}),await G("git",["commit","-m",o],{cwd:e})}async function B_(n){let t=await G("git",["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"],{cwd:n}).then(()=>!0).catch(()=>!1)?["push"]:["push","-u","origin","HEAD"];await G("git",t,{cwd:n})}async function cd(n,e,t,r,s,o){let i=n.action;if(i.startsWith(qw)){let c=i.slice(qw.length).trim();if(!c)throw new Error(`Empty status target in action '${i}'`);await M_(e,t,c);return}if(i.startsWith(Jw)){await O_(n,t,r);return}if(i.startsWith(Xw)){s.instructions.push(L_(n));return}if(i===I_){s.instructions.push(await F_(t));return}if(i===Vw||i.startsWith(`${Vw}:`)){await H_(t,o);return}if(i===D_){await U_(t,o);return}if(i===ld||i.startsWith(`${ld}:`)){await W_(i,t,o);return}if(i===$_){await B_(t);return}await N_(n,t)}async function q_(n,e){let[t,r,s]=await Promise.all([V_(e),J_(e),X_(n)]);return{branch:t,filesChanged:r,tags:s}}async function V_(n){try{return await bs(n)||""}catch{return""}}async function J_(n){let e={cwd:n,encoding:"utf-8"},t=a(async o=>{try{return __(o,e).split(`
843
843
  `).map(i=>i.trim()).filter(Boolean)}catch{return[]}},"runDiff"),[r,s]=await Promise.all([t("git diff --cached --name-only"),t("git diff --name-only")]);return[...new Set([...r,...s])]}async function X_(n){try{let e=await X.getCurrentTask(n),t={};if(e?.type&&(t.type=e.type),!e)return t;let r=b.get(n,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 1",td);if(r)try{let s=JSON.parse(r.data);if(s.taskId===e.id&&s.tags)return{...t,...s.tags}}catch{}return t}catch{return{}}}async function An(n,e,t,r={}){let s={success:!0,gatesFailed:[],hooksFailed:[],stepsRun:[],instructions:[],output:""};if(r.skipRules)return s;let o=r.runContext??{},c=re.getRulesForCommand(n,e).filter(C=>C.position===t),l=r.projectPath||process.cwd(),d=c.some(C=>C.whenExpr||C.type==="gate")?await q_(n,l):{branch:"",filesChanged:[],tags:{}},p=c.filter(C=>Ww(C.whenExpr,d)),m=p.filter(C=>C.type==="gate");for(let C of m){let O=C.description||C.action;console.log(`
@@ -850,18 +850,18 @@ ${w(O)}
850
850
  `}},"runHook");for(let C of R)await S(C);k.length>0&&await Promise.all(k.map(S));let E=p.filter(C=>C.type==="step");for(let C of E){console.log(`
851
851
  ${Dt.dim(`[step] ${e}: ${C.action}`)}`);try{let O=Date.now();await cd(C,n,l,d,s,o);let Q=Date.now()-O,me=Q>1e3?`${(Q/1e3).toFixed(1)}s`:`${Q}ms`;console.log(`${Dt.green("\u2713")} ${Dt.dim(`step passed (${me})`)}`),s.stepsRun.push(C.description||C.action)}catch(O){return console.log(`${Dt.red("\u2717")} step failed: ${C.action}`),s.gatesFailed.push(C.description||C.action),s.success=!1,s.output+=`Step failed: ${C.action}
852
852
  ${w(O)}
853
- `,s}}return s}var qw,Jw,Xw,I_,Vw,D_,ld,$_,Ca=h(()=>{"use strict";lr();Nw();xn();Uw();_o();J();It();Pn();W();ue();Bw();qw="status:",Jw="script:",Xw="mcp:",I_="persona:context",Vw="version:bump",D_="changelog:add",ld="git:commit",$_="git:push";a(M_,"runStatusTransition");a(N_,"runShellAction");a(O_,"runScriptAction");a(L_,"buildMcpInstruction");a(F_,"buildPersonaInstruction");a(H_,"runVersionBump");a(U_,"runChangelogAdd");a(G_,"expandTemplate");a(W_,"runGitCommit");a(B_,"runGitPush");a(cd,"runRuleAction");a(q_,"buildWhenContext");a(V_,"resolveBranch");a(J_,"resolveChangedFiles");a(X_,"resolveActiveTags");a(An,"executeWorkflowRules")});import Hr from"chalk";var zw,z_,K_,mn,Kw=h(()=>{"use strict";_t();zw=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],z_=80,K_={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:zw,speed:z_},cli:{header:a(()=>`${Hr.cyan.bold("\u26A1")} ${Hr.cyan("prjct")}`,"header"),footer:a(()=>Hr.dim("\u26A1 prjct"),"footer"),spin:a((n,e)=>`${Hr.cyan("\u26A1")} ${Hr.cyan("prjct")} ${Hr.cyan(zw[n%10])} ${Hr.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:a((n="claude")=>na(n).commitFooter,"getCommitFooter"),getSignature:a((n="claude")=>na(n).signature,"getSignature")},mn=K_});function Ra(n){let e=`PRJCT_TIMEOUT_${n}`,t=process.env[e];if(t){let r=Number.parseInt(t,10);if(!Number.isNaN(r)&&r>0)return r}return Y_[n]}var Y_,zt,ud=h(()=>{"use strict";Y_={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};a(Ra,"getTimeout");zt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80}});var Yw,Qw=h(()=>{"use strict";Yw={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:"Configure the Linear MCP server in your AI client"},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:"Use 'p. status done' to complete it or 'p. status paused' to pause it"},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 Zw(n,e){return{...Yw[n],...e}}var ek=h(()=>{"use strict";Qw();a(Zw,"getError")});import he from"chalk";function ej(){return Q_[Z_]}var dd,Q_,Z_,Ur,vs,pd,$t,ur,tj,nj,g,fe=h(()=>{"use strict";Kw();ud();ek();dd=mn.spinner.speed,Q_={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},Z_="compact";a(ej,"getTierConfig");Ur={success:he.green("\u2713"),fail:he.red("\u2717"),warn:he.yellow("\u26A0"),info:he.blue("\u2139"),debug:he.dim("\u{1F527}"),bullet:he.dim("\u2022"),arrow:he.dim("\u2192"),check:he.green("\u2713"),cross:he.red("\u2717"),spinner:he.cyan("\u25D0")},vs=null,pd=0,$t=!1,ur=a((n,e)=>{if(!process.stdout.isTTY&&!process.stderr.isTTY)return n||"";let t=e??(ej().maxCharsPerLine||zt.FALLBACK_TRUNCATE);return n&&n.length>t?`${n.slice(0,t-1)}\u2026`:n||""},"truncate"),tj=a(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(zt.CLEAR_WIDTH)}\r`):!0,"clear"),nj={start(){return $t||console.log(mn.cli.header()),this},end(){return $t||console.log(mn.cli.footer()),this},spin(n){return $t?this:(this.stop(),process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${mn.cli.spin(pd++,ur(n,zt.SPINNER_MSG))}`)},dd),this):(process.stdout.write(`${mn.cli.spin(0,ur(n,zt.SPINNER_MSG))}
854
- `),this))},done(n,e){if(this.stop(),!$t){let t="";if(e){let r=[];e.agents!==void 0&&r.push(`${e.agents}a`),e.reduction!==void 0&&r.push(`${e.reduction}%`),e.tokens!==void 0&&r.push(`${Math.round(e.tokens)}K`),r.length>0&&(t=he.dim(` [${r.join(" | ")}]`))}console.log(`${Ur.success} ${ur(n,zt.DONE_MSG)}${t}`)}return this},fail(n){return this.stop(),console.error(`${Ur.fail} ${ur(n,zt.FAIL_MSG)}`),this},failWithHint(n){this.stop();let e=typeof n=="string"?Zw(n):n;return console.error(),console.error(`${Ur.fail} ${e.message}`),e.file&&console.error(he.dim(` File: ${e.file}`)),e.hint&&console.error(he.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(he.dim(` Docs: ${e.docs}`)),console.error(),this},warn(n){return this.stop(),$t||console.log(`${Ur.warn} ${ur(n,zt.WARN_MSG)}`),this},info(n){return this.stop(),$t||console.log(`${Ur.info} ${n}`),this},debug(n){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!$t&&e&&console.log(`${Ur.debug} ${he.dim(n)}`),this},success(n,e){return this.done(n,e)},list(n,e={}){if(this.stop(),$t)return this;let t=e.bullet||Ur.bullet,r=" ".repeat(e.indent||0);for(let s of n)console.log(`${r}${t} ${s}`);return this},table(n,e={}){if(this.stop(),$t||n.length===0)return this;let t=Object.keys(n[0]),r={};for(let s of t){r[s]=s.length;for(let o of n){let i=String(o[s]??"");i.length>r[s]&&(r[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(r[o])).join(" ");console.log(he.dim(s)),console.log(he.dim("\u2500".repeat(s.length)))}for(let s of n){let o=t.map(i=>String(s[i]??"").padEnd(r[i])).join(" ");console.log(o)}return this},box(n,e){if(this.stop(),$t)return this;let t=e.split(`
853
+ `,s}}return s}var qw,Jw,Xw,I_,Vw,D_,ld,$_,Ca=h(()=>{"use strict";ur();Nw();xn();Uw();_o();J();It();Pn();W();ue();Bw();qw="status:",Jw="script:",Xw="mcp:",I_="persona:context",Vw="version:bump",D_="changelog:add",ld="git:commit",$_="git:push";a(M_,"runStatusTransition");a(N_,"runShellAction");a(O_,"runScriptAction");a(L_,"buildMcpInstruction");a(F_,"buildPersonaInstruction");a(H_,"runVersionBump");a(U_,"runChangelogAdd");a(G_,"expandTemplate");a(W_,"runGitCommit");a(B_,"runGitPush");a(cd,"runRuleAction");a(q_,"buildWhenContext");a(V_,"resolveBranch");a(J_,"resolveChangedFiles");a(X_,"resolveActiveTags");a(An,"executeWorkflowRules")});import Hr from"chalk";var zw,z_,K_,fn,Kw=h(()=>{"use strict";_t();zw=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],z_=80,K_={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:zw,speed:z_},cli:{header:a(()=>`${Hr.cyan.bold("\u26A1")} ${Hr.cyan("prjct")}`,"header"),footer:a(()=>Hr.dim("\u26A1 prjct"),"footer"),spin:a((n,e)=>`${Hr.cyan("\u26A1")} ${Hr.cyan("prjct")} ${Hr.cyan(zw[n%10])} ${Hr.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:a((n="claude")=>na(n).commitFooter,"getCommitFooter"),getSignature:a((n="claude")=>na(n).signature,"getSignature")},fn=K_});function Ra(n){let e=`PRJCT_TIMEOUT_${n}`,t=process.env[e];if(t){let r=Number.parseInt(t,10);if(!Number.isNaN(r)&&r>0)return r}return Y_[n]}var Y_,zt,ud=h(()=>{"use strict";Y_={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};a(Ra,"getTimeout");zt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80}});var Yw,Qw=h(()=>{"use strict";Yw={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:"Configure the Linear MCP server in your AI client"},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:"Use 'p. status done' to complete it or 'p. status paused' to pause it"},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 Zw(n,e){return{...Yw[n],...e}}var ek=h(()=>{"use strict";Qw();a(Zw,"getError")});import he from"chalk";function ej(){return Q_[Z_]}var dd,Q_,Z_,Ur,vs,pd,$t,dr,tj,nj,g,fe=h(()=>{"use strict";Kw();ud();ek();dd=fn.spinner.speed,Q_={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},Z_="compact";a(ej,"getTierConfig");Ur={success:he.green("\u2713"),fail:he.red("\u2717"),warn:he.yellow("\u26A0"),info:he.blue("\u2139"),debug:he.dim("\u{1F527}"),bullet:he.dim("\u2022"),arrow:he.dim("\u2192"),check:he.green("\u2713"),cross:he.red("\u2717"),spinner:he.cyan("\u25D0")},vs=null,pd=0,$t=!1,dr=a((n,e)=>{if(!process.stdout.isTTY&&!process.stderr.isTTY)return n||"";let t=e??(ej().maxCharsPerLine||zt.FALLBACK_TRUNCATE);return n&&n.length>t?`${n.slice(0,t-1)}\u2026`:n||""},"truncate"),tj=a(()=>process.stdout.isTTY?process.stdout.write(`\r${" ".repeat(zt.CLEAR_WIDTH)}\r`):!0,"clear"),nj={start(){return $t||console.log(fn.cli.header()),this},end(){return $t||console.log(fn.cli.footer()),this},spin(n){return $t?this:(this.stop(),process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${fn.cli.spin(pd++,dr(n,zt.SPINNER_MSG))}`)},dd),this):(process.stdout.write(`${fn.cli.spin(0,dr(n,zt.SPINNER_MSG))}
854
+ `),this))},done(n,e){if(this.stop(),!$t){let t="";if(e){let r=[];e.agents!==void 0&&r.push(`${e.agents}a`),e.reduction!==void 0&&r.push(`${e.reduction}%`),e.tokens!==void 0&&r.push(`${Math.round(e.tokens)}K`),r.length>0&&(t=he.dim(` [${r.join(" | ")}]`))}console.log(`${Ur.success} ${dr(n,zt.DONE_MSG)}${t}`)}return this},fail(n){return this.stop(),console.error(`${Ur.fail} ${dr(n,zt.FAIL_MSG)}`),this},failWithHint(n){this.stop();let e=typeof n=="string"?Zw(n):n;return console.error(),console.error(`${Ur.fail} ${e.message}`),e.file&&console.error(he.dim(` File: ${e.file}`)),e.hint&&console.error(he.yellow(` \u{1F4A1} ${e.hint}`)),e.docs&&console.error(he.dim(` Docs: ${e.docs}`)),console.error(),this},warn(n){return this.stop(),$t||console.log(`${Ur.warn} ${dr(n,zt.WARN_MSG)}`),this},info(n){return this.stop(),$t||console.log(`${Ur.info} ${n}`),this},debug(n){this.stop();let e=process.env.DEBUG==="1"||process.env.DEBUG==="true";return!$t&&e&&console.log(`${Ur.debug} ${he.dim(n)}`),this},success(n,e){return this.done(n,e)},list(n,e={}){if(this.stop(),$t)return this;let t=e.bullet||Ur.bullet,r=" ".repeat(e.indent||0);for(let s of n)console.log(`${r}${t} ${s}`);return this},table(n,e={}){if(this.stop(),$t||n.length===0)return this;let t=Object.keys(n[0]),r={};for(let s of t){r[s]=s.length;for(let o of n){let i=String(o[s]??"");i.length>r[s]&&(r[s]=i.length)}}if(e.header!==!1){let s=t.map(o=>o.padEnd(r[o])).join(" ");console.log(he.dim(s)),console.log(he.dim("\u2500".repeat(s.length)))}for(let s of n){let o=t.map(i=>String(s[i]??"").padEnd(r[i])).join(" ");console.log(o)}return this},box(n,e){if(this.stop(),$t)return this;let t=e.split(`
855
855
  `),r=Math.max(n.length,...t.map(o=>o.length)),s="\u2500".repeat(r+2);console.log(he.dim(`\u250C${s}\u2510`)),console.log(`${he.dim("\u2502")} ${he.bold(n.padEnd(r))} ${he.dim("\u2502")}`),console.log(he.dim(`\u251C${s}\u2524`));for(let o of t)console.log(`${he.dim("\u2502")} ${o.padEnd(r)} ${he.dim("\u2502")}`);return console.log(he.dim(`\u2514${s}\u2518`)),this},section(n){return this.stop(),$t?this:(console.log(`
856
- ${he.bold(n)}`),console.log(he.dim("\u2500".repeat(n.length))),this)},stop(){return vs&&(clearInterval(vs),vs=null,tj()),this},step(n,e,t){if($t)return this;this.stop();let r=he.dim(`[${n}/${e}]`);return process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${mn.cli.spin(pd++,`${r} ${ur(t,zt.STEP_MSG)}`)}`)},dd),this):(process.stdout.write(`${mn.cli.spin(0,`${r} ${ur(t,zt.STEP_MSG)}`)}
857
- `),this)},progress(n,e,t){if($t)return this;this.stop();let r=Math.round(n/e*100),s=Math.round(r/10),o=10-s,i=he.cyan("\u2588".repeat(s))+he.dim("\u2591".repeat(o)),c=t?` ${ur(t,zt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${mn.cli.spin(pd++,`[${i}] ${r}%${c}`)}`)},dd),this):(process.stdout.write(`${mn.cli.spin(0,`[${i}] ${r}%${c}`)}
856
+ ${he.bold(n)}`),console.log(he.dim("\u2500".repeat(n.length))),this)},stop(){return vs&&(clearInterval(vs),vs=null,tj()),this},step(n,e,t){if($t)return this;this.stop();let r=he.dim(`[${n}/${e}]`);return process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${fn.cli.spin(pd++,`${r} ${dr(t,zt.STEP_MSG)}`)}`)},dd),this):(process.stdout.write(`${fn.cli.spin(0,`${r} ${dr(t,zt.STEP_MSG)}`)}
857
+ `),this)},progress(n,e,t){if($t)return this;this.stop();let r=Math.round(n/e*100),s=Math.round(r/10),o=10-s,i=he.cyan("\u2588".repeat(s))+he.dim("\u2591".repeat(o)),c=t?` ${dr(t,zt.PROGRESS_TEXT)}`:"";return process.stdout.isTTY?(vs=setInterval(()=>{process.stdout.write(`\r${fn.cli.spin(pd++,`[${i}] ${r}%${c}`)}`)},dd),this):(process.stdout.write(`${fn.cli.spin(0,`[${i}] ${r}%${c}`)}
858
858
  `),this)}},g=nj});var _a={};N(_a,{default:()=>uj,getTemplateContent:()=>Mt,listTemplates:()=>Aa,resetBundle:()=>cj});import fd from"node:fs";import rj from"node:fs/promises";import Pa from"node:path";function gd(){if(md)return xa;md=!0;let n=Pa.join(Xt,"dist","templates.json");try{let e=fd.readFileSync(n,"utf-8");return xa=JSON.parse(e),xa}catch{return null}}function oj(n){let e=Gr.indexOf(n);e>-1&&Gr.splice(e,1),Gr.push(n)}function ij(){for(;Ss.size>=sj&&Gr.length>0;){let n=Gr.shift();n&&Ss.delete(n)}}function tk(n){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=n.match(e);if(!t)return{frontmatter:{},content:n.trim()};let[,r,s]=t,o={};return r.split(`
859
859
  `).forEach(i=>{let[c,...l]=i.split(":");if(c&&l.length>0){let u=l.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[c.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[c.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function nk(n){if(Ss.has(n))return oj(n),Ss.get(n);let e,t=gd();if(t){let s=`commands/${n}.md`;e=t[s]}if(!e){let s=Pa.join(Xt,"templates","commands",`${n}.md`);try{e=await rj.readFile(s,"utf-8")}catch{throw fa.notFound(n)}}let r=tk(e);return ij(),Ss.set(n,r),Gr.push(n),r}async function aj(n){return(await nk(n)).frontmatter["allowed-tools"]||[]}function rk(){Ss.clear(),Gr.length=0}function cj(){xa=null,md=!1,rk()}function Mt(n){let e=gd();if(e?.[n])return e[n];let t=Pa.join(Xt,"templates",n);try{return fd.readFileSync(t,"utf-8")}catch{return null}}function Aa(n){let e=gd();if(e)return Object.keys(e).filter(r=>r.startsWith(n));let t=Pa.join(Xt,"templates",n);try{return fd.readdirSync(t).map(s=>`${n}${s}`)}catch{return[]}}var sj,Ss,Gr,xa,md,lj,uj,_n=h(()=>{"use strict";Rn();Ze();sj=50,Ss=new Map,Gr=[],xa=null,md=!1;a(gd,"loadBundle");a(oj,"updateLruOrder");a(ij,"evictLru");a(tk,"parseFrontmatter");a(nk,"load");a(aj,"getAllowedTools");a(rk,"clearCache");a(cj,"resetBundle");a(Mt,"getTemplateContent");a(Aa,"listTemplates");lj={load:nk,parseFrontmatter:tk,getAllowedTools:aj,clearCache:rk,getTemplateContent:Mt,listTemplates:Aa},uj=lj});function ja(n,e,t,r){if(!n)return{content:e,action:"created"};if(!(n.includes(t)&&n.includes(r)))return{content:`${n}
860
860
 
861
- ${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.indexOf(r)+r.length),c;return e.includes(t)&&e.includes(r)?c=e.substring(e.indexOf(t),e.indexOf(r)+r.length):c=e,{content:o+c+i,action:"updated"}}var hd=h(()=>{"use strict";a(ja,"mergeWithMarkers")});import jn from"node:fs/promises";import In from"node:path";function dj(n){let e=j.getDisplayPath(zi()),t=In.join(e,"<slug>","_generated");return n.replaceAll("%%PRJCT_VAULT_GENERATED%%",t).replaceAll("%%PRJCT_VAULT_PROJECT%%",In.join(e,"<slug>"))}async function ok(){try{let n=j.getDocsPath();await jn.mkdir(n,{recursive:!0});let e=Aa("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Mt(s);o&&await jn.writeFile(In.join(n,In.basename(s)),o,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:t}=(Ze(),st(wa)),r=In.join(t,"templates/global/docs");try{let s=await jn.readdir(r);for(let o of s)if(o.endsWith(".md")){let i=await jn.readFile(In.join(r,o),"utf-8");await jn.writeFile(In.join(n,o),i,"utf-8")}}catch{}return{success:!0}}catch(n){return{success:!1,error:w(n)}}}async function yd(){let n=(_t(),st(nr)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await jn.mkdir(e.configDir,{recursive:!0});let s=In.join(e.configDir,e.contextFile),o=sk;if(t!=="claude"){let f=Mt(`global/${e.contextFile}`);if(f)o=f;else{let{PACKAGE_ROOT:y}=(Ze(),st(wa)),R=In.join(y,"templates","global",e.contextFile);try{o=await jn.readFile(R,"utf-8")}catch{t==="gemini"&&(o=sk.replace(/Claude/g,"Gemini"))}}}o=dj(o);let i="",c=!1;try{i=await jn.readFile(s,"utf-8"),c=!0}catch(f){if(B(f))c=!1;else throw f}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let f=i.substring(0,i.indexOf(l)),y=i.substring(i.indexOf(u)+u.length);i=`${(f+y).replace(/\n{3,}/g,`
861
+ ${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.indexOf(r)+r.length),c;return e.includes(t)&&e.includes(r)?c=e.substring(e.indexOf(t),e.indexOf(r)+r.length):c=e,{content:o+c+i,action:"updated"}}var hd=h(()=>{"use strict";a(ja,"mergeWithMarkers")});import jn from"node:fs/promises";import In from"node:path";function dj(n){let e=j.getDisplayPath(zi()),t=In.join(e,"<slug>","_generated");return n.replaceAll("%%PRJCT_VAULT_GENERATED%%",t).replaceAll("%%PRJCT_VAULT_PROJECT%%",In.join(e,"<slug>"))}async function ok(){try{let n=j.getDocsPath();await jn.mkdir(n,{recursive:!0});let e=Aa("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Mt(s);o&&await jn.writeFile(In.join(n,In.basename(s)),o,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:t}=(Ze(),st(wa)),r=In.join(t,"templates/global/docs");try{let s=await jn.readdir(r);for(let o of s)if(o.endsWith(".md")){let i=await jn.readFile(In.join(r,o),"utf-8");await jn.writeFile(In.join(n,o),i,"utf-8")}}catch{}return{success:!0}}catch(n){return{success:!1,error:w(n)}}}async function yd(){let n=(_t(),st(rr)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await jn.mkdir(e.configDir,{recursive:!0});let s=In.join(e.configDir,e.contextFile),o=sk;if(t!=="claude"){let f=Mt(`global/${e.contextFile}`);if(f)o=f;else{let{PACKAGE_ROOT:y}=(Ze(),st(wa)),R=In.join(y,"templates","global",e.contextFile);try{o=await jn.readFile(R,"utf-8")}catch{t==="gemini"&&(o=sk.replace(/Claude/g,"Gemini"))}}}o=dj(o);let i="",c=!1;try{i=await jn.readFile(s,"utf-8"),c=!0}catch(f){if(B(f))c=!1;else throw f}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let f=i.substring(0,i.indexOf(l)),y=i.substring(i.indexOf(u)+u.length);i=`${(f+y).replace(/\n{3,}/g,`
862
862
 
863
863
  `).trim()}
864
- `}let m=ja(c?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await jn.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}var sk,ik=h(()=>{"use strict";_n();Ki();W();hd();Re();sk='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when any of these signs are present: `%%PRJCT_VAULT_GENERATED%%/` exists, OR `.prjct/` is in cwd, OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), READ these vault files first using Read/Glob \u2014 no CLI round-trip:\n\n- `%%PRJCT_VAULT_GENERATED%%/index.md` \u2014 overview, ships, memory counts, patterns count\n- `%%PRJCT_VAULT_GENERATED%%/architecture.md` \u2014 domains, conventions, key insights\n- `%%PRJCT_VAULT_GENERATED%%/{patterns,insights,tech-debt}.md` \u2014 inferred state of the project\n- `%%PRJCT_VAULT_GENERATED%%/memory/{decision,gotcha,learning,fact,inbox}.md` \u2014 captured knowledge\n- `%%PRJCT_VAULT_GENERATED%%/analysis/{anti-patterns,insights,patterns,refactors,risk-areas,tech-debt}/` \u2014 past analyses by category\n- `%%PRJCT_VAULT_GENERATED%%/{ships,releases,tags}/` \u2014 history & taxonomy\n\nOnly fall through to source/repo reading when the vault does not contain the answer.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha \u2014 persist it: `prjct remember <decision|learning|gotcha|fact> "..."` or `prjct capture "<text>" --tags k:v`. **Author every entry in ENGLISH**, whatever language the user speaks. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.** The full verb map and task workflow live in the `prjct` skill.\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `%%PRJCT_VAULT_GENERATED%%/` (Read/Glob freely; never hand-edit \u2014 fix the pipeline)\n- Project config: `.prjct/prjct.config.json` in repo root\n\nThe vault regenerates automatically on `remember`, `capture`, `ship`, `sync`, and the SessionStart/Stop hooks.\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';a(dj,"applyConfiguredVaultPaths");a(ok,"installDocs");a(yd,"installGlobalConfig")});var ak={};N(ak,{CommandInstaller:()=>fn,default:()=>et,getProviderPaths:()=>wd,installGlobalConfig:()=>pj});import dr from"node:fs/promises";import Kt from"node:path";async function pj(){return yd()}function wd(){return{claude:{commands:Le(".claude","commands"),config:Le(".claude"),router:Le(".claude","commands","p.md")},gemini:{commands:Le(".gemini","commands"),config:Le(".gemini"),router:Le(".gemini","commands","p.toml")}}}var fn,mj,et,Dn=h(()=>{"use strict";W();ee();_t();ik();Zn();a(pj,"installGlobalConfig");fn=class{static{a(this,"CommandInstaller")}commandsPath="";configPath="";_initialized=!1;async ensureInit(){if(this._initialized)return;let e=await ta();this.configPath=e.configDir??"",this.commandsPath=this.configPath?Kt.join(this.configPath,"commands"):"",this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),A(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),t=await ta();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${t.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let r=Kt.join(this.commandsPath,t);try{await dr.unlink(r),e.push(t)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:w(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let r=Kt.join(this.commandsPath,t);try{await dr.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Kt.join(this.commandsPath,"p");try{if((await dr.stat(e).catch(()=>null))?.isDirectory())return await dr.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return yd()}async cleanupAllLegacy(){let e=At(),t=[],r=[Kt.join(e,".claude","commands","p.md"),Kt.join(e,".claude","commands","p.toml"),Kt.join(e,".gemini","commands","p.md"),Kt.join(e,".gemini","commands","p.toml")];for(let i of r)try{await dr.unlink(i),t.push(i)}catch{}let s=[Kt.join(e,".claude","commands","p"),Kt.join(e,".gemini","commands","p")];for(let i of s)try{(await dr.stat(i).catch(()=>null))?.isDirectory()&&(await dr.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Kt.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await dr.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return ok()}};a(wd,"getProviderPaths");mj=new fn,et=mj});import ck from"node:fs/promises";import fj from"node:path";async function Ia(n,e,t){let r=fj.join(n,e),s="",o=!0;try{s=await ck.readFile(r,"utf-8")}catch(c){if(!B(c))throw new Error(`Could not read ${r}: ${w(c)}`);o=!1}let i=ja(o?s:"",t,Io,Do);return o&&i.content===s?{action:"unchanged",path:r}:(await ck.writeFile(r,i.content,"utf-8"),{action:o?"updated":"created",path:r})}var Io,Do,kd=h(()=>{"use strict";hd();W();Io="<!-- prjct:routing - do not edit between markers -->",Do="<!-- /prjct:routing - managed by prjct -->";a(Ia,"writeRoutingBlock")});async function lk(n){return Ia(n,"AGENTS.md",hj)}var gj,hj,uk=h(()=>{"use strict";kd();gj=`## prjct \u2014 project memory & workflow
864
+ `}let m=ja(c?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await jn.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}var sk,ik=h(()=>{"use strict";_n();Ki();W();hd();Re();sk='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when any of these signs are present: `%%PRJCT_VAULT_GENERATED%%/` exists, OR `.prjct/` is in cwd, OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), READ these vault files first using Read/Glob \u2014 no CLI round-trip:\n\n- `%%PRJCT_VAULT_GENERATED%%/index.md` \u2014 overview, ships, memory counts, patterns count\n- `%%PRJCT_VAULT_GENERATED%%/architecture.md` \u2014 domains, conventions, key insights\n- `%%PRJCT_VAULT_GENERATED%%/{patterns,insights,tech-debt}.md` \u2014 inferred state of the project\n- `%%PRJCT_VAULT_GENERATED%%/memory/{decision,gotcha,learning,fact,inbox}.md` \u2014 captured knowledge\n- `%%PRJCT_VAULT_GENERATED%%/analysis/{anti-patterns,insights,patterns,refactors,risk-areas,tech-debt}/` \u2014 past analyses by category\n- `%%PRJCT_VAULT_GENERATED%%/{ships,releases,tags}/` \u2014 history & taxonomy\n\nOnly fall through to source/repo reading when the vault does not contain the answer.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha \u2014 persist it: `prjct remember <decision|learning|gotcha|fact> "..."` or `prjct capture "<text>" --tags k:v`. **Author every entry in ENGLISH**, whatever language the user speaks. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.** The full verb map and task workflow live in the `prjct` skill.\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `%%PRJCT_VAULT_GENERATED%%/` (Read/Glob freely; never hand-edit \u2014 fix the pipeline)\n- Project config: `.prjct/prjct.config.json` in repo root\n\nThe vault regenerates automatically on `remember`, `capture`, `ship`, `sync`, and the SessionStart/Stop hooks.\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';a(dj,"applyConfiguredVaultPaths");a(ok,"installDocs");a(yd,"installGlobalConfig")});var ak={};N(ak,{CommandInstaller:()=>gn,default:()=>et,getProviderPaths:()=>wd,installGlobalConfig:()=>pj});import pr from"node:fs/promises";import Kt from"node:path";async function pj(){return yd()}function wd(){return{claude:{commands:Le(".claude","commands"),config:Le(".claude"),router:Le(".claude","commands","p.md")},gemini:{commands:Le(".gemini","commands"),config:Le(".gemini"),router:Le(".gemini","commands","p.toml")}}}var gn,mj,et,Dn=h(()=>{"use strict";W();ee();_t();ik();er();a(pj,"installGlobalConfig");gn=class{static{a(this,"CommandInstaller")}commandsPath="";configPath="";_initialized=!1;async ensureInit(){if(this._initialized)return;let e=await ta();this.configPath=e.configDir??"",this.commandsPath=this.configPath?Kt.join(this.configPath,"commands"):"",this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),A(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),t=await ta();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${t.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let r=Kt.join(this.commandsPath,t);try{await pr.unlink(r),e.push(t)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:w(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let r=Kt.join(this.commandsPath,t);try{await pr.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Kt.join(this.commandsPath,"p");try{if((await pr.stat(e).catch(()=>null))?.isDirectory())return await pr.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return yd()}async cleanupAllLegacy(){let e=At(),t=[],r=[Kt.join(e,".claude","commands","p.md"),Kt.join(e,".claude","commands","p.toml"),Kt.join(e,".gemini","commands","p.md"),Kt.join(e,".gemini","commands","p.toml")];for(let i of r)try{await pr.unlink(i),t.push(i)}catch{}let s=[Kt.join(e,".claude","commands","p"),Kt.join(e,".gemini","commands","p")];for(let i of s)try{(await pr.stat(i).catch(()=>null))?.isDirectory()&&(await pr.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[Kt.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await pr.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return ok()}};a(wd,"getProviderPaths");mj=new gn,et=mj});import ck from"node:fs/promises";import fj from"node:path";async function Ia(n,e,t){let r=fj.join(n,e),s="",o=!0;try{s=await ck.readFile(r,"utf-8")}catch(c){if(!B(c))throw new Error(`Could not read ${r}: ${w(c)}`);o=!1}let i=ja(o?s:"",t,Io,Do);return o&&i.content===s?{action:"unchanged",path:r}:(await ck.writeFile(r,i.content,"utf-8"),{action:o?"updated":"created",path:r})}var Io,Do,kd=h(()=>{"use strict";hd();W();Io="<!-- prjct:routing - do not edit between markers -->",Do="<!-- /prjct:routing - managed by prjct -->";a(Ia,"writeRoutingBlock")});async function lk(n){return Ia(n,"AGENTS.md",hj)}var gj,hj,uk=h(()=>{"use strict";kd();gj=`## prjct \u2014 project memory & workflow
865
865
 
866
866
  This project uses prjct for persistent memory + workflow tracking.
867
867
  Recognize the user's intent and run the right verb yourself \u2014 do not
@@ -919,8 +919,8 @@ that travel with this project:
919
919
  When in doubt: capture is always safe; ship is never silent.`,wj=`${Io}
920
920
  ${yj}
921
921
  ${Do}
922
- `;a(dk,"writeProjectClaudeMd")});import $o from"node:path";function fk(){return mk.flatMap(n=>n.projectRuleTargets??[])}async function Wr(n){return Promise.all(mk.map(async e=>{let t=await kj(e,n);return{runtime:e,detected:t.length>0||e.id==="agents-md"||e.id==="mcp",reason:t[0],detectedSignals:t,writableMcpTargets:(e.mcpTargets??[]).filter(r=>r.writable),supportLevel:vj(e)}}))}async function kj(n,e){let t=[];for(let r of n.detectsBy?.projectFiles??[])await A($o.join(e,r))&&t.push(r);for(let r of n.detectsBy?.projectDirs??[])await Be($o.join(e,r))&&t.push(`${r}/`);for(let r of n.detectsBy?.homeDirs??[])await Be($o.join(At(),r))&&t.push(`~/${r}/`);for(let r of n.detectsBy?.commands??[])await bj(r)&&t.push(`command:${r}`);return t}async function bj(n){try{return await G("which",[n]),!0}catch{return!1}}function vj(n){return n.status==="hosted"?"hosted":n.id==="claude"?"full":n.supports.agentsMd&&n.supports.mcp?"good":n.supports.agentsMd?"baseline":"manual"}var mk,Mo=h(()=>{"use strict";ue();ee();Zn();mk=[{id:"agents-md",displayName:"AGENTS.md-compatible agents",kind:"standard",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal project instruction surface shared by current and future coding agents."},{id:"mcp",displayName:"Model Context Protocol clients",kind:"standard",status:"stable",contextFiles:[],supports:{agentsMd:!1,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal tool surface for prjct memory, workflow, files, and code intelligence."},{id:"acp",displayName:"Agent Client Protocol clients",kind:"standard",status:"emerging",contextFiles:[],supports:{agentsMd:!1,mcp:!1,skills:!1,hooks:!1,acp:!0,projectRules:!1},notes:"Editor/agent transport for clients such as Zed and other ACP-compatible tools."},{id:"claude",displayName:"Claude Code",kind:"cli",status:"stable",detectsBy:{homeDirs:[".claude"],commands:["claude"]},contextFiles:["CLAUDE.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.claude/mcp.json",writable:!0}],supports:{agentsMd:!1,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Uses CLAUDE.md, global skills, hooks, and Claude-style MCP JSON."},{id:"codex",displayName:"OpenAI Codex",kind:"cli",status:"stable",detectsBy:{homeDirs:[".codex"],commands:["codex"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.codex/config.toml",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!1},notes:"Uses AGENTS.md, compact skills, and Codex config.toml MCP servers."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses GEMINI.md and MCP; AGENTS.md keeps repo-level compatibility with other agents."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[$o.join(".gemini","antigravity")]},contextFiles:["ANTIGRAVITY.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses Antigravity skills under the Gemini config tree."},{id:"opencode",displayName:"OpenCode",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/opencode"],projectDirs:[".opencode"],commands:["opencode"]},contextFiles:["AGENTS.md","opencode.json","opencode.jsonc"],mcpTargets:[{format:"opencode-json",pathHint:"opencode.jsonc mcp",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Multi-provider coding agent with AGENTS.md, project agents, plugins, and MCP config."},{id:"qwen-code",displayName:"Qwen Code",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".qwen"],projectDirs:[".qwen"],commands:["qwen"]},contextFiles:["AGENTS.md","GEMINI.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Qwen-family coding runtime; treat model/provider choice as separate from runtime setup."},{id:"kimi-cli",displayName:"Kimi CLI",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".kimi"],projectDirs:[".kimi"],commands:["kimi"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Kimi-family coding runtime; AGENTS.md and MCP/CLI markdown output are the portable contract."},{id:"goose",displayName:"Goose",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/goose"],projectDirs:[".goose"],commands:["goose"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"generic",pathHint:"Goose extensions",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Open-source coding agent with extension/MCP-style tool configuration."},{id:"aider",displayName:"Aider",kind:"cli",status:"stable",detectsBy:{projectFiles:[".aider.conf.yml",".aider.conf.yaml"],commands:["aider"]},contextFiles:["AGENTS.md","CONVENTIONS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"CLI pair-programming agent; AGENTS.md provides durable repo instructions."},{id:"cursor",displayName:"Cursor",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cursor"],projectFiles:[".cursorrules"]},contextFiles:["AGENTS.md",".cursor/rules/prjct.mdc"],projectRuleTargets:[{relativePath:".cursor/rules/prjct.mdc",templateKey:"global/CURSOR.mdc",detectPath:".cursor"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Project rules live under .cursor/rules; model/provider selection happens in Cursor."},{id:"windsurf",displayName:"Windsurf",kind:"ide",status:"stable",detectsBy:{projectDirs:[".windsurf"],projectFiles:[".windsurfrules"]},contextFiles:["AGENTS.md",".windsurf/rules/prjct.md"],projectRuleTargets:[{relativePath:".windsurf/rules/prjct.md",templateKey:"global/WINDSURF.md",detectPath:".windsurf"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Project rules live under .windsurf/rules; keep legacy support but do not center it."},{id:"cline",displayName:"Cline",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cline",".clinerules"],projectFiles:[".clinerules"]},contextFiles:["AGENTS.md",".clinerules/"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!0,projectRules:!0},notes:"VS Code agent with AGENTS.md, rules, skills, hooks, MCP, CLI, and ACP surfaces."},{id:"roo-code",displayName:"Roo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".roo"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"VS Code agent with MCP and project rule surfaces."},{id:"continue",displayName:"Continue",kind:"ide",status:"stable",detectsBy:{projectDirs:[".continue"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"continue-yaml",pathHint:".continue/mcpServers/",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE assistant with dedicated MCP server config directory."},{id:"kiro",displayName:"Kiro",kind:"ide",status:"stable",detectsBy:{homeDirs:[".kiro"],projectDirs:[".kiro"]},contextFiles:["AGENTS.md",".kiro/steering/"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Agentic IDE with steering docs and MCP."},{id:"copilot",displayName:"GitHub Copilot coding agent",kind:"hosted",status:"hosted",detectsBy:{projectFiles:[$o.join(".github","copilot-instructions.md")]},contextFiles:["AGENTS.md",".github/copilot-instructions.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Hosted GitHub agent; repo instructions and MCP-compatible setup are the portable layer."},{id:"devin",displayName:"Devin",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; repo-level AGENTS.md is the safest portable surface."},{id:"jules",displayName:"Google Jules",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md carries repo-level prjct instructions."},{id:"zed",displayName:"Zed Agent Panel",kind:"ide",status:"stable",detectsBy:{projectDirs:[".zed"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!0,projectRules:!0},notes:"Editor agent surface with ACP support; AGENTS.md remains the repo contract."},{id:"warp",displayName:"Warp",kind:"ide",status:"stable",detectsBy:{homeDirs:[".warp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Terminal agent surface; AGENTS.md plus MCP covers portable prjct usage."},{id:"amp",displayName:"Amp",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/amp"],commands:["amp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Coding agent runtime; AGENTS.md and MCP are the portable contract."},{id:"factory",displayName:"Factory",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted/agentic development platform; repo instructions are the stable surface."},{id:"augment",displayName:"Augment",kind:"ide",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE agent; universal project instructions avoid model-specific coupling."},{id:"kilo-code",displayName:"Kilo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".kilocode"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Agent runtime in the Cline/Roo family; AGENTS.md and MCP keep it compatible."},{id:"phoenix",displayName:"Phoenix",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"ona",displayName:"Ona",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"semgrep",displayName:"Semgrep assistant",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Security/review agent surface; AGENTS.md carries project workflow guidance."}];a(fk,"listProjectRuleTargets");a(Wr,"detectAgentRuntimes");a(kj,"detectRuntimeSignals");a(bj,"commandExists");a(vj,"supportLevelFor")});import bd from"node:fs/promises";import Da from"node:path";async function Sj(n){let e=Mt(n);return e||bd.readFile(Da.join(Xt,"templates",n),"utf-8")}async function Ej(n,e,t){let r=Da.join(n,e);await bd.mkdir(Da.dirname(r),{recursive:!0}),await bd.writeFile(r,await Sj(t),"utf-8")}async function gk(n,e={}){let t=new Set(e.agents??[]),r=[];for(let s of fk())(t.has(s.relativePath.split("/")[0].replace(/^\./,""))||s.detectPath&&await A(Da.join(n,s.detectPath)))&&(await Ej(n,s.relativePath,s.templateKey),r.push(s.relativePath));return{written:r}}var hk=h(()=>{"use strict";_n();Mo();ee();Ze();a(Sj,"loadTemplate");a(Ej,"writeRule");a(gk,"writeProjectIdeRules")});var yk={};N(yk,{writeProjectAgentSurfaces:()=>Bt});import Tj from"node:path";async function Bt(n,e={}){let t=new Set(e.agents??[]),r=await lk(n),s=await A(Tj.join(n,"CLAUDE.md")),i=t.has("claude")||s?await dk(n):void 0,c=await gk(n,e);return{agentsMd:r,...i?{claudeMd:i}:{},ideRules:c.written}}var Es=h(()=>{"use strict";ee();uk();pk();hk();a(Bt,"writeProjectAgentSurfaces")});function $a(n,e,t){if(t.md){console.log(`> ${e}`);return}g[n](e)}function L(n,e={}){return Cj(n,e),{success:!1,error:n}}function D(n,e={}){return Yt(n,e),{success:!1,error:n}}function Ne(n,e){let t=w(n);return e&&Yt(t,e),{success:!1,error:t}}var Cj,vd,Yt,Nt,we=h(()=>{"use strict";W();fe();a($a,"notify");Cj=a((n,e={})=>$a("warn",n,e),"notifyWarn"),vd=a((n,e={})=>$a("info",n,e),"notifyInfo"),Yt=a((n,e={})=>$a("fail",n,e),"notifyFail"),Nt=a((n,e={})=>$a("done",n,e),"notifyDone");a(L,"failWith");a(D,"failHard");a(Ne,"failFromError")});import lt from"node:path";async function Rj(n,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await A(lt.join(n,"pnpm-lock.yaml"))?"pnpm":await A(lt.join(n,"yarn.lock"))?"yarn":await A(lt.join(n,"bun.lockb"))||await A(lt.join(n,"bun.lock"))?"bun":(await A(lt.join(n,"package-lock.json")),"npm")}function wk(n,e){return n==="yarn"?`yarn ${e}`:n==="pnpm"?`pnpm run ${e}`:n==="bun"?`bun run ${e}`:`npm run ${e}`}function xj(n){return n==="yarn"?"yarn test":n==="pnpm"?"pnpm test":n==="bun"?"bun test":"npm test"}async function Ts(n,e){for(let s of Pj)if(await A(lt.join(n,s)))return s;let r=(e??await Yn(n)).find(s=>s.endsWith(Aj));if(r)return r}async function $n(n){for(let e of _j)if(await A(lt.join(n,e)))return e}async function Mn(n){let e=lt.join(n,"package.json"),t=await Oe(e,null);if(t){let c=await Rj(n,t),l=t.scripts||{},u={stack:"js",packageManager:c};return l.lint&&(u.lint={tool:c,command:wk(c,"lint")}),l.typecheck&&(u.typecheck={tool:c,command:wk(c,"typecheck")}),l.test&&(u.test={tool:c,command:xj(c)}),u.versionFile=await Ts(n),u.changelogFile=await $n(n),u}if(await A(lt.join(n,"pytest.ini"))){let c=await Ts(n),l=await $n(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}let r=await Gt(lt.join(n,"pyproject.toml"),"");if(r.includes("[tool.pytest")||r.includes("pytest")){let c=await Ts(n),l=await $n(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}if(await A(lt.join(n,"Cargo.toml"))){let c=await $n(n);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:c}}if(await A(lt.join(n,"go.mod"))){let c=await Ts(n),l=await $n(n);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:c,changelogFile:l}}let s=await Yn(n);if(s.some(c=>c.endsWith(".sln")||c.endsWith(".csproj")||c.endsWith(".fsproj"))){let c=await Ts(n,s),l=await $n(n);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:c,changelogFile:l}}if(await A(lt.join(n,"pom.xml"))){let c=await $n(n);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:c}}if(await A(lt.join(n,"gradlew"))&&(await A(lt.join(n,"build.gradle"))||await A(lt.join(n,"build.gradle.kts")))){let c=await $n(n);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:c}}let o=await Ts(n),i=await $n(n);return{stack:"unknown",versionFile:o,changelogFile:i}}var Pj,Aj,_j,No=h(()=>{"use strict";ee();a(Rj,"detectPackageManager");a(wk,"pmRun");a(xj,"pmTest");Pj=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Aj=".csproj",_j=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];a(Ts,"detectVersionFile");a($n,"detectChangelogFile");a(Mn,"detectProjectCommands")});var Sd={};N(Sd,{AI_AGENTS:()=>Oa,PROJECT_TYPES:()=>Cs,detectInstalledAgents:()=>Fa,detectProjectType:()=>La,detectStack:()=>Ha});import Na from"node:fs/promises";import Ma from"node:os";import He from"node:path";async function La(n){try{let e=await Na.readdir(n);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=He.join(n,"package.json"),r=JSON.parse(await Na.readFile(t,"utf-8")),s={...r.dependencies,...r.devDependencies};if(r.bin)return"cli-tool";if(r.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(r=>["main.py","app.py","server.py"].includes(r))?"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 Fa(n){let e=[];await Be(He.join(Ma.homedir(),".claude"))&&e.push("claude"),await A(He.join(n,".cursorrules"))&&e.push("cursor"),await A(He.join(n,".windsurfrules"))&&e.push("windsurf"),await A(He.join(n,".github","copilot-instructions.md"))&&e.push("copilot"),await Be(He.join(Ma.homedir(),".gemini"))&&e.push("gemini"),await Be(He.join(Ma.homedir(),".gemini","antigravity"))&&e.push("antigravity"),await Be(He.join(n,".opencode"))&&e.push("opencode"),await Be(He.join(n,".qwen"))&&e.push("qwen-code"),await Be(He.join(n,".goose"))&&e.push("goose"),(await A(He.join(n,".aider.conf.yml"))||await A(He.join(n,".aider.conf.yaml")))&&e.push("aider"),(await Be(He.join(n,".cline"))||await Be(He.join(n,".clinerules"))||await A(He.join(n,".clinerules")))&&e.push("cline"),await Be(He.join(n,".roo"))&&e.push("roo-code"),await Be(He.join(n,".continue"))&&e.push("continue"),await Be(He.join(n,".kiro"))&&e.push("kiro"),await Be(He.join(n,".zed"))&&e.push("zed");try{let{execAsync:t}=await Promise.resolve().then(()=>(ue(),uu));await t("which codex"),e.push("codex")}catch{await Be(He.join(Ma.homedir(),".codex"))&&e.push("codex")}return e}async function Ha(n){let e={language:"Unknown",technologies:[]};try{let t=await Na.readdir(n);if(t.includes("package.json")){let r=He.join(n,"package.json"),s=JSON.parse(await Na.readFile(r,"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 Cs,Oa,Ua=h(()=>{"use strict";ee();Cs=[{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."}],Oa=[{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"},{value:"opencode",title:"OpenCode",description:"Open-source terminal coding agent"},{value:"qwen-code",title:"Qwen Code",description:"Qwen-family coding runtime"},{value:"goose",title:"Goose",description:"Open-source coding agent with extensions"},{value:"aider",title:"Aider",description:"Terminal pair-programming agent"},{value:"cline",title:"Cline",description:"VS Code coding agent"},{value:"roo-code",title:"Roo Code",description:"VS Code coding agent with MCP"},{value:"continue",title:"Continue",description:"IDE assistant with MCP config"},{value:"kiro",title:"Kiro",description:"Agentic IDE with steering docs"},{value:"zed",title:"Zed",description:"Editor agent with ACP support"}];a(La,"detectProjectType");a(Fa,"detectInstalledAgents");a(Ha,"detectStack")});import*as ye from"@clack/prompts";import Br from"chalk";var Oo,kk=h(()=>{"use strict";fe();Ua();Oo=class{static{a(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(){ye.intro(Br.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:a(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:a(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:a(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:a(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:a(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return ye.outro(Br.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){g.spin("Auto-detecting project configuration..."),this.detectedType=await La(this.projectPath),this.confirmedType=this.detectedType;let e=await Fa(this.projectPath);return this.selectedAgents=e,this.detectedStack=await Ha(this.projectPath),this.confirmedStack=this.detectedStack,g.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await La(this.projectPath);let e=Cs.findIndex(r=>r.value===this.detectedType),t=await ye.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Cs.map(r=>({label:r.title,hint:r.description,value:r.value})),initialValue:e>=0?Cs[e].value:void 0});return ye.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await Fa(this.projectPath),t=Oa.map(s=>({label:s.title,hint:s.description,value:s.value})),r=await ye.multiselect({message:"Which AI agents do you use?",options:t,initialValues:e,required:!0});return ye.isCancel(r)?(this.handleCancel(),!1):(this.selectedAgents=r,!0)}async stepStack(){this.detectedStack=await Ha(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);ye.note(e,"Detected stack");let t=await ye.confirm({message:"Is this stack correct?",initialValue:!0});if(ye.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let r=await ye.group({language:a(()=>ye.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:a(()=>ye.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:a(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:r.language||this.detectedStack.language,framework:r.framework||void 0}}return!0}async stepPreferences(){let e=await ye.group({verbosity:a(()=>ye.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:a(()=>ye.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:a(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Br.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Br.cyan("AI Agents:")} ${this.selectedAgents.map(r=>this.getAgentLabel(r)).join(", ")}`,`${Br.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Br.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Br.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
923
- `);ye.note(e,"Configuration Summary");let t=await ye.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ye.isCancel(t)||!t?(ye.isCancel(t)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,ye.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Cs.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Oa.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import jj from"node:https";import bk from"node:path";import pr from"chalk";function Ij(n,e){let t=`Update available! ${n} \u2192 ${e}`,r="prjct upgrade",s=Math.max(t.length,`Run: ${r}`.length)+4,o=`\u250C${"\u2500".repeat(s)}\u2510`,i=`\u2514${"\u2500".repeat(s)}\u2518`,c=a(l=>`\u2502 ${l}${" ".repeat(s-l.length-2)}\u2502`,"pad");return["",pr.yellow(o),pr.yellow(c("")),pr.yellow(`\u2502 ${pr.bold(t)}${" ".repeat(s-t.length-2)}\u2502`),pr.yellow(`\u2502 Run: ${pr.cyan(r)}${" ".repeat(s-r.length-7)}\u2502`),pr.yellow(c("")),pr.yellow(i),""].join(`
922
+ `;a(dk,"writeProjectClaudeMd")});import $o from"node:path";function fk(){return mk.flatMap(n=>n.projectRuleTargets??[])}async function Wr(n){return Promise.all(mk.map(async e=>{let t=await kj(e,n);return{runtime:e,detected:t.length>0||e.id==="agents-md"||e.id==="mcp",reason:t[0],detectedSignals:t,writableMcpTargets:(e.mcpTargets??[]).filter(r=>r.writable),supportLevel:vj(e)}}))}async function kj(n,e){let t=[];for(let r of n.detectsBy?.projectFiles??[])await A($o.join(e,r))&&t.push(r);for(let r of n.detectsBy?.projectDirs??[])await Be($o.join(e,r))&&t.push(`${r}/`);for(let r of n.detectsBy?.homeDirs??[])await Be($o.join(At(),r))&&t.push(`~/${r}/`);for(let r of n.detectsBy?.commands??[])await bj(r)&&t.push(`command:${r}`);return t}async function bj(n){try{return await G("which",[n]),!0}catch{return!1}}function vj(n){return n.status==="hosted"?"hosted":n.id==="claude"?"full":n.supports.agentsMd&&n.supports.mcp?"good":n.supports.agentsMd?"baseline":"manual"}var mk,Mo=h(()=>{"use strict";ue();ee();er();mk=[{id:"agents-md",displayName:"AGENTS.md-compatible agents",kind:"standard",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal project instruction surface shared by current and future coding agents."},{id:"mcp",displayName:"Model Context Protocol clients",kind:"standard",status:"stable",contextFiles:[],supports:{agentsMd:!1,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal tool surface for prjct memory, workflow, files, and code intelligence."},{id:"acp",displayName:"Agent Client Protocol clients",kind:"standard",status:"emerging",contextFiles:[],supports:{agentsMd:!1,mcp:!1,skills:!1,hooks:!1,acp:!0,projectRules:!1},notes:"Editor/agent transport for clients such as Zed and other ACP-compatible tools."},{id:"claude",displayName:"Claude Code",kind:"cli",status:"stable",detectsBy:{homeDirs:[".claude"],commands:["claude"]},contextFiles:["CLAUDE.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.claude/mcp.json",writable:!0}],supports:{agentsMd:!1,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Uses CLAUDE.md, global skills, hooks, and Claude-style MCP JSON."},{id:"codex",displayName:"OpenAI Codex",kind:"cli",status:"stable",detectsBy:{homeDirs:[".codex"],commands:["codex"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.codex/config.toml",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!1},notes:"Uses AGENTS.md, compact skills, and Codex config.toml MCP servers."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses GEMINI.md and MCP; AGENTS.md keeps repo-level compatibility with other agents."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[$o.join(".gemini","antigravity")]},contextFiles:["ANTIGRAVITY.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses Antigravity skills under the Gemini config tree."},{id:"opencode",displayName:"OpenCode",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/opencode"],projectDirs:[".opencode"],commands:["opencode"]},contextFiles:["AGENTS.md","opencode.json","opencode.jsonc"],mcpTargets:[{format:"opencode-json",pathHint:"opencode.jsonc mcp",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Multi-provider coding agent with AGENTS.md, project agents, plugins, and MCP config."},{id:"qwen-code",displayName:"Qwen Code",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".qwen"],projectDirs:[".qwen"],commands:["qwen"]},contextFiles:["AGENTS.md","GEMINI.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Qwen-family coding runtime; treat model/provider choice as separate from runtime setup."},{id:"kimi-cli",displayName:"Kimi CLI",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".kimi"],projectDirs:[".kimi"],commands:["kimi"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Kimi-family coding runtime; AGENTS.md and MCP/CLI markdown output are the portable contract."},{id:"goose",displayName:"Goose",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/goose"],projectDirs:[".goose"],commands:["goose"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"generic",pathHint:"Goose extensions",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Open-source coding agent with extension/MCP-style tool configuration."},{id:"aider",displayName:"Aider",kind:"cli",status:"stable",detectsBy:{projectFiles:[".aider.conf.yml",".aider.conf.yaml"],commands:["aider"]},contextFiles:["AGENTS.md","CONVENTIONS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"CLI pair-programming agent; AGENTS.md provides durable repo instructions."},{id:"cursor",displayName:"Cursor",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cursor"],projectFiles:[".cursorrules"]},contextFiles:["AGENTS.md",".cursor/rules/prjct.mdc"],projectRuleTargets:[{relativePath:".cursor/rules/prjct.mdc",templateKey:"global/CURSOR.mdc",detectPath:".cursor"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Project rules live under .cursor/rules; model/provider selection happens in Cursor."},{id:"windsurf",displayName:"Windsurf",kind:"ide",status:"stable",detectsBy:{projectDirs:[".windsurf"],projectFiles:[".windsurfrules"]},contextFiles:["AGENTS.md",".windsurf/rules/prjct.md"],projectRuleTargets:[{relativePath:".windsurf/rules/prjct.md",templateKey:"global/WINDSURF.md",detectPath:".windsurf"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Project rules live under .windsurf/rules; keep legacy support but do not center it."},{id:"cline",displayName:"Cline",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cline",".clinerules"],projectFiles:[".clinerules"]},contextFiles:["AGENTS.md",".clinerules/"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!0,projectRules:!0},notes:"VS Code agent with AGENTS.md, rules, skills, hooks, MCP, CLI, and ACP surfaces."},{id:"roo-code",displayName:"Roo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".roo"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"VS Code agent with MCP and project rule surfaces."},{id:"continue",displayName:"Continue",kind:"ide",status:"stable",detectsBy:{projectDirs:[".continue"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"continue-yaml",pathHint:".continue/mcpServers/",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE assistant with dedicated MCP server config directory."},{id:"kiro",displayName:"Kiro",kind:"ide",status:"stable",detectsBy:{homeDirs:[".kiro"],projectDirs:[".kiro"]},contextFiles:["AGENTS.md",".kiro/steering/"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Agentic IDE with steering docs and MCP."},{id:"copilot",displayName:"GitHub Copilot coding agent",kind:"hosted",status:"hosted",detectsBy:{projectFiles:[$o.join(".github","copilot-instructions.md")]},contextFiles:["AGENTS.md",".github/copilot-instructions.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Hosted GitHub agent; repo instructions and MCP-compatible setup are the portable layer."},{id:"devin",displayName:"Devin",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; repo-level AGENTS.md is the safest portable surface."},{id:"jules",displayName:"Google Jules",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md carries repo-level prjct instructions."},{id:"zed",displayName:"Zed Agent Panel",kind:"ide",status:"stable",detectsBy:{projectDirs:[".zed"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!0,projectRules:!0},notes:"Editor agent surface with ACP support; AGENTS.md remains the repo contract."},{id:"warp",displayName:"Warp",kind:"ide",status:"stable",detectsBy:{homeDirs:[".warp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Terminal agent surface; AGENTS.md plus MCP covers portable prjct usage."},{id:"amp",displayName:"Amp",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/amp"],commands:["amp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Coding agent runtime; AGENTS.md and MCP are the portable contract."},{id:"factory",displayName:"Factory",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted/agentic development platform; repo instructions are the stable surface."},{id:"augment",displayName:"Augment",kind:"ide",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE agent; universal project instructions avoid model-specific coupling."},{id:"kilo-code",displayName:"Kilo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".kilocode"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Agent runtime in the Cline/Roo family; AGENTS.md and MCP keep it compatible."},{id:"phoenix",displayName:"Phoenix",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"ona",displayName:"Ona",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"semgrep",displayName:"Semgrep assistant",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Security/review agent surface; AGENTS.md carries project workflow guidance."}];a(fk,"listProjectRuleTargets");a(Wr,"detectAgentRuntimes");a(kj,"detectRuntimeSignals");a(bj,"commandExists");a(vj,"supportLevelFor")});import bd from"node:fs/promises";import Da from"node:path";async function Sj(n){let e=Mt(n);return e||bd.readFile(Da.join(Xt,"templates",n),"utf-8")}async function Ej(n,e,t){let r=Da.join(n,e);await bd.mkdir(Da.dirname(r),{recursive:!0}),await bd.writeFile(r,await Sj(t),"utf-8")}async function gk(n,e={}){let t=new Set(e.agents??[]),r=[];for(let s of fk())(t.has(s.relativePath.split("/")[0].replace(/^\./,""))||s.detectPath&&await A(Da.join(n,s.detectPath)))&&(await Ej(n,s.relativePath,s.templateKey),r.push(s.relativePath));return{written:r}}var hk=h(()=>{"use strict";_n();Mo();ee();Ze();a(Sj,"loadTemplate");a(Ej,"writeRule");a(gk,"writeProjectIdeRules")});var yk={};N(yk,{writeProjectAgentSurfaces:()=>Bt});import Tj from"node:path";async function Bt(n,e={}){let t=new Set(e.agents??[]),r=await lk(n),s=await A(Tj.join(n,"CLAUDE.md")),i=t.has("claude")||s?await dk(n):void 0,c=await gk(n,e);return{agentsMd:r,...i?{claudeMd:i}:{},ideRules:c.written}}var Es=h(()=>{"use strict";ee();uk();pk();hk();a(Bt,"writeProjectAgentSurfaces")});function $a(n,e,t){if(t.md){console.log(`> ${e}`);return}g[n](e)}function L(n,e={}){return Cj(n,e),{success:!1,error:n}}function D(n,e={}){return Yt(n,e),{success:!1,error:n}}function Ne(n,e){let t=w(n);return e&&Yt(t,e),{success:!1,error:t}}var Cj,vd,Yt,Nt,we=h(()=>{"use strict";W();fe();a($a,"notify");Cj=a((n,e={})=>$a("warn",n,e),"notifyWarn"),vd=a((n,e={})=>$a("info",n,e),"notifyInfo"),Yt=a((n,e={})=>$a("fail",n,e),"notifyFail"),Nt=a((n,e={})=>$a("done",n,e),"notifyDone");a(L,"failWith");a(D,"failHard");a(Ne,"failFromError")});import lt from"node:path";async function Rj(n,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await A(lt.join(n,"pnpm-lock.yaml"))?"pnpm":await A(lt.join(n,"yarn.lock"))?"yarn":await A(lt.join(n,"bun.lockb"))||await A(lt.join(n,"bun.lock"))?"bun":(await A(lt.join(n,"package-lock.json")),"npm")}function wk(n,e){return n==="yarn"?`yarn ${e}`:n==="pnpm"?`pnpm run ${e}`:n==="bun"?`bun run ${e}`:`npm run ${e}`}function xj(n){return n==="yarn"?"yarn test":n==="pnpm"?"pnpm test":n==="bun"?"bun test":"npm test"}async function Ts(n,e){for(let s of Pj)if(await A(lt.join(n,s)))return s;let r=(e??await Qn(n)).find(s=>s.endsWith(Aj));if(r)return r}async function $n(n){for(let e of _j)if(await A(lt.join(n,e)))return e}async function Mn(n){let e=lt.join(n,"package.json"),t=await Oe(e,null);if(t){let c=await Rj(n,t),l=t.scripts||{},u={stack:"js",packageManager:c};return l.lint&&(u.lint={tool:c,command:wk(c,"lint")}),l.typecheck&&(u.typecheck={tool:c,command:wk(c,"typecheck")}),l.test&&(u.test={tool:c,command:xj(c)}),u.versionFile=await Ts(n),u.changelogFile=await $n(n),u}if(await A(lt.join(n,"pytest.ini"))){let c=await Ts(n),l=await $n(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}let r=await Gt(lt.join(n,"pyproject.toml"),"");if(r.includes("[tool.pytest")||r.includes("pytest")){let c=await Ts(n),l=await $n(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}if(await A(lt.join(n,"Cargo.toml"))){let c=await $n(n);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:c}}if(await A(lt.join(n,"go.mod"))){let c=await Ts(n),l=await $n(n);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:c,changelogFile:l}}let s=await Qn(n);if(s.some(c=>c.endsWith(".sln")||c.endsWith(".csproj")||c.endsWith(".fsproj"))){let c=await Ts(n,s),l=await $n(n);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:c,changelogFile:l}}if(await A(lt.join(n,"pom.xml"))){let c=await $n(n);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:c}}if(await A(lt.join(n,"gradlew"))&&(await A(lt.join(n,"build.gradle"))||await A(lt.join(n,"build.gradle.kts")))){let c=await $n(n);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:c}}let o=await Ts(n),i=await $n(n);return{stack:"unknown",versionFile:o,changelogFile:i}}var Pj,Aj,_j,No=h(()=>{"use strict";ee();a(Rj,"detectPackageManager");a(wk,"pmRun");a(xj,"pmTest");Pj=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],Aj=".csproj",_j=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];a(Ts,"detectVersionFile");a($n,"detectChangelogFile");a(Mn,"detectProjectCommands")});var Sd={};N(Sd,{AI_AGENTS:()=>Oa,PROJECT_TYPES:()=>Cs,detectInstalledAgents:()=>Fa,detectProjectType:()=>La,detectStack:()=>Ha});import Na from"node:fs/promises";import Ma from"node:os";import He from"node:path";async function La(n){try{let e=await Na.readdir(n);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=He.join(n,"package.json"),r=JSON.parse(await Na.readFile(t,"utf-8")),s={...r.dependencies,...r.devDependencies};if(r.bin)return"cli-tool";if(r.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(r=>["main.py","app.py","server.py"].includes(r))?"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 Fa(n){let e=[];await Be(He.join(Ma.homedir(),".claude"))&&e.push("claude"),await A(He.join(n,".cursorrules"))&&e.push("cursor"),await A(He.join(n,".windsurfrules"))&&e.push("windsurf"),await A(He.join(n,".github","copilot-instructions.md"))&&e.push("copilot"),await Be(He.join(Ma.homedir(),".gemini"))&&e.push("gemini"),await Be(He.join(Ma.homedir(),".gemini","antigravity"))&&e.push("antigravity"),await Be(He.join(n,".opencode"))&&e.push("opencode"),await Be(He.join(n,".qwen"))&&e.push("qwen-code"),await Be(He.join(n,".goose"))&&e.push("goose"),(await A(He.join(n,".aider.conf.yml"))||await A(He.join(n,".aider.conf.yaml")))&&e.push("aider"),(await Be(He.join(n,".cline"))||await Be(He.join(n,".clinerules"))||await A(He.join(n,".clinerules")))&&e.push("cline"),await Be(He.join(n,".roo"))&&e.push("roo-code"),await Be(He.join(n,".continue"))&&e.push("continue"),await Be(He.join(n,".kiro"))&&e.push("kiro"),await Be(He.join(n,".zed"))&&e.push("zed");try{let{execAsync:t}=await Promise.resolve().then(()=>(ue(),uu));await t("which codex"),e.push("codex")}catch{await Be(He.join(Ma.homedir(),".codex"))&&e.push("codex")}return e}async function Ha(n){let e={language:"Unknown",technologies:[]};try{let t=await Na.readdir(n);if(t.includes("package.json")){let r=He.join(n,"package.json"),s=JSON.parse(await Na.readFile(r,"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 Cs,Oa,Ua=h(()=>{"use strict";ee();Cs=[{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."}],Oa=[{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"},{value:"opencode",title:"OpenCode",description:"Open-source terminal coding agent"},{value:"qwen-code",title:"Qwen Code",description:"Qwen-family coding runtime"},{value:"goose",title:"Goose",description:"Open-source coding agent with extensions"},{value:"aider",title:"Aider",description:"Terminal pair-programming agent"},{value:"cline",title:"Cline",description:"VS Code coding agent"},{value:"roo-code",title:"Roo Code",description:"VS Code coding agent with MCP"},{value:"continue",title:"Continue",description:"IDE assistant with MCP config"},{value:"kiro",title:"Kiro",description:"Agentic IDE with steering docs"},{value:"zed",title:"Zed",description:"Editor agent with ACP support"}];a(La,"detectProjectType");a(Fa,"detectInstalledAgents");a(Ha,"detectStack")});import*as ye from"@clack/prompts";import Br from"chalk";var Oo,kk=h(()=>{"use strict";fe();Ua();Oo=class{static{a(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(){ye.intro(Br.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:a(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:a(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:a(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:a(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:a(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return ye.outro(Br.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){g.spin("Auto-detecting project configuration..."),this.detectedType=await La(this.projectPath),this.confirmedType=this.detectedType;let e=await Fa(this.projectPath);return this.selectedAgents=e,this.detectedStack=await Ha(this.projectPath),this.confirmedStack=this.detectedStack,g.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await La(this.projectPath);let e=Cs.findIndex(r=>r.value===this.detectedType),t=await ye.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Cs.map(r=>({label:r.title,hint:r.description,value:r.value})),initialValue:e>=0?Cs[e].value:void 0});return ye.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await Fa(this.projectPath),t=Oa.map(s=>({label:s.title,hint:s.description,value:s.value})),r=await ye.multiselect({message:"Which AI agents do you use?",options:t,initialValues:e,required:!0});return ye.isCancel(r)?(this.handleCancel(),!1):(this.selectedAgents=r,!0)}async stepStack(){this.detectedStack=await Ha(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);ye.note(e,"Detected stack");let t=await ye.confirm({message:"Is this stack correct?",initialValue:!0});if(ye.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let r=await ye.group({language:a(()=>ye.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:a(()=>ye.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:a(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:r.language||this.detectedStack.language,framework:r.framework||void 0}}return!0}async stepPreferences(){let e=await ye.group({verbosity:a(()=>ye.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:a(()=>ye.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:a(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Br.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Br.cyan("AI Agents:")} ${this.selectedAgents.map(r=>this.getAgentLabel(r)).join(", ")}`,`${Br.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Br.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Br.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
923
+ `);ye.note(e,"Configuration Summary");let t=await ye.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ye.isCancel(t)||!t?(ye.isCancel(t)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,ye.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Cs.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Oa.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});import jj from"node:https";import bk from"node:path";import mr from"chalk";function Ij(n,e){let t=`Update available! ${n} \u2192 ${e}`,r="prjct upgrade",s=Math.max(t.length,`Run: ${r}`.length)+4,o=`\u250C${"\u2500".repeat(s)}\u2510`,i=`\u2514${"\u2500".repeat(s)}\u2518`,c=a(l=>`\u2502 ${l}${" ".repeat(s-l.length-2)}\u2502`,"pad");return["",mr.yellow(o),mr.yellow(c("")),mr.yellow(`\u2502 ${mr.bold(t)}${" ".repeat(s-t.length-2)}\u2502`),mr.yellow(`\u2502 Run: ${mr.cyan(r)}${" ".repeat(s-r.length-7)}\u2502`),mr.yellow(c("")),mr.yellow(i),""].join(`
924
924
  `)}var Ed,Lo,QV,Td=h(()=>{"use strict";W();ee();Ze();Re();Ed=class{static{a(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=j.globalConfigDir,this.cacheFile=bk.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=bk.join(__dirname,"..","..","package.json");return(await Oe(e))?.version??null}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let r={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=jj.request(r,o=>{let i="";o.on("data",c=>{i+=c}),o.on("end",()=>{try{if(o.statusCode===200){let c=JSON.parse(i);e(c.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(c){t(c)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let r=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=r[o]||0,c=s[o]||0;if(i>c)return 1;if(i<c)return-1}return 0}async readCache(){try{if(await A(this.cacheFile))return await Oe(this.cacheFile)}catch{}return null}async writeCache(e){try{await Ee(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),r=Date.now();if(t?.lastCheck&&r-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:r,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:Ij(e.currentVersion,e.latestVersion)}},Lo=Ed,QV=1440*60*1e3;a(Ij,"formatUpdateBanner")});import vk from"node:path";async function Mj(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let n=process.cwd();if(await A(vk.join(n,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await A(vk.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function Nj(){return{...Dj}}function Oj(){return{...$j}}async function Sk(){return Ga||(Ga=await Mj()?Nj():Oj(),Ga)}var Ga,Dj,$j,Ek=h(()=>{"use strict";ee();Ga=null,Dj={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}},$j={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}};a(Mj,"isClaudeEnvironment");a(Nj,"getClaudeAgent");a(Oj,"getTerminalAgent");a(Sk,"detect")});import Wa from"node:fs/promises";var Cd,Tk,Ck=h(()=>{"use strict";W();ee();Cd=class{static{a(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let r={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`${r[t]||r.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 Wa.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(r){console.warn(`MCP writeFile failed, falling back to fs: ${w(r)}`)}await Wa.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 Wa.readdir(e)}async fileExists(e){return A(e)}async createDirectory(e){await Wa.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
925
925
  ${e.map((t,r)=>`${r+1}. ${t}`).join(`
926
926
  `)}`}formatRecap(e){return`\u{1F4CA} Recap
@@ -966,10 +966,10 @@ Or type p. help to see all options`,stuck:`Let's break it down:
966
966
 
967
967
  Or: p. task | p. capture | p. status`}[e]||`What would you like to do?
968
968
 
969
- 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}}},Tk=Cd});function Rk(n){if(!n||typeof n!="object")return!1;let e=n;if(e.code&&Fj.has(e.code))return!0;if(e.code&&Pk.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 Hj(n){if(!n||typeof n!="object")return!1;let e=n;return!!(e.code&&Pk.has(e.code))}function xk(n,e,t){let r=mr.get(n);return r&&r.consecutiveFailures>=e&&r.openedAt?Date.now()-r.openedAt>=t?(mr.delete(n),!1):!0:!1}function Rd(n,e){let t=mr.get(n)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),mr.set(n,t)}function Uj(n){mr.delete(n)}var Fj,Pk,mr,Ba,Ak,l2,_k=h(()=>{"use strict";Fj=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Pk=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);a(Rk,"isTransientError");a(Hj,"isPermanentError");mr=new Map;a(xk,"isCircuitOpen");a(Rd,"recordFailure");a(Uj,"recordSuccess");Ba=class{static{a(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(xk(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let r,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return Uj(t),o}catch(o){if(r=o,s++,Hj(o))throw Rd(t,this.options.circuitBreakerThreshold),o;if(!(Rk(o)&&s<this.options.maxAttempts))throw Rd(t,this.options.circuitBreakerThreshold),o;let c=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,c))}throw Rd(t,this.options.circuitBreakerThreshold),r}isTransientError(e){return Rk(e)}isCircuitOpen(e){return xk(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return mr.get(e)}resetCircuit(e){mr.delete(e)}resetAllCircuits(){mr.clear()}},Ak=new Ba({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),l2=new Ba({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Gj,xd,qa,jk=h(()=>{"use strict";Rn();Ek();Ck();_k();Gj=["claude"],xd=class{static{a(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Ak.execute(async()=>{if(this.agentInfo=await Sk(),!this.agentInfo?.isSupported)throw Ao.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Gj.includes(e))throw Ao.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Tk,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},qa=new xd});var Pd,Ad,Ik=h(()=>{"use strict";Pd=class{static{a(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Ad=new Pd});var V,xe=h(()=>{"use strict";Td();jk();Ik();xn();Va();V=class{static{a(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new Lo,this.updateNotificationShown=!1}get agent(){return qa.getAgent()}get agentInfo(){return qa.getInfo()}get currentAuthor(){return gn.getCurrentAuthor()}async initializeAgent(){return qa.initialize()}async ensureProjectInit(e){return gn.ensureInit(e)}async ensureAuthor(){return gn.ensureAuthor()}async getGlobalProjectPath(e){return gn.getGlobalPath(e)}async logToMemory(e,t,r){let s=await this.ensureAuthor();await ze.log(e,t,r,s.name)}async _detectEmptyDirectory(e){return gn.isEmptyDirectory(e)}async _detectExistingCode(e){return gn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Ad.breakdownFeature(e)}_detectBugSeverity(e){return Ad.detectBugSeverity(e)}}});import qt from"node:fs/promises";import Qt from"node:path";var _d,Wj,Ke,Dk=h(()=>{"use strict";W();ue();ee();_d=class{static{a(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Qt.join(this.projectPath,"package.json"),t=await qt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(B(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Qt.join(this.projectPath,"Cargo.toml");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readRequirements(){try{let e=Qt.join(this.projectPath,"requirements.txt");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readGoMod(){try{let e=Qt.join(this.projectPath,"go.mod");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readGemfile(){try{let e=Qt.join(this.projectPath,"Gemfile");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readMixExs(){try{let e=Qt.join(this.projectPath,"mix.exs");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readPomXml(){try{let e=Qt.join(this.projectPath,"pom.xml");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readComposerJson(){try{let e=Qt.join(this.projectPath,"composer.json"),t=await qt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(B(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Qt.join(this.projectPath,"pyproject.toml");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await q('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(`
969
+ 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}}},Tk=Cd});function Rk(n){if(!n||typeof n!="object")return!1;let e=n;if(e.code&&Fj.has(e.code))return!0;if(e.code&&Pk.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 Hj(n){if(!n||typeof n!="object")return!1;let e=n;return!!(e.code&&Pk.has(e.code))}function xk(n,e,t){let r=fr.get(n);return r&&r.consecutiveFailures>=e&&r.openedAt?Date.now()-r.openedAt>=t?(fr.delete(n),!1):!0:!1}function Rd(n,e){let t=fr.get(n)||{consecutiveFailures:0,openedAt:null};t.consecutiveFailures++,t.consecutiveFailures>=e&&!t.openedAt&&(t.openedAt=Date.now()),fr.set(n,t)}function Uj(n){fr.delete(n)}var Fj,Pk,fr,Ba,Ak,l2,_k=h(()=>{"use strict";Fj=new Set(["EBUSY","EAGAIN","ETIMEDOUT","ECONNRESET","ECONNREFUSED","ENOTFOUND","EAI_AGAIN"]),Pk=new Set(["ENOENT","EACCES","EPERM","EISDIR","ENOTDIR","EINVAL"]);a(Rk,"isTransientError");a(Hj,"isPermanentError");fr=new Map;a(xk,"isCircuitOpen");a(Rd,"recordFailure");a(Uj,"recordSuccess");Ba=class{static{a(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(xk(t,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs))throw new Error(`Circuit breaker is open for operation: ${t}. Too many consecutive failures.`);let r,s=0;for(;s<this.options.maxAttempts;)try{let o=await e();return Uj(t),o}catch(o){if(r=o,s++,Hj(o))throw Rd(t,this.options.circuitBreakerThreshold),o;if(!(Rk(o)&&s<this.options.maxAttempts))throw Rd(t,this.options.circuitBreakerThreshold),o;let c=Math.min(this.options.baseDelayMs*2**(s-1),this.options.maxDelayMs);await new Promise(l=>setTimeout(l,c))}throw Rd(t,this.options.circuitBreakerThreshold),r}isTransientError(e){return Rk(e)}isCircuitOpen(e){return xk(e,this.options.circuitBreakerThreshold,this.options.circuitBreakerTimeoutMs)}getCircuitState(e){return fr.get(e)}resetCircuit(e){fr.delete(e)}resetAllCircuits(){fr.clear()}},Ak=new Ba({maxAttempts:3,baseDelayMs:1e3,maxDelayMs:8e3}),l2=new Ba({maxAttempts:2,baseDelayMs:500,maxDelayMs:2e3})});var Gj,xd,qa,jk=h(()=>{"use strict";Rn();Ek();Ck();_k();Gj=["claude"],xd=class{static{a(this,"AgentService")}agent=null;agentInfo=null;async initialize(){return this.agent?this.agent:await Ak.execute(async()=>{if(this.agentInfo=await Sk(),!this.agentInfo?.isSupported)throw Ao.notSupported(this.agentInfo?.type??"unknown");let e=this.agentInfo.type;if(!e||!Gj.includes(e))throw Ao.notSupported(this.agentInfo?.type??"unknown");return this.agent=new Tk,this.agent},"agent-initialization")}getInfo(){return this.agentInfo}getAgent(){return this.agent}isInitialized(){return this.agent!==null}reset(){this.agent=null,this.agentInfo=null}},qa=new xd});var Pd,Ad,Ik=h(()=>{"use strict";Pd=class{static{a(this,"BreakdownService")}breakdownFeature(e){return[]}detectBugSeverity(e){return"medium"}estimateComplexity(e){return{level:"medium",hours:4}}detectTaskType(e){return"feature"}},Ad=new Pd});var V,xe=h(()=>{"use strict";Td();jk();Ik();xn();Va();V=class{static{a(this,"PrjctCommandsBase")}prjctDir;updateChecker;updateNotificationShown;constructor(){this.prjctDir=".prjct",this.updateChecker=new Lo,this.updateNotificationShown=!1}get agent(){return qa.getAgent()}get agentInfo(){return qa.getInfo()}get currentAuthor(){return hn.getCurrentAuthor()}async initializeAgent(){return qa.initialize()}async ensureProjectInit(e){return hn.ensureInit(e)}async ensureAuthor(){return hn.ensureAuthor()}async getGlobalProjectPath(e){return hn.getGlobalPath(e)}async logToMemory(e,t,r){let s=await this.ensureAuthor();await ze.log(e,t,r,s.name)}async _detectEmptyDirectory(e){return hn.isEmptyDirectory(e)}async _detectExistingCode(e){return hn.hasExistingCode(e)}_breakdownFeatureTasks(e){return Ad.breakdownFeature(e)}_detectBugSeverity(e){return Ad.detectBugSeverity(e)}}});import qt from"node:fs/promises";import Qt from"node:path";var _d,Wj,Ke,Dk=h(()=>{"use strict";W();ue();ee();_d=class{static{a(this,"CodebaseAnalyzer")}projectPath=null;init(e=process.cwd()){this.projectPath=e}async readPackageJson(){try{let e=Qt.join(this.projectPath,"package.json"),t=await qt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(B(e)||e instanceof SyntaxError)return null;throw e}}async readCargoToml(){try{let e=Qt.join(this.projectPath,"Cargo.toml");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readRequirements(){try{let e=Qt.join(this.projectPath,"requirements.txt");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readGoMod(){try{let e=Qt.join(this.projectPath,"go.mod");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readGemfile(){try{let e=Qt.join(this.projectPath,"Gemfile");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readMixExs(){try{let e=Qt.join(this.projectPath,"mix.exs");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readPomXml(){try{let e=Qt.join(this.projectPath,"pom.xml");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async readComposerJson(){try{let e=Qt.join(this.projectPath,"composer.json"),t=await qt.readFile(e,"utf-8");return JSON.parse(t)}catch(e){if(B(e)||e instanceof SyntaxError)return null;throw e}}async readPyprojectToml(){try{let e=Qt.join(this.projectPath,"pyproject.toml");return await qt.readFile(e,"utf-8")}catch(e){if(B(e))return null;throw e}}async getFileExtensions(){try{let{stdout:e}=await q('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(`
970
970
  `).filter(Boolean).forEach(r=>{let s=r.trim().match(/^\s*(\d+)\s+(\.\w+)$/);s&&(t[s[2]]=parseInt(s[1],10))}),t}catch{return{}}}async listConfigFiles(){try{let e=await qt.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(r=>t.some(s=>s.test(r)))}catch(e){if(B(e))return[];throw e}}async listDirectories(){try{return(await qt.readdir(this.projectPath,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).filter(t=>!t.startsWith(".")&&t!=="node_modules")}catch(e){if(B(e))return[];throw e}}async getGitLog(e=50){try{let{stdout:t}=await q(`git log -n ${e} --pretty=format:"%h|%an|%ar|%s"`,{cwd:this.projectPath});return t}catch{return""}}async getGitStats(){try{let{stdout:e}=await q("git rev-list --count HEAD",{cwd:this.projectPath}),{stdout:t}=await q('git log --format="%an" | sort -u | wc -l',{cwd:this.projectPath}),{stdout:r}=await q('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:r.trim()||"unknown"}}catch{return{totalCommits:0,contributors:0,age:"unknown"}}}async countFiles(){try{let{stdout:e}=await q('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 A(Qt.join(this.projectPath,e))}async readFile(e){try{let t=Qt.join(this.projectPath,e);return await qt.readFile(t,"utf-8")}catch(t){if(B(t))return null;throw t}}async findFiles(e){try{let{stdout:t}=await q(`find . -type f -name "${e}" ! -path "*/node_modules/*" ! -path "*/.git/*"`,{cwd:this.projectPath});return t.trim().split(`
971
- `).filter(Boolean)}catch{return[]}}},Wj=new _d,Ke=Wj});function Rs(n){let e=[];for(let{name:t,re:r}of $k)r.test(n)&&e.push(t);return e}function Mk(n){return n.replace(/[`*_[\](){}<>\\]/g,e=>`\\${e}`)}var $k,D2,Fo=h(()=>{"use strict";$k=[{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}],D2=$k.map(n=>n.name);a(Rs,"scanForPromptInjection");a(Mk,"escapeMarkdownInline")});var Ok={};N(Ok,{MACHINE_TAG_KEYS:()=>Ho,deriveTitle:()=>Te,flatDetail:()=>Nn,formatMemoryMd:()=>On,linkifyMemRefs:()=>Zt,preventiveLabel:()=>fr});function Bj(n){return n.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function fr(n){return n.type==="gotcha"?"gotcha":n.tags?.pattern==="recurring-bug"?"recurring-bug":n.type}function Nn(n,e=220){let t=n.replace(/\s+/g," ").trim();return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function Te(n){let e=(n.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 r=e.slice(0,t).replace(/\s+/g," ").trim();if(r=r.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),r.length>Nk){let o=r.slice(0,Nk),i=o.lastIndexOf(" ");r=`${(i>40?o.slice(0,i):o).trim()}\u2026`}r.length<6&&(r=`${n.type} ${n.id}`);let s=n.tags?.pr;return s&&!new RegExp(`\\b#?${s}\\b`).test(r)&&(r=`${r} (PR #${s})`),r}function Zt(n,e){return n.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,r)=>{let s=`mem_${r}`,o=e?.idTypeIndex?.get(s),i=e?.idTitleIndex?.get(s),c=e?.idSlugIndex?.get(s),l=i?Bj(i):s;return e?.signalIds?.has(s)?`[[signals#^mem-${r}|${l}]]`:c&&o&&e?.perEntryTypes?.has(o)?`[[${c}|${l}]]`:o?`[[${o}#^mem-${r}|${l}]]`:i?`[[${s}|${l}]]`:`\`${s}\``})}function On(n,e){if(n.length===0)return"> No matching memory entries.";let t=new Map;for(let u of n){let d=t.get(u.type)??[];d.push(u),t.set(u.type,d)}let r=["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",c=a((u,d)=>{if(d.length!==0){s.push(`### ${u.toUpperCase()}`);for(let p of d){let m=Object.entries(p.tags).filter(([C])=>!e?.vault||!Ho.has(C)).map(([C,O])=>`${C}=${i?Mk(O):O}`).join(" "),f=o[p.provenance],y=e?.vault?Zt(p.content,e):p.content,R=m?` _(${e?.vault?Zt(m,e):m})_`:"",k=p.id.replace(/^mem[_-]/,""),S=e?.vault?` ^mem-${k}`:"",E=`- \`${f}\` [${p.id} \xB7 ${p.type}] ${y}${R}${S}`;i?(s.push(`<user_content id="${p.id}" type="${p.type}">`),s.push(E),s.push("</user_content>")):s.push(E)}s.push("")}},"renderGroup"),l=new Set;for(let u of r){let d=t.get(u);!d||d.length===0||(c(u,d),l.add(u))}for(let[u,d]of t)l.has(u)||c(u,d);return s.join(`
972
- `).trim()}var Ho,Nk,ht=h(()=>{"use strict";Fo();Ho=new Set(["source","session","window_days","window-days","touches","occurrences","phrase","slug","hash","content-hash","content_hash","key","kind","spec-id","spec_id"]),Nk=72;a(Bj,"linkLabel");a(fr,"preventiveLabel");a(Nn,"flatDetail");a(Te,"deriveTitle");a(Zt,"linkifyMemRefs");a(On,"formatMemoryMd")});function xs(n){return n.normalize("NFD").replace(/[̀-ͯ]/g,"")}var Ja=h(()=>{"use strict";a(xs,"deburr")});function Uo(n){return!(n.type==="improvement-signal"||n.tags?.pattern==="hot-file")}function Lk(n,e){try{return JSON.parse(n)}catch{return e}}function gr(n){let e=n.type.slice(Wt.length),t=Lk(n.data,{});return{id:`mem_${n.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:n.timestamp,source:t.source,provenance:t.provenance??"declared"}}function Xa(n){let e=n.data?Lk(n.data,{}):{},t=e.tags??{};return n.type&&(t.type=n.type),{id:`ship_${n.id}`,type:"shipped",content:n.name,tags:t,rememberedAt:n.shipped_at,source:e.taskId,provenance:"extracted"}}function Fk(n,e){let t=e.toLowerCase();if(n.content.toLowerCase().includes(t))return!0;for(let r of Object.values(n.tags))if(r.toLowerCase().includes(t))return!0;return!1}function Go(n,e){for(let[t,r]of Object.entries(e))if(n.tags[t]!==r)return!1;return!0}function Hk(n){let e=new Set,t=[];for(let r of n){let s=r.tags.key;if(!s){t.push(r);continue}let o=`${r.type}::${s}`;e.has(o)||(e.add(o),t.push(r))}return t}function za(n){let e=new Set;for(let t of n){t.tags["superseded-by"]&&e.add(t.id);for(let r of["supersedes","duplicates"]){let s=t.tags[r];if(s)for(let o of String(s).matchAll(Vj))e.add(`mem_${o[1]}`)}}return e}var qj,Ps,Vj,As=h(()=>{"use strict";lr();qj=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","context","inbox","todo","idea","insight","question","source","person","spec"],Ps=qj;a(Uo,"isModelMemory");a(Lk,"safeJson");a(gr,"rowToEntry");a(Xa,"shippedRowToEntry");a(Fk,"matchesTopic");a(Go,"matchesTags");a(Hk,"dedupeLatestByKey");Vj=/\bmem[_-](\d+)\b/g;a(za,"collectSupersededIds")});var Dd={};N(Dd,{extractCorrectionIds:()=>Id,extractRefIds:()=>Gk,usefulnessService:()=>ut});function Gk(n,e){let t=new Set;for(let r of tI){let s=e[r];if(s)for(let o of String(s).matchAll(jd))t.add(`mem_${o[1]}`)}for(let r of n.matchAll(jd))t.add(`mem_${r[1]}`);for(let r of Id(e))t.delete(r);return[...t]}function Id(n){let e=new Set;for(let t of nI){let r=n[t];if(r)for(let s of String(r).matchAll(jd))e.add(`mem_${s[1]}`)}return[...e]}function Uk(n,e,t,r,s){b.run(n,`INSERT INTO memory_usefulness (memory_id, score, ${r}, last_used_at)
971
+ `).filter(Boolean)}catch{return[]}}},Wj=new _d,Ke=Wj});function Rs(n){let e=[];for(let{name:t,re:r}of $k)r.test(n)&&e.push(t);return e}function Mk(n){return n.replace(/[`*_[\](){}<>\\]/g,e=>`\\${e}`)}var $k,D2,Fo=h(()=>{"use strict";$k=[{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}],D2=$k.map(n=>n.name);a(Rs,"scanForPromptInjection");a(Mk,"escapeMarkdownInline")});var Ok={};N(Ok,{MACHINE_TAG_KEYS:()=>Ho,deriveTitle:()=>Te,flatDetail:()=>Nn,formatMemoryMd:()=>On,linkifyMemRefs:()=>Zt,preventiveLabel:()=>gr});function Bj(n){return n.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function gr(n){return n.type==="gotcha"?"gotcha":n.tags?.pattern==="recurring-bug"?"recurring-bug":n.type}function Nn(n,e=220){let t=n.replace(/\s+/g," ").trim();return t.length>e?`${t.slice(0,e-1)}\u2026`:t}function Te(n){let e=(n.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 r=e.slice(0,t).replace(/\s+/g," ").trim();if(r=r.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),r.length>Nk){let o=r.slice(0,Nk),i=o.lastIndexOf(" ");r=`${(i>40?o.slice(0,i):o).trim()}\u2026`}r.length<6&&(r=`${n.type} ${n.id}`);let s=n.tags?.pr;return s&&!new RegExp(`\\b#?${s}\\b`).test(r)&&(r=`${r} (PR #${s})`),r}function Zt(n,e){return n.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,r)=>{let s=`mem_${r}`,o=e?.idTypeIndex?.get(s),i=e?.idTitleIndex?.get(s),c=e?.idSlugIndex?.get(s),l=i?Bj(i):s;return e?.signalIds?.has(s)?`[[signals#^mem-${r}|${l}]]`:c&&o&&e?.perEntryTypes?.has(o)?`[[${c}|${l}]]`:o?`[[${o}#^mem-${r}|${l}]]`:i?`[[${s}|${l}]]`:`\`${s}\``})}function On(n,e){if(n.length===0)return"> No matching memory entries.";let t=new Map;for(let u of n){let d=t.get(u.type)??[];d.push(u),t.set(u.type,d)}let r=["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",c=a((u,d)=>{if(d.length!==0){s.push(`### ${u.toUpperCase()}`);for(let p of d){let m=Object.entries(p.tags).filter(([C])=>!e?.vault||!Ho.has(C)).map(([C,O])=>`${C}=${i?Mk(O):O}`).join(" "),f=o[p.provenance],y=e?.vault?Zt(p.content,e):p.content,R=m?` _(${e?.vault?Zt(m,e):m})_`:"",k=p.id.replace(/^mem[_-]/,""),S=e?.vault?` ^mem-${k}`:"",E=`- \`${f}\` [${p.id} \xB7 ${p.type}] ${y}${R}${S}`;i?(s.push(`<user_content id="${p.id}" type="${p.type}">`),s.push(E),s.push("</user_content>")):s.push(E)}s.push("")}},"renderGroup"),l=new Set;for(let u of r){let d=t.get(u);!d||d.length===0||(c(u,d),l.add(u))}for(let[u,d]of t)l.has(u)||c(u,d);return s.join(`
972
+ `).trim()}var Ho,Nk,ht=h(()=>{"use strict";Fo();Ho=new Set(["source","session","window_days","window-days","touches","occurrences","phrase","slug","hash","content-hash","content_hash","key","kind","spec-id","spec_id"]),Nk=72;a(Bj,"linkLabel");a(gr,"preventiveLabel");a(Nn,"flatDetail");a(Te,"deriveTitle");a(Zt,"linkifyMemRefs");a(On,"formatMemoryMd")});function xs(n){return n.normalize("NFD").replace(/[̀-ͯ]/g,"")}var Ja=h(()=>{"use strict";a(xs,"deburr")});function Uo(n){return!(n.type==="improvement-signal"||n.tags?.pattern==="hot-file")}function Lk(n,e){try{return JSON.parse(n)}catch{return e}}function hr(n){let e=n.type.slice(Wt.length),t=Lk(n.data,{});return{id:`mem_${n.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:n.timestamp,source:t.source,provenance:t.provenance??"declared"}}function Xa(n){let e=n.data?Lk(n.data,{}):{},t=e.tags??{};return n.type&&(t.type=n.type),{id:`ship_${n.id}`,type:"shipped",content:n.name,tags:t,rememberedAt:n.shipped_at,source:e.taskId,provenance:"extracted"}}function Fk(n,e){let t=e.toLowerCase();if(n.content.toLowerCase().includes(t))return!0;for(let r of Object.values(n.tags))if(r.toLowerCase().includes(t))return!0;return!1}function Go(n,e){for(let[t,r]of Object.entries(e))if(n.tags[t]!==r)return!1;return!0}function Hk(n){let e=new Set,t=[];for(let r of n){let s=r.tags.key;if(!s){t.push(r);continue}let o=`${r.type}::${s}`;e.has(o)||(e.add(o),t.push(r))}return t}function za(n){let e=new Set;for(let t of n){t.tags["superseded-by"]&&e.add(t.id);for(let r of["supersedes","duplicates"]){let s=t.tags[r];if(s)for(let o of String(s).matchAll(Vj))e.add(`mem_${o[1]}`)}}return e}var qj,Ps,Vj,As=h(()=>{"use strict";ur();qj=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","context","inbox","todo","idea","insight","question","source","person","spec"],Ps=qj;a(Uo,"isModelMemory");a(Lk,"safeJson");a(hr,"rowToEntry");a(Xa,"shippedRowToEntry");a(Fk,"matchesTopic");a(Go,"matchesTags");a(Hk,"dedupeLatestByKey");Vj=/\bmem[_-](\d+)\b/g;a(za,"collectSupersededIds")});var Dd={};N(Dd,{extractCorrectionIds:()=>Id,extractRefIds:()=>Gk,usefulnessService:()=>ut});function Gk(n,e){let t=new Set;for(let r of tI){let s=e[r];if(s)for(let o of String(s).matchAll(jd))t.add(`mem_${o[1]}`)}for(let r of n.matchAll(jd))t.add(`mem_${r[1]}`);for(let r of Id(e))t.delete(r);return[...t]}function Id(n){let e=new Set;for(let t of nI){let r=n[t];if(r)for(let s of String(r).matchAll(jd))e.add(`mem_${s[1]}`)}return[...e]}function Uk(n,e,t,r,s){b.run(n,`INSERT INTO memory_usefulness (memory_id, score, ${r}, last_used_at)
973
973
  VALUES (?, ?, 1, ?)
974
974
  ON CONFLICT(memory_id) DO UPDATE SET
975
975
  score = score + ?, ${r} = ${r} + 1, last_used_at = excluded.last_used_at`,e,t,s,t)}function Ka(n,e,t,r){b.run(n,`INSERT INTO memory_usefulness (memory_id, score, last_used_at)
@@ -978,7 +978,7 @@ Type p. help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
978
978
  score = score + ?, last_used_at = excluded.last_used_at`,e,t,r,t)}var Jj,Xj,zj,Kj,Yj,Qj,Zj,eI,tI,nI,jd,ut,Ln=h(()=>{"use strict";J();Jj=45,Xj=1,zj=.4,Kj=2.5,Yj=-2.5,Qj=-.5,Zj=-1.3,eI=864e5,tI=["resolves","relates","supersedes","superseded-by","duplicates","spec"],nI=["corrects","contradicts"],jd=/\bmem[_-](\d+)\b/g;a(Gk,"extractRefIds");a(Id,"extractCorrectionIds");a(Uk,"bump");a(Ka,"addScore");ut={recordReferences(n,e,t,r=new Date().toISOString()){try{for(let s of Gk(e,t))Uk(n,s,Xj,"ref_count",r)}catch{}},recordCorrection(n,e,t=new Date().toISOString()){try{for(let r of Id(e))Ka(n,r,Yj,t)}catch{}},recordFetch(n,e,t=new Date().toISOString()){try{Uk(n,e,zj,"fetch_count",t)}catch{}},recordSurfaced(n,e,t,r=new Date().toISOString()){if(!(!t||e.length===0))try{for(let s of e)b.run(n,`INSERT OR IGNORE INTO memory_surface_log (memory_id, task_id, created_at)
979
979
  VALUES (?, ?, ?)`,s,t,r)}catch{}},penalizeSurfaced(n,e,t=new Date().toISOString()){if(!e)return 0;try{let r=b.query(n,"SELECT memory_id FROM memory_surface_log WHERE task_id = ?",e);for(let s of r)Ka(n,s.memory_id,Qj,t);return r.length}catch{return 0}},penalizeSkillMiss(n,e,t=new Date().toISOString()){try{Ka(n,e,Zj,t)}catch{}},creditShippedTask(n,e,t=new Date().toISOString()){if(!e)return 0;try{let r=b.query(n,"SELECT memory_id FROM memory_surface_log WHERE task_id = ?",e);for(let s of r)Ka(n,s.memory_id,Kj,t);return b.run(n,"DELETE FROM memory_surface_log WHERE task_id = ?",e),r.length}catch{return 0}},decayedScores(n,e=Date.now()){let t=new Map,r;try{r=b.query(n,"SELECT memory_id, score, last_used_at FROM memory_usefulness")}catch{return t}for(let s of r){let o=Date.parse(s.last_used_at),i=Number.isNaN(o)?1:.5**(Math.max(0,e-o)/eI/Jj);t.set(s.memory_id,s.score*i)}return t},rerank(n,e,t=Date.now()){if(e.length<2)return e;let r;try{r=this.decayedScores(n,t)}catch{return e}if(r.size===0)return e;let s=Math.max(1,...r.values()),o=4,i=e.length,c=e.map((l,u)=>{let d=(r.get(l.id)??0)/s;return{entry:l,i:u,rankScore:i-u+o*d}});return c.sort((l,u)=>u.rankScore-l.rankScore||l.i-u.i),c.map(l=>l.entry)}}});var Ya={};N(Ya,{projectMemory:()=>M});function iI(n){try{let e=b.query(n,`SELECT id, tags FROM memories
980
980
  WHERE deleted_at IS NULL
981
- AND (tags LIKE '%supersede%' OR tags LIKE '%duplicates%')`),t=[];for(let r of e)if(r.tags)try{let s=JSON.parse(r.tags);s&&typeof s=="object"&&t.push({id:r.id,tags:s})}catch{}return za(t)}catch{return new Set}}var rI,sI,oI,M,ke=h(()=>{"use strict";xn();J();Ja();sa();As();lr();rI=25,sI=4,oI=100;a(iI,"collectMirrorSupersededIds");M={async remember(n,e){let t=e.tags??{},r=e.provenance??"declared",s=_r(e.content),o=e.projectId;if(!o)try{let{default:c}=await Promise.resolve().then(()=>(K(),ir));o=(await c.readConfig(n))?.projectId}catch{}if(o)try{if(b.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 ze.log(n,`${ws}${e.type}`,{content:e.content,tags:t,source:e.source,provenance:r});if(i?.eventId!=null)try{let c=`mem_${i.eventId}`,l=new Date().toISOString(),d=(e.content.split(`
981
+ AND (tags LIKE '%supersede%' OR tags LIKE '%duplicates%')`),t=[];for(let r of e)if(r.tags)try{let s=JSON.parse(r.tags);s&&typeof s=="object"&&t.push({id:r.id,tags:s})}catch{}return za(t)}catch{return new Set}}var rI,sI,oI,M,ke=h(()=>{"use strict";xn();J();Ja();sa();As();ur();rI=25,sI=4,oI=100;a(iI,"collectMirrorSupersededIds");M={async remember(n,e){let t=e.tags??{},r=e.provenance??"declared",s=_r(e.content),o=e.projectId;if(!o)try{let{default:c}=await Promise.resolve().then(()=>(K(),ar));o=(await c.readConfig(n))?.projectId}catch{}if(o)try{if(b.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 ze.log(n,`${ws}${e.type}`,{content:e.content,tags:t,source:e.source,provenance:r});if(i?.eventId!=null)try{let c=`mem_${i.eventId}`,l=new Date().toISOString(),d=(e.content.split(`
982
982
  `)[0]??e.content).slice(0,80);b.run(i.projectId,`INSERT OR IGNORE INTO memories
983
983
  (id, project_id, title, content, tags, type, provenance, content_hash,
984
984
  user_triggered, created_at, updated_at)
@@ -988,28 +988,28 @@ Type p. help to see all options`}detectIntent(e){let t=e.toLowerCase();return/^(
988
988
  WHERE memories_fts MATCH ?
989
989
  AND m.deleted_at IS NULL
990
990
  ORDER BY bm25(memories_fts) ASC, m.created_at DESC
991
- LIMIT ?`,s,t*2)}catch{return[]}let i=o.map(l=>{let u={};if(l.tags)try{let d=JSON.parse(l.tags);d&&typeof d=="object"&&(u=d)}catch{}return{id:l.id,type:l.type??"fact",content:l.content,tags:u,rememberedAt:l.created_at,provenance:l.provenance??"declared"}}),c=iI(n);return c.size>0&&(i=i.filter(l=>!c.has(l.id))),i.slice(0,t)},recall(n,e={}){let t=e.limit??rI,r=Math.max(t*sI,oI),s=e.types&&e.types.length>0?new Set(e.types):null,o=s?s.has("shipped"):!0,c=(s?[...s].some(d=>d!=="shipped"):!0)?b.query(n,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...ar,r):[],l=o?b.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",r):[],u=[...c.map(gr),...l.map(Xa)];if(s&&(u=u.filter(d=>s.has(d.type))),e.tags&&(u=u.filter(d=>Go(d,e.tags??{}))),e.topic&&(u=u.filter(d=>Fk(d,e.topic))),u.sort((d,p)=>p.rememberedAt.localeCompare(d.rememberedAt)),e.dedupeByKey!==!1&&(u=Hk(u)),e.pruneSuperseded!==!1){let d=za(u);d.size>0&&(u=u.filter(p=>!d.has(p.id)))}return u.slice(0,t)},recallForFile(n,e,t=3){if(!e)return[];let r=e.split("/").pop()??e,s=a(c=>c.type==="gotcha"||c.type==="anti-pattern"||c.tags?.pattern==="recurring-bug","isPreventive"),o;try{o=b.query(n,`SELECT id, type, data, timestamp FROM events
991
+ LIMIT ?`,s,t*2)}catch{return[]}let i=o.map(l=>{let u={};if(l.tags)try{let d=JSON.parse(l.tags);d&&typeof d=="object"&&(u=d)}catch{}return{id:l.id,type:l.type??"fact",content:l.content,tags:u,rememberedAt:l.created_at,provenance:l.provenance??"declared"}}),c=iI(n);return c.size>0&&(i=i.filter(l=>!c.has(l.id))),i.slice(0,t)},recall(n,e={}){let t=e.limit??rI,r=Math.max(t*sI,oI),s=e.types&&e.types.length>0?new Set(e.types):null,o=s?s.has("shipped"):!0,c=(s?[...s].some(d=>d!=="shipped"):!0)?b.query(n,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...cr,r):[],l=o?b.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC LIMIT ?",r):[],u=[...c.map(hr),...l.map(Xa)];if(s&&(u=u.filter(d=>s.has(d.type))),e.tags&&(u=u.filter(d=>Go(d,e.tags??{}))),e.topic&&(u=u.filter(d=>Fk(d,e.topic))),u.sort((d,p)=>p.rememberedAt.localeCompare(d.rememberedAt)),e.dedupeByKey!==!1&&(u=Hk(u)),e.pruneSuperseded!==!1){let d=za(u);d.size>0&&(u=u.filter(p=>!d.has(p.id)))}return u.slice(0,t)},recallForFile(n,e,t=3){if(!e)return[];let r=e.split("/").pop()??e,s=a(c=>c.type==="gotcha"||c.type==="anti-pattern"||c.tags?.pattern==="recurring-bug","isPreventive"),o;try{o=b.query(n,`SELECT id, type, data, timestamp FROM events
992
992
  WHERE file_tag IS NOT NULL
993
993
  AND (file_tag = ? OR ? LIKE '%/' || file_tag OR file_tag = ? OR file_tag LIKE '%/' || ?)
994
- ORDER BY id DESC`,e,e,r,r).map(gr).filter(s)}catch{return[]}try{let c=b.query(n,`SELECT id, type, data, timestamp FROM events
995
- WHERE type = ? ORDER BY id DESC LIMIT 200`,`${Wt}context`);for(let l of c.map(gr))(l.tags?.files??"").split(",").map(d=>d.trim()).some(d=>d===e||d===r||d.endsWith(`/${r}`))&&o.push(l)}catch{}let i=za(o);return i.size>0&&(o=o.filter(c=>!i.has(c.id))),o.slice(0,t)},getById(n,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return null;let r=Number(t[1]);try{let s=b.get(n,"SELECT id, type, data, timestamp FROM events WHERE id = ? AND type LIKE ?",r,`${Wt}%`);return s?gr(s):null}catch{return null}},countByType(n,e){try{return b.get(n,"SELECT COUNT(*) AS n FROM events WHERE type = ?",`${Wt}${e}`)?.n??0}catch{return 0}},recallByType(n,e,t){if(t<=0)return[];try{return b.query(n,"SELECT id, type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`${Wt}${e}`,t).map(gr)}catch{return[]}},forget(n,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return!1;let r=Number(t[1]),s=`mem_${r}`,o=!1;try{b.get(n,"SELECT id FROM events WHERE id = ? AND type LIKE ?",r,`${Wt}%`)&&(b.run(n,"DELETE FROM events WHERE id = ?",r),o=!0)}catch{}try{b.get(n,"SELECT id FROM memories WHERE id = ? AND deleted_at IS NULL",s)&&(b.run(n,"UPDATE memories SET deleted_at = ? WHERE id = ?",new Date().toISOString(),s),o=!0)}catch{}try{b.run(n,"DELETE FROM memory_embeddings WHERE memory_id = ?",s)}catch{}return o},expandWithLinks(n,e,t=5){if(e.length===0||t<=0)return[];let r=/\bmem[_-](\d+)\b/g,s=["resolves","relates","supersedes","superseded-by","duplicates","spec"],o=new Set(e.map(c=>c.id)),i=[];for(let c of e){if(i.length>=t)break;let l=new Set;for(let u of s){let d=c.tags?.[u];if(d)for(let p of String(d).matchAll(r))l.add(`mem_${p[1]}`)}for(let u of c.content.matchAll(r))l.add(`mem_${u[1]}`);for(let u of l){if(i.length>=t)break;if(o.has(u))continue;o.add(u);let d=M.getById(n,u);d&&i.push(d)}}return i},unembeddedEntriesForIndex(n,e){try{let t=b.query(n,`SELECT e.id, e.type, e.data, e.timestamp FROM events e
994
+ ORDER BY id DESC`,e,e,r,r).map(hr).filter(s)}catch{return[]}try{let c=b.query(n,`SELECT id, type, data, timestamp FROM events
995
+ WHERE type = ? ORDER BY id DESC LIMIT 200`,`${Wt}context`);for(let l of c.map(hr))(l.tags?.files??"").split(",").map(d=>d.trim()).some(d=>d===e||d===r||d.endsWith(`/${r}`))&&o.push(l)}catch{}let i=za(o);return i.size>0&&(o=o.filter(c=>!i.has(c.id))),o.slice(0,t)},getById(n,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return null;let r=Number(t[1]);try{let s=b.get(n,"SELECT id, type, data, timestamp FROM events WHERE id = ? AND type LIKE ?",r,`${Wt}%`);return s?hr(s):null}catch{return null}},countByType(n,e){try{return b.get(n,"SELECT COUNT(*) AS n FROM events WHERE type = ?",`${Wt}${e}`)?.n??0}catch{return 0}},recallByType(n,e,t){if(t<=0)return[];try{return b.query(n,"SELECT id, type, data, timestamp FROM events WHERE type = ? ORDER BY id DESC LIMIT ?",`${Wt}${e}`,t).map(hr)}catch{return[]}},forget(n,e){let t=String(e).trim().match(/^(?:mem[_-])?(\d+)$/i);if(!t)return!1;let r=Number(t[1]),s=`mem_${r}`,o=!1;try{b.get(n,"SELECT id FROM events WHERE id = ? AND type LIKE ?",r,`${Wt}%`)&&(b.run(n,"DELETE FROM events WHERE id = ?",r),o=!0)}catch{}try{b.get(n,"SELECT id FROM memories WHERE id = ? AND deleted_at IS NULL",s)&&(b.run(n,"UPDATE memories SET deleted_at = ? WHERE id = ?",new Date().toISOString(),s),o=!0)}catch{}try{b.run(n,"DELETE FROM memory_embeddings WHERE memory_id = ?",s)}catch{}return o},expandWithLinks(n,e,t=5){if(e.length===0||t<=0)return[];let r=/\bmem[_-](\d+)\b/g,s=["resolves","relates","supersedes","superseded-by","duplicates","spec"],o=new Set(e.map(c=>c.id)),i=[];for(let c of e){if(i.length>=t)break;let l=new Set;for(let u of s){let d=c.tags?.[u];if(d)for(let p of String(d).matchAll(r))l.add(`mem_${p[1]}`)}for(let u of c.content.matchAll(r))l.add(`mem_${u[1]}`);for(let u of l){if(i.length>=t)break;if(o.has(u))continue;o.add(u);let d=M.getById(n,u);d&&i.push(d)}}return i},unembeddedEntriesForIndex(n,e){try{let t=b.query(n,`SELECT e.id, e.type, e.data, e.timestamp FROM events e
996
996
  WHERE e.type >= ? AND e.type < ?
997
997
  AND e.type != ?
998
998
  AND NOT EXISTS (
999
999
  SELECT 1 FROM memory_embeddings me
1000
1000
  WHERE me.memory_id = 'mem_' || e.id AND me.model = ?
1001
1001
  )
1002
- ORDER BY e.id DESC`,...ar,`${Wt}improvement-signal`,e),r=b.query(n,`SELECT s.id, s.name, s.type, s.shipped_at, s.data FROM shipped_features s
1002
+ ORDER BY e.id DESC`,...cr,`${Wt}improvement-signal`,e),r=b.query(n,`SELECT s.id, s.name, s.type, s.shipped_at, s.data FROM shipped_features s
1003
1003
  WHERE NOT EXISTS (
1004
1004
  SELECT 1 FROM memory_embeddings me
1005
1005
  WHERE me.memory_id = 'ship_' || s.id AND me.model = ?
1006
1006
  )
1007
- ORDER BY s.shipped_at DESC`,e);return[...t.map(gr),...r.map(Xa)]}catch{return[]}},allEntriesForIndex(n){try{let e=b.query(n,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC",...ar),t=b.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e.map(gr),...t.map(Xa)]}catch{return[]}}}});function Wk(n,e){let t=[];Wo("Languages",n.languages,e.languages,t),Wo("Frameworks",n.frameworks,e.frameworks,t),(n.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:n.packageManager??"(none)",after:e.packageManager??"(none)"}),(n.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:n.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(n.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:n.testDir??"(none)",after:e.testDir??"(none)"}),Wo("Config files",n.configFiles,e.configFiles,t),n.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(n.fileCount),after:String(e.fileCount)});let r=n.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);Wo("Patterns",r,s,t);let o=n.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Wo("Anti-patterns",o,i,t);let c=t.filter(d=>d.type==="added").length,l=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:c,removed:l,changed:u},beforeCommit:n.commitHash??null,afterCommit:e.commitHash??null}}function Qa(n){if(!n.hasChanges)return`## Analysis Diff
1007
+ ORDER BY s.shipped_at DESC`,e);return[...t.map(hr),...r.map(Xa)]}catch{return[]}},allEntriesForIndex(n){try{let e=b.query(n,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC",...cr),t=b.query(n,"SELECT id, name, type, shipped_at, data FROM shipped_features ORDER BY shipped_at DESC");return[...e.map(hr),...t.map(Xa)]}catch{return[]}}}});function Wk(n,e){let t=[];Wo("Languages",n.languages,e.languages,t),Wo("Frameworks",n.frameworks,e.frameworks,t),(n.packageManager??"")!==(e.packageManager??"")&&t.push({field:"Package manager",type:"changed",before:n.packageManager??"(none)",after:e.packageManager??"(none)"}),(n.sourceDir??"")!==(e.sourceDir??"")&&t.push({field:"Source directory",type:"changed",before:n.sourceDir??"(none)",after:e.sourceDir??"(none)"}),(n.testDir??"")!==(e.testDir??"")&&t.push({field:"Test directory",type:"changed",before:n.testDir??"(none)",after:e.testDir??"(none)"}),Wo("Config files",n.configFiles,e.configFiles,t),n.fileCount!==e.fileCount&&t.push({field:"File count",type:"changed",before:String(n.fileCount),after:String(e.fileCount)});let r=n.patterns.map(d=>d.name),s=e.patterns.map(d=>d.name);Wo("Patterns",r,s,t);let o=n.antiPatterns.map(d=>d.issue),i=e.antiPatterns.map(d=>d.issue);Wo("Anti-patterns",o,i,t);let c=t.filter(d=>d.type==="added").length,l=t.filter(d=>d.type==="removed").length,u=t.filter(d=>d.type==="changed").length;return{hasChanges:t.length>0,items:t,summary:{added:c,removed:l,changed:u},beforeCommit:n.commitHash??null,afterCommit:e.commitHash??null}}function Qa(n){if(!n.hasChanges)return`## Analysis Diff
1008
1008
 
1009
1009
  No changes between runs.`;let e=[];e.push("## Analysis Diff"),(n.beforeCommit||n.afterCommit)&&e.push(`> \`${n.beforeCommit?.substring(0,7)??"(none)"}\` \u2192 \`${n.afterCommit?.substring(0,7)??"(none)"}\``),e.push(""),e.push("| Change | Field | Detail |"),e.push("|--------|-------|--------|");for(let r of n.items){let s=r.type==="added"?"+":r.type==="removed"?"-":"~",o=r.type==="changed"?`${r.before} \u2192 ${r.after}`:r.after??r.before??"";e.push(`| ${s} | ${r.field} | ${o} |`)}e.push("");let t=[];return n.summary.added>0&&t.push(`${n.summary.added} added`),n.summary.removed>0&&t.push(`${n.summary.removed} removed`),n.summary.changed>0&&t.push(`${n.summary.changed} changed`),e.push(`**Summary**: ${t.join(", ")}`),e.join(`
1010
1010
  `)}function Bk(n){if(!n.hasChanges)return"No changes between analysis runs.";let e=[];(n.beforeCommit||n.afterCommit)&&(e.push(` ${n.beforeCommit?.substring(0,7)??"(none)"} \u2192 ${n.afterCommit?.substring(0,7)??"(none)"}`),e.push(""));for(let t of n.items)t.type==="added"?e.push(` + ${t.field}: ${t.after}`):t.type==="removed"?e.push(` - ${t.field}: ${t.before}`):e.push(` ~ ${t.field}: ${t.before} \u2192 ${t.after}`);return e.join(`
1011
- `)}function Wo(n,e,t,r){let s=new Set(e),o=new Set(t);for(let i of t)s.has(i)||r.push({field:n,type:"added",after:i});for(let i of e)o.has(i)||r.push({field:n,type:"removed",before:i})}var Za=h(()=>{"use strict";a(Wk,"generateAnalysisDiff");a(Qa,"formatAnalysisDiffMd");a(Bk,"formatAnalysisDiffText");a(Wo,"diffStringArray")});var $d=h(()=>{"use strict"});import Jk from"node:fs/promises";import Xk from"node:path";function _s(n){return n.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function Kk(n,e){let t=[],r=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of r)t.push(..._s(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(n))!==null;)f[1]&&t.push(..._s(f[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let f;for(;(f=m.exec(n))!==null;)f[1]&&t.push(..._s(f[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,c;for(;(c=i.exec(n))!==null;){let m=c[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(..._s(m));else{let f=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(..._s(f))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(n))!==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(n))!==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&&!zk.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function aI(n){return n.split(/\s+/).flatMap(e=>_s(e)).filter(e=>e.length>1&&!zk.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function cI(n){let e=await Xn(n),t={},r={},s=0,o=await zn(e,50,async c=>{try{let l=await Jk.readFile(Xk.join(n,c),"utf-8"),u=Kk(l,c);return u.length>0?{filePath:c,tokens:u}:null}catch{return null}});for(let{filePath:c,tokens:l}of o){t[c]={tokens:l,length:l.length},s+=l.length;for(let[u,d]of Md(l))r[u]||(r[u]=[]),r[u].push({path:c,tf:d})}let i=Object.keys(t).length;return{documents:t,invertedIndex:r,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function lI(n,e){return Math.log((e-n+.5)/(n+.5)+1)}function uI(n,e){let t=aI(n);if(t.length===0)return[];let r=new Map;for(let s of t){let o=e.invertedIndex[s];if(!o)continue;let i=lI(o.length,e.totalDocs);for(let{path:c,tf:l}of o){let u=e.documents[c];if(!u)continue;let d=l*(1.2+1),p=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);r.set(c,(r.get(c)||0)+m)}}return Array.from(r.entries()).map(([s,o])=>({path:s,score:o})).sort((s,o)=>o.score-s.score)}function Md(n){let e=new Map;for(let t of n)e.set(t,(e.get(t)||0)+1);return e}function dI(n,e){let t=n.documents[e];if(!t)return;delete n.documents[e];let r=new Set(t.tokens),s=r.size>0?r:new Set(Object.keys(n.invertedIndex));for(let o of s){let i=n.invertedIndex[o];if(!i)continue;let c=i.filter(l=>l.path!==e);c.length===0?delete n.invertedIndex[o]:n.invertedIndex[o]=c}}function pI(n,e,t){if(t.length!==0){n.documents[e]={tokens:t,length:t.length};for(let[r,s]of Md(t))n.invertedIndex[r]||(n.invertedIndex[r]=[]),n.invertedIndex[r].push({path:e,tf:s})}}function mI(n){let e=Object.values(n.documents).map(r=>r.length),t=e.reduce((r,s)=>r+s,0);n.totalDocs=e.length,n.avgDocLength=e.length>0?t/e.length:0,n.builtAt=new Date().toISOString()}function Yk(n){return{schemaVersion:2,avgDocLength:n.avgDocLength,totalDocs:n.totalDocs,builtAt:n.builtAt,docLengths:Object.fromEntries(Object.entries(n.documents).map(([e,t])=>[e,t.length]))}}function Qk(n,e,t,r,s){if(r.length!==0){n.run(t,JSON.stringify(r),r.length,s);for(let[o,i]of Md(r))e.run(o,t,i)}}function fI(n,e){try{b.transaction(n,t=>{t.prepare("DELETE FROM bm25_terms").run(),t.prepare("DELETE FROM bm25_documents").run();let r=new Date().toISOString(),s=t.prepare("INSERT INTO bm25_documents (path, tokens, length, updated_at) VALUES (?, ?, ?, ?)"),o=t.prepare("INSERT INTO bm25_terms (token, path, tf) VALUES (?, ?, ?)");for(let[i,c]of Object.entries(e.documents))Qk(s,o,i,c.tokens,r)})}catch{}}function gI(n,e,t,r){try{b.transaction(n,s=>{let o=s.prepare("DELETE FROM bm25_terms WHERE path = ?"),i=s.prepare("DELETE FROM bm25_documents WHERE path = ?"),c=s.prepare("INSERT INTO bm25_documents (path, tokens, length, updated_at) VALUES (?, ?, ?, ?)"),l=s.prepare("INSERT INTO bm25_terms (token, path, tf) VALUES (?, ?, ?)"),u=new Date().toISOString();for(let d of new Set([...t,...r]))o.run(d),i.run(d);for(let d of t){let p=e.documents[d];p&&Qk(c,l,d,p.tokens,u)}})}catch{}}function hI(n,e){b.setDoc(n,ec,Yk(e)),fI(n,e),qr.delete(n)}function yI(n,e,t,r){b.setDoc(n,ec,Yk(e)),gI(n,e,t,r),qr.delete(n)}function wI(n,e,t){try{let r=b.query(n,"SELECT path, tokens, length FROM bm25_documents ORDER BY path");if(r.length===0){if(t?.totalDocs===0){let d={documents:{},invertedIndex:{},avgDocLength:0,totalDocs:0,builtAt:t.builtAt};return qr.set(n,{index:d,updatedAt:e}),d}return null}let s={},o={},i=0;for(let d of r){let p=JSON.parse(d.tokens);s[d.path]={tokens:p,length:d.length},i+=d.length}let c=b.query(n,"SELECT token, path, tf FROM bm25_terms ORDER BY token, path");for(let d of c)o[d.token]||(o[d.token]=[]),o[d.token].push({path:d.path,tf:d.tf});let l=r.length,u={documents:s,invertedIndex:o,avgDocLength:l>0?i/l:0,totalDocs:l,builtAt:t?.builtAt??e};return qr.set(n,{index:u,updatedAt:e}),u}catch{return null}}function Bo(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",ec);if(!e)return qr.delete(n),null;let t=qr.get(n);if(t&&t.updatedAt===e.updated_at)return t.index;let r=b.getDoc(n,ec),s=wI(n,e.updated_at,r);if(s)return s;if(!r?.invertedIndex)return null;let o={};for(let[c,l]of Object.entries(r.docLengths))o[c]={tokens:[],length:l};let i={documents:o,invertedIndex:r.invertedIndex,avgDocLength:r.avgDocLength,totalDocs:r.totalDocs,builtAt:r.builtAt};return qr.set(n,{index:i,updatedAt:e.updated_at}),i}async function Nd(n,e){let t=await cI(n);return hI(e,t),t}async function Zk(n,e,t,r=[]){let s=Bo(e);if(!s)return Nd(n,e);let o=new Set([...t,...r]);for(let c of o)dI(s,c);let i=await zn(t,50,async c=>{try{let l=await Jk.readFile(Xk.join(n,c),"utf-8"),u=Kk(l,c);return{filePath:c,tokens:u}}catch{return null}});for(let{filePath:c,tokens:l}of i)pI(s,c,l);return mI(s),yI(e,s,t,r),s}function eb(n,e,t=15){let r=Bo(n);return r?uI(e,r).slice(0,t):[]}var zk,ec,qr,tc=h(()=>{"use strict";$d();J();ee();zk=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"]);a(_s,"splitIdentifier");a(Kk,"tokenizeFile");a(aI,"tokenizeQuery");a(cI,"buildIndex");a(lI,"idf");a(uI,"score");ec="bm25-index";a(Md,"termFrequencies");a(dI,"removeDocument");a(pI,"addDocument");a(mI,"recalculateStats");qr=new Map;a(Yk,"indexMetadata");a(Qk,"writeDocumentRows");a(fI,"replacePerFileTables");a(gI,"updatePerFileTables");a(hI,"saveIndex");a(yI,"saveIndexUpdate");a(wI,"loadIndexFromPerFileTables");a(Bo,"loadIndex");a(Nd,"indexProject");a(Zk,"updateProjectIndex");a(eb,"queryFiles")});import Od from"node:fs/promises";import hr from"node:path";import{z as se}from"zod";async function EI(n,e){let t=Date.now();if(n.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let r=hr.join(e,"package.json"),s=await Od.readFile(r,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},c=[],l=[];for(let u of n.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?l.push(u):c.push(u)}return c.length===0?{name:"Framework verification",passed:!0,output:`${l.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${c.join(", ")}`,durationMs:Date.now()-t}}catch(r){return B(r)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-t}}}async function TI(n,e){let t=Date.now();if(n.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let r=await PI(e),s=new Set(r),o=[],i=[];for(let c of n.languages){let l=SI[c];if(!l)continue;l.some(d=>s.has(d))?o.push(c):i.push(c)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(r){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-t}}}async function CI(n,e){let t=Date.now(),r=n.patterns.filter(i=>i.location);if(r.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of r){let c=i.location,l=hr.join(e,c);await A(l)?o.push(c):s.push(`${i.name} (${c})`)}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function RI(n,e){let t=Date.now();try{let r=await AI(e),s=n.fileCount,o=.1,i=Math.abs(r-s),c=s*o;return i<=c?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${r})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${r} (diff: ${i})`,durationMs:Date.now()-t}}catch(r){return{name:"File count verification",passed:!1,error:`Failed to count files: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-t}}}async function xI(n,e){let t=Date.now();if(n.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let r=[],s=[];for(let o of n.antiPatterns){let i=hr.join(e,o.file);await A(i)?s.push(o.file):r.push(`${o.issue} (${o.file})`)}return r.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function tb(n,e){let t=Date.now(),r=await Promise.all([EI(n,e),TI(n,e),CI(n,e),RI(n,e),xI(n,e)]),s=r.filter(i=>!i.passed).length,o=r.filter(i=>i.passed).length;return{passed:s===0,checks:r,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function PI(n){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function r(s){try{let o=await Od.readdir(s,{withFileTypes:!0});for(let i of o){let c=hr.join(s,i.name),l=hr.relative(n,c);if(!t.some(u=>u.test(l))){if(i.isDirectory())await r(c);else if(i.isFile()){let u=hr.extname(i.name);u&&e.add(u)}}}}catch{}}return a(r,"scanDir"),await r(n),Array.from(e)}async function AI(n){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function r(s){try{let o=await Od.readdir(s,{withFileTypes:!0});for(let i of o){let c=hr.join(s,i.name),l=hr.relative(n,c);t.some(u=>u.test(l))||(i.isDirectory()?await r(c):i.isFile()&&e++)}}catch{}}return a(r,"scanDir"),await r(n),e}var kI,bI,vI,Ld,SI,nb=h(()=>{"use strict";W();ee();ls();kI=se.enum(["draft","verified","sealed"]),bI=se.object({name:se.string(),description:se.string(),location:se.string().optional(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),vI=se.object({issue:se.string(),file:se.string(),suggestion:se.string(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),Ld=se.object({projectId:se.string(),languages:se.array(se.string()),frameworks:se.array(se.string()),packageManager:se.string().optional(),sourceDir:se.string().optional(),testDir:se.string().optional(),configFiles:se.array(se.string()),fileCount:se.number(),patterns:se.array(bI),antiPatterns:se.array(vI),analyzedAt:se.string(),modelMetadata:wo.optional(),status:kI.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),SI={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};a(EI,"verifyFrameworks");a(TI,"verifyLanguages");a(CI,"verifyPatternLocations");a(RI,"verifyFileCount");a(xI,"verifyAntiPatternFiles");a(tb,"semanticVerify");a(PI,"getProjectExtensions");a(AI,"countProjectFiles")});var Fd,Ye,yr=h(()=>{"use strict";nb();Za();Dr();ie();Po();or();Fd=class extends at{static{a(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let r={...t,status:"draft"};Ld.parse(r),await this.update(e,s=>({...s,draft:r,lastUpdated:T()})),this.publishAnalysis(e,r)}publishAnalysis(e,t){vt({projectId:e,entityType:"analysis",entityId:e,eventType:"upsert",data:{...t,id:e}})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let r=this.computeSignature(t.draft),s=T(),o={...t.draft,status:"sealed",signature:r,sealedAt:s};return Ld.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:s}),this.publishAnalysis(e,o),{success:!0,signature:r}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let r=T();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:r}),this.publishAnalysis(e,t.previousSealed),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Wk(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let r=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return r===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${r}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let r=await this.read(e),s=r.sealed??r.draft;return s?await tb(s,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return xo(JSON.stringify(t))}},Ye=new Fd});var Hd,_I,yt,Vr=h(()=>{"use strict";ie();J();Hd=class{static{a(this,"LLMAnalysisStorage")}save(e,t){let r=I.getDb(e),s=T();r.transaction(()=>{r.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s),r.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=I.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?I.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getAllFull(e){return I.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(r=>({id:r.id,status:r.status,commitHash:r.commit_hash,analyzedAt:r.analyzed_at,supersededAt:r.superseded_at,analysis:JSON.parse(r.analysis)}))}getHistory(e,t=10){return I.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(s=>{let o=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:o.patterns.length}})}},_I=new Hd,yt=_I});function II(){let n=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!n)return{level:-1,name:"disabled"};if(jI.has(n)||n.includes("prjct"))return{level:js.debug,name:"debug"};let e=js[n]??-1,t=e>=0?n:"disabled";return{level:e,name:t}}function nc(n,e,t){return rb>=n?(...r)=>console[t](e,...r):$I}var js,jI,rb,DI,$I,MI,z,Vt=h(()=>{"use strict";js={error:0,warn:1,info:2,debug:3},jI=new Set(["1","true","*"]);a(II,"getLogLevel");({level:rb,name:DI}=II()),$I=a(()=>{},"noop");a(nc,"createLogMethod");MI={error:nc(js.error,"[prjct:error]","error"),warn:nc(js.warn,"[prjct:warn]","warn"),info:nc(js.info,"[prjct:info]","log"),debug:nc(js.debug,"[prjct:debug]","log"),isEnabled:a(()=>rb>=0,"isEnabled"),level:a(()=>DI,"level")},z=MI});import sb from"node:fs/promises";import ob from"node:path";async function Gd(n,e,t,r){let[s,o,i,c]=await Promise.all([LI(n,e,r),FI(n),HI(n),UI(n)]);return{project:{name:r.name,ecosystem:r.ecosystem,languages:r.languages,frameworks:r.frameworks,fileCount:r.fileCount,projectType:r.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,NI).map(l=>({message:l.message,date:l.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:s,existingPatterns:o,taskHistory:i,previousAnalysis:c??void 0}}async function LI(n,e,t){let r=[],s=[...t.frameworks.map(c=>c.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=eb(n,s,Ud*2);for(let c of o){if(r.length>=Ud)break;try{let l=ob.join(e,c.path),u=await sb.readFile(l,"utf-8");u.length>rc*3?r.push({path:c.path,content:`${u.slice(0,rc)}
1012
- // ... truncated`,reason:`BM25 score: ${c.score.toFixed(2)} (truncated, ${u.length} chars)`}):r.push({path:c.path,content:u.slice(0,rc),reason:`BM25 score: ${c.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let c of i){if(r.length>=Ud)break;if(!r.some(l=>l.path===c))try{let l=ob.join(e,c),u=await sb.readFile(l,"utf-8");r.push({path:c,content:u.slice(0,rc),reason:"entry point"})}catch{}}return r}async function FI(n){try{let e=await Ye.getActive(n);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function HI(n){try{return(await X.getTaskHistory(n)).slice(0,OI).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function UI(n){try{let e=yt.getActiveSummary(n);return Promise.resolve(e)}catch(e){return z.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var rc,Ud,NI,OI,ib=h(()=>{"use strict";tc();yr();Vr();It();Vt();rc=800,Ud=6,NI=8,OI=5;a(Gd,"buildAnalysisPayload");a(LI,"selectCodeSamples");a(FI,"getExistingPatterns");a(HI,"getTaskHistory");a(UI,"getPreviousAnalysisSummary")});var Wd,ab=h(()=>{"use strict";Wd="mcp-remote@0.1.38"});import GI from"node:fs";import WI from"node:fs/promises";import cb from"node:os";import Fn from"node:path";function BI(){let n=qI();if(n)return{command:n,args:["mcp-server"],description:Bd};try{let e=Fn.dirname(rt.resolve("prjct-cli/package.json"));return{command:Fn.join(e,"bin","prjct"),args:["mcp-server"],description:Bd}}catch{return{command:"npx",args:["-y","prjct-cli","mcp-server"],description:Bd}}}function qI(){let n=process.argv[1],e=[n?Fn.resolve(Fn.dirname(n),"prjct"):"",n?Fn.resolve(Fn.dirname(n),"..","bin","prjct"):"",Fn.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let t of e)if(GI.existsSync(t))return t;return null}function Ds(){return process.env.PRJCT_TEST_MODE==="1"?Fn.join(cb.tmpdir(),"prjct-context7-test","mcp.json"):Fn.join(cb.homedir(),".claude","mcp.json")}async function lb(n=Ds()){try{let e=await WI.readFile(n,"utf-8");return JSON.parse(e)}catch(e){let t=w(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${n}: ${w(e)}`)}}async function VI(n,e=Ds()){await Ee(e,n)}async function ub(n,e,t=Ds()){let r=await lb(t),s={...r.mcpServers||{}},o=s[n];s[n]=e,r.mcpServers=s;let i=JSON.stringify(o)!==JSON.stringify(e);return await VI(r,t),{path:t,changed:i}}async function db(n,e=Ds()){return!!(await lb(e)).mcpServers?.[n]}var Bd,Is,sc=h(()=>{"use strict";W();ee();ab();Bd="prjct: project memory + task-orchestrated SDD/TDD. Use prjct_task_start as the single normal entrypoint; prjct classifies trivial work as direct and substantive implementation work into persisted SDD + strict TDD stations. Agents resume from prjct_task_status/task output, create or link reviewed specs when required, and write tests before implementation. Generated instruction surfaces use fixed templates; user task text is task data, not executable instruction text.";a(BI,"getPrjctMcpConfig");a(qI,"resolveLocalPrjctBin");Is={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:BI(),linear:{command:"npx",args:["-y",Wd,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Wd,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};a(Ds,"getClaudeMcpConfigPath");a(lb,"readMcpConfig");a(VI,"writeMcpConfig");a(ub,"upsertMcpServer");a(db,"hasMcpServer")});var yb={};N(yb,{buildContext7SmokePath:()=>hb,default:()=>$s,getVerifyCachePath:()=>Xd});import{constants as JI}from"node:fs";import Xr from"node:fs/promises";import oc from"node:os";import $e from"node:path";function Xd(){return process.env.NODE_ENV==="test"?$e.join(oc.tmpdir(),"prjct-context7-test","verify-cache.json"):$e.join(ot(),"state","context7-verify.json")}async function XI(){try{let n=await Xr.readFile(Xd(),"utf-8"),e=JSON.parse(n);if(typeof e?.at=="number"&&e.status)return e}catch{}return null}async function zI(n,e){let t=Xd();try{await Xr.mkdir($e.dirname(t),{recursive:!0}),await Xr.writeFile(t,JSON.stringify({at:n,status:e}),"utf-8")}catch{}}function QI(){let n=Mt("mcp-config.json");if(!n)return{mcpServers:{context7:Vd}};try{return JSON.parse(n)}catch{return{mcpServers:{context7:Vd}}}}function gb(){return QI().mcpServers?.context7||Vd}async function mb(n){try{return(await Xr.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async function ZI(n){let e=[],t=process.env.NVM_DIR||$e.join(n,".nvm"),r=$e.join(t,"versions","node");for(let i of await mb(r))e.push($e.join(r,i,"bin"));let s=process.env.FNM_DIR||$e.join(n,".local","share","fnm"),o=$e.join(s,"node-versions");for(let i of await mb(o))e.push($e.join(o,i,"installation","bin"));return e}async function hb(n=process.env.PATH||"",e=oc.homedir()){let t=new Set,r=[],s=YI.map(i=>$e.join(e,...i)),o=[...KI,...s,...process.env.NVM_BIN?[process.env.NVM_BIN]:[],...process.env.VOLTA_HOME?[$e.join(process.env.VOLTA_HOME,"bin")]:[],...process.env.ASDF_DIR?[$e.join(process.env.ASDF_DIR,"shims")]:[],...process.env.MISE_DATA_DIR?[$e.join(process.env.MISE_DATA_DIR,"shims")]:[],...await ZI(e)];for(let i of[...n.split($e.delimiter),...o]){let c=i.trim();!c||t.has(c)||(t.add(c),r.push(c))}return r.join($e.delimiter)}async function eD(n,e){if($e.isAbsolute(n)||n.includes($e.sep))return n;let t=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let r of e.split($e.delimiter))if(r)for(let s of t){let o=$e.join(r,n+s);try{return await Xr.access(o,JI.X_OK),o}catch{}}return n}function qd(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?$e.join(oc.tmpdir(),"prjct-context7-test","mcp.json"):$e.join(oc.homedir(),".claude","mcp.json")}async function fb(n){try{let e=await Xr.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(B(e))return{};throw e}}async function tD(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let n=gb(),e=[...n.args||[],"--help"],t=await hb(),r=await eD(n.command||"npx",t);await G(r,e,{timeout:15e3,env:{...process.env,PATH:t}})}var Vd,Jr,KI,YI,Jd,nD,$s,ic=h(()=>{"use strict";_n();mu();Qn();W();ue();ee();sc();a(Xd,"getVerifyCachePath");a(XI,"readPersistedVerify");a(zI,"writePersistedVerify");Vd=Is.context7,Jr=null,KI=[$e.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin","/bin"],YI=[[".bun","bin"],[".local","bin"],[".volta","bin"],[".asdf","shims"],[".local","share","mise","shims"],[".rtx","shims"],[".npm-global","bin"]];a(QI,"parseTemplateConfig");a(gb,"getContext7Config");a(mb,"listChildDirs");a(ZI,"discoverNodeManagerBinDirs");a(hb,"buildContext7SmokePath");a(eD,"resolveExecutable");a(qd,"getConfigPath");a(fb,"readConfig");a(tD,"runSmokeCheck");Jd=class{static{a(this,"Context7Service")}async install(){let e=qd(),t=$e.dirname(e);await Xr.mkdir(t,{recursive:!0});let r=await fb(e),s=r.mcpServers||{},o=gb(),i=s.context7;return i&&JSON.stringify(i)===JSON.stringify(o)?{installed:!0,verified:!1,configPath:e,message:"Context7 MCP already configured"}:(s.context7=o,r.mcpServers=s,await Ee(e,r),Jr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"})}async verify(){let e=Date.now();if(Jr&&e-Jr.at<3e5)return Jr.status;let t=await XI();if(t?.status.verified&&e-t.at<3e5&&t.status.configPath===qd())return Jr=t,t.status;let r=qd(),i=((await fb(r)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:r,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await tD();let c={installed:!0,verified:!0,configPath:r};return Jr={at:e,status:c},await zI(e,c),c}catch(c){let l={installed:!0,verified:!1,configPath:r,message:`Context7 smoke check failed: ${w(c)}`};return Jr={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}},nD=new Jd,$s=nD});import zd from"node:fs/promises";import wb from"node:path";function rD(){return process.env.PRJCT_TEST_MODE==="1"?wb.join(Le(".prjct-tests"),"codex","config.toml"):Le(".codex","config.toml")}function ac(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function sD(n=Is.prjct){let e=(n.args??[]).map(ac).join(", ");return[kb,"[mcp_servers.prjct]",`command = ${ac(n.command)}`,`args = [${e}]`,Kd,""].join(`
1011
+ `)}function Wo(n,e,t,r){let s=new Set(e),o=new Set(t);for(let i of t)s.has(i)||r.push({field:n,type:"added",after:i});for(let i of e)o.has(i)||r.push({field:n,type:"removed",before:i})}var Za=h(()=>{"use strict";a(Wk,"generateAnalysisDiff");a(Qa,"formatAnalysisDiffMd");a(Bk,"formatAnalysisDiffText");a(Wo,"diffStringArray")});var $d=h(()=>{"use strict"});import Jk from"node:fs/promises";import Xk from"node:path";function _s(n){return n.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/[-_./]/g," ").toLowerCase().split(/\s+/).filter(e=>e.length>1)}function Kk(n,e){let t=[],r=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of r)t.push(..._s(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(n))!==null;)f[1]&&t.push(..._s(f[1]))}let o=[/(?:async\s+)?function\s+(\w+)/g,/class\s+(\w+)/g,/interface\s+(\w+)/g,/type\s+(\w+)\s*=/g];for(let m of o){let f;for(;(f=m.exec(n))!==null;)f[1]&&t.push(..._s(f[1]))}let i=/(?:from|import)\s+['"]([^'"]+)['"]/g,c;for(;(c=i.exec(n))!==null;){let m=c[1];if(m.startsWith(".")||m.startsWith("@/"))t.push(..._s(m));else{let f=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(..._s(f))}}let l=/\/\/\s*(.+)/g,u;for(;(u=l.exec(n))!==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(n))!==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&&!zk.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function aI(n){return n.split(/\s+/).flatMap(e=>_s(e)).filter(e=>e.length>1&&!zk.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}async function cI(n){let e=await zn(n),t={},r={},s=0,o=await Kn(e,50,async c=>{try{let l=await Jk.readFile(Xk.join(n,c),"utf-8"),u=Kk(l,c);return u.length>0?{filePath:c,tokens:u}:null}catch{return null}});for(let{filePath:c,tokens:l}of o){t[c]={tokens:l,length:l.length},s+=l.length;for(let[u,d]of Md(l))r[u]||(r[u]=[]),r[u].push({path:c,tf:d})}let i=Object.keys(t).length;return{documents:t,invertedIndex:r,avgDocLength:i>0?s/i:0,totalDocs:i,builtAt:new Date().toISOString()}}function lI(n,e){return Math.log((e-n+.5)/(n+.5)+1)}function uI(n,e){let t=aI(n);if(t.length===0)return[];let r=new Map;for(let s of t){let o=e.invertedIndex[s];if(!o)continue;let i=lI(o.length,e.totalDocs);for(let{path:c,tf:l}of o){let u=e.documents[c];if(!u)continue;let d=l*(1.2+1),p=l+1.2*(1-.75+.75*(u.length/e.avgDocLength)),m=i*(d/p);r.set(c,(r.get(c)||0)+m)}}return Array.from(r.entries()).map(([s,o])=>({path:s,score:o})).sort((s,o)=>o.score-s.score)}function Md(n){let e=new Map;for(let t of n)e.set(t,(e.get(t)||0)+1);return e}function dI(n,e){let t=n.documents[e];if(!t)return;delete n.documents[e];let r=new Set(t.tokens),s=r.size>0?r:new Set(Object.keys(n.invertedIndex));for(let o of s){let i=n.invertedIndex[o];if(!i)continue;let c=i.filter(l=>l.path!==e);c.length===0?delete n.invertedIndex[o]:n.invertedIndex[o]=c}}function pI(n,e,t){if(t.length!==0){n.documents[e]={tokens:t,length:t.length};for(let[r,s]of Md(t))n.invertedIndex[r]||(n.invertedIndex[r]=[]),n.invertedIndex[r].push({path:e,tf:s})}}function mI(n){let e=Object.values(n.documents).map(r=>r.length),t=e.reduce((r,s)=>r+s,0);n.totalDocs=e.length,n.avgDocLength=e.length>0?t/e.length:0,n.builtAt=new Date().toISOString()}function Yk(n){return{schemaVersion:2,avgDocLength:n.avgDocLength,totalDocs:n.totalDocs,builtAt:n.builtAt,docLengths:Object.fromEntries(Object.entries(n.documents).map(([e,t])=>[e,t.length]))}}function Qk(n,e,t,r,s){if(r.length!==0){n.run(t,JSON.stringify(r),r.length,s);for(let[o,i]of Md(r))e.run(o,t,i)}}function fI(n,e){try{b.transaction(n,t=>{t.prepare("DELETE FROM bm25_terms").run(),t.prepare("DELETE FROM bm25_documents").run();let r=new Date().toISOString(),s=t.prepare("INSERT INTO bm25_documents (path, tokens, length, updated_at) VALUES (?, ?, ?, ?)"),o=t.prepare("INSERT INTO bm25_terms (token, path, tf) VALUES (?, ?, ?)");for(let[i,c]of Object.entries(e.documents))Qk(s,o,i,c.tokens,r)})}catch{}}function gI(n,e,t,r){try{b.transaction(n,s=>{let o=s.prepare("DELETE FROM bm25_terms WHERE path = ?"),i=s.prepare("DELETE FROM bm25_documents WHERE path = ?"),c=s.prepare("INSERT INTO bm25_documents (path, tokens, length, updated_at) VALUES (?, ?, ?, ?)"),l=s.prepare("INSERT INTO bm25_terms (token, path, tf) VALUES (?, ?, ?)"),u=new Date().toISOString();for(let d of new Set([...t,...r]))o.run(d),i.run(d);for(let d of t){let p=e.documents[d];p&&Qk(c,l,d,p.tokens,u)}})}catch{}}function hI(n,e){b.setDoc(n,ec,Yk(e)),fI(n,e),qr.delete(n)}function yI(n,e,t,r){b.setDoc(n,ec,Yk(e)),gI(n,e,t,r),qr.delete(n)}function wI(n,e,t){try{let r=b.query(n,"SELECT path, tokens, length FROM bm25_documents ORDER BY path");if(r.length===0){if(t?.totalDocs===0){let d={documents:{},invertedIndex:{},avgDocLength:0,totalDocs:0,builtAt:t.builtAt};return qr.set(n,{index:d,updatedAt:e}),d}return null}let s={},o={},i=0;for(let d of r){let p=JSON.parse(d.tokens);s[d.path]={tokens:p,length:d.length},i+=d.length}let c=b.query(n,"SELECT token, path, tf FROM bm25_terms ORDER BY token, path");for(let d of c)o[d.token]||(o[d.token]=[]),o[d.token].push({path:d.path,tf:d.tf});let l=r.length,u={documents:s,invertedIndex:o,avgDocLength:l>0?i/l:0,totalDocs:l,builtAt:t?.builtAt??e};return qr.set(n,{index:u,updatedAt:e}),u}catch{return null}}function Bo(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",ec);if(!e)return qr.delete(n),null;let t=qr.get(n);if(t&&t.updatedAt===e.updated_at)return t.index;let r=b.getDoc(n,ec),s=wI(n,e.updated_at,r);if(s)return s;if(!r?.invertedIndex)return null;let o={};for(let[c,l]of Object.entries(r.docLengths))o[c]={tokens:[],length:l};let i={documents:o,invertedIndex:r.invertedIndex,avgDocLength:r.avgDocLength,totalDocs:r.totalDocs,builtAt:r.builtAt};return qr.set(n,{index:i,updatedAt:e.updated_at}),i}async function Nd(n,e){let t=await cI(n);return hI(e,t),t}async function Zk(n,e,t,r=[]){let s=Bo(e);if(!s)return Nd(n,e);let o=new Set([...t,...r]);for(let c of o)dI(s,c);let i=await Kn(t,50,async c=>{try{let l=await Jk.readFile(Xk.join(n,c),"utf-8"),u=Kk(l,c);return{filePath:c,tokens:u}}catch{return null}});for(let{filePath:c,tokens:l}of i)pI(s,c,l);return mI(s),yI(e,s,t,r),s}function eb(n,e,t=15){let r=Bo(n);return r?uI(e,r).slice(0,t):[]}var zk,ec,qr,tc=h(()=>{"use strict";$d();J();ee();zk=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"]);a(_s,"splitIdentifier");a(Kk,"tokenizeFile");a(aI,"tokenizeQuery");a(cI,"buildIndex");a(lI,"idf");a(uI,"score");ec="bm25-index";a(Md,"termFrequencies");a(dI,"removeDocument");a(pI,"addDocument");a(mI,"recalculateStats");qr=new Map;a(Yk,"indexMetadata");a(Qk,"writeDocumentRows");a(fI,"replacePerFileTables");a(gI,"updatePerFileTables");a(hI,"saveIndex");a(yI,"saveIndexUpdate");a(wI,"loadIndexFromPerFileTables");a(Bo,"loadIndex");a(Nd,"indexProject");a(Zk,"updateProjectIndex");a(eb,"queryFiles")});import Od from"node:fs/promises";import yr from"node:path";import{z as se}from"zod";async function EI(n,e){let t=Date.now();if(n.frameworks.length===0)return{name:"Framework verification",passed:!0,output:"No frameworks declared (skipped)",durationMs:Date.now()-t};try{let r=yr.join(e,"package.json"),s=await Od.readFile(r,"utf-8"),o=JSON.parse(s),i={...o.dependencies,...o.devDependencies},c=[],l=[];for(let u of n.frameworks){let d=u.toLowerCase();Object.keys(i).some(m=>m.toLowerCase().includes(d))?l.push(u):c.push(u)}return c.length===0?{name:"Framework verification",passed:!0,output:`${l.length} framework(s) verified in dependencies`,durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Frameworks not found in dependencies: ${c.join(", ")}`,durationMs:Date.now()-t}}catch(r){return B(r)?{name:"Framework verification",passed:!1,error:"package.json not found (cannot verify frameworks)",durationMs:Date.now()-t}:{name:"Framework verification",passed:!1,error:`Failed to read package.json: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-t}}}async function TI(n,e){let t=Date.now();if(n.languages.length===0)return{name:"Language verification",passed:!0,output:"No languages declared (skipped)",durationMs:Date.now()-t};try{let r=await PI(e),s=new Set(r),o=[],i=[];for(let c of n.languages){let l=SI[c];if(!l)continue;l.some(d=>s.has(d))?o.push(c):i.push(c)}return i.length===0?{name:"Language verification",passed:!0,output:`${o.length} language(s) verified with matching files`,durationMs:Date.now()-t}:{name:"Language verification",passed:!1,error:`Languages without matching files: ${i.join(", ")}`,durationMs:Date.now()-t}}catch(r){return{name:"Language verification",passed:!1,error:`Failed to scan project files: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-t}}}async function CI(n,e){let t=Date.now(),r=n.patterns.filter(i=>i.location);if(r.length===0)return{name:"Pattern location verification",passed:!0,output:"No pattern locations specified (skipped)",durationMs:Date.now()-t};let s=[],o=[];for(let i of r){let c=i.location,l=yr.join(e,c);await A(l)?o.push(c):s.push(`${i.name} (${c})`)}return s.length===0?{name:"Pattern location verification",passed:!0,output:`${o.length} pattern location(s) verified`,durationMs:Date.now()-t}:{name:"Pattern location verification",passed:!1,error:`Pattern locations not found: ${s.join(", ")}`,durationMs:Date.now()-t}}async function RI(n,e){let t=Date.now();try{let r=await AI(e),s=n.fileCount,o=.1,i=Math.abs(r-s),c=s*o;return i<=c?{name:"File count verification",passed:!0,output:`File count accurate (declared: ${s}, actual: ${r})`,durationMs:Date.now()-t}:{name:"File count verification",passed:!1,error:`File count mismatch: declared ${s}, actual ${r} (diff: ${i})`,durationMs:Date.now()-t}}catch(r){return{name:"File count verification",passed:!1,error:`Failed to count files: ${r instanceof Error?r.message:"unknown error"}`,durationMs:Date.now()-t}}}async function xI(n,e){let t=Date.now();if(n.antiPatterns.length===0)return{name:"Anti-pattern file verification",passed:!0,output:"No anti-patterns declared (skipped)",durationMs:Date.now()-t};let r=[],s=[];for(let o of n.antiPatterns){let i=yr.join(e,o.file);await A(i)?s.push(o.file):r.push(`${o.issue} (${o.file})`)}return r.length===0?{name:"Anti-pattern file verification",passed:!0,output:`${s.length} anti-pattern file(s) verified`,durationMs:Date.now()-t}:{name:"Anti-pattern file verification",passed:!1,error:`Anti-pattern files not found: ${r.join(", ")}`,durationMs:Date.now()-t}}async function tb(n,e){let t=Date.now(),r=await Promise.all([EI(n,e),TI(n,e),CI(n,e),RI(n,e),xI(n,e)]),s=r.filter(i=>!i.passed).length,o=r.filter(i=>i.passed).length;return{passed:s===0,checks:r,totalMs:Date.now()-t,failedCount:s,passedCount:o}}async function PI(n){let e=new Set,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function r(s){try{let o=await Od.readdir(s,{withFileTypes:!0});for(let i of o){let c=yr.join(s,i.name),l=yr.relative(n,c);if(!t.some(u=>u.test(l))){if(i.isDirectory())await r(c);else if(i.isFile()){let u=yr.extname(i.name);u&&e.add(u)}}}}catch{}}return a(r,"scanDir"),await r(n),Array.from(e)}async function AI(n){let e=0,t=[/node_modules/,/\.git/,/dist/,/build/,/\.next/,/\.turbo/,/coverage/];async function r(s){try{let o=await Od.readdir(s,{withFileTypes:!0});for(let i of o){let c=yr.join(s,i.name),l=yr.relative(n,c);t.some(u=>u.test(l))||(i.isDirectory()?await r(c):i.isFile()&&e++)}}catch{}}return a(r,"scanDir"),await r(n),e}var kI,bI,vI,Ld,SI,nb=h(()=>{"use strict";W();ee();ls();kI=se.enum(["draft","verified","sealed"]),bI=se.object({name:se.string(),description:se.string(),location:se.string().optional(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),vI=se.object({issue:se.string(),file:se.string(),suggestion:se.string(),severity:se.enum(["low","medium","high"]).optional(),language:se.string().optional(),framework:se.string().optional(),source:se.enum(["baseline","repo","context7","feedback"]).optional(),confidence:se.number().min(0).max(1).optional()}),Ld=se.object({projectId:se.string(),languages:se.array(se.string()),frameworks:se.array(se.string()),packageManager:se.string().optional(),sourceDir:se.string().optional(),testDir:se.string().optional(),configFiles:se.array(se.string()),fileCount:se.number(),patterns:se.array(bI),antiPatterns:se.array(vI),analyzedAt:se.string(),modelMetadata:wo.optional(),status:kI.default("draft"),commitHash:se.string().optional(),signature:se.string().optional(),sealedAt:se.string().optional(),verifiedAt:se.string().optional()}),SI={TypeScript:[".ts",".tsx",".mts",".cts"],JavaScript:[".js",".jsx",".mjs",".cjs"],Python:[".py",".pyw"],Java:[".java"],Go:[".go"],Rust:[".rs"],Ruby:[".rb"],PHP:[".php"],Swift:[".swift"],Kotlin:[".kt",".kts"],"C++":[".cpp",".cc",".cxx",".hpp",".h"],C:[".c",".h"],"C#":[".cs"],Elixir:[".ex",".exs"],Scala:[".scala"]};a(EI,"verifyFrameworks");a(TI,"verifyLanguages");a(CI,"verifyPatternLocations");a(RI,"verifyFileCount");a(xI,"verifyAntiPatternFiles");a(tb,"semanticVerify");a(PI,"getProjectExtensions");a(AI,"countProjectFiles")});var Fd,Ye,wr=h(()=>{"use strict";nb();Za();Dr();ie();Po();ir();Fd=class extends at{static{a(this,"AnalysisStorage")}constructor(){super("analysis.json")}getDefault(){return{draft:null,sealed:null,previousSealed:null,lastUpdated:""}}getEventType(e){return`analysis.${e}d`}async saveDraft(e,t){let r={...t,status:"draft"};Ld.parse(r),await this.update(e,s=>({...s,draft:r,lastUpdated:T()})),this.publishAnalysis(e,r)}publishAnalysis(e,t){vt({projectId:e,entityType:"analysis",entityId:e,eventType:"upsert",data:{...t,id:e}})}async seal(e){let t=await this.read(e);if(!t.draft)return{success:!1,error:"No draft analysis to seal. Run `p. sync` first."};if(t.draft.status==="sealed")return{success:!1,error:"Draft is already sealed."};let r=this.computeSignature(t.draft),s=T(),o={...t.draft,status:"sealed",signature:r,sealedAt:s};return Ld.parse(o),await this.write(e,{draft:null,sealed:o,previousSealed:t.sealed,lastUpdated:s}),this.publishAnalysis(e,o),{success:!0,signature:r}}async getSealed(e){return(await this.read(e)).sealed}async getDraft(e){return(await this.read(e)).draft}async getActive(e){let t=await this.read(e);return t.sealed??t.draft}async getStatus(e){let t=await this.read(e);return{hasSealed:t.sealed!==null,hasDraft:t.draft!==null,hasPreviousSealed:t.previousSealed!==null,sealedCommit:t.sealed?.commitHash??null,draftCommit:t.draft?.commitHash??null,previousSealedCommit:t.previousSealed?.commitHash??null,sealedAt:t.sealed?.sealedAt??null}}async rollback(e){let t=await this.read(e);if(!t.previousSealed)return{success:!1,error:"No previous sealed version to rollback to."};let r=T();return await this.write(e,{draft:t.sealed,sealed:t.previousSealed,previousSealed:null,lastUpdated:r}),this.publishAnalysis(e,t.previousSealed),{success:!0,restoredSignature:t.previousSealed.signature}}async diff(e){let t=await this.read(e);return!t.sealed||!t.draft?null:Wk(t.sealed,t.draft)}checkStaleness(e,t){return e?t?e!==t?{isStale:!0,sealedCommit:e,currentCommit:t,message:`Analysis is stale: sealed at ${e}, HEAD is ${t}. Run \`p. sync\` + \`p. seal\` to update.`}:{isStale:!1,sealedCommit:e,currentCommit:t,message:"Analysis is current."}:{isStale:!0,sealedCommit:e,currentCommit:null,message:"Cannot determine current commit. Analysis may be stale."}:{isStale:!1,sealedCommit:null,currentCommit:t,message:"No sealed analysis. Run `p. sync` then `p. seal`."}}async verify(e){let t=await this.read(e);if(!t.sealed)return{valid:!1,message:"No sealed analysis to verify."};if(!t.sealed.signature)return{valid:!1,message:"Sealed analysis has no signature."};let r=this.computeSignature({...t.sealed,signature:void 0,sealedAt:void 0});return r===t.sealed.signature?{valid:!0,message:"Signature verified. Analysis integrity confirmed."}:{valid:!1,message:`Signature mismatch. Expected ${r}, got ${t.sealed.signature}. Analysis may have been modified.`}}async semanticVerify(e,t){let r=await this.read(e),s=r.sealed??r.draft;return s?await tb(s,t):{passed:!1,checks:[{name:"Analysis availability",passed:!1,error:"No analysis available. Run `p. sync` to generate.",durationMs:0}],totalMs:0,failedCount:1,passedCount:0}}computeSignature(e){let t={projectId:e.projectId,languages:e.languages,frameworks:e.frameworks,packageManager:e.packageManager,sourceDir:e.sourceDir,testDir:e.testDir,configFiles:e.configFiles,fileCount:e.fileCount,patterns:e.patterns,antiPatterns:e.antiPatterns,analyzedAt:e.analyzedAt,commitHash:e.commitHash};return xo(JSON.stringify(t))}},Ye=new Fd});var Hd,_I,yt,Vr=h(()=>{"use strict";ie();J();Hd=class{static{a(this,"LLMAnalysisStorage")}save(e,t){let r=I.getDb(e),s=T();r.transaction(()=>{r.prepare("UPDATE llm_analysis SET status = 'superseded', superseded_at = ? WHERE status = 'active'").run(s),r.prepare("INSERT INTO llm_analysis (commit_hash, status, analysis, analyzed_at) VALUES (?, ?, ?, ?)").run(t.commitHash??null,"active",JSON.stringify(t),t.analyzedAt)})()}getActive(e){let t=I.get(e,"SELECT analysis FROM llm_analysis WHERE status = 'active' LIMIT 1");return t?JSON.parse(t.analysis):null}getActiveSummary(e){let t=this.getActive(e);return t?{commitHash:t.commitHash,architectureStyle:t.architecture.style,patternCount:t.patterns.length,antiPatternCount:t.antiPatterns.length,analyzedAt:t.analyzedAt}:null}isCurrent(e,t){return t?I.get(e,"SELECT commit_hash FROM llm_analysis WHERE status = 'active' LIMIT 1")?.commit_hash===t:!1}getAllFull(e){return I.query(e,"SELECT id, commit_hash, status, analyzed_at, superseded_at, analysis FROM llm_analysis ORDER BY id DESC").map(r=>({id:r.id,status:r.status,commitHash:r.commit_hash,analyzedAt:r.analyzed_at,supersededAt:r.superseded_at,analysis:JSON.parse(r.analysis)}))}getHistory(e,t=10){return I.query(e,"SELECT id, commit_hash, status, analyzed_at, analysis FROM llm_analysis ORDER BY id DESC LIMIT ?",t).map(s=>{let o=JSON.parse(s.analysis);return{id:s.id,commitHash:s.commit_hash,status:s.status,analyzedAt:s.analyzed_at,patternCount:o.patterns.length}})}},_I=new Hd,yt=_I});function II(){let n=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!n)return{level:-1,name:"disabled"};if(jI.has(n)||n.includes("prjct"))return{level:js.debug,name:"debug"};let e=js[n]??-1,t=e>=0?n:"disabled";return{level:e,name:t}}function nc(n,e,t){return rb>=n?(...r)=>console[t](e,...r):$I}var js,jI,rb,DI,$I,MI,z,Vt=h(()=>{"use strict";js={error:0,warn:1,info:2,debug:3},jI=new Set(["1","true","*"]);a(II,"getLogLevel");({level:rb,name:DI}=II()),$I=a(()=>{},"noop");a(nc,"createLogMethod");MI={error:nc(js.error,"[prjct:error]","error"),warn:nc(js.warn,"[prjct:warn]","warn"),info:nc(js.info,"[prjct:info]","log"),debug:nc(js.debug,"[prjct:debug]","log"),isEnabled:a(()=>rb>=0,"isEnabled"),level:a(()=>DI,"level")},z=MI});import sb from"node:fs/promises";import ob from"node:path";async function Gd(n,e,t,r){let[s,o,i,c]=await Promise.all([LI(n,e,r),FI(n),HI(n),UI(n)]);return{project:{name:r.name,ecosystem:r.ecosystem,languages:r.languages,frameworks:r.frameworks,fileCount:r.fileCount,projectType:r.projectType},git:{branch:t.branch,recentCommits:t.recentCommits.slice(0,NI).map(l=>({message:l.message,date:l.date})),hasChanges:t.hasChanges,weeklyCommits:t.weeklyCommits},codeSamples:s,existingPatterns:o,taskHistory:i,previousAnalysis:c??void 0}}async function LI(n,e,t){let r=[],s=[...t.frameworks.map(c=>c.toLowerCase()),"config","router","middleware","service","model","schema","database","api","auth"].join(" "),o=eb(n,s,Ud*2);for(let c of o){if(r.length>=Ud)break;try{let l=ob.join(e,c.path),u=await sb.readFile(l,"utf-8");u.length>rc*3?r.push({path:c.path,content:`${u.slice(0,rc)}
1012
+ // ... truncated`,reason:`BM25 score: ${c.score.toFixed(2)} (truncated, ${u.length} chars)`}):r.push({path:c.path,content:u.slice(0,rc),reason:`BM25 score: ${c.score.toFixed(2)}`})}catch{}}let i=["package.json","tsconfig.json","src/index.ts","src/main.ts","app.ts"];for(let c of i){if(r.length>=Ud)break;if(!r.some(l=>l.path===c))try{let l=ob.join(e,c),u=await sb.readFile(l,"utf-8");r.push({path:c,content:u.slice(0,rc),reason:"entry point"})}catch{}}return r}async function FI(n){try{let e=await Ye.getActive(n);return e?{patterns:(e.patterns??[]).map(t=>({name:t.name,description:t.description})),antiPatterns:(e.antiPatterns??[]).map(t=>({issue:t.issue,file:t.file,suggestion:t.suggestion}))}:{patterns:[],antiPatterns:[]}}catch{return{patterns:[],antiPatterns:[]}}}async function HI(n){try{return(await X.getTaskHistory(n)).slice(0,OI).map(t=>({description:t.title,status:t.classification,branch:t.branchName}))}catch{return[]}}function UI(n){try{let e=yt.getActiveSummary(n);return Promise.resolve(e)}catch(e){return z.debug("Failed to get previous LLM analysis summary",{error:e}),Promise.resolve(null)}}var rc,Ud,NI,OI,ib=h(()=>{"use strict";tc();wr();Vr();It();Vt();rc=800,Ud=6,NI=8,OI=5;a(Gd,"buildAnalysisPayload");a(LI,"selectCodeSamples");a(FI,"getExistingPatterns");a(HI,"getTaskHistory");a(UI,"getPreviousAnalysisSummary")});var Wd,ab=h(()=>{"use strict";Wd="mcp-remote@0.1.38"});import GI from"node:fs";import WI from"node:fs/promises";import cb from"node:os";import Fn from"node:path";function BI(){let n=qI();if(n)return{command:n,args:["mcp-server"],description:Bd};try{let e=Fn.dirname(rt.resolve("prjct-cli/package.json"));return{command:Fn.join(e,"bin","prjct"),args:["mcp-server"],description:Bd}}catch{return{command:"npx",args:["-y","prjct-cli","mcp-server"],description:Bd}}}function qI(){let n=process.argv[1],e=[n?Fn.resolve(Fn.dirname(n),"prjct"):"",n?Fn.resolve(Fn.dirname(n),"..","bin","prjct"):"",Fn.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let t of e)if(GI.existsSync(t))return t;return null}function Ds(){return process.env.PRJCT_TEST_MODE==="1"?Fn.join(cb.tmpdir(),"prjct-context7-test","mcp.json"):Fn.join(cb.homedir(),".claude","mcp.json")}async function lb(n=Ds()){try{let e=await WI.readFile(n,"utf-8");return JSON.parse(e)}catch(e){let t=w(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${n}: ${w(e)}`)}}async function VI(n,e=Ds()){await Ee(e,n)}async function ub(n,e,t=Ds()){let r=await lb(t),s={...r.mcpServers||{}},o=s[n];s[n]=e,r.mcpServers=s;let i=JSON.stringify(o)!==JSON.stringify(e);return await VI(r,t),{path:t,changed:i}}async function db(n,e=Ds()){return!!(await lb(e)).mcpServers?.[n]}var Bd,Is,sc=h(()=>{"use strict";W();ee();ab();Bd="prjct: project memory + task-orchestrated SDD/TDD. Use prjct_task_start as the single normal entrypoint; prjct classifies trivial work as direct and substantive implementation work into persisted SDD + strict TDD stations. Agents resume from prjct_task_status/task output, create or link reviewed specs when required, and write tests before implementation. Generated instruction surfaces use fixed templates; user task text is task data, not executable instruction text.";a(BI,"getPrjctMcpConfig");a(qI,"resolveLocalPrjctBin");Is={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:BI(),linear:{command:"npx",args:["-y",Wd,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Wd,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};a(Ds,"getClaudeMcpConfigPath");a(lb,"readMcpConfig");a(VI,"writeMcpConfig");a(ub,"upsertMcpServer");a(db,"hasMcpServer")});var yb={};N(yb,{buildContext7SmokePath:()=>hb,default:()=>$s,getVerifyCachePath:()=>Xd});import{constants as JI}from"node:fs";import Xr from"node:fs/promises";import oc from"node:os";import $e from"node:path";function Xd(){return process.env.NODE_ENV==="test"?$e.join(oc.tmpdir(),"prjct-context7-test","verify-cache.json"):$e.join(ot(),"state","context7-verify.json")}async function XI(){try{let n=await Xr.readFile(Xd(),"utf-8"),e=JSON.parse(n);if(typeof e?.at=="number"&&e.status)return e}catch{}return null}async function zI(n,e){let t=Xd();try{await Xr.mkdir($e.dirname(t),{recursive:!0}),await Xr.writeFile(t,JSON.stringify({at:n,status:e}),"utf-8")}catch{}}function QI(){let n=Mt("mcp-config.json");if(!n)return{mcpServers:{context7:Vd}};try{return JSON.parse(n)}catch{return{mcpServers:{context7:Vd}}}}function gb(){return QI().mcpServers?.context7||Vd}async function mb(n){try{return(await Xr.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async function ZI(n){let e=[],t=process.env.NVM_DIR||$e.join(n,".nvm"),r=$e.join(t,"versions","node");for(let i of await mb(r))e.push($e.join(r,i,"bin"));let s=process.env.FNM_DIR||$e.join(n,".local","share","fnm"),o=$e.join(s,"node-versions");for(let i of await mb(o))e.push($e.join(o,i,"installation","bin"));return e}async function hb(n=process.env.PATH||"",e=oc.homedir()){let t=new Set,r=[],s=YI.map(i=>$e.join(e,...i)),o=[...KI,...s,...process.env.NVM_BIN?[process.env.NVM_BIN]:[],...process.env.VOLTA_HOME?[$e.join(process.env.VOLTA_HOME,"bin")]:[],...process.env.ASDF_DIR?[$e.join(process.env.ASDF_DIR,"shims")]:[],...process.env.MISE_DATA_DIR?[$e.join(process.env.MISE_DATA_DIR,"shims")]:[],...await ZI(e)];for(let i of[...n.split($e.delimiter),...o]){let c=i.trim();!c||t.has(c)||(t.add(c),r.push(c))}return r.join($e.delimiter)}async function eD(n,e){if($e.isAbsolute(n)||n.includes($e.sep))return n;let t=process.platform==="win32"?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""];for(let r of e.split($e.delimiter))if(r)for(let s of t){let o=$e.join(r,n+s);try{return await Xr.access(o,JI.X_OK),o}catch{}}return n}function qd(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?$e.join(oc.tmpdir(),"prjct-context7-test","mcp.json"):$e.join(oc.homedir(),".claude","mcp.json")}async function fb(n){try{let e=await Xr.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(B(e))return{};throw e}}async function tD(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let n=gb(),e=[...n.args||[],"--help"],t=await hb(),r=await eD(n.command||"npx",t);await G(r,e,{timeout:15e3,env:{...process.env,PATH:t}})}var Vd,Jr,KI,YI,Jd,nD,$s,ic=h(()=>{"use strict";_n();mu();Zn();W();ue();ee();sc();a(Xd,"getVerifyCachePath");a(XI,"readPersistedVerify");a(zI,"writePersistedVerify");Vd=Is.context7,Jr=null,KI=[$e.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/opt/local/bin","/usr/bin","/bin"],YI=[[".bun","bin"],[".local","bin"],[".volta","bin"],[".asdf","shims"],[".local","share","mise","shims"],[".rtx","shims"],[".npm-global","bin"]];a(QI,"parseTemplateConfig");a(gb,"getContext7Config");a(mb,"listChildDirs");a(ZI,"discoverNodeManagerBinDirs");a(hb,"buildContext7SmokePath");a(eD,"resolveExecutable");a(qd,"getConfigPath");a(fb,"readConfig");a(tD,"runSmokeCheck");Jd=class{static{a(this,"Context7Service")}async install(){let e=qd(),t=$e.dirname(e);await Xr.mkdir(t,{recursive:!0});let r=await fb(e),s=r.mcpServers||{},o=gb(),i=s.context7;return i&&JSON.stringify(i)===JSON.stringify(o)?{installed:!0,verified:!1,configPath:e,message:"Context7 MCP already configured"}:(s.context7=o,r.mcpServers=s,await Ee(e,r),Jr=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"})}async verify(){let e=Date.now();if(Jr&&e-Jr.at<3e5)return Jr.status;let t=await XI();if(t?.status.verified&&e-t.at<3e5&&t.status.configPath===qd())return Jr=t,t.status;let r=qd(),i=((await fb(r)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:r,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await tD();let c={installed:!0,verified:!0,configPath:r};return Jr={at:e,status:c},await zI(e,c),c}catch(c){let l={installed:!0,verified:!1,configPath:r,message:`Context7 smoke check failed: ${w(c)}`};return Jr={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}},nD=new Jd,$s=nD});import zd from"node:fs/promises";import wb from"node:path";function rD(){return process.env.PRJCT_TEST_MODE==="1"?wb.join(Le(".prjct-tests"),"codex","config.toml"):Le(".codex","config.toml")}function ac(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function sD(n=Is.prjct){let e=(n.args??[]).map(ac).join(", ");return[kb,"[mcp_servers.prjct]",`command = ${ac(n.command)}`,`args = [${e}]`,Kd,""].join(`
1013
1013
  `)}function oD(){return["[tui]",`status_line = [${bb.map(ac).join(", ")}]`,""].join(`
1014
1014
  `)}function iD(n){return/^\s*(?:tui\.)?status_line\s*=/m.test(n)}function aD(n){if(iD(n))return{toml:n,changed:!1};let t=`status_line = [${bb.map(ac).join(", ")}]
1015
1015
  `,r=/^\s*\[tui\]\s*$/m.exec(n);if(r){let o=r.index+r[0].length,i=n.slice(0,o),c=n.slice(o);return c.startsWith(`
@@ -1019,26 +1019,26 @@ ${t}${c}`,changed:!0}}let s=oD();return{toml:n.trim().length>0?`${n.trimEnd()}
1019
1019
  ${s}`:s,changed:!0}}async function cc(n=rD()){let e="";try{e=await zd.readFile(n,"utf-8")}catch{}let t=sD(),r,s=e.indexOf(kb),o=e.indexOf(Kd),i;if(s!==-1&&o!==-1&&o>s){let l=e.slice(0,s),u=e.slice(o+Kd.length);u.startsWith(`
1020
1020
  `)&&(u=u.slice(1)),r=l+t+u}else/^\s*\[mcp_servers\.prjct\]/m.test(e)?(r=e,i="user-managed"):e.trim().length>0?r=`${e.trimEnd()}
1021
1021
 
1022
- ${t}`:r=t;let c=aD(r);return r=c.toml,r===e?{path:n,changed:!1,skipped:i}:(await zd.mkdir(wb.dirname(n),{recursive:!0}),await zd.writeFile(n,r,"utf-8"),{path:n,changed:!0,skipped:i,statusLineChanged:c.changed})}var kb,Kd,bb,Yd=h(()=>{"use strict";Zn();sc();kb="# prjct:mcp:start - managed by prjct, do not edit between markers",Kd="# prjct:mcp:end",bb=["model-with-reasoning","cwd","git","context-left","five-hour-limit","weekly-limit","task-progress"];a(rD,"getCodexConfigTomlPath");a(ac,"tomlString");a(sD,"buildPrjctMcpTomlBlock");a(oD,"buildCodexStatusLineToml");a(iD,"hasCodexStatusLine");a(aD,"ensureCodexStatusLineToml");a(cc,"ensureCodexMcpServer")});async function lc(n={}){n.silent||console.log(`
1023
- \u{1F50C} Configuring MCP servers...`);try{await $s.install();let e=n.verifyContext7===!1?null:await $s.verify();n.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){n.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${w(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of cD)try{let t=Ds(),r=await db(e.name,t),s=await ub(e.name,Is[e.name],t);r&&!s.changed?n.silent||console.log(e.ready):n.silent||console.log(e.added)}catch(t){n.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${w(t)}`),console.log(e.manual))}try{if((await tr()).installed){let t=await cc();n.silent||(t.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):t.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){n.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${w(e)}`),console.log(" Run `prjct start` again to retry."))}}var cD,Qd=h(()=>{"use strict";_t();ic();W();Yd();sc();cD=[{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."}];a(lc,"setupMcpServers")});async function uD(n,e=100){try{let{stdout:t}=await q(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:n,maxBuffer:10485760}),r=[],s=null;for(let o of t.split(`
1022
+ ${t}`:r=t;let c=aD(r);return r=c.toml,r===e?{path:n,changed:!1,skipped:i}:(await zd.mkdir(wb.dirname(n),{recursive:!0}),await zd.writeFile(n,r,"utf-8"),{path:n,changed:!0,skipped:i,statusLineChanged:c.changed})}var kb,Kd,bb,Yd=h(()=>{"use strict";er();sc();kb="# prjct:mcp:start - managed by prjct, do not edit between markers",Kd="# prjct:mcp:end",bb=["model-with-reasoning","cwd","git","context-left","five-hour-limit","weekly-limit","task-progress"];a(rD,"getCodexConfigTomlPath");a(ac,"tomlString");a(sD,"buildPrjctMcpTomlBlock");a(oD,"buildCodexStatusLineToml");a(iD,"hasCodexStatusLine");a(aD,"ensureCodexStatusLineToml");a(cc,"ensureCodexMcpServer")});async function lc(n={}){n.silent||console.log(`
1023
+ \u{1F50C} Configuring MCP servers...`);try{await $s.install();let e=n.verifyContext7===!1?null:await $s.verify();n.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){n.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${w(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of cD)try{let t=Ds(),r=await db(e.name,t),s=await ub(e.name,Is[e.name],t);r&&!s.changed?n.silent||console.log(e.ready):n.silent||console.log(e.added)}catch(t){n.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${w(t)}`),console.log(e.manual))}try{if((await nr()).installed){let t=await cc();n.silent||(t.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):t.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){n.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${w(e)}`),console.log(" Run `prjct start` again to retry."))}}var cD,Qd=h(()=>{"use strict";_t();ic();W();Yd();sc();cD=[{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."}];a(lc,"setupMcpServers")});async function uD(n,e=100){try{let{stdout:t}=await q(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:n,maxBuffer:10485760}),r=[],s=null;for(let o of t.split(`
1024
1024
  `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):i&&s&&dD(i)&&s.add(i)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}function dD(n){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(n)&&!n.includes("node_modules/")}async function pD(n,e=100){let t=await uD(n,e),r=new Map,s=new Map;for(let i of t){let c=Array.from(i);for(let l of c)r.set(l,(r.get(l)||0)+1);for(let l=0;l<c.length;l++)for(let u=l+1;u<c.length;u++){let d=mD(c[l],c[u]);s.set(d,(s.get(d)||0)+1)}}let o={};for(let[i,c]of s){let[l,u]=i.split("\0"),d=r.get(l)||0,p=r.get(u)||0;if(d<2||p<2)continue;let m=d+p-c,f=m>0?c/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:r.size,builtAt:new Date().toISOString()}}function mD(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function fD(n,e){b.setDoc(n,Zd,e),uc.delete(n)}function ep(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Zd);if(!e)return uc.delete(n),null;let t=uc.get(n);if(t&&t.updatedAt===e.updated_at)return t.matrix;let r=b.getDoc(n,Zd);return r&&uc.set(n,{matrix:r,updatedAt:e.updated_at}),r}async function gD(n,e){try{let{stdout:t}=await q(`git rev-list --max-count=${e} HEAD`,{cwd:n,maxBuffer:1048576}),r=t.split(`
1025
1025
  `).map(s=>s.trim()).filter(Boolean);return r.length>0?r.join(`
1026
- `):null}catch{return null}}async function Eb(n,e,t=100){let r=await gD(n,t),s=r?ep(e):null;if(s?.historyFingerprint===r)return s;let o=await pD(n,t);return r&&(o.historyFingerprint=r),fD(e,o),o}var Zd,uc,tp=h(()=>{"use strict";$d();J();ue();a(uD,"parseGitLog");a(dD,"isSourceFile");a(pD,"buildMatrix");a(mD,"pairKey");Zd="cochange-index",uc=new Map;a(fD,"saveMatrix");a(ep,"loadMatrix");a(gD,"recentHistoryFingerprint");a(Eb,"indexCoChanges")});import np from"node:fs/promises";import zr from"node:path";function Tb(n){let e=[],t,r=new RegExp(Mh.source,"g");for(;(t=r.exec(n))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function Cb(n,e,t){let r;if(n.startsWith("@/"))r=zr.join(t,"src",n.slice(2));else{let s=zr.dirname(zr.join(t,e));r=zr.resolve(s,n)}for(let s of $h){let o=r+s;try{if((await np.stat(o)).isFile())return zr.relative(t,o)}catch{}}return null}async function hD(n){let e=await Xn(n),t={},r={},s=0,o=await zn(e,50,async i=>{try{let c=await np.readFile(zr.join(n,i),"utf-8"),l=Tb(c),u=[];for(let d of l){let p=await Cb(d,i,n);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:c}of o){t[i]=c,s+=c.length;for(let l of c)r[l]||(r[l]=[]),r[l].push(i)}return{forward:t,reverse:r,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function yD(n){return Object.values(n).reduce((e,t)=>e+t.length,0)}function wD(n,e){let t=n.forward[e]||[];delete n.forward[e];for(let r of t){let s=(n.reverse[r]||[]).filter(o=>o!==e);s.length===0?delete n.reverse[r]:n.reverse[r]=s}}function kD(n,e){let t=n.reverse[e]||[];delete n.reverse[e];let r=[];for(let s of t){let o=(n.forward[s]||[]).filter(i=>i!==e);o.length===0?delete n.forward[s]:n.forward[s]=o,r.push(s)}return r}function bD(n,e,t){if(t.length===0)return;let r=Array.from(new Set(t));n.forward[e]=r;for(let s of r)n.reverse[s]||(n.reverse[s]=[]),n.reverse[s].includes(e)||n.reverse[s].push(e)}async function vD(n,e){try{let t=await np.readFile(zr.join(n,e),"utf-8"),r=Tb(t),s=[];for(let o of r){let i=await Cb(o,e,n);i&&i!==e&&s.push(i)}return{filePath:e,imports:s}}catch{return null}}function Rb(n){return{schemaVersion:2,fileCount:n.fileCount,edgeCount:n.edgeCount,builtAt:n.builtAt}}function SD(n,e){try{b.transaction(n,t=>{t.prepare("DELETE FROM import_graph_edges").run();let r=t.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let[s,o]of Object.entries(e.forward))for(let[i,c]of o.entries())r.run(s,c,i)})}catch{}}function ED(n,e,t,r){try{b.transaction(n,s=>{let o=s.prepare("DELETE FROM import_graph_edges WHERE from_path = ?"),i=s.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let c of new Set([...t,...r]))o.run(c);for(let c of t){let l=e.forward[c]||[];for(let[u,d]of l.entries())i.run(c,d,u)}})}catch{}}function TD(n,e,t){try{let r=b.query(n,"SELECT from_path, to_path FROM import_graph_edges ORDER BY from_path, sort_order, to_path");if(r.length===0){if(t?.edgeCount===0){let l={forward:{},reverse:{},fileCount:t.fileCount,edgeCount:0,builtAt:t.builtAt};return Kr.set(n,{graph:l,updatedAt:e}),l}return null}let s={},o={};for(let l of r)s[l.from_path]||(s[l.from_path]=[]),s[l.from_path].push(l.to_path),o[l.to_path]||(o[l.to_path]=[]),o[l.to_path].push(l.from_path);let i=new Set;for(let[l,u]of Object.entries(s)){i.add(l);for(let d of u)i.add(d)}let c={forward:s,reverse:o,fileCount:t?.fileCount??i.size,edgeCount:r.length,builtAt:t?.builtAt??e};return Kr.set(n,{graph:c,updatedAt:e}),c}catch{return null}}function CD(n,e){b.setDoc(n,dc,Rb(e)),SD(n,e),Kr.delete(n)}function RD(n,e,t,r){b.setDoc(n,dc,Rb(e)),ED(n,e,t,r),Kr.delete(n)}function qo(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",dc);if(!e)return Kr.delete(n),null;let t=Kr.get(n);if(t&&t.updatedAt===e.updated_at)return t.graph;let r=b.getDoc(n,dc),s=TD(n,e.updated_at,r);if(s)return s;if(!r?.forward||!r?.reverse)return null;let o={forward:r.forward,reverse:r.reverse,fileCount:r.fileCount,edgeCount:r.edgeCount,builtAt:r.builtAt};return Kr.set(n,{graph:o,updatedAt:e.updated_at}),o}async function rp(n,e){let t=await hD(n);return CD(e,t),t}async function xb(n,e,t,r=[]){let s=qo(e);if(!s)return rp(n,e);let o=new Set([...t,...r]);for(let l of o)wD(s,l);let i=new Set;for(let l of r)for(let u of kD(s,l))i.add(u);let c=await zn(t,50,l=>vD(n,l));for(let l of c)bD(s,l.filePath,l.imports);return s.edgeCount=yD(s.forward),s.builtAt=new Date().toISOString(),RD(e,s,[...t,...i],r),s}var dc,Kr,pc=h(()=>{"use strict";tu();J();ee();a(Tb,"extractImportSources");a(Cb,"resolveImport");a(hD,"buildGraph");dc="import-graph",Kr=new Map;a(yD,"countEdges");a(wD,"removeOutgoingEdges");a(kD,"removeIncomingEdges");a(bD,"addEdges");a(vD,"importsForFile");a(Rb,"graphMetadata");a(SD,"replacePerFileEdges");a(ED,"updatePerFileEdges");a(TD,"loadGraphFromPerFileEdges");a(CD,"saveGraph");a(RD,"saveGraphUpdate");a(qo,"loadGraph");a(rp,"indexImports");a(xb,"updateImportGraph")});var Db={};N(Db,{CODEX_SKILL_MAX_BYTES:()=>sp,buildCodexSkillContent:()=>ip,installCodexSkill:()=>Ib,verifyCodexPRouterReady:()=>ap});import Ms from"node:fs/promises";import xD from"node:os";import op from"node:path";function _b(){return op.join(xD.homedir(),".codex","skills","prjct","SKILL.md")}function PD(n){return`<!-- ${Ab}: ${JSON.stringify({v:De,h:n})} -->`}function Pb(n){let e=n.match(new RegExp(`<!--\\s*${Ab}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{let t=JSON.parse(e[1]);return{version:t.v??t.version,templateHash:t.h??t.templateHash}}catch{return null}}function AD(n){return xo(n).slice(0,12)}async function jb(){let n=Mt("codex/SKILL.md");if(n)return n;let e=op.join(Xt,"templates","codex","SKILL.md");return await A(e)?Ms.readFile(e,"utf-8"):null}function ip(n){let e=n.trimEnd(),t=AD(e),r=PD(t);return{content:`${e}
1026
+ `):null}catch{return null}}async function Eb(n,e,t=100){let r=await gD(n,t),s=r?ep(e):null;if(s?.historyFingerprint===r)return s;let o=await pD(n,t);return r&&(o.historyFingerprint=r),fD(e,o),o}var Zd,uc,tp=h(()=>{"use strict";$d();J();ue();a(uD,"parseGitLog");a(dD,"isSourceFile");a(pD,"buildMatrix");a(mD,"pairKey");Zd="cochange-index",uc=new Map;a(fD,"saveMatrix");a(ep,"loadMatrix");a(gD,"recentHistoryFingerprint");a(Eb,"indexCoChanges")});import np from"node:fs/promises";import zr from"node:path";function Tb(n){let e=[],t,r=new RegExp(Mh.source,"g");for(;(t=r.exec(n))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function Cb(n,e,t){let r;if(n.startsWith("@/"))r=zr.join(t,"src",n.slice(2));else{let s=zr.dirname(zr.join(t,e));r=zr.resolve(s,n)}for(let s of $h){let o=r+s;try{if((await np.stat(o)).isFile())return zr.relative(t,o)}catch{}}return null}async function hD(n){let e=await zn(n),t={},r={},s=0,o=await Kn(e,50,async i=>{try{let c=await np.readFile(zr.join(n,i),"utf-8"),l=Tb(c),u=[];for(let d of l){let p=await Cb(d,i,n);p&&p!==i&&u.push(p)}return u.length>0?{filePath:i,imports:u}:null}catch{return null}});for(let{filePath:i,imports:c}of o){t[i]=c,s+=c.length;for(let l of c)r[l]||(r[l]=[]),r[l].push(i)}return{forward:t,reverse:r,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function yD(n){return Object.values(n).reduce((e,t)=>e+t.length,0)}function wD(n,e){let t=n.forward[e]||[];delete n.forward[e];for(let r of t){let s=(n.reverse[r]||[]).filter(o=>o!==e);s.length===0?delete n.reverse[r]:n.reverse[r]=s}}function kD(n,e){let t=n.reverse[e]||[];delete n.reverse[e];let r=[];for(let s of t){let o=(n.forward[s]||[]).filter(i=>i!==e);o.length===0?delete n.forward[s]:n.forward[s]=o,r.push(s)}return r}function bD(n,e,t){if(t.length===0)return;let r=Array.from(new Set(t));n.forward[e]=r;for(let s of r)n.reverse[s]||(n.reverse[s]=[]),n.reverse[s].includes(e)||n.reverse[s].push(e)}async function vD(n,e){try{let t=await np.readFile(zr.join(n,e),"utf-8"),r=Tb(t),s=[];for(let o of r){let i=await Cb(o,e,n);i&&i!==e&&s.push(i)}return{filePath:e,imports:s}}catch{return null}}function Rb(n){return{schemaVersion:2,fileCount:n.fileCount,edgeCount:n.edgeCount,builtAt:n.builtAt}}function SD(n,e){try{b.transaction(n,t=>{t.prepare("DELETE FROM import_graph_edges").run();let r=t.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let[s,o]of Object.entries(e.forward))for(let[i,c]of o.entries())r.run(s,c,i)})}catch{}}function ED(n,e,t,r){try{b.transaction(n,s=>{let o=s.prepare("DELETE FROM import_graph_edges WHERE from_path = ?"),i=s.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let c of new Set([...t,...r]))o.run(c);for(let c of t){let l=e.forward[c]||[];for(let[u,d]of l.entries())i.run(c,d,u)}})}catch{}}function TD(n,e,t){try{let r=b.query(n,"SELECT from_path, to_path FROM import_graph_edges ORDER BY from_path, sort_order, to_path");if(r.length===0){if(t?.edgeCount===0){let l={forward:{},reverse:{},fileCount:t.fileCount,edgeCount:0,builtAt:t.builtAt};return Kr.set(n,{graph:l,updatedAt:e}),l}return null}let s={},o={};for(let l of r)s[l.from_path]||(s[l.from_path]=[]),s[l.from_path].push(l.to_path),o[l.to_path]||(o[l.to_path]=[]),o[l.to_path].push(l.from_path);let i=new Set;for(let[l,u]of Object.entries(s)){i.add(l);for(let d of u)i.add(d)}let c={forward:s,reverse:o,fileCount:t?.fileCount??i.size,edgeCount:r.length,builtAt:t?.builtAt??e};return Kr.set(n,{graph:c,updatedAt:e}),c}catch{return null}}function CD(n,e){b.setDoc(n,dc,Rb(e)),SD(n,e),Kr.delete(n)}function RD(n,e,t,r){b.setDoc(n,dc,Rb(e)),ED(n,e,t,r),Kr.delete(n)}function qo(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",dc);if(!e)return Kr.delete(n),null;let t=Kr.get(n);if(t&&t.updatedAt===e.updated_at)return t.graph;let r=b.getDoc(n,dc),s=TD(n,e.updated_at,r);if(s)return s;if(!r?.forward||!r?.reverse)return null;let o={forward:r.forward,reverse:r.reverse,fileCount:r.fileCount,edgeCount:r.edgeCount,builtAt:r.builtAt};return Kr.set(n,{graph:o,updatedAt:e.updated_at}),o}async function rp(n,e){let t=await hD(n);return CD(e,t),t}async function xb(n,e,t,r=[]){let s=qo(e);if(!s)return rp(n,e);let o=new Set([...t,...r]);for(let l of o)wD(s,l);let i=new Set;for(let l of r)for(let u of kD(s,l))i.add(u);let c=await Kn(t,50,l=>vD(n,l));for(let l of c)bD(s,l.filePath,l.imports);return s.edgeCount=yD(s.forward),s.builtAt=new Date().toISOString(),RD(e,s,[...t,...i],r),s}var dc,Kr,pc=h(()=>{"use strict";tu();J();ee();a(Tb,"extractImportSources");a(Cb,"resolveImport");a(hD,"buildGraph");dc="import-graph",Kr=new Map;a(yD,"countEdges");a(wD,"removeOutgoingEdges");a(kD,"removeIncomingEdges");a(bD,"addEdges");a(vD,"importsForFile");a(Rb,"graphMetadata");a(SD,"replacePerFileEdges");a(ED,"updatePerFileEdges");a(TD,"loadGraphFromPerFileEdges");a(CD,"saveGraph");a(RD,"saveGraphUpdate");a(qo,"loadGraph");a(rp,"indexImports");a(xb,"updateImportGraph")});var Db={};N(Db,{CODEX_SKILL_MAX_BYTES:()=>sp,buildCodexSkillContent:()=>ip,installCodexSkill:()=>Ib,verifyCodexPRouterReady:()=>ap});import Ms from"node:fs/promises";import xD from"node:os";import op from"node:path";function _b(){return op.join(xD.homedir(),".codex","skills","prjct","SKILL.md")}function PD(n){return`<!-- ${Ab}: ${JSON.stringify({v:De,h:n})} -->`}function Pb(n){let e=n.match(new RegExp(`<!--\\s*${Ab}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{let t=JSON.parse(e[1]);return{version:t.v??t.version,templateHash:t.h??t.templateHash}}catch{return null}}function AD(n){return xo(n).slice(0,12)}async function jb(){let n=Mt("codex/SKILL.md");if(n)return n;let e=op.join(Xt,"templates","codex","SKILL.md");return await A(e)?Ms.readFile(e,"utf-8"):null}function ip(n){let e=n.trimEnd(),t=AD(e),r=PD(t);return{content:`${e}
1027
1027
 
1028
1028
  ${r}
1029
- `,templateHash:t}}async function Ib(){try{let n=_b(),e=op.dirname(n);await Ms.mkdir(e,{recursive:!0});let t=await A(n),r=await jb();if(!r)return z.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=ip(r),o=Buffer.byteLength(s.content,"utf-8");return o>sp&&z.warn(`Codex SKILL.md is ${o} bytes \u2014 over Codex's ~${sp}-byte hard limit; the skill may be rejected. Trim templates/codex/SKILL.md.`),t&&await Ms.readFile(n,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await Ms.writeFile(n,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(n){return z.warn(`Codex skill warning: ${w(n)}`),{success:!1,action:null}}}async function ap(n={}){let e=_b();if(!(await tr()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let r=await jb();if(!r)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=ip(r),o=a(async()=>n.autoRepair?(await Ib()).success:!1,"maybeRepair"),i="";if(!await A(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await Ms.readFile(e,"utf-8").catch(()=>"");let c=Pb(i);if(!(c?.version===De&&c?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await Ms.readFile(e,"utf-8").catch(()=>""),c=Pb(i),!(c?.version===De&&c?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,message:"Codex p. router ready"}}var Ab,sp,cp=h(()=>{"use strict";_n();W();ee();Po();Vt();Ze();_t();Ab="prjct-codex-router",sp=1024;a(_b,"getCodexSkillPath");a(PD,"getCodexSkillMetadata");a(Pb,"parseCodexSkillMetadata");a(AD,"hashContent");a(jb,"loadCodexSkillTemplate");a(ip,"buildCodexSkillContent");a(Ib,"installCodexSkill");a(ap,"verifyCodexPRouterReady")});import{z as Y}from"zod";var _D,jD,$b,ID,DD,$D,MD,ND,Mb,Nb=h(()=>{"use strict";_D=Y.enum(["low","medium","high"]),jD=Y.enum(["pending","converted","completed","archived","dormant"]),$b=Y.enum(["high","medium","low"]),ID=Y.object({impact:$b,effort:$b}),DD=Y.object({frontend:Y.string().optional(),backend:Y.string().optional(),payments:Y.string().optional(),ai:Y.string().optional(),deploy:Y.string().optional(),other:Y.array(Y.string()).optional()}),$D=Y.object({name:Y.string(),description:Y.string()}),MD=Y.object({name:Y.string(),description:Y.string().optional()}),ND=Y.object({id:Y.string(),text:Y.string(),details:Y.string().optional(),priority:_D,status:jD,tags:Y.array(Y.string()),addedAt:Y.string(),completedAt:Y.string().optional(),convertedTo:Y.string().optional(),source:Y.string().optional(),sourceFiles:Y.array(Y.string()).optional(),painPoints:Y.array(Y.string()).optional(),solutions:Y.array(Y.string()).optional(),filesAffected:Y.array(Y.string()).optional(),impactEffort:ID.optional(),implementationNotes:Y.string().optional(),stack:DD.optional(),modules:Y.array($D).optional(),roles:Y.array(MD).optional(),risks:Y.array(Y.string()).optional(),risksCount:Y.number().optional()}),Mb=Y.object({ideas:Y.array(ND),lastUpdated:Y.string()})});var lp,Ns,mc=h(()=>{"use strict";Nb();vn();ie();sr();or();lp=class extends at{static{a(this,"IdeasStorage")}constructor(){super("ideas.json",Mb)}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(r=>r.status==="pending")}async addIdea(e,t,r={}){let s={id:Xe(),text:t,status:"pending",priority:r.priority||"medium",tags:r.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,r){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:r}:o),lastUpdated:T()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:r})}async archive(e,t){await this.update(e,r=>({ideas:r.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:T()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,r){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:r}:o),lastUpdated:T()}))}async addTags(e,t,r){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...r])]}:o),lastUpdated:T()}))}async removeIdea(e,t){await this.update(e,r=>({ideas:r.ideas.filter(s=>s.id!==t),lastUpdated:T()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(r=>r.status==="pending").length,converted:t.ideas.filter(r=>r.status==="converted").length,archived:t.ideas.filter(r=>r.status==="archived").length}}async cleanup(e){let r=(await this.read(e)).ideas.filter(c=>c.status==="archived");if(r.length<=50)return{removed:0};let s=r.sort((c,l)=>new Date(l.addedAt).getTime()-new Date(c.addedAt).getTime()),o=new Set(s.slice(50).map(c=>c.id)),i=o.size;return await this.update(e,c=>({ideas:c.ideas.filter(l=>!o.has(l.id)),lastUpdated:T()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),r=us(Tn.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<r);if(s.length===0)return 0;ft.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(c=>o.has(c.id)?{...c,status:"dormant"}:c),lastUpdated:T()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Ns=new lp});import OD from"node:fs/promises";function _(n){return n==null?null:typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):JSON.stringify(n)}function en(n){if(n==null)return null;if(typeof n=="number")return n;if(typeof n=="string"){let e=Number(n);return Number.isNaN(e)?null:e}return null}async function Ot(n){try{let e=await OD.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(B(e)||e instanceof SyntaxError)return null;throw e}}var Vo,Jo,fc=h(()=>{"use strict";W();a(_,"toStr");a(en,"toNum");a(Ot,"readJsonSafe");Vo=[{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"}],Jo=[{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 wr from"node:path";async function Ob(n,e,t){let r=wr.join(e,"checksums.json"),s=await Ot(r);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=I.getDb(n),c=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[l,u]of Object.entries(o))c.run(l,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Lb(n,e,t){let r=wr.join(e,"file-scores.json"),s=await Ot(r);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=I.getDb(n),c=i.prepare(`
1029
+ `,templateHash:t}}async function Ib(){try{let n=_b(),e=op.dirname(n);await Ms.mkdir(e,{recursive:!0});let t=await A(n),r=await jb();if(!r)return z.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=ip(r),o=Buffer.byteLength(s.content,"utf-8");return o>sp&&z.warn(`Codex SKILL.md is ${o} bytes \u2014 over Codex's ~${sp}-byte hard limit; the skill may be rejected. Trim templates/codex/SKILL.md.`),t&&await Ms.readFile(n,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await Ms.writeFile(n,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(n){return z.warn(`Codex skill warning: ${w(n)}`),{success:!1,action:null}}}async function ap(n={}){let e=_b();if(!(await nr()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let r=await jb();if(!r)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=ip(r),o=a(async()=>n.autoRepair?(await Ib()).success:!1,"maybeRepair"),i="";if(!await A(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await Ms.readFile(e,"utf-8").catch(()=>"");let c=Pb(i);if(!(c?.version===De&&c?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await Ms.readFile(e,"utf-8").catch(()=>""),c=Pb(i),!(c?.version===De&&c?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,message:"Codex p. router ready"}}var Ab,sp,cp=h(()=>{"use strict";_n();W();ee();Po();Vt();Ze();_t();Ab="prjct-codex-router",sp=1024;a(_b,"getCodexSkillPath");a(PD,"getCodexSkillMetadata");a(Pb,"parseCodexSkillMetadata");a(AD,"hashContent");a(jb,"loadCodexSkillTemplate");a(ip,"buildCodexSkillContent");a(Ib,"installCodexSkill");a(ap,"verifyCodexPRouterReady")});import{z as Y}from"zod";var _D,jD,$b,ID,DD,$D,MD,ND,Mb,Nb=h(()=>{"use strict";_D=Y.enum(["low","medium","high"]),jD=Y.enum(["pending","converted","completed","archived","dormant"]),$b=Y.enum(["high","medium","low"]),ID=Y.object({impact:$b,effort:$b}),DD=Y.object({frontend:Y.string().optional(),backend:Y.string().optional(),payments:Y.string().optional(),ai:Y.string().optional(),deploy:Y.string().optional(),other:Y.array(Y.string()).optional()}),$D=Y.object({name:Y.string(),description:Y.string()}),MD=Y.object({name:Y.string(),description:Y.string().optional()}),ND=Y.object({id:Y.string(),text:Y.string(),details:Y.string().optional(),priority:_D,status:jD,tags:Y.array(Y.string()),addedAt:Y.string(),completedAt:Y.string().optional(),convertedTo:Y.string().optional(),source:Y.string().optional(),sourceFiles:Y.array(Y.string()).optional(),painPoints:Y.array(Y.string()).optional(),solutions:Y.array(Y.string()).optional(),filesAffected:Y.array(Y.string()).optional(),impactEffort:ID.optional(),implementationNotes:Y.string().optional(),stack:DD.optional(),modules:Y.array($D).optional(),roles:Y.array(MD).optional(),risks:Y.array(Y.string()).optional(),risksCount:Y.number().optional()}),Mb=Y.object({ideas:Y.array(ND),lastUpdated:Y.string()})});var lp,Ns,mc=h(()=>{"use strict";Nb();vn();ie();or();ir();lp=class extends at{static{a(this,"IdeasStorage")}constructor(){super("ideas.json",Mb)}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(r=>r.status==="pending")}async addIdea(e,t,r={}){let s={id:Xe(),text:t,status:"pending",priority:r.priority||"medium",tags:r.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,r){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:r}:o),lastUpdated:T()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:r})}async archive(e,t){await this.update(e,r=>({ideas:r.ideas.map(s=>s.id===t?{...s,status:"archived"}:s),lastUpdated:T()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,r){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,priority:r}:o),lastUpdated:T()}))}async addTags(e,t,r){await this.update(e,s=>({ideas:s.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...r])]}:o),lastUpdated:T()}))}async removeIdea(e,t){await this.update(e,r=>({ideas:r.ideas.filter(s=>s.id!==t),lastUpdated:T()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(r=>r.status==="pending").length,converted:t.ideas.filter(r=>r.status==="converted").length,archived:t.ideas.filter(r=>r.status==="archived").length}}async cleanup(e){let r=(await this.read(e)).ideas.filter(c=>c.status==="archived");if(r.length<=50)return{removed:0};let s=r.sort((c,l)=>new Date(l.addedAt).getTime()-new Date(c.addedAt).getTime()),o=new Set(s.slice(50).map(c=>c.id)),i=o.size;return await this.update(e,c=>({ideas:c.ideas.filter(l=>!o.has(l.id)),lastUpdated:T()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),r=us(Tn.IDEA_DORMANT_DAYS),s=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<r);if(s.length===0)return 0;ft.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(c=>o.has(c.id)?{...c,status:"dormant"}:c),lastUpdated:T()})),await this.publishEvent(e,"ideas.dormant",{count:s.length}),s.length}},Ns=new lp});import OD from"node:fs/promises";function _(n){return n==null?null:typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"||typeof n=="bigint"?String(n):JSON.stringify(n)}function en(n){if(n==null)return null;if(typeof n=="number")return n;if(typeof n=="string"){let e=Number(n);return Number.isNaN(e)?null:e}return null}async function Ot(n){try{let e=await OD.readFile(n,"utf-8");return JSON.parse(e)}catch(e){if(B(e)||e instanceof SyntaxError)return null;throw e}}var Vo,Jo,fc=h(()=>{"use strict";W();a(_,"toStr");a(en,"toNum");a(Ot,"readJsonSafe");Vo=[{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"}],Jo=[{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 kr from"node:path";async function Ob(n,e,t){let r=kr.join(e,"checksums.json"),s=await Ot(r);if(s===null){t.skippedFiles.push("index/checksums.json");return}try{let o=s.checksums;if(!o)return;let i=I.getDb(n),c=i.prepare("INSERT OR REPLACE INTO index_checksums (path, checksum) VALUES (?, ?)");i.transaction(()=>{for(let[l,u]of Object.entries(o))c.run(l,u)})(),t.migratedFiles.push("index/checksums.json")}catch(o){t.errors.push({file:"index/checksums.json",error:String(o)})}}async function Lb(n,e,t){let r=kr.join(e,"file-scores.json"),s=await Ot(r);if(s===null){t.skippedFiles.push("index/file-scores.json");return}try{let o=s.scores;if(!o||!Array.isArray(o))return;let i=I.getDb(n),c=i.prepare(`
1030
1030
  INSERT OR REPLACE INTO index_files
1031
1031
  (path, score, size, mtime, language, categories, domain)
1032
1032
  VALUES (?, ?, ?, ?, NULL,
1033
1033
  COALESCE((SELECT categories FROM index_files WHERE path = ?), NULL),
1034
1034
  COALESCE((SELECT domain FROM index_files WHERE path = ?), NULL))
1035
- `);i.transaction(()=>{for(let l of o){let u=_(l.path);u&&c.run(u,en(l.score)??0,en(l.size),_(l.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Fb(n,e,t){let r=wr.join(e,"events.jsonl");try{let o=(await Lt.readFile(r,"utf-8")).split(`
1036
- `).filter(l=>l.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=I.getDb(n),c=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let l of o)try{let u=JSON.parse(l),d=_(u.type??u.action)??"unknown",p=_(u.taskId??u.task_id),m=_(u.timestamp??u.ts)??new Date().toISOString();c.run(d,p,l,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){B(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function Hb(n,e,t){let r=wr.join(e,"learnings.jsonl");try{let o=(await Lt.readFile(r,"utf-8")).split(`
1035
+ `);i.transaction(()=>{for(let l of o){let u=_(l.path);u&&c.run(u,en(l.score)??0,en(l.size),_(l.mtime),u,u)}})(),t.migratedFiles.push("index/file-scores.json")}catch(o){t.errors.push({file:"index/file-scores.json",error:String(o)})}}async function Fb(n,e,t){let r=kr.join(e,"events.jsonl");try{let o=(await Lt.readFile(r,"utf-8")).split(`
1036
+ `).filter(l=>l.trim());if(o.length===0){t.skippedFiles.push("memory/events.jsonl");return}let i=I.getDb(n),c=i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)");i.transaction(()=>{for(let l of o)try{let u=JSON.parse(l),d=_(u.type??u.action)??"unknown",p=_(u.taskId??u.task_id),m=_(u.timestamp??u.ts)??new Date().toISOString();c.run(d,p,l,m)}catch{}})(),t.migratedFiles.push("memory/events.jsonl")}catch(s){B(s)?t.skippedFiles.push("memory/events.jsonl"):t.errors.push({file:"memory/events.jsonl",error:String(s)})}}async function Hb(n,e,t){let r=kr.join(e,"learnings.jsonl");try{let o=(await Lt.readFile(r,"utf-8")).split(`
1037
1037
  `).filter(l=>l.trim());if(o.length===0){t.skippedFiles.push("memory/learnings.jsonl");return}let i=I.getDb(n),c=i.prepare("INSERT OR REPLACE INTO memory (key, domain, value, confidence, updated_at) VALUES (?, ?, ?, ?, ?)");i.transaction(()=>{for(let l of o)try{let u=JSON.parse(l),d=`learning:${_(u.taskId??u.timestamp)??Date.now()}`,p=u.tags,m=p&&p.length>0?_(p[0]):null;c.run(d,m,l,1,_(u.timestamp)??new Date().toISOString())}catch{}})(),t.migratedFiles.push("memory/learnings.jsonl")}catch(s){B(s)?t.skippedFiles.push("memory/learnings.jsonl"):t.errors.push({file:"memory/learnings.jsonl",error:String(s)})}}async function Ub(n,e,t){let s=I.getDb(n).prepare(`
1038
1038
  INSERT OR IGNORE INTO sessions
1039
1039
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
1040
1040
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1041
- `),o=a(u=>{!u||!u.id||s.run(_(u.id),_(u.projectId)??n,_(u.task)??"",_(u.status)??"completed",_(u.startedAt)??new Date().toISOString(),_(u.pausedAt),_(u.completedAt),en(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=wr.join(e,"current.json"),c=await Ot(i);if(c!==null)try{o(c),t.migratedFiles.push("sessions/current.json"),await Lt.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let l=wr.join(e,"archive");try{let u=await Lt.readdir(l);for(let p of u){let m=wr.join(l,p);try{if(!(await Lt.stat(m)).isDirectory())continue;let y=await Lt.readdir(m);for(let k of y){if(!k.endsWith(".json"))continue;let S=wr.join(m,k),E=await Ot(S);if(E!==null)try{o(E),t.migratedFiles.push(`sessions/archive/${p}/${k}`),await Lt.unlink(S).catch(()=>{})}catch(C){t.errors.push({file:`sessions/archive/${p}/${k}`,error:String(C)})}}(await Lt.readdir(m)).length===0&&await Lt.rmdir(m).catch(()=>{})}catch{}}(await Lt.readdir(l).catch(()=>[])).length===0&&await Lt.rmdir(l).catch(()=>{})}catch{}try{(await Lt.readdir(e)).length===0&&await Lt.rmdir(e).catch(()=>{})}catch{}}var Gb=h(()=>{"use strict";W();J();fc();a(Ob,"migrateChecksums");a(Lb,"migrateFileScores");a(Fb,"migrateEventsJsonl");a(Hb,"migrateLearningsJsonl");a(Ub,"migrateSessionFiles")});function up(n,e,t){switch(e){case"state":LD(n,t);break;case"queue":FD(n,t);break;case"ideas":HD(n,t);break;case"shipped":UD(n,t);break;case"metrics":GD(n,t);break;case"analysis":WD(n,t);break}}function LD(n,e){let t=I.getDb(n),r=t.prepare(`
1041
+ `),o=a(u=>{!u||!u.id||s.run(_(u.id),_(u.projectId)??n,_(u.task)??"",_(u.status)??"completed",_(u.startedAt)??new Date().toISOString(),_(u.pausedAt),_(u.completedAt),en(u.duration)??0,u.metrics?JSON.stringify(u.metrics):"{}",u.timeline?JSON.stringify(u.timeline):"[]")},"insertSession"),i=kr.join(e,"current.json"),c=await Ot(i);if(c!==null)try{o(c),t.migratedFiles.push("sessions/current.json"),await Lt.unlink(i).catch(()=>{})}catch(u){t.errors.push({file:"sessions/current.json",error:String(u)})}let l=kr.join(e,"archive");try{let u=await Lt.readdir(l);for(let p of u){let m=kr.join(l,p);try{if(!(await Lt.stat(m)).isDirectory())continue;let y=await Lt.readdir(m);for(let k of y){if(!k.endsWith(".json"))continue;let S=kr.join(m,k),E=await Ot(S);if(E!==null)try{o(E),t.migratedFiles.push(`sessions/archive/${p}/${k}`),await Lt.unlink(S).catch(()=>{})}catch(C){t.errors.push({file:`sessions/archive/${p}/${k}`,error:String(C)})}}(await Lt.readdir(m)).length===0&&await Lt.rmdir(m).catch(()=>{})}catch{}}(await Lt.readdir(l).catch(()=>[])).length===0&&await Lt.rmdir(l).catch(()=>{})}catch{}try{(await Lt.readdir(e)).length===0&&await Lt.rmdir(e).catch(()=>{})}catch{}}var Gb=h(()=>{"use strict";W();J();fc();a(Ob,"migrateChecksums");a(Lb,"migrateFileScores");a(Fb,"migrateEventsJsonl");a(Hb,"migrateLearningsJsonl");a(Ub,"migrateSessionFiles")});function up(n,e,t){switch(e){case"state":LD(n,t);break;case"queue":FD(n,t);break;case"ideas":HD(n,t);break;case"shipped":UD(n,t);break;case"metrics":GD(n,t);break;case"analysis":WD(n,t);break}}function LD(n,e){let t=I.getDb(n),r=t.prepare(`
1042
1042
  INSERT OR REPLACE INTO tasks
1043
1043
  (id, description, type, status, parent_description, branch, linear_id,
1044
1044
  linear_uuid, session_id, feature_id, started_at, completed_at,
@@ -1079,7 +1079,7 @@ ${r}
1079
1079
  INSERT OR IGNORE INTO sessions
1080
1080
  (id, project_id, task, status, started_at, paused_at, completed_at, duration, metrics, timeline)
1081
1081
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
1082
- `).run(_(y.id),_(y.projectId)??n,_(y.task)??"",_(y.status)??"completed",_(y.startedAt)??new Date().toISOString(),_(y.pausedAt),_(y.completedAt),en(y.duration)??0,y.metrics?JSON.stringify(y.metrics):"{}",y.timeline?JSON.stringify(y.timeline):"[]")},"sessionInsert"),u=te.join(c,"current.json"),d=await Ot(u);d!==null&&(l(d),await Me.unlink(u).catch(()=>{}),r++);let p=te.join(c,"archive");try{let y=await Me.readdir(p);for(let k of y){let S=te.join(p,k);try{if(!(await Me.stat(S)).isDirectory())continue;let C=await Me.readdir(S);for(let Q of C){if(!Q.endsWith(".json"))continue;let me=await Ot(te.join(S,Q));me!==null&&(l(me),await Me.unlink(te.join(S,Q)).catch(()=>{}),r++)}(await Me.readdir(S)).length===0&&await Me.rmdir(S).catch(()=>{})}catch{}}(await Me.readdir(p).catch(()=>[])).length===0&&await Me.rmdir(p).catch(()=>{})}catch{}try{(await Me.readdir(c)).length===0&&await Me.rmdir(c).catch(()=>{})}catch{}let m=te.join(e,"index"),f=[...Jo.map(y=>y.filename),"checksums.json","file-scores.json"];for(let y of f){let R=te.join(m,y),k=await Ot(R);if(k===null)continue;let S=Jo.find(E=>E.filename===y);S&&(I.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",S.key,JSON.stringify(k),new Date().toISOString()),dp(n,S.key,k));try{await Me.unlink(R)}catch{}r++}return r}var qD,VD,mp=h(()=>{"use strict";Re();W();J();fc();Gb();Wb();qD=["checksums.json","file-scores.json"],VD=["events.jsonl","learnings.jsonl"];a(JD,"hasLegacySessionArtifacts");a(qb,"hasLegacyArtifacts");a(gc,"migrateJsonToSqlite");a(XD,"createBackup");a(pp,"copyFiles");a(zD,"cleanupJsonFiles");a(hc,"sweepLegacyJson")});function Xb(n){return[...n].sort((e,t)=>{let r=Jb[e.section]-Jb[t.section];return r!==0?r:Vb[e.priority]-Vb[t.priority]})}function fp(n,e){let t=new Set;return n.filter(r=>{let s=e(r);return t.has(s)?!1:(t.add(s),!0)})}var Vb,Jb,gp=h(()=>{"use strict";Vb={critical:0,high:1,medium:2,low:3},Jb={active:0,previously_active:1,backlog:2};a(Xb,"sortBySectionAndPriority");a(fp,"uniqueBy")});var zb={};N(zb,{queueStorage:()=>tt});var hp,tt,Hn=h(()=>{"use strict";vn();Bi();gp();ie();sr();or();hp=class extends at{static{a(this,"QueueStorage")}constructor(){super("queue.json",Ah)}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(r=>r.section==="active"&&!r.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(r=>r.section==="backlog"&&!r.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return Xb(t)[0]||null}async addTask(e,t){let r={...t,id:Xe(),createdAt:T(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,r],lastUpdated:T()})),await this.publishEvent(e,"queue.task_added",{taskId:r.id,description:r.description,priority:r.priority,section:r.section}),r}async addTasks(e,t){let r=T(),s=t.map(o=>({...o,id:Xe(),createdAt:r,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:r})),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,r=>({tasks:r.tasks.filter(s=>s.id!==t),lastUpdated:T()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async deleteByFeatureId(e,t){let r=0;return await this.update(e,s=>{let o=s.tasks.length,i=s.tasks.filter(c=>c.featureId!==t);return r=o-i.length,{tasks:i,lastUpdated:T()}}),r>0&&await this.publishEvent(e,"queue.tasks_removed_by_feature",{featureId:t,count:r}),r}async completeTask(e,t){let r=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(r={...i,completed:!0,completedAt:T()},r):i),lastUpdated:T()})),r){let s=r;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return r}async moveToSection(e,t,r){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:r}:o),lastUpdated:T()}))}async setPriority(e,t,r){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:r}:o),lastUpdated:T()}))}async getTask(e,t){return(await this.read(e)).tasks.find(s=>s.id===t)||null}async updateTask(e,t,r){let s=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(s={...i,...r},s):i),lastUpdated:T()})),s&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),s}async clearCompleted(e){let r=(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()})),r}async removeStaleCompleted(e){let t=await this.read(e),r=us(Tn.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<r);if(s.length===0)return 0;ft.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(c=>!o.has(c.id)),lastUpdated:T()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}},tt=new hp});import{z as oe}from"zod";var KD,Kb,YD,QD,ZD,e$,t$,n$,r$,Yb,Qb=h(()=>{"use strict";KD=oe.enum(["feature","fix","improvement","refactor"]),Kb=oe.enum(["pass","warning","fail","skipped"]),YD=oe.enum(["added","changed","fixed","removed"]),QD=oe.object({hours:oe.number(),minutes:oe.number(),totalMinutes:oe.number()}),ZD=oe.object({filesChanged:oe.number().nullable().optional(),linesAdded:oe.number().nullable().optional(),linesRemoved:oe.number().nullable().optional(),commits:oe.number().nullable().optional()}),e$=oe.object({description:oe.string(),type:YD.optional()}),t$=oe.object({lintStatus:Kb.nullable().optional(),lintDetails:oe.string().optional(),testStatus:Kb.nullable().optional(),testDetails:oe.string().optional()}),n$=oe.object({hash:oe.string().optional(),message:oe.string().optional(),branch:oe.string().optional()}),r$=oe.object({id:oe.string(),name:oe.string(),version:oe.string().nullable().optional(),type:KD,agent:oe.string().optional(),description:oe.string().optional(),changes:oe.array(e$).optional(),codeSnippets:oe.array(oe.string()).optional(),commit:n$.optional(),codeMetrics:ZD.optional(),qualityMetrics:t$.optional(),quantitativeImpact:oe.string().optional(),duration:QD.optional(),tasksCompleted:oe.number().nullable().optional(),shippedAt:oe.string(),featureId:oe.string().optional()}),Yb=oe.object({shipped:oe.array(r$),lastUpdated:oe.string()})});var yp,St,Zb,Yr=h(()=>{"use strict";vn();Qb();ie();sr();or();yp=class extends at{static{a(this,"ShippedStorage")}constructor(){super("shipped.json",Yb)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t,r){let s={...t,id:Xe(),shippedAt:r||T()};return await this.update(e,o=>({shipped:[s,...Array.isArray(o.shipped)?o.shipped:[]],lastUpdated:T()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,r){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=r})}async getStats(e,t="month"){let r=new Date,s;switch(t){case"week":s=new Date(r.getTime()-10080*60*1e3);break;case"month":s=new Date(r.getFullYear(),r.getMonth(),1);break;case"year":s=new Date(r.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,r)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),r=us(Tn.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<r);if(s.length===0)return 0;ft.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=r).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(c=>o.has(c.id)),lastUpdated:T()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},St=new yp,Zb=St});import{z as be}from"zod";var s$,o$,ev,Wz,Bz,qz,tv,nv=h(()=>{"use strict";s$=be.enum(["improving","stable","declining"]),o$=be.object({sprintNumber:be.number(),startDate:be.string(),endDate:be.string(),pointsCompleted:be.number(),tasksCompleted:be.number(),avgVariance:be.number(),estimationAccuracy:be.number()}),ev=be.object({category:be.string(),avgVariance:be.number(),taskCount:be.number()}),Wz=be.object({totalPoints:be.number(),sprints:be.number(),estimatedDate:be.string()}),Bz=be.object({sprints:be.array(o$),averageVelocity:be.number(),velocityTrend:s$,estimationAccuracy:be.number(),overEstimated:be.array(ev),underEstimated:be.array(ev),lastUpdated:be.string()}),qz=be.object({sprintLengthDays:be.number().min(1).max(90).default(7),startDay:be.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:be.number().min(1).max(52).default(6),accuracyTolerance:be.number().min(0).max(100).default(20)}),tv={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var wp,rv,sv=h(()=>{"use strict";nv();or();wp=class extends at{static{a(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:tv,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},rv=new wp});function ov(n){return n.projectName?`# ${n.projectName}
1082
+ `).run(_(y.id),_(y.projectId)??n,_(y.task)??"",_(y.status)??"completed",_(y.startedAt)??new Date().toISOString(),_(y.pausedAt),_(y.completedAt),en(y.duration)??0,y.metrics?JSON.stringify(y.metrics):"{}",y.timeline?JSON.stringify(y.timeline):"[]")},"sessionInsert"),u=te.join(c,"current.json"),d=await Ot(u);d!==null&&(l(d),await Me.unlink(u).catch(()=>{}),r++);let p=te.join(c,"archive");try{let y=await Me.readdir(p);for(let k of y){let S=te.join(p,k);try{if(!(await Me.stat(S)).isDirectory())continue;let C=await Me.readdir(S);for(let Q of C){if(!Q.endsWith(".json"))continue;let me=await Ot(te.join(S,Q));me!==null&&(l(me),await Me.unlink(te.join(S,Q)).catch(()=>{}),r++)}(await Me.readdir(S)).length===0&&await Me.rmdir(S).catch(()=>{})}catch{}}(await Me.readdir(p).catch(()=>[])).length===0&&await Me.rmdir(p).catch(()=>{})}catch{}try{(await Me.readdir(c)).length===0&&await Me.rmdir(c).catch(()=>{})}catch{}let m=te.join(e,"index"),f=[...Jo.map(y=>y.filename),"checksums.json","file-scores.json"];for(let y of f){let R=te.join(m,y),k=await Ot(R);if(k===null)continue;let S=Jo.find(E=>E.filename===y);S&&(I.run(n,"INSERT OR REPLACE INTO index_meta (key, data, updated_at) VALUES (?, ?, ?)",S.key,JSON.stringify(k),new Date().toISOString()),dp(n,S.key,k));try{await Me.unlink(R)}catch{}r++}return r}var qD,VD,mp=h(()=>{"use strict";Re();W();J();fc();Gb();Wb();qD=["checksums.json","file-scores.json"],VD=["events.jsonl","learnings.jsonl"];a(JD,"hasLegacySessionArtifacts");a(qb,"hasLegacyArtifacts");a(gc,"migrateJsonToSqlite");a(XD,"createBackup");a(pp,"copyFiles");a(zD,"cleanupJsonFiles");a(hc,"sweepLegacyJson")});function Xb(n){return[...n].sort((e,t)=>{let r=Jb[e.section]-Jb[t.section];return r!==0?r:Vb[e.priority]-Vb[t.priority]})}function fp(n,e){let t=new Set;return n.filter(r=>{let s=e(r);return t.has(s)?!1:(t.add(s),!0)})}var Vb,Jb,gp=h(()=>{"use strict";Vb={critical:0,high:1,medium:2,low:3},Jb={active:0,previously_active:1,backlog:2};a(Xb,"sortBySectionAndPriority");a(fp,"uniqueBy")});var zb={};N(zb,{queueStorage:()=>tt});var hp,tt,Hn=h(()=>{"use strict";vn();Bi();gp();ie();or();ir();hp=class extends at{static{a(this,"QueueStorage")}constructor(){super("queue.json",Ah)}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(r=>r.section==="active"&&!r.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(r=>r.section==="backlog"&&!r.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return Xb(t)[0]||null}async addTask(e,t){let r={...t,id:Xe(),createdAt:T(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,r],lastUpdated:T()})),await this.publishEvent(e,"queue.task_added",{taskId:r.id,description:r.description,priority:r.priority,section:r.section}),r}async addTasks(e,t){let r=T(),s=t.map(o=>({...o,id:Xe(),createdAt:r,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...s],lastUpdated:r})),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,r=>({tasks:r.tasks.filter(s=>s.id!==t),lastUpdated:T()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async deleteByFeatureId(e,t){let r=0;return await this.update(e,s=>{let o=s.tasks.length,i=s.tasks.filter(c=>c.featureId!==t);return r=o-i.length,{tasks:i,lastUpdated:T()}}),r>0&&await this.publishEvent(e,"queue.tasks_removed_by_feature",{featureId:t,count:r}),r}async completeTask(e,t){let r=null;if(await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?(r={...i,completed:!0,completedAt:T()},r):i),lastUpdated:T()})),r){let s=r;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return r}async moveToSection(e,t,r){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,section:r}:o),lastUpdated:T()}))}async setPriority(e,t,r){await this.update(e,s=>({tasks:s.tasks.map(o=>o.id===t?{...o,priority:r}:o),lastUpdated:T()}))}async getTask(e,t){return(await this.read(e)).tasks.find(s=>s.id===t)||null}async updateTask(e,t,r){let s=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(s={...i,...r},s):i),lastUpdated:T()})),s&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),s}async clearCompleted(e){let r=(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()})),r}async removeStaleCompleted(e){let t=await this.read(e),r=us(Tn.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<r);if(s.length===0)return 0;ft.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(c=>!o.has(c.id)),lastUpdated:T()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}},tt=new hp});import{z as oe}from"zod";var KD,Kb,YD,QD,ZD,e$,t$,n$,r$,Yb,Qb=h(()=>{"use strict";KD=oe.enum(["feature","fix","improvement","refactor"]),Kb=oe.enum(["pass","warning","fail","skipped"]),YD=oe.enum(["added","changed","fixed","removed"]),QD=oe.object({hours:oe.number(),minutes:oe.number(),totalMinutes:oe.number()}),ZD=oe.object({filesChanged:oe.number().nullable().optional(),linesAdded:oe.number().nullable().optional(),linesRemoved:oe.number().nullable().optional(),commits:oe.number().nullable().optional()}),e$=oe.object({description:oe.string(),type:YD.optional()}),t$=oe.object({lintStatus:Kb.nullable().optional(),lintDetails:oe.string().optional(),testStatus:Kb.nullable().optional(),testDetails:oe.string().optional()}),n$=oe.object({hash:oe.string().optional(),message:oe.string().optional(),branch:oe.string().optional()}),r$=oe.object({id:oe.string(),name:oe.string(),version:oe.string().nullable().optional(),type:KD,agent:oe.string().optional(),description:oe.string().optional(),changes:oe.array(e$).optional(),codeSnippets:oe.array(oe.string()).optional(),commit:n$.optional(),codeMetrics:ZD.optional(),qualityMetrics:t$.optional(),quantitativeImpact:oe.string().optional(),duration:QD.optional(),tasksCompleted:oe.number().nullable().optional(),shippedAt:oe.string(),featureId:oe.string().optional()}),Yb=oe.object({shipped:oe.array(r$),lastUpdated:oe.string()})});var yp,St,Zb,Yr=h(()=>{"use strict";vn();Qb();ie();or();ir();yp=class extends at{static{a(this,"ShippedStorage")}constructor(){super("shipped.json",Yb)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((s,o)=>new Date(o.shippedAt).getTime()-new Date(s.shippedAt).getTime()).slice(0,t)}async addShipped(e,t,r){let s={...t,id:Xe(),shippedAt:r||T()};return await this.update(e,o=>({shipped:[s,...Array.isArray(o.shipped)?o.shipped:[]],lastUpdated:T()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(s=>s.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,r){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=r})}async getStats(e,t="month"){let r=new Date,s;switch(t){case"week":s=new Date(r.getTime()-10080*60*1e3);break;case"month":s=new Date(r.getFullYear(),r.getMonth(),1);break;case"year":s=new Date(r.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,s,r)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),r=us(Tn.SHIPPED_RETENTION_DAYS),s=t.shipped.filter(i=>new Date(i.shippedAt)<r);if(s.length===0)return 0;ft.archiveMany(e,s.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=r).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(c=>o.has(c.id)),lastUpdated:T()})),await this.publishEvent(e,"shipped.archived",{count:s.length,oldestShippedAt:s[s.length-1]?.shippedAt}),s.length}},St=new yp,Zb=St});import{z as be}from"zod";var s$,o$,ev,Wz,Bz,qz,tv,nv=h(()=>{"use strict";s$=be.enum(["improving","stable","declining"]),o$=be.object({sprintNumber:be.number(),startDate:be.string(),endDate:be.string(),pointsCompleted:be.number(),tasksCompleted:be.number(),avgVariance:be.number(),estimationAccuracy:be.number()}),ev=be.object({category:be.string(),avgVariance:be.number(),taskCount:be.number()}),Wz=be.object({totalPoints:be.number(),sprints:be.number(),estimatedDate:be.string()}),Bz=be.object({sprints:be.array(o$),averageVelocity:be.number(),velocityTrend:s$,estimationAccuracy:be.number(),overEstimated:be.array(ev),underEstimated:be.array(ev),lastUpdated:be.string()}),qz=be.object({sprintLengthDays:be.number().min(1).max(90).default(7),startDay:be.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:be.number().min(1).max(52).default(6),accuracyTolerance:be.number().min(0).max(100).default(20)}),tv={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""}});var wp,rv,sv=h(()=>{"use strict";nv();ir();wp=class extends at{static{a(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:tv,lastUpdated:""}}getEventType(e){return`velocity.${e}d`}async saveMetrics(e,t){await this.write(e,{metrics:t,lastUpdated:t.lastUpdated}),await this.publishEntityEvent(e,"velocity","updated",{averageVelocity:t.averageVelocity,trend:t.velocityTrend,sprintCount:t.sprints.length})}async getMetrics(e){return(await this.read(e)).metrics}},rv=new wp});function ov(n){return n.projectName?`# ${n.projectName}
1083
1083
  ${n.stack} | ${n.fileCount} files | v${n.version} | Branch: ${n.branch}`:["This is the baseline `prjct` skill installed by the CLI on every invocation.","","No project has been initialized in this cwd yet (`.prjct/` missing). When the user","shows intent (start a task, capture a thought, ship), suggest `prjct init` ONCE","in one line, then run the verb. Don't gate routine captures on init.","","After `prjct sync` runs in an initialized project, this file is regenerated with","project-specific context (name, stack, velocity, active task, recent shipped,","known gotchas). The verb intent map below applies in both states."].join(`
1084
1084
  `)}function i$(n){return n.patterns.length===0?"":`
1085
1085
  ## Patterns
@@ -1121,13 +1121,13 @@ allowed-tools: [${n.allowedTools.map(t=>`"${t}"`).join(", ")}]
1121
1121
  user-invocable: ${e}
1122
1122
  ---`}function h$(n,e){return`${g$(n)}
1123
1123
 
1124
- ${n.body(e)}`}function y$(){return process.env.HOME||f$.homedir()}var kp,bp,fv,gv=h(()=>{"use strict";Rn();Vt();mv();kp=[{name:"prjct",description:cv,allowedTools:[...lv],condition:a(()=>!0,"condition"),body:a(n=>dv(n),"body"),reference:a(()=>pv(),"reference"),referenceFile:uv}];a(g$,"buildFrontmatter");a(h$,"buildSkillContent");a(y$,"homeDir");bp=class{static{a(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},r){let s={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:r?.version??e.stats.version??"0.0.0",fileCount:r?.fileCount??e.stats.fileCount??0,patterns:r?.patterns??[],antiPatterns:r?.antiPatterns??[],recentShipped:r?.recentShipped??[],velocity:r?.velocity??null,backlogCount:r?.backlogCount??t.backlogCount,knownGotchas:r?.knownGotchas??[],pausedTasks:r?.pausedTasks??[],ideasCount:r?.ideasCount??0,shippedCount:r?.shippedCount??0,userPatterns:r?.userPatterns??[]},i=Ls.join(y$(),".claude","skills");for(let l of kp){if(!l.condition(t)){s.skipped.push({name:l.name,reason:"condition not met"}),await Os.rm(Ls.join(i,l.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=h$(l,o),d=Ls.join(i,l.name),p=Ls.join(d,"SKILL.md");await Os.mkdir(d,{recursive:!0}),await Os.writeFile(p,u,"utf-8"),l.reference&&l.referenceFile&&await Os.writeFile(Ls.join(d,l.referenceFile),l.reference(),"utf-8"),s.generated.push({name:l.name,path:p})}catch(u){z.debug(`Failed to generate skill ${l.name}`,{error:Fe(u)}),s.skipped.push({name:l.name,reason:Fe(u)})}}let c=new Set(kp.map(l=>l.name));try{let l=await Os.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of l)u.isDirectory()&&u.name.startsWith("prjct-")&&!c.has(u.name)&&await Os.rm(Ls.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return s.generated.length>0&&z.info("Generated native workflow skills",{count:s.generated.length,skills:s.generated.map(l=>l.name)}),s}getDefinitions(){return kp}},fv=new bp});function yc(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}function wc(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}function kc(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}function bc(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}var hv=h(()=>{"use strict";a(yc,"emptyGitData");a(wc,"emptyStats");a(kc,"emptyCommands");a(bc,"emptyStack")});function yv(n,e){let t=[...n.added,...n.modified],r=new Set(t),s=new Set,o=qo(e);if(o)for(let l of t){let u=o.reverse[l];if(u)for(let d of u)r.has(d)||s.add(d)}let i=Array.from(s),c=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:n.deleted,allAffected:c}}function wv(n){let e=new Set;for(let t of n){let r=t.toLowerCase();(r.endsWith(".tsx")||r.endsWith(".jsx")||r.endsWith(".css")||r.endsWith(".scss")||r.endsWith(".vue")||r.endsWith(".svelte")||r.includes("/components/")||r.includes("/pages/")||r.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(r.includes(".test.")||r.includes(".spec.")||r.includes("__tests__")||r.includes("/test/"))&&e.add("testing"),(r.includes("dockerfile")||r.includes("docker-compose")||r.includes(".dockerignore")||r.includes(".github/")||r.includes("ci/")||r.includes("cd/"))&&e.add("devops"),(r.endsWith(".sql")||r.includes("prisma")||r.includes("drizzle")||r.includes("migration")||r.includes("/db/"))&&e.add("database"),(r.endsWith(".ts")||r.endsWith(".js"))&&!r.includes(".test.")&&!r.includes(".spec.")&&!r.endsWith(".d.ts")&&e.add("backend")}return e}var kv=h(()=>{"use strict";pc();a(yv,"propagateChanges");a(wv,"affectedDomains")});import bv from"node:fs/promises";import w$ from"node:path";function k$(n){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(n).toString(36)}`;let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function b$(n,e={}){let t=await Xn(n,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),r=new Map,s=e.changedFilesHint?.length?new Set(e.changedFilesHint):null,o=await zn(t,100,async i=>{try{let c=w$.join(n,i),l=await bv.stat(c),u=l.mtime.toISOString(),d=e.storedHashes?.get(i),p=s?.has(i)??!1;if(d&&!p&&d.size===l.size&&d.mtime===u&&d.hash)return{path:i,hash:d.hash,size:l.size,mtime:u};let m=await bv.readFile(c,"utf-8");return{path:i,hash:k$(m),size:l.size,mtime:u}}catch{return null}});for(let i of o)r.set(i.path,i);return r}function v$(n,e){let t=[],r=[],s=[];for(let[i,c]of n){let l=e.get(i);l?l.hash!==c.hash?r.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())n.has(i)||o.push(i);return{added:t,modified:r,deleted:o,unchanged:s}}function vp(n,e){let t=b.getDb(n);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let r=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)r.run(s.path,s.hash,s.size,s.mtime)})(),b.setDoc(n,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function S$(n){let e=new Map;try{let t=b.query(n,"SELECT path, checksum, size, mtime FROM index_checksums");for(let r of t)e.set(r.path,{path:r.path,hash:r.checksum,size:r.size||0,mtime:r.mtime||""})}catch{}return e}async function Sp(n,e,t){let r=S$(e),s=await b$(n,{storedHashes:r,changedFilesHint:t});return{diff:v$(s,r),currentHashes:s}}function vv(n){return b.hasDoc(n,"file-hashes-meta")}var Sv=h(()=>{"use strict";J();ee();a(k$,"hashContent");a(b$,"computeHashes");a(v$,"diffHashes");a(vp,"saveHashes");a(S$,"loadHashes");a(Sp,"detectChanges");a(vv,"hasHashRegistry")});async function Ev(n){let{projectId:e,projectPath:t,isFullSync:r,changedFilesHint:s}=n,o=!0,i=new Set,c,l=[],u=[];if(!r&&vv(e))try{let{diff:d,currentHashes:p}=await Sp(t,e,s),m=d.added.length+d.modified.length+d.deleted.length;if(m===0&&!s?.length)o=!1,c={isIncremental:!0,filesChanged:0,filesUnchanged:d.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let f=yv(d,e);i=wv(f.allAffected),l=[...d.added,...d.modified].filter(Ep),u=d.deleted.filter(Ep),o=f.allAffected.some(Ep),c={isIncremental:!0,filesChanged:m,filesUnchanged:d.unchanged.length,indexesRebuilt:o,affectedDomains:Array.from(i)}}vp(e,p)}catch(d){z.debug("Incremental detection failed, falling back to full sync",{error:w(d)})}else try{let{currentHashes:d}=await Sp(t,e,s);vp(e,d)}catch(d){z.debug("Hash computation failed (non-critical)",{error:w(d)})}return{shouldRebuildIndexes:o,changedDomains:i,incrementalInfo:c,changedSourceFiles:l,deletedSourceFiles:u}}function Ep(n){let e=n.substring(n.lastIndexOf("."));return E$.has(e)}var E$,Tv=h(()=>{"use strict";kv();Sv();W();Vt();E$=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);a(Ev,"detectIncrementalChanges");a(Ep,"isSourceFile")});import{z as Ue}from"zod";function Pv(n,e="default"){let t=Cv[e]||Cv.default;return n/1e3*t}function vc(n){return n<.01?`$${(n*100).toFixed(2)}\xA2`:`$${n.toFixed(2)}`}var T$,C$,Rv,xv,Cv,Sc=h(()=>{"use strict";T$=Ue.object({date:Ue.string(),tokensSaved:Ue.number(),syncs:Ue.number(),avgCompressionRate:Ue.number(),totalDuration:Ue.number()}),C$=Ue.object({agentName:Ue.string(),usageCount:Ue.number(),tokensSaved:Ue.number()}),Rv=Ue.object({totalTokensSaved:Ue.number(),avgCompressionRate:Ue.number(),syncCount:Ue.number(),watchTriggers:Ue.number(),avgSyncDuration:Ue.number(),totalSyncDuration:Ue.number(),agentUsage:Ue.array(C$),dailyStats:Ue.array(T$),firstSync:Ue.string(),lastUpdated:Ue.string()}),xv={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Cv={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};a(Pv,"estimateCostSaved");a(vc,"formatCost")});var Tp,Fs,Cp=h(()=>{"use strict";Sc();ie();or();Tp=class extends at{static{a(this,"MetricsStorage")}constructor(){super("metrics.json",Rv)}getDefault(){return{...xv}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let r=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?r/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let c=i.syncCount+1,l=i.totalTokensSaved+r,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/c,p=[...i.dailyStats],m=p.findIndex(S=>S.date===o);if(m>=0){let S=p[m];p[m]={...S,tokensSaved:S.tokensSaved+r,syncs:S.syncs+1,avgCompressionRate:(S.avgCompressionRate*S.syncs+s)/(S.syncs+1),totalDuration:S.totalDuration+t.duration}}else p.push({date:o,tokensSaved:r,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let f=new Date;f.setDate(f.getDate()-90);let y=f.toISOString().split("T")[0],R=p.filter(S=>S.date>=y),k=[...i.agentUsage];if(t.agents)for(let S of t.agents){let E=k.findIndex(C=>C.agentName===S);E>=0?k[E]={...k[E],usageCount:k[E].usageCount+1,tokensSaved:k[E].tokensSaved+Math.floor(r/t.agents.length)}:k.push({agentName:S,usageCount:1,tokensSaved:Math.floor(r/t.agents.length)})}return{totalTokensSaved:l,avgCompressionRate:d,syncCount:c,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/c,totalSyncDuration:u,agentUsage:k,dailyStats:R,firstSync:i.firstSync||T(),lastUpdated:T()}})}async getSummary(e){let t=await this.read(e),r=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=r.reduce((l,u)=>l+u.tokensSaved,0),i=s.reduce((l,u)=>l+u.tokensSaved,0),c=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Pv(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((l,u)=>u.usageCount-l.usageCount).slice(0,5),last30DaysTokens:o,trend:c}}async getDailyStats(e,t=30){let r=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return r.dailyStats.filter(i=>i.date>=o).sort((i,c)=>i.date.localeCompare(c.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let r=t.toISOString().split("T")[0];return e.filter(s=>s.date>=r)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let r=new Date;r.setDate(r.getDate()-60);let s=r.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},Fs=new Tp});import R$ from"node:path";function x$(n){return pa(R$.resolve(n))}function zo(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"")}function P$(n){return fp(n,e=>`${zo(e.name)}::${zo(e.source)}`)}function A$(n){return fp(n,e=>`${zo(e.issue)}::${zo(e.file)}::${zo(e.source)}`)}var Rp,_$,Av,_v=h(()=>{"use strict";J();gp();Po();a(x$,"repoHash");a(zo,"normalizeKey");a(P$,"dedupePatterns");a(A$,"dedupeAntiPatterns");Rp=class{static{a(this,"PatternExtractor")}async extract(e){let t=x$(e.projectPath),r=[];if(e.context7Verified)for(let u of e.frameworks)r.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let s=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=P$([...r,...s]),c=A$([...o]),l=`analysis:derived-rules:${t}`;return I.setDoc(e.projectId,l,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:c,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:c,repoPathHash:t}}},_$=new Rp,Av=_$});async function jv(n,e,t){let r=0;try{let c=Bo(n);if(c)for(let l of Object.values(c.documents))r+=l.length}catch(c){z.debug("Could not load BM25 index for metrics",{error:w(c)})}r===0&&(r=e.fileCount*j$);let s=0,o=r>0?Math.max(0,(r-s)/r):0;try{await Fs.recordSync(n,{originalSize:r,filteredSize:s,duration:t,isWatch:!1})}catch(c){z.debug("Failed to record sync metrics",{error:w(c)})}let i={};try{let c=Bo(n);c&&(i.bm25Files=c.totalDocs,i.bm25AvgTokens=Math.round(c.avgDocLength),i.bm25VocabSize=Object.keys(c.invertedIndex).length);let l=qo(n);l&&(i.importEdges=l.edgeCount,i.importFiles=l.fileCount);let u=ep(n);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(c){z.debug("Could not load index stats",{error:w(c)})}return{duration:t,originalSize:r,filteredSize:s,compressionRate:o,indexes:i}}async function Iv(n,e,t,r,s,o){try{let i=t.recentCommits[0]?.hash||null,c=[],l=[],u;try{u=await X.getAggregatedFeedback(n),u.patternsDiscovered.length>0&&(c=u.patternsDiscovered.map(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),u.knownGotchas.length>0&&(l=u.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let d=await Av.extract({projectId:n,projectPath:e,languages:r.languages,frameworks:Array.from(new Set([...r.frameworks,...s.frameworks])),feedback:u,context7Verified:o});c=d.patterns,l=d.antiPatterns,await Ye.saveDraft(n,{projectId:n,languages:r.languages,frameworks:r.frameworks,configFiles:[],fileCount:r.fileCount,patterns:c,antiPatterns:l,analyzedAt:T(),status:"draft",commitHash:i??void 0})}catch(i){z.debug("Failed to save draft analysis (non-critical)",{error:w(i)})}}async function Dv(n){try{let[e,t,r,s,o]=await Promise.all([St.archiveOldShipped(n).catch(()=>0),Ns.markDormantIdeas(n).catch(()=>0),tt.removeStaleCompleted(n).catch(()=>0),X.archiveStalePausedTasks(n).catch(()=>[]),ze.capEntries(n).catch(()=>0)]),i=e+t+r+s.length+o;if(i>0){z.info("Archived stale data",{shipped:e,dormant:t,staleQueue:r,stalePaused:s.length,memoryCapped:o,total:i});let c=ft.getStats(n);z.debug("Archive stats",c)}}catch(e){z.debug("Archival failed (non-critical)",{error:w(e)})}}var j$,$v=h(()=>{"use strict";tc();tp();pc();yr();sr();mc();Cp();Hn();Yr();It();W();ie();Vt();xn();_v();j$=200;a(jv,"recordSyncMetrics");a(Iv,"saveDraftAnalysis");a(Dv,"archiveStaleData")});function Mv(){return Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||I$}function Nv(n,e){let t,r=new Promise((s,o)=>{t=setTimeout(()=>o(new Error(`sync phase '${e}' timed out after ${Mv()}ms`)),Mv())});return Promise.race([n,r]).finally(()=>{t&&clearTimeout(t)})}async function wt(n,e){let t=Date.now();z.debug("sync phase start",{phase:n});try{let r=await e();return z.debug("sync phase done",{phase:n,ms:Date.now()-t}),r}catch(r){throw z.debug("sync phase failed",{phase:n,ms:Date.now()-t,error:Fe(r)}),r}}var I$,Ov=h(()=>{"use strict";Rn();Vt();I$=6e4;a(Mv,"syncPhaseTimeoutMs");a(Nv,"withPhaseTimeout");a(wt,"runSyncPhase")});import xp from"node:fs/promises";import Ec from"node:path";var Pp,Ap,Lv,Fv=h(()=>{"use strict";W();ee();Pp=".prjct/.prjct-state.md",Ap=class{static{a(this,"LocalStateGenerator")}async generate(e,t){let r=Ec.join(e,Pp);await xp.mkdir(Ec.dirname(r),{recursive:!0});let s=this.toMarkdown(t);await xp.writeFile(r,s,"utf-8")}async remove(e){try{await xp.unlink(Ec.join(e,Pp))}catch(t){if(!B(t))throw t}}async exists(e){let t=Ec.join(e,Pp);return A(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let r=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${r.description}**`),t.push(""),t.push(`- Started: ${r.startedAt}`),r.linearId&&t.push(`- Linear: ${r.linearId}`),r.branch&&t.push(`- Branch: ${r.branch}`),t.push(`- Status: ${r.status||"active"}`),t.push(""),r.subtasks&&r.subtasks.length>0){t.push("### Subtasks"),t.push(""),r.subtasks.forEach((c,l)=>{let u=c.status==="completed"?"\u2705":c.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=l===r.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${l+1}. ${u} ${c.description}${d}`)}),t.push("");let s=r.subtasks.filter(c=>c.status==="completed").length,o=r.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let r=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${r.description}**`),t.push(""),t.push(`- Status: ${r.status}`),r.prUrl&&t.push(`- PR: ${r.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
1124
+ ${n.body(e)}`}function y$(){return process.env.HOME||f$.homedir()}var kp,bp,fv,gv=h(()=>{"use strict";Rn();Vt();mv();kp=[{name:"prjct",description:cv,allowedTools:[...lv],condition:a(()=>!0,"condition"),body:a(n=>dv(n),"body"),reference:a(()=>pv(),"reference"),referenceFile:uv}];a(g$,"buildFrontmatter");a(h$,"buildSkillContent");a(y$,"homeDir");bp=class{static{a(this,"SkillGenerator")}async generateAndInstall(e,t={backlogCount:0,completedTaskCount:0,pausedTaskCount:0,hasActiveTask:!1},r){let s={generated:[],skipped:[]},o={projectName:e.stats.name,stack:[...e.stats.languages,...e.stats.frameworks].filter(Boolean).join("/")||e.stats.ecosystem,branch:e.git.branch,commands:e.commands,projectId:e.projectId,version:r?.version??e.stats.version??"0.0.0",fileCount:r?.fileCount??e.stats.fileCount??0,patterns:r?.patterns??[],antiPatterns:r?.antiPatterns??[],recentShipped:r?.recentShipped??[],velocity:r?.velocity??null,backlogCount:r?.backlogCount??t.backlogCount,knownGotchas:r?.knownGotchas??[],pausedTasks:r?.pausedTasks??[],ideasCount:r?.ideasCount??0,shippedCount:r?.shippedCount??0,userPatterns:r?.userPatterns??[]},i=Ls.join(y$(),".claude","skills");for(let l of kp){if(!l.condition(t)){s.skipped.push({name:l.name,reason:"condition not met"}),await Os.rm(Ls.join(i,l.name),{recursive:!0,force:!0}).catch(()=>{});continue}try{let u=h$(l,o),d=Ls.join(i,l.name),p=Ls.join(d,"SKILL.md");await Os.mkdir(d,{recursive:!0}),await Os.writeFile(p,u,"utf-8"),l.reference&&l.referenceFile&&await Os.writeFile(Ls.join(d,l.referenceFile),l.reference(),"utf-8"),s.generated.push({name:l.name,path:p})}catch(u){z.debug(`Failed to generate skill ${l.name}`,{error:Fe(u)}),s.skipped.push({name:l.name,reason:Fe(u)})}}let c=new Set(kp.map(l=>l.name));try{let l=await Os.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let u of l)u.isDirectory()&&u.name.startsWith("prjct-")&&!c.has(u.name)&&await Os.rm(Ls.join(i,u.name),{recursive:!0,force:!0}).catch(()=>{})}catch{}return s.generated.length>0&&z.info("Generated native workflow skills",{count:s.generated.length,skills:s.generated.map(l=>l.name)}),s}getDefinitions(){return kp}},fv=new bp});function yc(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}function wc(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}function kc(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}function bc(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}var hv=h(()=>{"use strict";a(yc,"emptyGitData");a(wc,"emptyStats");a(kc,"emptyCommands");a(bc,"emptyStack")});function yv(n,e){let t=[...n.added,...n.modified],r=new Set(t),s=new Set,o=qo(e);if(o)for(let l of t){let u=o.reverse[l];if(u)for(let d of u)r.has(d)||s.add(d)}let i=Array.from(s),c=[...t,...i];return{directlyChanged:t,affectedByImports:i,deleted:n.deleted,allAffected:c}}function wv(n){let e=new Set;for(let t of n){let r=t.toLowerCase();(r.endsWith(".tsx")||r.endsWith(".jsx")||r.endsWith(".css")||r.endsWith(".scss")||r.endsWith(".vue")||r.endsWith(".svelte")||r.includes("/components/")||r.includes("/pages/")||r.includes("/app/"))&&(e.add("frontend"),e.add("uxui")),(r.includes(".test.")||r.includes(".spec.")||r.includes("__tests__")||r.includes("/test/"))&&e.add("testing"),(r.includes("dockerfile")||r.includes("docker-compose")||r.includes(".dockerignore")||r.includes(".github/")||r.includes("ci/")||r.includes("cd/"))&&e.add("devops"),(r.endsWith(".sql")||r.includes("prisma")||r.includes("drizzle")||r.includes("migration")||r.includes("/db/"))&&e.add("database"),(r.endsWith(".ts")||r.endsWith(".js"))&&!r.includes(".test.")&&!r.includes(".spec.")&&!r.endsWith(".d.ts")&&e.add("backend")}return e}var kv=h(()=>{"use strict";pc();a(yv,"propagateChanges");a(wv,"affectedDomains")});import bv from"node:fs/promises";import w$ from"node:path";function k$(n){if(typeof Bun<"u"&&Bun.hash)return`xxh64:${Bun.hash(n).toString(36)}`;let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return`fnv1a:${(e>>>0).toString(36)}`}async function b$(n,e={}){let t=await zn(n,{skipDotfiles:!0,dotfileAllowlist:[".env.example"]}),r=new Map,s=e.changedFilesHint?.length?new Set(e.changedFilesHint):null,o=await Kn(t,100,async i=>{try{let c=w$.join(n,i),l=await bv.stat(c),u=l.mtime.toISOString(),d=e.storedHashes?.get(i),p=s?.has(i)??!1;if(d&&!p&&d.size===l.size&&d.mtime===u&&d.hash)return{path:i,hash:d.hash,size:l.size,mtime:u};let m=await bv.readFile(c,"utf-8");return{path:i,hash:k$(m),size:l.size,mtime:u}}catch{return null}});for(let i of o)r.set(i.path,i);return r}function v$(n,e){let t=[],r=[],s=[];for(let[i,c]of n){let l=e.get(i);l?l.hash!==c.hash?r.push(i):s.push(i):t.push(i)}let o=[];for(let i of e.keys())n.has(i)||o.push(i);return{added:t,modified:r,deleted:o,unchanged:s}}function vp(n,e){let t=b.getDb(n);t.transaction(()=>{t.prepare("DELETE FROM index_checksums").run();let r=t.prepare("INSERT INTO index_checksums (path, checksum, size, mtime) VALUES (?, ?, ?, ?)");for(let[,s]of e)r.run(s.path,s.hash,s.size,s.mtime)})(),b.setDoc(n,"file-hashes-meta",{fileCount:e.size,builtAt:new Date().toISOString()})}function S$(n){let e=new Map;try{let t=b.query(n,"SELECT path, checksum, size, mtime FROM index_checksums");for(let r of t)e.set(r.path,{path:r.path,hash:r.checksum,size:r.size||0,mtime:r.mtime||""})}catch{}return e}async function Sp(n,e,t){let r=S$(e),s=await b$(n,{storedHashes:r,changedFilesHint:t});return{diff:v$(s,r),currentHashes:s}}function vv(n){return b.hasDoc(n,"file-hashes-meta")}var Sv=h(()=>{"use strict";J();ee();a(k$,"hashContent");a(b$,"computeHashes");a(v$,"diffHashes");a(vp,"saveHashes");a(S$,"loadHashes");a(Sp,"detectChanges");a(vv,"hasHashRegistry")});async function Ev(n){let{projectId:e,projectPath:t,isFullSync:r,changedFilesHint:s}=n,o=!0,i=new Set,c,l=[],u=[];if(!r&&vv(e))try{let{diff:d,currentHashes:p}=await Sp(t,e,s),m=d.added.length+d.modified.length+d.deleted.length;if(m===0&&!s?.length)o=!1,c={isIncremental:!0,filesChanged:0,filesUnchanged:d.unchanged.length,indexesRebuilt:!1,affectedDomains:[]};else{let f=yv(d,e);i=wv(f.allAffected),l=[...d.added,...d.modified].filter(Ep),u=d.deleted.filter(Ep),o=f.allAffected.some(Ep),c={isIncremental:!0,filesChanged:m,filesUnchanged:d.unchanged.length,indexesRebuilt:o,affectedDomains:Array.from(i)}}vp(e,p)}catch(d){z.debug("Incremental detection failed, falling back to full sync",{error:w(d)})}else try{let{currentHashes:d}=await Sp(t,e,s);vp(e,d)}catch(d){z.debug("Hash computation failed (non-critical)",{error:w(d)})}return{shouldRebuildIndexes:o,changedDomains:i,incrementalInfo:c,changedSourceFiles:l,deletedSourceFiles:u}}function Ep(n){let e=n.substring(n.lastIndexOf("."));return E$.has(e)}var E$,Tv=h(()=>{"use strict";kv();Sv();W();Vt();E$=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);a(Ev,"detectIncrementalChanges");a(Ep,"isSourceFile")});import{z as Ue}from"zod";function Pv(n,e="default"){let t=Cv[e]||Cv.default;return n/1e3*t}function vc(n){return n<.01?`$${(n*100).toFixed(2)}\xA2`:`$${n.toFixed(2)}`}var T$,C$,Rv,xv,Cv,Sc=h(()=>{"use strict";T$=Ue.object({date:Ue.string(),tokensSaved:Ue.number(),syncs:Ue.number(),avgCompressionRate:Ue.number(),totalDuration:Ue.number()}),C$=Ue.object({agentName:Ue.string(),usageCount:Ue.number(),tokensSaved:Ue.number()}),Rv=Ue.object({totalTokensSaved:Ue.number(),avgCompressionRate:Ue.number(),syncCount:Ue.number(),watchTriggers:Ue.number(),avgSyncDuration:Ue.number(),totalSyncDuration:Ue.number(),agentUsage:Ue.array(C$),dailyStats:Ue.array(T$),firstSync:Ue.string(),lastUpdated:Ue.string()}),xv={totalTokensSaved:0,avgCompressionRate:0,syncCount:0,watchTriggers:0,avgSyncDuration:0,totalSyncDuration:0,agentUsage:[],dailyStats:[],firstSync:"",lastUpdated:""},Cv={"claude-opus-4.5":.005,"claude-sonnet-4.5":.003,"claude-haiku-4.5":.001,"claude-opus-4":.015,"claude-sonnet-4":.003,"gpt-4o":.0025,"gemini-pro":.00125,default:.003};a(Pv,"estimateCostSaved");a(vc,"formatCost")});var Tp,Fs,Cp=h(()=>{"use strict";Sc();ie();ir();Tp=class extends at{static{a(this,"MetricsStorage")}constructor(){super("metrics.json",Rv)}getDefault(){return{...xv}}getEventType(e){return`metrics.${e}d`}async recordSync(e,t){let r=Math.max(0,t.originalSize-t.filteredSize),s=t.originalSize>0?r/t.originalSize:0,o=new Date().toISOString().split("T")[0];await this.update(e,i=>{let c=i.syncCount+1,l=i.totalTokensSaved+r,u=i.totalSyncDuration+t.duration,d=i.syncCount===0?s:(i.avgCompressionRate*i.syncCount+s)/c,p=[...i.dailyStats],m=p.findIndex(S=>S.date===o);if(m>=0){let S=p[m];p[m]={...S,tokensSaved:S.tokensSaved+r,syncs:S.syncs+1,avgCompressionRate:(S.avgCompressionRate*S.syncs+s)/(S.syncs+1),totalDuration:S.totalDuration+t.duration}}else p.push({date:o,tokensSaved:r,syncs:1,avgCompressionRate:s,totalDuration:t.duration});let f=new Date;f.setDate(f.getDate()-90);let y=f.toISOString().split("T")[0],R=p.filter(S=>S.date>=y),k=[...i.agentUsage];if(t.agents)for(let S of t.agents){let E=k.findIndex(C=>C.agentName===S);E>=0?k[E]={...k[E],usageCount:k[E].usageCount+1,tokensSaved:k[E].tokensSaved+Math.floor(r/t.agents.length)}:k.push({agentName:S,usageCount:1,tokensSaved:Math.floor(r/t.agents.length)})}return{totalTokensSaved:l,avgCompressionRate:d,syncCount:c,watchTriggers:i.watchTriggers+(t.isWatch?1:0),avgSyncDuration:u/c,totalSyncDuration:u,agentUsage:k,dailyStats:R,firstSync:i.firstSync||T(),lastUpdated:T()}})}async getSummary(e){let t=await this.read(e),r=this.getLast30Days(t.dailyStats),s=this.getPrev30Days(t.dailyStats),o=r.reduce((l,u)=>l+u.tokensSaved,0),i=s.reduce((l,u)=>l+u.tokensSaved,0),c=i>0?(o-i)/i*100:0;return{totalTokensSaved:t.totalTokensSaved,estimatedCostSaved:Pv(t.totalTokensSaved),compressionRate:t.avgCompressionRate,syncCount:t.syncCount,avgSyncDuration:t.avgSyncDuration,topAgents:[...t.agentUsage].sort((l,u)=>u.usageCount-l.usageCount).slice(0,5),last30DaysTokens:o,trend:c}}async getDailyStats(e,t=30){let r=await this.read(e),s=new Date;s.setDate(s.getDate()-t);let o=s.toISOString().split("T")[0];return r.dailyStats.filter(i=>i.date>=o).sort((i,c)=>i.date.localeCompare(c.date))}getLast30Days(e){let t=new Date;t.setDate(t.getDate()-30);let r=t.toISOString().split("T")[0];return e.filter(s=>s.date>=r)}getPrev30Days(e){let t=new Date;t.setDate(t.getDate()-30);let r=new Date;r.setDate(r.getDate()-60);let s=r.toISOString().split("T")[0],o=t.toISOString().split("T")[0];return e.filter(i=>i.date>=s&&i.date<o)}},Fs=new Tp});import R$ from"node:path";function x$(n){return pa(R$.resolve(n))}function zo(n){return n.toLowerCase().replace(/[^a-z0-9]+/g,"")}function P$(n){return fp(n,e=>`${zo(e.name)}::${zo(e.source)}`)}function A$(n){return fp(n,e=>`${zo(e.issue)}::${zo(e.file)}::${zo(e.source)}`)}var Rp,_$,Av,_v=h(()=>{"use strict";J();gp();Po();a(x$,"repoHash");a(zo,"normalizeKey");a(P$,"dedupePatterns");a(A$,"dedupeAntiPatterns");Rp=class{static{a(this,"PatternExtractor")}async extract(e){let t=x$(e.projectPath),r=[];if(e.context7Verified)for(let u of e.frameworks)r.push({name:`${u} API validation via Context7`,description:`Validate ${u} APIs against current documentation through Context7 before implementation.`,framework:u,source:"context7",confidence:.7});let s=(e.feedback?.patternsDiscovered||[]).map(u=>({name:u,description:`Confirmed during completed tasks: ${u}`,source:"feedback",confidence:.75})),o=(e.feedback?.knownGotchas||[]).map(u=>({issue:u,file:"multiple",suggestion:`Recurring gotcha. Prevent this pattern during implementation: ${u}`,source:"feedback",severity:"medium",confidence:.7})),i=P$([...r,...s]),c=A$([...o]),l=`analysis:derived-rules:${t}`;return I.setDoc(e.projectId,l,{projectId:e.projectId,repoPathHash:t,patterns:i,antiPatterns:c,updatedAt:new Date().toISOString(),version:1}),{patterns:i,antiPatterns:c,repoPathHash:t}}},_$=new Rp,Av=_$});async function jv(n,e,t){let r=0;try{let c=Bo(n);if(c)for(let l of Object.values(c.documents))r+=l.length}catch(c){z.debug("Could not load BM25 index for metrics",{error:w(c)})}r===0&&(r=e.fileCount*j$);let s=0,o=r>0?Math.max(0,(r-s)/r):0;try{await Fs.recordSync(n,{originalSize:r,filteredSize:s,duration:t,isWatch:!1})}catch(c){z.debug("Failed to record sync metrics",{error:w(c)})}let i={};try{let c=Bo(n);c&&(i.bm25Files=c.totalDocs,i.bm25AvgTokens=Math.round(c.avgDocLength),i.bm25VocabSize=Object.keys(c.invertedIndex).length);let l=qo(n);l&&(i.importEdges=l.edgeCount,i.importFiles=l.fileCount);let u=ep(n);u&&(i.cochangeCommits=u.commitsAnalyzed,i.cochangeFiles=u.filesAnalyzed)}catch(c){z.debug("Could not load index stats",{error:w(c)})}return{duration:t,originalSize:r,filteredSize:s,compressionRate:o,indexes:i}}async function Iv(n,e,t,r,s,o){try{let i=t.recentCommits[0]?.hash||null,c=[],l=[],u;try{u=await X.getAggregatedFeedback(n),u.patternsDiscovered.length>0&&(c=u.patternsDiscovered.map(p=>({name:p,description:`Discovered during task execution: ${p}`,source:"feedback",confidence:.74}))),u.knownGotchas.length>0&&(l=u.knownGotchas.map(p=>({issue:p,file:"multiple",suggestion:`Recurring issue reported across tasks: ${p}`,source:"feedback",severity:"medium",confidence:.7})))}catch{}let d=await Av.extract({projectId:n,projectPath:e,languages:r.languages,frameworks:Array.from(new Set([...r.frameworks,...s.frameworks])),feedback:u,context7Verified:o});c=d.patterns,l=d.antiPatterns,await Ye.saveDraft(n,{projectId:n,languages:r.languages,frameworks:r.frameworks,configFiles:[],fileCount:r.fileCount,patterns:c,antiPatterns:l,analyzedAt:T(),status:"draft",commitHash:i??void 0})}catch(i){z.debug("Failed to save draft analysis (non-critical)",{error:w(i)})}}async function Dv(n){try{let[e,t,r,s,o]=await Promise.all([St.archiveOldShipped(n).catch(()=>0),Ns.markDormantIdeas(n).catch(()=>0),tt.removeStaleCompleted(n).catch(()=>0),X.archiveStalePausedTasks(n).catch(()=>[]),ze.capEntries(n).catch(()=>0)]),i=e+t+r+s.length+o;if(i>0){z.info("Archived stale data",{shipped:e,dormant:t,staleQueue:r,stalePaused:s.length,memoryCapped:o,total:i});let c=ft.getStats(n);z.debug("Archive stats",c)}}catch(e){z.debug("Archival failed (non-critical)",{error:w(e)})}}var j$,$v=h(()=>{"use strict";tc();tp();pc();wr();or();mc();Cp();Hn();Yr();It();W();ie();Vt();xn();_v();j$=200;a(jv,"recordSyncMetrics");a(Iv,"saveDraftAnalysis");a(Dv,"archiveStaleData")});function Mv(){return Number(process.env.PRJCT_SYNC_PHASE_TIMEOUT_MS)||I$}function Nv(n,e){let t,r=new Promise((s,o)=>{t=setTimeout(()=>o(new Error(`sync phase '${e}' timed out after ${Mv()}ms`)),Mv())});return Promise.race([n,r]).finally(()=>{t&&clearTimeout(t)})}async function wt(n,e){let t=Date.now();z.debug("sync phase start",{phase:n});try{let r=await e();return z.debug("sync phase done",{phase:n,ms:Date.now()-t}),r}catch(r){throw z.debug("sync phase failed",{phase:n,ms:Date.now()-t,error:Fe(r)}),r}}var I$,Ov=h(()=>{"use strict";Rn();Vt();I$=6e4;a(Mv,"syncPhaseTimeoutMs");a(Nv,"withPhaseTimeout");a(wt,"runSyncPhase")});import xp from"node:fs/promises";import Ec from"node:path";var Pp,Ap,Lv,Fv=h(()=>{"use strict";W();ee();Pp=".prjct/.prjct-state.md",Ap=class{static{a(this,"LocalStateGenerator")}async generate(e,t){let r=Ec.join(e,Pp);await xp.mkdir(Ec.dirname(r),{recursive:!0});let s=this.toMarkdown(t);await xp.writeFile(r,s,"utf-8")}async remove(e){try{await xp.unlink(Ec.join(e,Pp))}catch(t){if(!B(t))throw t}}async exists(e){let t=Ec.join(e,Pp);return A(t)}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let r=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${r.description}**`),t.push(""),t.push(`- Started: ${r.startedAt}`),r.linearId&&t.push(`- Linear: ${r.linearId}`),r.branch&&t.push(`- Branch: ${r.branch}`),t.push(`- Status: ${r.status||"active"}`),t.push(""),r.subtasks&&r.subtasks.length>0){t.push("### Subtasks"),t.push(""),r.subtasks.forEach((c,l)=>{let u=c.status==="completed"?"\u2705":c.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=l===r.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${l+1}. ${u} ${c.description}${d}`)}),t.push("");let s=r.subtasks.filter(c=>c.status==="completed").length,o=r.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let r=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${r.description}**`),t.push(""),t.push(`- Status: ${r.status}`),r.prUrl&&t.push(`- PR: ${r.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
1125
1125
  `)}},Lv=new Ap});import D$ from"node:fs/promises";import $$ from"node:path";async function Hv(n){await Promise.all(M$.map(e=>D$.mkdir($$.join(n,e),{recursive:!0})))}async function Uv(n){let{projectId:e,projectPath:t,cliVersion:r,git:s,stats:o}=n,i=I.getDoc(e,"project")||{},c={...i,projectId:e,repoPath:t,name:o.name,version:o.version,cliVersion:r,techStack:o.frameworks,fileCount:o.fileCount,commitCount:s.commits,stack:o.ecosystem,currentBranch:s.branch,hasUncommittedChanges:s.hasChanges,createdAt:i.createdAt||T(),lastSync:T(),lastSyncCommit:s.recentCommits[0]?.hash||null,lastSyncBranch:s.branch};I.setDoc(e,"project",c)}async function Gv(n){let{projectId:e,projectPath:t,stats:r,stack:s}=n,i={...await X.read(e)};i.projectId=e,i.stack={language:r.languages[0]||"Unknown",framework:r.frameworks[0]||null},i.domains={hasFrontend:s.hasFrontend,hasBackend:s.hasBackend,hasDatabase:s.hasDatabase,hasTesting:s.hasTesting,hasDocker:s.hasDocker},i.projectType=r.projectType,i.metrics={totalFiles:r.fileCount},i.lastSync=T(),i.lastUpdated=T(),i.context={...i.context||{},lastSession:T(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await X.write(e,i);try{await Lv.remove(t)}catch(c){z.debug("Legacy local state cleanup failed (optional)",{error:w(c)})}}function Wv(n,e,t){I.appendEvent(n,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}var M$,Bv=h(()=>{"use strict";J();It();W();ie();Vt();Fv();M$=["storage","context","memory","analysis","config","sync"];a(Hv,"ensureProjectDirectories");a(Uv,"updateProjectDoc");a(Gv,"updateStateDoc");a(Wv,"logSyncEvent")});import N$ from"node:fs/promises";import qv from"node:path";var Tc,Vv=h(()=>{"use strict";ee();Tc=class{static{a(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let r={...t.dependencies,...t.devDependencies};this.detectFrontend(r,e),this.detectBackend(r,e),this.detectDatabase(r,e),this.detectTesting(r,t,e),this.collectFrameworks(r,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(s=>e[s])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(s=>e[s])&&(t.hasDatabase=!0)}detectTesting(e,t,r){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(r.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExistsInProject(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=qv.join(this.projectPath,"package.json"),t=await N$.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExistsInProject(e){return A(qv.join(this.projectPath,e))}}});import _p from"node:path";async function Jv(n){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0},t={cwd:n},r=a(d=>d.catch(()=>null),"safe"),[s,o,i,c,l,u]=await Promise.all([r(q("git branch --show-current",t)),r(q("git rev-list --count HEAD",t)),r(q("git shortlog -sn --all",t)),r(q("git status --porcelain",t)),r(q('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',t)),r(q('git log --oneline --since="1 week ago"',t))]);if(s&&(e.branch=s.stdout.trim()||"main"),o&&(e.commits=parseInt(o.stdout.trim(),10)||0),i&&(e.contributors=i.stdout.split(`
1126
1126
  `).filter(d=>d.trim()).length),c){let d=c.stdout.trim().split(`
1127
1127
  `).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(`
1128
1128
  `).filter(Boolean).map(d=>{let[p,m,f]=d.split("|");return{hash:p,message:m,date:f}})),u&&(e.weeklyCommits=u.stdout.split(`
1129
- `).filter(d=>d.trim()).length),!s&&!o&&!c&&z.debug("Git analysis failed (not a git repo?)"),e}async function tn(n,e){let t=await A(_p.join(n,e));return t||z.debug("File not found",{filename:e}),t}async function Xv(n){let e={fileCount:0,version:"0.0.0",name:_p.basename(n),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],r=await Xn(n,{skipDotfiles:!0});e.fileCount=r.filter(s=>t.some(o=>s.endsWith(o))).length}catch(t){z.debug("File count failed",{path:n,error:Fe(t)}),e.fileCount=0}try{let t=_p.join(n,"package.json"),r=await Oe(t);if(!r)throw new Error("No package.json found");e.version=r.version||"0.0.0",e.name=r.name||e.name,e.ecosystem="JavaScript",r.devDependencies?.typescript||await tn(n,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){z.debug("No package.json found",{path:n,error:Fe(t)})}return await tn(n,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await tn(n,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await tn(n,"requirements.txt")||await tn(n,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function zv(n){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await tn(n,"bun.lockb")||await tn(n,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await tn(n,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await tn(n,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await tn(n,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await tn(n,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Kv(n){return new Tc(n).detect()}var Yv=h(()=>{"use strict";Rn();ue();ee();Vt();Vv();a(Jv,"analyzeGit");a(tn,"fileExistsInProject");a(Xv,"gatherStats");a(zv,"detectCommands");a(Kv,"detectStack")});import Qv from"node:fs/promises";import jp from"node:path";var Zv,Ip,eS,tS=h(()=>{"use strict";It();W();ue();Zv={async jsonFilesValid(n){let e=Date.now(),t=[],r=jp.basename(n);try{await X.read(r)}catch(s){B(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(n){let e=Date.now(),t=jp.join(n,"context"),r=[/(?: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 Qv.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let c=await Qv.readFile(jp.join(t,i),"utf-8");for(let l of r)if(l.test(c)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!B(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}}},Ip=class{static{a(this,"SyncVerifier")}async verify(e,t,r){let s=Date.now(),o=[],i=r?.failFast??!1,c=0,l=[Zv.jsonFilesValid(t),Zv.noSensitiveData(t)];for(let m of l){let f=await m;if(o.push(f),!f.passed&&i){c=r?.checks?.filter(y=>y.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&r?.checks)for(let m of r.checks){if(m.enabled===!1){c++;continue}let f=await this.runCustomCheck(m,e);if(o.push(f),!f.passed&&i){let y=r.checks.slice(r.checks.indexOf(m)+1);c+=y.filter(R=>R.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:c}}async runCustomCheck(e,t){let r=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()-r};try{let{stdout:o,stderr:i}=await q(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-r}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-r}}}},eS=new Ip});import{z as Cc}from"zod";function L$(){let n=Mt(nS);if(!n)throw new Error(`Missing bundled crew checkpoints template: ${nS}`);return n}var Rc,nS,O$,Dp,F$,rS,sS=h(()=>{"use strict";_n();ie();J();Rc="crew:checkpoints",nS="crew/CHECKPOINTS.md",O$=Cc.object({content:Cc.string(),source:Cc.enum(["default","user","migrated"]),updated_at:Cc.string().min(1)});a(L$,"getBundledDefault");Dp=class{static{a(this,"CheckpointsStorage")}get(e){let t=b.getDoc(e,Rc);return t===null?{content:L$(),source:"default",updated_at:T()}:O$.parse(t)}hasCustomization(e){return b.hasDoc(e,Rc)}set(e,t,r="user"){let s={content:t,source:r,updated_at:T()};return b.setDoc(e,Rc,s),s}reset(e){b.deleteDoc(e,Rc)}},F$=new Dp,rS=F$});var oS={};N(oS,{TEAM_ENROLLMENT_KEY:()=>xc,TeamEnrollmentSchema:()=>$p,default:()=>Ac,serializeCanonical:()=>Pc,teamEnrollmentStorage:()=>Hs});import{z as Ko}from"zod";function Pc(n){let e=Object.keys(n).sort(),t={};for(let r of e)t[r]=n[r];return JSON.stringify(t)}var xc,$p,Mp,Hs,Ac,_c=h(()=>{"use strict";J();xc="team:enrollment",$p=Ko.object({required:Ko.boolean(),minVersion:Ko.string().min(1),enrolledAt:Ko.string().min(1),enrolledBy:Ko.string().nullable().default(null)}),Mp=class{static{a(this,"TeamEnrollmentStorage")}get(e){let t=b.getDoc(e,xc);return t===null?null:$p.parse(t)}set(e,t){let r=$p.parse(t);b.setDoc(e,xc,r)}clear(e){b.deleteDoc(e,xc)}};a(Pc,"serializeCanonical");Hs=new Mp,Ac=Hs});var dS={};N(dS,{legacyCrewSweep:()=>W$});import iS from"node:fs/promises";import aS from"node:path";function H$(n){let e={required:n.required,minVersion:n.minVersion,enrolledAt:n.enrolledAt};return n.enrolledBy!==null&&(e.enrolledBy=n.enrolledBy),`${JSON.stringify(e,null,2)}
1130
- `}async function cS(n){try{return(await iS.stat(n)).mtimeMs}catch{return null}}async function lS(n){try{return await iS.readFile(n,"utf-8")}catch{return null}}function uS(n,e){return b.getDoc(n,e)}function Ic(n,e,t){b.setDoc(n,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function Dc(n,e,t){try{let{projectMemory:r}=await Promise.resolve().then(()=>(ke(),Ya));await r.remember(n,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(r){z.debug("Legacy sweep inbox capture failed (non-critical)",{error:r instanceof Error?r.message:String(r)})}}async function U$(n,e,t){let r=aS.join(n,Yo),s=await cS(r);if(s===null)return;let o=uS(e,Np);if(o===null){let i=await lS(r);if(i===null){t.errors.push({file:Yo,reason:"read failed"});return}try{rS.set(e,i,"migrated"),Ic(e,Np,s),t.checkpointsMigrated=!0,await Dc(n,"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(c){t.errors.push({file:Yo,reason:c instanceof Error?c.message:String(c)})}return}s>o.mtime_ms&&(await Dc(n,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${Yo}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),Ic(e,Np,s),t.checkpointsHandEditWarned=!0)}async function G$(n,e,t){let r=aS.join(n,jc),s=await cS(r);if(s===null)return;let o=uS(e,Op),i=Ac.get(e);if(o===null){let c=await lS(r);if(c===null){t.errors.push({file:jc,reason:"read failed"});return}try{if(i===null){let l=JSON.parse(c),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};Ac.set(e,u),await ds(r,H$(u)),t.teamMigrated=!0,await Dc(n,"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"})}Ic(e,Op,s)}catch(l){t.errors.push({file:jc,reason:l instanceof Error?l.message:String(l)})}return}s>o.mtime_ms&&(await Dc(n,".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"}),Ic(e,Op,s),t.teamHandEditWarned=!0)}async function W$(n,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await U$(n,e,t).catch(r=>{t.errors.push({file:Yo,reason:r instanceof Error?r.message:String(r)})}),await G$(n,e,t).catch(r=>{t.errors.push({file:jc,reason:r instanceof Error?r.message:String(r)})}),t}var Yo,jc,Np,Op,pS=h(()=>{"use strict";sS();J();_c();ee();Vt();Yo=".prjct/CHECKPOINTS.md",jc=".prjct/team.json",Np="migration:v2.19.8:last-flagged-checkpoints",Op="migration:v2.19.8:last-flagged-team";a(H$,"renderMirror");a(cS,"statMtimeMs");a(lS,"tryReadFile");a(uS,"readFlag");a(Ic,"writeFlag");a(Dc,"captureInboxWarning");a(U$,"sweepCheckpoints");a(G$,"sweepTeamJson");a(W$,"legacyCrewSweep")});import B$ from"node:fs/promises";import mS from"node:path";var Lp,Us,Fp=h(()=>{"use strict";Qd();tc();tp();pc();Rn();_t();cp();Dn();K();Re();yr();mc();Vr();mp();Hn();Yr();It();sv();ee();Vt();ic();Es();gv();hv();Tv();$v();Ov();Bv();Yv();tS();Lp=class{static{a(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 r=Date.now(),s={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await x.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:yc(),stats:wc(),commands:kc(),stack:bc(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=j.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await B$.rm(mS.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await tr()).installed){let Z=await ap({autoRepair:!0});Z.verified||z.warn(`Codex p. router not ready: ${Z.message||"verification failed"}`)}await wt("mcp-defaults",()=>lc({silent:!0,verifyContext7:!1}));try{s=await wt("context7",()=>$s.ensureReady())}catch(Z){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:yc(),stats:wc(),commands:kc(),stack:bc(),context7:{installed:s.installed,verified:!1,message:Fe(Z)},error:`Context7 MCP is required but not ready: ${Fe(Z)}. Run 'prjct start' to repair.`}}await Hv(this.globalPath),process.env.PRJCT_SKIP_JSON_MIGRATION==="1"||(await wt("migrate",()=>gc(this.projectId)),await wt("sweep",async()=>{try{let Z=await hc(this.projectId);Z>0&&z.info("Swept legacy JSON files into SQLite",{swept:Z})}catch(Z){z.debug("Legacy JSON sweep failed (non-critical)",{error:Fe(Z)})}})),process.env.PRJCT_SKIP_CREW_SWEEP!=="1"&&await wt("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:Z}=await Promise.resolve().then(()=>(pS(),dS)),nt=await Z(this.projectPath,this.projectId);(nt.checkpointsMigrated||nt.teamMigrated||nt.checkpointsHandEditWarned||nt.teamHandEditWarned||nt.errors.length>0)&&z.info("Legacy crew sweep ran",{checkpointsMigrated:nt.checkpointsMigrated,teamMigrated:nt.teamMigrated,checkpointsHandEditWarned:nt.checkpointsHandEditWarned,teamHandEditWarned:nt.teamHandEditWarned,errors:nt.errors.length})}catch(Z){z.debug("Legacy crew sweep failed (non-critical)",{error:Fe(Z)})}});let[l,u,d,p]=await wt("gather",()=>Nv(Promise.all([Jv(this.projectPath),Xv(this.projectPath),zv(this.projectPath),Kv(this.projectPath)]),"gather")),{shouldRebuildIndexes:m,changedDomains:f,incrementalInfo:y,changedSourceFiles:R,deletedSourceFiles:k}=await wt("incremental",()=>Ev({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));m&&await wt("index",async()=>{try{let Z=y?.isIncremental&&(R.length>0||k.length>0);await Promise.all([Z?Zk(this.projectPath,this.projectId,R,k):Nd(this.projectPath,this.projectId),Z?xb(this.projectPath,this.projectId,R,k):rp(this.projectPath,this.projectId),Eb(this.projectPath,this.projectId)])}catch(Z){z.debug("File ranking index build failed (non-critical)",{error:Fe(Z)})}});let S,E=Date.now();z.debug("sync phase start",{phase:"skills"});try{let[Z,nt,Bl,xr,po,Ni,mo,fo,Oi,Li,ql]=await Promise.all([Promise.resolve(yt.getActive(this.projectId)).catch(()=>null),Ye.getActive(this.projectId).catch(()=>null),St.getRecent(this.projectId,3).catch(()=>[]),rv.getMetrics(this.projectId).catch(()=>null),tt.getBacklog(this.projectId).catch(()=>[]),X.getTaskHistory(this.projectId).catch(()=>[]),X.getAllPausedTasks(this.projectId).catch(()=>[]),X.getAggregatedFeedback(this.projectId).catch(()=>null),X.getCurrentTask(this.projectId).catch(()=>null),Ns.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),St.getCount(this.projectId).catch(()=>0)]),Fi={backlogCount:po.length,completedTaskCount:Ni.length,pausedTaskCount:mo.length,hasActiveTask:!!Oi},go=Z?Z.patterns.map(pe=>({name:pe.name,description:pe.description,location:pe.locations?.[0]})):(nt?.patterns??[]).filter(pe=>pe.source!=="repo").map(pe=>({name:pe.name,description:pe.description,location:pe.location})),Vl=Z?Z.antiPatterns.map(pe=>({issue:pe.issue,file:pe.files?.[0]??"multiple",suggestion:pe.suggestion,severity:pe.severity??"medium"})):(nt?.antiPatterns??[]).filter(pe=>pe.source!=="repo").map(pe=>({issue:pe.issue,file:pe.file,suggestion:pe.suggestion,severity:pe.severity??"medium"})),ho=Z?.commands?{install:Z.commands.install??d.install,run:d.run,test:Z.commands.test??d.test,build:Z.commands.build??d.build,dev:Z.commands.dev??d.dev,lint:Z.commands.lint??d.lint,format:Z.commands.format??d.format}:d,Pr={version:u.version,fileCount:u.fileCount,patterns:go,antiPatterns:Vl,recentShipped:Bl.map(pe=>({name:pe.name,type:pe.type??"feature",duration:pe.duration,filesChanged:pe.changes?.length})),velocity:xr?{avgPoints:xr.averageVelocity,trend:xr.velocityTrend,accuracy:xr.estimationAccuracy}:null,backlogCount:po.length,knownGotchas:fo?.knownGotchas??[],userPatterns:fo?.patternsDiscovered??[],pausedTasks:mo.map(pe=>({description:pe.description,pausedAt:pe.pausedAt??""})),ideasCount:Li?.pending??0,shippedCount:ql};S=await fv.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:ho,stack:p},Fi,Pr)}catch(Z){z.debug("Native skill generation failed (non-critical)",{error:Fe(Z)})}z.debug("sync phase done",{phase:"skills",ms:Date.now()-E}),await wt("update-files",()=>Promise.all([Uv({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:l,stats:u}),Gv({projectId:this.projectId,projectPath:this.projectPath,stats:u,stack:p}),Promise.resolve(Wv(this.projectId,l,u)),Iv(this.projectId,this.projectPath,l,u,p,s.verified)]));let C=await Ye.getActive(this.projectId),O={patterns:C?.patterns?.length||0,antiPatterns:C?.antiPatterns?.length||0,criticalAntiPatterns:C?.antiPatterns?.filter(Z=>Z.severity==="high").length||0},Q=Date.now()-r,me=await wt("metrics",()=>jv(this.projectId,u,Q));await wt("archive",()=>Dv(this.projectId)),await wt("install-global",async()=>{await et.installGlobalConfig(),await et.syncCommands()}),await wt("install-agent-surfaces",async()=>{await Bt(this.projectPath)});let ne;return await wt("verify",async()=>{try{let Z=await x.readConfig(this.projectPath);ne=await eS.verify(this.projectPath,this.globalPath,Z?.verification)}catch(Z){z.debug("Verification failed (non-critical)",{error:Fe(Z)})}}),{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:O,syncMetrics:me,verification:ne,incremental:y,generatedSkills:S}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:yc(),stats:wc(),commands:kc(),stack:bc(),context7:{installed:s.installed,verified:s.verified,message:s.message},error:Fe(o)}}}async getCliVersion(){try{let e=mS.join(__dirname,"..","..","package.json");return(await Oe(e))?.version||"0.0.0"}catch(e){return z.debug("Failed to read CLI version",{error:Fe(e)}),"0.0.0"}}},Us=new Lp});function q$(){return"---"}function V$(){return`---
1129
+ `).filter(d=>d.trim()).length),!s&&!o&&!c&&z.debug("Git analysis failed (not a git repo?)"),e}async function tn(n,e){let t=await A(_p.join(n,e));return t||z.debug("File not found",{filename:e}),t}async function Xv(n){let e={fileCount:0,version:"0.0.0",name:_p.basename(n),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let t=[".js",".ts",".tsx",".py",".go",".rs"],r=await zn(n,{skipDotfiles:!0});e.fileCount=r.filter(s=>t.some(o=>s.endsWith(o))).length}catch(t){z.debug("File count failed",{path:n,error:Fe(t)}),e.fileCount=0}try{let t=_p.join(n,"package.json"),r=await Oe(t);if(!r)throw new Error("No package.json found");e.version=r.version||"0.0.0",e.name=r.name||e.name,e.ecosystem="JavaScript",r.devDependencies?.typescript||await tn(n,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){z.debug("No package.json found",{path:n,error:Fe(t)})}return await tn(n,"Cargo.toml")?(e.ecosystem="Rust",e.languages.push("Rust")):await tn(n,"go.mod")?(e.ecosystem="Go",e.languages.push("Go")):(await tn(n,"requirements.txt")||await tn(n,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function zv(n){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await tn(n,"bun.lockb")||await tn(n,"bun.lock")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await tn(n,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await tn(n,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await tn(n,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await tn(n,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}async function Kv(n){return new Tc(n).detect()}var Yv=h(()=>{"use strict";Rn();ue();ee();Vt();Vv();a(Jv,"analyzeGit");a(tn,"fileExistsInProject");a(Xv,"gatherStats");a(zv,"detectCommands");a(Kv,"detectStack")});import Qv from"node:fs/promises";import jp from"node:path";var Zv,Ip,eS,tS=h(()=>{"use strict";It();W();ue();Zv={async jsonFilesValid(n){let e=Date.now(),t=[],r=jp.basename(n);try{await X.read(r)}catch(s){B(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(n){let e=Date.now(),t=jp.join(n,"context"),r=[/(?: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 Qv.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let c=await Qv.readFile(jp.join(t,i),"utf-8");for(let l of r)if(l.test(c)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!B(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}}},Ip=class{static{a(this,"SyncVerifier")}async verify(e,t,r){let s=Date.now(),o=[],i=r?.failFast??!1,c=0,l=[Zv.jsonFilesValid(t),Zv.noSensitiveData(t)];for(let m of l){let f=await m;if(o.push(f),!f.passed&&i){c=r?.checks?.filter(y=>y.enabled!==!1).length??0;break}}if((!i||o.every(m=>m.passed))&&r?.checks)for(let m of r.checks){if(m.enabled===!1){c++;continue}let f=await this.runCustomCheck(m,e);if(o.push(f),!f.passed&&i){let y=r.checks.slice(r.checks.indexOf(m)+1);c+=y.filter(R=>R.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:c}}async runCustomCheck(e,t){let r=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()-r};try{let{stdout:o,stderr:i}=await q(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-r}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-r}}}},eS=new Ip});import{z as Cc}from"zod";function L$(){let n=Mt(nS);if(!n)throw new Error(`Missing bundled crew checkpoints template: ${nS}`);return n}var Rc,nS,O$,Dp,F$,rS,sS=h(()=>{"use strict";_n();ie();J();Rc="crew:checkpoints",nS="crew/CHECKPOINTS.md",O$=Cc.object({content:Cc.string(),source:Cc.enum(["default","user","migrated"]),updated_at:Cc.string().min(1)});a(L$,"getBundledDefault");Dp=class{static{a(this,"CheckpointsStorage")}get(e){let t=b.getDoc(e,Rc);return t===null?{content:L$(),source:"default",updated_at:T()}:O$.parse(t)}hasCustomization(e){return b.hasDoc(e,Rc)}set(e,t,r="user"){let s={content:t,source:r,updated_at:T()};return b.setDoc(e,Rc,s),s}reset(e){b.deleteDoc(e,Rc)}},F$=new Dp,rS=F$});var oS={};N(oS,{TEAM_ENROLLMENT_KEY:()=>xc,TeamEnrollmentSchema:()=>$p,default:()=>Ac,serializeCanonical:()=>Pc,teamEnrollmentStorage:()=>Hs});import{z as Ko}from"zod";function Pc(n){let e=Object.keys(n).sort(),t={};for(let r of e)t[r]=n[r];return JSON.stringify(t)}var xc,$p,Mp,Hs,Ac,_c=h(()=>{"use strict";J();xc="team:enrollment",$p=Ko.object({required:Ko.boolean(),minVersion:Ko.string().min(1),enrolledAt:Ko.string().min(1),enrolledBy:Ko.string().nullable().default(null)}),Mp=class{static{a(this,"TeamEnrollmentStorage")}get(e){let t=b.getDoc(e,xc);return t===null?null:$p.parse(t)}set(e,t){let r=$p.parse(t);b.setDoc(e,xc,r)}clear(e){b.deleteDoc(e,xc)}};a(Pc,"serializeCanonical");Hs=new Mp,Ac=Hs});var dS={};N(dS,{legacyCrewSweep:()=>W$});import iS from"node:fs/promises";import aS from"node:path";function H$(n){let e={required:n.required,minVersion:n.minVersion,enrolledAt:n.enrolledAt};return n.enrolledBy!==null&&(e.enrolledBy=n.enrolledBy),`${JSON.stringify(e,null,2)}
1130
+ `}async function cS(n){try{return(await iS.stat(n)).mtimeMs}catch{return null}}async function lS(n){try{return await iS.readFile(n,"utf-8")}catch{return null}}function uS(n,e){return b.getDoc(n,e)}function Ic(n,e,t){b.setDoc(n,e,{mtime_ms:t,migrated_at:new Date().toISOString()})}async function Dc(n,e,t){try{let{projectMemory:r}=await Promise.resolve().then(()=>(ke(),Ya));await r.remember(n,{type:"inbox",content:e,tags:t,provenance:"declared"})}catch(r){z.debug("Legacy sweep inbox capture failed (non-critical)",{error:r instanceof Error?r.message:String(r)})}}async function U$(n,e,t){let r=aS.join(n,Yo),s=await cS(r);if(s===null)return;let o=uS(e,Np);if(o===null){let i=await lS(r);if(i===null){t.errors.push({file:Yo,reason:"read failed"});return}try{rS.set(e,i,"migrated"),Ic(e,Np,s),t.checkpointsMigrated=!0,await Dc(n,"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(c){t.errors.push({file:Yo,reason:c instanceof Error?c.message:String(c)})}return}s>o.mtime_ms&&(await Dc(n,`Legacy .prjct/CHECKPOINTS.md hand-edited after migration \u2014 content NOT applied. Run 'prjct crew checkpoints set --file ${Yo}' to adopt, or delete the legacy file.`,{"migration:v2.19.8":"1",topic:"crew-checkpoints",state:"hand-edited"}),Ic(e,Np,s),t.checkpointsHandEditWarned=!0)}async function G$(n,e,t){let r=aS.join(n,jc),s=await cS(r);if(s===null)return;let o=uS(e,Op),i=Ac.get(e);if(o===null){let c=await lS(r);if(c===null){t.errors.push({file:jc,reason:"read failed"});return}try{if(i===null){let l=JSON.parse(c),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};Ac.set(e,u),await ds(r,H$(u)),t.teamMigrated=!0,await Dc(n,"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"})}Ic(e,Op,s)}catch(l){t.errors.push({file:jc,reason:l instanceof Error?l.message:String(l)})}return}s>o.mtime_ms&&(await Dc(n,".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"}),Ic(e,Op,s),t.teamHandEditWarned=!0)}async function W$(n,e){let t={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,errors:[]};return await U$(n,e,t).catch(r=>{t.errors.push({file:Yo,reason:r instanceof Error?r.message:String(r)})}),await G$(n,e,t).catch(r=>{t.errors.push({file:jc,reason:r instanceof Error?r.message:String(r)})}),t}var Yo,jc,Np,Op,pS=h(()=>{"use strict";sS();J();_c();ee();Vt();Yo=".prjct/CHECKPOINTS.md",jc=".prjct/team.json",Np="migration:v2.19.8:last-flagged-checkpoints",Op="migration:v2.19.8:last-flagged-team";a(H$,"renderMirror");a(cS,"statMtimeMs");a(lS,"tryReadFile");a(uS,"readFlag");a(Ic,"writeFlag");a(Dc,"captureInboxWarning");a(U$,"sweepCheckpoints");a(G$,"sweepTeamJson");a(W$,"legacyCrewSweep")});import B$ from"node:fs/promises";import mS from"node:path";var Lp,Us,Fp=h(()=>{"use strict";Qd();tc();tp();pc();Rn();_t();cp();Dn();K();Re();wr();mc();Vr();mp();Hn();Yr();It();sv();ee();Vt();ic();Es();gv();hv();Tv();$v();Ov();Bv();Yv();tS();Lp=class{static{a(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 r=Date.now(),s={installed:!1,verified:!1,configPath:"",message:""};try{if(this.projectId=await x.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:yc(),stats:wc(),commands:kc(),stack:bc(),context7:{installed:!1,verified:!1},error:"No prjct project. Run p. init first."};if(this.globalPath=j.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await B$.rm(mS.join(this.globalPath,"agents"),{recursive:!0,force:!0}).catch(()=>{}),(await nr()).installed){let Z=await ap({autoRepair:!0});Z.verified||z.warn(`Codex p. router not ready: ${Z.message||"verification failed"}`)}await wt("mcp-defaults",()=>lc({silent:!0,verifyContext7:!1}));try{s=await wt("context7",()=>$s.ensureReady())}catch(Z){return{success:!1,projectId:this.projectId,cliVersion:this.cliVersion,git:yc(),stats:wc(),commands:kc(),stack:bc(),context7:{installed:s.installed,verified:!1,message:Fe(Z)},error:`Context7 MCP is required but not ready: ${Fe(Z)}. Run 'prjct start' to repair.`}}await Hv(this.globalPath),process.env.PRJCT_SKIP_JSON_MIGRATION==="1"||(await wt("migrate",()=>gc(this.projectId)),await wt("sweep",async()=>{try{let Z=await hc(this.projectId);Z>0&&z.info("Swept legacy JSON files into SQLite",{swept:Z})}catch(Z){z.debug("Legacy JSON sweep failed (non-critical)",{error:Fe(Z)})}})),process.env.PRJCT_SKIP_CREW_SWEEP!=="1"&&await wt("legacy-crew-sweep",async()=>{try{let{legacyCrewSweep:Z}=await Promise.resolve().then(()=>(pS(),dS)),nt=await Z(this.projectPath,this.projectId);(nt.checkpointsMigrated||nt.teamMigrated||nt.checkpointsHandEditWarned||nt.teamHandEditWarned||nt.errors.length>0)&&z.info("Legacy crew sweep ran",{checkpointsMigrated:nt.checkpointsMigrated,teamMigrated:nt.teamMigrated,checkpointsHandEditWarned:nt.checkpointsHandEditWarned,teamHandEditWarned:nt.teamHandEditWarned,errors:nt.errors.length})}catch(Z){z.debug("Legacy crew sweep failed (non-critical)",{error:Fe(Z)})}});let[l,u,d,p]=await wt("gather",()=>Nv(Promise.all([Jv(this.projectPath),Xv(this.projectPath),zv(this.projectPath),Kv(this.projectPath)]),"gather")),{shouldRebuildIndexes:m,changedDomains:f,incrementalInfo:y,changedSourceFiles:R,deletedSourceFiles:k}=await wt("incremental",()=>Ev({projectId:this.projectId,projectPath:this.projectPath,isFullSync:t.full===!0,changedFilesHint:t.changedFiles}));m&&await wt("index",async()=>{try{let Z=y?.isIncremental&&(R.length>0||k.length>0);await Promise.all([Z?Zk(this.projectPath,this.projectId,R,k):Nd(this.projectPath,this.projectId),Z?xb(this.projectPath,this.projectId,R,k):rp(this.projectPath,this.projectId),Eb(this.projectPath,this.projectId)])}catch(Z){z.debug("File ranking index build failed (non-critical)",{error:Fe(Z)})}});let S,E=Date.now();z.debug("sync phase start",{phase:"skills"});try{let[Z,nt,Bl,xr,po,Ni,mo,fo,Oi,Li,ql]=await Promise.all([Promise.resolve(yt.getActive(this.projectId)).catch(()=>null),Ye.getActive(this.projectId).catch(()=>null),St.getRecent(this.projectId,3).catch(()=>[]),rv.getMetrics(this.projectId).catch(()=>null),tt.getBacklog(this.projectId).catch(()=>[]),X.getTaskHistory(this.projectId).catch(()=>[]),X.getAllPausedTasks(this.projectId).catch(()=>[]),X.getAggregatedFeedback(this.projectId).catch(()=>null),X.getCurrentTask(this.projectId).catch(()=>null),Ns.getCounts(this.projectId).catch(()=>({pending:0,converted:0,archived:0})),St.getCount(this.projectId).catch(()=>0)]),Fi={backlogCount:po.length,completedTaskCount:Ni.length,pausedTaskCount:mo.length,hasActiveTask:!!Oi},go=Z?Z.patterns.map(pe=>({name:pe.name,description:pe.description,location:pe.locations?.[0]})):(nt?.patterns??[]).filter(pe=>pe.source!=="repo").map(pe=>({name:pe.name,description:pe.description,location:pe.location})),Vl=Z?Z.antiPatterns.map(pe=>({issue:pe.issue,file:pe.files?.[0]??"multiple",suggestion:pe.suggestion,severity:pe.severity??"medium"})):(nt?.antiPatterns??[]).filter(pe=>pe.source!=="repo").map(pe=>({issue:pe.issue,file:pe.file,suggestion:pe.suggestion,severity:pe.severity??"medium"})),ho=Z?.commands?{install:Z.commands.install??d.install,run:d.run,test:Z.commands.test??d.test,build:Z.commands.build??d.build,dev:Z.commands.dev??d.dev,lint:Z.commands.lint??d.lint,format:Z.commands.format??d.format}:d,Pr={version:u.version,fileCount:u.fileCount,patterns:go,antiPatterns:Vl,recentShipped:Bl.map(pe=>({name:pe.name,type:pe.type??"feature",duration:pe.duration,filesChanged:pe.changes?.length})),velocity:xr?{avgPoints:xr.averageVelocity,trend:xr.velocityTrend,accuracy:xr.estimationAccuracy}:null,backlogCount:po.length,knownGotchas:fo?.knownGotchas??[],userPatterns:fo?.patternsDiscovered??[],pausedTasks:mo.map(pe=>({description:pe.description,pausedAt:pe.pausedAt??""})),ideasCount:Li?.pending??0,shippedCount:ql};S=await fv.generateAndInstall({success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:l,stats:u,commands:ho,stack:p},Fi,Pr)}catch(Z){z.debug("Native skill generation failed (non-critical)",{error:Fe(Z)})}z.debug("sync phase done",{phase:"skills",ms:Date.now()-E}),await wt("update-files",()=>Promise.all([Uv({projectId:this.projectId,projectPath:this.projectPath,cliVersion:this.cliVersion,git:l,stats:u}),Gv({projectId:this.projectId,projectPath:this.projectPath,stats:u,stack:p}),Promise.resolve(Wv(this.projectId,l,u)),Iv(this.projectId,this.projectPath,l,u,p,s.verified)]));let C=await Ye.getActive(this.projectId),O={patterns:C?.patterns?.length||0,antiPatterns:C?.antiPatterns?.length||0,criticalAntiPatterns:C?.antiPatterns?.filter(Z=>Z.severity==="high").length||0},Q=Date.now()-r,me=await wt("metrics",()=>jv(this.projectId,u,Q));await wt("archive",()=>Dv(this.projectId)),await wt("install-global",async()=>{await et.installGlobalConfig(),await et.syncCommands()}),await wt("install-agent-surfaces",async()=>{await Bt(this.projectPath)});let ne;return await wt("verify",async()=>{try{let Z=await x.readConfig(this.projectPath);ne=await eS.verify(this.projectPath,this.globalPath,Z?.verification)}catch(Z){z.debug("Verification failed (non-critical)",{error:Fe(Z)})}}),{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:O,syncMetrics:me,verification:ne,incremental:y,generatedSkills:S}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:yc(),stats:wc(),commands:kc(),stack:bc(),context7:{installed:s.installed,verified:s.verified,message:s.message},error:Fe(o)}}}async getCliVersion(){try{let e=mS.join(__dirname,"..","..","package.json");return(await Oe(e))?.version||"0.0.0"}catch(e){return z.debug("Failed to read CLI version",{error:Fe(e)}),"0.0.0"}}},Us=new Lp});function q$(){return"---"}function V$(){return`---
1131
1131
  prjct v${Or()}`}function P(...n){return Up(q$(),...n.filter(Boolean),V$())}function fS(n,e){let t=`| ${n.join(" | ")} |`,r=`|${n.map(()=>"---").join("|")}|`,s=e.map(o=>`| ${o.join(" | ")} |`);return[t,r,...s].join(`
1132
1132
  `)}function gS(n,e=""){return`\`\`\`${e}
1133
1133
  ${n}
@@ -1140,10 +1140,10 @@ ${fS(e,t)}`}function Ft(n){let e=Object.entries(n).filter(([,s])=>s!=null);if(e.
1140
1140
 
1141
1141
  `)}function yS(n,e,t,r){let s=e.replace(/_/g," "),o=[`> **${n}**: ${s}`];if(r)for(let[i,c]of Object.entries(r))o.push(`> ${i}: ${c}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
1142
1142
  `))}var Ge=h(()=>{"use strict";Ze();a(q$,"mdHeader");a(V$,"mdFooter");a(P,"mdOutput");a(fS,"mdTable");a(gS,"mdCodeBlock");a(Hp,"mdBadge");a(F,"mdSection");a(Pe,"mdList");a(Qo,"mdTaskHeader");a(qe,"mdNextSteps");a(Ft,"mdStats");a(je,"mdDone");a(hS,"mdWarn");a(Up,"mdJoin");a(yS,"mdActionRequired")});import Zo from"chalk";function Gs(n,e={}){if(e.quiet)return;let t=kS[n]||"idle",r=Ar.getValidCommands(t);if(r.length===0)return;let s=r.map(o=>({cmd:`p. ${o}`,desc:wS[o]||o}));console.log(Zo.dim(`
1143
- Next:`));for(let o of s){let i=Zo.cyan(o.cmd.padEnd(12));console.log(Zo.dim(` ${i} \u2192 ${o.desc}`))}}function $c(n,e=!1){let t=kS[n]||"idle";return Ar.getValidCommands(t).map(s=>({cmd:e?`prjct ${s} --md`:`p. ${s}`,desc:wS[s]||s}))}function bS(n){let e=Ar.getStateInfo(n);console.log(Zo.dim(`\u{1F4CD} State: ${Zo.white(n.toUpperCase())} - ${e.description}`))}var wS,kS,ei=h(()=>{"use strict";eu();wS={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},kS={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};a(Gs,"showNextSteps");a($c,"getNextSteps");a(bS,"showStateInfo")});async function J$(n,e={}){let t=await x.getProjectId(n);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function ae(n,e={}){let t=await gn.ensureInit(n);return t.success?J$(n,e):{ok:!1,result:t}}async function Mc(n,e={},t=process.cwd()){let r=await Et(n,t);return r?{ok:!0,value:r}:{ok:!1,result:L('No active task \u2014 start one with `prjct task "<desc>"`',e)}}function Nc(n,e,t={}){if(e&&gt.getWorkflow(n,e)?.enabled)return{ok:!0,value:{name:e}};let s=gt.getAllWorkflows(n).map(o=>o.name).join(", ");return{ok:!1,result:L(`Workflow '${e??""}' not found. Available: ${s}`,t)}}var Jt=h(()=>{"use strict";K();Va();Un();jo();we();fe();a(J$,"requireProjectId");a(ae,"requireProject");a(Mc,"requireActiveTask");a(Nc,"requireWorkflow")});async function vS(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Ye.seal(r);return e.json?(console.log(JSON.stringify({success:s.success,signature:s.signature,error:s.error})),{success:s.success,error:s.error}):s.success?(g.done("Analysis sealed"),console.log(` Signature: ${s.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:s.signature}}):(g.fail(s.error||"Seal failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}async function SS(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Ye.rollback(r);return e.json?(console.log(JSON.stringify({success:s.success,restoredSignature:s.restoredSignature,error:s.error})),{success:s.success,error:s.error}):e.md?s.success?(console.log(P(je("Analysis Rolled Back"),Ft({"Restored signature":`${s.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:s.restoredSignature}}):(console.log(P("## Rollback Failed",`> ${s.error}`)),{success:!1,error:s.error}):s.success?(g.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${s.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:s.restoredSignature}}):(g.fail(s.error||"Rollback failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(P("## Rollback Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async function ES(n=process.cwd(),e={}){if(e.semantic)return Gp(n,e);try{let t=await ae(n);if(!t.ok)return t.result;let r=t.value,s=await Ye.verify(r);return e.json?(console.log(JSON.stringify(s)),{success:s.valid}):(s.valid?g.done(s.message):g.fail(s.message),console.log(""),{success:s.valid,data:s})}catch(t){let r=w(t);return D(r)}}async function Gp(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),t.result;let r=t.value,s=n;try{s=I.getDoc(r,"project")?.repoPath||n}catch{}let o=await Ye.semanticVerify(r,s);if(e.json)return console.log(JSON.stringify(o)),{success:o.passed,data:o};console.log(""),o.passed?(g.done("Semantic verification passed"),console.log(` ${o.passedCount}/${o.checks.length} checks passed (${o.totalMs}ms)`)):(g.fail("Semantic verification failed"),console.log(` ${o.failedCount}/${o.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let i of o.checks){let c=i.passed?"\u2713":"\u2717",l=i.passed?`${i.output} (${i.durationMs}ms)`:i.error||"Failed";console.log(` ${c} ${i.name}: ${l}`)}return console.log(""),{success:o.passed,data:o}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}var TS=h(()=>{"use strict";yr();J();W();we();Ge();fe();Jt();a(vS,"seal");a(SS,"rollback");a(ES,"verify");a(Gp,"semanticVerifyCommand")});import{z as H}from"zod";function CS(n){let e=rM.safeParse(n);return e.success?{ok:!0,value:e.data}:{ok:!1,error:e.error.issues.map(r=>`${r.path.length>0?r.path.join("."):"<root>"}: ${r.message}`).join("; ")}}var X$,z$,K$,Y$,Q$,Z$,eM,tM,nM,rM,RS=h(()=>{"use strict";X$=H.object({style:H.string(),insights:H.array(H.string()),domains:H.array(H.string())}),z$=H.object({name:H.string(),description:H.string(),locations:H.array(H.string()),confidence:H.number().min(0).max(1),category:H.string()}),K$=H.object({issue:H.string(),reasoning:H.string(),files:H.array(H.string()),suggestion:H.string(),severity:H.enum(["low","medium","high"]),confidence:H.number().min(0).max(1)}),Y$=H.object({description:H.string(),area:H.string(),effort:H.enum(["small","medium","large"]),impact:H.string(),priority:H.enum(["low","medium","high"])}),Q$=H.object({path:H.string(),reason:H.string(),risk:H.string(),severity:H.enum(["low","medium","high"])}),Z$=H.object({description:H.string(),files:H.array(H.string()),benefit:H.string(),effort:H.enum(["small","medium","large"])}),eM=H.object({category:H.string(),rule:H.string(),example:H.string().optional()}),tM=H.object({build:H.string().optional(),test:H.string().optional(),lint:H.string().optional(),dev:H.string().optional(),format:H.string().optional(),install:H.string().optional()}),nM=H.object({languages:H.array(H.string()),frameworks:H.array(H.string()),packageManager:H.string().optional()}),rM=H.object({version:H.literal(1),commitHash:H.string().nullable(),analyzedAt:H.string(),architecture:X$,patterns:H.array(z$),antiPatterns:H.array(K$),techDebt:H.array(Y$),riskAreas:H.array(Q$),refactorSuggestions:H.array(Z$),projectInsights:H.array(H.string()),conventions:H.array(eM),commands:tM.optional(),stack:nM.optional()});a(CS,"parseLlmAnalysis")});import sM from"node:crypto";import ti from"node:fs/promises";import oM from"node:os";import nn from"node:path";async function xS(n){let e=await aM(n),t=nn.basename(n),r=`obsidian://open?vault=${encodeURIComponent(t)}`,s=iM();if(!s)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:r,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await cM(s,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:r,obsidianConfigFound:!0,alreadyRegistered:i}}function iM(){let n=oM.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=nn.join(n,"Library","Application Support","obsidian");break;case"win32":e=nn.join(process.env.APPDATA||nn.join(n,"AppData","Roaming"),"obsidian");break;default:e=nn.join(process.env.XDG_CONFIG_HOME||nn.join(n,".config"),"obsidian");break}try{if(!rt("node:fs").existsSync(e))return null}catch{return null}return nn.join(e,"obsidian.json")}async function aM(n){let e=nn.join(n,".obsidian"),t=nn.join(e,"app.json");try{return await ti.stat(t),!1}catch{}return await ti.mkdir(e,{recursive:!0}),await ti.writeFile(t,`${JSON.stringify({},null,2)}
1144
- `,"utf-8"),!0}async function cM(n,e){let t={};try{let c=await ti.readFile(n,"utf-8");t=JSON.parse(c)}catch{}let r=t.vaults??{},s=nn.resolve(e);for(let c of Object.values(r))if(nn.resolve(c.path)===s)return{registered:!1,alreadyRegistered:!0};let o=sM.randomBytes(8).toString("hex");r[o]={path:s,ts:Date.now()};let i={...t,vaults:r};try{return await ti.writeFile(n,JSON.stringify(i),"utf-8"),{registered:!0,alreadyRegistered:!1}}catch{return{registered:!1,alreadyRegistered:!1}}}var PS=h(()=>{"use strict";a(xS,"ensureObsidianVault");a(iM,"resolveObsidianConfigPath");a(aM,"bootstrapObsidianDir");a(cM,"registerVaultInObsidianConfig")});import lM from"node:crypto";function dt(n,e=60){let t=xs(n).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");if(t.length>e){let r=t.lastIndexOf("-",e);t=t.slice(0,r>e/2?r:e).replace(/-+$/,"")}return t||"unnamed"}function AS(n){return lM.createHash("sha256").update(n).digest("hex").slice(0,16)}function rn(n,e){return n.length>e?`${n.slice(0,e-1)}\u2026`:n}function _S(n,e=uM){if(n.length<=e)return[n];let t=[];for(let r=0;r<n.length;r+=e)t.push(n.slice(r,r+e));return t}function Wp(n,e){return`${n}::${e.trim().toLowerCase()}`}function Oc(n){let e=(n.analyzedAt||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:"undated"}var uM,ni,hn=h(()=>{"use strict";Ja();uM=50,ni={pattern:"patterns","anti-pattern":"anti-patterns","tech-debt":"tech-debt","risk-area":"risk-areas",refactor:"refactors",insight:"insights"};a(dt,"slugify");a(AS,"sha256");a(rn,"truncate");a(_S,"chunkEntries");a(Wp,"conceptKey");a(Oc,"analysisDateOnly")});function dM(n){return rn(n.replace(/\s+/g," ").trim(),200)}function IS(n){return`- **${Te(n)}** \u2014 ${dM(n.content)} \`${n.id}\``}function DS(n){let e=n.filter(s=>s.type==="decision").slice(0,jS),t=n.filter(s=>s.type==="gotcha").slice(0,jS);if(e.length===0&&t.length===0)return null;let r=["# Architecture",""];if(r.push("> Synthesized from project memory \u2014 the decisions and gotchas the project recorded.","> Read this before re-reading source. The full knowledge graph is under `memory/`.",""),e.length>0){r.push("## Key decisions \u2014 the *why*","");for(let s of e)r.push(IS(s));r.push("")}if(t.length>0){r.push("## Known gotchas \u2014 traps to avoid","");for(let s of t)r.push(IS(s));r.push("")}return r.push("---","","See also: [project wiki](index.md)",""),`${r.join(`
1143
+ Next:`));for(let o of s){let i=Zo.cyan(o.cmd.padEnd(12));console.log(Zo.dim(` ${i} \u2192 ${o.desc}`))}}function $c(n,e=!1){let t=kS[n]||"idle";return Ar.getValidCommands(t).map(s=>({cmd:e?`prjct ${s} --md`:`p. ${s}`,desc:wS[s]||s}))}function bS(n){let e=Ar.getStateInfo(n);console.log(Zo.dim(`\u{1F4CD} State: ${Zo.white(n.toUpperCase())} - ${e.description}`))}var wS,kS,ei=h(()=>{"use strict";eu();wS={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},kS={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};a(Gs,"showNextSteps");a($c,"getNextSteps");a(bS,"showStateInfo")});async function J$(n,e={}){let t=await x.getProjectId(n);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function ae(n,e={}){let t=await hn.ensureInit(n);return t.success?J$(n,e):{ok:!1,result:t}}async function Mc(n,e={},t=process.cwd()){let r=await Et(n,t);return r?{ok:!0,value:r}:{ok:!1,result:L('No active task \u2014 start one with `prjct task "<desc>"`',e)}}function Nc(n,e,t={}){if(e&&gt.getWorkflow(n,e)?.enabled)return{ok:!0,value:{name:e}};let s=gt.getAllWorkflows(n).map(o=>o.name).join(", ");return{ok:!1,result:L(`Workflow '${e??""}' not found. Available: ${s}`,t)}}var Jt=h(()=>{"use strict";K();Va();Un();jo();we();fe();a(J$,"requireProjectId");a(ae,"requireProject");a(Mc,"requireActiveTask");a(Nc,"requireWorkflow")});async function vS(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Ye.seal(r);return e.json?(console.log(JSON.stringify({success:s.success,signature:s.signature,error:s.error})),{success:s.success,error:s.error}):s.success?(g.done("Analysis sealed"),console.log(` Signature: ${s.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:s.signature}}):(g.fail(s.error||"Seal failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}async function SS(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Ye.rollback(r);return e.json?(console.log(JSON.stringify({success:s.success,restoredSignature:s.restoredSignature,error:s.error})),{success:s.success,error:s.error}):e.md?s.success?(console.log(P(je("Analysis Rolled Back"),Ft({"Restored signature":`${s.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:s.restoredSignature}}):(console.log(P("## Rollback Failed",`> ${s.error}`)),{success:!1,error:s.error}):s.success?(g.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${s.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:s.restoredSignature}}):(g.fail(s.error||"Rollback failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(P("## Rollback Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async function ES(n=process.cwd(),e={}){if(e.semantic)return Gp(n,e);try{let t=await ae(n);if(!t.ok)return t.result;let r=t.value,s=await Ye.verify(r);return e.json?(console.log(JSON.stringify(s)),{success:s.valid}):(s.valid?g.done(s.message):g.fail(s.message),console.log(""),{success:s.valid,data:s})}catch(t){let r=w(t);return D(r)}}async function Gp(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),t.result;let r=t.value,s=n;try{s=I.getDoc(r,"project")?.repoPath||n}catch{}let o=await Ye.semanticVerify(r,s);if(e.json)return console.log(JSON.stringify(o)),{success:o.passed,data:o};console.log(""),o.passed?(g.done("Semantic verification passed"),console.log(` ${o.passedCount}/${o.checks.length} checks passed (${o.totalMs}ms)`)):(g.fail("Semantic verification failed"),console.log(` ${o.failedCount}/${o.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let i of o.checks){let c=i.passed?"\u2713":"\u2717",l=i.passed?`${i.output} (${i.durationMs}ms)`:i.error||"Failed";console.log(` ${c} ${i.name}: ${l}`)}return console.log(""),{success:o.passed,data:o}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}var TS=h(()=>{"use strict";wr();J();W();we();Ge();fe();Jt();a(vS,"seal");a(SS,"rollback");a(ES,"verify");a(Gp,"semanticVerifyCommand")});import{z as H}from"zod";function CS(n){let e=rM.safeParse(n);return e.success?{ok:!0,value:e.data}:{ok:!1,error:e.error.issues.map(r=>`${r.path.length>0?r.path.join("."):"<root>"}: ${r.message}`).join("; ")}}var X$,z$,K$,Y$,Q$,Z$,eM,tM,nM,rM,RS=h(()=>{"use strict";X$=H.object({style:H.string(),insights:H.array(H.string()),domains:H.array(H.string())}),z$=H.object({name:H.string(),description:H.string(),locations:H.array(H.string()),confidence:H.number().min(0).max(1),category:H.string()}),K$=H.object({issue:H.string(),reasoning:H.string(),files:H.array(H.string()),suggestion:H.string(),severity:H.enum(["low","medium","high"]),confidence:H.number().min(0).max(1)}),Y$=H.object({description:H.string(),area:H.string(),effort:H.enum(["small","medium","large"]),impact:H.string(),priority:H.enum(["low","medium","high"])}),Q$=H.object({path:H.string(),reason:H.string(),risk:H.string(),severity:H.enum(["low","medium","high"])}),Z$=H.object({description:H.string(),files:H.array(H.string()),benefit:H.string(),effort:H.enum(["small","medium","large"])}),eM=H.object({category:H.string(),rule:H.string(),example:H.string().optional()}),tM=H.object({build:H.string().optional(),test:H.string().optional(),lint:H.string().optional(),dev:H.string().optional(),format:H.string().optional(),install:H.string().optional()}),nM=H.object({languages:H.array(H.string()),frameworks:H.array(H.string()),packageManager:H.string().optional()}),rM=H.object({version:H.literal(1),commitHash:H.string().nullable(),analyzedAt:H.string(),architecture:X$,patterns:H.array(z$),antiPatterns:H.array(K$),techDebt:H.array(Y$),riskAreas:H.array(Q$),refactorSuggestions:H.array(Z$),projectInsights:H.array(H.string()),conventions:H.array(eM),commands:tM.optional(),stack:nM.optional()});a(CS,"parseLlmAnalysis")});import sM from"node:crypto";import ti from"node:fs/promises";import oM from"node:os";import nn from"node:path";async function xS(n){let e=await aM(n),t=nn.basename(n),r=`obsidian://open?vault=${encodeURIComponent(t)}`,s=iM();if(!s)return{bootstrapped:e,registered:!1,vaultName:t,openUrl:r,obsidianConfigFound:!1,alreadyRegistered:!1};let{registered:o,alreadyRegistered:i}=await cM(s,n);return{bootstrapped:e,registered:o,vaultName:t,openUrl:r,obsidianConfigFound:!0,alreadyRegistered:i}}function iM(){let n=oM.homedir(),e,t=process.env.PRJCT_OBSIDIAN_CONFIG_DIR?.trim();if(t)e=t;else switch(process.platform){case"darwin":e=nn.join(n,"Library","Application Support","obsidian");break;case"win32":e=nn.join(process.env.APPDATA||nn.join(n,"AppData","Roaming"),"obsidian");break;default:e=nn.join(process.env.XDG_CONFIG_HOME||nn.join(n,".config"),"obsidian");break}try{if(!rt("node:fs").existsSync(e))return null}catch{return null}return nn.join(e,"obsidian.json")}async function aM(n){let e=nn.join(n,".obsidian"),t=nn.join(e,"app.json");try{return await ti.stat(t),!1}catch{}return await ti.mkdir(e,{recursive:!0}),await ti.writeFile(t,`${JSON.stringify({},null,2)}
1144
+ `,"utf-8"),!0}async function cM(n,e){let t={};try{let c=await ti.readFile(n,"utf-8");t=JSON.parse(c)}catch{}let r=t.vaults??{},s=nn.resolve(e);for(let c of Object.values(r))if(nn.resolve(c.path)===s)return{registered:!1,alreadyRegistered:!0};let o=sM.randomBytes(8).toString("hex");r[o]={path:s,ts:Date.now()};let i={...t,vaults:r};try{return await ti.writeFile(n,JSON.stringify(i),"utf-8"),{registered:!0,alreadyRegistered:!1}}catch{return{registered:!1,alreadyRegistered:!1}}}var PS=h(()=>{"use strict";a(xS,"ensureObsidianVault");a(iM,"resolveObsidianConfigPath");a(aM,"bootstrapObsidianDir");a(cM,"registerVaultInObsidianConfig")});import lM from"node:crypto";function dt(n,e=60){let t=xs(n).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");if(t.length>e){let r=t.lastIndexOf("-",e);t=t.slice(0,r>e/2?r:e).replace(/-+$/,"")}return t||"unnamed"}function AS(n){return lM.createHash("sha256").update(n).digest("hex").slice(0,16)}function rn(n,e){return n.length>e?`${n.slice(0,e-1)}\u2026`:n}function _S(n,e=uM){if(n.length<=e)return[n];let t=[];for(let r=0;r<n.length;r+=e)t.push(n.slice(r,r+e));return t}function Wp(n,e){return`${n}::${e.trim().toLowerCase()}`}function Oc(n){let e=(n.analyzedAt||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:"undated"}var uM,ni,yn=h(()=>{"use strict";Ja();uM=50,ni={pattern:"patterns","anti-pattern":"anti-patterns","tech-debt":"tech-debt","risk-area":"risk-areas",refactor:"refactors",insight:"insights"};a(dt,"slugify");a(AS,"sha256");a(rn,"truncate");a(_S,"chunkEntries");a(Wp,"conceptKey");a(Oc,"analysisDateOnly")});function dM(n){return rn(n.replace(/\s+/g," ").trim(),200)}function IS(n){return`- **${Te(n)}** \u2014 ${dM(n.content)} \`${n.id}\``}function DS(n){let e=n.filter(s=>s.type==="decision").slice(0,jS),t=n.filter(s=>s.type==="gotcha").slice(0,jS);if(e.length===0&&t.length===0)return null;let r=["# Architecture",""];if(r.push("> Synthesized from project memory \u2014 the decisions and gotchas the project recorded.","> Read this before re-reading source. The full knowledge graph is under `memory/`.",""),e.length>0){r.push("## Key decisions \u2014 the *why*","");for(let s of e)r.push(IS(s));r.push("")}if(t.length>0){r.push("## Known gotchas \u2014 traps to avoid","");for(let s of t)r.push(IS(s));r.push("")}return r.push("---","","See also: [project wiki](index.md)",""),`${r.join(`
1145
1145
  `)}
1146
- `}var jS,$S=h(()=>{"use strict";ht();hn();jS=20;a(dM,"teaser");a(IS,"bullet");a(DS,"buildArchitectureBaseline")});function Bp(n){let e=new Map,t=[...n].reverse(),r=a((o,i,c,l)=>{if(!i||!i.trim())return;let u=Wp(o,i),d=Oc(l),p=e.get(u);if(p){p.lastSeen=d,p.latestBody=c,p.seenIn.push({analysisId:l.id,date:d,commit:l.commitHash}),l.status==="active"&&(p.stillActive=!0);return}e.set(u,{kind:o,name:i.trim(),slug:dt(i).slice(0,60)||"unnamed",latestBody:c,firstSeen:d,lastSeen:d,seenIn:[{analysisId:l.id,date:d,commit:l.commitHash}],stillActive:l.status==="active"})},"touch");for(let o of t){let i=o.analysis;for(let c of i.patterns??[])r("pattern",c.name,c,o);for(let c of i.antiPatterns??[])r("anti-pattern",c.issue,c,o);for(let c of i.techDebt??[])r("tech-debt",c.description,c,o);for(let c of i.riskAreas??[])r("risk-area",c.path,c,o);for(let c of i.refactorSuggestions??[])r("refactor",c.description,c,o);for(let c of i.projectInsights??[])r("insight",c,{description:c},o)}let s=new Map;for(let o of e.values()){let i=ni[o.kind],c=s.get(i);c||(c=new Set,s.set(i,c));let l=o.slug,u=2;for(;c.has(l);)l=`${o.slug}-${u}`,u+=1;o.slug=l,c.add(l)}return e}function pM(n){let e=[],t=n.latestBody,r=[...new Set(n.seenIn.map(u=>u.date))];e.push("---"),e.push(`type: ${n.kind}`),e.push(`name: ${JSON.stringify(n.name)}`),e.push(`firstSeen: ${n.firstSeen}`),e.push(`lastSeen: ${n.lastSeen}`),e.push(`seenIn: ${n.seenIn.length}`),e.push(`stillActive: ${n.stillActive}`),e.push(`tags: [${n.kind}]`),e.push("---"),e.push(""),e.push(`# ${n.name}`),e.push("");let s=t.description||t.reason||t.issue;s&&s!==n.name&&(e.push(s),e.push(""));let o=[];t.severity&&o.push(`**Severity**: ${t.severity}`),t.priority&&o.push(`**Priority**: ${t.priority}`),t.effort&&o.push(`**Effort**: ${t.effort}`),t.impact&&o.push(`**Impact**: ${t.impact}`),t.benefit&&o.push(`**Benefit**: ${t.benefit}`),t.confidence!==void 0&&o.push(`**Confidence**: ${t.confidence}`),t.category&&o.push(`**Category**: ${t.category}`),t.area&&o.push(`**Area**: ${t.area}`),t.risk&&o.push(`**Risk**: ${t.risk}`),t.suggestion&&o.push(`**Suggestion**: ${t.suggestion}`),t.reasoning&&t.reasoning!==s&&o.push(`**Reasoning**: ${t.reasoning}`),o.length>0&&(e.push(...o.map(u=>`- ${u}`)),e.push(""));let i=t.files||[],c=t.locations||[],l=[...new Set([...i,...c])];if(l.length>0){e.push("## Where");for(let u of l)e.push(`- \`${u}\``);e.push("")}return e.push("## Seen in"),e.push(`First: ${n.firstSeen} \xB7 Last: ${n.lastSeen} \xB7 ${n.seenIn.length} analysis run${n.seenIn.length===1?"":"s"} (${r.length} distinct date${r.length===1?"":"s"})`),e.push(""),e.push("---"),e.push(""),e.push("See also: [analysis index](../index.md) \xB7 [change log](../history.md)"),e.push(""),`${e.join(`
1146
+ `}var jS,$S=h(()=>{"use strict";ht();yn();jS=20;a(dM,"teaser");a(IS,"bullet");a(DS,"buildArchitectureBaseline")});function Bp(n){let e=new Map,t=[...n].reverse(),r=a((o,i,c,l)=>{if(!i||!i.trim())return;let u=Wp(o,i),d=Oc(l),p=e.get(u);if(p){p.lastSeen=d,p.latestBody=c,p.seenIn.push({analysisId:l.id,date:d,commit:l.commitHash}),l.status==="active"&&(p.stillActive=!0);return}e.set(u,{kind:o,name:i.trim(),slug:dt(i).slice(0,60)||"unnamed",latestBody:c,firstSeen:d,lastSeen:d,seenIn:[{analysisId:l.id,date:d,commit:l.commitHash}],stillActive:l.status==="active"})},"touch");for(let o of t){let i=o.analysis;for(let c of i.patterns??[])r("pattern",c.name,c,o);for(let c of i.antiPatterns??[])r("anti-pattern",c.issue,c,o);for(let c of i.techDebt??[])r("tech-debt",c.description,c,o);for(let c of i.riskAreas??[])r("risk-area",c.path,c,o);for(let c of i.refactorSuggestions??[])r("refactor",c.description,c,o);for(let c of i.projectInsights??[])r("insight",c,{description:c},o)}let s=new Map;for(let o of e.values()){let i=ni[o.kind],c=s.get(i);c||(c=new Set,s.set(i,c));let l=o.slug,u=2;for(;c.has(l);)l=`${o.slug}-${u}`,u+=1;o.slug=l,c.add(l)}return e}function pM(n){let e=[],t=n.latestBody,r=[...new Set(n.seenIn.map(u=>u.date))];e.push("---"),e.push(`type: ${n.kind}`),e.push(`name: ${JSON.stringify(n.name)}`),e.push(`firstSeen: ${n.firstSeen}`),e.push(`lastSeen: ${n.lastSeen}`),e.push(`seenIn: ${n.seenIn.length}`),e.push(`stillActive: ${n.stillActive}`),e.push(`tags: [${n.kind}]`),e.push("---"),e.push(""),e.push(`# ${n.name}`),e.push("");let s=t.description||t.reason||t.issue;s&&s!==n.name&&(e.push(s),e.push(""));let o=[];t.severity&&o.push(`**Severity**: ${t.severity}`),t.priority&&o.push(`**Priority**: ${t.priority}`),t.effort&&o.push(`**Effort**: ${t.effort}`),t.impact&&o.push(`**Impact**: ${t.impact}`),t.benefit&&o.push(`**Benefit**: ${t.benefit}`),t.confidence!==void 0&&o.push(`**Confidence**: ${t.confidence}`),t.category&&o.push(`**Category**: ${t.category}`),t.area&&o.push(`**Area**: ${t.area}`),t.risk&&o.push(`**Risk**: ${t.risk}`),t.suggestion&&o.push(`**Suggestion**: ${t.suggestion}`),t.reasoning&&t.reasoning!==s&&o.push(`**Reasoning**: ${t.reasoning}`),o.length>0&&(e.push(...o.map(u=>`- ${u}`)),e.push(""));let i=t.files||[],c=t.locations||[],l=[...new Set([...i,...c])];if(l.length>0){e.push("## Where");for(let u of l)e.push(`- \`${u}\``);e.push("")}return e.push("## Seen in"),e.push(`First: ${n.firstSeen} \xB7 Last: ${n.lastSeen} \xB7 ${n.seenIn.length} analysis run${n.seenIn.length===1?"":"s"} (${r.length} distinct date${r.length===1?"":"s"})`),e.push(""),e.push("---"),e.push(""),e.push("See also: [analysis index](../index.md) \xB7 [change log](../history.md)"),e.push(""),`${e.join(`
1147
1147
  `)}
1148
1148
  `}function mM(n,e){let t=["# Analysis evolution",""];if(t.push("One entry per analysis save where *something changed* (architecture, patterns, anti-patterns, tech debt, risks, refactors, or insights). Repeated saves with identical contents are collapsed."),t.push(""),t.push("See also: [analysis index](index.md) \xB7 [project wiki](../index.md)"),t.push(""),n.length===0)return t.push("> No analyses saved yet. Run `prjct sync` to generate one."),`${t.join(`
1149
1149
  `)}
@@ -1151,10 +1151,10 @@ Next:`));for(let o of s){let i=Zo.cyan(o.cmd.padEnd(12));console.log(Zo.dim(` $
1151
1151
  `)}
1152
1152
  `}function fM(n){let e=new Map;for(let s of n.values()){let o=e.get(s.kind)??[];o.push(s),e.set(s.kind,o)}let t=["# Analysis",""];t.push("One file per concept from `prjct sync`. Files are deduped across history \u2014 the same pattern or risk always lands at the same path, updated with first/last-seen dates."),t.push(""),t.push("See also: [change log](history.md) \xB7 [project wiki](../index.md)"),t.push("");let r=["pattern","anti-pattern","tech-debt","risk-area","refactor","insight"];for(let s of r){let o=e.get(s);if(!o||o.length===0)continue;let i=ni[s],c=o.filter(u=>u.stillActive).length;t.push(`## ${i} (${c} active / ${o.length} total)`),t.push("");let l=[...o].sort((u,d)=>u.stillActive!==d.stillActive?u.stillActive?-1:1:u.lastSeen>d.lastSeen?-1:1);for(let u of l){let d=u.stillActive?"":" _(historical)_";t.push(`- [${u.name}](${i}/${u.slug}.md)${d}`)}t.push("")}return`${t.join(`
1153
1153
  `)}
1154
- `}function MS(n){let e=new Map;if(n.length===0)return e;let t=Bp(n);for(let r of t.values()){let s=ni[r.kind];e.set(`analysis/${s}/${r.slug}.md`,pM(r))}return e.set("analysis/index.md",fM(t)),e.set("analysis/history.md",mM(n,t)),e}var NS=h(()=>{"use strict";hn();a(Bp,"collectConcepts");a(pM,"buildConceptFile");a(mM,"buildHistoryFile");a(fM,"buildAnalysisIndex");a(MS,"buildAnalysisArchiveFiles")});function yM(n){return rn(n.replace(/\s+/g," ").trim(),200)}function wM(n){let e=n.split(`
1154
+ `}function MS(n){let e=new Map;if(n.length===0)return e;let t=Bp(n);for(let r of t.values()){let s=ni[r.kind];e.set(`analysis/${s}/${r.slug}.md`,pM(r))}return e.set("analysis/index.md",fM(t)),e.set("analysis/history.md",mM(n,t)),e}var NS=h(()=>{"use strict";yn();a(Bp,"collectConcepts");a(pM,"buildConceptFile");a(mM,"buildHistoryFile");a(fM,"buildAnalysisIndex");a(MS,"buildAnalysisArchiveFiles")});function yM(n){return rn(n.replace(/\s+/g," ").trim(),200)}function wM(n){let e=n.split(`
1155
1155
  `)[0]??n;return rn(e.replace(/\s+/g," ").trim(),200)}function OS(n){let e=n.filter(s=>s.type==="feedback").slice(0,gM),t=n.filter(s=>s.type==="improvement-signal"&&s.tags?.source==="friction-detector").slice(0,hM);if(e.length===0&&t.length===0)return null;let r=["# Developer profile",""];if(r.push("> Synthesized from the developer\u2019s stated feedback and their pushback.","> Read this to act as they would \u2014 match these preferences without being asked.",""),e.length>0){r.push("## Preferences & guidance \u2014 the rules to follow","");for(let s of e)r.push(`- **${Te(s)}** \u2014 ${yM(s.content)} \`${s.id}\``);r.push("")}if(t.length>0){r.push("## Friction history \u2014 what frustrated them, do not repeat","");for(let s of t)r.push(`- ${wM(s.content)} \`${s.id}\``);r.push("")}return r.push("---","","See also: [architecture](architecture.md) \xB7 [project wiki](index.md)",""),`${r.join(`
1156
1156
  `)}
1157
- `}var gM,hM,LS=h(()=>{"use strict";ht();hn();gM=25,hM=15;a(yM,"teaser");a(wM,"frictionLine");a(OS,"buildDeveloperProfile")});import kM from"node:fs/promises";import bM from"node:path";async function FS(n,e){let t=null;try{t=I.get(e,`SELECT
1157
+ `}var gM,hM,LS=h(()=>{"use strict";ht();yn();gM=25,hM=15;a(yM,"teaser");a(wM,"frictionLine");a(OS,"buildDeveloperProfile")});import kM from"node:fs/promises";import bM from"node:path";async function FS(n,e){let t=null;try{t=I.get(e,`SELECT
1158
1158
  (SELECT COALESCE(MAX(id), 0) FROM events) AS max_event_id,
1159
1159
  (SELECT COALESCE(MAX(id), 0) FROM llm_analysis) AS max_analysis_id,
1160
1160
  (SELECT COUNT(*) FROM shipped_features) AS ship_count,
@@ -1162,7 +1162,7 @@ Next:`));for(let o of s){let i=Zo.cyan(o.cmd.padEnd(12));console.log(Zo.dim(` $
1162
1162
  (SELECT COUNT(*) FROM workflow_rules) AS workflow_count,
1163
1163
  (SELECT COALESCE(MAX(id), 0) FROM workflow_rules) AS max_workflow_id`)}catch{}let r=t?.max_event_id??0,s=t?.max_analysis_id??0,o=t?.ship_count??0,i=t?.last_ship??"",c=t?.workflow_count??0,l=t?.max_workflow_id??0,u=await kM.stat(bM.join(n,"CHANGELOG.md")).then(d=>Math.floor(d.mtimeMs)).catch(()=>0);return`v${vM}|cli${De}|e${r}|a${s}|s${o}|ls${i}|c${u}|w${c}/${l}`}var qp,vM,HS=h(()=>{"use strict";J();Ze();qp=".regen-fingerprint",vM=2;a(FS,"computeRegenFingerprint")});function GS(n){let{ships:e,memoryTypeCounts:t,tagKeyCounts:r,patternsCount:s,antiPatternsCount:o,llmAnalysis:i}=n,c=["# Project context export (generated)","","Agent-readable snapshot of project memory. Regenerated on `prjct remember`, `prjct capture`,","`prjct ship`, `prjct sync`, and the SessionStart / Stop hooks.","Read directly with Read/Glob \u2014 no CLI round-trip needed.","","> \u26A0\uFE0F **Snapshot, not source.** SQLite is the source of truth. Edits to files under","> `_generated/` are silently overwritten on the next regen. To add memory, run",'> `prjct remember <type> "..."` or drop a markdown note in `../captured/` (parent directory)',"> with `type:` frontmatter \u2014 the Stop hook ingests it.",""];if(n.recentDecisions?.length){c.push("## Recent decisions");for(let l of n.recentDecisions)c.push(`- ${US(l)}`);c.push("")}if(n.topGotchas?.length){c.push("## Known traps");for(let l of n.topGotchas)c.push(`- ${US(l)}`);c.push("")}if(e.length>0){c.push("## Ships");for(let l of e)c.push(`- [${l.name}](ships/${dt(l.name)}.md) \u2014 ${l.shippedAt}`);c.push("")}if(n.releaseCount>0&&(c.push("## Releases"),c.push(`- [releases/index](releases/index.md) \u2014 ${n.releaseCount} versions parsed from \`CHANGELOG.md\``),c.push("")),n.workflowCount>0&&(c.push("## Workflows"),c.push(`- [workflows/index](workflows/index.md) \u2014 ${n.workflowCount} workflow definition(s)`),c.push("")),t.size>0){c.push("## Memory by type");for(let[l,u]of t)c.push(`- [${l}](memory/${l}.md) \u2014 ${u} entries`);c.push("")}if(r.size>0){c.push("## Memory by tag"),c.push("- [all tags](tags.md)");for(let[l,u]of r)c.push(`- [${l}](tags/${dt(l)}.md) \u2014 ${u} entries`);c.push("")}return n.signalsCount&&n.signalsCount>0&&(c.push("## Machine signals"),c.push(`- [signals](signals.md) \u2014 ${n.signalsCount} auto-detected (hot files, missed knowledge, friction)`),c.push("")),(s>0||o>0||i)&&(c.push("## Inferred"),(s>0||o>0)&&c.push(`- [patterns](patterns.md) \u2014 ${s} patterns, ${o} anti-patterns`),i&&((i.architecture?.style||i.architecture?.insights?.length||i.conventions?.length)&&c.push(`- [architecture](architecture.md) \u2014 ${i.architecture?.style??"\u2014"}, ${i.conventions?.length??0} conventions`),(i.techDebt?.length??0)+(i.riskAreas?.length??0)+(i.refactorSuggestions?.length??0)>0&&c.push(`- [tech-debt](tech-debt.md) \u2014 ${i.techDebt?.length??0} debt items, ${i.riskAreas?.length??0} risks, ${i.refactorSuggestions?.length??0} refactors`),i.projectInsights&&i.projectInsights.length>0&&c.push(`- [insights](insights.md) \u2014 ${i.projectInsights.length} project insights`)),n.archiveCount>0&&c.push(`- [analysis drill-down](analysis/index.md) \u2014 ${n.archiveCount} concepts (patterns, anti-patterns, tech-debt, risks, refactors, insights) + [history](analysis/history.md)`),c.push("")),e.length===0&&t.size===0&&s===0&&o===0&&c.push("> No ships, memory, or patterns yet. Run `prjct remember`, `prjct ship`, or `prjct sync`."),`${c.join(`
1164
1164
  `)}
1165
- `}var US,WS=h(()=>{"use strict";hn();US=a(({slug:n,title:e})=>`[[${n}|${e.replace(/[[\]|]/g,"")}]]`,"wikilink");a(GS,"buildIndexFile")});function BS(n,e){if(n.length===0&&e.length===0)return null;let t=["# Patterns (inferred)",""];if(n.length>0){t.push("## Patterns");for(let r of n){let s=r.locations&&r.locations.length>0?` \u2014 ${r.locations.slice(0,3).join(", ")}`:"",o=r.category?` _[${r.category}]_`:"";t.push(`- **${r.name}**${o}: ${r.description}${s}`)}t.push("")}if(e.length>0){t.push("## Anti-patterns");for(let r of e){let s=r.files&&r.files.length>0?` (${r.files[0]})`:"",o=r.severity?` _[${r.severity}]_`:"";t.push(`- **${r.issue}**${o}${s} \u2014 ${r.suggestion}`),r.reasoning&&t.push(` - Why: ${r.reasoning}`)}t.push("")}return t.push("> Source: `prjct sync` analysis. Provenance: INFR."),`${t.join(`
1165
+ `}var US,WS=h(()=>{"use strict";yn();US=a(({slug:n,title:e})=>`[[${n}|${e.replace(/[[\]|]/g,"")}]]`,"wikilink");a(GS,"buildIndexFile")});function BS(n,e){if(n.length===0&&e.length===0)return null;let t=["# Patterns (inferred)",""];if(n.length>0){t.push("## Patterns");for(let r of n){let s=r.locations&&r.locations.length>0?` \u2014 ${r.locations.slice(0,3).join(", ")}`:"",o=r.category?` _[${r.category}]_`:"";t.push(`- **${r.name}**${o}: ${r.description}${s}`)}t.push("")}if(e.length>0){t.push("## Anti-patterns");for(let r of e){let s=r.files&&r.files.length>0?` (${r.files[0]})`:"",o=r.severity?` _[${r.severity}]_`:"";t.push(`- **${r.issue}**${o}${s} \u2014 ${r.suggestion}`),r.reasoning&&t.push(` - Why: ${r.reasoning}`)}t.push("")}return t.push("> Source: `prjct sync` analysis. Provenance: INFR."),`${t.join(`
1166
1166
  `)}
1167
1167
  `}function qS(n){let{architecture:e,conventions:t}=n;if(!(e&&(e.style||e.insights?.length||e.domains?.length))&&(!t||t.length===0))return null;let s=["# Architecture",""];if(e?.style&&s.push(`**Style**: ${e.style}`,""),e?.domains&&e.domains.length>0){s.push("## Domains");for(let o of e.domains)s.push(`- ${o}`);s.push("")}if(e?.insights&&e.insights.length>0){s.push("## Insights");for(let o of e.insights)s.push(`- ${o}`);s.push("")}if(t&&t.length>0){s.push("## Conventions");for(let o of t){let i=o.example?` \u2014 \`${o.example}\``:"";s.push(`- **${o.category}**: ${o.rule}${i}`)}s.push("")}return s.push("> Source: `prjct sync` LLM analysis."),`${s.join(`
1168
1168
  `)}
@@ -1170,33 +1170,33 @@ Next:`));for(let o of s){let i=Zo.cyan(o.cmd.padEnd(12));console.log(Zo.dim(` $
1170
1170
  `)}
1171
1171
  `}function JS(n){if(!n.projectInsights||n.projectInsights.length===0)return null;let e=["# Project insights",""];for(let t of n.projectInsights)e.push(`- ${t}`);return e.push("","> Source: `prjct sync` LLM analysis."),`${e.join(`
1172
1172
  `)}
1173
- `}var XS=h(()=>{"use strict";a(BS,"buildPatternsFile");a(qS,"buildArchitectureFile");a(VS,"buildTechDebtFile");a(JS,"buildInsightsFile")});import sn from"node:fs/promises";import Bs from"node:path";async function Vp(n){try{let e=await sn.readFile(Bs.join(n,Lc),"utf-8"),t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}async function ri(n,e,t){let r=Bs.join(n,e),s=Bs.dirname(r);Ws.has(s)||(await sn.mkdir(s,{recursive:!0}),Ws.size>256&&Ws.clear(),Ws.add(s));try{await sn.writeFile(r,t,"utf-8")}catch{Ws.delete(s),await sn.mkdir(s,{recursive:!0}),Ws.add(s),await sn.writeFile(r,t,"utf-8")}}async function zS(n,e){try{await sn.rm(Bs.join(n,e),{force:!0})}catch{}}async function KS(n,e){let t=0,r=a(async s=>{let o;try{o=await sn.readdir(s,{withFileTypes:!0})}catch{return}for(let i of o){let c=Bs.join(s,i.name);if(i.isDirectory()){if(EM.test(i.name))try{await sn.rm(c,{recursive:!0,force:!0}),t++;continue}catch{}await r(c);try{(await sn.readdir(c)).length===0&&await sn.rmdir(c)}catch{}continue}let l=Bs.relative(n,c);if(!e[l]&&!SM.has(l))try{await sn.rm(c,{force:!0}),t++}catch{}}},"walk");return await r(n),t}var Lc,SM,Ws,EM,YS=h(()=>{"use strict";Lc=".manifest.json",SM=new Set([Lc,".regen-fingerprint"]);a(Vp,"readManifest");Ws=new Set;a(ri,"writeFile");a(zS,"removeFile");EM=/^.+ \d+$/;a(KS,"sweepStaleFiles")});function kr(n){if(n.type==="improvement-signal")return!0;let e=n.tags?.source;return e!==void 0&&TM.has(e)}function CM(n){return n.replace(/^mem[_-]/,"")}function RM(n){let e=(n||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:""}function Fc(n,e=220){return rn((n.split(`
1173
+ `}var XS=h(()=>{"use strict";a(BS,"buildPatternsFile");a(qS,"buildArchitectureFile");a(VS,"buildTechDebtFile");a(JS,"buildInsightsFile")});import sn from"node:fs/promises";import Bs from"node:path";async function Vp(n){try{let e=await sn.readFile(Bs.join(n,Lc),"utf-8"),t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}async function ri(n,e,t){let r=Bs.join(n,e),s=Bs.dirname(r);Ws.has(s)||(await sn.mkdir(s,{recursive:!0}),Ws.size>256&&Ws.clear(),Ws.add(s));try{await sn.writeFile(r,t,"utf-8")}catch{Ws.delete(s),await sn.mkdir(s,{recursive:!0}),Ws.add(s),await sn.writeFile(r,t,"utf-8")}}async function zS(n,e){try{await sn.rm(Bs.join(n,e),{force:!0})}catch{}}async function KS(n,e){let t=0,r=a(async s=>{let o;try{o=await sn.readdir(s,{withFileTypes:!0})}catch{return}for(let i of o){let c=Bs.join(s,i.name);if(i.isDirectory()){if(EM.test(i.name))try{await sn.rm(c,{recursive:!0,force:!0}),t++;continue}catch{}await r(c);try{(await sn.readdir(c)).length===0&&await sn.rmdir(c)}catch{}continue}let l=Bs.relative(n,c);if(!e[l]&&!SM.has(l))try{await sn.rm(c,{force:!0}),t++}catch{}}},"walk");return await r(n),t}var Lc,SM,Ws,EM,YS=h(()=>{"use strict";Lc=".manifest.json",SM=new Set([Lc,".regen-fingerprint"]);a(Vp,"readManifest");Ws=new Set;a(ri,"writeFile");a(zS,"removeFile");EM=/^.+ \d+$/;a(KS,"sweepStaleFiles")});function br(n){if(n.type==="improvement-signal")return!0;let e=n.tags?.source;return e!==void 0&&TM.has(e)}function CM(n){return n.replace(/^mem[_-]/,"")}function RM(n){let e=(n||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:""}function Fc(n,e=220){return rn((n.split(`
1174
1174
  `)[0]??n).replace(/\s+/g," ").trim(),e)}function QS(n,e){if(n.length===0)return null;let t=[],r=[],s=[],o=[],i=[];for(let p of n){let m=p.tags?.source;m==="pattern-detector-auto"?t.push(p):m==="pattern-detector-recurring"?r.push(p):m==="skill-miss-detector"?s.push(p):m==="friction-detector"?o.push(p):i.push(p)}let c=a(p=>`^mem-${CM(p.id)}`,"anchor"),l=a(p=>{let m=RM(p.rememberedAt);return m?` _(${m})_`:""},"stamp"),u=[];if(t.length>0){let p=new Map;for(let y of t){let R=y.tags?.file??"(unknown file)",k=p.get(R)??[];k.push(y),p.set(R,k)}let m=[],f=[...p.entries()].sort((y,R)=>R[1].length-y[1].length);for(let[y,R]of f){let[k,...S]=R,E=k.tags?.touches?`${k.tags.touches} touches`:"churning",C=k.tags?.window_days??k.tags?.["window-days"],O=C?` in ${C}d`:"";m.push(`- \`${y}\` \u2014 ${E}${O}${l(k)} ${c(k)}`);for(let Q of S)m.push(` - earlier sighting${l(Q)} ${c(Q)}`)}u.push({title:"Hot files",intro:"Files that keep churning \u2014 refactor candidates or deliberate hubs.",rows:m})}r.length>0&&u.push({title:"Recurring patterns",intro:"The same class of change keeps happening.",rows:r.map(p=>`- ${Fc(p.content)}${l(p)} ${c(p)}`)}),s.length>0&&u.push({title:"Knowledge being missed",intro:"Project knowledge existed but was not applied in a session.",rows:s.map(p=>`- ${Zt(Fc(p.content),e)}${l(p)} ${c(p)}`)}),o.length>0&&u.push({title:"Friction",intro:"Moments the developer pushed back \u2014 do not repeat.",rows:o.map(p=>`- ${Fc(p.content)}${l(p)} ${c(p)}`)}),i.length>0&&u.push({title:"Other signals",intro:"",rows:i.map(p=>`- ${Zt(Fc(p.content),e)}${l(p)} ${c(p)}`)});let d=["# Signals (machine telemetry)","","> Auto-detected by prjct \u2014 churn, missed knowledge, friction. This is","> telemetry, not curated knowledge: act on it, then let it expire.",`> ${n.length} signal${n.length===1?"":"s"} recorded.`];for(let p of u)d.push("",`## ${p.title}`,""),p.intro&&d.push(`_${p.intro}_`,""),d.push(...p.rows);return d.push(""),d.join(`
1175
- `)}var TM,Jp=h(()=>{"use strict";ht();hn();TM=new Set(["pattern-detector-auto","pattern-detector-recurring","skill-miss-detector","friction-detector"]);a(kr,"isSignalEntry");a(CM,"rowId");a(RM,"dateOnly");a(Fc,"oneLine");a(QS,"buildSignalsFile")});function zp(n){let e=new Map,t=new Map,r=new Map,s=new Set,o=new Set;for(let i of n){e.set(i.id,i.type);let c=Te(i);if(t.set(i.id,c),kr(i)){s.add(i.id);continue}if(Uc.has(i.type)){let l=dt(c);o.has(l)&&(l=`${l}-${Hc(i.id)}`.slice(0,80)),o.add(l),r.set(i.id,l)}}return{idTypeIndex:e,idTitleIndex:t,idSlugIndex:r,signalIds:s}}function Kp(n,e,t,r){return{vault:!0,idTypeIndex:n,idTitleIndex:e,idSlugIndex:t,signalIds:r,perEntryTypes:Uc}}function ZS(n){let{idTypeIndex:e,idTitleIndex:t,idSlugIndex:r,signalIds:s}=zp(n);return Kp(e,t,r,s)}function eE(n){let e=[];return e.push(`# ${n.name}`),e.push(""),e.push(`- Shipped: ${n.shippedAt}`),e.push(`- Version: ${n.version}`),n.type&&e.push(`- Type: ${n.type}`),n.duration&&e.push(`- Duration: ${n.duration}`),e.push(""),n.description&&(e.push("## Description"),e.push(""),e.push(n.description)),`${e.join(`
1175
+ `)}var TM,Jp=h(()=>{"use strict";ht();yn();TM=new Set(["pattern-detector-auto","pattern-detector-recurring","skill-miss-detector","friction-detector"]);a(br,"isSignalEntry");a(CM,"rowId");a(RM,"dateOnly");a(Fc,"oneLine");a(QS,"buildSignalsFile")});function zp(n){let e=new Map,t=new Map,r=new Map,s=new Set,o=new Set;for(let i of n){e.set(i.id,i.type);let c=Te(i);if(t.set(i.id,c),br(i)){s.add(i.id);continue}if(Uc.has(i.type)){let l=dt(c);o.has(l)&&(l=`${l}-${Hc(i.id)}`.slice(0,80)),o.add(l),r.set(i.id,l)}}return{idTypeIndex:e,idTitleIndex:t,idSlugIndex:r,signalIds:s}}function Kp(n,e,t,r){return{vault:!0,idTypeIndex:n,idTitleIndex:e,idSlugIndex:t,signalIds:r,perEntryTypes:Uc}}function ZS(n){let{idTypeIndex:e,idTitleIndex:t,idSlugIndex:r,signalIds:s}=zp(n);return Kp(e,t,r,s)}function eE(n){let e=[];return e.push(`# ${n.name}`),e.push(""),e.push(`- Shipped: ${n.shippedAt}`),e.push(`- Version: ${n.version}`),n.type&&e.push(`- Type: ${n.type}`),n.duration&&e.push(`- Duration: ${n.duration}`),e.push(""),n.description&&(e.push("## Description"),e.push(""),e.push(n.description)),`${e.join(`
1176
1176
  `)}
1177
- `}function Hc(n){return n.replace(/^mem[_-]/,"")}function xM(n){let e=(n||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:""}function PM(n){let e=[];for(let[t,r]of Object.entries(n)){if(Ho.has(t)||Xp.has(t))continue;let s=dt(t,40),o=dt(String(r),60);s==="unnamed"||o==="unnamed"||e.push(`${s}/${o}`)}return e.length===0?"":`tags: [${e.join(", ")}]`}function AM(n,e){let t=[];for(let[r,s]of Object.entries(n.tags))if(Xp.has(r))for(let o of String(s).split(/[\s,]+/).filter(Boolean))/^mem[_-]\d+$/i.test(o)?t.push(`- ${r} ${Zt(o.replace("-","_"),e)}`):t.push(`- ${r} \`${o}\``);return t.length===0?[]:["","## Relations",...t]}function _M(n,e){let t=new Map,r=new Map;for(let s of n){if(!Uc.has(s.type)||kr(s))continue;let o=Te(s),i=e.idSlugIndex?.get(s.id)??`${dt(o)}-${Hc(s.id)}`.slice(0,80),c=xM(s.rememberedAt),l=["---",`aliases: [${JSON.stringify(s.id)}]`,`type: ${s.type}`];l.push(`provenance: ${s.provenance}`),c&&l.push(`created: ${c}`);let u=PM(s.tags);u&&l.push(u),l.push("---");let d=[l.join(`
1177
+ `}function Hc(n){return n.replace(/^mem[_-]/,"")}function xM(n){let e=(n||"").match(/^(\d{4}-\d{2}-\d{2})/);return e?e[1]:""}function PM(n){let e=[];for(let[t,r]of Object.entries(n)){if(Ho.has(t)||Xp.has(t))continue;let s=dt(t,40),o=dt(String(r),60);s==="unnamed"||o==="unnamed"||e.push(`${s}/${o}`)}return e.length===0?"":`tags: [${e.join(", ")}]`}function AM(n,e){let t=[];for(let[r,s]of Object.entries(n.tags))if(Xp.has(r))for(let o of String(s).split(/[\s,]+/).filter(Boolean))/^mem[_-]\d+$/i.test(o)?t.push(`- ${r} ${Zt(o.replace("-","_"),e)}`):t.push(`- ${r} \`${o}\``);return t.length===0?[]:["","## Relations",...t]}function _M(n,e){let t=new Map,r=new Map;for(let s of n){if(!Uc.has(s.type)||br(s))continue;let o=Te(s),i=e.idSlugIndex?.get(s.id)??`${dt(o)}-${Hc(s.id)}`.slice(0,80),c=xM(s.rememberedAt),l=["---",`aliases: [${JSON.stringify(s.id)}]`,`type: ${s.type}`];l.push(`provenance: ${s.provenance}`),c&&l.push(`created: ${c}`);let u=PM(s.tags);u&&l.push(u),l.push("---");let d=[l.join(`
1178
1178
  `),"",`# ${s.type}: ${o}`,"",`> \`${s.id}\` ^mem-${Hc(s.id)}`,"",Zt(s.content,e).trim()];d.push(...AM(s,e)),t.set(`memory/${s.type}/${i}.md`,`${d.join(`
1179
1179
  `)}
1180
- `);let p=r.get(s.type)??[];p.push({id:s.id,title:o,slug:i}),r.set(s.type,p)}return{files:t,titleByType:r}}function jM(n){let e=new Map;for(let t of n)for(let[r,s]of Object.entries(t.tags)){if(Xp.has(r))continue;let o=e.get(r);o||(o=new Map,e.set(r,o));let i=o.get(s)??[];i.push(t),o.set(s,i)}return e}function tE(n,e=n){let t=new Map,{idTypeIndex:r,idTitleIndex:s,idSlugIndex:o,signalIds:i}=zp(e),c=Kp(r,s,o,i),l=n.filter(m=>!kr(m)),u=new Map;for(let m of l){let f=u.get(m.type)??[];f.push(m),u.set(m.type,f)}let{files:d,titleByType:p}=_M(l,c);for(let[m,f]of d)t.set(m,f);for(let[m,f]of u){if(Uc.has(m)){let k=p.get(m)??[],S=[`# ${m.toUpperCase()}`,"",`_${k.length} ${k.length===1?"entry":"entries"} \u2014 newest first._`,"",...k.map(({slug:E,title:C})=>`- [[${E}|${C.replace(/[[\]|]/g,"")}]]`),""];t.set(`memory/${m}.md`,`${S.join(`
1180
+ `);let p=r.get(s.type)??[];p.push({id:s.id,title:o,slug:i}),r.set(s.type,p)}return{files:t,titleByType:r}}function jM(n){let e=new Map;for(let t of n)for(let[r,s]of Object.entries(t.tags)){if(Xp.has(r))continue;let o=e.get(r);o||(o=new Map,e.set(r,o));let i=o.get(s)??[];i.push(t),o.set(s,i)}return e}function tE(n,e=n){let t=new Map,{idTypeIndex:r,idTitleIndex:s,idSlugIndex:o,signalIds:i}=zp(e),c=Kp(r,s,o,i),l=n.filter(m=>!br(m)),u=new Map;for(let m of l){let f=u.get(m.type)??[];f.push(m),u.set(m.type,f)}let{files:d,titleByType:p}=_M(l,c);for(let[m,f]of d)t.set(m,f);for(let[m,f]of u){if(Uc.has(m)){let k=p.get(m)??[],S=[`# ${m.toUpperCase()}`,"",`_${k.length} ${k.length===1?"entry":"entries"} \u2014 newest first._`,"",...k.map(({slug:E,title:C})=>`- [[${E}|${C.replace(/[[\]|]/g,"")}]]`),""];t.set(`memory/${m}.md`,`${S.join(`
1181
1181
  `)}
1182
1182
  `);continue}let y=_S(f);if(y.length===1){let k=[`# ${m.toUpperCase()}`,"",On(f,c),""].join(`
1183
1183
  `);t.set(`memory/${m}.md`,k);continue}let R=[`# ${m.toUpperCase()}`,"",`_${f.length} entries across ${y.length} chunks._`,""];for(let k=0;k<y.length;k++){let S=`${m}/chunk-${k+1}.md`,E=[`# ${m.toUpperCase()} \u2014 chunk ${k+1}/${y.length}`,"",On(y[k],c),""].join(`
1184
1184
  `);t.set(`memory/${S}`,E),R.push(`- [chunk ${k+1}](${S}) \u2014 ${y[k].length} entries`)}t.set(`memory/${m}.md`,`${R.join(`
1185
1185
  `)}
1186
- `)}return t}function DM(n,e){let t=(e.idTitleIndex?.get(n.id)??Te(n)).replace(/[[\]|]/g,""),r=e.idSlugIndex?.get(n.id);return r?`[[${r}|${t}]]`:`[[${n.type}#^mem-${Hc(n.id)}|${t}]]`}function nE(n,e=n){let t=new Map,{idTypeIndex:r,idTitleIndex:s,idSlugIndex:o,signalIds:i}=zp(e),c=Kp(r,s,o,i),l=jM(n.filter(p=>!kr(p))),u=["# Tags",""],d=[...l.entries()].sort((p,m)=>p[0].localeCompare(m[0]));for(let[p,m]of d){if(IM.has(p)||[...m.values()].reduce((E,C)=>E+C.length,0)<2)continue;let y=dt(p),R=[`# Tag: ${p}`,""],k=[...m.entries()].sort((E,C)=>E[0].localeCompare(C[0])),S=0;for(let[E,C]of k){R.push(`## ${E}`,"");for(let O of C)R.push(`- ${DM(O,c)}`);R.push(""),S+=C.length}t.set(`tags/${y}.md`,`${R.join(`
1186
+ `)}return t}function DM(n,e){let t=(e.idTitleIndex?.get(n.id)??Te(n)).replace(/[[\]|]/g,""),r=e.idSlugIndex?.get(n.id);return r?`[[${r}|${t}]]`:`[[${n.type}#^mem-${Hc(n.id)}|${t}]]`}function nE(n,e=n){let t=new Map,{idTypeIndex:r,idTitleIndex:s,idSlugIndex:o,signalIds:i}=zp(e),c=Kp(r,s,o,i),l=jM(n.filter(p=>!br(p))),u=["# Tags",""],d=[...l.entries()].sort((p,m)=>p[0].localeCompare(m[0]));for(let[p,m]of d){if(IM.has(p)||[...m.values()].reduce((E,C)=>E+C.length,0)<2)continue;let y=dt(p),R=[`# Tag: ${p}`,""],k=[...m.entries()].sort((E,C)=>E[0].localeCompare(C[0])),S=0;for(let[E,C]of k){R.push(`## ${E}`,"");for(let O of C)R.push(`- ${DM(O,c)}`);R.push(""),S+=C.length}t.set(`tags/${y}.md`,`${R.join(`
1187
1187
  `)}
1188
1188
  `),u.push(`- [[tags/${y}|${p}]] \u2014 ${k.length} values, ${S} entries`)}return t.size>0&&(u.push(""),t.set("tags.md",`${u.join(`
1189
1189
  `)}
1190
- `)),t}var Uc,Xp,IM,rE=h(()=>{"use strict";ht();hn();Jp();Uc=new Set(["decision","learning","gotcha","pattern","anti-pattern","fact","insight","spec","feedback","improvement-idea","question","source","person","retro"]),Xp=new Set(["relates","resolves","closes","supersedes","duplicates","blocks","depends","corrects"]);a(zp,"buildIndexMaps");a(Kp,"vaultOpts");a(ZS,"buildVaultOpts");a(eE,"formatShipBody");a(Hc,"rowId");a(xM,"dateOnly");a(PM,"frontmatterTags");a(AM,"relationsSection");a(_M,"buildMemoryEntryNotes");a(jM,"groupByTagPair");a(tE,"buildMemoryFiles");IM=Ho;a(DM,"entryLink");a(nE,"buildTagFiles")});import $M from"node:fs/promises";import MM from"node:path";function NM(n){let e=[],t=/^## \[([^\]]+)\]\s*-\s*(\d{4}-\d{2}-\d{2})\s*$/,r=n.split(`
1190
+ `)),t}var Uc,Xp,IM,rE=h(()=>{"use strict";ht();yn();Jp();Uc=new Set(["decision","learning","gotcha","pattern","anti-pattern","fact","insight","spec","feedback","improvement-idea","question","source","person","retro"]),Xp=new Set(["relates","resolves","closes","supersedes","duplicates","blocks","depends","corrects"]);a(zp,"buildIndexMaps");a(Kp,"vaultOpts");a(ZS,"buildVaultOpts");a(eE,"formatShipBody");a(Hc,"rowId");a(xM,"dateOnly");a(PM,"frontmatterTags");a(AM,"relationsSection");a(_M,"buildMemoryEntryNotes");a(jM,"groupByTagPair");a(tE,"buildMemoryFiles");IM=Ho;a(DM,"entryLink");a(nE,"buildTagFiles")});import $M from"node:fs/promises";import MM from"node:path";function NM(n){let e=[],t=/^## \[([^\]]+)\]\s*-\s*(\d{4}-\d{2}-\d{2})\s*$/,r=n.split(`
1191
1191
  `),s=null,o=[],i=a(()=>{s&&(e.push({version:s.version,date:s.date,body:o.join(`
1192
1192
  `).trim()}),o=[])},"flush");for(let c of r){let l=c.match(t);if(l){i(),s={version:l[1],date:l[2]};continue}s&&o.push(c)}return i(),e}function OM(n){for(let e of n.split(`
1193
1193
  `)){let t=e.replace(/^[-*#>\s]+/,"").trim();if(t)return rn(t.replace(/\|/g,"\\|"),80)}return"\u2014"}function LM(n){let e=["# Releases",""];e.push(`${n.length} version${n.length===1?"":"s"} parsed from \`CHANGELOG.md\`. Newest first \u2014 full notes live in \`CHANGELOG.md\`.`),e.push(""),e.push("See also: [project wiki](../index.md)"),e.push(""),e.push("| Date | Version | Summary |"),e.push("|---|---|---|");for(let t of n)e.push(`| ${t.date} | ${t.version} | ${OM(t.body)} |`);return e.push(""),`${e.join(`
1194
1194
  `)}
1195
- `}async function sE(n){let e=new Map,t=MM.join(n,"CHANGELOG.md"),r;try{r=await $M.readFile(t,"utf-8")}catch{return e}let s=NM(r);return s.length===0||e.set("releases/index.md",LM(s)),e}var oE=h(()=>{"use strict";hn();a(NM,"parseChangelog");a(OM,"firstMeaningfulLine");a(LM,"buildReleasesIndex");a(sE,"buildReleasesFiles")});function iE(n,e=[],t){let r=new Map;if(n.length===0)return r;let s=new Map;for(let u of e)s.set(u.id,u);let o=[];for(let u of n){let d=dt(u.title)||u.id.slice(0,8),p=`specs/${d}.md`,m=FM(u,s);r.set(p,t?Zt(m,t):m),o.push({slug:d,spec:u})}let i=["# SPECS","",`_${n.length} spec${n.length===1?"":"s"} across statuses._`,""],c=new Map;for(let u of o){let d=c.get(u.spec.status)??[];d.push(u),c.set(u.spec.status,d)}let l=["draft","reviewed","in_progress","shipped","archived"];for(let u of l){let d=c.get(u);if(!(!d||d.length===0)){i.push(`## ${u} (${d.length})`,"");for(let{slug:p,spec:m}of d){let f=m.content.acceptance_criteria.length,y=m.content.linked_tasks.length;i.push(`- [${m.title}](${p}.md) \u2014 ${f} AC \xB7 ${y} task${y===1?"":"s"}`)}i.push("")}}return r.set("specs/_index.md",`${i.join(`
1195
+ `}async function sE(n){let e=new Map,t=MM.join(n,"CHANGELOG.md"),r;try{r=await $M.readFile(t,"utf-8")}catch{return e}let s=NM(r);return s.length===0||e.set("releases/index.md",LM(s)),e}var oE=h(()=>{"use strict";yn();a(NM,"parseChangelog");a(OM,"firstMeaningfulLine");a(LM,"buildReleasesIndex");a(sE,"buildReleasesFiles")});function iE(n,e=[],t){let r=new Map;if(n.length===0)return r;let s=new Map;for(let u of e)s.set(u.id,u);let o=[];for(let u of n){let d=dt(u.title)||u.id.slice(0,8),p=`specs/${d}.md`,m=FM(u,s);r.set(p,t?Zt(m,t):m),o.push({slug:d,spec:u})}let i=["# SPECS","",`_${n.length} spec${n.length===1?"":"s"} across statuses._`,""],c=new Map;for(let u of o){let d=c.get(u.spec.status)??[];d.push(u),c.set(u.spec.status,d)}let l=["draft","reviewed","in_progress","shipped","archived"];for(let u of l){let d=c.get(u);if(!(!d||d.length===0)){i.push(`## ${u} (${d.length})`,"");for(let{slug:p,spec:m}of d){let f=m.content.acceptance_criteria.length,y=m.content.linked_tasks.length;i.push(`- [${m.title}](${p}.md) \u2014 ${f} AC \xB7 ${y} task${y===1?"":"s"}`)}i.push("")}}return r.set("specs/_index.md",`${i.join(`
1196
1196
  `)}
1197
1197
  `),r}function FM(n,e){let t=n.content,r=[`# ${n.title}`,"",`**id:** \`${n.id}\` \xB7 **status:** ${n.status} \xB7 **created:** ${n.createdAt}`];if(n.updatedAt!==n.createdAt&&r.push(`**updated:** ${n.updatedAt}`),n.shippedAt&&r.push(`**shipped:** ${n.shippedAt}${n.shippedPr?` (PR #${n.shippedPr})`:""}`),r.push("","## Goal",t.goal),t.eli10&&r.push("","## ELI10",t.eli10),t.stakes&&r.push("","## Stakes",t.stakes),t.acceptance_criteria.length>0){r.push("","## Acceptance criteria");for(let s of t.acceptance_criteria)r.push(`- [ ] ${s}`)}if(t.scope.length>0){r.push("","## Scope");for(let s of t.scope)r.push(`- ${s}`)}if(t.out_of_scope.length>0){r.push("","## Out of scope");for(let s of t.out_of_scope)r.push(`- ${s}`)}if(t.risks.length>0){r.push("","## Risks");for(let s of t.risks)r.push(`- **${s.risk}** \u2014 ${s.mitigation}`)}if(t.test_plan.length>0){r.push("","## Test plan");for(let s of t.test_plan)r.push(`- ${s}`)}if(t.reviews&&Object.keys(t.reviews).length>0){r.push("","## Reviews");for(let[s,o]of Object.entries(t.reviews))r.push(`- **${s}:** ${o.verdict} \u2014 ${o.notes} _(${o.ts})_`)}if(t.linked_tasks.length>0){r.push("","## Linked tasks");for(let s of t.linked_tasks){let o=e.get(s);if(o){let i=o.completed?"x":" ",c=o.section==="backlog"?" _(backlog)_":"";r.push(`- [${i}] ${o.description}${c} \xB7 \`${s}\``)}else r.push(`- \`${s}\``)}}return t.notes&&r.push("","## Notes",t.notes),`${r.join(`
1198
1198
  `)}
1199
- `}var aE=h(()=>{"use strict";ht();hn();a(iE,"buildSpecFiles");a(FM,"formatSpecBody")});function cE(n){let e=new Map;if(n.length===0)return{files:e,commandCount:0};let t=new Map;for(let s of n){let o=t.get(s.command)??[];o.push(s),t.set(s.command,o)}for(let[s,o]of t){let i=o.filter(f=>f.enabled),c=i.filter(f=>f.type==="gate").sort((f,y)=>f.sortOrder-y.sortOrder),l=i.filter(f=>f.type==="step").sort((f,y)=>f.sortOrder-y.sortOrder),u=i.filter(f=>f.type==="hook").sort((f,y)=>f.sortOrder-y.sortOrder),d=i.filter(f=>f.type==="instruction").sort((f,y)=>f.sortOrder-y.sortOrder),p=o.filter(f=>!f.enabled),m=[];if(m.push("---"),m.push(`name: ${s}`),m.push(`rules: ${o.length}`),m.push(`enabled: ${i.length}`),p.length>0&&m.push(`disabled: ${p.length}`),m.push("---"),m.push(""),m.push(`# Workflow: ${s}`),m.push(""),c.length>0){m.push("## Gates (must pass before workflow runs)"),m.push("");for(let f of c){let y=f.description?` \u2014 ${f.description}`:"",R=f.whenExpr?` _(when: \`${f.whenExpr}\`)_`:"";m.push(`- \`${f.action}\`${y}${R} \u2014 id: ${f.id}`)}m.push("")}if(l.length>0){m.push("## Steps (run in order)"),m.push("");let f=1;for(let y of l){let R=y.description??y.action;m.push(`${f}. **${R}** \u2014 \`${y.action}\` (id: ${y.id})`),f+=1}m.push("")}if(u.length>0){m.push("## Hooks"),m.push("");for(let f of u){let y=f.description?` \u2014 ${f.description}`:"",R=f.position?` _(position: ${f.position})_`:"";m.push(`- \`${f.action}\`${y}${R} \u2014 id: ${f.id}`)}m.push("")}if(d.length>0){m.push("## Instructions"),m.push("");for(let f of d){let y=f.description?` \u2014 ${f.description}`:"";m.push(`- \`${f.action}\`${y} \u2014 id: ${f.id}`)}m.push("")}if(p.length>0){m.push("## Disabled rules"),m.push("");for(let f of p){let y=f.description?` \u2014 ${f.description}`:"";m.push(`- (${f.type}) \`${f.action}\`${y} \u2014 id: ${f.id}`)}m.push("")}m.push("---"),m.push(""),m.push(`> Edit this workflow: drop a Markdown file at \`<vault>/workflows/${s}.md\` (NOT under \`_generated/\`) with the same frontmatter + sections. The Stop hook ingests it and overrides these rules.`),e.set(`workflows/${s}.md`,`${m.join(`
1199
+ `}var aE=h(()=>{"use strict";ht();yn();a(iE,"buildSpecFiles");a(FM,"formatSpecBody")});function cE(n){let e=new Map;if(n.length===0)return{files:e,commandCount:0};let t=new Map;for(let s of n){let o=t.get(s.command)??[];o.push(s),t.set(s.command,o)}for(let[s,o]of t){let i=o.filter(f=>f.enabled),c=i.filter(f=>f.type==="gate").sort((f,y)=>f.sortOrder-y.sortOrder),l=i.filter(f=>f.type==="step").sort((f,y)=>f.sortOrder-y.sortOrder),u=i.filter(f=>f.type==="hook").sort((f,y)=>f.sortOrder-y.sortOrder),d=i.filter(f=>f.type==="instruction").sort((f,y)=>f.sortOrder-y.sortOrder),p=o.filter(f=>!f.enabled),m=[];if(m.push("---"),m.push(`name: ${s}`),m.push(`rules: ${o.length}`),m.push(`enabled: ${i.length}`),p.length>0&&m.push(`disabled: ${p.length}`),m.push("---"),m.push(""),m.push(`# Workflow: ${s}`),m.push(""),c.length>0){m.push("## Gates (must pass before workflow runs)"),m.push("");for(let f of c){let y=f.description?` \u2014 ${f.description}`:"",R=f.whenExpr?` _(when: \`${f.whenExpr}\`)_`:"";m.push(`- \`${f.action}\`${y}${R} \u2014 id: ${f.id}`)}m.push("")}if(l.length>0){m.push("## Steps (run in order)"),m.push("");let f=1;for(let y of l){let R=y.description??y.action;m.push(`${f}. **${R}** \u2014 \`${y.action}\` (id: ${y.id})`),f+=1}m.push("")}if(u.length>0){m.push("## Hooks"),m.push("");for(let f of u){let y=f.description?` \u2014 ${f.description}`:"",R=f.position?` _(position: ${f.position})_`:"";m.push(`- \`${f.action}\`${y}${R} \u2014 id: ${f.id}`)}m.push("")}if(d.length>0){m.push("## Instructions"),m.push("");for(let f of d){let y=f.description?` \u2014 ${f.description}`:"";m.push(`- \`${f.action}\`${y} \u2014 id: ${f.id}`)}m.push("")}if(p.length>0){m.push("## Disabled rules"),m.push("");for(let f of p){let y=f.description?` \u2014 ${f.description}`:"";m.push(`- (${f.type}) \`${f.action}\`${y} \u2014 id: ${f.id}`)}m.push("")}m.push("---"),m.push(""),m.push(`> Edit this workflow: drop a Markdown file at \`<vault>/workflows/${s}.md\` (NOT under \`_generated/\`) with the same frontmatter + sections. The Stop hook ingests it and overrides these rules.`),e.set(`workflows/${s}.md`,`${m.join(`
1200
1200
  `)}
1201
1201
  `)}let r=["# Workflows",""];r.push("Workflow definitions stored in SQLite, rendered as Markdown for inspection. To edit, see the per-workflow page."),r.push("");for(let[s,o]of t){let i=o.filter(c=>c.enabled).length;r.push(`- [${s}](${s}.md) \u2014 ${i} active rule(s)`)}return e.set("workflows/index.md",`${r.join(`
1202
1202
  `)}
@@ -1263,7 +1263,7 @@ ${Ps.map(n=>`- \`${n}\``).join(`
1263
1263
  `;a(eN,"listNoteFiles");a(xE,"moveToArchive");a(PE,"timestampSlug");a(tN,"parseNote");a(nN,"parseFrontmatter");a(tm,"stripQuotes");a(om,"ingestWorkflowEdits");a(im,"ensureWorkflowsReadme");rN='# 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';a(sN,"parseWorkflowMarkdown");a(oN,"listWorkflowFiles")});import{z as Se}from"zod";var Gn,iN,aN,Wn,qc=h(()=>{"use strict";Gn=["draft","reviewed","in_progress","shipped","archived"],iN=Se.object({verdict:Se.enum(["pass","fail"]),notes:Se.string(),ts:Se.string()}),aN=Se.object({risk:Se.string().min(1),mitigation:Se.string().min(1)}),Wn=Se.object({goal:Se.string().min(1),eli10:Se.string().default(""),stakes:Se.string().default(""),acceptance_criteria:Se.array(Se.string().min(1)).default([]),scope:Se.array(Se.string()).default([]),out_of_scope:Se.array(Se.string()).default([]),risks:Se.array(aN).default([]),test_plan:Se.array(Se.string()).default([]),reviews:Se.record(Se.string(),iN).optional(),selected_reviewers:Se.array(Se.string()).default([]),linked_tasks:Se.array(Se.string()).default([]),notes:Se.string().default(""),tasks_created_at:Se.string().nullable().default(null)})});var _E={};N(_E,{specStorage:()=>Ce});var am,Ce,Js=h(()=>{"use strict";vn();Dr();qc();ie();J();am=class{static{a(this,"SpecStorage")}nextUpdatedAt(e,t){let r=T(),o=b.get(e,"SELECT updated_at FROM specs WHERE id = ?",t)?.updated_at;return!o||r>o?r:new Date(new Date(o).getTime()+1).toISOString()}create(e,t){let r=Xe(),s=T(),o=Wn.parse(t.content);b.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
1264
1264
  VALUES (?, ?, 'draft', ?, ?, ?, ?)`,r,t.title,JSON.stringify(o),t.tags?JSON.stringify(t.tags):null,s,s);let i={id:r,title:t.title,status:"draft",content:o,tags:t.tags??{},createdAt:s,updatedAt:s,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null};return this.publishSync(e,i),i}get(e,t){let r=b.get(e,"SELECT * FROM specs WHERE id = ?",t);return r?this.rowToSpec(r):null}list(e,t={}){let r="SELECT * FROM specs WHERE 1=1",s=[];return t.status&&(r+=" AND status = ?",s.push(t.status)),!t.includeArchived&&!t.status&&(r+=" AND status != 'archived'"),r+=" ORDER BY created_at DESC",b.query(e,r,...s).map(i=>this.rowToSpec(i))}search(e,t){let r=`%${t}%`;return b.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",r,r).map(o=>this.rowToSpec(o))}updateContent(e,t,r){let s=Wn.parse(r),o=this.nextUpdatedAt(e,t);b.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(s),o,t);let i=this.get(e,t);return i&&this.publishSync(e,i),i}casUpdate(e,t,r,s){let o=Wn.parse(r),i=this.nextUpdatedAt(e,t),l=b.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(o),i,t,s).changes===1;if(l){let u=this.get(e,t);u&&this.publishSync(e,u)}return l}setStatus(e,t,r){if(!Gn.includes(r))throw new Error(`invalid spec status: ${r}`);let s=this.nextUpdatedAt(e,t),o=[],i=[r,s];r==="shipped"&&(o.push("shipped_at = ?"),i.push(s)),r==="archived"&&(o.push("archived_at = ?"),i.push(s));let c=["status = ?","updated_at = ?",...o].join(", ");i.push(t),b.run(e,`UPDATE specs SET ${c} WHERE id = ?`,...i);let l=this.get(e,t);return l&&this.publishSync(e,l),l}setShippedPr(e,t,r){b.run(e,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",r,this.nextUpdatedAt(e,t),t);let s=this.get(e,t);return s&&this.publishSync(e,s),s}setShippedSha(e,t,r){b.run(e,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",r,this.nextUpdatedAt(e,t),t);let s=this.get(e,t);return s&&this.publishSync(e,s),s}linkTask(e,t,r){let s=this.get(e,t);if(!s)return null;if(s.content.linked_tasks.includes(r))return s;let o={...s.content,linked_tasks:[...s.content.linked_tasks,r]};return this.updateContent(e,t,o)}delete(e,t){let r=this.get(e,t);return r?(b.run(e,"DELETE FROM specs WHERE id = ?",t),this.publishSync(e,r,"delete"),!0):!1}applyRemote(e,t){if(!t.id)return;let r=typeof t.content=="string"?t.content:JSON.stringify(t.content??{}),s=Gn.includes(t.status)?t.status:"draft",o=t.tags==null?null:typeof t.tags=="string"?t.tags:JSON.stringify(t.tags),i=T();b.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
1265
1265
  VALUES (?, ?, ?, ?, ?, ?, ?)
1266
- ON CONFLICT(id) DO NOTHING`,t.id,t.title??"",s,r,o,t.created_at||i,t.updated_at||i)}count(e){let t=b.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),r={total:0,draft:0,shipped:0};for(let s of t)r.total+=s.n,s.status==="draft"&&(r.draft=s.n),s.status==="shipped"&&(r.shipped=s.n);return r}publishSync(e,t,r="upsert"){vt({projectId:e,entityType:"specs",entityId:t.id,eventType:r,data:{id:t.id,title:t.title,status:t.status,content:t.content,tags:t.tags,created_at:t.createdAt,updated_at:t.updatedAt,shipped_at:t.shippedAt,shipped_pr:t.shippedPr,shipped_sha:t.shippedSha,archived_at:t.archivedAt}})}rowToSpec(e){return{id:e.id,title:e.title,status:Gn.includes(e.status)?e.status:"draft",content:Wn.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}}},Ce=new am});var jE={};N(jE,{CREW_RUN_KEY_PREFIX:()=>um,CrewRunSchema:()=>cm,crewRunStorage:()=>Jc,default:()=>cN});import{z as an}from"zod";function Vc(n){return`${um}${n}`}var um,cm,lm,Jc,cN,dm=h(()=>{"use strict";vn();ie();J();um="crew-run:",cm=an.object({id:an.string().min(1),spec_id:an.string().nullable().default(null),task_id:an.string().nullable().default(null),started_at:an.string().min(1),ended_at:an.string().min(1),implementer_summary:an.string().default(""),files_touched:an.array(an.string()).default([]),reviewer_verdict:an.enum(["APPROVED","CHANGES_REQUESTED"]),reviewer_notes:an.string().nullable().default(null)});a(Vc,"keyFor");lm=class{static{a(this,"CrewRunStorage")}record(e,t){let r=t.runId??Xe(),s=b.getDoc(e,Vc(r));if(s)return s;let o=T(),i=cm.parse({id:r,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 b.setDoc(e,Vc(r),i),i}get(e,t){return b.getDoc(e,Vc(t))}list(e){return b.listDocsByPrefix(e,um).map(r=>cm.parse(r.data))}delete(e,t){b.deleteDoc(e,Vc(t))}},Jc=new lm,cN=Jc});var br={};N(br,{generateWiki:()=>fm,regenerateWikiDeferred:()=>oi});import pm from"node:fs/promises";import mm from"node:path";function IE(n,e,t){let r=Date.now();try{let s=e(),o=Date.now()-r;return console.log(JSON.stringify({builder:n,status:"ok",ms:o})),{result:s,ok:!0,ms:o}}catch(s){let o=Date.now()-r,i=s instanceof Error?s.message:String(s);return console.log(JSON.stringify({builder:n,status:"error",ms:o,error:i})),{result:t(s),ok:!1,ms:o}}}async function fm(n,e){let t=await si(n),r=mm.join(t,Xc);await pm.mkdir(r,{recursive:!0});let s=mm.join(r,qp),o=await FS(n,e);if(await pm.readFile(s,"utf-8").catch(()=>null)===o){let U=await Vp(r);return{wikiRoot:t,filesWritten:0,filesSkipped:Object.keys(U).length,filesRemoved:0}}let{specStorage:c}=await Promise.resolve().then(()=>(Js(),_E)),{queueStorage:l}=await Promise.resolve().then(()=>(Hn(),zb)),{default:u}=await Promise.resolve().then(()=>(dm(),jE)),{teamEnrollmentStorage:d}=await Promise.resolve().then(()=>(_c(),oS)),[p,m,f,y,R,k,S]=await Promise.all([Zb.getAll(e),Promise.resolve(M.allEntriesForIndex(e)),Ye.getActive(e).catch(()=>null),Promise.resolve(yt.getActive(e)).catch(()=>null),Promise.resolve(re.getAllRules(e)).catch(()=>[]),Promise.resolve(c.list(e,{includeArchived:!0})).catch(()=>[]),l.getTasks(e).catch(()=>[])]),E=(()=>{try{return u.list(e)}catch{return[]}})(),C=(()=>{try{return d.get(e)}catch{return null}})(),O=m.filter(U=>U.type!=="shipped"),Q=O.filter(kr),me=O.filter(U=>!kr(U)),ne=new Map;for(let U of p)ne.set(`ships/${dt(U.name)}.md`,eE(U));for(let[U,ge]of tE(O,m))ne.set(U,ge);for(let[U,ge]of nE(O,m))ne.set(U,ge);let Z=ZS(m),nt=QS(Q,Z);nt&&ne.set("signals.md",nt);for(let[U,ge]of iE(k,S,Z))ne.set(U,ge);let Bl=IE("crew-runs",()=>lN(E),()=>new Map);for(let[U,ge]of Bl.result)ne.set(U,ge);let xr=IE("team",()=>uN(C),()=>null);xr.result!==null&&ne.set("team.md",xr.result);let po=y?.patterns??f?.patterns??[],Ni=y?.antiPatterns??f?.antiPatterns??[],mo=BS(po,Ni);mo&&ne.set("patterns.md",mo);let fo=(y?qS(y):null)??DS(O);fo&&ne.set("architecture.md",fo);let Oi=OS(O);if(Oi&&ne.set("developer.md",Oi),y){let U=VS(y);U&&ne.set("tech-debt.md",U);let ge=JS(y);ge&&ne.set("insights.md",ge)}let Li=cE(R);for(let[U,ge]of Li.files)ne.set(U,ge);let ql=Li.commandCount,Fi=yt.getAllFull(e);for(let[U,ge]of MS(Fi))ne.set(U,ge);let go=await sE(n);for(let[U,ge]of go)ne.set(U,ge);let Vl=go.size>0?go.size-1:0,ho=new Map;for(let U of me)ho.set(U.type,(ho.get(U.type)??0)+1);let Pr=new Map;for(let U of ne.keys()){let ge=U.match(/^tags\/(.+)\.md$/);ge&&Pr.set(ge[1],0)}for(let U of me)for(let ge of Object.keys(U.tags)){let un=dt(ge);Pr.has(un)&&Pr.set(un,(Pr.get(un)??0)+1)}let pe=a(U=>({slug:Z.idSlugIndex?.get(U.id)??"",title:Z.idTitleIndex?.get(U.id)??U.id}),"noteRef");ne.set("index.md",GS({ships:p,memoryTypeCounts:ho,tagKeyCounts:Pr,patternsCount:po.length,antiPatternsCount:Ni.length,llmAnalysis:y,archiveCount:Bp(Fi).size,releaseCount:Vl,workflowCount:ql,signalsCount:Q.length,recentDecisions:me.filter(U=>U.type==="decision").slice(0,5).map(pe).filter(U=>U.slug),topGotchas:me.filter(U=>U.type==="gotcha").slice(0,5).map(pe).filter(U=>U.slug)}));let bh=await Vp(r),Hi={},Jl=0,vh=0,Xl=0,zl=[];for(let[U,ge]of ne){let un=AS(ge);if(Hi[U]=un,bh[U]===un){vh++;continue}zl.push([U,ge])}let Ui=64;for(let U=0;U<zl.length;U+=Ui){let ge=zl.slice(U,U+Ui);await Promise.all(ge.map(([un,PP])=>ri(r,un,PP))),Jl+=ge.length}let Kl=[];for(let U of Object.keys(bh))Hi[U]||Kl.push(U);for(let U=0;U<Kl.length;U+=Ui){let ge=Kl.slice(U,U+Ui);await Promise.all(ge.map(un=>zS(r,un))),Xl+=ge.length}let RP=await KS(r,Hi);Xl+=RP,await ri(r,Lc,`${JSON.stringify(Hi,null,2)}
1266
+ ON CONFLICT(id) DO NOTHING`,t.id,t.title??"",s,r,o,t.created_at||i,t.updated_at||i)}count(e){let t=b.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),r={total:0,draft:0,shipped:0};for(let s of t)r.total+=s.n,s.status==="draft"&&(r.draft=s.n),s.status==="shipped"&&(r.shipped=s.n);return r}publishSync(e,t,r="upsert"){vt({projectId:e,entityType:"specs",entityId:t.id,eventType:r,data:{id:t.id,title:t.title,status:t.status,content:t.content,tags:t.tags,created_at:t.createdAt,updated_at:t.updatedAt,shipped_at:t.shippedAt,shipped_pr:t.shippedPr,shipped_sha:t.shippedSha,archived_at:t.archivedAt}})}rowToSpec(e){return{id:e.id,title:e.title,status:Gn.includes(e.status)?e.status:"draft",content:Wn.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}}},Ce=new am});var jE={};N(jE,{CREW_RUN_KEY_PREFIX:()=>um,CrewRunSchema:()=>cm,crewRunStorage:()=>Jc,default:()=>cN});import{z as an}from"zod";function Vc(n){return`${um}${n}`}var um,cm,lm,Jc,cN,dm=h(()=>{"use strict";vn();ie();J();um="crew-run:",cm=an.object({id:an.string().min(1),spec_id:an.string().nullable().default(null),task_id:an.string().nullable().default(null),started_at:an.string().min(1),ended_at:an.string().min(1),implementer_summary:an.string().default(""),files_touched:an.array(an.string()).default([]),reviewer_verdict:an.enum(["APPROVED","CHANGES_REQUESTED"]),reviewer_notes:an.string().nullable().default(null)});a(Vc,"keyFor");lm=class{static{a(this,"CrewRunStorage")}record(e,t){let r=t.runId??Xe(),s=b.getDoc(e,Vc(r));if(s)return s;let o=T(),i=cm.parse({id:r,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 b.setDoc(e,Vc(r),i),i}get(e,t){return b.getDoc(e,Vc(t))}list(e){return b.listDocsByPrefix(e,um).map(r=>cm.parse(r.data))}delete(e,t){b.deleteDoc(e,Vc(t))}},Jc=new lm,cN=Jc});var Bn={};N(Bn,{generateWiki:()=>fm,regenerateWikiDeferred:()=>oi});import pm from"node:fs/promises";import mm from"node:path";function IE(n,e,t){let r=Date.now();try{let s=e(),o=Date.now()-r;return console.log(JSON.stringify({builder:n,status:"ok",ms:o})),{result:s,ok:!0,ms:o}}catch(s){let o=Date.now()-r,i=s instanceof Error?s.message:String(s);return console.log(JSON.stringify({builder:n,status:"error",ms:o,error:i})),{result:t(s),ok:!1,ms:o}}}async function fm(n,e){let t=await si(n),r=mm.join(t,Xc);await pm.mkdir(r,{recursive:!0});let s=mm.join(r,qp),o=await FS(n,e);if(await pm.readFile(s,"utf-8").catch(()=>null)===o){let U=await Vp(r);return{wikiRoot:t,filesWritten:0,filesSkipped:Object.keys(U).length,filesRemoved:0}}let{specStorage:c}=await Promise.resolve().then(()=>(Js(),_E)),{queueStorage:l}=await Promise.resolve().then(()=>(Hn(),zb)),{default:u}=await Promise.resolve().then(()=>(dm(),jE)),{teamEnrollmentStorage:d}=await Promise.resolve().then(()=>(_c(),oS)),[p,m,f,y,R,k,S]=await Promise.all([Zb.getAll(e),Promise.resolve(M.allEntriesForIndex(e)),Ye.getActive(e).catch(()=>null),Promise.resolve(yt.getActive(e)).catch(()=>null),Promise.resolve(re.getAllRules(e)).catch(()=>[]),Promise.resolve(c.list(e,{includeArchived:!0})).catch(()=>[]),l.getTasks(e).catch(()=>[])]),E=(()=>{try{return u.list(e)}catch{return[]}})(),C=(()=>{try{return d.get(e)}catch{return null}})(),O=m.filter(U=>U.type!=="shipped"),Q=O.filter(br),me=O.filter(U=>!br(U)),ne=new Map;for(let U of p)ne.set(`ships/${dt(U.name)}.md`,eE(U));for(let[U,ge]of tE(O,m))ne.set(U,ge);for(let[U,ge]of nE(O,m))ne.set(U,ge);let Z=ZS(m),nt=QS(Q,Z);nt&&ne.set("signals.md",nt);for(let[U,ge]of iE(k,S,Z))ne.set(U,ge);let Bl=IE("crew-runs",()=>lN(E),()=>new Map);for(let[U,ge]of Bl.result)ne.set(U,ge);let xr=IE("team",()=>uN(C),()=>null);xr.result!==null&&ne.set("team.md",xr.result);let po=y?.patterns??f?.patterns??[],Ni=y?.antiPatterns??f?.antiPatterns??[],mo=BS(po,Ni);mo&&ne.set("patterns.md",mo);let fo=(y?qS(y):null)??DS(O);fo&&ne.set("architecture.md",fo);let Oi=OS(O);if(Oi&&ne.set("developer.md",Oi),y){let U=VS(y);U&&ne.set("tech-debt.md",U);let ge=JS(y);ge&&ne.set("insights.md",ge)}let Li=cE(R);for(let[U,ge]of Li.files)ne.set(U,ge);let ql=Li.commandCount,Fi=yt.getAllFull(e);for(let[U,ge]of MS(Fi))ne.set(U,ge);let go=await sE(n);for(let[U,ge]of go)ne.set(U,ge);let Vl=go.size>0?go.size-1:0,ho=new Map;for(let U of me)ho.set(U.type,(ho.get(U.type)??0)+1);let Pr=new Map;for(let U of ne.keys()){let ge=U.match(/^tags\/(.+)\.md$/);ge&&Pr.set(ge[1],0)}for(let U of me)for(let ge of Object.keys(U.tags)){let dn=dt(ge);Pr.has(dn)&&Pr.set(dn,(Pr.get(dn)??0)+1)}let pe=a(U=>({slug:Z.idSlugIndex?.get(U.id)??"",title:Z.idTitleIndex?.get(U.id)??U.id}),"noteRef");ne.set("index.md",GS({ships:p,memoryTypeCounts:ho,tagKeyCounts:Pr,patternsCount:po.length,antiPatternsCount:Ni.length,llmAnalysis:y,archiveCount:Bp(Fi).size,releaseCount:Vl,workflowCount:ql,signalsCount:Q.length,recentDecisions:me.filter(U=>U.type==="decision").slice(0,5).map(pe).filter(U=>U.slug),topGotchas:me.filter(U=>U.type==="gotcha").slice(0,5).map(pe).filter(U=>U.slug)}));let bh=await Vp(r),Hi={},Jl=0,vh=0,Xl=0,zl=[];for(let[U,ge]of ne){let dn=AS(ge);if(Hi[U]=dn,bh[U]===dn){vh++;continue}zl.push([U,ge])}let Ui=64;for(let U=0;U<zl.length;U+=Ui){let ge=zl.slice(U,U+Ui);await Promise.all(ge.map(([dn,PP])=>ri(r,dn,PP))),Jl+=ge.length}let Kl=[];for(let U of Object.keys(bh))Hi[U]||Kl.push(U);for(let U=0;U<Kl.length;U+=Ui){let ge=Kl.slice(U,U+Ui);await Promise.all(ge.map(dn=>zS(r,dn))),Xl+=ge.length}let RP=await KS(r,Hi);Xl+=RP,await ri(r,Lc,`${JSON.stringify(Hi,null,2)}
1267
1267
  `),await ri(r,qp,o);let xP=mm.join(t,"README.md");return await pm.stat(xP).then(()=>!0,()=>!1)||(await ri(t,"README.md",`# Project Wiki
1268
1268
 
1269
1269
  Open this folder as an Obsidian vault to browse project memory.
@@ -1274,7 +1274,7 @@ Open this folder as an Obsidian vault to browse project memory.
1274
1274
  `),Jl++),await sm(n),await im(n),await xS(t).catch(()=>{}),{wikiRoot:t,filesWritten:Jl,filesSkipped:vh,filesRemoved:Xl}}function lN(n){let e=new Map;for(let t of n){let r=t.spec_id??t.task_id??t.id,s=t.started_at.replace(/[:.]/g,"-"),o=`crew-runs/${r}-${s}.md`,i=[`# Crew run \u2014 ${r}`,"",`- **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(c=>`- \`${c}\``).join(`
1275
1275
  `),...t.reviewer_notes?["","## Reviewer notes","",t.reviewer_notes]:[],""].join(`
1276
1276
  `);e.set(o,i)}return e}function uN(n){return n===null?null:["# Team enrollment","",`- **required**: ${n.required}`,`- **minVersion**: \`${n.minVersion}\``,`- **enrolledAt**: ${n.enrolledAt}`,`- **enrolledBy**: ${n.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(`
1277
- `)}async function oi(n,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{fm(n,e).catch(()=>{})});return}try{await fm(n,e)}catch{}}var Xc,yn=h(()=>{"use strict";ke();yr();Vr();Yr();Pn();PS();hn();$S();NS();LS();HS();WS();XS();YS();rE();oE();Jp();aE();lE();Bc();Zp();Xc="_generated";a(IE,"runBuilder");a(fm,"generateWiki");a(lN,"buildCrewRunFiles");a(uN,"buildTeamFile");a(oi,"regenerateWikiDeferred")});import DE from"node:fs/promises";import $E from"node:path";async function NE(n,e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await dN(n,e),i=await pN(o.content,e);yt.save(s,i);let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(yn(),br));return await c(e,s),t.md?console.log(P(je("LLM Analysis Saved"),Ft({Input:o.source,Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",input:o.source,stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0}}catch(r){return Ne(r)}}async function dN(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm requires analysis text, JSON, or a file path");let r=$E.isAbsolute(t)?t:$E.resolve(e,t);try{if((await DE.stat(r)).isFile())return{content:await DE.readFile(r,"utf-8"),source:"file"}}catch{}return{content:n,source:"inline"}}async function pN(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm received an empty analysis");let r=mN(t);if(r.ok){let s=CS(r.value);return s.ok?s.value:ME(`Structured analysis did not match the legacy schema; preserved as LLM notes.
1277
+ `)}async function oi(n,e){if(process.env.PRJCT_IN_DAEMON==="1"){setImmediate(()=>{fm(n,e).catch(()=>{})});return}try{await fm(n,e)}catch{}}var Xc,cn=h(()=>{"use strict";ke();wr();Vr();Yr();Pn();PS();yn();$S();NS();LS();HS();WS();XS();YS();rE();oE();Jp();aE();lE();Bc();Zp();Xc="_generated";a(IE,"runBuilder");a(fm,"generateWiki");a(lN,"buildCrewRunFiles");a(uN,"buildTeamFile");a(oi,"regenerateWikiDeferred")});import DE from"node:fs/promises";import $E from"node:path";async function NE(n,e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await dN(n,e),i=await pN(o.content,e);yt.save(s,i);let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(cn(),Bn));return await c(e,s),t.md?console.log(P(je("LLM Analysis Saved"),Ft({Input:o.source,Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",input:o.source,stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0}}catch(r){return Ne(r)}}async function dN(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm requires analysis text, JSON, or a file path");let r=$E.isAbsolute(t)?t:$E.resolve(e,t);try{if((await DE.stat(r)).isFile())return{content:await DE.readFile(r,"utf-8"),source:"file"}}catch{}return{content:n,source:"inline"}}async function pN(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm received an empty analysis");let r=mN(t);if(r.ok){let s=CS(r.value);return s.ok?s.value:ME(`Structured analysis did not match the legacy schema; preserved as LLM notes.
1278
1278
 
1279
1279
  ${JSON.stringify(r.value,null,2)}`,e)}return ME(t,e)}function mN(n){try{return{ok:!0,value:JSON.parse(n)}}catch{return{ok:!1}}}async function ME(n,e){let t=fN(n);return{version:1,commitHash:await hN(e),analyzedAt:T(),architecture:{style:"unknown",insights:t.slice(0,8),domains:[]},patterns:[],antiPatterns:[],techDebt:[],riskAreas:[],refactorSuggestions:[],projectInsights:t,conventions:[]}}function fN(n){let e=n.split(/\r?\n/).map(s=>s.replace(/^\s{0,3}#{1,6}\s+/,"").replace(/^\s*[-*]\s+\[[ xX]\]\s+/,"").replace(/^\s*[-*]\s+/,"").replace(/^\s*\d+[.)]\s+/,"").trim()).filter(gN),t=[],r=new Set;for(let s of e){let o=s.toLowerCase();if(!r.has(o)&&(r.add(o),t.push(s),t.length>=40))break}return t.length>0?t:[n.slice(0,2e3)]}function gN(n){if(!n||!/[\p{L}\p{N}]/u.test(n))return!1;let e=n.toLowerCase().replace(/\s+/g," ").trim();return!(["current work","wip","misc","todo","n/a","none","latest","unreleased","changelog"].includes(e)||/^[-=_]{3,}$/.test(e)||/^(added|changed|fixed|removed)$/i.test(e)||/^v?\d+\.\d+\.\d+(?:-[\w.-]+)?$/i.test(e))}async function hN(n){try{let{stdout:e}=await G("git",["rev-parse","HEAD"],{cwd:n});return e.trim()||null}catch{return null}}async function OE(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return t.result;let r=t.value,s=yt.getActive(r);if(!s)return e.md?console.log(P("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(e.md){let o=[je(`LLM Analysis (${s.architecture.style})`),""];if(s.architecture.insights.length>0&&o.push(F("Architecture Insights",Pe(s.architecture.insights.slice(0,5)))),s.patterns.length>0){let i=s.patterns.slice(0,8);o.push(F(`Patterns (${s.patterns.length})`,Pe(i.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(s.antiPatterns.length>0){let i=s.antiPatterns.slice(0,5);o.push(F(`Anti-Patterns (${s.antiPatterns.length})`,Pe(i.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(s.techDebt.length>0){let i=s.techDebt.slice(0,5);o.push(F(`Tech Debt (${s.techDebt.length})`,Pe(i.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}s.conventions.length>0&&o.push(F("Conventions",Pe(s.conventions.slice(0,5).map(i=>`**${i.category}**: ${i.rule}`)))),console.log(P(...o))}else{let o={...s,patterns:s.patterns.slice(0,10),antiPatterns:s.antiPatterns.slice(0,6),techDebt:s.techDebt.slice(0,6),conventions:s.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:o}))}return{success:!0,data:s}}catch(t){return Ne(t)}}var LE=h(()=>{"use strict";RS();Vr();ie();ue();we();Ge();Jt();a(NE,"saveLlmAnalysis");a(dN,"resolveAnalysisInput");a(pN,"normalizeAnalysis");a(mN,"tryParseJson");a(ME,"analysisFromText");a(fN,"textToInsights");a(gN,"isUsefulInsight");a(hN,"resolveCurrentCommit");a(OE,"getLlmAnalysis")});import yN from"node:path";async function FE(n,e){let t=Date.now()-e;await et.installGlobalConfig(),g.done(`Synced ${n.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let r=n.stats.frameworks.length>0?` (${n.stats.frameworks[0]})`:"",s=n.syncMetrics?.indexes,o=[`${n.stats.fileCount} files indexed`,`Stack: ${n.stats.ecosystem}${r} | Branch: ${n.git.branch}`];if(s?.bm25Files){let c=s.bm25Files*(s.bm25AvgTokens||0);o.push(`Index: ${Xs(c)} tokens | ${s.bm25VocabSize||0} terms | ${s.importEdges||0} imports`)}g.box("Sync Summary",o.join(`
1280
1280
  `));let i=[];if(n.generatedSkills?.generated&&n.generatedSkills.generated.length>0){let c=n.generatedSkills.generated.length,l=c===1?"skill":"skills";i.push(`${c} ${l} generated`)}if(n.context7&&i.push(`Context7: ${n.context7.verified?"verified":`not ready${n.context7.message?` (${n.context7.message})`:""}`}`),n.analysisSummary&&i.push(`Analysis: ${n.analysisSummary.patterns} patterns | ${n.analysisSummary.antiPatterns} anti-patterns (${n.analysisSummary.criticalAntiPatterns} critical)`),g.section("Generated"),g.list(i,{bullet:"\u2713"}),console.log(""),n.git.hasChanges&&(g.warn("Uncommitted changes detected"),console.log("")),n.verification){let c=n.verification;if(c.passed){let l=c.checks.map(u=>`${u.name} (${u.durationMs}ms)`);g.section("Verified"),g.list(l,{bullet:"\u2713"})}else{g.section("Verification");let l=c.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);g.list(l),c.skippedCount>0&&g.warn(`${c.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Gs("sync"),{success:!0,data:n,metrics:{elapsed:t,fileCount:n.stats.fileCount}}}async function HE(n){try{let e=await ze.getRecentEvents(n,100),t=new Date().toISOString().split("T")[0],r=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(r.length>=2){let u=r.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];s=Ih(d)}}let o=r.filter(u=>u.action==="task_completed").length,i=r.filter(u=>u.action==="feature_shipped").length,c=new Map;for(let u of r)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)c.set(d,(c.get(d)||0)+1);let l=Array.from(c.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:l}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Xs(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:n.toLocaleString()}function gm(n){return n<1e3?`${Math.round(n)}ms`:`${(n/1e3).toFixed(1)}s`}function UE(n){if(n.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=n.map(s=>s.tokensSaved),r=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/r*(e.length-1)),e.length-1);return e[o]}).join("")}function GE(n,e,t,r,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${r}_`),i.push(""),s){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let c=s.agentsUsed.slice(0,3).map(l=>`${l.name} (${l.count}\xD7)`).join(", ");i.push(`| Agents used | ${c} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${Xs(n.totalTokensSaved)} |`),i.push(`| Compression | ${(n.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${vc(n.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${n.syncCount} |`),i.push(`| Avg time | ${gm(n.avgSyncDuration)} |`),i.push(""),n.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let c=n.topAgents.reduce((l,u)=>l+u.usageCount,0);for(let l of n.topAgents){let u=c>0?(l.usageCount/c*100).toFixed(0):0;i.push(`| ${l.agentName} | ${u}% (${l.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${Xs(n.last30DaysTokens)}`),n.trend!==0){let c=n.trend>0?"+":"";i.push(`- Trend: ${c}${n.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
@@ -1296,13 +1296,13 @@ ${JSON.stringify(r.value,null,2)}`,e)}return ME(t,e)}function mN(n){try{return{o
1296
1296
  `).slice(0,5).forEach(c=>{if(c.trim()){let[l,,u,d]=c.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
1297
1297
  `),t.push("Based on detected stack, consider generating specialized agents using `p. sync`.\n"),t.push(`---
1298
1298
  `),t.push("*This analysis was generated automatically. For updated information, run `p. analyze` again.*\n"),t.join(`
1299
- `)}var hm=h(()=>{"use strict";Dn();Sc();xn();ie();ei();fe();a(FE,"showSyncResult");a(HE,"getSessionActivity");a(Xs,"formatTokens");a(gm,"formatDuration");a(UE,"generateSparkline");a(GE,"generateStatsMarkdown");a(WE,"generateAnalysisSummary")});async function BE(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return t.result;let r=t.value,s=await Fs.getSummary(r),o=await Fs.getDailyStats(r,30),i=await HE(r),c={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:c,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=I.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await Fs.read(r),d=u.firstSync?new Date(u.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${l.padEnd(20).slice(0,20)} | Since: ${d.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Xs(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${vc(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${gm(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=UE(o);if(console.log(` ${p} ${Xs(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=GE(s,o,l,d,i,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:i,patterns:c}}}catch(t){return console.error("\u274C Error:",w(t)),Ne(t)}}async function qE(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Ye.diff(r);if(!s){let o="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:o})):e.md?console.log(P("## 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(P(Qa(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(Bk(s)),console.log("");let o=[];s.summary.added>0&&o.push(`${s.summary.added} added`),s.summary.removed>0&&o.push(`${s.summary.removed} removed`),s.summary.changed>0&&o.push(`${s.summary.changed} changed`),g.done(o.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(P("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}var VE=h(()=>{"use strict";Sc();Za();yr();J();Cp();W();we();Ge();fe();hm();Jt();a(BE,"stats");a(qE,"diff")});var zc={};N(zc,{AnalysisCommands:()=>ym});import JE from"node:fs/promises";var XE,ym,Kc=h(()=>{"use strict";Dk();K();Re();ht();ke();Za();ib();Fp();yr();Vr();W();ie();we();Ge();ei();fe();TS();LE();VE();hm();xe();Jt();XE=["> Review this project data and save concise notes for future AI agents.","> Focus on architecture, conventions, risks, and gotchas. Markdown/text is fine; JSON is optional.","> Most compatible save path: write notes to a temp file, then run `prjct analysis-save-llm <file> --md`."].join(`
1299
+ `)}var hm=h(()=>{"use strict";Dn();Sc();xn();ie();ei();fe();a(FE,"showSyncResult");a(HE,"getSessionActivity");a(Xs,"formatTokens");a(gm,"formatDuration");a(UE,"generateSparkline");a(GE,"generateStatsMarkdown");a(WE,"generateAnalysisSummary")});async function BE(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return t.result;let r=t.value,s=await Fs.getSummary(r),o=await Fs.getDailyStats(r,30),i=await HE(r),c={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:c,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=I.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await Fs.read(r),d=u.firstSync?new Date(u.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${l.padEnd(20).slice(0,20)} | Since: ${d.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Xs(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${vc(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${gm(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=UE(o);if(console.log(` ${p} ${Xs(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=GE(s,o,l,d,i,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:i,patterns:c}}}catch(t){return console.error("\u274C Error:",w(t)),Ne(t)}}async function qE(n=process.cwd(),e={}){try{let t=await ae(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await Ye.diff(r);if(!s){let o="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:o})):e.md?console.log(P("## 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(P(Qa(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(Bk(s)),console.log("");let o=[];s.summary.added>0&&o.push(`${s.summary.added} added`),s.summary.removed>0&&o.push(`${s.summary.removed} removed`),s.summary.changed>0&&o.push(`${s.summary.changed} changed`),g.done(o.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(P("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}var VE=h(()=>{"use strict";Sc();Za();wr();J();Cp();W();we();Ge();fe();hm();Jt();a(BE,"stats");a(qE,"diff")});var zc={};N(zc,{AnalysisCommands:()=>ym});import JE from"node:fs/promises";var XE,ym,Kc=h(()=>{"use strict";Dk();K();Re();ht();ke();Za();ib();Fp();wr();Vr();W();ie();we();Ge();ei();fe();TS();LE();VE();hm();xe();Jt();XE=["> Review this project data and save concise notes for future AI agents.","> Focus on architecture, conventions, risks, and gotchas. Markdown/text is fine; JSON is optional.","> Most compatible save path: write notes to a temp file, then run `prjct analysis-save-llm <file> --md`."].join(`
1300
1300
  `),ym=class extends V{static{a(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
1301
1301
  `),Ke.init(t);let r={packageJson:await Ke.readPackageJson(),cargoToml:await Ke.readCargoToml(),goMod:await Ke.readGoMod(),requirements:await Ke.readRequirements(),directories:await Ke.listDirectories(),fileCount:await Ke.countFiles(),gitStats:await Ke.getGitStats(),gitLog:await Ke.getGitLog(20),hasDockerfile:await Ke.fileExists("Dockerfile"),hasDockerCompose:await Ke.fileExists("docker-compose.yml"),hasReadme:await Ke.fileExists("README.md"),hasTsconfig:await Ke.fileExists("tsconfig.json"),hasViteConfig:await Ke.fileExists("vite.config.ts")||await Ke.fileExists("vite.config.js"),hasNextConfig:await Ke.fileExists("next.config.js")||await Ke.fileExists("next.config.mjs")},s=WE(r,t),o=await x.readConfig(t).catch(()=>null),i=await j.getWikiPath(t,o?.vaultPath),c=`${i}/_generated/analysis/repo-summary.md`;return await JE.mkdir(`${i}/_generated/analysis`,{recursive:!0}),await JE.writeFile(c,s,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:T(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
1302
1302
  `),console.log(`\u{1F4C4} Full report: ${j.getDisplayPath(c)}
1303
- `),console.log("Next steps:"),console.log("\u2022 p. sync \u2192 Generate agents based on stack"),console.log('\u2022 p. task "<description>" \u2192 Start tracked work'),{success:!0,summaryPath:c,data:r}}catch(r){return console.error("\u274C Error:",w(r)),Ne(r)}}async sync(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=Date.now();if(t.package){let c=await j.detectMonorepo(e);if(!c.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=c.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=c.packages.map(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Us.sync(e,{packagePath:l.path,packageName:l.name});return t.json?console.log(JSON.stringify({success:u.success,package:l.name,path:l.relativePath})):t.md?console.log(P(je(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await Us.sync(e,{full:t.full});if(!i.success)return t.md?console.log(P("## Sync Failed",`> ${i.error||"Unknown error"}`)):g.fail(i.error||"Sync failed"),{success:!1,error:i.error};if(t.md||g.stop(),t.md){let c=Date.now()-o,l=i.generatedSkills?.generated?.length??0,u=null;try{let E=await Ye.diff(s);E?.hasChanges&&(u=Qa(E))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&yt.isCurrent(s,d),m=null;if(!p)try{let E=await Gd(s,e,i.git,i.stats);m=["## Analysis Payload",XE,"### Data","```json",JSON.stringify(E),"```"].join(`
1303
+ `),console.log("Next steps:"),console.log("\u2022 p. sync \u2192 Generate agents based on stack"),console.log('\u2022 p. task "<description>" \u2192 Start tracked work'),{success:!0,summaryPath:c,data:r}}catch(r){return console.error("\u274C Error:",w(r)),Ne(r)}}async sync(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=Date.now();if(t.package){let c=await j.detectMonorepo(e);if(!c.isMonorepo)return{success:!1,error:"Not a monorepo. --package flag only works in monorepos."};let l=c.packages.find(d=>d.name===t.package||d.relativePath===t.package);if(!l){let d=c.packages.map(p=>p.name).join(", ");return{success:!1,error:`Package "${t.package}" not found. Available: ${d}`}}let u=await Us.sync(e,{packagePath:l.path,packageName:l.name});return t.json?console.log(JSON.stringify({success:u.success,package:l.name,path:l.relativePath})):t.md?console.log(P(je(`Synced package: ${l.name}`))):g.done(`Synced package: ${l.name}`),{success:u.success}}t.md||g.spin("Syncing project...");let i=await Us.sync(e,{full:t.full});if(!i.success)return t.md?console.log(P("## Sync Failed",`> ${i.error||"Unknown error"}`)):g.fail(i.error||"Sync failed"),{success:!1,error:i.error};try{let{generateWiki:c}=await Promise.resolve().then(()=>(cn(),Bn));await c(e,s)}catch{}if(t.md||g.stop(),t.md){let c=Date.now()-o,l=i.generatedSkills?.generated?.length??0,u=null;try{let E=await Ye.diff(s);E?.hasChanges&&(u=Qa(E))}catch{}let d=i.git.recentCommits[0]?.hash??null,p=d&&yt.isCurrent(s,d),m=null;if(!p)try{let E=await Gd(s,e,i.git,i.stats);m=["## Analysis Payload",XE,"### Data","```json",JSON.stringify(E),"```"].join(`
1304
1304
  `)}catch{m="### Next: Run `prjct analysis-payload --md` to update project analysis"}let f=$c("sync",!0),y=null;try{let E=M.recall(s,{types:["context"],limit:5}).map(C=>`- ${Te(C)} \`${C.id}\``);E.length>0&&(y=["### Evaluate recent context","Task contexts captured recently \u2014 fold their decisions, patterns and","anti-patterns into the project analysis (and supersede anything now wrong):","",...E].join(`
1305
- `))}catch{}let R=i.syncMetrics?.indexes,k={Duration:`${(c/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(R?.bm25Files){let E=R.bm25Files*(R.bm25AvgTokens||0);k["Tokens indexed"]=`${Math.round(E/1e3)}K`,k["Import edges"]=R.importEdges||0,k["Co-change commits"]=R.cochangeCommits||0}let S=P(je("Sync Complete"),Ft(k),u,i.git.hasChanges?hS("Uncommitted changes detected"):null,y,m,qe(f.map(E=>({label:E.desc,command:E.cmd}))));return console.log(S),{success:!0,data:i,metrics:{elapsed:c,skillCount:l,fileCount:i.stats.fileCount}}}return FE(i,o)}catch(r){return t.md?console.log(P("## Sync Failed",`> ${w(r)}`)):g.fail(w(r)),Ne(r)}}async analysisPayload(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await Us.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&yt.isCurrent(s,i))return t.md?console.log(P(je("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let c=await Gd(s,e,o.git,o.stats);return t.md?console.log(P("## Analysis Payload",XE,"### Data","```json",JSON.stringify(c),"```")):console.log(JSON.stringify({success:!0,payload:c})),{success:!0,data:c}}catch(r){return Ne(r)}}async regenVault(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(Re(),gy))).default,l=await(await Promise.resolve().then(()=>(K(),ir))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(yn(),br)),m=await p(e,s);return t.md?console.log(`---
1305
+ `))}catch{}let R=i.syncMetrics?.indexes,k={Duration:`${(c/1e3).toFixed(1)}s`,Skills:`${l} generated`,"Files indexed":i.stats.fileCount};if(R?.bm25Files){let E=R.bm25Files*(R.bm25AvgTokens||0);k["Tokens indexed"]=`${Math.round(E/1e3)}K`,k["Import edges"]=R.importEdges||0,k["Co-change commits"]=R.cochangeCommits||0}let S=P(je("Sync Complete"),Ft(k),u,i.git.hasChanges?hS("Uncommitted changes detected"):null,y,m,qe(f.map(E=>({label:E.desc,command:E.cmd}))));return console.log(S),{success:!0,data:i,metrics:{elapsed:c,skillCount:l,fileCount:i.stats.fileCount}}}return FE(i,o)}catch(r){return t.md?console.log(P("## Sync Failed",`> ${w(r)}`)):g.fail(w(r)),Ne(r)}}async analysisPayload(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await Us.sync(e);if(!o.success)return{success:!1,error:o.error||"Failed to gather project data"};let i=o.git.recentCommits[0]?.hash??null;if(i&&yt.isCurrent(s,i))return t.md?console.log(P(je("LLM analysis is current"),"> No re-analysis needed.")):console.log(JSON.stringify({success:!0,action:"skip",message:"Analysis is current"})),{success:!0,message:"Analysis is current"};let c=await Gd(s,e,o.git,o.stats);return t.md?console.log(P("## Analysis Payload",XE,"### Data","```json",JSON.stringify(c),"```")):console.log(JSON.stringify({success:!0,payload:c})),{success:!0,data:c}}catch(r){return Ne(r)}}async regenVault(e=process.cwd(),t={}){try{let r=await ae(e);if(!r.ok)return r.result;let s=r.value,o=await import("node:fs/promises"),i=(await Promise.resolve().then(()=>(Re(),gy))).default,l=await(await Promise.resolve().then(()=>(K(),ar))).default.readConfig(e).catch(()=>null),d=`${await i.getWikiPath(e,l?.vaultPath)}/_generated`;await o.rm(d,{recursive:!0,force:!0});let{generateWiki:p}=await Promise.resolve().then(()=>(cn(),Bn)),m=await p(e,s);return t.md?console.log(`---
1306
1306
 
1307
1307
  ## Vault regenerated
1308
1308
 
@@ -1336,7 +1336,7 @@ Goal: ${c.content.goal}`,tags:{...t.tags??{},spec_id:c.id,status:c.status},sourc
1336
1336
  `)}`),{success:!0,mode:s}}async setMode(e,t,r){let s=await x.readConfig(t).catch(()=>null);if(!s?.projectId)return D("No prjct project here \u2014 run `prjct init` first.",r);s.sdd={mode:e},await x.writeConfig(t,s);let o=e==="off"?"SDD mode off \u2014 the spec pipeline stays escalate-only (no gating).":e==="advisory"?"SDD mode \u2192 advisory. The skill nudges toward a spec for complex work; `ship` surfaces acceptance criteria.":"SDD mode \u2192 strict. Every `prjct task` must link a REVIEWED spec, and `ship` blocks unspecced work (override: `prjct ship --no-spec-gate`).";return r.md?console.log(P("## SDD",`> ${o}`)):g.done(o),{success:!0,mode:e}}};a(Im,"effectiveSddMode");LN={effectiveSddMode:Im,SDD_MODES:ai}});var Mm={};N(Mm,{TddCommands:()=>Dm,_internal:()=>FN,effectiveTddMode:()=>$m});function $m(n){let e=n?.tdd?.mode;if(e&&ci.includes(e))return e;let t=process.env.PRJCT_TDD_MODE?.toLowerCase();return t&&ci.includes(t)?t:"off"}var ci,Dm,FN,Nm=h(()=>{"use strict";K();W();ue();we();Ge();fe();No();xe();ci=["off","assist","strict"],Dm=class extends V{static{a(this,"TddCommands")}async tdd(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();return!o||o==="status"||o==="show"?this.showStatus(t,r):ci.includes(o)?this.setMode(o,t,r):o==="check"?this.check(t,r):L(`Unknown tdd subcommand "${o}". Use: check, or ${ci.join("|")}.`,r)}async showStatus(e,t){let r=await x.readConfig(e).catch(()=>null);if(!r?.projectId)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=$m(r),i=(await Mn(e).catch(()=>null))?.test?.command??null,c=[`Mode: ${s}${s==="off"?" (guidance + ship TDD gate dormant)":""}`,`Test command: ${i??"none detected (add tests to enable the gate)"}`,"Set: prjct tdd off|assist|strict","Check: prjct tdd check \u2014 run the test command now (red/green)"];return t.md?console.log(P("## TDD",`> **Mode**: \`${s}\``,`- Test command: \`${i??"none detected"}\``,c.slice(2).join(`
1337
1337
  `))):g.info(`TDD \u2014 ${c.join(`
1338
1338
  `)}`),{success:!0,mode:s,testCommand:i}}async setMode(e,t,r){let s=await x.readConfig(t).catch(()=>null);if(!s?.projectId)return D("No prjct project here \u2014 run `prjct init` first.",r);s.tdd={mode:e},await x.writeConfig(t,s);let o=e==="off"?"TDD mode off \u2014 test-first guidance and the ship TDD gate are dormant.":e==="assist"?"TDD mode \u2192 assist. Guidance biases test-first (red\u2192green\u2192refactor); `ship` reminds.":"TDD mode \u2192 strict. Test-first expected; `ship` surfaces a hard gate \u2014 run `prjct tdd check` and don't ship on red.";return r.md?console.log(P("## TDD",`> ${o}`)):g.done(o),{success:!0,mode:e}}async check(e,t){let s=(await Mn(e).catch(()=>null))?.test?.command;if(!s){let o="tdd check: no test command detected for this stack. Add a test script first.";return console.log(t.md?P("## TDD check",`> ${o}`):o),{success:!1,reason:"no_test_command"}}try{await q(s,{cwd:e,maxBuffer:32*1024*1024});let o=`tdd check: GREEN \u2014 \`${s}\` passed.`;return console.log(t.md?P("## TDD check",`> \u2705 ${o}`):o),{success:!0,green:!0,testCommand:s}}catch(o){let i=`tdd check: RED \u2014 \`${s}\` failed. Fix before shipping.`;return t.md?console.log(P("## TDD check",`> \u274C ${i}`,w(o))):(g.fail(i),g.info(w(o))),{success:!1,green:!1,testCommand:s}}}};a($m,"effectiveTddMode");FN={effectiveTddMode:$m,TDD_MODES:ci}});function HN(n){if(n==null)return null;if(typeof n=="string")return n;try{return JSON.stringify(n)}catch{return null}}var cT,lT=h(()=>{"use strict";J();cT={async upsert(n,e){let t=e.name||"";if(!t)return;let r=e.description??null,s=HN(e.metadata),o=e.enabled===0?0:1,i=e.is_builtin===1?1:0,c=new Date().toISOString(),l=b.get(n,"SELECT id, is_builtin FROM custom_workflows WHERE name = ?",t);if(l){if(l.is_builtin===1)return;b.run(n,"UPDATE custom_workflows SET description = ?, metadata = ?, enabled = ?, updated_at = ? WHERE name = ? AND is_builtin = 0",r,s,o,c,t);return}b.run(n,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
1339
- VALUES (?, ?, ?, ?, ?, ?, ?)`,t,r,e.created_at||c,c,i,o,s)},async delete(n,e){}};a(HN,"serializeMetadata")});var uT,dT=h(()=>{"use strict";mc();uT={async upsert(n,e){let t=e.id||"";if(!t)return;let r=e.title||e.text||"",s=e.priority||"medium",o=e.status||"active";await Ns.update(n,i=>{let c=i.ideas.findIndex(p=>p.id===t),u={id:t,text:r,priority:s,status:o==="archived"?"archived":"pending",addedAt:i.ideas[c]?.addedAt??e.created_at??e.addedAt??new Date().toISOString(),tags:i.ideas[c]?.tags??[]},d=c>=0?i.ideas.map((p,m)=>m===c?{...p,...u}:p):[...i.ideas,u];return{...i,ideas:d}})},async delete(n,e){}}});function UN(n){if(!n)return{};if(typeof n=="string")try{return JSON.parse(n)}catch{return{}}return typeof n=="object"?n:{}}function Om(n,e,t){return n[e]??n[t]??""}var pT,mT=h(()=>{"use strict";sa();lr();J();a(UN,"asTags");a(Om,"field");pT={async upsert(n,e){let t=Om(e,"content","content"),r=Om(e,"type","type");if(!t||!r)return;let s=UN(e.tags),o=Om(e,"provenance","provenance")||"declared",i=e.source??null,c=_r(t);if(b.get(n,"SELECT id FROM memories WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",c,r))return;let u=b.appendEvent(n,`memory.${ws}${r}`,{content:t,tags:s,source:i,provenance:o});if(u==null)return;let d=`mem_${u}`,p=e.created_at||e.createdAt||new Date().toISOString(),m=new Date().toISOString(),f=(t.split(`
1339
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,t,r,e.created_at||c,c,i,o,s)},async delete(n,e){}};a(HN,"serializeMetadata")});var uT,dT=h(()=>{"use strict";mc();uT={async upsert(n,e){let t=e.id||"";if(!t)return;let r=e.title||e.text||"",s=e.priority||"medium",o=e.status||"active";await Ns.update(n,i=>{let c=i.ideas.findIndex(p=>p.id===t),u={id:t,text:r,priority:s,status:o==="archived"?"archived":"pending",addedAt:i.ideas[c]?.addedAt??e.created_at??e.addedAt??new Date().toISOString(),tags:i.ideas[c]?.tags??[]},d=c>=0?i.ideas.map((p,m)=>m===c?{...p,...u}:p):[...i.ideas,u];return{...i,ideas:d}})},async delete(n,e){}}});function UN(n){if(!n)return{};if(typeof n=="string")try{return JSON.parse(n)}catch{return{}}return typeof n=="object"?n:{}}function Om(n,e,t){return n[e]??n[t]??""}var pT,mT=h(()=>{"use strict";sa();ur();J();a(UN,"asTags");a(Om,"field");pT={async upsert(n,e){let t=Om(e,"content","content"),r=Om(e,"type","type");if(!t||!r)return;let s=UN(e.tags),o=Om(e,"provenance","provenance")||"declared",i=e.source??null,c=_r(t);if(b.get(n,"SELECT id FROM memories WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",c,r))return;let u=b.appendEvent(n,`memory.${ws}${r}`,{content:t,tags:s,source:i,provenance:o});if(u==null)return;let d=`mem_${u}`,p=e.created_at||e.createdAt||new Date().toISOString(),m=new Date().toISOString(),f=(t.split(`
1340
1340
  `)[0]??t).slice(0,80);try{b.run(n,`INSERT OR IGNORE INTO memories
1341
1341
  (id, project_id, title, content, tags, type, provenance, content_hash,
1342
1342
  user_triggered, created_at, updated_at)
@@ -1358,18 +1358,18 @@ Goal: ${c.content.goal}`,tags:{...t.tags??{},spec_id:c.id,status:c.status},sourc
1358
1358
  WHERE project_id = ? AND device_id = ? AND user_id IS NULL`,r,T(),e,t)}upsert(e){b.run(e.projectId,`INSERT INTO sync_cursors (user_id, device_id, project_id, last_event_id, updated_at)
1359
1359
  VALUES (?, ?, ?, ?, ?)
1360
1360
  ON CONFLICT(user_id, device_id, project_id)
1361
- 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}}},JN=new Um});function XN(n){if(IT.has(n))return;IT.add(n);let t=ET.has(n)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${n}' (${t}). code=no_local_handler`)}function zN(n){let e=n.data??{},t=n.content_hash??n.contentHash;if(n.entity_type){let i=(n.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:n.entity_type,eventType:i,data:e,contentHash:t}}if(n.entityType){let i=n.eventType||"upsert";return{entityType:n.entityType,eventType:i==="delete"?"delete":"upsert",data:e,contentHash:t}}let[r,s]=(n.type||"").split("."),o=s==="deleted"||s==="archived"||s==="removed";return{entityType:Zr(r)||r||"unknown",eventType:o?"delete":"upsert",data:e,contentHash:t}}function DT(n){return n instanceof Error?n.message:n&&typeof n=="object"&&"message"in n?String(n.message):"Unknown error"}function $T(n){if(n&&typeof n=="object"&&"code"in n)return n.code}var IT,Bm,KN,cn,ui=h(()=>{"use strict";To();ha();En();TT();tl();AT();li();IT=new Set;a(XN,"warnNoLocalHandler");a(zN,"normalizeEventShape");a(DT,"errorMessage");a($T,"errorCode");Bm=class{static{a(this,"SyncManager")}async hasAuth(){return await ce.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await es.getStatus(e)}catch{return null}}async sync(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let r={success:!0,skipped:!1},s=await this.push(e,t);s.success&&!s.skipped&&(r.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let o=await this.pull(e);return o.success&&!o.skipped&&(r.pulled={count:o.count||0,syncedAt:o.syncedAt||new Date().toISOString()}),(!s.success||!o.success)&&(r.success=!1,r.error=s.error||o.error,r.code=s.code||o.code),r}async push(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let r=await jt.getPending(e),s=t?.include?r.filter(l=>{let u=Zr(l.entityType)??Zr(l.type?.split(".")[0]);return u?CT(u,t.include):!0}):r;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let o=await this.createProjectLinkEvent(e),i=o?[o,...s]:s,c=await es.pushEvents(e,i);if(c.success)return await jt.clearPending(e),await jt.updateLastSync(e),{success:!0,skipped:!1,count:c.processed,syncedAt:c.syncedAt};{let l=c.processed,u=c.errors.length,d=c.errors.map(p=>p.error).join(", ");return{success:!1,skipped:!1,count:l,syncedAt:c.syncedAt,error:`${u} events failed: ${d}`}}}catch(r){return{success:!1,skipped:!1,reason:"error",error:DT(r),code:$T(r)}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(Wm(),Gm)),r=await ce.read(),s=r.deviceId??null,o=r.userId??null,c=(s?t.get(e,o,s):null)?.lastEventId??0,l=await es.pullEvents(e,c);if(l.events.length===0)return await jt.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=c;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>c&&t.advance(e,d,{userId:o,deviceId:s}),await jt.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:DT(t),code:$T(t)}}}async applyPulledEvents(e,t){let r=0;for(let s of t)try{await this.applyEvent(e,s),r++}catch(o){let i=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return r}async applyRealtimeEvent(e,t){try{let r=await ce.read(),s=r.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:c}=await Promise.resolve().then(()=>(Wm(),Gm)),l=r.userId??null,u=r.deviceId??null;if(u){let d=c.get(e,l,u);(!d||i>d.lastEventId)&&c.advance(e,i,{userId:l,deviceId:u})}}return!0}catch(r){return console.error("[realtime] apply failed:",r instanceof Error?r.message:r),!1}}async applyEvent(e,t){let{entityType:r,eventType:s,data:o,contentHash:i}=zN(t),c=o.id??"",l=Fm[r];if(!l){XN(r);return}if(s==="delete"){await l.delete(e,o),c&&PT(e,r,c);return}i&&this.alreadyApplied(e,r,c,i)||(await l.upsert(e,o),i&&c&&xT(e,r,c,i))}alreadyApplied(e,t,r,s){if(!r)return!1;let o=RT(e,t,r);return o!==null&&o===s}async createProjectLinkEvent(e){try{let t=await ga(e).catch(()=>({}));return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e,meta:t},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},KN=new Bm,cn=KN});var qm={};N(qm,{flushIfLinked:()=>YN});async function YN(n,e){try{let t=e??null;if(!t){let{default:s}=await Promise.resolve().then(()=>(K(),ir));t=await s.readConfig(n).catch(()=>null)}if(!t?.projectId||!t.cloud?.enabled||t.cloud.paused)return{ran:!1};if(!await cn.hasAuth())return{ran:!1};let r=await cn.sync(t.projectId,{include:t.cloud.include??{}});return{ran:!0,pushed:r.pushed?.count??0,pulled:r.pulled?.count??0,error:r.success?void 0:r.error}}catch{return{ran:!1}}}var Vm=h(()=>{"use strict";ui();a(YN,"flushIfLinked")});var rl={};N(rl,{ShippingCommands:()=>Jm,seedCodeShipRules:()=>zm});import{existsSync as NT}from"node:fs";import OT from"node:path";function MT(n){let e=n?.trim();return e||null}async function QN(n){let e=await bs(n);if(!e)return null;let t=e.replace(/^refs\/heads\//,"").trim();if(!t||/^(main|master|develop|development|dev|trunk)$/i.test(t))return null;let r=t.split("/").filter(Boolean).at(-1)??t;if(!r||/^\d+(?:\.\d+)*$/.test(r))return null;let s=r.replace(/^[a-z]+-\d+[-_]/i,"").replace(/[_-]+/g," ").replace(/[^\p{L}\p{N} ]+/gu," ").replace(/\s+/g," ").trim();return s.length>=3?s:null}function LT(n){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>NT(OT.join(n,t)))}function Xm(n){return NT(OT.join(n,".git"))}async function zm(n,e){if(!LT(e))return!1;let t=new Date().toISOString(),r=re.getRulesForCommand(n,"ship"),s=new Set(r.map(d=>d.action)),i=r.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,c=[];Xm(e)&&c.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}];Xm(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 c)s.has(d.action)||(re.addRule(n,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)s.has(d.action)||(re.addRule(n,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function ZN(n,e,t,r){if(r.intent==="proceed"||r.intent==="register-only")return null;if(!t.some(c=>c.type==="step"&&c.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:LT(e)}};if(await Et(n,e))return null;let i=await t0(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 e0(n,e){if(e){let t=P(F("Clarification needed",n.question),F("Options",Pe(n.options.map(r=>`\`prjct ship --intent=${r}\``))),n.state?F("State",Pe(Object.entries(n.state).map(([r,s])=>`${r}: ${JSON.stringify(s)}`))):null);console.log(t);return}console.log(`
1361
+ 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}}},JN=new Um});function XN(n){if(IT.has(n))return;IT.add(n);let t=ET.has(n)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${n}' (${t}). code=no_local_handler`)}function zN(n){let e=n.data??{},t=n.content_hash??n.contentHash;if(n.entity_type){let i=(n.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:n.entity_type,eventType:i,data:e,contentHash:t}}if(n.entityType){let i=n.eventType||"upsert";return{entityType:n.entityType,eventType:i==="delete"?"delete":"upsert",data:e,contentHash:t}}let[r,s]=(n.type||"").split("."),o=s==="deleted"||s==="archived"||s==="removed";return{entityType:Zr(r)||r||"unknown",eventType:o?"delete":"upsert",data:e,contentHash:t}}function DT(n){return n instanceof Error?n.message:n&&typeof n=="object"&&"message"in n?String(n.message):"Unknown error"}function $T(n){if(n&&typeof n=="object"&&"code"in n)return n.code}var IT,Bm,KN,ln,ui=h(()=>{"use strict";To();ha();En();TT();tl();AT();li();IT=new Set;a(XN,"warnNoLocalHandler");a(zN,"normalizeEventShape");a(DT,"errorMessage");a($T,"errorCode");Bm=class{static{a(this,"SyncManager")}async hasAuth(){return await ce.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await es.getStatus(e)}catch{return null}}async sync(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let r={success:!0,skipped:!1},s=await this.push(e,t);s.success&&!s.skipped&&(r.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let o=await this.pull(e);return o.success&&!o.skipped&&(r.pulled={count:o.count||0,syncedAt:o.syncedAt||new Date().toISOString()}),(!s.success||!o.success)&&(r.success=!1,r.error=s.error||o.error,r.code=s.code||o.code),r}async push(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let r=await jt.getPending(e),s=t?.include?r.filter(l=>{let u=Zr(l.entityType)??Zr(l.type?.split(".")[0]);return u?CT(u,t.include):!0}):r;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let o=await this.createProjectLinkEvent(e),i=o?[o,...s]:s,c=await es.pushEvents(e,i);if(c.success)return await jt.clearPending(e),await jt.updateLastSync(e),{success:!0,skipped:!1,count:c.processed,syncedAt:c.syncedAt};{let l=c.processed,u=c.errors.length,d=c.errors.map(p=>p.error).join(", ");return{success:!1,skipped:!1,count:l,syncedAt:c.syncedAt,error:`${u} events failed: ${d}`}}}catch(r){return{success:!1,skipped:!1,reason:"error",error:DT(r),code:$T(r)}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(Wm(),Gm)),r=await ce.read(),s=r.deviceId??null,o=r.userId??null,c=(s?t.get(e,o,s):null)?.lastEventId??0,l=await es.pullEvents(e,c);if(l.events.length===0)return await jt.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=c;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>c&&t.advance(e,d,{userId:o,deviceId:s}),await jt.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:DT(t),code:$T(t)}}}async applyPulledEvents(e,t){let r=0;for(let s of t)try{await this.applyEvent(e,s),r++}catch(o){let i=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return r}async applyRealtimeEvent(e,t){try{let r=await ce.read(),s=r.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:c}=await Promise.resolve().then(()=>(Wm(),Gm)),l=r.userId??null,u=r.deviceId??null;if(u){let d=c.get(e,l,u);(!d||i>d.lastEventId)&&c.advance(e,i,{userId:l,deviceId:u})}}return!0}catch(r){return console.error("[realtime] apply failed:",r instanceof Error?r.message:r),!1}}async applyEvent(e,t){let{entityType:r,eventType:s,data:o,contentHash:i}=zN(t),c=o.id??"",l=Fm[r];if(!l){XN(r);return}if(s==="delete"){await l.delete(e,o),c&&PT(e,r,c);return}i&&this.alreadyApplied(e,r,c,i)||(await l.upsert(e,o),i&&c&&xT(e,r,c,i))}alreadyApplied(e,t,r,s){if(!r)return!1;let o=RT(e,t,r);return o!==null&&o===s}async createProjectLinkEvent(e){try{let t=await ga(e).catch(()=>({}));return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e,meta:t},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},KN=new Bm,ln=KN});var qm={};N(qm,{flushIfLinked:()=>YN});async function YN(n,e){try{let t=e??null;if(!t){let{default:s}=await Promise.resolve().then(()=>(K(),ar));t=await s.readConfig(n).catch(()=>null)}if(!t?.projectId||!t.cloud?.enabled||t.cloud.paused)return{ran:!1};if(!await ln.hasAuth())return{ran:!1};let r=await ln.sync(t.projectId,{include:t.cloud.include??{}});return{ran:!0,pushed:r.pushed?.count??0,pulled:r.pulled?.count??0,error:r.success?void 0:r.error}}catch{return{ran:!1}}}var Vm=h(()=>{"use strict";ui();a(YN,"flushIfLinked")});var rl={};N(rl,{ShippingCommands:()=>Jm,seedCodeShipRules:()=>zm});import{existsSync as NT}from"node:fs";import OT from"node:path";function MT(n){let e=n?.trim();return e||null}async function QN(n){let e=await bs(n);if(!e)return null;let t=e.replace(/^refs\/heads\//,"").trim();if(!t||/^(main|master|develop|development|dev|trunk)$/i.test(t))return null;let r=t.split("/").filter(Boolean).at(-1)??t;if(!r||/^\d+(?:\.\d+)*$/.test(r))return null;let s=r.replace(/^[a-z]+-\d+[-_]/i,"").replace(/[_-]+/g," ").replace(/[^\p{L}\p{N} ]+/gu," ").replace(/\s+/g," ").trim();return s.length>=3?s:null}function LT(n){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>NT(OT.join(n,t)))}function Xm(n){return NT(OT.join(n,".git"))}async function zm(n,e){if(!LT(e))return!1;let t=new Date().toISOString(),r=re.getRulesForCommand(n,"ship"),s=new Set(r.map(d=>d.action)),i=r.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,c=[];Xm(e)&&c.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}];Xm(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 c)s.has(d.action)||(re.addRule(n,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)s.has(d.action)||(re.addRule(n,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function ZN(n,e,t,r){if(r.intent==="proceed"||r.intent==="register-only")return null;if(!t.some(c=>c.type==="step"&&c.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:LT(e)}};if(await Et(n,e))return null;let i=await t0(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 e0(n,e){if(e){let t=P(F("Clarification needed",n.question),F("Options",Pe(n.options.map(r=>`\`prjct ship --intent=${r}\``))),n.state?F("State",Pe(Object.entries(n.state).map(([r,s])=>`${r}: ${JSON.stringify(s)}`))):null);console.log(t);return}console.log(`
1362
1362
  \u26A0\uFE0F ${n.question}`),console.log(`
1363
1363
  Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}async function t0(n){if(!Xm(n))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(ue(),uu)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:n,timeout:3e3}),r=t.toString().trim();if(!r)return null;let{stdout:s}=await e("gh",["pr","list","--head",r,"--state","open","--json","number,title","--limit","1"],{cwd:n,timeout:5e3}),o=JSON.parse(s.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:r}}catch{return null}}var nl,Jm,sl=h(()=>{"use strict";K();Fp();Un();_o();J();Yr();Pn();W();ie();we();Ge();ei();fe();No();Ca();xe();Jt();nl="ship:in_progress",Jm=class extends V{static{a(this,"ShippingCommands")}async ship(e,t=process.cwd(),r={}){try{let s=await ae(t);if(!s.ok)return s.result;let o=s.value;try{let E=I.getDoc(o,nl);E?.version&&(await St.getByVersion(o,E.version)||(await St.addShipped(o,{name:E.feature,version:E.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${E.feature} (v${E.version})`)),I.deleteDoc(o,nl))}catch{}let i=MT(e),c=await Et(o,t),l=c?.linkedSpecId;if(c&&(i||(i=MT(c.description)),await Km(o,t)),!r.noSpecGate&&!l)try{let E=await x.readConfig(t).catch(()=>null),{effectiveSddMode:C}=await Promise.resolve().then(()=>(Zc(),Qc));if(C(E)==="strict")return{success:!1,error:"Strict SDD: this work has no linked spec. Start it via `prjct spec` \u2192 `audit-spec` \u2192 `prjct task --spec <id>`, or override with `prjct ship --no-spec-gate`."}}catch{}if(l&&!r.noSpecGate)try{let{specService:E}=await Promise.resolve().then(()=>(zs(),ii)),C=await E.get(t,l);if(C&&C.content.acceptance_criteria.length>0){let O=[];O.push(""),O.push(`## Spec acceptance gate \u2014 \`${C.title}\` (${C.id.slice(0,8)})`),O.push(""),O.push("Walk each criterion. STOP if any is unmet."),O.push("");for(let Q of C.content.acceptance_criteria)O.push(`- [ ] ${Q}`);O.push(""),O.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),O.push(""),console.log(O.join(`
1364
1364
  `))}}catch{}if(!r.noTestGate)try{let{effectiveTddMode:E}=await Promise.resolve().then(()=>(Nm(),Mm)),C=await x.readConfig(t).catch(()=>null),O=E(C);if(O!=="off"){let me=(await Mn(t).catch(()=>null))?.test?.command,ne=[""];O==="strict"?(ne.push("## TDD gate (strict) \u2014 tests must be green before ship"),ne.push(""),ne.push(me?`Run \`prjct tdd check\` (\`${me}\`). STOP and fix if RED.`:"No test command detected \u2014 add tests (strict TDD expects them)."),ne.push("Override (only with explicit user consent): `prjct ship --no-test-gate`.")):(ne.push("## TDD reminder (assist)"),ne.push(""),ne.push(me?`Did the change ship with tests? Verify green: \`prjct tdd check\` (\`${me}\`).`:"Consider adding a test for this change.")),ne.push(""),console.log(ne.join(`
1365
- `))}}catch{}let u=re.getRulesForCommand(o,"ship");if(r.intent==="seed-code-workflow"){if(!await zm(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=re.getRulesForCommand(o,"ship")}!u.some(E=>E.type==="step"&&E.position==="before")&&r.intent!=="register-only"&&await zm(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=re.getRulesForCommand(o,"ship"));let p=await ZN(o,t,u,r);if(p)return e0(p,r.md===!0),{success:!1,clarification:p};if(i=i??await QN(t),!i)return{success:!1,error:'Ship needs a release description. Pass one explicitly, e.g. `prjct ship "add universal agent compatibility"`, or ship from a named feature branch.'};let m={feature:i},f=await An(o,"ship","before",{projectPath:t,skipRules:r.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{I.setDoc(o,nl,{feature:i,version:y,startedAt:T()})}catch{}await St.addShipped(o,{name:i,version:y});try{I.deleteDoc(o,nl)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:y,timestamp:T()});let R=await An(o,"ship","after",{projectPath:t,skipRules:r.skipHooks,runContext:m}),k=[...f.instructions,...R.instructions];try{await Us.sync(t)}catch(E){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(E))}try{let{regenerateWikiDeferred:E}=await Promise.resolve().then(()=>(yn(),br));await E(t,o)}catch(E){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",w(E))}let S=f.stepsRun.length+R.stepsRun.length;if(r.md){let E=$c("ship",!0),C=P(je(`Shipped: ${i}`,`Version: ${y}`),F("Results",Pe([`Version: ${y}`,`Workflow steps run: ${S>0?[...f.stepsRun,...R.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${f.hooksFailed.length+R.hooksFailed.length}`])),k.length>0?F("Agent Instructions",Pe(k)):null,qe(E.map(O=>({label:O.desc,command:O.cmd}))));console.log(C)}else g.done(`v${y} shipped`),Gs("ship");if(c?.id)try{let{usefulnessService:E}=await Promise.resolve().then(()=>(Ln(),Dd));E.creditShippedTask(o,c.id)}catch{}return(async()=>{try{let{flushIfLinked:E}=await Promise.resolve().then(()=>(Vm(),qm));await E(t)}catch{}})(),{success:!0,feature:i,version:y}}catch(s){return g.fail(w(s)),Ne(s)}}};a(MT,"normalizeShipFeature");a(QN,"inferShipFeatureFromBranch");a(LT,"isCodeProject");a(Xm,"isGitRepo");a(zm,"seedCodeShipRules");a(ZN,"buildClarification");a(e0,"renderClarification");a(t0,"findOpenPrForBranch")});var ol={};N(ol,{PlanningCommands:()=>Qm});async function n0(){if(!Ym){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(Kc(),zc));Ym=new n}return Ym}var Ym,Qm,il=h(()=>{"use strict";ba();Dn();K();Re();Es();Pn();W();we();fe();No();kk();xe();Ym=null;a(n0,"getAnalysisCommands");Qm=class extends V{static{a(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let r={};if(typeof e=="string"||e===null?r={idea:e}:r=e,await this.initializeAgent(),await x.isConfigured(t))return g.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=r.yes||!o||process.env.CI==="true",c=null;if(i)o&&r.yes&&(c=await new Oo(t).runNonInteractive());else if(c=await new Oo(t).run(),c.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await ys(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await x.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,r),g.step(2,4,"Creating structure..."),await j.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 n0();if((await k.analyze({},t)).success){g.step(4,4,"Generating agents..."),await k.sync(t);let E=await Bt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,E??void 0),{success:!0,mode:"existing",projectId:p,wizard:c}}}let y=r.idea;if(m&&!f){if(!y){await et.installGlobalConfig();let E=await Bt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("blank project - provide idea for architect mode"),this._printNextSteps(c,E??void 0),{success:!0,mode:"blank_no_idea",projectId:p,wizard:c}}g.spin("architect mode...");let{projectMemory:k}=await Promise.resolve().then(()=>(ke(),Ya));await k.remember(t,{type:"idea",content:y,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await et.installGlobalConfig();let S=await Bt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("architect mode ready"),this._printNextSteps(c,S??void 0),{success:!0,mode:"architect",projectId:p,idea:y,wizard:c}}await et.installGlobalConfig();let R=await Bt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,R??void 0),{success:!0,projectId:p,wizard:c}}catch(r){return g.fail(w(r)),Ne(r)}}_printNextSteps(e,t){console.log(""),console.log(" \u2713 global prjct router refreshed where supported"),t?.claudeMd&&console.log(" \u2713 project CLAUDE.md updated with routing block"),t?.agentsMd&&console.log(" \u2713 project AGENTS.md updated with universal routing block"),(t?.ideRules.length??0)>0&&console.log(` \u2713 project IDE rules updated: ${t?.ideRules.join(", ")}`),console.log(""),console.log(" You don't run prjct commands. Your AI coding agent does."),console.log(""),console.log(" Just describe what you're doing \u2014 the agent 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 _agentSelections(e,t){if(e)return e.agents;try{let{detectInstalledAgents:r}=await Promise.resolve().then(()=>(Ua(),Sd));return r(t)}catch{return[]}}async _applyInitialPacksAndPersona(e,t){let{activatePacks:r,detectSuggestedPacks:s}=await Promise.resolve().then(()=>(Tm(),KE)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await s(e)),o.length>0&&await r(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(K(),ir))).default,c=await i.readConfig(e);if(c){let l=c.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...c,persona:l})}}}async _seedShipWorkflow(e,t){let r=await Mn(t),s=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(sl(),rl));await o(e,t),s=re.getRulesForCommand(e,"ship").reduce((i,c)=>Math.max(i,c.sortOrder??0),0)+1,re.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()}),r.lint&&re.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),r.test&&re.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var Zm,gn,FT,Va=h(()=>{"use strict";Rn();ba();K();Re();W();ee();fe();Zm=class{static{a(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await x.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(Qi(),Yi));if(await o.detect(e)){let c=await o.getMainWorktree(e);if(c&&c!==e&&await x.isConfigured(c))return await o.setup(e,c),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(il(),ol)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await x.getProjectId(e);if(!t)throw ma.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await j.ensureProjectStructure(t),j.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ys();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 Yn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return B(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 Yn(e)).some(s=>t.includes(s))}catch(t){return B(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await x.isConfigured(e)}async needsMigration(e){return await x.needsMigration(e)}},gn=new Zm,FT=gn});function HT(n){let e=n.toLowerCase(),t=o0(e),r=r0.some(d=>e.includes(d)),s=vr(e,["security","seguridad","auth","permission","secret","migration","sqlite","database","arquitectura","architecture","must","critical","critico","cr\xEDtico"]),o=i0(t,e,s),i=a0(o,s),c=c0(t,o,r),l=l0(o),u=d0(n);return{level:o,kind:t,risk:i,expectedEvidence:c,scopeHints:u,gates:l,rationale:u0(o,t,i),createdAt:T()}}async function ef(n,e){let t=e.harness;if(!t||t.level==="H0")return{changedFiles:[],observedEvidence:[],warnings:[]};let r=await h0(n),s=p0(r),o=[];t.expectedEvidence.includes("regression-test")&&!s.includes("tests-changed")&&o.push(`${t.level} expects a regression test; no test file changed in the diff.`),t.expectedEvidence.includes("docs-if-public-behavior")&&g0(r)&&!s.includes("docs-changed")&&o.push("Public-facing files changed; no README/docs/changelog file changed.");let i=await y0(n);return i>400&&o.push(`Diff is ${i} changed lines; consider splitting or justify the scope.`),{changedFiles:r,observedEvidence:s,warnings:o}}function o0(n){return vr(n,["security","seguridad","auth","permission","secret"])?"security":vr(n,["bug","fix","falla","fallo","error","broken","regression","no se"])?"bug":vr(n,["refactor","cleanup","split","restructure"])?"refactor":vr(n,["doc","readme","changelog","typo"])?"docs":vr(n,["chore","format","lint"])?"chore":vr(n,["add","agrega","crear","implement","implementa","feature","mejora"])?"feature":"unknown"}function i0(n,e,t){return n==="docs"||n==="chore"?"H0":n==="security"||t&&vr(e,["migration","sqlite","database","architecture","arquitectura"])?"H3":n==="feature"||n==="refactor"?"H2":"H1"}function a0(n,e){return n==="H3"||e?"high":n==="H2"||n==="H1"?"medium":"low"}function c0(n,e,t){let r=new Set;return n==="bug"&&(r.add("regression-test"),r.add("focused-tests"),r.add("edge-cases")),(n==="feature"||n==="refactor")&&(r.add("focused-tests"),r.add("scope-check")),t&&r.add("docs-if-public-behavior"),(e==="H2"||e==="H3")&&r.add("spec-or-design"),e==="H3"&&r.add("config-preservation"),[...r]}function l0(n){return n==="H0"?[]:n==="H1"?["verify-before-done"]:n==="H2"?["verify-before-done","scope-check"]:["spec-before-implementation","verify-before-done","scope-check","review-before-ship"]}function u0(n,e,t){return n==="H0"?`Low-risk ${e}; keep the task direct and low-friction.`:`${n} ${e}/${t}; define expected evidence up front and verify before closure.`}function d0(n){let e=n.toLowerCase().normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").split(/[^a-z0-9_.-]+/u).filter(t=>t.length>=3&&!s0.has(t));return[...new Set(e)].slice(0,8)}function vr(n,e){return e.some(t=>n.includes(t))}function p0(n){let e=new Set;return n.some(m0)&&e.add("tests-changed"),n.some(f0)&&e.add("docs-changed"),[...e]}function m0(n){return/(^|\/)(__tests__|tests?|specs?)\//.test(n)||/\.(test|spec)\.[cm]?[tj]sx?$/.test(n)}function f0(n){return/(^|\/)(README|CHANGELOG|docs\/)/i.test(n)}function g0(n){return n.some(e=>e.startsWith("core/commands/")||e.startsWith("core/mcp/")||e.startsWith("templates/")||e==="README.md")}async function h0(n){let e=new Set;try{let{stdout:t}=await G("git",["diff","--name-only","HEAD"],{cwd:n});for(let r of t.split(`
1365
+ `))}}catch{}let u=re.getRulesForCommand(o,"ship");if(r.intent==="seed-code-workflow"){if(!await zm(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=re.getRulesForCommand(o,"ship")}!u.some(E=>E.type==="step"&&E.position==="before")&&r.intent!=="register-only"&&await zm(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=re.getRulesForCommand(o,"ship"));let p=await ZN(o,t,u,r);if(p)return e0(p,r.md===!0),{success:!1,clarification:p};if(i=i??await QN(t),!i)return{success:!1,error:'Ship needs a release description. Pass one explicitly, e.g. `prjct ship "add universal agent compatibility"`, or ship from a named feature branch.'};let m={feature:i},f=await An(o,"ship","before",{projectPath:t,skipRules:r.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{I.setDoc(o,nl,{feature:i,version:y,startedAt:T()})}catch{}await St.addShipped(o,{name:i,version:y});try{I.deleteDoc(o,nl)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:y,timestamp:T()});let R=await An(o,"ship","after",{projectPath:t,skipRules:r.skipHooks,runContext:m}),k=[...f.instructions,...R.instructions];try{await Us.sync(t)}catch(E){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(E))}try{let{regenerateWikiDeferred:E}=await Promise.resolve().then(()=>(cn(),Bn));await E(t,o)}catch(E){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",w(E))}let S=f.stepsRun.length+R.stepsRun.length;if(r.md){let E=$c("ship",!0),C=P(je(`Shipped: ${i}`,`Version: ${y}`),F("Results",Pe([`Version: ${y}`,`Workflow steps run: ${S>0?[...f.stepsRun,...R.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${f.hooksFailed.length+R.hooksFailed.length}`])),k.length>0?F("Agent Instructions",Pe(k)):null,qe(E.map(O=>({label:O.desc,command:O.cmd}))));console.log(C)}else g.done(`v${y} shipped`),Gs("ship");if(c?.id)try{let{usefulnessService:E}=await Promise.resolve().then(()=>(Ln(),Dd));E.creditShippedTask(o,c.id)}catch{}return(async()=>{try{let{flushIfLinked:E}=await Promise.resolve().then(()=>(Vm(),qm));await E(t)}catch{}})(),{success:!0,feature:i,version:y}}catch(s){return g.fail(w(s)),Ne(s)}}};a(MT,"normalizeShipFeature");a(QN,"inferShipFeatureFromBranch");a(LT,"isCodeProject");a(Xm,"isGitRepo");a(zm,"seedCodeShipRules");a(ZN,"buildClarification");a(e0,"renderClarification");a(t0,"findOpenPrForBranch")});var ol={};N(ol,{PlanningCommands:()=>Qm});async function n0(){if(!Ym){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(Kc(),zc));Ym=new n}return Ym}var Ym,Qm,il=h(()=>{"use strict";ba();Dn();K();Re();Es();Pn();W();we();fe();No();kk();xe();Ym=null;a(n0,"getAnalysisCommands");Qm=class extends V{static{a(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let r={};if(typeof e=="string"||e===null?r={idea:e}:r=e,await this.initializeAgent(),await x.isConfigured(t))return g.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=r.yes||!o||process.env.CI==="true",c=null;if(i)o&&r.yes&&(c=await new Oo(t).runNonInteractive());else if(c=await new Oo(t).run(),c.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await ys(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await x.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,r),g.step(2,4,"Creating structure..."),await j.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 n0();if((await k.analyze({},t)).success){g.step(4,4,"Generating agents..."),await k.sync(t);let E=await Bt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,E??void 0),{success:!0,mode:"existing",projectId:p,wizard:c}}}let y=r.idea;if(m&&!f){if(!y){await et.installGlobalConfig();let E=await Bt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("blank project - provide idea for architect mode"),this._printNextSteps(c,E??void 0),{success:!0,mode:"blank_no_idea",projectId:p,wizard:c}}g.spin("architect mode...");let{projectMemory:k}=await Promise.resolve().then(()=>(ke(),Ya));await k.remember(t,{type:"idea",content:y,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await et.installGlobalConfig();let S=await Bt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("architect mode ready"),this._printNextSteps(c,S??void 0),{success:!0,mode:"architect",projectId:p,idea:y,wizard:c}}await et.installGlobalConfig();let R=await Bt(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,R??void 0),{success:!0,projectId:p,wizard:c}}catch(r){return g.fail(w(r)),Ne(r)}}_printNextSteps(e,t){console.log(""),console.log(" \u2713 global prjct router refreshed where supported"),t?.claudeMd&&console.log(" \u2713 project CLAUDE.md updated with routing block"),t?.agentsMd&&console.log(" \u2713 project AGENTS.md updated with universal routing block"),(t?.ideRules.length??0)>0&&console.log(` \u2713 project IDE rules updated: ${t?.ideRules.join(", ")}`),console.log(""),console.log(" You don't run prjct commands. Your AI coding agent does."),console.log(""),console.log(" Just describe what you're doing \u2014 the agent 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 _agentSelections(e,t){if(e)return e.agents;try{let{detectInstalledAgents:r}=await Promise.resolve().then(()=>(Ua(),Sd));return r(t)}catch{return[]}}async _applyInitialPacksAndPersona(e,t){let{activatePacks:r,detectSuggestedPacks:s}=await Promise.resolve().then(()=>(Tm(),KE)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await s(e)),o.length>0&&await r(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(K(),ar))).default,c=await i.readConfig(e);if(c){let l=c.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...c,persona:l})}}}async _seedShipWorkflow(e,t){let r=await Mn(t),s=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(sl(),rl));await o(e,t),s=re.getRulesForCommand(e,"ship").reduce((i,c)=>Math.max(i,c.sortOrder??0),0)+1,re.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()}),r.lint&&re.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),r.test&&re.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var Zm,hn,FT,Va=h(()=>{"use strict";Rn();ba();K();Re();W();ee();fe();Zm=class{static{a(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await x.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(Qi(),Yi));if(await o.detect(e)){let c=await o.getMainWorktree(e);if(c&&c!==e&&await x.isConfigured(c))return await o.setup(e,c),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(il(),ol)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await x.getProjectId(e);if(!t)throw ma.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await j.ensureProjectStructure(t),j.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await ys();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 Qn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return B(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 Qn(e)).some(s=>t.includes(s))}catch(t){return B(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await x.isConfigured(e)}async needsMigration(e){return await x.needsMigration(e)}},hn=new Zm,FT=hn});function HT(n){let e=n.toLowerCase(),t=o0(e),r=r0.some(d=>e.includes(d)),s=vr(e,["security","seguridad","auth","permission","secret","migration","sqlite","database","arquitectura","architecture","must","critical","critico","cr\xEDtico"]),o=i0(t,e,s),i=a0(o,s),c=c0(t,o,r),l=l0(o),u=d0(n);return{level:o,kind:t,risk:i,expectedEvidence:c,scopeHints:u,gates:l,rationale:u0(o,t,i),createdAt:T()}}async function ef(n,e){let t=e.harness;if(!t||t.level==="H0")return{changedFiles:[],observedEvidence:[],warnings:[]};let r=await h0(n),s=p0(r),o=[];t.expectedEvidence.includes("regression-test")&&!s.includes("tests-changed")&&o.push(`${t.level} expects a regression test; no test file changed in the diff.`),t.expectedEvidence.includes("docs-if-public-behavior")&&g0(r)&&!s.includes("docs-changed")&&o.push("Public-facing files changed; no README/docs/changelog file changed.");let i=await y0(n);return i>400&&o.push(`Diff is ${i} changed lines; consider splitting or justify the scope.`),{changedFiles:r,observedEvidence:s,warnings:o}}function o0(n){return vr(n,["security","seguridad","auth","permission","secret"])?"security":vr(n,["bug","fix","falla","fallo","error","broken","regression","no se"])?"bug":vr(n,["refactor","cleanup","split","restructure"])?"refactor":vr(n,["doc","readme","changelog","typo"])?"docs":vr(n,["chore","format","lint"])?"chore":vr(n,["add","agrega","crear","implement","implementa","feature","mejora"])?"feature":"unknown"}function i0(n,e,t){return n==="docs"||n==="chore"?"H0":n==="security"||t&&vr(e,["migration","sqlite","database","architecture","arquitectura"])?"H3":n==="feature"||n==="refactor"?"H2":"H1"}function a0(n,e){return n==="H3"||e?"high":n==="H2"||n==="H1"?"medium":"low"}function c0(n,e,t){let r=new Set;return n==="bug"&&(r.add("regression-test"),r.add("focused-tests"),r.add("edge-cases")),(n==="feature"||n==="refactor")&&(r.add("focused-tests"),r.add("scope-check")),t&&r.add("docs-if-public-behavior"),(e==="H2"||e==="H3")&&r.add("spec-or-design"),e==="H3"&&r.add("config-preservation"),[...r]}function l0(n){return n==="H0"?[]:n==="H1"?["verify-before-done"]:n==="H2"?["verify-before-done","scope-check"]:["spec-before-implementation","verify-before-done","scope-check","review-before-ship"]}function u0(n,e,t){return n==="H0"?`Low-risk ${e}; keep the task direct and low-friction.`:`${n} ${e}/${t}; define expected evidence up front and verify before closure.`}function d0(n){let e=n.toLowerCase().normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").split(/[^a-z0-9_.-]+/u).filter(t=>t.length>=3&&!s0.has(t));return[...new Set(e)].slice(0,8)}function vr(n,e){return e.some(t=>n.includes(t))}function p0(n){let e=new Set;return n.some(m0)&&e.add("tests-changed"),n.some(f0)&&e.add("docs-changed"),[...e]}function m0(n){return/(^|\/)(__tests__|tests?|specs?)\//.test(n)||/\.(test|spec)\.[cm]?[tj]sx?$/.test(n)}function f0(n){return/(^|\/)(README|CHANGELOG|docs\/)/i.test(n)}function g0(n){return n.some(e=>e.startsWith("core/commands/")||e.startsWith("core/mcp/")||e.startsWith("templates/")||e==="README.md")}async function h0(n){let e=new Set;try{let{stdout:t}=await G("git",["diff","--name-only","HEAD"],{cwd:n});for(let r of t.split(`
1366
1366
  `)){let s=r.trim();s&&e.add(s)}}catch{return[]}try{let{stdout:t}=await G("git",["ls-files","--others","--exclude-standard"],{cwd:n});for(let r of t.split(`
1367
- `)){let s=r.trim();s&&e.add(s)}}catch{}return[...e].sort()}async function y0(n){try{let{stdout:e}=await G("git",["diff","--shortstat","HEAD"],{cwd:n}),t=Number.parseInt(e.match(/(\d+) insertions?/)?.[1]??"0",10),r=Number.parseInt(e.match(/(\d+) deletions?/)?.[1]??"0",10);return t+r}catch{return 0}}var r0,s0,UT=h(()=>{"use strict";ie();ue();r0=["cli","command","install","setup","doctor","mcp","codex","claude","statusline","statusbar","output","help"],s0=new Set(["the","and","for","with","that","this","task","implement","implementa","fix","bug","add","agrega","crear","hacer","esto","debe"]);a(HT,"buildTaskHarness");a(ef,"evaluateHarnessCompletion");a(o0,"detectKind");a(i0,"detectLevel");a(a0,"detectRisk");a(c0,"expectedEvidenceFor");a(l0,"gatesFor");a(u0,"rationaleFor");a(d0,"extractScopeHints");a(vr,"hasAny");a(p0,"observedEvidenceFromFiles");a(m0,"isTestFile");a(f0,"isDocsFile");a(g0,"touchesPublicSurface");a(h0,"readChangedFiles");a(y0,"readDiffSize")});function b0(n){let e=n.trim(),t=w0.some(s=>s.test(e)),r=k0.some(s=>s.test(e));return t&&!r?{kind:"trivial",station:"direct",requiresSpec:!1,requiresTestsFirst:!1,reason:"trivial-keyword"}:r?{kind:"substantive",station:"spec_required",requiresSpec:!0,requiresTestsFirst:!0,reason:"substantive-keyword"}:{kind:"trivial",station:"direct",requiresSpec:!1,requiresTestsFirst:!1,reason:"conservative-default"}}function GT(n,e){let t=b0(n);return t.kind==="substantive"&&e?{...t,station:"test_red",reason:"linked-spec"}:t}function WT(n){switch(n.station){case"direct":return"Proceed directly; no spec is required for this trivial task.";case"spec_required":return"Create or link a reviewed spec before implementation; write tests before implementation from the spec acceptance criteria.";case"test_red":return"Write failing tests before implementation, covering the linked spec acceptance criteria and edge cases.";case"implementation":return"Implement the minimum code needed to make the existing tests pass.";case"verify":return"Run verification and keep the task blocked on red tests."}}var w0,k0,BT=h(()=>{"use strict";w0=[/\btypo\b/i,/\bdocs?\b/i,/\breadme\b/i,/\bformat\b/i,/\bchangelog\b/i,/\brerun\b.*\btests?\b/i,/\bre-?run\b.*\btests?\b/i],k0=[/\badd\b/i,/\bimplement\b/i,/\bcreate\b/i,/\bbuild\b/i,/\bfeature\b/i,/\bbilling\b/i,/\bauth\b/i,/\bsecurity\b/i,/\bmigration\b/i,/\bretry\b/i,/\bfailure\b/i,/\brecovery\b/i,/\baudit\b/i,/\bworkflow\b/i,/\borchestrat/i];a(b0,"classifyTaskPipeline");a(GT,"decideTaskPipeline");a(WT,"formatTaskPipelineNextAction")});function nf(n,e){return/openrouter\.ai/i.test(e)&&n&&!n.includes("/")?`openai/${n}`:n}function rf(n){let e=n.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 v0(n){if(!(typeof n!="string"||!n.trim()))try{let e=JSON.parse(n);if(e&&typeof e=="object"&&!Array.isArray(e)){let t={};for(let[r,s]of Object.entries(e))t[r]=String(s);return Object.keys(t).length?t:void 0}}catch{}}function ts(){let n=it(sf),e=it(Ys);if(n!=="openai-compatible"||!e)return null;let t=it(af),r=it(of),s=it(lf),o=String(it(al)??tf);return{provider:"openai-compatible",baseUrl:o,model:nf(String(e),o),authHeader:r!=null?String(r):void 0,authScheme:t!=null?String(t):void 0,extraHeaders:v0(it(cf)),query:s!=null?String(s):void 0}}function uf(n){let e=ts();if(_e(sf,"openai-compatible"),n.baseUrl?.trim()?_e(al,n.baseUrl.trim()):e||_e(al,tf),n.model?.trim()?_e(Ys,n.model.trim()):e||_e(Ys,di),n.authHeader!==void 0&&_e(of,n.authHeader.trim()||void 0),n.authScheme!==void 0&&_e(af,n.authScheme),n.query!==void 0&&_e(lf,n.query.trim()||void 0),n.extraHeaders!==void 0){let s=Object.keys(n.extraHeaders).length>0;_e(cf,s?JSON.stringify(n.extraHeaders):void 0)}let r=ts();return r.model!==it(Ys)&&_e(Ys,r.model),r}function df(){_e(sf,void 0),_e(al,void 0),_e(Ys,void 0),_e(of,void 0),_e(af,void 0),_e(cf,void 0),_e(lf,void 0)}var tf,di,sf,al,Ys,of,af,cf,lf,pf=h(()=>{"use strict";So();tf="https://api.openai.com/v1",di="text-embedding-3-small";a(nf,"normalizeModelForBaseUrl");a(rf,"detectBaseUrlFromKey");sf="embeddings.provider",al="embeddings.baseUrl",Ys="embeddings.model",of="embeddings.authHeader",af="embeddings.authScheme",cf="embeddings.headers",lf="embeddings.query";a(v0,"parseHeaders");a(ts,"resolveGlobalEmbeddings");a(uf,"setGlobalEmbeddings");a(df,"clearGlobalEmbeddings")});import pi from"node:fs";import qT from"node:path";function mi(){return qT.join(ot(),"config","embeddings.key")}function cl(){return process.platform==="darwin"}async function VT(){try{let{stdout:n}=await G("security",["find-generic-password","-a",gf,"-s",ff,"-w"]);return n.trim()||null}catch{return null}}function JT(){try{return pi.readFileSync(mi(),"utf-8").trim()||null}catch{return null}}async function XT(){if(Sr!==void 0)return Sr;let n=process.env[mf]?.trim();return n?(Sr=n,Sr):(Sr=(cl()?await VT():null)??JT(),Sr)}async function zT(){return process.env[mf]?.trim()?"env":cl()&&await VT()?"keychain":JT()?"file":"none"}async function KT(n){let e=n.trim();if(Sr=e,cl())try{return await G("security",["add-generic-password","-U","-a",gf,"-s",ff,"-w",e]),"keychain"}catch{}pi.mkdirSync(qT.dirname(mi()),{recursive:!0}),pi.writeFileSync(mi(),e,{mode:384});try{pi.chmodSync(mi(),384)}catch{}return"file"}async function YT(){if(Sr=null,cl())try{await G("security",["delete-generic-password","-a",gf,"-s",ff])}catch{}try{pi.rmSync(mi())}catch{}}var mf,ff,gf,Sr,ll=h(()=>{"use strict";Qn();ue();mf="PRJCT_EMBEDDINGS_API_KEY",ff="prjct-embeddings",gf="prjct";a(mi,"keyFilePath");a(cl,"isDarwin");a(VT,"readKeychain");a(JT,"readFileKey");a(XT,"getEmbeddingsKey");a(zT,"getKeyLocation");a(KT,"setEmbeddingsKey");a(YT,"clearEmbeddingsKey")});function S0(n){let e=n?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new ul(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}function E0(n,e,t,r,s={}){let o=n.replace(/\/+$/,""),i=s.query?.trim().replace(/^\?/,""),c=`${o}/embeddings${i?`?${i}`:""}`,l=nf(e,o),u={"content-type":"application/json",...s.extraHeaders??{}};if(r){let d=s.authHeader?.trim()||"authorization",p=s.authScheme??"Bearer";u[d]=p?`${p} ${r}`:r}return{url:c,init:{method:"POST",headers:u,body:JSON.stringify({model:l,input:t})}}}function R0(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function x0(n,e,t){let r=[];if(n.length<e)return r.push(n),r;for(let s=e;s<=t;s++)for(let o=0;o+s<=n.length;o++)r.push(n.slice(o,o+s));return r}function P0(n){let e=new Float64Array(fi),t=(n.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,C0);for(let o of t){let i=x0(`<${o}>`,3,5);i.push(o);for(let c of i){let l=R0(c),u=l%fi,d=l&65536?1:-1;e[u]+=d}}let r=0;for(let o=0;o<fi;o++)r+=e[o]*e[o];r=Math.sqrt(r)||1;let s=new Array(fi);for(let o=0;o<fi;o++)s[o]=e[o]/r;return s}function dl(n){let e=S0(n);if(e)return e;let t=ts();return t?new ul(t.baseUrl,t.model,{authHeader:t.authHeader,authScheme:t.authScheme,extraHeaders:t.extraHeaders,query:t.query}):new yf}function A0(n){return Buffer.from(new Float32Array(n).buffer)}function _0(n){let e=Uint8Array.from(n);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function hf(n){let e=0;for(let t=0;t<n.length;t++)e+=n[t]*n[t];return Math.sqrt(e)}function j0(n,e){let t=Math.min(n.length,e.length),r=0;for(let s=0;s<t;s++)r+=n[s]*e[s];return r}var ul,T0,fi,C0,yf,I0,D0,QT,gi,pl=h(()=>{"use strict";As();ke();J();pf();ll();pf();ll();a(S0,"resolveProvider");a(E0,"buildEmbeddingsRequest");ul=class{constructor(e,t,r={}){this.baseUrl=e;this.model=t;this.auth=r}baseUrl;model;auth;static{a(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let t=await XT(),{url:r,init:s}=E0(this.baseUrl,this.model,e,t,this.auth),o=await fetch(r,s);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(c=>c.embedding)}},T0="local-subword-v1",fi=256,C0=800;a(R0,"fnv1a");a(x0,"charNGrams");a(P0,"embedLocal");yf=class{static{a(this,"LocalSubwordEmbeddingProvider")}model=T0;isLocal=!0;async embed(e){return e.map(t=>P0(t))}};a(dl,"resolveActiveProvider");a(A0,"packVector");a(_0,"unpackVector");a(hf,"l2Norm");a(j0,"dot");I0=2e3,D0=10,QT=new Map,gi={isEnabled(n){return!0},store(n,e,t,r,s){b.run(n,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
1367
+ `)){let s=r.trim();s&&e.add(s)}}catch{}return[...e].sort()}async function y0(n){try{let{stdout:e}=await G("git",["diff","--shortstat","HEAD"],{cwd:n}),t=Number.parseInt(e.match(/(\d+) insertions?/)?.[1]??"0",10),r=Number.parseInt(e.match(/(\d+) deletions?/)?.[1]??"0",10);return t+r}catch{return 0}}var r0,s0,UT=h(()=>{"use strict";ie();ue();r0=["cli","command","install","setup","doctor","mcp","codex","claude","statusline","statusbar","output","help"],s0=new Set(["the","and","for","with","that","this","task","implement","implementa","fix","bug","add","agrega","crear","hacer","esto","debe"]);a(HT,"buildTaskHarness");a(ef,"evaluateHarnessCompletion");a(o0,"detectKind");a(i0,"detectLevel");a(a0,"detectRisk");a(c0,"expectedEvidenceFor");a(l0,"gatesFor");a(u0,"rationaleFor");a(d0,"extractScopeHints");a(vr,"hasAny");a(p0,"observedEvidenceFromFiles");a(m0,"isTestFile");a(f0,"isDocsFile");a(g0,"touchesPublicSurface");a(h0,"readChangedFiles");a(y0,"readDiffSize")});function b0(n){let e=n.trim(),t=w0.some(s=>s.test(e)),r=k0.some(s=>s.test(e));return t&&!r?{kind:"trivial",station:"direct",requiresSpec:!1,requiresTestsFirst:!1,reason:"trivial-keyword"}:r?{kind:"substantive",station:"spec_required",requiresSpec:!0,requiresTestsFirst:!0,reason:"substantive-keyword"}:{kind:"trivial",station:"direct",requiresSpec:!1,requiresTestsFirst:!1,reason:"conservative-default"}}function GT(n,e){let t=b0(n);return t.kind==="substantive"&&e?{...t,station:"test_red",reason:"linked-spec"}:t}function WT(n){switch(n.station){case"direct":return"Proceed directly; no spec is required for this trivial task.";case"spec_required":return"Create or link a reviewed spec before implementation; write tests before implementation from the spec acceptance criteria.";case"test_red":return"Write failing tests before implementation, covering the linked spec acceptance criteria and edge cases.";case"implementation":return"Implement the minimum code needed to make the existing tests pass.";case"verify":return"Run verification and keep the task blocked on red tests."}}var w0,k0,BT=h(()=>{"use strict";w0=[/\btypo\b/i,/\bdocs?\b/i,/\breadme\b/i,/\bformat\b/i,/\bchangelog\b/i,/\brerun\b.*\btests?\b/i,/\bre-?run\b.*\btests?\b/i],k0=[/\badd\b/i,/\bimplement\b/i,/\bcreate\b/i,/\bbuild\b/i,/\bfeature\b/i,/\bbilling\b/i,/\bauth\b/i,/\bsecurity\b/i,/\bmigration\b/i,/\bretry\b/i,/\bfailure\b/i,/\brecovery\b/i,/\baudit\b/i,/\bworkflow\b/i,/\borchestrat/i];a(b0,"classifyTaskPipeline");a(GT,"decideTaskPipeline");a(WT,"formatTaskPipelineNextAction")});function nf(n,e){return/openrouter\.ai/i.test(e)&&n&&!n.includes("/")?`openai/${n}`:n}function rf(n){let e=n.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 v0(n){if(!(typeof n!="string"||!n.trim()))try{let e=JSON.parse(n);if(e&&typeof e=="object"&&!Array.isArray(e)){let t={};for(let[r,s]of Object.entries(e))t[r]=String(s);return Object.keys(t).length?t:void 0}}catch{}}function ts(){let n=it(sf),e=it(Ys);if(n!=="openai-compatible"||!e)return null;let t=it(af),r=it(of),s=it(lf),o=String(it(al)??tf);return{provider:"openai-compatible",baseUrl:o,model:nf(String(e),o),authHeader:r!=null?String(r):void 0,authScheme:t!=null?String(t):void 0,extraHeaders:v0(it(cf)),query:s!=null?String(s):void 0}}function uf(n){let e=ts();if(_e(sf,"openai-compatible"),n.baseUrl?.trim()?_e(al,n.baseUrl.trim()):e||_e(al,tf),n.model?.trim()?_e(Ys,n.model.trim()):e||_e(Ys,di),n.authHeader!==void 0&&_e(of,n.authHeader.trim()||void 0),n.authScheme!==void 0&&_e(af,n.authScheme),n.query!==void 0&&_e(lf,n.query.trim()||void 0),n.extraHeaders!==void 0){let s=Object.keys(n.extraHeaders).length>0;_e(cf,s?JSON.stringify(n.extraHeaders):void 0)}let r=ts();return r.model!==it(Ys)&&_e(Ys,r.model),r}function df(){_e(sf,void 0),_e(al,void 0),_e(Ys,void 0),_e(of,void 0),_e(af,void 0),_e(cf,void 0),_e(lf,void 0)}var tf,di,sf,al,Ys,of,af,cf,lf,pf=h(()=>{"use strict";So();tf="https://api.openai.com/v1",di="text-embedding-3-small";a(nf,"normalizeModelForBaseUrl");a(rf,"detectBaseUrlFromKey");sf="embeddings.provider",al="embeddings.baseUrl",Ys="embeddings.model",of="embeddings.authHeader",af="embeddings.authScheme",cf="embeddings.headers",lf="embeddings.query";a(v0,"parseHeaders");a(ts,"resolveGlobalEmbeddings");a(uf,"setGlobalEmbeddings");a(df,"clearGlobalEmbeddings")});import pi from"node:fs";import qT from"node:path";function mi(){return qT.join(ot(),"config","embeddings.key")}function cl(){return process.platform==="darwin"}async function VT(){try{let{stdout:n}=await G("security",["find-generic-password","-a",gf,"-s",ff,"-w"]);return n.trim()||null}catch{return null}}function JT(){try{return pi.readFileSync(mi(),"utf-8").trim()||null}catch{return null}}async function XT(){if(Sr!==void 0)return Sr;let n=process.env[mf]?.trim();return n?(Sr=n,Sr):(Sr=(cl()?await VT():null)??JT(),Sr)}async function zT(){return process.env[mf]?.trim()?"env":cl()&&await VT()?"keychain":JT()?"file":"none"}async function KT(n){let e=n.trim();if(Sr=e,cl())try{return await G("security",["add-generic-password","-U","-a",gf,"-s",ff,"-w",e]),"keychain"}catch{}pi.mkdirSync(qT.dirname(mi()),{recursive:!0}),pi.writeFileSync(mi(),e,{mode:384});try{pi.chmodSync(mi(),384)}catch{}return"file"}async function YT(){if(Sr=null,cl())try{await G("security",["delete-generic-password","-a",gf,"-s",ff])}catch{}try{pi.rmSync(mi())}catch{}}var mf,ff,gf,Sr,ll=h(()=>{"use strict";Zn();ue();mf="PRJCT_EMBEDDINGS_API_KEY",ff="prjct-embeddings",gf="prjct";a(mi,"keyFilePath");a(cl,"isDarwin");a(VT,"readKeychain");a(JT,"readFileKey");a(XT,"getEmbeddingsKey");a(zT,"getKeyLocation");a(KT,"setEmbeddingsKey");a(YT,"clearEmbeddingsKey")});function S0(n){let e=n?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new ul(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}function E0(n,e,t,r,s={}){let o=n.replace(/\/+$/,""),i=s.query?.trim().replace(/^\?/,""),c=`${o}/embeddings${i?`?${i}`:""}`,l=nf(e,o),u={"content-type":"application/json",...s.extraHeaders??{}};if(r){let d=s.authHeader?.trim()||"authorization",p=s.authScheme??"Bearer";u[d]=p?`${p} ${r}`:r}return{url:c,init:{method:"POST",headers:u,body:JSON.stringify({model:l,input:t})}}}function R0(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function x0(n,e,t){let r=[];if(n.length<e)return r.push(n),r;for(let s=e;s<=t;s++)for(let o=0;o+s<=n.length;o++)r.push(n.slice(o,o+s));return r}function P0(n){let e=new Float64Array(fi),t=(n.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,C0);for(let o of t){let i=x0(`<${o}>`,3,5);i.push(o);for(let c of i){let l=R0(c),u=l%fi,d=l&65536?1:-1;e[u]+=d}}let r=0;for(let o=0;o<fi;o++)r+=e[o]*e[o];r=Math.sqrt(r)||1;let s=new Array(fi);for(let o=0;o<fi;o++)s[o]=e[o]/r;return s}function dl(n){let e=S0(n);if(e)return e;let t=ts();return t?new ul(t.baseUrl,t.model,{authHeader:t.authHeader,authScheme:t.authScheme,extraHeaders:t.extraHeaders,query:t.query}):new yf}function A0(n){return Buffer.from(new Float32Array(n).buffer)}function _0(n){let e=Uint8Array.from(n);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function hf(n){let e=0;for(let t=0;t<n.length;t++)e+=n[t]*n[t];return Math.sqrt(e)}function j0(n,e){let t=Math.min(n.length,e.length),r=0;for(let s=0;s<t;s++)r+=n[s]*e[s];return r}var ul,T0,fi,C0,yf,I0,D0,QT,gi,pl=h(()=>{"use strict";As();ke();J();pf();ll();pf();ll();a(S0,"resolveProvider");a(E0,"buildEmbeddingsRequest");ul=class{constructor(e,t,r={}){this.baseUrl=e;this.model=t;this.auth=r}baseUrl;model;auth;static{a(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let t=await XT(),{url:r,init:s}=E0(this.baseUrl,this.model,e,t,this.auth),o=await fetch(r,s);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(c=>c.embedding)}},T0="local-subword-v1",fi=256,C0=800;a(R0,"fnv1a");a(x0,"charNGrams");a(P0,"embedLocal");yf=class{static{a(this,"LocalSubwordEmbeddingProvider")}model=T0;isLocal=!0;async embed(e){return e.map(t=>P0(t))}};a(dl,"resolveActiveProvider");a(A0,"packVector");a(_0,"unpackVector");a(hf,"l2Norm");a(j0,"dot");I0=2e3,D0=10,QT=new Map,gi={isEnabled(n){return!0},store(n,e,t,r,s){b.run(n,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
1368
1368
  VALUES (?, ?, ?, ?, ?, ?)
1369
1369
  ON CONFLICT(memory_id) DO UPDATE SET
1370
1370
  vector = excluded.vector, model = excluded.model,
1371
1371
  dims = excluded.dims, norm = excluded.norm, created_at = excluded.created_at`,e,A0(t),r,t.length,hf(t),s)},embeddedIds(n,e){try{let t=b.query(n,"SELECT memory_id FROM memory_embeddings WHERE model = ?",e);return new Set(t.map(r=>r.memory_id))}catch{return new Set}},async backfill(n,e,t,r={}){let s=r.provider??dl(e),o=r.batchSize??64,i=M.unembeddedEntriesForIndex(n,s.model).filter(u=>Uo(u)&&u.content.trim().length>0);if(this.shouldPruneThisRun(n)){let u=M.allEntriesForIndex(n);this.pruneNonModelVectors(n,u.filter(d=>!Uo(d)).map(d=>d.id))}let c=this.countByModel(n,s.model),l=0;for(let u=0;u<i.length;u+=o){let d=i.slice(u,u+o);try{let p=await s.embed(d.map(m=>m.content));d.forEach((m,f)=>{let y=p[f];y&&y.length>0&&(this.store(n,m.id,y,s.model,t),l++)})}catch{}}return{embedded:l,skipped:c,total:c+i.length}},countByModel(n,e){try{return b.get(n,"SELECT COUNT(*) AS n FROM memory_embeddings WHERE model = ?",e)?.n??0}catch{return 0}},shouldPruneThisRun(n){let e=QT.get(n)??0;return QT.set(n,(e+1)%D0),e===0},pruneNonModelVectors(n,e){if(e.length!==0)try{let t=e.map(()=>"?").join(",");b.run(n,`DELETE FROM memory_embeddings WHERE memory_id IN (${t})`,...e)}catch{}},async semanticSearch(n,e,t,r=10,s){let o=s??dl(t);if(!e.trim())return[];let i;try{[i]=await o.embed([e])}catch{return[]}if(!i||i.length===0)return[];let c;try{c=b.query(n,`SELECT memory_id, vector, norm FROM memory_embeddings
1372
- WHERE model = ? ORDER BY rowid DESC LIMIT ?`,o.model,I0)}catch{return[]}let l=hf(i);if(l===0)return[];let u=c.map(p=>{let m=_0(p.vector),f=l*(p.norm??hf(m));return{id:p.memory_id,score:f===0?0:j0(i,m)/f}}).sort((p,m)=>m.score-p.score).slice(0,r),d=[];for(let p of u){let m=M.getById(n,p.id);m&&d.push(m)}return d}}});var ZT={};N(ZT,{enrichedRecall:()=>wf});async function wf(n,e,t={}){let{topic:r,types:s,tags:o}=t,i=t.limit??30,c=[];if(r){let l=r.split(/\s+/).filter(Boolean);try{let u=M.searchFts(e,l,i);s&&(u=u.filter(d=>s.includes(d.type))),o&&(u=u.filter(d=>Go(d,o))),c=u}catch{c=[]}}if(c.length<i){let l=new Set(c.map(d=>d.id)),u=M.recall(e,{topic:r,types:s,tags:o,limit:i});for(let d of u)if(!l.has(d.id)&&(c.push(d),c.length>=i))break}if(r)try{let l=await x.readConfig(n);if(l&&gi.isEnabled(l)){let u=await gi.semanticSearch(e,r,l,10);if(u.length>0){let d=new Set(c.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=>Go(m,o))),c=[...p,...c].slice(0,i)}}}catch{}if(c=c.filter(l=>Uo(l)||(s?.includes(l.type)??!1)),c.length>1&&(c=ut.rerank(e,c)),t.expandLinks!==!1&&c.length>0){let l=M.expandWithLinks(e,c,5);l.length>0&&(c=c.concat(l))}try{let l=await X.getCurrentTask(e);l?.id&&ut.recordSurfaced(e,c.map(u=>u.id),l.id)}catch{}return c}var kf=h(()=>{"use strict";K();pl();Ln();It();As();ke();a(wf,"enrichedRecall")});var eC={};N(eC,{recordSurfacedForActiveTask:()=>ns});async function ns(n,e,t){if(t.length!==0)try{let{resolveActiveTask:r}=await Promise.resolve().then(()=>(Un(),bf)),s=await r(n,e);s?.id&&ut.recordSurfaced(n,t,s.id)}catch{}}var hi=h(()=>{"use strict";Ln();a(ns,"recordSurfacedForActiveTask")});var bf={};N(bf,{TASK_CONTEXT_PROMPT:()=>vf,completeActiveTask:()=>Km,readLastStatus:()=>yi,resolveActiveTask:()=>Et,setTaskStatus:()=>Ef,startTask:()=>Sf});async function Sf(n,e,t,r={}){let s=await An(n,"task","before",{projectPath:e,skipRules:r.skipHooks});if(!s.success)return{ok:!1,blocked:s.gatesFailed.length>0?`Blocked: ${s.gatesFailed.join(", ")}`:`Hook failed: ${s.hooksFailed.join(", ")}`};{let S=await x.readConfig(e).catch(()=>null),{effectiveSddMode:E}=await Promise.resolve().then(()=>(Zc(),Qc));if(E(S)==="strict"){if(!r.spec)return{ok:!1,blocked:'Strict SDD: a spec is required before a task. Run `prjct spec "<title>"`, pass `prjct audit-spec <id>`, then `prjct task --spec <id>`. (Relax with `prjct sdd advisory`.)'};try{let{specService:C}=await Promise.resolve().then(()=>(zs(),ii)),O=await C.get(e,r.spec);if(!O)return{ok:!1,blocked:`Strict SDD: spec ${r.spec} not found.`};if(O.status==="draft")return{ok:!1,blocked:`Strict SDD: spec "${O.title}" hasn't passed audit-spec yet (status: draft). Run \`prjct audit-spec ${r.spec}\` first.`}}catch{}}}let o=/^[A-Z]+-\d+$/.test(t)?t:void 0,i=Xe(),c=r.spec,l=HT(t),u=await $r(e),d=u.isMain?ct:u.workspaceId,p={id:i,description:t,sessionId:Xe(),linearId:o,linkedSpecId:c,harness:l};u.isMain?await X.startTask(n,p):await X.startTaskInWorkspace(n,{...p,branch:u.branch,workspaceId:u.workspaceId,worktreePath:u.worktreePath},u.workspaceId);let m=GT(t,c),f=bw(n,{taskId:i,workspaceId:d,classification:m.kind,station:m.station,requiresSpec:m.requiresSpec,requiresTestsFirst:m.requiresTestsFirst,reason:m.reason,linkedSpecId:c??null});if(c)try{let{specService:S}=await Promise.resolve().then(()=>(zs(),ii));await S.linkTask(e,c,i)}catch{}let y=await FT.ensureAuthor();await ze.log(e,"task_started",{task:t,taskId:i,harness:l,timestamp:T()},y.name),await An(n,"task","after",{projectPath:e,skipRules:r.skipHooks});let R=await bs(e).catch(()=>""),k=await M0(e,n,t);return{ok:!0,taskId:i,description:t,branch:R,linearId:o,linkedSpecId:c,harness:l,pipeline:{classification:f.classification,station:f.station,nextAction:WT(m),requiresSpec:f.requiresSpec,requiresTestsFirst:f.requiresTestsFirst},instructions:s.instructions,relatedContext:k}}async function M0(n,e,t){try{let{enrichedRecall:r}=await Promise.resolve().then(()=>(kf(),ZT)),{deriveTitle:s}=await Promise.resolve().then(()=>(ht(),Ok)),o=await r(n,e,{topic:t,types:["context","decision","gotcha","anti-pattern"],limit:5});if(o.length===0)return[];let{recordSurfacedForActiveTask:i}=await Promise.resolve().then(()=>(hi(),eC));return await i(e,n,o.map(c=>c.id)),o.map(c=>({id:c.id,type:c.type,title:s(c),when:c.rememberedAt,author:c.tags?.author}))}catch{return[]}}async function Ef(n,e,t){let r=t.toLowerCase(),s=$0.includes(r),o=await $r(e);if(!o.isMain){let u=await X.getCurrentTaskForWorkspace(n,o.workspaceId);if(!u)return{ok:!1,reason:"no-active-task"};if(r==="done"||r==="completed"){let d=await yi(n,u.id),p=await ef(e,u);return await ze.log(e,cr,{taskId:u.id,from:d??null,to:t,workspaceId:o.workspaceId,harnessWarnings:p.warnings}),await X.completeTaskInWorkspace(n,o.workspaceId),{ok:!0,taskId:u.id,status:t,verificationWarnings:p.warnings,contextPrompt:vf}}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 X.getCurrentTask(n)){let d=await X.resumeTask(n);if(d)return await ze.log(e,cr,{taskId:d.id,from:"paused",to:t}),{ok:!0,taskId:d.id,status:t}}let i=await X.getCurrentTask(n);if(!i)return{ok:!1,reason:"no-active-task"};let c=await yi(n,i.id),l=r==="done"||r==="completed"?await ef(e,i):{warnings:[]};await ze.log(e,cr,{taskId:i.id,from:c??null,to:t,harnessWarnings:l.warnings});try{r==="done"||r==="completed"?await X.completeTask(n):r==="paused"||r==="pause"?await X.pauseTask(n):s&&(await X.getCurrentTask(n)||await X.resumeTask(n))}catch{}return{ok:!0,taskId:i.id,status:t,verificationWarnings:l.warnings,contextPrompt:r==="done"||r==="completed"?vf:void 0}}async function Et(n,e){let t=await $r(e);return t.isMain?X.getCurrentTask(n):X.getCurrentTaskForWorkspace(n,t.workspaceId)}async function Km(n,e,t){let r=await $r(e);return r.isMain?X.completeTask(n,t):X.completeTaskInWorkspace(n,r.workspaceId,t)}async function yi(n,e){try{let{default:t}=await Promise.resolve().then(()=>(J(),rr)),r=t.query(n,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${cr}`);for(let s of r)try{let o=JSON.parse(s.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var $0,vf,Un=h(()=>{"use strict";K();lr();vn();_o();It();qu();ie();Ca();xn();Va();UT();BT();Ju();$0=["active","resume","in_progress","working"];a(Sf,"startTask");a(M0,"recallRelatedContext");vf=`Task closed. Capture its CONTEXT for the project\u2019s second brain so the next session (or collaborator) can recall it:
1372
+ WHERE model = ? ORDER BY rowid DESC LIMIT ?`,o.model,I0)}catch{return[]}let l=hf(i);if(l===0)return[];let u=c.map(p=>{let m=_0(p.vector),f=l*(p.norm??hf(m));return{id:p.memory_id,score:f===0?0:j0(i,m)/f}}).sort((p,m)=>m.score-p.score).slice(0,r),d=[];for(let p of u){let m=M.getById(n,p.id);m&&d.push(m)}return d}}});var ZT={};N(ZT,{enrichedRecall:()=>wf});async function wf(n,e,t={}){let{topic:r,types:s,tags:o}=t,i=t.limit??30,c=[];if(r){let l=r.split(/\s+/).filter(Boolean);try{let u=M.searchFts(e,l,i);s&&(u=u.filter(d=>s.includes(d.type))),o&&(u=u.filter(d=>Go(d,o))),c=u}catch{c=[]}}if(c.length<i){let l=new Set(c.map(d=>d.id)),u=M.recall(e,{topic:r,types:s,tags:o,limit:i});for(let d of u)if(!l.has(d.id)&&(c.push(d),c.length>=i))break}if(r)try{let l=await x.readConfig(n);if(l&&gi.isEnabled(l)){let u=await gi.semanticSearch(e,r,l,10);if(u.length>0){let d=new Set(c.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=>Go(m,o))),c=[...p,...c].slice(0,i)}}}catch{}if(c=c.filter(l=>Uo(l)||(s?.includes(l.type)??!1)),c.length>1&&(c=ut.rerank(e,c)),t.expandLinks!==!1&&c.length>0){let l=M.expandWithLinks(e,c,5);l.length>0&&(c=c.concat(l))}try{let l=await X.getCurrentTask(e);l?.id&&ut.recordSurfaced(e,c.map(u=>u.id),l.id)}catch{}return c}var kf=h(()=>{"use strict";K();pl();Ln();It();As();ke();a(wf,"enrichedRecall")});var eC={};N(eC,{recordSurfacedForActiveTask:()=>ns});async function ns(n,e,t){if(t.length!==0)try{let{resolveActiveTask:r}=await Promise.resolve().then(()=>(Un(),bf)),s=await r(n,e);s?.id&&ut.recordSurfaced(n,t,s.id)}catch{}}var hi=h(()=>{"use strict";Ln();a(ns,"recordSurfacedForActiveTask")});var bf={};N(bf,{TASK_CONTEXT_PROMPT:()=>vf,completeActiveTask:()=>Km,readLastStatus:()=>yi,resolveActiveTask:()=>Et,setTaskStatus:()=>Ef,startTask:()=>Sf});async function Sf(n,e,t,r={}){let s=await An(n,"task","before",{projectPath:e,skipRules:r.skipHooks});if(!s.success)return{ok:!1,blocked:s.gatesFailed.length>0?`Blocked: ${s.gatesFailed.join(", ")}`:`Hook failed: ${s.hooksFailed.join(", ")}`};{let S=await x.readConfig(e).catch(()=>null),{effectiveSddMode:E}=await Promise.resolve().then(()=>(Zc(),Qc));if(E(S)==="strict"){if(!r.spec)return{ok:!1,blocked:'Strict SDD: a spec is required before a task. Run `prjct spec "<title>"`, pass `prjct audit-spec <id>`, then `prjct task --spec <id>`. (Relax with `prjct sdd advisory`.)'};try{let{specService:C}=await Promise.resolve().then(()=>(zs(),ii)),O=await C.get(e,r.spec);if(!O)return{ok:!1,blocked:`Strict SDD: spec ${r.spec} not found.`};if(O.status==="draft")return{ok:!1,blocked:`Strict SDD: spec "${O.title}" hasn't passed audit-spec yet (status: draft). Run \`prjct audit-spec ${r.spec}\` first.`}}catch{}}}let o=/^[A-Z]+-\d+$/.test(t)?t:void 0,i=Xe(),c=r.spec,l=HT(t),u=await $r(e),d=u.isMain?ct:u.workspaceId,p={id:i,description:t,sessionId:Xe(),linearId:o,linkedSpecId:c,harness:l};u.isMain?await X.startTask(n,p):await X.startTaskInWorkspace(n,{...p,branch:u.branch,workspaceId:u.workspaceId,worktreePath:u.worktreePath},u.workspaceId);let m=GT(t,c),f=bw(n,{taskId:i,workspaceId:d,classification:m.kind,station:m.station,requiresSpec:m.requiresSpec,requiresTestsFirst:m.requiresTestsFirst,reason:m.reason,linkedSpecId:c??null});if(c)try{let{specService:S}=await Promise.resolve().then(()=>(zs(),ii));await S.linkTask(e,c,i)}catch{}let y=await FT.ensureAuthor();await ze.log(e,"task_started",{task:t,taskId:i,harness:l,timestamp:T()},y.name),await An(n,"task","after",{projectPath:e,skipRules:r.skipHooks});let R=await bs(e).catch(()=>""),k=await M0(e,n,t);return{ok:!0,taskId:i,description:t,branch:R,linearId:o,linkedSpecId:c,harness:l,pipeline:{classification:f.classification,station:f.station,nextAction:WT(m),requiresSpec:f.requiresSpec,requiresTestsFirst:f.requiresTestsFirst},instructions:s.instructions,relatedContext:k}}async function M0(n,e,t){try{let{enrichedRecall:r}=await Promise.resolve().then(()=>(kf(),ZT)),{deriveTitle:s}=await Promise.resolve().then(()=>(ht(),Ok)),o=await r(n,e,{topic:t,types:["context","decision","gotcha","anti-pattern"],limit:5});if(o.length===0)return[];let{recordSurfacedForActiveTask:i}=await Promise.resolve().then(()=>(hi(),eC));return await i(e,n,o.map(c=>c.id)),o.map(c=>({id:c.id,type:c.type,title:s(c),when:c.rememberedAt,author:c.tags?.author}))}catch{return[]}}async function Ef(n,e,t){let r=t.toLowerCase(),s=$0.includes(r),o=await $r(e);if(!o.isMain){let u=await X.getCurrentTaskForWorkspace(n,o.workspaceId);if(!u)return{ok:!1,reason:"no-active-task"};if(r==="done"||r==="completed"){let d=await yi(n,u.id),p=await ef(e,u);return await ze.log(e,lr,{taskId:u.id,from:d??null,to:t,workspaceId:o.workspaceId,harnessWarnings:p.warnings}),await X.completeTaskInWorkspace(n,o.workspaceId),{ok:!0,taskId:u.id,status:t,verificationWarnings:p.warnings,contextPrompt:vf}}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 X.getCurrentTask(n)){let d=await X.resumeTask(n);if(d)return await ze.log(e,lr,{taskId:d.id,from:"paused",to:t}),{ok:!0,taskId:d.id,status:t}}let i=await X.getCurrentTask(n);if(!i)return{ok:!1,reason:"no-active-task"};let c=await yi(n,i.id),l=r==="done"||r==="completed"?await ef(e,i):{warnings:[]};await ze.log(e,lr,{taskId:i.id,from:c??null,to:t,harnessWarnings:l.warnings});try{r==="done"||r==="completed"?await X.completeTask(n):r==="paused"||r==="pause"?await X.pauseTask(n):s&&(await X.getCurrentTask(n)||await X.resumeTask(n))}catch{}return{ok:!0,taskId:i.id,status:t,verificationWarnings:l.warnings,contextPrompt:r==="done"||r==="completed"?vf:void 0}}async function Et(n,e){let t=await $r(e);return t.isMain?X.getCurrentTask(n):X.getCurrentTaskForWorkspace(n,t.workspaceId)}async function Km(n,e,t){let r=await $r(e);return r.isMain?X.completeTask(n,t):X.completeTaskInWorkspace(n,r.workspaceId,t)}async function yi(n,e){try{let{default:t}=await Promise.resolve().then(()=>(J(),sr)),r=t.query(n,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${lr}`);for(let s of r)try{let o=JSON.parse(s.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var $0,vf,Un=h(()=>{"use strict";K();ur();vn();_o();It();qu();ie();Ca();xn();Va();UT();BT();Ju();$0=["active","resume","in_progress","working"];a(Sf,"startTask");a(M0,"recallRelatedContext");vf=`Task closed. Capture its CONTEXT for the project\u2019s second brain so the next session (or collaborator) can recall it:
1373
1373
  prjct remember context "<what happened \xB7 why / what was really wanted (the sentiment) \xB7 the decision + reason \xB7 the pattern or anti-pattern \xB7 the outcome>"
1374
1374
  Write it in English, one tight paragraph grounded in this task. Not the raw complaint \u2014 the lesson. prjct auto-anchors it to the commit, author and files.`;a(Ef,"setTaskStatus");a(Et,"resolveActiveTask");a(Km,"completeActiveTask");a(yi,"readLastStatus")});function tC(n){let e=n.trim();for(let{type:t,patterns:r}of N0){let s=e.match(r);if(s){let o=s[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}function ml(n){let e=n.trim();if(e.startsWith('"')){let r=e.indexOf('"',1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}if(e.startsWith("'")){let r=e.indexOf("'",1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function nC(n,e){let t=e.toLowerCase();return n.filter(r=>r.action.toLowerCase().includes(t)||(r.description?.toLowerCase().includes(t)??!1)||r.command.toLowerCase().includes(t)||String(r.id)===t)}var N0,Tf=h(()=>{"use strict";N0=[{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}];a(tC,"detectIntent");a(ml,"parseAction");a(nC,"searchRules")});var Er,Cf=h(()=>{"use strict";Er={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function fl(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var Rf,rC,xf=h(()=>{"use strict";Rf=["task","done","ship","sync"],rC=["before","after"];a(fl,"newRuleDefaults")});async function oC(n,e,t){let[r,s]=ml(n);if(!r||!s)return L('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=s.split(/\s+/),i=o[0]?.toLowerCase(),c=o[1]?.toLowerCase();if(!i||!rC.includes(i))return L('Position must be "before" or "after"',t);let l=Nc(e,c,t);if(!l.ok)return l.result;let u=re.addRule(e,{type:"hook",command:l.value.name,position:i,action:r,timeoutMs:Er.HOOK_DEFAULT_MS,...fl()});return t.md?console.log(P(je("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${r}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):Nt(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${r}`),{success:!0,ruleId:u}}async function iC(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=Nc(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),[i]=ml(o);if(!i)return L('Usage: prjct workflow gate <command> "shell command"',t);let c=re.addRule(e,{type:"gate",command:s.value.name,position:"before",action:i,timeoutMs:Er.GATE_DEFAULT_MS,...fl()});return t.md?console.log(P(je("Gate Added",`#${c} [gate] before ${s.value.name} \u2192 \`${i}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${c} --md`}]))):Nt(`gate #${c} added: before ${s.value.name} \u2192 ${i}`),{success:!0,ruleId:c}}async function aC(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=Nc(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let c=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=ml(l);if(!u)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=re.addRule(e,{type:"instruction",command:s.value.name,position:c,action:u,timeoutMs:Er.INSTRUCTION_MS,...fl()});return t.md?console.log(P(je("Instruction Added",`#${d} [instruction] ${c} ${s.value.name} \u2192 \`${u}\``),qe([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):Nt(`instruction #${d} added: ${c} ${s.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function cC(n,e,t){let r=parseInt(n.trim(),10);return Number.isNaN(r)?L("Usage: prjct workflow rm <rule-id>",t):re.removeRule(e,r)?(t.md?console.log(P(je("Rule Removed",`Removed rule #${r}`))):Nt(`removed rule #${r}`),{success:!0}):L(`Rule #${r} not found`,t)}async function lC(n,e){let t=re.resetRules(n),r=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(P(je("Rules Reset",r))):Nt(`reset: ${r.toLowerCase()}`),{success:!0,count:t}}async function uC(n,e,t){let r=n.trim(),s=parseInt(r,10);if(!Number.isNaN(s)){let d=re.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}`):Yt(p),{success:!0,message:p}}return re.updateRule(e,s,{enabled:!1}),t.md?console.log(P(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"}]))):Nt(`disabled rule #${s}: ${d.action}`),{success:!0,ruleId:s}}let o=re.getAllRules(e),i=nC(o,r);if(i.length===0)return L(`No rules matching "${r}"`,t);if(i.length===1){let d=i[0];return re.updateRule(e,d.id,{enabled:!1}),t.md?console.log(P(je("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):Nt(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let c=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=c.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log(P(F("Multiple matches",`${i.length} rules match "${r}"`),Pe(d),qe(c.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{Yt(`${i.length} rules match "${r}" \u2014 specify an ID:`);for(let d of c)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 dC=h(()=>{"use strict";Pn();we();Ge();Cf();Jt();Tf();xf();a(oC,"workflowAdd");a(iC,"workflowGate");a(aC,"workflowInstruction");a(cC,"workflowRm");a(lC,"workflowReset");a(uC,"workflowDisable")});function pC(n,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),r=e.filter(m=>m.type==="instruction"&&m.position==="before"),s=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),c=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=a((m,f,y)=>{let R=f.map(C=>` ${C.enabled?y:"o"} #${C.id} ${C.action}`),k=[m,...R],E=Math.max(...k.map(C=>C.length))+2;u.push(`+${"-".repeat(E)}+`);for(let C of k)u.push(`| ${C.padEnd(E-1)}|`);u.push(`+${"-".repeat(E)}+`)},"drawBox"),p=a(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),r.length>0&&(d("INSTRUCTIONS (before)",r,"\u{1F4CB}"),p(u)),s.length>0&&(d("HOOKS (before)",s,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${n.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),c.length>0&&(p(u),d("HOOKS (after)",c,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
1375
1375
  `)}var mC=h(()=>{"use strict";a(pC,"buildFlowDiagram")});async function fC(n){return n.md?console.log(P(F("Workflow Help","Manage hooks, gates, and steps for your workflow"),F("Commands",Pe(["`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"])),F("Natural Language (EN/ES)",Pe(['`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 gl(n,e,t){let r=n!==null&&Rf.includes(n),s=r?re.getRulesForCommand(e,n):re.getAllRules(e);if(s.length===0)return t.md?console.log(P(F("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'}]))):(Yt("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(t.md){let o=r?[n]:Rf,i=[];for(let u of o){let d=s.filter(p=>p.command===u);d.length!==0&&i.push(pC(u,d))}let c=r?`Workflow: ${n}`:"Workflow Rules",l=`${s.length} rule${s.length!==1?"s":""}`;console.log(P(F(c,l),i.length>0?gS(i.join(`
@@ -1436,7 +1436,7 @@ Status: Connected`)),await this.autoSync(),o({success:!0,message:e.md?`## Authen
1436
1436
  - **Email**: ${p}
1437
1437
  - **Token**: stored securely`:""})):(e.md||g.fail(`Authentication failed: ${y}`),o({success:!1,message:e.md?`## Error
1438
1438
  Authentication failed: ${y}`:""}));return}l.writeHead(404),l.end("Not found")});i.listen(0,"127.0.0.1",async()=>{let c=i.address();if(!c||typeof c=="string"){i.close(),e.md||g.fail("Failed to start callback server"),o({success:!1,message:e.md?`## Error
1439
- Failed to start callback server`:""});return}let l=c.port,u=await ce.getDeviceId(),d=await ce.getHostname(),p=new URLSearchParams({port:String(l),device_id:u,hostname:d}),m=`${r}/auth/cli?${p.toString()}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(de.dim(m));let f=process.platform,y=f==="darwin"?`open "${m}"`:f==="win32"?`start "${m}"`:`xdg-open "${m}"`;try{await q(y)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${m}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{i.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${de.cyan("prjct login")} to try again`)),o({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return await ce.clearAuth(),g.done("Logged out"),{success:!0,message:""}}async autoSync(){try{let e=await x.readConfig(process.cwd()).catch(()=>null),t=e?.projectId;if(!t||!e.cloud?.enabled||e.cloud.paused)return;g.spin("Syncing project...");let r=await cn.sync(t,{include:e.cloud.include??{}});if(g.stop(),r.success&&!r.skipped){let s=r.pushed?.count||0,o=r.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){return`<!DOCTYPE html>
1439
+ Failed to start callback server`:""});return}let l=c.port,u=await ce.getDeviceId(),d=await ce.getHostname(),p=new URLSearchParams({port:String(l),device_id:u,hostname:d}),m=`${r}/auth/cli?${p.toString()}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(de.dim(m));let f=process.platform,y=f==="darwin"?`open "${m}"`:f==="win32"?`start "${m}"`:`xdg-open "${m}"`;try{await q(y)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${m}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{i.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${de.cyan("prjct login")} to try again`)),o({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return await ce.clearAuth(),g.done("Logged out"),{success:!0,message:""}}async autoSync(){try{let e=await x.readConfig(process.cwd()).catch(()=>null),t=e?.projectId;if(!t||!e.cloud?.enabled||e.cloud.paused)return;g.spin("Syncing project...");let r=await ln.sync(t,{include:e.cloud.include??{}});if(g.stop(),r.success&&!r.skipped){let s=r.pushed?.count||0,o=r.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){return`<!DOCTYPE html>
1440
1440
  <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
1441
1441
  <title>prjct CLI Connected</title>
1442
1442
  <style>
@@ -1491,14 +1491,14 @@ margin:1.25rem 0;font-size:.875rem;color:#f87171}
1491
1491
  <h1>Authentication Failed</h1>
1492
1492
  <div class="msg">${e}</div>
1493
1493
  <p class="hint">Return to your terminal and try again.</p>
1494
- </div></body></html>`}async start(){let e=await et.checkInstallation(),t=(_t(),st(nr)),r=await t.detectCodex(),s=await t.detectAntigravity(),o=e.providerDetected,i=o?await t.getActiveProvider():null,c=o?i.displayName:r.installed?"OpenAI Codex":"AI agents";if(console.log(`\u{1F680} Setting up prjct for ${c}...
1494
+ </div></body></html>`}async start(){let e=await et.checkInstallation(),t=(_t(),st(rr)),r=await t.detectCodex(),s=await t.detectAntigravity(),o=e.providerDetected,i=o?await t.getActiveProvider():null,c=o?i.displayName:r.installed?"OpenAI Codex":"AI agents";if(console.log(`\u{1F680} Setting up prjct for ${c}...
1495
1495
  `),!o&&!r.installed&&!s.installed&&(console.log("\u2139\uFE0F No local CLI runtime detected."),console.log(" prjct will still use AGENTS.md + MCP-compatible surfaces after init.")),o){console.log("\u{1F4E6} Installing p. command router...");let l=await et.installCommands();if(!l.success)return{success:!1,message:`\u274C Installation failed: ${l.error}`};if(console.log(`
1496
1496
  \u2705 Installed ${l.installed?.length??0} commands to:
1497
1497
  ${j.getDisplayPath(l.path||"")}`),(l.errors?.length??0)>0){console.log(`
1498
1498
  \u26A0\uFE0F ${l.errors?.length??0} errors:`);for(let u of l.errors??[])console.log(` - ${u.file}: ${u.error}`)}}return await this.configureVaultRoot({}),await this.installCodexSurface(r.installed,"Installed Codex skill"),await this.installAntigravitySurface(s.installed),await this.setupMcpServers(),await this.installProjectAgentSurfacesIfConfigured(),await this.saveSetupStamp(i?.name??(r.installed?"codex":s.installed?"antigravity":"claude")),console.log(`
1499
1499
  \u{1F389} Setup complete!`),console.log(`
1500
1500
  Next steps:`),console.log(` 1. Open ${c}`),console.log(" 2. Navigate to your project"),console.log(" 3. Run: prjct init"),{success:!0,message:""}}async setup(e={}){console.log(`\u{1F527} Reconfiguring prjct...
1501
- `);let t=(_t(),st(nr)),r=await t.detectCodex(),s=await t.detectAntigravity(),i=(await et.checkInstallation()).providerDetected;if(e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await et.uninstallCommands()),!i&&!r.installed&&!s.installed&&(console.log("\u2139\uFE0F No local CLI runtime detected."),console.log(" Continuing with universal AGENTS.md/MCP-compatible setup.")),await this.configureVaultRoot(e),i){console.log("\u{1F4E6} Installing p. command router...");let l=await et.installCommands();if(!l.success)return{success:!1,message:`\u274C Setup failed: ${l.error}`};if(console.log(`
1501
+ `);let t=(_t(),st(rr)),r=await t.detectCodex(),s=await t.detectAntigravity(),i=(await et.checkInstallation()).providerDetected;if(e.force&&(console.log("\u{1F5D1}\uFE0F Removing existing installation..."),await et.uninstallCommands()),!i&&!r.installed&&!s.installed&&(console.log("\u2139\uFE0F No local CLI runtime detected."),console.log(" Continuing with universal AGENTS.md/MCP-compatible setup.")),await this.configureVaultRoot(e),i){console.log("\u{1F4E6} Installing p. command router...");let l=await et.installCommands();if(!l.success)return{success:!1,message:`\u274C Setup failed: ${l.error}`};if(console.log(`
1502
1502
  \u2705 Installed ${l.installed?.length??0} commands`),(l.errors?.length??0)>0){console.log(`
1503
1503
  \u26A0\uFE0F ${l.errors?.length??0} errors:`);for(let p of l.errors??[])console.log(` - ${p.file}: ${p.error}`)}console.log(`
1504
1504
  \u{1F4DD} Installing global configuration...`);let u=await et.installGlobalConfig(),d=u.path?j.getDisplayPath(u.path):"global config";u.success?u.action==="created"?console.log(`\u2705 Created ${d}`):u.action==="updated"?console.log(`\u2705 Updated ${d}`):u.action==="appended"&&console.log(`\u2705 Added prjct config to ${d}`):console.log(`\u26A0\uFE0F ${u.error}`)}else console.log("\u2139\uFE0F No Claude/Gemini global command surface detected; skipping CLI router cleanup.");let c=i?await t.getActiveProvider():null;if(c?.name==="claude"){console.log(`
@@ -1564,11 +1564,11 @@ echo "\u26A1 prjct"
1564
1564
  `;await yl.writeFile(r,s,{mode:493});let o={};if(await A(t))try{o=await Oe(t)??{}}catch{}return o.statusLine={type:"command",command:r},await Ee(t,o),{success:!0}}catch(e){return Ne(e)}}showAsciiArt(){console.log(de.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(de.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(de.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(de.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(de.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(de.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(de.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(` ${de.bold.cyan("prjct")}${de.magenta("/")}${de.green("cli")} ${de.dim.white(`v${De} installed`)}`),console.log(""),console.log(` ${de.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${de.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${de.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(de.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(de.bold.cyan("\u{1F680} Quick Start")),console.log(de.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(` ${de.bold("1.")} Initialize your project:`),console.log(` ${de.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${de.bold("2.")} Start your first task:`),console.log(` ${de.green('prjct task "build auth"')}`),console.log(""),console.log(` ${de.bold("3.")} Ship & celebrate:`),console.log(` ${de.green('prjct ship "user login"')}`),console.log(""),console.log(de.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(` ${de.dim("Documentation:")} ${de.cyan("https://prjct.app")}`),console.log(` ${de.dim("Report issues:")} ${de.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(de.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import{execFileSync as ki}from"node:child_process";import G0 from"node:os";import rs from"node:path";function Qs(){try{return!!ki("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})}catch{return!1}}function wl(n){try{return ki("which",[n],{stdio:"pipe"}),!0}catch{return!1}}function Uf(){let n=[process.argv[1],process.execPath].filter(Boolean);for(let e of n){let t=e;try{t=rt("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 n=Uf();if(n&&wl(n))return wn[n];for(let e of["bun","pnpm","npm","yarn"])if(wl(e))return wn[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 bi(){let n=[];for(let e of[wn.bun,wn.pnpm,wn.npm,wn.yarn]){let t=e.getInstallRoot();if(!t)continue;let r=rs.join(t,"prjct-cli","package.json");try{let s=JSON.parse(rt("node:fs").readFileSync(r,"utf-8"));s?.name==="prjct-cli"&&typeof s.version=="string"&&n.push({pm:e,version:s.version})}catch{}}return n}function EC(){try{let{existsSync:n,realpathSync:e,readFileSync:t}=rt("node:fs"),r=(()=>{try{return e(rs.resolve(__dirname,"..","..",".."))}catch{return""}})(),s=[wn.bun.getInstallRoot(),wn.pnpm.getInstallRoot(),wn.npm.getInstallRoot(),wn.yarn.getInstallRoot()].filter(o=>!!o);for(let o of s){let i=rs.join(o,"prjct-cli"),c=rs.join(i,"package.json");if(!n(c))continue;let l=i;try{l=e(i)}catch{}if(r&&l===r)continue;try{if(JSON.parse(t(rs.join(l,"package.json"),"utf-8"))?.name!=="prjct-cli")continue}catch{continue}Yu(l);let{resetBundle:u}=(_n(),st(_a));u();return}}catch{}}var W0,wn,Gf=h(()=>{"use strict";Ze();W0=G0.homedir(),wn={npm:{name:"npm",installArgs:["install","-g","prjct-cli@latest"],getInstallRoot:a(()=>{try{return ki("npm",["root","-g"],{encoding:"utf-8",stdio:"pipe"}).trim()}catch{return null}},"getInstallRoot")},pnpm:{name:"pnpm",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:a(()=>{try{return ki("pnpm",["root","-g"],{encoding:"utf-8",stdio:"pipe"}).trim()}catch{return null}},"getInstallRoot")},bun:{name:"bun",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:a(()=>rs.join(W0,".bun","install","global","node_modules"),"getInstallRoot")},yarn:{name:"yarn",installArgs:["global","add","prjct-cli@latest"],getInstallRoot:a(()=>{try{let n=ki("yarn",["global","dir"],{encoding:"utf-8",stdio:"pipe"}).trim();return rs.join(n,"node_modules")}catch{return null}},"getInstallRoot")}};a(Qs,"isHomebrewInstall");a(wl,"isOnPath");a(Uf,"detectInstallerFromRunningBinary");a(kl,"selectPackageManager");a(bi,"getAllInstalledLocations");a(EC,"redirectToInstalledPackage")});import{execSync as TC}from"node:child_process";import{realpathSync as Wf}from"node:fs";import CC from"node:path";import B0 from"node:readline";function V0(){try{let n=TC("command -v prjct",{stdio:"pipe",shell:"/bin/sh"}).toString().trim();if(!n)return null;try{return Wf(n)}catch{return n}}catch{return null}}function J0(){try{return Wf(CC.resolve(__dirname,"..","..",".."))}catch{return""}}function X0(){let n=V0(),e=Uf(),t=J0(),r=[];if(!n&&!e)return{winner:null,removable:[],skipped:[{pm:"(all)",reason:"cannot resolve the PATH-winning binary \u2014 refusing to remove"}]};let s=n?.includes("/Cellar/")||n?.includes("/homebrew/"),o=s?"brew":e,i=[];for(let c of bi()){if(c.pm.name===e){r.push({pm:c.pm.name,reason:"PATH winner \u2014 kept"});continue}let l=c.pm.getInstallRoot();if(l&&t){let u=CC.join(l,"prjct-cli");try{u=Wf(u)}catch{}if(u===t){r.push({pm:c.pm.name,reason:"resolves to the dev source tree (link) \u2014 kept"});continue}}i.push({pm:c.pm.name,version:c.version})}return Qs()&&!s?i.push({pm:"brew",version:"(homebrew)"}):Qs()&&s&&r.push({pm:"brew",reason:"PATH winner \u2014 kept"}),{winner:o,removable:i,skipped:r}}function z0(n){let e=n==="brew"?"brew uninstall prjct-cli":q0[n];try{return TC(e,{stdio:"pipe",shell:"/bin/sh"}),{ok:!0}}catch(t){return{ok:!1,error:`${n}: ${t.message.split(`
1565
1565
  `)[0]}`}}}async function K0(n){let e=B0.createInterface({input:process.stdin,output:process.stdout});try{let t=await new Promise(r=>e.question(`${n} [y/N] `,r));return/^y(es)?$/i.test(t.trim())}finally{e.close()}}async function RC(n,e,t){let r=[],s=[];if(n==="off")return r.push("Install consolidation skipped (--no-cleanup)"),{details:r,errors:s};let o=X0();if(o.removable.length===0)return r.push(o.skipped.some(u=>u.pm==="(all)")?`Consolidation skipped \u2014 ${o.skipped[0].reason}`:"Single install \u2014 nothing to consolidate"),{details:r,errors:s};let i=o.removable.map(u=>`${u.pm} (${u.version})`).join(", ");if(r.push(`Winner: ${o.winner??"unknown"} \u2014 redundant copies: ${i}`),e){for(let u of o.removable)r.push(`Would remove ${u.pm} copy`);return{details:r,errors:s}}let c=process.stdin.isTTY===!0&&process.stdout.isTTY===!0;if(!(n==="force"||t||c&&await K0(`Remove ${o.removable.length} redundant prjct install(s) [${i}], keeping ${o.winner}?`)))return c?r.push("Consolidation declined \u2014 left all installs in place"):r.push(`Multiple installs detected [${i}]. Run \`prjct upgrade --yes\` to consolidate (kept ${o.winner}).`),{details:r,errors:s};for(let u of o.removable){let d=z0(u.pm);d.ok?r.push(`Removed redundant ${u.pm} install`):s.push(d.error??`failed to remove ${u.pm}`)}for(let u of o.skipped)r.push(`Kept ${u.pm}: ${u.reason}`);return{details:r,errors:s}}var q0,xC=h(()=>{"use strict";Gf();q0={npm:"npm uninstall -g prjct-cli",pnpm:"pnpm remove -g prjct-cli",bun:"bun remove -g prjct-cli",yarn:"yarn global remove prjct-cli"};a(V0,"pathWinnerReal");a(J0,"sourceRoot");a(X0,"planCleanup");a(z0,"removeOne");a(K0,"confirm");a(RC,"consolidateInstalls")});import ss from"chalk";function PC(n,e){let t=n.phase1.success&&n.phase2.success,r=[...n.phase1.errors,...n.phase2.errors];console.log("");let s=[{label:"Package",result:n.phase1,fatal:!0},{label:"Cleanup",result:n.phase2,fatal:!0},{label:"Daemon",result:n.phase3,fatal:!1}];for(let{label:o,result:i,fatal:c}of s){let l=i.success?ss.green("\u2713"):c?ss.red("\u2717"):ss.yellow("\u26A0");console.log(` ${l} ${ss.bold(o)}`);for(let u of i.details)console.log(` ${ss.dim(u)}`);for(let u of i.warnings??[])console.log(` ${ss.yellow("\u26A0")} ${u}`);for(let u of i.errors)console.log(` ${ss.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 ${r.length} error(s)`),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}function AC(n,e){let t=n.phase1.success&&n.phase2.success,r=[];r.push(e?"# Update (Dry Run)":"# System Update"),r.push("");let s=[{label:"Package Update",result:n.phase1,fatal:!0},{label:"Global Cleanup",result:n.phase2,fatal:!0},{label:"Daemon Restart",result:n.phase3,fatal:!1}];for(let{label:o,result:i,fatal:c}of s){let l=i.success?"OK":c?"FAILED":"WARNING";r.push(`## ${o} (${l})`);for(let u of i.details)r.push(`- ${u}`);for(let u of i.warnings??[])r.push(`- WARNING: ${u}`);for(let u of i.errors)r.push(`- WARNING: ${u}`);r.push("")}return e||r.push(t?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(r.join(`
1566
1566
  `)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}var _C=h(()=>{"use strict";fe();a(PC,"formatTerminalOutput");a(AC,"formatMdOutput")});import Y0 from"node:crypto";import vi from"node:path";function IC(n=ot()){return vi.join(n,"run")}function DC(n=process.platform,e=ot()){if(n==="win32"){let t=Y0.createHash("sha1").update(vi.resolve(e)).digest("hex").slice(0,16);return`${jC}prjct-${t}-daemon`}return vi.join(IC(e),"daemon.sock")}function Tr(n=DC()){return n.startsWith(jC)}function Zs(n){return Buffer.from(`${JSON.stringify(n)}
1567
- `)}var jC,We,$C,MC,bl=h(()=>{"use strict";Qn();jC="\\\\.\\pipe\\";a(IC,"getDaemonRunDir");a(DC,"getDaemonSocketPath");a(Tr,"isDaemonNamedPipe");We={runDir:a(()=>IC(),"runDir"),socket:a(()=>DC(),"socket"),pid:a(()=>vi.join(We.runDir(),"daemon.pid"),"pid"),log:a(()=>vi.join(We.runDir(),"daemon.log"),"log")},$C=1800*1e3,MC=1024*1024;a(Zs,"encodeMessage")});var Vf={};N(Vf,{executeViaDaemon:()=>eO,forceKillDaemon:()=>nO,getDaemonStatus:()=>Z0,isDaemonRunning:()=>NC,sendRequest:()=>Si,spawnDaemon:()=>qf,stopDaemon:()=>tO});import vl from"node:crypto";import Qe from"node:fs";import{connect as Q0}from"node:net";import Bf from"node:path";async function NC(){let n=We.socket(),e=Tr(n);if(!e&&!Qe.existsSync(n))return!1;try{return(await Si({id:vl.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{if(!e)try{Qe.unlinkSync(n)}catch{}return!1}}async function Z0(){let n=We.socket(),e=We.pid();if(!Tr(n)&&!Qe.existsSync(n))return{running:!1};try{let r=await Si({id:vl.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(r.success&&r.result)return r.result}catch{}return Qe.existsSync(e)?{running:!1,pid:parseInt(Qe.readFileSync(e,"utf-8").trim(),10),socketPath:n}:{running:!1}}function Si(n){return new Promise((e,t)=>{let r=We.socket(),s=Q0(r),o="",i=!1,c=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(Zs(n))}),s.on("data",l=>{o+=l.toString();let u=o.indexOf(`
1568
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(c),s.end(),e(p)}catch(p){i=!0,clearTimeout(c),s.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),s.on("error",l=>{i||(i=!0,clearTimeout(c),t(l))}),s.on("close",()=>{i||(i=!0,clearTimeout(c),t(new Error("Connection closed before response")))})})}async function eO(n,e,t,r,s,o=!0){let i=We.socket();if(!Tr(i)&&!Qe.existsSync(i))return o&&qf().catch(()=>{}),null;try{return await Si({id:vl.randomUUID(),command:n,args:e,options:t,cwd:r,perfStartNs:s})}catch{return o&&qf().catch(()=>{}),null}}async function tO(){try{return(await Si({id:vl.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function nO(){let n=We.pid(),e=We.socket(),t=!1;if(Qe.existsSync(n)){let r=parseInt(Qe.readFileSync(n,"utf-8").trim(),10);if(!Number.isNaN(r))try{process.kill(r,"SIGKILL"),t=!0}catch{}}try{Qe.existsSync(n)&&Qe.unlinkSync(n)}catch{}if(!Tr(e))try{Qe.existsSync(e)&&Qe.unlinkSync(e)}catch{}return t}async function qf(){let{spawn:n}=await import("node:child_process"),e=Bf.join(__dirname,"entry.ts"),t=Bf.join(__dirname,"..","daemon","entry.mjs"),r=Bf.join(__dirname,"..","dist","daemon","entry.mjs"),s,o,i=process.platform!=="win32"&&Sy();if(Qe.existsSync(e))s=e,o="bun";else if(Qe.existsSync(t))s=t,o=i?"bun":"node";else if(Qe.existsSync(r))s=r,o=i?"bun":"node";else return!1;let c=We.runDir();Qe.mkdirSync(c,{recursive:!0});let l=We.log(),u=Qe.openSync(l,"a");n(o,[s],{detached:!0,stdio:["ignore",u,u],env:process.env}).unref(),Qe.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await NC())return!0;return!1}var Jf=h(()=>{"use strict";vu();bl();a(NC,"isDaemonRunning");a(Z0,"getDaemonStatus");a(Si,"sendRequest");a(eO,"executeViaDaemon");a(tO,"stopDaemon");a(nO,"forceKillDaemon");a(qf,"spawnDaemon")});var Yf={};N(Yf,{UpdateCommands:()=>Kf});import{execFileSync as OC}from"node:child_process";import Xf from"node:fs/promises";import zf from"node:path";var Kf,Qf=h(()=>{"use strict";Dn();Of();Re();Td();mp();W();we();fe();Ze();xe();xC();_C();Gf();Kf=class extends V{static{a(this,"UpdateCommands")}async update(e={},t=process.cwd()){let r=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,c={phase1:{success:!0,details:[],errors:[],warnings:[]},phase2:{success:!0,details:[],errors:[],warnings:[]},phase3:{success:!0,details:[],errors:[],warnings:[]}};try{if(!r)try{let{isDaemonRunning:l,stopDaemon:u,forceKillDaemon:d}=await Promise.resolve().then(()=>(Jf(),Vf));await l()&&(await u()||d())}catch{}if(s||g.step(1,3,"Updating package..."),c.phase1=await this.phasePackageUpdate(r),s||g.stop(),!r&&c.phase1.success&&EC(),s||g.step(2,3,"Cleaning up all projects..."),c.phase2=await this.phaseGlobalCleanup(r,o,i),s||g.stop(),s||g.step(3,3,"Restarting daemon..."),c.phase3=await this.phaseDaemonRestart(r),s||g.stop(),!r){try{await Nf.updateVersion(De)}catch{}try{await new Lo().writeCache({lastCheck:0,latestVersion:""})}catch{}}return s?AC(c,r):PC(c,r)}catch(l){return s||g.stop(),g.fail(w(l)),Ne(l)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[],warnings:[]},r=bi();if(e){if(Qs()){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(r.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 r)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(Qs())try{OC("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;r.length>0?o=r.map(d=>d.pm):o=[kl()];let i=null;try{let d=(await new Lo().getLatestVersion())?.trim();d&&/^\d+\.\d+\.\d+/.test(d)&&(i=`prjct-cli@${d}`)}catch{}for(let d of o){if(!wl(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;OC(d.name,p,{stdio:"pipe"}),t.details.push(`${d.name} install complete${i?` (${i})`:""}`)}catch(p){t.errors.push(`${d.name}: ${w(p)}`)}}let c=bi(),l=new Map(r.map(d=>[d.pm.name,d.version])),u=[];for(let{pm:d,version:p}of c){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]):c.length>0&&t.details.push(`v${c[0].version} (already latest)`)}catch(s){t.success=!1,t.errors.push(w(s))}return t}async phaseGlobalCleanup(e,t="auto",r=!1){let s={success:!0,details:[],errors:[],warnings:[]},o=await this.getAllProjectIds();if(o.length===0)s.details.push("No projects found");else{let i=0,c=0,l=0,u=0;for(let d of o)if(!e)try{if(!qb(d)){l+=1;continue}let p=await gc(d),m=await hc(d);if(i+=p.migratedFiles.length,c+=m,p.errors.length>0)for(let f of p.errors)u+=1,(s.warnings?.length??0)<10&&s.warnings?.push(`${d.slice(0,8)}: ${f.file}: ${f.error}`)}catch(p){u+=1,(s.warnings?.length??0)<10&&s.warnings?.push(`${d.slice(0,8)}: ${w(p)}`)}if(e)s.details.push(`Would migrate ${o.length} project(s)`);else{let d=[`${o.length} project(s) checked`];if(l>0&&d.push(`${l} already on SQLite`),i>0&&d.push(`${i} files migrated`),c>0&&d.push(`${c} leftovers swept`),s.details.push(d.join(", ")),u>0){let p=u-(s.warnings?.length??0);s.details.push(`Legacy migration skipped ${u} issue(s) without blocking update${p>0?` (${p} more hidden)`:""}`)}}}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 c=await new fn().cleanupAllLegacy();c.cleaned.length>0&&s.details.push(`Cleaned ${c.cleaned.length} legacy artifact(s)`)}catch(i){s.errors.push(`Legacy cleanup: ${w(i)}`)}try{let c=await new fn().installCommands();s.details.push(`Editor commands reinstalled (${c.installed?.length||0} providers)`)}catch(i){s.errors.push(`Commands: ${w(i)}`)}try{await new fn().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(()=>(_t(),nr)),c=await i(),l=zf.join(rt("node:os").homedir());if(c.gemini.installed){let u=zf.join(l,".gemini","GEMINI.md");try{let d=await Xf.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(()=>(_n(),_a)),y=f("global/GEMINI.md");if(y?.includes(p)&&y.includes(m)){let R=y.substring(y.indexOf(p),y.indexOf(m)+m.length),k=d.substring(0,d.indexOf(p)),S=d.substring(d.indexOf(m)+m.length),E=k+R+S,C="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",O="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(E.includes(C)&&E.includes(O)){let Q=E.substring(0,E.indexOf(C)),me=E.substring(E.indexOf(O)+O.length);E=`${(Q+me).replace(/\n{3,}/g,`
1567
+ `)}var jC,We,$C,MC,bl=h(()=>{"use strict";Zn();jC="\\\\.\\pipe\\";a(IC,"getDaemonRunDir");a(DC,"getDaemonSocketPath");a(Tr,"isDaemonNamedPipe");We={runDir:a(()=>IC(),"runDir"),socket:a(()=>DC(),"socket"),pid:a(()=>vi.join(We.runDir(),"daemon.pid"),"pid"),log:a(()=>vi.join(We.runDir(),"daemon.log"),"log")},$C=1800*1e3,MC=1024*1024;a(Zs,"encodeMessage")});var Vf={};N(Vf,{executeViaDaemon:()=>eO,forceKillDaemon:()=>nO,getDaemonStatus:()=>Z0,isDaemonRunning:()=>NC,sendRequest:()=>Si,spawnDaemon:()=>qf,stopDaemon:()=>tO});import vl from"node:crypto";import Qe from"node:fs";import{connect as Q0}from"node:net";import Bf from"node:path";async function NC(){let n=We.socket(),e=Tr(n);if(!e&&!Qe.existsSync(n))return!1;try{return(await Si({id:vl.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{if(!e)try{Qe.unlinkSync(n)}catch{}return!1}}async function Z0(){let n=We.socket(),e=We.pid();if(!Tr(n)&&!Qe.existsSync(n))return{running:!1};try{let r=await Si({id:vl.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(r.success&&r.result)return r.result}catch{}return Qe.existsSync(e)?{running:!1,pid:parseInt(Qe.readFileSync(e,"utf-8").trim(),10),socketPath:n}:{running:!1}}function Si(n){return new Promise((e,t)=>{let r=We.socket(),s=Q0(r),o="",i=!1,c=setTimeout(()=>{i||(i=!0,s.destroy(),t(new Error("Daemon request timed out")))},3e4);s.on("connect",()=>{s.write(Zs(n))}),s.on("data",l=>{o+=l.toString();let u=o.indexOf(`
1568
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(c),s.end(),e(p)}catch(p){i=!0,clearTimeout(c),s.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),s.on("error",l=>{i||(i=!0,clearTimeout(c),t(l))}),s.on("close",()=>{i||(i=!0,clearTimeout(c),t(new Error("Connection closed before response")))})})}async function eO(n,e,t,r,s,o=!0){let i=We.socket();if(!Tr(i)&&!Qe.existsSync(i))return o&&qf().catch(()=>{}),null;try{return await Si({id:vl.randomUUID(),command:n,args:e,options:t,cwd:r,perfStartNs:s})}catch{return o&&qf().catch(()=>{}),null}}async function tO(){try{return(await Si({id:vl.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function nO(){let n=We.pid(),e=We.socket(),t=!1;if(Qe.existsSync(n)){let r=parseInt(Qe.readFileSync(n,"utf-8").trim(),10);if(!Number.isNaN(r))try{process.kill(r,"SIGKILL"),t=!0}catch{}}try{Qe.existsSync(n)&&Qe.unlinkSync(n)}catch{}if(!Tr(e))try{Qe.existsSync(e)&&Qe.unlinkSync(e)}catch{}return t}async function qf(){let{spawn:n}=await import("node:child_process"),e=Bf.join(__dirname,"entry.ts"),t=Bf.join(__dirname,"..","daemon","entry.mjs"),r=Bf.join(__dirname,"..","dist","daemon","entry.mjs"),s,o,i=process.platform!=="win32"&&Sy();if(Qe.existsSync(e))s=e,o="bun";else if(Qe.existsSync(t))s=t,o=i?"bun":"node";else if(Qe.existsSync(r))s=r,o=i?"bun":"node";else return!1;let c=We.runDir();Qe.mkdirSync(c,{recursive:!0});let l=We.log(),u=Qe.openSync(l,"a");n(o,[s],{detached:!0,stdio:["ignore",u,u],env:process.env}).unref(),Qe.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await NC())return!0;return!1}var Jf=h(()=>{"use strict";vu();bl();a(NC,"isDaemonRunning");a(Z0,"getDaemonStatus");a(Si,"sendRequest");a(eO,"executeViaDaemon");a(tO,"stopDaemon");a(nO,"forceKillDaemon");a(qf,"spawnDaemon")});var Yf={};N(Yf,{UpdateCommands:()=>Kf});import{execFileSync as OC}from"node:child_process";import Xf from"node:fs/promises";import zf from"node:path";var Kf,Qf=h(()=>{"use strict";Dn();Of();Re();Td();mp();W();we();fe();Ze();xe();xC();_C();Gf();Kf=class extends V{static{a(this,"UpdateCommands")}async update(e={},t=process.cwd()){let r=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,c={phase1:{success:!0,details:[],errors:[],warnings:[]},phase2:{success:!0,details:[],errors:[],warnings:[]},phase3:{success:!0,details:[],errors:[],warnings:[]}};try{if(!r)try{let{isDaemonRunning:l,stopDaemon:u,forceKillDaemon:d}=await Promise.resolve().then(()=>(Jf(),Vf));await l()&&(await u()||d())}catch{}if(s||g.step(1,3,"Updating package..."),c.phase1=await this.phasePackageUpdate(r),s||g.stop(),!r&&c.phase1.success&&EC(),s||g.step(2,3,"Cleaning up all projects..."),c.phase2=await this.phaseGlobalCleanup(r,o,i),s||g.stop(),s||g.step(3,3,"Restarting daemon..."),c.phase3=await this.phaseDaemonRestart(r),s||g.stop(),!r){try{await Nf.updateVersion(De)}catch{}try{await new Lo().writeCache({lastCheck:0,latestVersion:""})}catch{}}return s?AC(c,r):PC(c,r)}catch(l){return s||g.stop(),g.fail(w(l)),Ne(l)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[],warnings:[]},r=bi();if(e){if(Qs()){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(r.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 r)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(Qs())try{OC("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;r.length>0?o=r.map(d=>d.pm):o=[kl()];let i=null;try{let d=(await new Lo().getLatestVersion())?.trim();d&&/^\d+\.\d+\.\d+/.test(d)&&(i=`prjct-cli@${d}`)}catch{}for(let d of o){if(!wl(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;OC(d.name,p,{stdio:"pipe"}),t.details.push(`${d.name} install complete${i?` (${i})`:""}`)}catch(p){t.errors.push(`${d.name}: ${w(p)}`)}}let c=bi(),l=new Map(r.map(d=>[d.pm.name,d.version])),u=[];for(let{pm:d,version:p}of c){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]):c.length>0&&t.details.push(`v${c[0].version} (already latest)`)}catch(s){t.success=!1,t.errors.push(w(s))}return t}async phaseGlobalCleanup(e,t="auto",r=!1){let s={success:!0,details:[],errors:[],warnings:[]},o=await this.getAllProjectIds();if(o.length===0)s.details.push("No projects found");else{let i=0,c=0,l=0,u=0;for(let d of o)if(!e)try{if(!qb(d)){l+=1;continue}let p=await gc(d),m=await hc(d);if(i+=p.migratedFiles.length,c+=m,p.errors.length>0)for(let f of p.errors)u+=1,(s.warnings?.length??0)<10&&s.warnings?.push(`${d.slice(0,8)}: ${f.file}: ${f.error}`)}catch(p){u+=1,(s.warnings?.length??0)<10&&s.warnings?.push(`${d.slice(0,8)}: ${w(p)}`)}if(e)s.details.push(`Would migrate ${o.length} project(s)`);else{let d=[`${o.length} project(s) checked`];if(l>0&&d.push(`${l} already on SQLite`),i>0&&d.push(`${i} files migrated`),c>0&&d.push(`${c} leftovers swept`),s.details.push(d.join(", ")),u>0){let p=u-(s.warnings?.length??0);s.details.push(`Legacy migration skipped ${u} issue(s) without blocking update${p>0?` (${p} more hidden)`:""}`)}}}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 c=await new gn().cleanupAllLegacy();c.cleaned.length>0&&s.details.push(`Cleaned ${c.cleaned.length} legacy artifact(s)`)}catch(i){s.errors.push(`Legacy cleanup: ${w(i)}`)}try{let c=await new gn().installCommands();s.details.push(`Editor commands reinstalled (${c.installed?.length||0} providers)`)}catch(i){s.errors.push(`Commands: ${w(i)}`)}try{await new gn().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(()=>(_t(),rr)),c=await i(),l=zf.join(rt("node:os").homedir());if(c.gemini.installed){let u=zf.join(l,".gemini","GEMINI.md");try{let d=await Xf.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(()=>(_n(),_a)),y=f("global/GEMINI.md");if(y?.includes(p)&&y.includes(m)){let R=y.substring(y.indexOf(p),y.indexOf(m)+m.length),k=d.substring(0,d.indexOf(p)),S=d.substring(d.indexOf(m)+m.length),E=k+R+S,C="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",O="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(E.includes(C)&&E.includes(O)){let Q=E.substring(0,E.indexOf(C)),me=E.substring(E.indexOf(O)+O.length);E=`${(Q+me).replace(/\n{3,}/g,`
1569
1569
 
1570
1570
  `).trim()}
1571
- `}await Xf.writeFile(u,E,"utf-8"),s.details.push("Gemini global config updated")}}}catch{}}}catch{}}try{let i=await RC(t,e,r);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:[],warnings:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:r,stopDaemon:s,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Jf(),Vf));await r()?(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 c=await i();t.details.push(c?"Daemon restarted":"Daemon will start automatically on next use")}catch(r){t.success=!1,t.errors.push(w(r))}return t}async getAllProjectIds(){let e=zf.join(j.getGlobalBasePath(),"projects");try{return(await Xf.readdir(e,{withFileTypes:!0})).filter(r=>r.isDirectory()&&!r.name.startsWith(".")).map(r=>r.name)}catch{return[]}}}});var FC={};N(FC,{runContextTool:()=>rO});async function rO(n,e,t){let[r,...s]=n;try{switch(r){case"memory":return await LC(s,t,{kind:"memory"});case"learnings":return await LC(s,t,{kind:"learnings"});case"wiki":return await sO(t,s);case"help":return{tool:"error",result:{error:iO(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${r}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}}catch(o){return{tool:"error",result:{error:w(o),code:"EXECUTION_ERROR"}}}}async function sO(n,e=[]){let t=await x.getProjectId(n);if(!t)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};if(e[0]==="sync")return oO(n,t,e.slice(1));let{generateWiki:s}=await Promise.resolve().then(()=>(yn(),br)),{wikiRoot:o,filesWritten:i}=await s(n,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 oO(n,e,t){let r=t.includes("--force"),{ingestCapturedNotes:s}=await Promise.resolve().then(()=>(Bc(),AE)),{regenerateWikiDeferred:o}=await Promise.resolve().then(()=>(yn(),br)),i=await s(n,{force:r});i.ingested>0&&await o(n,e);let c=[];if(c.push(`> Ingested ${i.ingested} note(s) from \`.prjct/wiki/captured/\`.`),i.skipped.length>0){c.push("","**Skipped:**");for(let l of i.skipped)c.push(`- \`${l.file}\` \u2014 ${l.reason}`)}if(i.errors.length>0){c.push("","**Errors:**");for(let l of i.errors)c.push(`- \`${l.file}\` \u2014 ${l.error}`)}return i.ingested===0&&i.skipped.length===0&&i.errors.length===0&&c.push("","Nothing to ingest. Drop markdown notes with frontmatter into `.prjct/wiki/captured/` and re-run."),{tool:"wiki",result:{markdown:c.join(`
1571
+ `}await Xf.writeFile(u,E,"utf-8"),s.details.push("Gemini global config updated")}}}catch{}}}catch{}}try{let i=await RC(t,e,r);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:[],warnings:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:r,stopDaemon:s,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(Jf(),Vf));await r()?(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 c=await i();t.details.push(c?"Daemon restarted":"Daemon will start automatically on next use")}catch(r){t.success=!1,t.errors.push(w(r))}return t}async getAllProjectIds(){let e=zf.join(j.getGlobalBasePath(),"projects");try{return(await Xf.readdir(e,{withFileTypes:!0})).filter(r=>r.isDirectory()&&!r.name.startsWith(".")).map(r=>r.name)}catch{return[]}}}});var FC={};N(FC,{runContextTool:()=>rO});async function rO(n,e,t){let[r,...s]=n;try{switch(r){case"memory":return await LC(s,t,{kind:"memory"});case"learnings":return await LC(s,t,{kind:"learnings"});case"wiki":return await sO(t,s);case"help":return{tool:"error",result:{error:iO(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${r}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}}catch(o){return{tool:"error",result:{error:w(o),code:"EXECUTION_ERROR"}}}}async function sO(n,e=[]){let t=await x.getProjectId(n);if(!t)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};if(e[0]==="sync")return oO(n,t,e.slice(1));let{generateWiki:s}=await Promise.resolve().then(()=>(cn(),Bn)),{wikiRoot:o,filesWritten:i}=await s(n,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 oO(n,e,t){let r=t.includes("--force"),{ingestCapturedNotes:s}=await Promise.resolve().then(()=>(Bc(),AE)),{regenerateWikiDeferred:o}=await Promise.resolve().then(()=>(cn(),Bn)),i=await s(n,{force:r});i.ingested>0&&await o(n,e);let c=[];if(c.push(`> Ingested ${i.ingested} note(s) from \`.prjct/wiki/captured/\`.`),i.skipped.length>0){c.push("","**Skipped:**");for(let l of i.skipped)c.push(`- \`${l.file}\` \u2014 ${l.reason}`)}if(i.errors.length>0){c.push("","**Errors:**");for(let l of i.errors)c.push(`- \`${l.file}\` \u2014 ${l.error}`)}return i.ingested===0&&i.skipped.length===0&&i.errors.length===0&&c.push("","Nothing to ingest. Drop markdown notes with frontmatter into `.prjct/wiki/captured/` and re-run."),{tool:"wiki",result:{markdown:c.join(`
1572
1572
  `),entryCount:i.ingested}}}async function LC(n,e,t){let r=await x.getProjectId(e);if(!r)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};let s=n.filter(u=>!u.startsWith("-")).join(" ").trim()||void 0,o=(()=>{let u=n.find(d=>d.startsWith("--id"));if(u){let d=u.includes("=")?u.split("=")[1]:n[n.indexOf(u)+1];if(d)return d}return s&&/^mem[_-]?\d+$/i.test(s)?s:void 0})();if(o){let u=M.getById(r,o);u&&ut.recordFetch(r,u.id);let d=u?M.expandWithLinks(r,[u],5):[],p=u?[u,...d]:[];return{tool:t.kind,result:{markdown:u?On(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"],c=t.kind==="learnings"?i:void 0,l=await wf(e,r,{topic:s,types:c,limit:30});return{tool:t.kind,result:{markdown:On(l),entryCount:l.length,topic:s}}}function iO(){return`
1573
1573
  prjct context \u2014 memory-bound context subtools
1574
1574
 
@@ -1602,7 +1602,7 @@ underlying functions still exist for the orchestrator + MCP surface.
1602
1602
  ${p.contextPrompt}`):g.info(`
1603
1603
  ${p.contextPrompt}`)),{success:!0,taskId:p.taskId,status:e}}if(!await Et(s.value,t)){let p=await X.getPausedTasks(s.value);if(p.length>0){let m=p[0],f=`Task: ${m.id} | Type: ${m.type??"unset"} | Status: paused`;return r.md?console.log(f):g.info(f),{success:!0,taskId:m.id,status:"paused"}}}let i=await Mc(s.value,r,t);if(!i.ok)return i.result;let c=i.value,l=await yi(s.value,c.id),u=`Task: ${c.id} | Type: ${c.type??"unset"} | Status: ${l??"active"}`,d=c.harness?`Harness: ${c.harness.level} ${c.harness.kind}/${c.harness.risk}`:null;return r.md?console.log(d?`${u}
1604
1604
  ${d}`:u):(g.info(u),d&&g.info(d)),{success:!0,taskId:c.id,status:l??"active",harness:d}}catch(s){let o=w(s);return D(o)}}async tag(e=null,t=process.cwd(),r={}){try{let s=await ae(t);if(!s.ok)return s.result;let o=await Mc(s.value,r,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=pO(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 c=i.type;c&&dO.includes(c)&&await X.updateCurrentTask(s.value,{type:c}),await ze.log(t,"task.tagged",{taskId:o.value.id,tags:i});let l=Object.entries(i).map(([u,d])=>`${u}=${d}`).join(", ");return r.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 D(o)}}async remember(e=null,t=process.cwd(),r={}){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,...]
1605
- Types: ${Ps.join(" | ")}`),{success:!1,error:"Missing args"};let o=fO(e);if(!o.ok)return D(o.error);let{type:i,content:c}=o,l=qs(c);if(l.length>0&&!r.force){let R=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${R}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Rs(c);if(u.length>0&&!r.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=mO(r.tags),p=await ae(t);if(!p.ok)return p.result;let m=await Et(p.value,t),f=d;if(i==="context")try{let{deriveGitContext:R}=await Promise.resolve().then(()=>(WC(),GC)),k=await R(t);f={...d,...k.commit?{commit:k.commit}:{},...k.author?{author:k.author}:{},...k.files?.length?{files:k.files.join(",")}:{},...m?.id?{taskId:m.id}:{}}}catch{}await M.remember(t,{type:i,content:c,tags:f,source:m?.id});let{regenerateWikiDeferred:y}=await Promise.resolve().then(()=>(yn(),br));return await y(t,p.value),r.md?console.log(`\u2713 remembered ${i}: ${c}`):g.done(`remembered ${i}`),{success:!0,type:i,content:c,tags:d}}catch(s){let o=w(s);return D(o)}}async forget(e=null,t=process.cwd(),r={}){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 ae(t);if(!o.ok)return o.result;if(!M.forget(o.value,s))return r.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:c}=await Promise.resolve().then(()=>(yn(),br));return await c(t,o.value),r.md?console.log(`\u2713 forgot ${s}`):g.done(`forgot ${s}`),{success:!0,id:s}}catch(s){let o=w(s);return D(o)}}};a(pO,"parseTagPairs");a(mO,"parseFlagTags");a(fO,"parseRememberArgs")});var og={};N(og,{SeedCommands:()=>sg});var sg,ig=h(()=>{"use strict";km();Tm();W();we();fe();xe();sg=class extends V{static{a(this,"SeedCommands")}async seed(e=null,t=process.cwd(),r={}){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,r);case"remove":return this.remove(i||null,t,r);case"list":return this.list(null,t,r);case"suggest":return this.suggest(null,t,r);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(),r={}){try{if(!e)return g.info(`Usage: prjct seed add <pack>[,<pack>...]
1605
+ Types: ${Ps.join(" | ")}`),{success:!1,error:"Missing args"};let o=fO(e);if(!o.ok)return D(o.error);let{type:i,content:c}=o,l=qs(c);if(l.length>0&&!r.force){let R=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${R}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=Rs(c);if(u.length>0&&!r.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=mO(r.tags),p=await ae(t);if(!p.ok)return p.result;let m=await Et(p.value,t),f=d;if(i==="context")try{let{deriveGitContext:R}=await Promise.resolve().then(()=>(WC(),GC)),k=await R(t);f={...d,...k.commit?{commit:k.commit}:{},...k.author?{author:k.author}:{},...k.files?.length?{files:k.files.join(",")}:{},...m?.id?{taskId:m.id}:{}}}catch{}await M.remember(t,{type:i,content:c,tags:f,source:m?.id});let{regenerateWikiDeferred:y}=await Promise.resolve().then(()=>(cn(),Bn));return await y(t,p.value),r.md?console.log(`\u2713 remembered ${i}: ${c}`):g.done(`remembered ${i}`),{success:!0,type:i,content:c,tags:d}}catch(s){let o=w(s);return D(o)}}async forget(e=null,t=process.cwd(),r={}){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 ae(t);if(!o.ok)return o.result;if(!M.forget(o.value,s))return r.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:c}=await Promise.resolve().then(()=>(cn(),Bn));return await c(t,o.value),r.md?console.log(`\u2713 forgot ${s}`):g.done(`forgot ${s}`),{success:!0,id:s}}catch(s){let o=w(s);return D(o)}}};a(pO,"parseTagPairs");a(mO,"parseFlagTags");a(fO,"parseRememberArgs")});var og={};N(og,{SeedCommands:()=>sg});var sg,ig=h(()=>{"use strict";km();Tm();W();we();fe();xe();sg=class extends V{static{a(this,"SeedCommands")}async seed(e=null,t=process.cwd(),r={}){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,r);case"remove":return this.remove(i||null,t,r);case"list":return this.list(null,t,r);case"suggest":return this.suggest(null,t,r);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(),r={}){try{if(!e)return g.info(`Usage: prjct seed add <pack>[,<pack>...]
1606
1606
  Available: ${wm.join(", ")}`),{success:!1,error:"No pack given"};let s=e.split(",").map(c=>c.trim()).filter(Boolean),o=await vm(t,s,{suggestPersona:r.suggestPersona??!1}),i=`activated: ${o.activated.join(", ")||"none"}${o.skipped.length?` \u2022 unknown: ${o.skipped.join(", ")}`:""}`;return r.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(s){let o=w(s);return D(o)}}async remove(e=null,t=process.cwd(),r={}){try{if(!e)return g.info("Usage: prjct seed remove <pack>[,<pack>...]"),{success:!1,error:"No pack given"};let s=e.split(",").map(c=>c.trim()).filter(Boolean),o=await Sm(t,s),i=`deactivated: ${o.deactivated.join(", ")||"none"}${o.notActive.length?` \u2022 not active: ${o.notActive.join(", ")}`:""}`;return r.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(s){let o=w(s);return D(o)}}async list(e=null,t=process.cwd(),r={}){try{let s=await Em(t);if(s.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${wm.join(", ")}`;return r.md?console.log(`> ${o}`):g.info(o),{success:!0,active:[]}}if(r.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(`
1607
1607
  `))}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 D(o)}}async suggest(e=null,t=process.cwd(),r={}){try{let s=await bm(t),o=s.map(i=>{let c=Qr[i];return{name:i,description:c?.description??""}});if(r.md){let i=["# Suggested packs for this project",""];for(let c of o)i.push(`- **${c.name}** \u2014 ${c.description}`);i.push(""),i.push(`Activate with: \`prjct seed add ${s.join(",")}\``),console.log(i.join(`
1608
1608
  `))}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 D(o)}}}});var XC={};N(XC,{PRJCT_HOOKS:()=>to,install:()=>ug,status:()=>pg,uninstall:()=>dg});import ag from"node:fs/promises";import gO from"node:os";import qC from"node:path";function eo(){let n=process.env.HOME||gO.homedir();return qC.join(n,".claude","settings.json")}function hO(n){let e=n.command?.match(/\bhook\s+(\S+)/);return e?e[1]:null}function yO(n){let e=new Set(to.map(r=>r.subcommand)),t=0;for(let r of Object.keys(n)){let s=n[r],o=[];for(let i of s)i.hooks=i.hooks.filter(c=>{if(!Tl(c))return!0;let l=hO(c);return l&&!e.has(l)?(t++,!1):!0}),i.hooks.length>0&&o.push(i);o.length>0?n[r]=o:delete n[r]}return t}async function lg(){try{let n=await ag.readFile(eo(),"utf-8"),e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch(n){if(n.code==="ENOENT")return{};throw n}}async function VC(n){await ag.mkdir(qC.dirname(eo()),{recursive:!0}),await ag.writeFile(eo(),`${JSON.stringify(n,null,2)}
@@ -1612,9 +1612,9 @@ Available: ${wm.join(", ")}`),{success:!1,error:"No pack given"};let s=e.split("
1612
1612
  - removed: ${s.hooksRemoved}
1613
1613
  - settings: \`${s.settingsPath}\`
1614
1614
  `):g.done(o),{success:!0,hooksRemoved:s.hooksRemoved}}catch(s){let o=w(s);return D(o)}}async status(e=null,t=process.cwd()){try{let r=await pg();return{success:!0,installed:r.installed,expected:r.expected}}catch(r){return Ne(r)}}}});var wg={};N(wg,{CaptureCommands:()=>yg});function kO(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}var yg,kg=h(()=>{"use strict";ke();W();we();fe();Fo();Gc();xe();yg=class extends V{static{a(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),r={}){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=qs(s);if(o.length>0&&!r.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=Rs(s);if(i.length>0&&!r.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 c=kO(r.tags),l=await this.ensureProjectInit(t);if(!l.success)return l;await M.remember(t,{type:"inbox",content:s,tags:c,provenance:"declared"});let u=s.length>60?`${s.slice(0,57)}\u2026`:s;return r.md?console.log(`\u2713 captured: ${u}`):g.done(`captured: ${u}`),{success:!0,type:"inbox",content:s,tags:c}}catch(s){let o=w(s);return D(o)}}};a(kO,"parseFlagTags")});import bg from"node:fs";import bO from"node:os";import Cl from"node:path";var vO,vg,os,zC=h(()=>{"use strict";vO=[{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}],vg=class{static{a(this,"McpService")}async list(e){let t=new Set(this.readDenied(e).map(i=>i.serverName)),r=[];for(let i of vO)r.push({name:i.name,displayName:i.displayName,source:"cloud",description:i.description,estimatedTools:i.estimatedTools,denied:t.has(i.name)});let s=this.readJson(Cl.join(e,".mcp.json"));if(s?.mcpServers)for(let i of Object.keys(s.mcpServers))r.push({name:i,displayName:i,source:"project",description:"stdio server declared in .mcp.json",estimatedTools:0,denied:t.has(i)});let o=this.readJson(Cl.join(bO.homedir(),".claude.json"));if(o?.mcpServers)for(let i of Object.keys(o.mcpServers))r.push({name:i,displayName:i,source:"global",description:"stdio server declared in ~/.claude.json",estimatedTools:0,denied:t.has(i)});return r}async deny(e,t){let r=this.localSettingsPath(e),s=this.readJson(r)??{},o=s.deniedMcpServers??[];return o.some(c=>c.serverName===t)?{alreadyDenied:!0,settingsPath:r}:(s.deniedMcpServers=[...o,{serverName:t}],this.writeJson(r,s),{alreadyDenied:!1,settingsPath:r})}async allow(e,t){let r=this.localSettingsPath(e),s=this.readJson(r)??{},o=s.deniedMcpServers??[],i=o.filter(c=>c.serverName!==t);return i.length===o.length?{wasDenied:!1,settingsPath:r}:(i.length===0?delete s.deniedMcpServers:s.deniedMcpServers=i,this.writeJson(r,s),{wasDenied:!0,settingsPath:r})}async setEnabled(e,t,r){let s=this.localSettingsPath(e),o=this.readJson(s)??{},i=new Set((o.deniedMcpServers??[]).map(p=>p.serverName)),c=new Set(t),l=new Set(i);for(let p of r)c.has(p)?l.delete(p):l.add(p);let u=[],d=[];for(let p of r){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 Cl.join(e,".claude","settings.local.json")}readDenied(e){return this.readJson(this.localSettingsPath(e))?.deniedMcpServers??[]}readJson(e){try{let t=bg.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}writeJson(e,t){bg.mkdirSync(Cl.dirname(e),{recursive:!0}),bg.writeFileSync(e,`${JSON.stringify(t,null,2)}
1615
- `,"utf-8")}},os=new vg});var Eg={};N(Eg,{McpCommands:()=>Sg});import*as Rt from"@clack/prompts";import Bn from"chalk";var Sg,Tg=h(()=>{"use strict";zC();W();we();Ge();fe();xe();Sg=class extends V{static{a(this,"McpCommands")}async mcp(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??null,i=s[1]??null;if(o===null)return!r.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,r);switch(o){case"list":return this.list(t,r);case"status":return this.status(t,r);case"deny":return this.deny(i,t,r);case"allow":return this.allow(i,t,r);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 os.list(e);if(t.length===0)return g.info("No MCP servers detected for this project."),{success:!0,servers:[]};let r=a(S=>S.reduce((E,C)=>E+C.estimatedTools,0),"sumTools"),s=t.filter(S=>!S.denied),o=r(s),i=r(t),c=e.split("/").pop()??"this project";Rt.intro(Bn.cyan.bold(`MCP servers \u2014 ${c}`)),Rt.note([`${s.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,Bn.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
1616
- `),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((S,E)=>{if(S.source!==E.source){let C=["cloud","project","global"];return C.indexOf(S.source)-C.indexOf(E.source)}return E.estimatedTools-S.estimatedTools}),d=await Rt.multiselect({message:"Keep enabled in this project:",options:u.map(S=>({value:S.name,label:this.optionLabel(S,l[S.source]),hint:S.description})),initialValues:u.filter(S=>!S.denied).map(S=>S.name),required:!1});if(Rt.isCancel(d))return Rt.cancel("No changes."),{success:!0,cancelled:!0};let p=d,m=await os.setEnabled(e,p,t.map(S=>S.name)),f=r(t.filter(S=>p.includes(S.name))),y=f-o;if(m.nowDenied.length===0&&m.nowAllowed.length===0)return Rt.outro(Bn.dim("No changes.")),{success:!0,unchanged:!0};let R=[];m.nowDenied.length>0&&R.push(Bn.red(`\u2717 denied (${m.nowDenied.length}): ${m.nowDenied.join(", ")}`)),m.nowAllowed.length>0&&R.push(Bn.green(`\u2713 allowed (${m.nowAllowed.length}): ${m.nowAllowed.join(", ")}`));let k=y>0?"+":"";return R.push(""),R.push(`Tools loaded: ${o} \u2192 ${f} (${Bn.bold(`${k}${y}`)})`),Rt.note(R.join(`
1617
- `),`Wrote ${this.relativeSettingsPath(m.settingsPath,e)}`),Rt.outro(Bn.yellow("Restart Claude Code to apply (MCP config is cached at session start).")),{success:!0,...m,beforeTools:o,afterTools:f}}catch(t){let r=w(t);return D(r)}}optionLabel(e,t){let r=e.estimatedTools>0?Bn.dim(` ~${e.estimatedTools} tools`):"";return`${Bn.dim(`[${t}]`)} ${e.displayName}${r}`}relativeSettingsPath(e,t){return e.startsWith(t)?e.slice(t.length+1):e}async list(e,t){try{let r=await os.list(e);return t.md?console.log(this.formatMd(r,!1)):this.formatTerminal(r,!1),{success:!0,servers:r}}catch(r){let s=w(r);return D(s)}}async status(e,t){try{let s=(await os.list(e)).filter(o=>o.denied);return t.md?console.log(this.formatMd(s,!0)):this.formatTerminal(s,!0),{success:!0,denied:s}}catch(r){let s=w(r);return D(s)}}async deny(e,t,r){if(!e)return g.fail("Usage: prjct mcp deny <serverName>"),{success:!1,error:"Missing serverName"};try{let s=await os.deny(t,e),o=s.alreadyDenied?"already denied":"denied",i=`${e} ${o} in this project`;return r.md?console.log(P(F("Done",i),F("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 D(o)}}async allow(e,t,r){if(!e)return g.fail("Usage: prjct mcp allow <serverName>"),{success:!1,error:"Missing serverName"};try{let s=await os.allow(t,e),o=s.wasDenied?`${e} re-allowed in this project`:`${e} was not denied \u2014 nothing to change`;return r.md?console.log(P(F("Done",o),s.wasDenied?F("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 D(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 r=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(`
1615
+ `,"utf-8")}},os=new vg});var Eg={};N(Eg,{McpCommands:()=>Sg});import*as Rt from"@clack/prompts";import qn from"chalk";var Sg,Tg=h(()=>{"use strict";zC();W();we();Ge();fe();xe();Sg=class extends V{static{a(this,"McpCommands")}async mcp(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??null,i=s[1]??null;if(o===null)return!r.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,r);switch(o){case"list":return this.list(t,r);case"status":return this.status(t,r);case"deny":return this.deny(i,t,r);case"allow":return this.allow(i,t,r);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 os.list(e);if(t.length===0)return g.info("No MCP servers detected for this project."),{success:!0,servers:[]};let r=a(S=>S.reduce((E,C)=>E+C.estimatedTools,0),"sumTools"),s=t.filter(S=>!S.denied),o=r(s),i=r(t),c=e.split("/").pop()??"this project";Rt.intro(qn.cyan.bold(`MCP servers \u2014 ${c}`)),Rt.note([`${s.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,qn.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
1616
+ `),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((S,E)=>{if(S.source!==E.source){let C=["cloud","project","global"];return C.indexOf(S.source)-C.indexOf(E.source)}return E.estimatedTools-S.estimatedTools}),d=await Rt.multiselect({message:"Keep enabled in this project:",options:u.map(S=>({value:S.name,label:this.optionLabel(S,l[S.source]),hint:S.description})),initialValues:u.filter(S=>!S.denied).map(S=>S.name),required:!1});if(Rt.isCancel(d))return Rt.cancel("No changes."),{success:!0,cancelled:!0};let p=d,m=await os.setEnabled(e,p,t.map(S=>S.name)),f=r(t.filter(S=>p.includes(S.name))),y=f-o;if(m.nowDenied.length===0&&m.nowAllowed.length===0)return Rt.outro(qn.dim("No changes.")),{success:!0,unchanged:!0};let R=[];m.nowDenied.length>0&&R.push(qn.red(`\u2717 denied (${m.nowDenied.length}): ${m.nowDenied.join(", ")}`)),m.nowAllowed.length>0&&R.push(qn.green(`\u2713 allowed (${m.nowAllowed.length}): ${m.nowAllowed.join(", ")}`));let k=y>0?"+":"";return R.push(""),R.push(`Tools loaded: ${o} \u2192 ${f} (${qn.bold(`${k}${y}`)})`),Rt.note(R.join(`
1617
+ `),`Wrote ${this.relativeSettingsPath(m.settingsPath,e)}`),Rt.outro(qn.yellow("Restart Claude Code to apply (MCP config is cached at session start).")),{success:!0,...m,beforeTools:o,afterTools:f}}catch(t){let r=w(t);return D(r)}}optionLabel(e,t){let r=e.estimatedTools>0?qn.dim(` ~${e.estimatedTools} tools`):"";return`${qn.dim(`[${t}]`)} ${e.displayName}${r}`}relativeSettingsPath(e,t){return e.startsWith(t)?e.slice(t.length+1):e}async list(e,t){try{let r=await os.list(e);return t.md?console.log(this.formatMd(r,!1)):this.formatTerminal(r,!1),{success:!0,servers:r}}catch(r){let s=w(r);return D(s)}}async status(e,t){try{let s=(await os.list(e)).filter(o=>o.denied);return t.md?console.log(this.formatMd(s,!0)):this.formatTerminal(s,!0),{success:!0,denied:s}}catch(r){let s=w(r);return D(s)}}async deny(e,t,r){if(!e)return g.fail("Usage: prjct mcp deny <serverName>"),{success:!1,error:"Missing serverName"};try{let s=await os.deny(t,e),o=s.alreadyDenied?"already denied":"denied",i=`${e} ${o} in this project`;return r.md?console.log(P(F("Done",i),F("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 D(o)}}async allow(e,t,r){if(!e)return g.fail("Usage: prjct mcp allow <serverName>"),{success:!1,error:"Missing serverName"};try{let s=await os.allow(t,e),o=s.wasDenied?`${e} re-allowed in this project`:`${e} was not denied \u2014 nothing to change`;return r.md?console.log(P(F("Done",o),s.wasDenied?F("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 D(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 r=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(`
1618
1618
  MCP servers \u2014 this project (${process.cwd().split("/").pop()})
1619
1619
  `);for(let o of e){let i=o.denied?"\u2717 DENIED":"\u2713 active",c=o.estimatedTools>0?` ~${o.estimatedTools} tools`:"";console.log(` ${i.padEnd(10)} [${o.source}] ${o.displayName}${c}`),console.log(` ${o.description}`),console.log(` name: ${o.name}`)}t||(console.log(""),console.log(`Estimated tools loaded: ${s} (denied: ${r})`),console.log(""),console.log("Toggle in this project (does NOT affect other projects):"),console.log(" prjct mcp deny <name> # silence here, keep elsewhere"),console.log(" prjct mcp allow <name> # re-enable here"),console.log(""),console.log("Cloud MCPs come from your claude.ai connected apps. To see one"),console.log("here, it must already be connected in claude.ai. To disable it"),console.log("globally, disconnect it in claude.ai settings."))}formatMd(e,t){if(e.length===0)return`${t?"# MCP status \u2014 this project":"# MCP servers \u2014 this project"}
1620
1620
 
@@ -1657,8 +1657,8 @@ fi
1657
1657
 
1658
1658
  exit 0
1659
1659
  `;a(RO,"teamClaudeMdBlock");a(xO,"upsertBetweenMarkers")});var jg={};N(jg,{ConfigCommands:()=>_g});function PO(n){let e=n.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(n);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(n)?t:n}var _g,Ig=h(()=>{"use strict";So();Ge();fe();xe();_g=class extends V{static{a(this,"ConfigCommands")}async config(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list";switch(o){case"list":return this.list(r);case"get":return this.get(s[1],r);case"set":return this.set(s[1],s.slice(2).join(" "),r);case"unset":return this.unset(s[1],r);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=zh(),r=Object.keys(t).sort();if(e.md){let s=r.length===0?"_No global config set._":r.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
1660
- `);console.log(P(F("Global config",s),F("Path",`\`${Kh()}\``)))}else if(r.length===0)g.info("No global config set.");else for(let s of r)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 r=it(e);return t.md?console.log(P(F(e,r===void 0?"_(unset)_":`\`${JSON.stringify(r)}\``))):r===void 0?g.info("(unset)"):console.log(JSON.stringify(r)),{success:!0,key:e,value:r}}set(e,t,r){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let s=PO(t);_e(e,s);let o=`${e} = ${JSON.stringify(s)}`;return r.md?console.log(P(F("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"};iu(e);let r=`Removed ${e}`;return t.md?console.log(P(F("Unset",r))):g.done(r),{success:!0,key:e}}};a(PO,"parseValue")});var $g={};N($g,{EmbeddingsCommands:()=>Dg});function AO(n){if(/\b401\b|invalid_api_key|incorrect api key|unauthor/i.test(n))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(n))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(n))return"Could not reach the endpoint. Check the base URL and your network: prjct embeddings status"}function Cr(n,e){let t=n.indexOf(`--${e}`);if(t>=0&&n[t+1])return n[t+1];let r=n.find(s=>s.startsWith(`--${e}=`));return r?r.slice(e.length+3):void 0}function _O(n){if(!n?.trim())return;let e={};for(let t of n.split(",")){let r=t.indexOf("=");if(r<=0)continue;let s=t.slice(0,r).trim(),o=t.slice(r+1).trim();s&&(e[s]=o)}return Object.keys(e).length?e:void 0}var Dg,Mg=h(()=>{"use strict";pl();ll();W();we();Ge();fe();xe();a(AO,"embeddingsFailureHint");a(Cr,"flag");a(_O,"parseHeaderPairs");Dg=class extends V{static{a(this,"EmbeddingsCommands")}async embeddings(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"status";switch(o){case"set":return this.set(s.slice(1),r);case"status":return this.status(r);case"test":return this.test(r);case"clear":return this.clear(r);default:return D(`Unknown subcommand '${o}'. Use: set --key <K> [--model <M>] [--base-url <U>] | status | test | clear`,r)}}async set(e,t){let r=t.key??Cr(e,"key"),s=t.model??Cr(e,"model"),o=t.baseUrl??Cr(e,"base-url")??Cr(e,"baseUrl"),i;if(!o&&r){let y=rf(r);y&&(o=y.baseUrl,i=y.provider)}let c=t.authHeader??Cr(e,"auth-header"),l=t.authScheme??Cr(e,"auth-scheme"),u=l===void 0?void 0:/^none$/i.test(l)?"":l,d=_O(t.headers??Cr(e,"headers")),p=t.query??Cr(e,"query");if(!r&&!s&&!o&&c===void 0&&u===void 0&&!d&&p===void 0)return D('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(r)try{m=await KT(r)}catch(y){return D(`Could not store the key securely: ${w(y)}`)}let f=uf({model:s,baseUrl:o,authHeader:c,authScheme:u,extraHeaders:d,query:p});return t.md?(console.log(P(F("Embeddings configured","Global embeddings now apply to all projects."),Ft({provider:f.provider,model:f.model,"base URL":f.baseUrl,detected:i,"auth header":f.authHeader,auth:f.authScheme===void 0?void 0:f.authScheme||"(raw key, no scheme)",query:f.query,headers:f.extraHeaders?Object.keys(f.extraHeaders).join(", "):void 0,"api key":m?`stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`:void 0}),F("Next","Run `prjct embeddings test --md` to validate now."))),{success:!0}):(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=ts(),r=await zT();return t?e.md?(console.log(P(F("Embeddings","Global embeddings are configured."),Ft({provider:t.provider,model:t.model,"base URL":t.baseUrl,"auth header":t.authHeader,auth:t.authScheme===void 0?void 0:t.authScheme||"(raw key, no scheme)",query:t.query,headers:t.extraHeaders?Object.keys(t.extraHeaders).join(", "):void 0,"api key":r==="none"?"MISSING - set with `prjct embeddings set --key <api-key>`":`present (${r})`}))),{success:!0,configured:!0}):(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: ${r==="none"?"MISSING \u2014 set with `prjct embeddings set --key <api-key>`":`present (${r})`}`),{success:!0,configured:!0}):e.md?(console.log(P(F("Embeddings","Global embeddings are not configured. Recall uses the built-in local subword embedder."),Ft({"api key":r==="none"?"none":`present (${r})`}),F("Next","Set one with `prjct embeddings set --key <api-key> --md`."))),{success:!0,configured:!1}):(g.info("Global embeddings: not configured \u2014 using the built-in local subword embedder."),g.info(`api key: ${r==="none"?"none":`present (${r})`}`),g.info("Set one with: prjct embeddings set --key <api-key>"),{success:!0,configured:!1})}async test(e){let t=dl(null);try{let[r]=await t.embed(["prjct embeddings connectivity probe"]);return!r||r.length===0?D(`Provider '${t.model}' returned an empty vector.`,e):e.md?(console.log(P(F("Embeddings test",`Provider '${t.model}' returned a ${r.length}-dim vector.`),t.isLocal?F("Next","This is the local embedder. Set a key to upgrade: `prjct embeddings set --key <api-key> --md`."):null)),{success:!0,model:t.model,dims:r.length}):(g.done(`OK \u2014 '${t.model}' returned a ${r.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:r.length})}catch(r){let s=w(r);Yt(`Embedding test failed for '${t.model}'.`,e),vd(s,e);let o=AO(s);return o&&vd(o,e),{success:!1,error:s}}}async clear(e){return await YT(),df(),e.md?(console.log(P(F("Embeddings cleared","Semantic recall now falls back to the local embedder."),Ft({"default model":di}))),{success:!0}):(g.done("Cleared global embeddings \u2014 semantic recall falls back to the local embedder."),g.info(`(Default model when you reconfigure: ${di}.)`),{success:!0})}}});var Og={};N(Og,{GuardCommands:()=>Ng});var Ng,Lg=h(()=>{"use strict";ht();ke();hi();fe();xe();Jt();Ng=class extends V{static{a(this,"GuardCommands")}async guard(e=null,t=process.cwd(),r={}){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 r.md?console.log(`> ${u}`):g.fail(u),{success:!1,error:"Missing file argument"}}let o=await ae(t,r);if(!o.ok)return o.result;let i=typeof r.limit=="number"&&r.limit>0?r.limit:3,c;try{c=M.recallForFile(o.value,s,i)}catch{c=[]}ns(o.value,t,c.map(u=>u.id));let l=s.split("/").pop()??s;if(c.length===0){let u=`No preventive memory recorded against \`${l}\` \u2014 clear to edit.`;return r.md?console.log(`> ${u}`):g.done(`No preventive memory for ${l} \u2014 clear to edit.`),{success:!0,file:s,hits:0}}if(r.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 c)u.push(`- **[${fr(d)}] ${Te(d)}** \u2014 ${Nn(d.content)} \`${d.id}\``);u.push("","> Surfaced as prevention. Apply if relevant; ignore if not."),console.log(u.join(`
1661
- `))}else{g.info(`\u26A0 ${c.length} preventive memory entr${c.length===1?"y":"ies"} for ${l}:`);for(let u of c)g.info(` \u2022 [${fr(u)}] ${Te(u)} \u2014 ${Nn(u.content,120)} (${u.id})`)}return{success:!0,file:s,hits:c.length}}}});var tR={};N(tR,{buildInventory:()=>$O,renderInventoryMd:()=>HO});import QC from"node:fs/promises";import ro from"node:path";async function $O(n,e){let t=Ce.list(e,{includeArchived:!0}),r={};for(let d of t)r[d.status]=(r[d.status]??0)+1;let s=new Map,o=new Set;for(let d of t){let p=MO(d);if(!p)continue;o.add(p);let m=s.get(p)??[];m.push(d),s.set(p,m)}let i=await NO(n);for(let d of i)o.add(d);let c=[],l=[];for(let d of[...o].sort()){let p=s.get(d)??[],m=await OO(n,d),f=await LO(n,d,p),y=p.length>0?p.reduce((k,S)=>S.updatedAt>k?S.updatedAt:k,""):null,R=!1;for(let k of p.filter(S=>S.status==="shipped")){let S=await FO(n,k);l.push({specId:k.id,title:k.title,status:k.status,drift:S.drift,locChanged:S.locChanged,cosmeticOnly:S.cosmeticOnly}),S.drift===!0?R=!0:S.drift==="unknown"&&R===!1&&(R="unknown")}c.push({module:d,specCount:p.length,coveredFiles:f,totalFiles:m,coveredPct:m===0?null:Math.round(f/m*1e4)/100,lastUpdated:y||null,drift:R})}let u=c.filter(d=>d.specCount===0).map(d=>d.module);return{generatedAt:new Date().toISOString(),projectPath:n,totalSpecs:t.length,byStatus:r,modules:c,driftDetail:l,uncoveredModules:u}}function MO(n){let e=n.content.scope[0];if(!e)return null;let t=e.match(/([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+)/);if(!t)return null;let r=t[1].split("/").slice(0,2);return r.length===2?r.join("/"):null}async function NO(n){let e=ro.join(n,"core");try{return(await QC.readdir(e,{withFileTypes:!0})).filter(r=>r.isDirectory()&&!r.name.startsWith(".")&&!r.name.startsWith("__")).map(r=>`core/${r.name}`)}catch{return[]}}async function OO(n,e){let t=ro.join(n,e),r=0;try{await Fg(t,async s=>{let o=ro.relative(n,s);ZC(o)||eR(o)&&r++})}catch{}return r}async function LO(n,e,t){let r=ro.join(n,e),s=new Set;for(let i of t)for(let c of i.content.scope){let l=c.match(/[a-zA-Z0-9_./-]+\.[a-z]+/);l&&s.add(l[0])}let o=0;try{await Fg(r,async i=>{let c=ro.relative(n,i);if(!ZC(c)&&eR(c)){for(let l of s)if(c===l||c.startsWith(l.endsWith("/")?l:`${l}/`)){o++;break}}})}catch{}return o}async function Fg(n,e){let t;try{t=await QC.readdir(n,{withFileTypes:!0})}catch{return}for(let r of t){if(r.name.startsWith(".")||r.name==="node_modules"||r.name==="dist")continue;let s=ro.join(n,r.name);r.isDirectory()?await Fg(s,e):r.isFile()&&await e(s)}}function ZC(n){return DO.some(e=>e.test(n))}function eR(n){return/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(n)}async function FO(n,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 r=0;try{let{stdout:o}=await G("git",["diff","--shortstat",`${e.shippedSha}..HEAD`,"--",...t],{cwd:n}),i=o.match(/(\d+) insertions?/),c=o.match(/(\d+) deletions?/);r=(i?Number.parseInt(i[1],10):0)+(c?Number.parseInt(c[1],10):0)}catch{return{drift:"unknown"}}if(r<=jO)return{drift:!1,locChanged:r,cosmeticOnly:!1};let s=!0;try{let{stdout:o}=await G("git",["log","--format=%s",`${e.shippedSha}..HEAD`,"--",...t],{cwd:n}),i=o.split(`
1660
+ `);console.log(P(F("Global config",s),F("Path",`\`${Kh()}\``)))}else if(r.length===0)g.info("No global config set.");else for(let s of r)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 r=it(e);return t.md?console.log(P(F(e,r===void 0?"_(unset)_":`\`${JSON.stringify(r)}\``))):r===void 0?g.info("(unset)"):console.log(JSON.stringify(r)),{success:!0,key:e,value:r}}set(e,t,r){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let s=PO(t);_e(e,s);let o=`${e} = ${JSON.stringify(s)}`;return r.md?console.log(P(F("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"};iu(e);let r=`Removed ${e}`;return t.md?console.log(P(F("Unset",r))):g.done(r),{success:!0,key:e}}};a(PO,"parseValue")});var $g={};N($g,{EmbeddingsCommands:()=>Dg});function AO(n){if(/\b401\b|invalid_api_key|incorrect api key|unauthor/i.test(n))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(n))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(n))return"Could not reach the endpoint. Check the base URL and your network: prjct embeddings status"}function Cr(n,e){let t=n.indexOf(`--${e}`);if(t>=0&&n[t+1])return n[t+1];let r=n.find(s=>s.startsWith(`--${e}=`));return r?r.slice(e.length+3):void 0}function _O(n){if(!n?.trim())return;let e={};for(let t of n.split(",")){let r=t.indexOf("=");if(r<=0)continue;let s=t.slice(0,r).trim(),o=t.slice(r+1).trim();s&&(e[s]=o)}return Object.keys(e).length?e:void 0}var Dg,Mg=h(()=>{"use strict";pl();ll();W();we();Ge();fe();xe();a(AO,"embeddingsFailureHint");a(Cr,"flag");a(_O,"parseHeaderPairs");Dg=class extends V{static{a(this,"EmbeddingsCommands")}async embeddings(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"status";switch(o){case"set":return this.set(s.slice(1),r);case"status":return this.status(r);case"test":return this.test(r);case"clear":return this.clear(r);default:return D(`Unknown subcommand '${o}'. Use: set --key <K> [--model <M>] [--base-url <U>] | status | test | clear`,r)}}async set(e,t){let r=t.key??Cr(e,"key"),s=t.model??Cr(e,"model"),o=t.baseUrl??Cr(e,"base-url")??Cr(e,"baseUrl"),i;if(!o&&r){let y=rf(r);y&&(o=y.baseUrl,i=y.provider)}let c=t.authHeader??Cr(e,"auth-header"),l=t.authScheme??Cr(e,"auth-scheme"),u=l===void 0?void 0:/^none$/i.test(l)?"":l,d=_O(t.headers??Cr(e,"headers")),p=t.query??Cr(e,"query");if(!r&&!s&&!o&&c===void 0&&u===void 0&&!d&&p===void 0)return D('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(r)try{m=await KT(r)}catch(y){return D(`Could not store the key securely: ${w(y)}`)}let f=uf({model:s,baseUrl:o,authHeader:c,authScheme:u,extraHeaders:d,query:p});return t.md?(console.log(P(F("Embeddings configured","Global embeddings now apply to all projects."),Ft({provider:f.provider,model:f.model,"base URL":f.baseUrl,detected:i,"auth header":f.authHeader,auth:f.authScheme===void 0?void 0:f.authScheme||"(raw key, no scheme)",query:f.query,headers:f.extraHeaders?Object.keys(f.extraHeaders).join(", "):void 0,"api key":m?`stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`:void 0}),F("Next","Run `prjct embeddings test --md` to validate now."))),{success:!0}):(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=ts(),r=await zT();return t?e.md?(console.log(P(F("Embeddings","Global embeddings are configured."),Ft({provider:t.provider,model:t.model,"base URL":t.baseUrl,"auth header":t.authHeader,auth:t.authScheme===void 0?void 0:t.authScheme||"(raw key, no scheme)",query:t.query,headers:t.extraHeaders?Object.keys(t.extraHeaders).join(", "):void 0,"api key":r==="none"?"MISSING - set with `prjct embeddings set --key <api-key>`":`present (${r})`}))),{success:!0,configured:!0}):(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: ${r==="none"?"MISSING \u2014 set with `prjct embeddings set --key <api-key>`":`present (${r})`}`),{success:!0,configured:!0}):e.md?(console.log(P(F("Embeddings","Global embeddings are not configured. Recall uses the built-in local subword embedder."),Ft({"api key":r==="none"?"none":`present (${r})`}),F("Next","Set one with `prjct embeddings set --key <api-key> --md`."))),{success:!0,configured:!1}):(g.info("Global embeddings: not configured \u2014 using the built-in local subword embedder."),g.info(`api key: ${r==="none"?"none":`present (${r})`}`),g.info("Set one with: prjct embeddings set --key <api-key>"),{success:!0,configured:!1})}async test(e){let t=dl(null);try{let[r]=await t.embed(["prjct embeddings connectivity probe"]);return!r||r.length===0?D(`Provider '${t.model}' returned an empty vector.`,e):e.md?(console.log(P(F("Embeddings test",`Provider '${t.model}' returned a ${r.length}-dim vector.`),t.isLocal?F("Next","This is the local embedder. Set a key to upgrade: `prjct embeddings set --key <api-key> --md`."):null)),{success:!0,model:t.model,dims:r.length}):(g.done(`OK \u2014 '${t.model}' returned a ${r.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:r.length})}catch(r){let s=w(r);Yt(`Embedding test failed for '${t.model}'.`,e),vd(s,e);let o=AO(s);return o&&vd(o,e),{success:!1,error:s}}}async clear(e){return await YT(),df(),e.md?(console.log(P(F("Embeddings cleared","Semantic recall now falls back to the local embedder."),Ft({"default model":di}))),{success:!0}):(g.done("Cleared global embeddings \u2014 semantic recall falls back to the local embedder."),g.info(`(Default model when you reconfigure: ${di}.)`),{success:!0})}}});var Og={};N(Og,{GuardCommands:()=>Ng});var Ng,Lg=h(()=>{"use strict";ht();ke();hi();fe();xe();Jt();Ng=class extends V{static{a(this,"GuardCommands")}async guard(e=null,t=process.cwd(),r={}){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 r.md?console.log(`> ${u}`):g.fail(u),{success:!1,error:"Missing file argument"}}let o=await ae(t,r);if(!o.ok)return o.result;let i=typeof r.limit=="number"&&r.limit>0?r.limit:3,c;try{c=M.recallForFile(o.value,s,i)}catch{c=[]}ns(o.value,t,c.map(u=>u.id));let l=s.split("/").pop()??s;if(c.length===0){let u=`No preventive memory recorded against \`${l}\` \u2014 clear to edit.`;return r.md?console.log(`> ${u}`):g.done(`No preventive memory for ${l} \u2014 clear to edit.`),{success:!0,file:s,hits:0}}if(r.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 c)u.push(`- **[${gr(d)}] ${Te(d)}** \u2014 ${Nn(d.content)} \`${d.id}\``);u.push("","> Surfaced as prevention. Apply if relevant; ignore if not."),console.log(u.join(`
1661
+ `))}else{g.info(`\u26A0 ${c.length} preventive memory entr${c.length===1?"y":"ies"} for ${l}:`);for(let u of c)g.info(` \u2022 [${gr(u)}] ${Te(u)} \u2014 ${Nn(u.content,120)} (${u.id})`)}return{success:!0,file:s,hits:c.length}}}});var tR={};N(tR,{buildInventory:()=>$O,renderInventoryMd:()=>HO});import QC from"node:fs/promises";import ro from"node:path";async function $O(n,e){let t=Ce.list(e,{includeArchived:!0}),r={};for(let d of t)r[d.status]=(r[d.status]??0)+1;let s=new Map,o=new Set;for(let d of t){let p=MO(d);if(!p)continue;o.add(p);let m=s.get(p)??[];m.push(d),s.set(p,m)}let i=await NO(n);for(let d of i)o.add(d);let c=[],l=[];for(let d of[...o].sort()){let p=s.get(d)??[],m=await OO(n,d),f=await LO(n,d,p),y=p.length>0?p.reduce((k,S)=>S.updatedAt>k?S.updatedAt:k,""):null,R=!1;for(let k of p.filter(S=>S.status==="shipped")){let S=await FO(n,k);l.push({specId:k.id,title:k.title,status:k.status,drift:S.drift,locChanged:S.locChanged,cosmeticOnly:S.cosmeticOnly}),S.drift===!0?R=!0:S.drift==="unknown"&&R===!1&&(R="unknown")}c.push({module:d,specCount:p.length,coveredFiles:f,totalFiles:m,coveredPct:m===0?null:Math.round(f/m*1e4)/100,lastUpdated:y||null,drift:R})}let u=c.filter(d=>d.specCount===0).map(d=>d.module);return{generatedAt:new Date().toISOString(),projectPath:n,totalSpecs:t.length,byStatus:r,modules:c,driftDetail:l,uncoveredModules:u}}function MO(n){let e=n.content.scope[0];if(!e)return null;let t=e.match(/([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+)/);if(!t)return null;let r=t[1].split("/").slice(0,2);return r.length===2?r.join("/"):null}async function NO(n){let e=ro.join(n,"core");try{return(await QC.readdir(e,{withFileTypes:!0})).filter(r=>r.isDirectory()&&!r.name.startsWith(".")&&!r.name.startsWith("__")).map(r=>`core/${r.name}`)}catch{return[]}}async function OO(n,e){let t=ro.join(n,e),r=0;try{await Fg(t,async s=>{let o=ro.relative(n,s);ZC(o)||eR(o)&&r++})}catch{}return r}async function LO(n,e,t){let r=ro.join(n,e),s=new Set;for(let i of t)for(let c of i.content.scope){let l=c.match(/[a-zA-Z0-9_./-]+\.[a-z]+/);l&&s.add(l[0])}let o=0;try{await Fg(r,async i=>{let c=ro.relative(n,i);if(!ZC(c)&&eR(c)){for(let l of s)if(c===l||c.startsWith(l.endsWith("/")?l:`${l}/`)){o++;break}}})}catch{}return o}async function Fg(n,e){let t;try{t=await QC.readdir(n,{withFileTypes:!0})}catch{return}for(let r of t){if(r.name.startsWith(".")||r.name==="node_modules"||r.name==="dist")continue;let s=ro.join(n,r.name);r.isDirectory()?await Fg(s,e):r.isFile()&&await e(s)}}function ZC(n){return DO.some(e=>e.test(n))}function eR(n){return/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(n)}async function FO(n,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 r=0;try{let{stdout:o}=await G("git",["diff","--shortstat",`${e.shippedSha}..HEAD`,"--",...t],{cwd:n}),i=o.match(/(\d+) insertions?/),c=o.match(/(\d+) deletions?/);r=(i?Number.parseInt(i[1],10):0)+(c?Number.parseInt(c[1],10):0)}catch{return{drift:"unknown"}}if(r<=jO)return{drift:!1,locChanged:r,cosmeticOnly:!1};let s=!0;try{let{stdout:o}=await G("git",["log","--format=%s",`${e.shippedSha}..HEAD`,"--",...t],{cwd:n}),i=o.split(`
1662
1662
  `).filter(Boolean);if(i.length===0)return{drift:!1,locChanged:r,cosmeticOnly:!0};s=i.every(c=>IO.test(c))}catch{s=!1}return{drift:!s,locChanged:r,cosmeticOnly:s}}function HO(n){let e=[];if(e.push("# Spec inventory"),e.push(""),e.push(`_${n.totalSpecs} specs across ${n.modules.length} modules \xB7 generated ${n.generatedAt}_`),e.push(""),Object.keys(n.byStatus).length>0){e.push("## By status");for(let[t,r]of Object.entries(n.byStatus))e.push(`- ${t}: ${r}`);e.push("")}e.push("## Coverage by module"),e.push(""),e.push("| Module | Specs | Files | Covered | % | Drift | Last updated |"),e.push("|---|---|---|---|---|---|---|");for(let t of n.modules){let r=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} | ${r} | ${s} | ${o} |`)}if(n.uncoveredModules.length>0){e.push(""),e.push("## Modules with NO specs");for(let t of n.uncoveredModules)e.push(`- \`${t}\``)}return e.join(`
1663
1663
  `)}var jO,IO,DO,nR=h(()=>{"use strict";Js();ue();jO=5,IO=/^(chore|style|format|fmt|docs|typo)(\(|:|!)/i,DO=[/(^|\/)types\.ts$/,/(^|\/)types\//,/\/__tests__\//,/\.d\.ts$/,/(^|\/)index\.ts$/,/\.test\.ts$/,/\.spec\.ts$/];a($O,"buildInventory");a(MO,"inferModule");a(NO,"listTopLevelModules");a(OO,"countModuleFiles");a(LO,"countCoveredFiles");a(Fg,"walk");a(ZC,"excluded");a(eR,"isCodeFile");a(FO,"driftForSpec");a(HO,"renderInventoryMd")});var Ug={};N(Ug,{SpecCommands:()=>Hg,renderAuditDispatch:()=>Rm});function UO(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}function GO(n){let e=n.content,t=[`# ${n.title}`,"",`**id:** \`${n.id}\` \xB7 **status:** ${n.status} \xB7 **created:** ${n.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 r of e.acceptance_criteria)t.push(`- [ ] ${r}`)}if(e.scope.length>0){t.push("","## Scope");for(let r of e.scope)t.push(`- ${r}`)}if(e.out_of_scope.length>0){t.push("","## Out of scope");for(let r of e.out_of_scope)t.push(`- ${r}`)}if(e.risks.length>0){t.push("","## Risks");for(let r of e.risks)t.push(`- **${r.risk}** \u2014 ${r.mitigation}`)}if(e.test_plan.length>0){t.push("","## Test plan");for(let r of e.test_plan)t.push(`- ${r}`)}if(e.reviews&&Object.keys(e.reviews).length>0){t.push("","## Reviews");for(let[r,s]of Object.entries(e.reviews))t.push(`- **${r}:** ${s.verdict} \u2014 ${s.notes} _(${s.ts})_`)}return e.linked_tasks.length>0&&t.push("","## Linked tasks",...e.linked_tasks.map(r=>`- ${r}`)),e.notes&&t.push("","## Notes",e.notes),t.join(`
1664
1664
  `)}var Hg,Gg=h(()=>{"use strict";K();xm();zs();W();qc();we();fe();xe();Hg=class extends V{static{a(this,"SpecCommands")}async draft(e=null,t=process.cwd(),r={}){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=r.goal?.trim()||e.trim(),i=UO(r.tags),c=await Ct.create(t,{title:e.trim(),content:{goal:o},tags:i,autoContext:!r.skipContext});return r.md?console.log(`\u2713 spec drafted: ${c.title}
@@ -1679,10 +1679,10 @@ scope:`);for(let i of o.content.scope)console.log(` - ${i}`)}if(o.content.out_o
1679
1679
  out of scope:`);for(let i of o.content.out_of_scope)console.log(` - ${i}`)}if(o.content.risks.length>0){console.log(`
1680
1680
  risks:`);for(let i of o.content.risks)console.log(` - ${i.risk} \u2192 ${i.mitigation}`)}if(o.content.test_plan.length>0){console.log(`
1681
1681
  test plan:`);for(let i of o.content.test_plan)console.log(` - ${i}`)}}return{success:!0,spec:o}}catch(s){return D(w(s))}}async update(e=null,t=process.cwd(),r={}){try{if(!e)return L(`Usage: prjct spec update <id> --json '{"goal": "...", ...}'`);let s=typeof r.json=="string"?r.json:"";if(!s)return L("--json is required");let o=await this.ensureProjectInit(t);if(!o.success)return o;let i;try{i=JSON.parse(s)}catch{return L("--json is not valid JSON")}if(i===null||typeof i!="object"||Array.isArray(i))return L("--json must decode to an object");let c=await Ct.get(t,e);if(!c)return L(`spec not found: ${e}`);let l=Wn.parse({...c.content,...i}),u=await Ct.update(t,e,l);return u?(r.md?console.log(`\u2713 spec updated: ${u.title}`):g.done(`spec updated: ${u.title}`),{success:!0,specId:u.id}):L(`spec not found: ${e}`)}catch(s){return D(w(s))}}async setStatus(e=null,t=process.cwd(),r={}){try{if(!e)return L("Usage: prjct spec set-status <id> <status>");let s=r.status;if(!s||!Gn.includes(s))return L(`status must be one of: ${Gn.join(", ")}`);let o=await this.ensureProjectInit(t);return o.success?await Ct.setStatus(t,e,s)?(r.md?console.log(`\u2713 spec ${e} \u2192 ${s}`):g.done(`spec status: ${s}`),{success:!0,specId:e,status:s}):L(`spec not found: ${e}`):o}catch(s){return D(w(s))}}async recordReview(e=null,t=process.cwd(),r={}){try{if(!e)return L('Usage: prjct spec record-review <id> --reviewer <lens> --verdict <pass|fail> --notes "..."');let s=r.reviewer?.trim().toLowerCase(),o=r.verdict;if(!s)return L("--reviewer is required (the lens name, e.g. architecture, security)");if(o!=="pass"&&o!=="fail")return L("--verdict must be `pass` or `fail`");let i=await this.ensureProjectInit(t);if(!i.success)return i;let c=await Ct.recordReview(t,e,s,{verdict:o,notes:r.notes??""});if(!c)return L(`spec not found: ${e}`);let l=c.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}${c.status==="reviewed"?" (all selected lenses passed \u2192 status: reviewed)":""}`;return r.md?console.log(`\u2713 ${u}`):g.done(u),{success:!0,specId:e,status:c.status}}catch(s){return D(w(s))}}async linkTask(e=null,t=process.cwd(),r={}){try{if(!e||!r.taskId)return L("Usage: prjct spec link-task <spec-id> --task-id <id>");let s=await this.ensureProjectInit(t);return s.success?await Ct.linkTask(t,e,r.taskId)?(r.md?console.log(`\u2713 linked task ${r.taskId} to spec ${e}`):g.done("linked task \u2192 spec"),{success:!0,specId:e,taskId:r.taskId}):L(`spec not found: ${e}`):s}catch(s){return D(w(s))}}async ship(e=null,t=process.cwd(),r={}){try{if(!e)return L("Usage: prjct spec ship <id> [--pr <number>]");let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=r.pr!==void 0?Number(r.pr):void 0,i=await Ct.ship(t,e,o!==void 0&&Number.isFinite(o)?o:void 0);return i?(r.md?console.log(`\u2713 spec shipped: ${i.title}${o?` (PR #${o})`:""}`):g.done(`spec shipped${o?` (PR #${o})`:""}`),{success:!0,specId:e,status:"shipped"}):L(`spec not found: ${e}`)}catch(s){return D(w(s))}}async audit(e=null,t=process.cwd(),r={}){try{if(!e)return L("Usage: prjct spec audit <id> [--lenses a,b,c]");let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await Ct.get(t,e);if(!o)return L(`spec not found: ${e}`);let i=typeof r.lenses=="string"&&r.lenses.trim()!==""?r.lenses.split(",").map(l=>l.trim().toLowerCase()).filter(Boolean):Cm(o.content);await Ct.setSelectedReviewers(t,e,i);let c=Rm(o.id,o.title,o.content,i);return console.log(c),{success:!0,specId:e,dispatch:"emitted"}}catch(s){return D(w(s))}}async breakdown(e=null,t=process.cwd(),r={}){try{if(!e)return L("Usage: prjct spec breakdown <id> [--force]");let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await Ct.get(t,e);if(!o)return L(`spec not found: ${e}`);let i=new Set(["reviewed","shipped","archived"]);if(!i.has(o.status)&&r.force!==!0)return process.stderr.write(`error: spec status is '${o.status}'; breakdown requires 'reviewed' or later. Re-run with --force if intentional.
1682
- `),process.exitCode=2,{success:!1,error:`spec status '${o.status}' is below the breakdown gate`};let c=r.force===!0&&!i.has(o.status),l=await x.getProjectId(t);if(!l)return D("No prjct project. Run `prjct init` first.");let{breakdownSpecToTasks:u}=await Promise.resolve().then(()=>(Am(),Pm)),d=await u(l,t,o),p=null;if(c){let{projectMemory:f}=await Promise.resolve().then(()=>(ke(),Ya)),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:c,forcedEventMemId:p,taskIds:d.taskIds,recoveredFromPartial:d.recoveredFromPartial===!0,skippedReason:d.skippedReason}}catch(s){return D(w(s))}}async inventory(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let{default:o}=await Promise.resolve().then(()=>(K(),ir)),c=(await o.readConfig(t))?.projectId;if(!c)return L("not a prjct project");let{buildInventory:l,renderInventoryMd:u}=await Promise.resolve().then(()=>(nR(),tR)),d=await l(t,c);if(r.json)console.log(JSON.stringify(d,null,2));else if(r.md)console.log(u(d));else{g.info(`${d.totalSpecs} specs across ${d.modules.length} modules`);for(let p of d.modules){let m=p.coveredPct===null?"n/a":`${p.coveredPct}%`,f=p.drift===!0?" DRIFT":p.drift==="unknown"?" ?":"";console.log(` ${p.module.padEnd(20)} ${String(p.specCount).padStart(3)} specs \xB7 ${m.padStart(6)} covered${f}`)}d.uncoveredModules.length>0&&g.info(`${d.uncoveredModules.length} module(s) without specs`)}return{success:!0,totalSpecs:d.totalSpecs}}catch(s){return D(w(s))}}};a(UO,"parseFlagTags");a(GO,"renderSpecMarkdown")});import{execFileSync as sR}from"node:child_process";import xl from"node:fs/promises";import Ti from"node:path";async function iR(n){let e=0;try{let t=await xl.readdir(n,{withFileTypes:!0});for(let r of t){let s=Ti.join(n,r.name);if(r.isDirectory())e+=await iR(s);else try{let o=await xl.stat(s);e+=o.size}catch{}}}catch{}return e}function Bg(n){if(n===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(n)/Math.log(1024));return`${(n/1024**t).toFixed(1)} ${e[t]}`}async function BO(n){try{return(await xl.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function aR(){let n={homebrew:!1,npm:!1};try{sR("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})&&(n.homebrew=!0,n.homebrewFormula="prjct-cli")}catch{}try{sR("npm",["list","-g","prjct-cli","--depth=0"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).includes("prjct-cli")&&(n.npm=!0)}catch{}return n}async function cR(){let n=[],e=wd(),t=j.getGlobalBasePath(),r=await A(t),s=r?await BO(Ti.join(t,"projects")):0,o=r?await iR(t):0;n.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:r});let i=Ti.join(e.claude.config,"CLAUDE.md");n.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await oR(i)}),n.push({path:e.claude.router,type:"file",description:"Claude router",exists:await A(e.claude.router)});let c=Ti.join(e.claude.config,"prjct-statusline.sh");n.push({path:c,type:"file",description:"Status line script",exists:await A(c)}),n.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await A(e.gemini.router)});let l=Ti.join(e.gemini.config,"GEMINI.md");return await oR(l)&&n.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),n}async function oR(n){if(!await A(n))return!1;try{let e=await xl.readFile(n,"utf-8");return e.includes(Pl)&&e.includes(Ci)}catch{return!1}}var Pl,Ci,qg=h(()=>{"use strict";Dn();Re();ee();Pl="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Ci="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";a(iR,"getDirectorySize");a(Bg,"formatSize");a(BO,"countDirectoryItems");a(aR,"detectInstallation");a(cR,"gatherUninstallItems");a(oR,"hasMarkerSection")});import{execFileSync as lR}from"node:child_process";import qn from"node:fs/promises";import qO from"node:os";import Al from"node:path";import VO from"node:readline";async function uR(n,e){await qn.mkdir(e,{recursive:!0});let t=await qn.readdir(n,{withFileTypes:!0});for(let r of t){let s=Al.join(n,r.name),o=Al.join(e,r.name);r.isDirectory()?await uR(s,o):await qn.copyFile(s,o)}}async function dR(){let n=qO.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Al.join(n,`.prjct-backup-${e}`);try{await qn.mkdir(t,{recursive:!0});let r=j.getGlobalBasePath();return await A(r)&&await uR(r,Al.join(t,".prjct-cli")),t}catch{return null}}async function JO(n){try{let e=await qn.readFile(n,"utf-8");if(!e.includes(Pl)||!e.includes(Ci))return!1;let t=e.indexOf(Pl),r=e.indexOf(Ci)+Ci.length,s=e.substring(0,t)+e.substring(r);return s=s.replace(/\n{3,}/g,`
1682
+ `),process.exitCode=2,{success:!1,error:`spec status '${o.status}' is below the breakdown gate`};let c=r.force===!0&&!i.has(o.status),l=await x.getProjectId(t);if(!l)return D("No prjct project. Run `prjct init` first.");let{breakdownSpecToTasks:u}=await Promise.resolve().then(()=>(Am(),Pm)),d=await u(l,t,o),p=null;if(c){let{projectMemory:f}=await Promise.resolve().then(()=>(ke(),Ya)),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:c,forcedEventMemId:p,taskIds:d.taskIds,recoveredFromPartial:d.recoveredFromPartial===!0,skippedReason:d.skippedReason}}catch(s){return D(w(s))}}async inventory(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let{default:o}=await Promise.resolve().then(()=>(K(),ar)),c=(await o.readConfig(t))?.projectId;if(!c)return L("not a prjct project");let{buildInventory:l,renderInventoryMd:u}=await Promise.resolve().then(()=>(nR(),tR)),d=await l(t,c);if(r.json)console.log(JSON.stringify(d,null,2));else if(r.md)console.log(u(d));else{g.info(`${d.totalSpecs} specs across ${d.modules.length} modules`);for(let p of d.modules){let m=p.coveredPct===null?"n/a":`${p.coveredPct}%`,f=p.drift===!0?" DRIFT":p.drift==="unknown"?" ?":"";console.log(` ${p.module.padEnd(20)} ${String(p.specCount).padStart(3)} specs \xB7 ${m.padStart(6)} covered${f}`)}d.uncoveredModules.length>0&&g.info(`${d.uncoveredModules.length} module(s) without specs`)}return{success:!0,totalSpecs:d.totalSpecs}}catch(s){return D(w(s))}}};a(UO,"parseFlagTags");a(GO,"renderSpecMarkdown")});import{execFileSync as sR}from"node:child_process";import xl from"node:fs/promises";import Ti from"node:path";async function iR(n){let e=0;try{let t=await xl.readdir(n,{withFileTypes:!0});for(let r of t){let s=Ti.join(n,r.name);if(r.isDirectory())e+=await iR(s);else try{let o=await xl.stat(s);e+=o.size}catch{}}}catch{}return e}function Bg(n){if(n===0)return"0 B";let e=["B","KB","MB","GB"],t=Math.floor(Math.log(n)/Math.log(1024));return`${(n/1024**t).toFixed(1)} ${e[t]}`}async function BO(n){try{return(await xl.readdir(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).length}catch{return 0}}function aR(){let n={homebrew:!1,npm:!1};try{sR("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})&&(n.homebrew=!0,n.homebrewFormula="prjct-cli")}catch{}try{sR("npm",["list","-g","prjct-cli","--depth=0"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).includes("prjct-cli")&&(n.npm=!0)}catch{}return n}async function cR(){let n=[],e=wd(),t=j.getGlobalBasePath(),r=await A(t),s=r?await BO(Ti.join(t,"projects")):0,o=r?await iR(t):0;n.push({path:t,type:"directory",description:`All project data${s>0?`, ${s} project${s>1?"s":""}`:""}`,size:o,count:s,exists:r});let i=Ti.join(e.claude.config,"CLAUDE.md");n.push({path:i,type:"section",description:"prjct section in CLAUDE.md",exists:await oR(i)}),n.push({path:e.claude.router,type:"file",description:"Claude router",exists:await A(e.claude.router)});let c=Ti.join(e.claude.config,"prjct-statusline.sh");n.push({path:c,type:"file",description:"Status line script",exists:await A(c)}),n.push({path:e.gemini.router,type:"file",description:"Gemini router",exists:await A(e.gemini.router)});let l=Ti.join(e.gemini.config,"GEMINI.md");return await oR(l)&&n.push({path:l,type:"section",description:"prjct section in GEMINI.md",exists:!0}),n}async function oR(n){if(!await A(n))return!1;try{let e=await xl.readFile(n,"utf-8");return e.includes(Pl)&&e.includes(Ci)}catch{return!1}}var Pl,Ci,qg=h(()=>{"use strict";Dn();Re();ee();Pl="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",Ci="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";a(iR,"getDirectorySize");a(Bg,"formatSize");a(BO,"countDirectoryItems");a(aR,"detectInstallation");a(cR,"gatherUninstallItems");a(oR,"hasMarkerSection")});import{execFileSync as lR}from"node:child_process";import Vn from"node:fs/promises";import qO from"node:os";import Al from"node:path";import VO from"node:readline";async function uR(n,e){await Vn.mkdir(e,{recursive:!0});let t=await Vn.readdir(n,{withFileTypes:!0});for(let r of t){let s=Al.join(n,r.name),o=Al.join(e,r.name);r.isDirectory()?await uR(s,o):await Vn.copyFile(s,o)}}async function dR(){let n=qO.homedir(),e=new Date().toISOString().replace(/[:.]/g,"-").substring(0,19),t=Al.join(n,`.prjct-backup-${e}`);try{await Vn.mkdir(t,{recursive:!0});let r=j.getGlobalBasePath();return await A(r)&&await uR(r,Al.join(t,".prjct-cli")),t}catch{return null}}async function JO(n){try{let e=await Vn.readFile(n,"utf-8");if(!e.includes(Pl)||!e.includes(Ci))return!1;let t=e.indexOf(Pl),r=e.indexOf(Ci)+Ci.length,s=e.substring(0,t)+e.substring(r);return s=s.replace(/\n{3,}/g,`
1683
1683
 
1684
- `).trim(),!s||s.trim().length===0?await qn.unlink(n):await qn.writeFile(n,`${s}
1685
- `,"utf-8"),!0}catch{return!1}}async function pR(n,e,t){let r=[],s=[];for(let o of n)if(o.exists)try{o.type==="section"?await JO(o.path)&&r.push(o.path):o.type==="directory"?(await qn.rm(o.path,{recursive:!0,force:!0}),r.push(o.path)):o.type==="file"&&(await qn.unlink(o.path),r.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}try{await new fn().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||lR("brew",["uninstall",e.homebrewFormula],{stdio:"pipe"}),r.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||lR("npm",["uninstall","-g","prjct-cli"],{stdio:"pipe"}),r.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:r,errors:s}}async function mR(n){let e=VO.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(n,r=>{e.close(),t(r.toLowerCase()==="uninstall")})})}var fR=h(()=>{"use strict";Dn();Re();W();ee();qg();a(uR,"copyDirectory");a(dR,"createBackup");a(JO,"removePrjctSection");a(pR,"performUninstall");a(mR,"promptConfirmation")});var hR={};N(hR,{UninstallCommands:()=>Vg,uninstall:()=>gR});import Ie from"chalk";async function gR(n={},e=process.cwd()){let t=await cR(),r=aR(),s=t.filter(l=>l.exists);if(s.length===0&&!r.homebrew&&!r.npm)return console.log(Ie.yellow(`
1684
+ `).trim(),!s||s.trim().length===0?await Vn.unlink(n):await Vn.writeFile(n,`${s}
1685
+ `,"utf-8"),!0}catch{return!1}}async function pR(n,e,t){let r=[],s=[];for(let o of n)if(o.exists)try{o.type==="section"?await JO(o.path)&&r.push(o.path):o.type==="directory"?(await Vn.rm(o.path,{recursive:!0,force:!0}),r.push(o.path)):o.type==="file"&&(await Vn.unlink(o.path),r.push(o.path))}catch(i){s.push(`${o.path}: ${w(i)}`)}try{await new gn().cleanupLegacyCommands()}catch{}if(!t.keepPackage){if(e.homebrew&&e.homebrewFormula)try{t.dryRun||lR("brew",["uninstall",e.homebrewFormula],{stdio:"pipe"}),r.push("Homebrew: prjct-cli")}catch(o){s.push(`Homebrew: ${w(o)}`)}if(e.npm)try{t.dryRun||lR("npm",["uninstall","-g","prjct-cli"],{stdio:"pipe"}),r.push("npm: prjct-cli")}catch(o){s.push(`npm: ${w(o)}`)}}return{deleted:r,errors:s}}async function mR(n){let e=VO.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{e.question(n,r=>{e.close(),t(r.toLowerCase()==="uninstall")})})}var fR=h(()=>{"use strict";Dn();Re();W();ee();qg();a(uR,"copyDirectory");a(dR,"createBackup");a(JO,"removePrjctSection");a(pR,"performUninstall");a(mR,"promptConfirmation")});var hR={};N(hR,{UninstallCommands:()=>Vg,uninstall:()=>gR});import Ie from"chalk";async function gR(n={},e=process.cwd()){let t=await cR(),r=aR(),s=t.filter(l=>l.exists);if(s.length===0&&!r.homebrew&&!r.npm)return console.log(Ie.yellow(`
1686
1686
  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(Ie.red.bold(" WARNING: This action is DANGEROUS and IRREVERSIBLE")),console.log(""),console.log(Ie.white("The following will be permanently deleted:")),console.log("");for(let l of s){let u=j.getDisplayPath(l.path),d="";l.type==="section"?d=Ie.dim("(section only)"):l.size&&(d=Ie.dim(`(${Bg(l.size)})`)),console.log(` ${Ie.cyan(u.padEnd(35))} ${d}`),console.log(` ${Ie.dim(l.description)}`),console.log("")}if(r.homebrew&&(console.log(` ${Ie.cyan("Homebrew".padEnd(35))} ${Ie.dim("prjct-cli formula")}`),console.log("")),r.npm&&(console.log(` ${Ie.cyan("npm global".padEnd(35))} ${Ie.dim("prjct-cli package")}`),console.log("")),o>0&&(console.log(Ie.dim(` Total size: ${Bg(o)}`)),console.log("")),n.dryRun)return console.log(Ie.yellow("Dry run - no changes made")),{success:!0,message:"Dry run complete",itemsFound:s.length};if(n.backup){console.log(Ie.blue("Creating backup..."));let l=await dR();l?(console.log(Ie.green(`Backup created: ${j.getDisplayPath(l)}`)),console.log("")):console.log(Ie.yellow("Failed to create backup, continuing..."))}if(!n.force&&(console.log(Ie.yellow('Type "uninstall" to confirm:')),!await mR("> ")))return console.log(Ie.yellow(`
1687
1687
  Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ie.blue("Removing prjct..."));let{deleted:i,errors:c}=await pR(t,r,n);if(console.log(""),i.length>0&&console.log(Ie.green(`Removed ${i.length} items`)),c.length>0){console.log(Ie.yellow(`
1688
1688
  ${c.length} errors:`));for(let l of c)console.log(Ie.red(` - ${l}`))}return console.log(""),console.log(Ie.green("prjct has been uninstalled.")),console.log(Ie.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:c.length===0,message:`Removed ${i.length} items`,deleted:i,errors:c.length>0?c:void 0}}var Vg,yR=h(()=>{"use strict";Re();xe();fR();qg();a(gR,"uninstall");Vg=class extends V{static{a(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return gR(e,t)}}});var xR={};N(xR,{LeanCommands:()=>Jg,_internal:()=>ZO});function SR(n){let e=n?.lean?.mode;if(e&&Ri.includes(e))return e;let t=process.env.PRJCT_LEAN_MODE?.toLowerCase();return t&&Ri.includes(t)?t:"off"}async function so(n,e){try{let{stdout:t}=await G("git",e,{cwd:n,maxBuffer:33554432});return t}catch{return null}}async function zO(n){let e="",t=(await so(n,["rev-parse","--abbrev-ref","origin/HEAD"]))?.trim();if(t&&t!=="origin/HEAD")e=t;else for(let s of["main","master"])if(await so(n,["rev-parse","--verify","--quiet",s])!==null){e=s;break}return e&&(await so(n,["merge-base",e,"HEAD"]))?.trim()||null}async function KO(n){let e=await zO(n),t=e??"HEAD",r=await so(n,["diff","--name-status",t])??"",s=await so(n,["diff",t])??"";return{base:e?e.slice(0,7):null,nameStatus:r,diff:s}}async function YO(n){let e=await so(n,["grep","-nI","-e",bR]);return e?e.split(`
@@ -1712,7 +1712,7 @@ ${s.map(l=>`- ${l.content.split(`
1712
1712
  > none logged.`,c=o.length>0?`### \`lean:\` markers in source (${o.length})
1713
1713
  ${o.map(l=>`- \`${l}\``).join(`
1714
1714
  `)}`:"### `lean:` markers in source\n> none found.";console.log(P("## Lean debt",i,c))}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(`
1715
- `)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(r){return D(w(r),t)}}};a(SR,"effectiveMode");a(so,"safeGit");a(zO,"resolveBase");a(KO,"collectReviewDiff");a(YO,"scanLeanMarkers");QO=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,ER=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;a(TR,"emptySmells");a(CR,"scanDiffSmells");a(RR,"leanFlags");a(kR,"formatSmells");ZO={effectiveMode:SR,scanDiffSmells:CR,leanFlags:RR,LEAN_MODES:Ri,MANY_NEW_FILES:vR,OVER_ENGINEERING_RE:ER}});import eL from"node:path";function Xg(){return eL.join(j.getStatePath(),"cloud-linked.json")}async function _l(){let n=await Oe(Xg(),[]);return Array.isArray(n)?n.filter(e=>e?.projectId&&e?.projectPath):[]}async function AR(n,e){let r=(await _l()).filter(s=>s.projectId!==n);r.push({projectId:n,projectPath:e}),await Pt(j.getStatePath()),await Ee(Xg(),r)}async function _R(n){let e=await _l();await Pt(j.getStatePath()),await Ee(Xg(),e.filter(t=>t.projectId!==n))}var zg=h(()=>{"use strict";Re();ee();a(Xg,"registryPath");a(_l,"listLinkedProjects");a(AR,"addLinkedProject");a(_R,"removeLinkedProject")});function jR(){return typeof globalThis.WebSocket=="function"}function tL(n,e,t,r){let s=n.replace(/\/$/,"").replace(/^http/,"ws"),o=new URLSearchParams({key:t,device:r,project:e});return`${s}/ws?${o.toString()}`}function nL(n,e,t){let r=Math.min(t,e*2**n);return Math.round(Math.random()*r)}var jl,IR=h(()=>{"use strict";a(jR,"hasGlobalWebSocket");a(tL,"buildRealtimeUrl");a(nL,"backoffDelay");jl=class{static{a(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=tL(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=r=>{this.handleMessage(r?.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 r=t;if(r.type==="event"&&r.event&&typeof r.event=="object")try{await this.opts.apply(this.opts.projectId,r.event)}catch{}}scheduleReconnect(){if(this.stopped)return;this.closeSocket(),this._state="reconnecting";let e=nL(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 Kg,Il,as,Yg=h(()=>{"use strict";En();zg();IR();ui();Kg=class{static{a(this,"RealtimeManager")}clients=new Map;available(){return process.env.PRJCT_IN_DAEMON==="1"&&jR()}async startAll(){if(!this.available())return;let e=await _l();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:r}=await Promise.resolve().then(()=>(K(),ir)),s=await r.readConfig(t).catch(()=>null);if(!s?.cloud?.enabled||s.cloud.paused)return;let o=await ce.read();if(!o.apiKey)return;let[i,c]=await Promise.all([ce.getApiUrl(),ce.getDeviceId()]),l=new jl({projectId:e,apiUrl:i,apiKey:o.apiKey,deviceId:c,apply:a((u,d)=>cn.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"}},Il=new Kg,as=Il});var DR={};N(DR,{CloudCommands:()=>Qg});import rL from"node:path";var sL,Qg,$R=h(()=>{"use strict";To();K();ha();En();zg();tl();Yg();li();ui();W();we();Ge();fe();xe();sL=["link","unlink","status","sync","pull","pause","resume"],Qg=class extends V{static{a(this,"CloudCommands")}async cloud(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.status(t,r);switch(o){case"link":return this.link(t,r);case"unlink":return this.unlink(t,r);case"sync":return this.runSync(t,r);case"pull":return this.runPull(t,r);case"pause":return this.setPaused(!0,t,r);case"resume":return this.setPaused(!1,t,r);default:return L(`Unknown cloud subcommand "${o}". Use: ${sL.join(", ")}.`,r)}}async readProject(e){let t=await x.readConfig(e).catch(()=>null);return t?.projectId?t:null}async link(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);if(!await ce.hasAuth())return D("Not authenticated. Run `prjct login`, then `prjct cloud link`.",t);let s={enabled:!0,paused:!1,linkedAt:r.cloud?.linkedAt??new Date().toISOString(),include:r.cloud?.include},o=await ga(r.projectId).catch(()=>{}),i=await Ks.linkProject(r.projectId,rL.basename(e),o);if(r.cloud=s,await x.writeConfig(e,r),i.syncStatus==="active"){await AR(r.projectId,e),await as.start(r.projectId,e).catch(()=>{});let c=await cn.sync(r.projectId,{include:r.cloud.include??{}});return this.reportSync("Linked",c,t,{extra:"Project is now linked. It will also sync on `prjct ship` and at session end."})}return this.subscriptionRequired(i.message,t,{title:i.syncStatus==="payment_pending"?"Cloud sync waiting for payment":"Cloud sync waiting for subscription",prefix:`Repo linked to your prjct account. Billing: ${i.billingUrl}`})}async unlink(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);if(!r.cloud?.enabled){let o="Already local-only \u2014 nothing to unlink.";return console.log(t.md?P("## Cloud",`> ${o}`):o),{success:!0,linked:!1}}r.cloud={...r.cloud,enabled:!1,paused:!1},await x.writeConfig(e,r),as.stop(r.projectId),await _R(r.projectId),await Ks.setCloudLifecycle(r.projectId,"unlink").catch(()=>{});let s="Unlinked \u2014 this project is local-only again. Local data was not touched.";return t.md?console.log(P("## Cloud",`> ${s}`)):g.done(s),{success:!0,linked:!1}}async runSync(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;let o=await cn.sync(r.projectId,{include:r.cloud?.include??{}});return this.reportSync("Synced",o,t)}async runPull(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;try{let o=await cn.pull(r.projectId);if(!o.success)return o.code==="PAYMENT_REQUIRED"?this.subscriptionRequired(o.error,t):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(P("## Cloud pull",`> ${i}`)):g.done(i),{success:!0,pulled:o.count??0,applied:o.applied??0}}catch(o){return D(w(o),t)}}async setPaused(e,t,r){let s=await this.readProject(t);if(!s)return D("No prjct project here \u2014 run `prjct init` first.",r);if(!s.cloud?.enabled)return L("Not linked \u2014 nothing to pause/resume. Run `prjct cloud link` first.",r);s.cloud={...s.cloud,paused:e},await x.writeConfig(t,s),e?as.stop(s.projectId):await as.start(s.projectId,t).catch(()=>{}),await Ks.setCloudLifecycle(s.projectId,e?"pause":"resume").catch(()=>{});let o=e?"Cloud sync paused. Resume with `prjct cloud resume`.":"Cloud sync resumed.";return r.md?console.log(P("## Cloud",`> ${o}`)):g.done(o),{success:!0,paused:e}}async status(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=await ce.hasAuth(),o=r.cloud,i=!!o?.enabled,c=!!o?.paused,l=(await jt.getPending(r.projectId)).length,u=await jt.getLastSync(r.projectId),d={...el,...o?.include??{}},p=Object.entries(d).filter(([,y])=>y).map(([y])=>y),m=s?i?c?"linked, paused":"linked, active":"local-only (run `prjct cloud link`)":"not authenticated (run `prjct login`)",f=i?as.available()?as.status(r.projectId):"requires daemon":"n/a";return t.md?console.log(P("## 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(`
1715
+ `)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(r){return D(w(r),t)}}};a(SR,"effectiveMode");a(so,"safeGit");a(zO,"resolveBase");a(KO,"collectReviewDiff");a(YO,"scanLeanMarkers");QO=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,ER=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;a(TR,"emptySmells");a(CR,"scanDiffSmells");a(RR,"leanFlags");a(kR,"formatSmells");ZO={effectiveMode:SR,scanDiffSmells:CR,leanFlags:RR,LEAN_MODES:Ri,MANY_NEW_FILES:vR,OVER_ENGINEERING_RE:ER}});import eL from"node:path";function Xg(){return eL.join(j.getStatePath(),"cloud-linked.json")}async function _l(){let n=await Oe(Xg(),[]);return Array.isArray(n)?n.filter(e=>e?.projectId&&e?.projectPath):[]}async function AR(n,e){let r=(await _l()).filter(s=>s.projectId!==n);r.push({projectId:n,projectPath:e}),await Pt(j.getStatePath()),await Ee(Xg(),r)}async function _R(n){let e=await _l();await Pt(j.getStatePath()),await Ee(Xg(),e.filter(t=>t.projectId!==n))}var zg=h(()=>{"use strict";Re();ee();a(Xg,"registryPath");a(_l,"listLinkedProjects");a(AR,"addLinkedProject");a(_R,"removeLinkedProject")});function jR(){return typeof globalThis.WebSocket=="function"}function tL(n,e,t,r){let s=n.replace(/\/$/,"").replace(/^http/,"ws"),o=new URLSearchParams({key:t,device:r,project:e});return`${s}/ws?${o.toString()}`}function nL(n,e,t){let r=Math.min(t,e*2**n);return Math.round(Math.random()*r)}var jl,IR=h(()=>{"use strict";a(jR,"hasGlobalWebSocket");a(tL,"buildRealtimeUrl");a(nL,"backoffDelay");jl=class{static{a(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=tL(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=r=>{this.handleMessage(r?.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 r=t;if(r.type==="event"&&r.event&&typeof r.event=="object")try{await this.opts.apply(this.opts.projectId,r.event)}catch{}}scheduleReconnect(){if(this.stopped)return;this.closeSocket(),this._state="reconnecting";let e=nL(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 Kg,Il,as,Yg=h(()=>{"use strict";En();zg();IR();ui();Kg=class{static{a(this,"RealtimeManager")}clients=new Map;available(){return process.env.PRJCT_IN_DAEMON==="1"&&jR()}async startAll(){if(!this.available())return;let e=await _l();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:r}=await Promise.resolve().then(()=>(K(),ar)),s=await r.readConfig(t).catch(()=>null);if(!s?.cloud?.enabled||s.cloud.paused)return;let o=await ce.read();if(!o.apiKey)return;let[i,c]=await Promise.all([ce.getApiUrl(),ce.getDeviceId()]),l=new jl({projectId:e,apiUrl:i,apiKey:o.apiKey,deviceId:c,apply:a((u,d)=>ln.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"}},Il=new Kg,as=Il});var DR={};N(DR,{CloudCommands:()=>Qg});import rL from"node:path";var sL,Qg,$R=h(()=>{"use strict";To();K();ha();En();zg();tl();Yg();li();ui();W();we();Ge();fe();xe();sL=["link","unlink","status","sync","pull","pause","resume"],Qg=class extends V{static{a(this,"CloudCommands")}async cloud(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.status(t,r);switch(o){case"link":return this.link(t,r);case"unlink":return this.unlink(t,r);case"sync":return this.runSync(t,r);case"pull":return this.runPull(t,r);case"pause":return this.setPaused(!0,t,r);case"resume":return this.setPaused(!1,t,r);default:return L(`Unknown cloud subcommand "${o}". Use: ${sL.join(", ")}.`,r)}}async readProject(e){let t=await x.readConfig(e).catch(()=>null);return t?.projectId?t:null}async link(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);if(!await ce.hasAuth())return D("Not authenticated. Run `prjct login`, then `prjct cloud link`.",t);let s={enabled:!0,paused:!1,linkedAt:r.cloud?.linkedAt??new Date().toISOString(),include:r.cloud?.include},o=await ga(r.projectId).catch(()=>{}),i=await Ks.linkProject(r.projectId,rL.basename(e),o);if(r.cloud=s,await x.writeConfig(e,r),i.syncStatus==="active"){await AR(r.projectId,e),await as.start(r.projectId,e).catch(()=>{});let c=await ln.sync(r.projectId,{include:r.cloud.include??{}});return this.reportSync("Linked",c,t,{extra:"Project is now linked. It will also sync on `prjct ship` and at session end."})}return this.subscriptionRequired(i.message,t,{title:i.syncStatus==="payment_pending"?"Cloud sync waiting for payment":"Cloud sync waiting for subscription",prefix:`Repo linked to your prjct account. Billing: ${i.billingUrl}`})}async unlink(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);if(!r.cloud?.enabled){let o="Already local-only \u2014 nothing to unlink.";return console.log(t.md?P("## Cloud",`> ${o}`):o),{success:!0,linked:!1}}r.cloud={...r.cloud,enabled:!1,paused:!1},await x.writeConfig(e,r),as.stop(r.projectId),await _R(r.projectId),await Ks.setCloudLifecycle(r.projectId,"unlink").catch(()=>{});let s="Unlinked \u2014 this project is local-only again. Local data was not touched.";return t.md?console.log(P("## Cloud",`> ${s}`)):g.done(s),{success:!0,linked:!1}}async runSync(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;let o=await ln.sync(r.projectId,{include:r.cloud?.include??{}});return this.reportSync("Synced",o,t)}async runPull(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;try{let o=await ln.pull(r.projectId);if(!o.success)return o.code==="PAYMENT_REQUIRED"?this.subscriptionRequired(o.error,t):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(P("## Cloud pull",`> ${i}`)):g.done(i),{success:!0,pulled:o.count??0,applied:o.applied??0}}catch(o){return D(w(o),t)}}async setPaused(e,t,r){let s=await this.readProject(t);if(!s)return D("No prjct project here \u2014 run `prjct init` first.",r);if(!s.cloud?.enabled)return L("Not linked \u2014 nothing to pause/resume. Run `prjct cloud link` first.",r);s.cloud={...s.cloud,paused:e},await x.writeConfig(t,s),e?as.stop(s.projectId):await as.start(s.projectId,t).catch(()=>{}),await Ks.setCloudLifecycle(s.projectId,e?"pause":"resume").catch(()=>{});let o=e?"Cloud sync paused. Resume with `prjct cloud resume`.":"Cloud sync resumed.";return r.md?console.log(P("## Cloud",`> ${o}`)):g.done(o),{success:!0,paused:e}}async status(e,t){let r=await this.readProject(e);if(!r)return D("No prjct project here \u2014 run `prjct init` first.",t);let s=await ce.hasAuth(),o=r.cloud,i=!!o?.enabled,c=!!o?.paused,l=(await jt.getPending(r.projectId)).length,u=await jt.getLastSync(r.projectId),d={...el,...o?.include??{}},p=Object.entries(d).filter(([,y])=>y).map(([y])=>y),m=s?i?c?"linked, paused":"linked, active":"local-only (run `prjct cloud link`)":"not authenticated (run `prjct login`)",f=i?as.available()?as.status(r.projectId):"requires daemon":"n/a";return t.md?console.log(P("## 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(`
1716
1716
  `))):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(`
1717
1717
  `)),{success:!0,linked:i,paused:c,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)}subscriptionRequired(e,t,r){let s=e??"Cloud sync needs an active prjct subscription. Your local data is safe \u2014 only cloud backup is paused.";return t.md?console.log(P(`## ${r?.title??"Subscription required"}`,`> \u{1F4B3} ${r?.prefix?`${r.prefix}
1718
1718
 
@@ -1762,7 +1762,7 @@ ${s}`:s}`)):(g.warn(r?.title??"Cloud backup paused \u2014 subscription required"
1762
1762
  `)}function RL(n){let e=[`# Handoff for ${n.target}`,"","Paste this into the next coding agent, then ask it to run the listed commands before editing.","","```text","You are taking over this project with prjct available.",`Active task: ${n.active?.description??"none"}.`,"First run:","1. prjct status --md","2. prjct value --md","3. prjct memory-doctor --md","4. prjct guardrails --md","Before editing any risky file, run prjct guard <file> --md.","```","","## Detected runtimes",n.detected.length>0?n.detected.map(t=>`- ${t.runtime.displayName}: ${t.supportLevel}`).join(`
1763
1763
  `):"- No runtime-specific signals detected; AGENTS.md remains the baseline.","","## Context to preserve"];return rh(e,n.memories),e.join(`
1764
1764
  `)}function xL(n){return[`Handoff for ${n.target}`,`Active: ${n.active?.description??"none"}`,"Run: prjct status --md; prjct value --md; prjct guardrails --md",`Context entries: ${n.memories.length}`].join(`
1765
- `)}function PL(n){let e=["# Risk Guardrails",""];if(e.push(`Changed files checked: ${n.files.length}`),n.hits.length>0){e.push("","## File-specific warnings");for(let t of n.hits)e.push(`- \`${t.file}\`: **[${fr(t.entry)}] ${Te(t.entry)}** \u2014 ${Nn(t.entry.content)} \`${t.entry.id}\``)}else e.push("","No file-specific preventive memory matched the current changeset."),n.fallback.length>0&&(e.push("","## General project traps"),rh(e,n.fallback));return e.push("","_Advisory only. This command does not block or mutate anything._"),e.join(`
1765
+ `)}function PL(n){let e=["# Risk Guardrails",""];if(e.push(`Changed files checked: ${n.files.length}`),n.hits.length>0){e.push("","## File-specific warnings");for(let t of n.hits)e.push(`- \`${t.file}\`: **[${gr(t.entry)}] ${Te(t.entry)}** \u2014 ${Nn(t.entry.content)} \`${t.entry.id}\``)}else e.push("","No file-specific preventive memory matched the current changeset."),n.fallback.length>0&&(e.push("","## General project traps"),rh(e,n.fallback));return e.push("","_Advisory only. This command does not block or mutate anything._"),e.join(`
1766
1766
  `)}function AL(n){return n.hits.length===0?`Risk guardrails: ${n.files.length} files checked, no file-specific hits.`:`Risk guardrails: ${n.hits.length} warning(s) across ${n.files.length} changed file(s).`}function rh(n,e){if(e.length===0){n.push("- None recorded yet.");return}for(let t of e)n.push(`- **[${t.type}] ${Te(t)}** \u2014 ${Nn(t.content)} \`${t.id}\``)}function HR(n,e,t){if(n.push("",`### ${e}`),t.length===0){n.push("- None.");return}for(let r of t)n.push(`- **${r.type??"unknown"}** ${r.title??r.content.slice(0,80)} \`${r.id}\``)}var lL,uL,nh,WR=h(()=>{"use strict";Mo();ht();ke();Un();J();W();ue();we();xe();Jt();lL=["gotcha","anti-pattern","learning"],uL=/^(current work|wip|todo|misc|n\/a|none|latest|unreleased|changelog)$/i,nh=class extends V{static{a(this,"ProductCommands")}async value(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=await UR(s.value,t);return console.log(r.md?bL(o):vL(o)),{success:!0,...o}}catch(s){return D(w(s),r)}}async memoryDoctor(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=dL(s.value);return console.log(r.md?SL(o):EL(o)),{success:!0,score:o.score,issues:o.issues.length}}catch(s){return D(w(s),r)}}async report(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=yL(e,r.days,7),i=await pL(s.value,t,o);return console.log(r.md?TL(i):CL(i)),{success:!0,days:o,ships:i.ships.length,completed:i.completed.length}}catch(s){return D(w(s),r)}}async handoff(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=(e??"").trim().split(/\s+/).filter(Boolean)[0]??"next agent",i=await mL(s.value,t,o);return console.log(r.md?RL(i):xL(i)),{success:!0,target:o,memories:i.memories.length}}catch(s){return D(w(s),r)}}async guardrails(e=null,t=process.cwd(),r={}){try{let s=await ae(t,r);if(!s.ok)return s.result;let o=await fL(s.value,t);return console.log(r.md?PL(o):AL(o)),{success:!0,files:o.files.length,hits:o.hits.length}}catch(s){return D(w(s),r)}}};a(UR,"buildValueSnapshot");a(dL,"buildMemoryDoctor");a(pL,"buildHumanReport");a(mL,"buildHandoff");a(fL,"buildGuardrails");a(gL,"changedFiles");a(pt,"count");a(xi,"query");a(hL,"valueScore");a(yL,"pickDays");a(wL,"sinceIso");a(kL,"isNoise");a(bL,"formatValueMd");a(vL,"formatValueText");a(SL,"formatMemoryDoctorMd");a(EL,"formatMemoryDoctorText");a(TL,"formatReportMd");a(CL,"formatReportText");a(RL,"formatHandoffMd");a(xL,"formatHandoffText");a(PL,"formatGuardrailsMd");a(AL,"formatGuardrailsText");a(rh,"appendEntries");a(HR,"appendMemoryRows")});import{z as $}from"zod";var BR,_L,sh,qR,VR=h(()=>{"use strict";BR=$.object({severity:$.enum(["info","warning","blocking"]),title:$.string(),recommendation:$.string(),files:$.array($.string()).optional(),command:$.string().optional()}),_L=$.object({id:$.string(),name:$.string(),status:$.enum(["pass","warn","fail"]),score:$.number().min(0).max(100),durationMs:$.number().nonnegative(),metrics:$.record($.union([$.string(),$.number(),$.boolean()])),actionables:$.array(BR)}),sh=$.object({schemaVersion:$.literal(1),runId:$.string(),createdAt:$.string(),runner:$.object({source:$.enum(["local","ci","agent"]),user:$.string().optional(),platform:$.string(),node:$.string(),bun:$.string().optional()}),project:$.object({repo:$.string(),branch:$.string().optional(),commit:$.string().optional(),dirty:$.boolean()}),versions:$.object({current:$.string(),baseline:$.string().optional(),candidate:$.string().optional()}),scenarios:$.array(_L),summary:$.object({score:$.number().min(0).max(100),pass:$.number().nonnegative(),warn:$.number().nonnegative(),fail:$.number().nonnegative(),improvements:$.number().nonnegative(),regressions:$.number().nonnegative(),actionables:$.number().nonnegative()}),artifacts:$.object({jsonPath:$.string().optional(),reportPath:$.string().optional()}).optional()}),qR=$.object({schemaVersion:$.literal(1),comparisonId:$.string(),createdAt:$.string(),baselineRunId:$.string().optional(),candidateRunId:$.string().optional(),baselineVersion:$.string().optional(),candidateVersion:$.string().optional(),summary:$.object({baselineScore:$.number().optional(),candidateScore:$.number().optional(),delta:$.number().optional(),regressions:$.number().nonnegative(),improvements:$.number().nonnegative(),actionables:$.number().nonnegative()}),artifacts:$.object({jsonPath:$.string().optional(),reportPath:$.string().optional()}).optional(),scenarios:$.array($.object({id:$.string(),baselineScore:$.number().optional(),candidateScore:$.number().optional(),delta:$.number().optional(),status:$.enum(["improved","regressed","unchanged","missing-baseline","missing-candidate"]),actionables:$.array(BR)}))})});import zR from"node:crypto";import xt from"node:fs/promises";import Ve from"node:path";async function KR(n,e={}){let t=new Date().toISOString(),r=await Ii(n),o=await $L({projectPath:n,git:r}),i=DL(o),c={schemaVersion:Ml,runId:VL(t),createdAt:t,runner:{source:e.source??XL(),user:await zL(n),platform:`${process.platform}-${process.arch}`,node:process.version,bun:await KL()},project:{repo:r.repo,branch:r.branch,commit:r.commit,dirty:r.dirty},versions:{current:Or(),baseline:e.baseline,candidate:e.candidate??Or()},scenarios:o,summary:i};return HL(c)}async function _i(n){let e=Ve.join(Nl(await Ii(n)),"latest.json");return ah(e)}async function JR(n,e){if(!e)return _i(n);let t=Ve.join(Nl(await Ii(n)),"runs"),r=[];try{r=await xt.readdir(t)}catch{return null}return(await Promise.all(r.filter(o=>o.endsWith(".json")).map(o=>ah(Ve.join(t,o))))).filter(o=>!!o).filter(o=>o.versions.current===e||o.versions.candidate===e).sort((o,i)=>i.createdAt.localeCompare(o.createdAt))[0]??null}async function YR(n,e={}){let t=await JR(n,e.baseline),r=e.candidate?await JR(n,e.candidate):await _i(n),o=[...new Set([...t?.scenarios.map(m=>m.id)??[],...r?.scenarios.map(m=>m.id)??[]])].sort().map(m=>{let f=t?.scenarios.find(E=>E.id===m),y=r?.scenarios.find(E=>E.id===m),R=f&&y?Math.round((y.score-f.score)*10)/10:void 0,k=[],S="unchanged";return f?y?(R??0)<=jL?(S="regressed",k.push({severity:"blocking",title:`${m} regressed by ${Math.abs(R??0)} points`,recommendation:QL(m)})):(R??0)>=IL?(S="improved",k.push({severity:"info",title:`${m} improved by ${R} points`,recommendation:"Keep this scenario in PR checks so the improvement is protected."})):f&&y&&k.push({severity:"info",title:`${m} stayed within the regression threshold`,recommendation:"Keep collecting this scenario so future optimizations have a stable baseline."}):(S="missing-candidate",k.push({severity:"blocking",title:`No candidate result for ${m}`,recommendation:"Run `prjct eval run` for the candidate version before publishing a comparison."})):(S="missing-baseline",k.push({severity:"warning",title:`No baseline result for ${m}`,recommendation:"Run `prjct eval run --candidate <baseline-version>` before comparing releases."})),{id:m,baselineScore:f?.score,candidateScore:y?.score,delta:R,status:S,actionables:k}}),i=o.filter(m=>m.status==="regressed").length,c=o.filter(m=>m.status==="improved").length,l=new Date().toISOString(),u=t?.versions.candidate??t?.versions.current??e.baseline,d=r?.versions.candidate??r?.versions.current??e.candidate,p={schemaVersion:Ml,comparisonId:JL(l,u,d),createdAt:l,baselineRunId:t?.runId,candidateRunId:r?.runId,baselineVersion:u,candidateVersion:d,summary:{baselineScore:t?.summary.score,candidateScore:r?.summary.score,delta:t&&r?Math.round((r.summary.score-t.summary.score)*10)/10:void 0,regressions:i,improvements:c,actionables:o.reduce((m,f)=>m+f.actionables.length,0)},scenarios:o};return UL(n,p)}async function ih(n,e={}){let t=ex(e.target),r=e.file?await GL(e.file):await WL(n),s=await tx(n,e.dryRun===!0),o={schemaVersion:Ml,artifactType:"run",artifactId:r.runId,repo:r.project.repo,createdAt:r.createdAt,run:r,reportMarkdown:ao(r)};return nx(s.projectId,t,e.dryRun===!0,o,{artifactType:"run",artifactId:r.runId,runId:r.runId})}async function QR(n,e,t={}){let r=ex(t.target),s=await tx(n,t.dryRun===!0),o=await Ii(n),i={schemaVersion:Ml,artifactType:"comparison",artifactId:e.comparisonId,repo:o.repo,createdAt:e.createdAt,comparison:e,reportMarkdown:ji(e)};return nx(s.projectId,r,t.dryRun===!0,i,{artifactType:"comparison",artifactId:e.comparisonId,comparisonId:e.comparisonId})}function ao(n){let e=n.scenarios.flatMap(s=>s.actionables.map(o=>({scenario:s.id,actionable:o}))),t=n.scenarios.map(s=>`| \`${s.id}\` | ${s.status} | ${s.score} | ${s.actionables.length} |`).join(`
1767
1767
  `),r=e.length===0?"_No actionables._":e.map(({scenario:s,actionable:o})=>`- **${o.severity}** \`${s}\`: ${o.title}. ${o.recommendation}`).join(`
1768
1768
  `);return`# prjct eval run
@@ -1823,7 +1823,7 @@ ${t.length>0?t.join(`
1823
1823
  `,"utf-8"),await xt.writeFile(s,ao(o),"utf-8"),await xt.writeFile(Ve.join(e,"latest.json"),`${JSON.stringify(o,null,2)}
1824
1824
  `,"utf-8"),o}async function UL(n,e){let t=Nl(await Ii(n)),r=Ve.join(t,"comparisons");await xt.mkdir(r,{recursive:!0});let s=Ve.join(r,`${e.comparisonId}.json`),o=Ve.join(r,`${e.comparisonId}.md`),i={...e,artifacts:{jsonPath:s,reportPath:o}};return qR.parse(i),await xt.writeFile(s,`${JSON.stringify(i,null,2)}
1825
1825
  `,"utf-8"),await xt.writeFile(o,ji(i),"utf-8"),await xt.writeFile(Ve.join(t,"latest-comparison.json"),`${JSON.stringify(i,null,2)}
1826
- `,"utf-8"),i}function Nl(n){let e=n.repo.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown";return Ve.join(ot(),"evals",e)}async function ah(n){try{return sh.parse(JSON.parse(await xt.readFile(n,"utf-8")))}catch{return null}}async function GL(n){let e=await ah(n);if(!e)throw new Error(`Invalid or missing eval run file: ${n}`);return e}async function WL(n){let e=await _i(n);if(!e)throw new Error("No eval run found. Run `prjct eval run` first.");return e}async function Ii(n){let[e,t,r,s]=await Promise.all([Ai(n,["branch","--show-current"]),Ai(n,["rev-parse","HEAD"]),Ai(n,["config","--get","remote.origin.url"]),Ai(n,["status","--porcelain"])]),o=BL(r);return{repo:o??qL(n),ownerRepo:o,branch:e||void 0,commit:t||void 0,dirty:s.trim().length>0}}async function Ai(n,e){try{let{stdout:t}=await G("git",e,{cwd:n});return String(t).trim()}catch{return""}}function BL(n){let t=n.trim().match(/github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?$/);if(t)return`${t[1]}/${t[2]}`}function qL(n){return`local-${zR.createHash("sha256").update(Ve.resolve(n)).digest("hex").slice(0,12)}`}function VL(n){return`eval_${n.replace(/[-:.TZ]/g,"").slice(0,14)}_${zR.randomBytes(4).toString("hex")}`}function JL(n,e,t){let r=n.replace(/[-:.TZ]/g,"").slice(0,14),s=XR(e??"missing-baseline"),o=XR(t??"missing-candidate");return`comparison_${r}_${s}_to_${o}`}function XR(n){return n.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"unknown"}function XL(){return process.env.GITHUB_ACTIONS==="true"||process.env.CI==="true"?"ci":process.env.CODEX_SANDBOX||process.env.CLAUDECODE?"agent":"local"}async function zL(n){let e=await ZR("gh",["api","user","--jq",".login"],n);if(e)return`github:${e}`;let t=await Ai(n,["config","user.email"]);return t?`git:${t}`:void 0}async function KL(){return ZR("bun",["--version"],process.cwd())}async function ZR(n,e,t){try{let{stdout:r}=await G(n,e,{cwd:t});return String(r).trim()||void 0}catch{return}}async function oh(n){try{return await xt.access(n),!0}catch{return!1}}async function YL(n,e){let t=[],r=new Set([".git","node_modules","dist","build","coverage",".prjct","__tests__","__fixtures__","fixtures"]);async function s(o){if(t.length>=e)return;let i=await xt.readdir(o,{withFileTypes:!0}).catch(()=>[]);for(let c of i){if(t.length>=e)break;if(r.has(c.name))continue;let l=Ve.join(o,c.name);c.isDirectory()?await s(l):c.isFile()&&!c.name.includes(".test.")&&!c.name.includes(".spec.")&&/\.(md|mdc|txt|toml|json|ya?ml|sh|ts|tsx|js|jsx)$/.test(c.name)&&t.push(Ve.relative(n,l))}}return a(s,"walk"),await s(n),t}function QL(n){return n.includes("sync")?"Inspect sync incrementality and generated context freshness before shipping.":n.includes("cloud")?"Check cloud auth/link status and benchmark publisher setup.":n.includes("command")?"Audit user-facing command copy and generated templates for stale instructions.":"Open the latest eval report, inspect scenario metrics, and add a focused regression test."}function ex(n){let e=n??"cloud";if(e==="github")throw new Error("GitHub eval publishing was removed. Use `prjct eval publish --target cloud` after `prjct login` and `prjct cloud link`.");if(e!=="cloud")throw new Error(`Unsupported eval publish target: ${e}. Use --target cloud.`);return"cloud"}async function tx(n,e){let t=await x.readConfig(n);if(!t?.projectId)throw new Error("Cloud benchmark publish requires a prjct project. Run `prjct init` first.");if(e)return{projectId:t.projectId};if(!await ce.hasAuth())throw new Error("Cloud benchmark publish requires authentication. Run `prjct login`, then `prjct cloud link`.");if(!t.cloud?.enabled)throw new Error("Cloud benchmark publish requires cloud to be active. Run `prjct cloud link`.");if(t.cloud.paused)throw new Error("Cloud sync is paused. Run `prjct cloud resume` before publishing benchmarks.");return{projectId:t.projectId}}async function nx(n,e,t,r,s){let i=`${await ce.getApiUrl()}/benchmarks/evals`,c={projectId:n,...r},l=Buffer.byteLength(JSON.stringify(c),"utf-8");if(t)return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l};try{let u=await Ks.publishBenchmark(n,r);return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l,remoteId:u.benchmarkId,publishedAt:u.publishedAt??new Date().toISOString(),url:u.url}}catch(u){throw new Error(ZL(u))}}function ZL(n){if(n instanceof Error)return n.message;if(n&&typeof n=="object"&&"message"in n){let e=n;return e.code==="PAYMENT_REQUIRED"?`${e.message} Run \`prjct cloud status\` for account details.`:e.message}return"Cloud benchmark publish failed."}var Ml,jL,IL,rx=h(()=>{"use strict";Qn();K();VR();En();li();ue();Ze();Ml=1,jL=-5,IL=5;a(KR,"runEval");a(_i,"loadLatestEvalRun");a(JR,"loadEvalRunByVersion");a(YR,"compareEvalRuns");a(ih,"publishEvalRun");a(QR,"publishEvalComparison");a(ao,"formatEvalRunMarkdown");a(ji,"formatEvalComparisonMarkdown");a(DL,"summarizeScenarios");a($L,"runScenarios");a(Pi,"scenario");a(ML,"evalAgentSurface");a(NL,"evalProjectSyncReadiness");a(OL,"evalStaleCommandGuidance");a(LL,"evalQualityCommandReadiness");a(FL,"evalCloudBenchmarkReadiness");a(HL,"saveEvalRun");a(UL,"saveEvalComparison");a(Nl,"evalProjectDir");a(ah,"readRunFile");a(GL,"readRequiredRunFile");a(WL,"loadLatestRequired");a(Ii,"detectGit");a(Ai,"git");a(BL,"parseGitHubOwnerRepo");a(qL,"hashedRepo");a(VL,"runId");a(JL,"comparisonId");a(XR,"slugPart");a(XL,"detectSource");a(zL,"detectRunnerUser");a(KL,"detectBunVersion");a(ZR,"execFileMaybe");a(oh,"exists");a(YL,"collectTextFiles");a(QL,"regressionRecommendation");a(ex,"normalizePublishTarget");a(tx,"resolveBenchmarkProject");a(nx,"publishBenchmarkPayload");a(ZL,"cloudPublishErrorMessage")});var sx={};N(sx,{EvalCommands:()=>ch});var ch,ox=h(()=>{"use strict";rx();W();Ge();fe();xe();ch=class extends V{static{a(this,"EvalCommands")}async eval(e=null,t=process.cwd(),r={}){let[s="run"]=(e??"").trim().split(/\s+/).filter(Boolean);try{switch(s){case"run":return this.run(t,r);case"compare":return this.compare(t,r);case"report":return this.report(t,r);case"publish":return this.publish(t,r);default:return this.unknown(s,r)}}catch(o){let i=w(o);return r.md?console.log(P(F("Eval failed",i))):g.fail(i),{success:!1,error:i}}}async run(e,t){let r=await KR(e,t);if(t.publish){let s=await ih(e,{target:t.target,dryRun:t.dryRun,file:r.artifacts?.jsonPath});return t.json?console.log(JSON.stringify({run:r,publish:s},null,2)):t.md?console.log(P(ao(r),F("Published",`Target: \`${s.target}\`
1826
+ `,"utf-8"),i}function Nl(n){let e=n.repo.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown";return Ve.join(ot(),"evals",e)}async function ah(n){try{return sh.parse(JSON.parse(await xt.readFile(n,"utf-8")))}catch{return null}}async function GL(n){let e=await ah(n);if(!e)throw new Error(`Invalid or missing eval run file: ${n}`);return e}async function WL(n){let e=await _i(n);if(!e)throw new Error("No eval run found. Run `prjct eval run` first.");return e}async function Ii(n){let[e,t,r,s]=await Promise.all([Ai(n,["branch","--show-current"]),Ai(n,["rev-parse","HEAD"]),Ai(n,["config","--get","remote.origin.url"]),Ai(n,["status","--porcelain"])]),o=BL(r);return{repo:o??qL(n),ownerRepo:o,branch:e||void 0,commit:t||void 0,dirty:s.trim().length>0}}async function Ai(n,e){try{let{stdout:t}=await G("git",e,{cwd:n});return String(t).trim()}catch{return""}}function BL(n){let t=n.trim().match(/github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?$/);if(t)return`${t[1]}/${t[2]}`}function qL(n){return`local-${zR.createHash("sha256").update(Ve.resolve(n)).digest("hex").slice(0,12)}`}function VL(n){return`eval_${n.replace(/[-:.TZ]/g,"").slice(0,14)}_${zR.randomBytes(4).toString("hex")}`}function JL(n,e,t){let r=n.replace(/[-:.TZ]/g,"").slice(0,14),s=XR(e??"missing-baseline"),o=XR(t??"missing-candidate");return`comparison_${r}_${s}_to_${o}`}function XR(n){return n.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"unknown"}function XL(){return process.env.GITHUB_ACTIONS==="true"||process.env.CI==="true"?"ci":process.env.CODEX_SANDBOX||process.env.CLAUDECODE?"agent":"local"}async function zL(n){let e=await ZR("gh",["api","user","--jq",".login"],n);if(e)return`github:${e}`;let t=await Ai(n,["config","user.email"]);return t?`git:${t}`:void 0}async function KL(){return ZR("bun",["--version"],process.cwd())}async function ZR(n,e,t){try{let{stdout:r}=await G(n,e,{cwd:t});return String(r).trim()||void 0}catch{return}}async function oh(n){try{return await xt.access(n),!0}catch{return!1}}async function YL(n,e){let t=[],r=new Set([".git","node_modules","dist","build","coverage",".prjct","__tests__","__fixtures__","fixtures"]);async function s(o){if(t.length>=e)return;let i=await xt.readdir(o,{withFileTypes:!0}).catch(()=>[]);for(let c of i){if(t.length>=e)break;if(r.has(c.name))continue;let l=Ve.join(o,c.name);c.isDirectory()?await s(l):c.isFile()&&!c.name.includes(".test.")&&!c.name.includes(".spec.")&&/\.(md|mdc|txt|toml|json|ya?ml|sh|ts|tsx|js|jsx)$/.test(c.name)&&t.push(Ve.relative(n,l))}}return a(s,"walk"),await s(n),t}function QL(n){return n.includes("sync")?"Inspect sync incrementality and generated context freshness before shipping.":n.includes("cloud")?"Check cloud auth/link status and benchmark publisher setup.":n.includes("command")?"Audit user-facing command copy and generated templates for stale instructions.":"Open the latest eval report, inspect scenario metrics, and add a focused regression test."}function ex(n){let e=n??"cloud";if(e==="github")throw new Error("GitHub eval publishing was removed. Use `prjct eval publish --target cloud` after `prjct login` and `prjct cloud link`.");if(e!=="cloud")throw new Error(`Unsupported eval publish target: ${e}. Use --target cloud.`);return"cloud"}async function tx(n,e){let t=await x.readConfig(n);if(!t?.projectId)throw new Error("Cloud benchmark publish requires a prjct project. Run `prjct init` first.");if(e)return{projectId:t.projectId};if(!await ce.hasAuth())throw new Error("Cloud benchmark publish requires authentication. Run `prjct login`, then `prjct cloud link`.");if(!t.cloud?.enabled)throw new Error("Cloud benchmark publish requires cloud to be active. Run `prjct cloud link`.");if(t.cloud.paused)throw new Error("Cloud sync is paused. Run `prjct cloud resume` before publishing benchmarks.");return{projectId:t.projectId}}async function nx(n,e,t,r,s){let i=`${await ce.getApiUrl()}/benchmarks/evals`,c={projectId:n,...r},l=Buffer.byteLength(JSON.stringify(c),"utf-8");if(t)return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l};try{let u=await Ks.publishBenchmark(n,r);return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l,remoteId:u.benchmarkId,publishedAt:u.publishedAt??new Date().toISOString(),url:u.url}}catch(u){throw new Error(ZL(u))}}function ZL(n){if(n instanceof Error)return n.message;if(n&&typeof n=="object"&&"message"in n){let e=n;return e.code==="PAYMENT_REQUIRED"?`${e.message} Run \`prjct cloud status\` for account details.`:e.message}return"Cloud benchmark publish failed."}var Ml,jL,IL,rx=h(()=>{"use strict";Zn();K();VR();En();li();ue();Ze();Ml=1,jL=-5,IL=5;a(KR,"runEval");a(_i,"loadLatestEvalRun");a(JR,"loadEvalRunByVersion");a(YR,"compareEvalRuns");a(ih,"publishEvalRun");a(QR,"publishEvalComparison");a(ao,"formatEvalRunMarkdown");a(ji,"formatEvalComparisonMarkdown");a(DL,"summarizeScenarios");a($L,"runScenarios");a(Pi,"scenario");a(ML,"evalAgentSurface");a(NL,"evalProjectSyncReadiness");a(OL,"evalStaleCommandGuidance");a(LL,"evalQualityCommandReadiness");a(FL,"evalCloudBenchmarkReadiness");a(HL,"saveEvalRun");a(UL,"saveEvalComparison");a(Nl,"evalProjectDir");a(ah,"readRunFile");a(GL,"readRequiredRunFile");a(WL,"loadLatestRequired");a(Ii,"detectGit");a(Ai,"git");a(BL,"parseGitHubOwnerRepo");a(qL,"hashedRepo");a(VL,"runId");a(JL,"comparisonId");a(XR,"slugPart");a(XL,"detectSource");a(zL,"detectRunnerUser");a(KL,"detectBunVersion");a(ZR,"execFileMaybe");a(oh,"exists");a(YL,"collectTextFiles");a(QL,"regressionRecommendation");a(ex,"normalizePublishTarget");a(tx,"resolveBenchmarkProject");a(nx,"publishBenchmarkPayload");a(ZL,"cloudPublishErrorMessage")});var sx={};N(sx,{EvalCommands:()=>ch});var ch,ox=h(()=>{"use strict";rx();W();Ge();fe();xe();ch=class extends V{static{a(this,"EvalCommands")}async eval(e=null,t=process.cwd(),r={}){let[s="run"]=(e??"").trim().split(/\s+/).filter(Boolean);try{switch(s){case"run":return this.run(t,r);case"compare":return this.compare(t,r);case"report":return this.report(t,r);case"publish":return this.publish(t,r);default:return this.unknown(s,r)}}catch(o){let i=w(o);return r.md?console.log(P(F("Eval failed",i))):g.fail(i),{success:!1,error:i}}}async run(e,t){let r=await KR(e,t);if(t.publish){let s=await ih(e,{target:t.target,dryRun:t.dryRun,file:r.artifacts?.jsonPath});return t.json?console.log(JSON.stringify({run:r,publish:s},null,2)):t.md?console.log(P(ao(r),F("Published",`Target: \`${s.target}\`
1827
1827
  Project: \`${s.projectId}\`
1828
1828
  URL: ${s.url??"-"}`))):g.done(`eval run ${r.runId} saved and published to ${s.target}`),{success:!0,runId:r.runId,score:r.summary.score,publish:s}}return t.json?console.log(JSON.stringify(r,null,2)):t.md?console.log(P(ao(r))):g.done(`eval run ${r.runId} saved \u2014 score ${r.summary.score}/100`),{success:!0,runId:r.runId,score:r.summary.score}}async compare(e,t){let r=await YR(e,t);if(t.publish){let s=await QR(e,r,{target:t.target,dryRun:t.dryRun});if(t.json)console.log(JSON.stringify({comparison:r,publish:s},null,2));else if(t.md)console.log(P(ji(r),F("Published",`Target: \`${s.target}\`
1829
1829
  Project: \`${s.projectId}\`
@@ -1833,33 +1833,33 @@ Repo: \`${r.repo}\`
1833
1833
  Endpoint: \`${r.endpoint}\`
1834
1834
  Payload: ${r.payloadBytes} bytes
1835
1835
  URL: ${r.url??"-"}`))):g.done(r.dryRun?`eval publish dry run prepared cloud benchmark payload (${r.payloadBytes} bytes)`:`eval benchmark ${r.artifactId} published to cloud`),{success:!0,...r}}unknown(e,t){let r=`Unknown eval subcommand: ${e}. Use run, compare, report, publish.`;return t.md?console.log(P(F("Unknown eval subcommand",r))):g.fail(r),{success:!1,error:r}}}});var mx={};N(mx,{isSyncCurrent:()=>ph,runSelfHeal:()=>mh});import dh from"node:fs";import aF from"node:path";function cF(){try{return dh.readFileSync(px(),"utf-8").trim()}catch{return null}}function lF(n){try{dh.mkdirSync(dx(),{recursive:!0}),dh.writeFileSync(px(),n,"utf-8")}catch{}}function ph(n){return n?cF()===n:!0}async function mh(n){if(n&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(Dn(),ak));await e()}catch{}try{await(await Promise.resolve().then(()=>(mg(),XC))).install()}catch{}lF(n)}}var dx,px,fh=h(()=>{"use strict";Re();dx=a(()=>j.getStatePath(),"stampDir"),px=a(()=>aF.join(dx(),"installed-version"),"stampPath");a(cF,"readStamp");a(lF,"writeStamp");a(ph,"isSyncCurrent");a(mh,"runSelfHeal")});var wx={};N(wx,{_internal:()=>wF,maybeAutoUpdate:()=>gF,runBackgroundCheck:()=>hF});import{execFile as uF,spawn as dF}from"node:child_process";import co from"node:fs";import Di from"node:path";import{promisify as pF}from"node:util";function gF(n){if(!n||process.env.PRJCT_NO_AUTO_UPDATE==="1"||it("auto-update")!=="on")return;let e=it("auto-update-last-check");if(e&&Date.now()-Date.parse(e)<gx)return;_e("auto-update-last-check",new Date().toISOString()),dF(process.execPath,[process.argv[1],"__internal-auto-update",n],{detached:!0,stdio:"ignore"}).unref()}async function hF(n){try{let e=await hx();if(!e)return;if(ko(e,n)<=0){Ol(`current ${n} >= latest ${e}, no-op`);return}let t=yx();Ol(`upgrade available: ${n} \u2192 ${e} (source: ${t})`),await yF(t,e),Ol(`upgrade complete: ${n} \u2192 ${e}`)}catch(e){Ol(`auto-update failed: ${e.message}`)}}async function hx(){try{let n=new AbortController,e=setTimeout(()=>n.abort(),6e3),t=await fetch(fF,{signal:n.signal});if(clearTimeout(e),!t.ok)return null;let r=await t.json();return typeof r.version=="string"?r.version:null}catch{return null}}function yx(){let n=Di.join(ot(),"bin","prjct");if(co.existsSync(n))try{if(co.statSync(n).size>1024*1024)return"binary"}catch{}try{let e=String(rt("node:child_process").execSync("npm root -g")).trim();if(e&&co.existsSync(Di.join(e,"prjct-cli")))return"npm"}catch{}try{let e=String(rt("node:child_process").execSync("bun pm bin -g")).trim();if(e&&co.existsSync(Di.join(e,"prjct")))return"bun"}catch{}return"unknown"}async function yF(n,e){if(n==="binary"){await gh("bash",["-c","curl -sSL 'https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh' | bash"],{timeout:12e4,maxBuffer:4*1024*1024});return}if(n==="bun"){await gh("bun",["install","-g","prjct-cli@latest"],{timeout:12e4});return}if(n==="npm"||n==="unknown"){await gh("npm",["install","-g","prjct-cli@latest"],{timeout:12e4});return}}function Ol(n){try{co.mkdirSync(fx(),{recursive:!0}),co.appendFileSync(mF(),`${new Date().toISOString()} ${n}
1836
- `)}catch{}}var gh,fx,mF,gx,fF,wF,kx=h(()=>{"use strict";Qn();ls();So();gh=pF(uF),fx=a(()=>Di.join(ot(),"state"),"stateDir"),mF=a(()=>Di.join(fx(),"auto-update.log"),"logPath"),gx=3600*1e3,fF="https://registry.npmjs.org/prjct-cli/latest";a(gF,"maybeAutoUpdate");a(hF,"runBackgroundCheck");a(hx,"fetchLatestVersion");a(yx,"detectInstallSource");a(yF,"applyUpgrade");a(Ol,"log");wF={fetchLatestVersion:hx,detectInstallSource:yx,compareSemver:ko,THROTTLE_MS:gx}});import Ut from"node:fs";import{createServer as hU}from"node:net";var Ei=class{static{a(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(Df(),If)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(il(),ol)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(sl(),rl)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(Kc(),zc)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(Hf(),Ff)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(Qf(),Yf)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(eg(),Zf)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(rg(),ng)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(ig(),og)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(hg(),gg)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(kg(),wg)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(Tg(),Eg)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(Ag(),Pg)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(Ig(),jg)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(Mg(),$g)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(Lg(),Og)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(Gg(),Ug)).then(e=>new e.SpecCommands).catch(e=>{throw this._specCmds=void 0,e})}agent;agentInfo;currentAuthor;prjctDir;constructor(){this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),r={}){return(await this.workflowG()).now(e,t,r)}async workflowPrefs(e=null,t=process.cwd(),r={}){return(await this.workflowG()).workflow(e,t,r)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),r={}){return(await this.shippingG()).ship(e,t,{...r})}async analyze(e={},t=process.cwd()){return(await this.analysisG()).analyze(e,t)}async sync(e=process.cwd(),t={}){return(await this.analysisG()).sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),r={}){return(await this.analysisG()).saveLlmAnalysis(e,t,r)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).context(e,t,r)}async search(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).search(e,t,r)}async status(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).status(e,t,r)}async tag(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).tag(e,t,r)}async remember(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).remember(e,t,r)}async forget(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).forget(e,t,r)}async seed(e=null,t=process.cwd(),r={}){return(await this.seedCmdsG()).seed(e,t,r)}async install(e=null,t=process.cwd(),r={}){return(await this.installCmdsG()).install(null,t,r)}async capture(e=null,t=process.cwd(),r={}){return(await this.captureCmdsG()).capture(e,t,r)}async mcp(e=null,t=process.cwd(),r={}){return(await this.mcpCmdsG()).mcp(e,t,r)}async team(e=null,t=process.cwd(),r={}){return(await this.teamCmdsG()).team(e,t,r)}async config(e=null,t=process.cwd(),r={}){return(await this.configCmdsG()).config(e,t,r)}async embeddings(e=null,t=process.cwd(),r={}){return(await this.embeddingsCmdsG()).embeddings(e,t,r)}async guard(e=null,t=process.cwd(),r={}){return(await this.guardCmdsG()).guard(e,t,r)}async auth(e=null,t={}){return(await this.setupCmdsG()).auth(e,t)}async login(e={}){return(await this.setupCmdsG()).login(e)}async logout(){return(await this.setupCmdsG()).logout()}async start(){return(await this.setupCmdsG()).start()}async setup(e={}){return(await this.setupCmdsG()).setup(e)}async update(e={},t=process.cwd()){return(await this.updateCmdsG()).update(e,t)}async installStatusLine(){return(await this.setupCmdsG()).installStatusLine()}async initializeAgent(){return(await this.workflowG()).initializeAgent()}async ensureProjectInit(e){return(await this.workflowG()).ensureProjectInit(e)}async ensureAuthor(){return(await this.workflowG()).ensureAuthor()}async getGlobalProjectPath(e){return(await this.workflowG()).getGlobalProjectPath(e)}async logToMemory(e,t,r){return(await this.workflowG()).logToMemory(e,t,r)}async spec(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).draft(e,t,r)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).show(e,t,r)}async specUpdate(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).update(e,t,r)}async specSetStatus(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).setStatus(e,t,r)}async specRecordReview(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).recordReview(e,t,r)}async specLinkTask(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).linkTask(e,t,r)}async specShip(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).ship(e,t,r)}async specAudit(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).audit(e,t,r)}async specBreakdown(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).breakdown(e,t,r)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}};var rR={core:{title:"Core Workflow",description:"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}},Rl=[{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, auto-classify its harness, 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)","Auto-harness classifies H0-H3 and stores expected evidence on the task","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},description:"Commit, push, and celebrate shipped feature",usage:{claude:'p. ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"p. sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"p. regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"eval",group:"optional",routing:{group:"eval",method:"eval"},optionSchema:{booleans:["publish","dryRun","json"],strings:["baseline","candidate","source","target","file"]},description:"Run product evals, compare versions, and publish actionable results",usage:{claude:"p. eval run [--candidate <version>] [--publish]",terminal:"prjct eval <run|compare|report|publish> [--baseline <version>] [--candidate <version>] [--target cloud] [--dry-run]"},params:"[run|compare|report|publish]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!1,features:["Deterministic local eval runs stored under PRJCT_CLI_HOME/evals","Version comparisons with regression/improvement actionables","Cloud publication for shared benchmark history with server-side ownership and subscription checks"]},{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:"p. forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'p. capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"p. seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"p. mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces, Claude hooks, and Codex config",usage:{claude:"p. install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Repairs detected Codex config.toml with prjct MCP and TUI status_line","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"p. help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"p. analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"p. lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"p. tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"p. sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"p. notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"p. agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"p. value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"p. memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"p. report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"p. handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"p. guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"p. cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},description:"Configure workflow hooks via natural language",usage:{claude:'p. workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",description:"Reconfigure editor installations and user-owned defaults",usage:{claude:"p. setup",terminal:"prjct setup [--vault-root <path>]"},params:"[--force] [--vault-root <path>] [--non-interactive]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{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,routingMode:"bin-only"},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"p. auth [action]",terminal:"prjct auth [action]"},params:"[logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{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:'p. 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 <vault-root>/<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`",{group:"update",method:"update"}],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e,t])=>({name:n,group:"setup",description:e,routing:t,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],WO={"-h":"help","--help":"help","-v":"version","--version":"version"},Mre=new Set([...Rl.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(WO).filter(([,n])=>Rl.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)]);K();Re();W();ie();var Wg=class{static{a(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;optionFns=new Map;lazyResetters=[];metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,r){this.handlerFns.set(e,t),this.setMeta(e,r)}setMeta(e,t){let r=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:r,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,r,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=a(async()=>{if(o)return o;let l=await t(),u=l[r];if(typeof u!="function")throw new Error(`${r} is not a function`);return o={instance:l,method:u},o},"resolve"),c=a(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,c),this.optionFns.set(e,async(l,u,d)=>{let{instance:p,method:m}=await i();return m.call(p,l,u,d)}),this.setMeta(e,s)}resetLazyResolutions(){for(let e of this.lazyResetters)e()}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let r of this.categories.keys())t[r]=e.filter(s=>s.group===r).length;return{total:e.length,implemented:e.filter(r=>r.implemented).length,withTemplates:e.filter(r=>r.hasTemplate).length,claudeOnly:e.filter(r=>r.usage.claude&&!r.usage.terminal).length,terminalOnly:e.filter(r=>!r.usage.claude&&r.usage.terminal).length,both:e.filter(r=>r.usage.claude&&r.usage.terminal).length,requiresInit:e.filter(r=>r.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),r=t.map(c=>c.name),s=r.filter((c,l)=>r.indexOf(c)!==l);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(c=>c.hasTemplate&&!c.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(c=>c.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let c=t.filter(l=>!i.includes(l.group));c.length>0&&e.push(`Invalid categories: ${c.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await x.getProjectId(e);if(!t)throw new Error("No prjct project found. Run p. init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:T()}}async execute(e,t,r=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:r,globalPath:"",timestamp:T()};else try{o=await this.buildContext(r)}catch(l){return{success:!1,error:w(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let c=this.handlerFns.get(e);return c?c(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithOptions(e,t,r,s){let o=this.optionFns.get(e);if(!o)return{success:!1,error:`Command not found: ${e}`};if(this.metadata.get(e)?.requiresProject!==!1)try{await this.buildContext(r)}catch(c){return{success:!1,error:w(c)}}return o(t,r,s)}async executeWithoutProject(e,t,r=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:r,globalPath:"",timestamp:T()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:r,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()}},kt=new Wg;var ix=[];function ax(){for(let n of ix)n()}a(ax,"resetGroupLoaders");function Ae(n){let e;return ix.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}a(Ae,"lazy");var eF={workflow:Ae(async()=>new(await Promise.resolve().then(()=>(Df(),If))).WorkflowCommands),planning:Ae(async()=>new(await Promise.resolve().then(()=>(il(),ol))).PlanningCommands),shipping:Ae(async()=>new(await Promise.resolve().then(()=>(sl(),rl))).ShippingCommands),analysis:Ae(async()=>new(await Promise.resolve().then(()=>(Kc(),zc))).AnalysisCommands),setup:Ae(async()=>new(await Promise.resolve().then(()=>(Hf(),Ff))).SetupCommands),context:Ae(async()=>new(await Promise.resolve().then(()=>(eg(),Zf))).ContextCommands),primitives:Ae(async()=>new(await Promise.resolve().then(()=>(rg(),ng))).PrimitiveCommands),seed:Ae(async()=>new(await Promise.resolve().then(()=>(ig(),og))).SeedCommands),install:Ae(async()=>new(await Promise.resolve().then(()=>(hg(),gg))).InstallCommands),capture:Ae(async()=>new(await Promise.resolve().then(()=>(kg(),wg))).CaptureCommands),mcp:Ae(async()=>new(await Promise.resolve().then(()=>(Tg(),Eg))).McpCommands),team:Ae(async()=>new(await Promise.resolve().then(()=>(Ag(),Pg))).TeamCommands),config:Ae(async()=>new(await Promise.resolve().then(()=>(Ig(),jg))).ConfigCommands),uninstall:Ae(async()=>new(await Promise.resolve().then(()=>(yR(),hR))).UninstallCommands),update:Ae(async()=>new(await Promise.resolve().then(()=>(Qf(),Yf))).UpdateCommands),spec:Ae(async()=>new(await Promise.resolve().then(()=>(Gg(),Ug))).SpecCommands),embeddings:Ae(async()=>new(await Promise.resolve().then(()=>(Mg(),$g))).EmbeddingsCommands),guard:Ae(async()=>new(await Promise.resolve().then(()=>(Lg(),Og))).GuardCommands),lean:Ae(async()=>new(await Promise.resolve().then(()=>(PR(),xR))).LeanCommands),cloud:Ae(async()=>new(await Promise.resolve().then(()=>($R(),DR))).CloudCommands),tdd:Ae(async()=>new(await Promise.resolve().then(()=>(Nm(),Mm))).TddCommands),sdd:Ae(async()=>new(await Promise.resolve().then(()=>(Zc(),Qc))).SddCommands),notify:Ae(async()=>new(await Promise.resolve().then(()=>(OR(),NR))).NotifyCommands),agents:Ae(async()=>new(await Promise.resolve().then(()=>(FR(),LR))).AgentsCommands),product:Ae(async()=>new(await Promise.resolve().then(()=>(WR(),GR))).ProductCommands),eval:Ae(async()=>new(await Promise.resolve().then(()=>(ox(),sx))).EvalCommands)};function tF(){for(let[n,e]of Object.entries(rR))kt.registerCategory(n,e)}a(tF,"registerCategories");function nF(){if(!kt.has("work")){tF();for(let n of Rl)n.routing&&kt.registerLazyMethod(n.name,eF[n.routing.group],n.routing.method,n)}}a(nF,"registerAllCommands");nF();Ja();var rF=new Set(["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse"]);async function cx(){return process.stdin.isTTY?{}:new Promise(n=>{let e=[];process.stdin.on("data",t=>e.push(t)),process.stdin.on("end",()=>{try{let t=Buffer.concat(e).toString("utf-8").trim();if(!t)return n({});n(JSON.parse(t))}catch{n({})}}),process.stdin.on("error",()=>n({})),setTimeout(()=>n({}),200)})}a(cx,"readStdinSafe");function lh(n){process.stdout.write(`${JSON.stringify(n)}
1837
- `)}a(lh,"emit");function sF(){lh({})}a(sF,"emitEmpty");async function lx(n){try{await n()}catch{sF()}}a(lx,"safeRun");var oF=new Set(["this","that","with","from","have","your","please","would","about","there","these","those","what","when","where","which","while","will","been","were","they","them","their","que","como","cuando","donde","porque","para","pero","por","con","sin","los","las","del","una","uno","unos","unas","este","esta","esto","estos","estas","eso","esos","esas","mas","muy","todo","toda","todos","todas","sobre","entre","hasta","desde","hace","hacer","tiene","tienen","debe","deben","puede","pueden","estan","ser","son","algo","ahora","aqui","bien","cada","dale"]);function ux(n,e=8){let t=xs(n.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2")).toLowerCase(),r=new Set,s=[];for(let o of t.split(/[^\p{L}\p{N}]+/u))if(!(o.length<3)&&!oF.has(o)&&!r.has(o)&&(r.add(o),s.push(o),s.length>=e))break;return s}a(ux,"extractKeywords");function iF(n){return n.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD")}a(iF,"stripLoneSurrogates");function Vn(n,e,t=`
1838
- \u2026 [truncated]`){if(n.length<=e)return n;let r=Math.max(0,e-t.length),s=n.charCodeAt(r-1);return s>=55296&&s<=56319&&(r-=1),n.slice(0,Math.max(0,r))+t}a(Vn,"safeTruncate");function uh(n,e){if(!e)return{};let t=iF(e);return rF.has(n)?{hookSpecificOutput:{hookEventName:n,additionalContext:t}}:{systemMessage:t}}a(uh,"buildHookOutput");async function Je(n,e){let t=n.projectPath??process.cwd();if(e){try{let r=e.input,s=n.build?await n.build(r,t):null;e.sink(`${JSON.stringify(uh(n.event,s))}
1836
+ `)}catch{}}var gh,fx,mF,gx,fF,wF,kx=h(()=>{"use strict";Zn();ls();So();gh=pF(uF),fx=a(()=>Di.join(ot(),"state"),"stateDir"),mF=a(()=>Di.join(fx(),"auto-update.log"),"logPath"),gx=3600*1e3,fF="https://registry.npmjs.org/prjct-cli/latest";a(gF,"maybeAutoUpdate");a(hF,"runBackgroundCheck");a(hx,"fetchLatestVersion");a(yx,"detectInstallSource");a(yF,"applyUpgrade");a(Ol,"log");wF={fetchLatestVersion:hx,detectInstallSource:yx,compareSemver:ko,THROTTLE_MS:gx}});import Ut from"node:fs";import{createServer as hU}from"node:net";var Ei=class{static{a(this,"PrjctCommands")}_workflow;workflowG(){return this._workflow??=Promise.resolve().then(()=>(Df(),If)).then(e=>new e.WorkflowCommands).catch(e=>{throw this._workflow=void 0,e})}_planning;planningG(){return this._planning??=Promise.resolve().then(()=>(il(),ol)).then(e=>new e.PlanningCommands).catch(e=>{throw this._planning=void 0,e})}_shipping;shippingG(){return this._shipping??=Promise.resolve().then(()=>(sl(),rl)).then(e=>new e.ShippingCommands).catch(e=>{throw this._shipping=void 0,e})}_analysis;analysisG(){return this._analysis??=Promise.resolve().then(()=>(Kc(),zc)).then(e=>new e.AnalysisCommands).catch(e=>{throw this._analysis=void 0,e})}_setupCmds;setupCmdsG(){return this._setupCmds??=Promise.resolve().then(()=>(Hf(),Ff)).then(e=>new e.SetupCommands).catch(e=>{throw this._setupCmds=void 0,e})}_updateCmds;updateCmdsG(){return this._updateCmds??=Promise.resolve().then(()=>(Qf(),Yf)).then(e=>new e.UpdateCommands).catch(e=>{throw this._updateCmds=void 0,e})}_contextCmds;contextCmdsG(){return this._contextCmds??=Promise.resolve().then(()=>(eg(),Zf)).then(e=>new e.ContextCommands).catch(e=>{throw this._contextCmds=void 0,e})}_primitivesCmds;primitivesCmdsG(){return this._primitivesCmds??=Promise.resolve().then(()=>(rg(),ng)).then(e=>new e.PrimitiveCommands).catch(e=>{throw this._primitivesCmds=void 0,e})}_seedCmds;seedCmdsG(){return this._seedCmds??=Promise.resolve().then(()=>(ig(),og)).then(e=>new e.SeedCommands).catch(e=>{throw this._seedCmds=void 0,e})}_installCmds;installCmdsG(){return this._installCmds??=Promise.resolve().then(()=>(hg(),gg)).then(e=>new e.InstallCommands).catch(e=>{throw this._installCmds=void 0,e})}_captureCmds;captureCmdsG(){return this._captureCmds??=Promise.resolve().then(()=>(kg(),wg)).then(e=>new e.CaptureCommands).catch(e=>{throw this._captureCmds=void 0,e})}_mcpCmds;mcpCmdsG(){return this._mcpCmds??=Promise.resolve().then(()=>(Tg(),Eg)).then(e=>new e.McpCommands).catch(e=>{throw this._mcpCmds=void 0,e})}_teamCmds;teamCmdsG(){return this._teamCmds??=Promise.resolve().then(()=>(Ag(),Pg)).then(e=>new e.TeamCommands).catch(e=>{throw this._teamCmds=void 0,e})}_configCmds;configCmdsG(){return this._configCmds??=Promise.resolve().then(()=>(Ig(),jg)).then(e=>new e.ConfigCommands).catch(e=>{throw this._configCmds=void 0,e})}_embeddingsCmds;embeddingsCmdsG(){return this._embeddingsCmds??=Promise.resolve().then(()=>(Mg(),$g)).then(e=>new e.EmbeddingsCommands).catch(e=>{throw this._embeddingsCmds=void 0,e})}_guardCmds;guardCmdsG(){return this._guardCmds??=Promise.resolve().then(()=>(Lg(),Og)).then(e=>new e.GuardCommands).catch(e=>{throw this._guardCmds=void 0,e})}_specCmds;specCmdsG(){return this._specCmds??=Promise.resolve().then(()=>(Gg(),Ug)).then(e=>new e.SpecCommands).catch(e=>{throw this._specCmds=void 0,e})}agent;agentInfo;currentAuthor;prjctDir;constructor(){this.agent=null,this.agentInfo=null,this.currentAuthor=null,this.prjctDir=".prjct"}async task(e=null,t=process.cwd(),r={}){return(await this.workflowG()).now(e,t,r)}async workflowPrefs(e=null,t=process.cwd(),r={}){return(await this.workflowG()).workflow(e,t,r)}async init(e=null,t=process.cwd()){return(await this.planningG()).init(e,t)}async ship(e,t=process.cwd(),r={}){return(await this.shippingG()).ship(e,t,{...r})}async analyze(e={},t=process.cwd()){return(await this.analysisG()).analyze(e,t)}async sync(e=process.cwd(),t={}){return(await this.analysisG()).sync(e,t)}async saveLlmAnalysis(e,t=process.cwd(),r={}){return(await this.analysisG()).saveLlmAnalysis(e,t,r)}async regenVault(e=process.cwd(),t={}){return(await this.analysisG()).regenVault(e,t)}async context(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).context(e,t,r)}async search(e=null,t=process.cwd(),r={}){return(await this.contextCmdsG()).search(e,t,r)}async status(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).status(e,t,r)}async tag(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).tag(e,t,r)}async remember(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).remember(e,t,r)}async forget(e=null,t=process.cwd(),r={}){return(await this.primitivesCmdsG()).forget(e,t,r)}async seed(e=null,t=process.cwd(),r={}){return(await this.seedCmdsG()).seed(e,t,r)}async install(e=null,t=process.cwd(),r={}){return(await this.installCmdsG()).install(null,t,r)}async capture(e=null,t=process.cwd(),r={}){return(await this.captureCmdsG()).capture(e,t,r)}async mcp(e=null,t=process.cwd(),r={}){return(await this.mcpCmdsG()).mcp(e,t,r)}async team(e=null,t=process.cwd(),r={}){return(await this.teamCmdsG()).team(e,t,r)}async config(e=null,t=process.cwd(),r={}){return(await this.configCmdsG()).config(e,t,r)}async embeddings(e=null,t=process.cwd(),r={}){return(await this.embeddingsCmdsG()).embeddings(e,t,r)}async guard(e=null,t=process.cwd(),r={}){return(await this.guardCmdsG()).guard(e,t,r)}async auth(e=null,t={}){return(await this.setupCmdsG()).auth(e,t)}async login(e={}){return(await this.setupCmdsG()).login(e)}async logout(){return(await this.setupCmdsG()).logout()}async start(){return(await this.setupCmdsG()).start()}async setup(e={}){return(await this.setupCmdsG()).setup(e)}async update(e={},t=process.cwd()){return(await this.updateCmdsG()).update(e,t)}async installStatusLine(){return(await this.setupCmdsG()).installStatusLine()}async initializeAgent(){return(await this.workflowG()).initializeAgent()}async ensureProjectInit(e){return(await this.workflowG()).ensureProjectInit(e)}async ensureAuthor(){return(await this.workflowG()).ensureAuthor()}async getGlobalProjectPath(e){return(await this.workflowG()).getGlobalProjectPath(e)}async logToMemory(e,t,r){return(await this.workflowG()).logToMemory(e,t,r)}async spec(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).draft(e,t,r)}async specList(e=process.cwd(),t={}){return(await this.specCmdsG()).list(null,e,t)}async specShow(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).show(e,t,r)}async specUpdate(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).update(e,t,r)}async specSetStatus(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).setStatus(e,t,r)}async specRecordReview(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).recordReview(e,t,r)}async specLinkTask(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).linkTask(e,t,r)}async specShip(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).ship(e,t,r)}async specAudit(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).audit(e,t,r)}async specBreakdown(e=null,t=process.cwd(),r={}){return(await this.specCmdsG()).breakdown(e,t,r)}async specInventory(e=process.cwd(),t={}){return(await this.specCmdsG()).inventory(null,e,t)}};var rR={core:{title:"Core Workflow",description:"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}},Rl=[{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, auto-classify its harness, 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)","Auto-harness classifies H0-H3 and stores expected evidence on the task","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},description:"Commit, push, and celebrate shipped feature",usage:{claude:'p. ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"p. sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"p. regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"eval",group:"optional",routing:{group:"eval",method:"eval"},optionSchema:{booleans:["publish","dryRun","json"],strings:["baseline","candidate","source","target","file"]},description:"Run product evals, compare versions, and publish actionable results",usage:{claude:"p. eval run [--candidate <version>] [--publish]",terminal:"prjct eval <run|compare|report|publish> [--baseline <version>] [--candidate <version>] [--target cloud] [--dry-run]"},params:"[run|compare|report|publish]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!1,features:["Deterministic local eval runs stored under PRJCT_CLI_HOME/evals","Version comparisons with regression/improvement actionables","Cloud publication for shared benchmark history with server-side ownership and subscription checks"]},{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:"p. forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'p. capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"p. seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"p. mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces, Claude hooks, and Codex config",usage:{claude:"p. install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Repairs detected Codex config.toml with prjct MCP and TUI status_line","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"p. help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"p. analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"p. lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"p. tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"p. sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"p. notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"p. agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"p. value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"p. memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"p. report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"p. handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"p. guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"p. cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},description:"Configure workflow hooks via natural language",usage:{claude:'p. workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",description:"Reconfigure editor installations and user-owned defaults",usage:{claude:"p. setup",terminal:"prjct setup [--vault-root <path>]"},params:"[--force] [--vault-root <path>] [--non-interactive]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{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,routingMode:"bin-only"},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"p. auth [action]",terminal:"prjct auth [action]"},params:"[logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{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:'p. 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 <vault-root>/<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`",{group:"update",method:"update"}],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e,t])=>({name:n,group:"setup",description:e,routing:t,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],WO={"-h":"help","--help":"help","-v":"version","--version":"version"},Mre=new Set([...Rl.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(WO).filter(([,n])=>Rl.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)]);K();Re();W();ie();var Wg=class{static{a(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;optionFns=new Map;lazyResetters=[];metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,r){this.handlerFns.set(e,t),this.setMeta(e,r)}setMeta(e,t){let r=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:r,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy,routingMode:t?.routingMode,optionSchema:t?.optionSchema})}registerCategory(e,t){this.categories.set(e,t)}registerLazyMethod(e,t,r,s){let o;this.lazyResetters.push(()=>{o=void 0});let i=a(async()=>{if(o)return o;let l=await t(),u=l[r];if(typeof u!="function")throw new Error(`${r} is not a function`);return o={instance:l,method:u},o},"resolve"),c=a(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,c),this.optionFns.set(e,async(l,u,d)=>{let{instance:p,method:m}=await i();return m.call(p,l,u,d)}),this.setMeta(e,s)}resetLazyResolutions(){for(let e of this.lazyResetters)e()}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let r of this.categories.keys())t[r]=e.filter(s=>s.group===r).length;return{total:e.length,implemented:e.filter(r=>r.implemented).length,withTemplates:e.filter(r=>r.hasTemplate).length,claudeOnly:e.filter(r=>r.usage.claude&&!r.usage.terminal).length,terminalOnly:e.filter(r=>!r.usage.claude&&r.usage.terminal).length,both:e.filter(r=>r.usage.claude&&r.usage.terminal).length,requiresInit:e.filter(r=>r.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),r=t.map(c=>c.name),s=r.filter((c,l)=>r.indexOf(c)!==l);s.length>0&&e.push(`Duplicate command names: ${s.join(", ")}`);let o=t.filter(c=>c.hasTemplate&&!c.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(c=>c.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let c=t.filter(l=>!i.includes(l.group));c.length>0&&e.push(`Invalid categories: ${c.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await x.getProjectId(e);if(!t)throw new Error("No prjct project found. Run p. init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:T()}}async execute(e,t,r=process.cwd()){let s=this.metadata.get(e),o;if(s?.requiresProject===!1)o={projectId:"",projectPath:r,globalPath:"",timestamp:T()};else try{o=await this.buildContext(r)}catch(l){return{success:!1,error:w(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let c=this.handlerFns.get(e);return c?c(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithOptions(e,t,r,s){let o=this.optionFns.get(e);if(!o)return{success:!1,error:`Command not found: ${e}`};if(this.metadata.get(e)?.requiresProject!==!1)try{await this.buildContext(r)}catch(c){return{success:!1,error:w(c)}}return o(t,r,s)}async executeWithoutProject(e,t,r=process.cwd()){let s=this.handlers.get(e);if(s){let i={projectId:"",projectPath:r,globalPath:"",timestamp:T()};return s.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:r,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()}},kt=new Wg;var ix=[];function ax(){for(let n of ix)n()}a(ax,"resetGroupLoaders");function Ae(n){let e;return ix.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}a(Ae,"lazy");var eF={workflow:Ae(async()=>new(await Promise.resolve().then(()=>(Df(),If))).WorkflowCommands),planning:Ae(async()=>new(await Promise.resolve().then(()=>(il(),ol))).PlanningCommands),shipping:Ae(async()=>new(await Promise.resolve().then(()=>(sl(),rl))).ShippingCommands),analysis:Ae(async()=>new(await Promise.resolve().then(()=>(Kc(),zc))).AnalysisCommands),setup:Ae(async()=>new(await Promise.resolve().then(()=>(Hf(),Ff))).SetupCommands),context:Ae(async()=>new(await Promise.resolve().then(()=>(eg(),Zf))).ContextCommands),primitives:Ae(async()=>new(await Promise.resolve().then(()=>(rg(),ng))).PrimitiveCommands),seed:Ae(async()=>new(await Promise.resolve().then(()=>(ig(),og))).SeedCommands),install:Ae(async()=>new(await Promise.resolve().then(()=>(hg(),gg))).InstallCommands),capture:Ae(async()=>new(await Promise.resolve().then(()=>(kg(),wg))).CaptureCommands),mcp:Ae(async()=>new(await Promise.resolve().then(()=>(Tg(),Eg))).McpCommands),team:Ae(async()=>new(await Promise.resolve().then(()=>(Ag(),Pg))).TeamCommands),config:Ae(async()=>new(await Promise.resolve().then(()=>(Ig(),jg))).ConfigCommands),uninstall:Ae(async()=>new(await Promise.resolve().then(()=>(yR(),hR))).UninstallCommands),update:Ae(async()=>new(await Promise.resolve().then(()=>(Qf(),Yf))).UpdateCommands),spec:Ae(async()=>new(await Promise.resolve().then(()=>(Gg(),Ug))).SpecCommands),embeddings:Ae(async()=>new(await Promise.resolve().then(()=>(Mg(),$g))).EmbeddingsCommands),guard:Ae(async()=>new(await Promise.resolve().then(()=>(Lg(),Og))).GuardCommands),lean:Ae(async()=>new(await Promise.resolve().then(()=>(PR(),xR))).LeanCommands),cloud:Ae(async()=>new(await Promise.resolve().then(()=>($R(),DR))).CloudCommands),tdd:Ae(async()=>new(await Promise.resolve().then(()=>(Nm(),Mm))).TddCommands),sdd:Ae(async()=>new(await Promise.resolve().then(()=>(Zc(),Qc))).SddCommands),notify:Ae(async()=>new(await Promise.resolve().then(()=>(OR(),NR))).NotifyCommands),agents:Ae(async()=>new(await Promise.resolve().then(()=>(FR(),LR))).AgentsCommands),product:Ae(async()=>new(await Promise.resolve().then(()=>(WR(),GR))).ProductCommands),eval:Ae(async()=>new(await Promise.resolve().then(()=>(ox(),sx))).EvalCommands)};function tF(){for(let[n,e]of Object.entries(rR))kt.registerCategory(n,e)}a(tF,"registerCategories");function nF(){if(!kt.has("work")){tF();for(let n of Rl)n.routing&&kt.registerLazyMethod(n.name,eF[n.routing.group],n.routing.method,n)}}a(nF,"registerAllCommands");nF();Ja();var rF=new Set(["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse"]);async function cx(){return process.stdin.isTTY?{}:new Promise(n=>{let e=[];process.stdin.on("data",t=>e.push(t)),process.stdin.on("end",()=>{try{let t=Buffer.concat(e).toString("utf-8").trim();if(!t)return n({});n(JSON.parse(t))}catch{n({})}}),process.stdin.on("error",()=>n({})),setTimeout(()=>n({}),200)})}a(cx,"readStdinSafe");function lh(n){process.stdout.write(`${JSON.stringify(n)}
1837
+ `)}a(lh,"emit");function sF(){lh({})}a(sF,"emitEmpty");async function lx(n){try{await n()}catch{sF()}}a(lx,"safeRun");var oF=new Set(["this","that","with","from","have","your","please","would","about","there","these","those","what","when","where","which","while","will","been","were","they","them","their","que","como","cuando","donde","porque","para","pero","por","con","sin","los","las","del","una","uno","unos","unas","este","esta","esto","estos","estas","eso","esos","esas","mas","muy","todo","toda","todos","todas","sobre","entre","hasta","desde","hace","hacer","tiene","tienen","debe","deben","puede","pueden","estan","ser","son","algo","ahora","aqui","bien","cada","dale"]);function ux(n,e=8){let t=xs(n.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2")).toLowerCase(),r=new Set,s=[];for(let o of t.split(/[^\p{L}\p{N}]+/u))if(!(o.length<3)&&!oF.has(o)&&!r.has(o)&&(r.add(o),s.push(o),s.length>=e))break;return s}a(ux,"extractKeywords");function iF(n){return n.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD")}a(iF,"stripLoneSurrogates");function Jn(n,e,t=`
1838
+ \u2026 [truncated]`){if(n.length<=e)return n;let r=Math.max(0,e-t.length),s=n.charCodeAt(r-1);return s>=55296&&s<=56319&&(r-=1),n.slice(0,Math.max(0,r))+t}a(Jn,"safeTruncate");function uh(n,e){if(!e)return{};let t=iF(e);return rF.has(n)?{hookSpecificOutput:{hookEventName:n,additionalContext:t}}:{systemMessage:t}}a(uh,"buildHookOutput");async function Je(n,e){let t=n.projectPath??process.cwd();if(e){try{let r=e.input,s=n.build?await n.build(r,t):null;e.sink(`${JSON.stringify(uh(n.event,s))}
1839
1839
  `),n.afterEmit&&e.detachAfterEmit(()=>n.afterEmit(r,t))}catch{e.sink(`{}
1840
- `)}return}await lx(async()=>{let r=await cx(),s=n.build?await n.build(r,t):null;lh(uh(n.event,s)),n.afterEmit&&await n.afterEmit(r,t)})}a(Je,"runHook");K();fh();ht();ke();Ln();yn();Ze();var kF=1400,Ll=3;async function hh(n,e,t={}){let r=e??await x.readConfig(n);if(!r?.projectId)return null;let s=r.persona,o=t.digest?bF(r.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(EF(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(`
1841
- `)}a(hh,"buildSessionContext");function bF(n){let e=[],t=[];try{e=ut.rerank(n,M.recall(n,{types:["gotcha","anti-pattern"],limit:Ll*4})).slice(0,Ll),t=ut.rerank(n,M.recall(n,{types:["decision"],limit:Ll*4})).slice(0,Ll)}catch{return null}let r=vx(n,new Set([...e,...t].map(o=>o.id)));if(e.length===0&&t.length===0&&!r)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(`- ${Te(o)} \`${o.id}\``)}if(t.length>0){s.push("","**Decisions in force:**");for(let o of t)s.push(`- ${Te(o)} \`${o.id}\``)}return r&&s.push("","**Keeps being missed:**",`- ${Te(r.entry)} \`${r.entry.id}\` \u2014 flagged relevant-but-unused ${r.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."),Vn(s.join(`
1842
- `),kF)}a(bF,"buildKnowledgeDigest");var vF=2;function vx(n,e){try{let t=M.recall(n,{types:["improvement-signal"],tags:{kind:"skill-miss"},limit:50,dedupeByKey:!1}),r=new Map;for(let c of t){let l=c.tags?.relates;l&&r.set(l,(r.get(l)??0)+1)}let s=null,o=0;for(let[c,l]of r)l>o&&(s=c,o=l);if(!s||o<vF||e.has(s))return null;let i=M.getById(n,s);return i?{entry:i,count:o}:null}catch{return null}}a(vx,"findRepeatMissedEntry");var SF=500,bx=2;async function Sx(n){let e=await x.readConfig(n).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:r}=await Promise.resolve().then(()=>(Un(),bf)),s=await r(e.projectId,n);s&&t.push(`Active task (this worktree): ${s.description}`)}catch{}try{let r=ut.rerank(e.projectId,M.recall(e.projectId,{types:["gotcha","anti-pattern"],limit:bx*4})).slice(0,bx);if(r.length>0){t.push("Traps to avoid:");for(let o of r)t.push(`- ${Te(o)} \`${o.id}\``)}let s=vx(e.projectId,new Set(r.map(o=>o.id)));s&&t.push(`Keeps being missed: ${Te(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:Vn(t.join(`
1840
+ `)}return}await lx(async()=>{let r=await cx(),s=n.build?await n.build(r,t):null;lh(uh(n.event,s)),n.afterEmit&&await n.afterEmit(r,t)})}a(Je,"runHook");K();fh();ht();ke();Ln();cn();Ze();var kF=1400,Ll=3;async function hh(n,e,t={}){let r=e??await x.readConfig(n);if(!r?.projectId)return null;let s=r.persona,o=t.digest?bF(r.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(EF(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(`
1841
+ `)}a(hh,"buildSessionContext");function bF(n){let e=[],t=[];try{e=ut.rerank(n,M.recall(n,{types:["gotcha","anti-pattern"],limit:Ll*4})).slice(0,Ll),t=ut.rerank(n,M.recall(n,{types:["decision"],limit:Ll*4})).slice(0,Ll)}catch{return null}let r=vx(n,new Set([...e,...t].map(o=>o.id)));if(e.length===0&&t.length===0&&!r)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(`- ${Te(o)} \`${o.id}\``)}if(t.length>0){s.push("","**Decisions in force:**");for(let o of t)s.push(`- ${Te(o)} \`${o.id}\``)}return r&&s.push("","**Keeps being missed:**",`- ${Te(r.entry)} \`${r.entry.id}\` \u2014 flagged relevant-but-unused ${r.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(`
1842
+ `),kF)}a(bF,"buildKnowledgeDigest");var vF=2;function vx(n,e){try{let t=M.recall(n,{types:["improvement-signal"],tags:{kind:"skill-miss"},limit:50,dedupeByKey:!1}),r=new Map;for(let c of t){let l=c.tags?.relates;l&&r.set(l,(r.get(l)??0)+1)}let s=null,o=0;for(let[c,l]of r)l>o&&(s=c,o=l);if(!s||o<vF||e.has(s))return null;let i=M.getById(n,s);return i?{entry:i,count:o}:null}catch{return null}}a(vx,"findRepeatMissedEntry");var SF=500,bx=2;async function Sx(n){let e=await x.readConfig(n).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:r}=await Promise.resolve().then(()=>(Un(),bf)),s=await r(e.projectId,n);s&&t.push(`Active task (this worktree): ${s.description}`)}catch{}try{let r=ut.rerank(e.projectId,M.recall(e.projectId,{types:["gotcha","anti-pattern"],limit:bx*4})).slice(0,bx);if(r.length>0){t.push("Traps to avoid:");for(let o of r)t.push(`- ${Te(o)} \`${o.id}\``)}let s=vx(e.projectId,new Set(r.map(o=>o.id)));s&&t.push(`Keeps being missed: ${Te(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:Jn(t.join(`
1843
1843
  `),SF)}a(Sx,"buildSubagentDigest");function EF(n){let e=[];return e.push(`## Your role in this project: **${n.role}**`),n.focus&&e.push(`Focus: ${n.focus}`),n.mcps&&n.mcps.length>0&&e.push(`Available MCPs this project expects: ${n.mcps.join(", ")}`),n.packs&&n.packs.length>0&&e.push(`Active packs: ${n.packs.join(", ")}`),e.join(`
1844
1844
  `)}a(EF,"formatPersona");function Ex(n=process.cwd(),e){let t=null;return Je({event:"SessionStart",projectPath:n,build:a(async(r,s)=>{t=await x.readConfig(s).catch(()=>null);let o=r.source??"startup";return hh(s,t,{digest:o==="startup"||o==="clear"||o==="compact"})},"build"),afterEmit:a(async(r,s)=>{t?.projectId&&await oi(s,t.projectId).catch(()=>{}),ph(De)||await mh(De).catch(()=>{});try{let{maybeAutoUpdate:o}=await Promise.resolve().then(()=>(kx(),wx));o(De)}catch{}},"afterEmit")},e)}a(Ex,"runSessionStartHook");function Tx(n=process.cwd(),e){return Je({event:"CwdChanged",projectPath:n,build:a(async(t,r)=>{let s=t.cwd||r;return hh(s)},"build")},e)}a(Tx,"runCwdChangedHook");K();fs();$l();function Cx(n=process.cwd(),e){return Je({event:"Notification",projectPath:n,build:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId||oo(s)==="off")return null;let o="Waiting for your input";try{let i=await Cn(s.projectId,r);i.current&&(o=`Waiting \u2014 active: ${i.current.description}`)}catch{}return await Dl("prjct \u2014 Claude needs you",o),null},"build")},e)}a(Cx,"runNotificationHook");K();xn();function Rx(n=process.cwd(),e){return Je({event:"PostToolUse",projectPath:n,afterEmit:a(async(t,r)=>{let s=t.tool_input?.file_path;if(!(!s||!(await x.readConfig(r))?.projectId))try{await ze.log(r,"post_edit",{file:s,tool:t.tool_name??"unknown"})}catch{}},"afterEmit")},e)}a(Rx,"runPostEditHook");K();ht();ke();import{execSync as TF}from"node:child_process";var CF=1200,RF=3;function xF(n){try{return TF("git diff --cached --name-only",{cwd:n,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
1845
1845
  `).map(e=>e.trim()).filter(Boolean)}catch{return[]}}a(xF,"stagedFiles");function PF(n){let e=new Set;for(let t of n){let r=t.split("/").filter(Boolean);for(let s of r){let o=s.replace(/\.[^.]+$/,"").toLowerCase();o.length>=3&&e.add(o)}}return[...e]}a(PF,"pathFragments");function AF(n,e){let t=n.content.toLowerCase();if(e.some(r=>t.includes(r)))return!0;for(let r of Object.values(n.tags)){let s=r.toLowerCase();if(e.some(o=>s.includes(o)))return!0}return!1}a(AF,"mentionsFragment");async function _F(n){let e=await x.readConfig(n);if(!e?.projectId)return null;let t=xF(n);if(t.length===0)return null;let r=PF(t);if(r.length===0)return null;let s;try{s=M.recall(e.projectId,{types:["anti-pattern","gotcha"],limit:50})}catch{return null}let o=s.filter(l=>AF(l,r)).slice(0,RF);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(On(o)),i.push(""),i.push("> Nudge, not block. Proceed if you think it still applies.");let c=i.join(`
1846
- `);return Vn(c,CF)}a(_F,"buildPreCommitContext");function xx(n=process.cwd(),e){return Je({event:"PreToolUse",projectPath:n,build:a(async(t,r)=>{let s=t.tool_input?.command??"";return/\bgit\s+commit\b/.test(s)?_F(r):null},"build")},e)}a(xx,"runPreCommitHook");K();ht();ke();hi();var jF=1200,IF=3;async function DF(n,e){let t=await x.readConfig(n);if(!t?.projectId)return null;let r;try{r=M.recallForFile(t.projectId,e,IF)}catch{return null}if(r.length===0)return null;ns(t.projectId,n,r.map(i=>i.id));let o=[`# prjct: heads-up before editing \`${e.split("/").pop()??e}\``,""];o.push(`${r.length} preventive memory entr${r.length===1?"y":"ies"} recorded against this file:`),o.push("");for(let i of r)o.push(`- **[${fr(i)}] ${Te(i)}** \u2014 ${Nn(i.content)} \`${i.id}\``);return o.push(""),o.push("> Nudge, not block. Apply if it still holds; proceed if not."),Vn(o.join(`
1846
+ `);return Jn(c,CF)}a(_F,"buildPreCommitContext");function xx(n=process.cwd(),e){return Je({event:"PreToolUse",projectPath:n,build:a(async(t,r)=>{let s=t.tool_input?.command??"";return/\bgit\s+commit\b/.test(s)?_F(r):null},"build")},e)}a(xx,"runPreCommitHook");K();ht();ke();hi();var jF=1200,IF=3;async function DF(n,e){let t=await x.readConfig(n);if(!t?.projectId)return null;let r;try{r=M.recallForFile(t.projectId,e,IF)}catch{return null}if(r.length===0)return null;ns(t.projectId,n,r.map(i=>i.id));let o=[`# prjct: heads-up before editing \`${e.split("/").pop()??e}\``,""];o.push(`${r.length} preventive memory entr${r.length===1?"y":"ies"} recorded against this file:`),o.push("");for(let i of r)o.push(`- **[${gr(i)}] ${Te(i)}** \u2014 ${Nn(i.content)} \`${i.id}\``);return o.push(""),o.push("> Nudge, not block. Apply if it still holds; proceed if not."),Jn(o.join(`
1847
1847
  `),jF)}a(DF,"buildPreEditContext");function Px(n=process.cwd(),e){return Je({event:"PreToolUse",projectPath:n,build:a(async(t,r)=>{let s=t.tool_input?.file_path?.trim();return s?DF(r,s):null},"build")},e)}a(Px,"runPreEditHook");K();ht();ke();fs();hi();Hn();Yr();ue();ee();import $F from"node:path";var MF=900,NF=8;async function OF(n,e){let t=e!==void 0?e:await x.readConfig(n);if(!t?.projectId)return null;let r=["# prjct: project state"],s=!1;try{let o=await Cn(t.projectId,n);if(o.current){let c=Ax(o.current.startedAt);r.push(`- Active task: "${o.current.description}" (${c}) [${o.current.label}]`),s=!0}let i=o.all.filter(c=>!c.isCurrent);i.length>0&&(r.push(`- ${i.length} task(s) active in other workspace(s)`),s=!0)}catch{}try{let o=await tt.getActiveTasks(t.projectId);o.length>0&&(r.push(`- Pending: ${o.length} \xB7 Next: "${o[0].description}"`),s=!0)}catch{}if(await A($F.join(n,".git"))){let o=await HF(n);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 c=i.length>0?` \u2014 working tree ${i.join(", ")}`:"",l=o.ahead>0?`${c?",":" \u2014"} ${o.ahead} unpushed`:"";r.push(`- Branch: ${o.branch}${c}${l}`),s=!0}}try{let o=await St.getRecent(t.projectId,1);if(o.length>0){let i=o[0],c=Ax(i.shippedAt??""),l=i.version?`v${i.version}`:i.name;r.push(`- Last ship: ${l} (${c})`),s=!0}}catch{}try{let o=M.countByType(t.projectId,"inbox");o>0&&(r.push(`- Inbox: ${o} items pending`),s=!0)}catch{}return s?r.join(`
1848
1848
  `):null}a(OF,"buildProjectState");function LF(n,e,t){try{let r=ux(e);if(r.length===0)return null;let o=M.searchFts(n,r,NF).find(i=>i.type==="gotcha"||i.type==="anti-pattern");return o?(t&&ns(n,t,[o.id]),`> Trap on this topic: ${Te(o)} \`${o.id}\``):null}catch{return null}}a(LF,"buildTopicalCue");var FF=3e3,Fl=new Map;async function HF(n){let e=Fl.get(n);if(e&&e.expiresAt>Date.now())return e.snapshot;let t=await UF(n);return Fl.size>32&&Fl.clear(),Fl.set(n,{snapshot:t,expiresAt:Date.now()+FF}),t}a(HF,"captureGit");async function UF(n){let e={branch:"",modified:0,staged:0,untracked:0,ahead:0},t=a(async d=>{try{return(await G("git",d,{cwd:n,timeout:2e3})).stdout.trim()}catch{return""}},"safe"),[r,s,o]=await Promise.all([t(["branch","--show-current"]),t(["status","--porcelain"]),t(["rev-list","--count","@{u}..HEAD"])]);if(!r)return e;let i=0,c=0,l=0;for(let d of s.split(`
1849
- `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?l++:(p[0]!==" "&&p[0]!=="?"&&c++,p[1]!==" "&&i++)}let u=Number.parseInt(o,10)||0;return{branch:r,modified:i,staged:c,untracked:l,ahead:u}}a(UF,"captureGitUncached");function Ax(n){if(!n)return"unknown";let e=Date.parse(n);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`}a(Ax,"formatRelative");function _x(n=process.cwd(),e){return Je({event:"UserPromptSubmit",projectPath:n,build:a(async(t,r)=>{let s=(t.prompt??"").trim();if(!s)return null;let o=await x.readConfig(r),i=await OF(r,o);if(!i)return null;let c=o?.projectId?LF(o.projectId,s,r):null;return Vn(c?`${i}
1849
+ `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?l++:(p[0]!==" "&&p[0]!=="?"&&c++,p[1]!==" "&&i++)}let u=Number.parseInt(o,10)||0;return{branch:r,modified:i,staged:c,untracked:l,ahead:u}}a(UF,"captureGitUncached");function Ax(n){if(!n)return"unknown";let e=Date.parse(n);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`}a(Ax,"formatRelative");function _x(n=process.cwd(),e){return Je({event:"UserPromptSubmit",projectPath:n,build:a(async(t,r)=>{let s=(t.prompt??"").trim();if(!s)return null;let o=await x.readConfig(r),i=await OF(r,o);if(!i)return null;let c=o?.projectId?LF(o.projectId,s,r):null;return Jn(c?`${i}
1850
1850
 
1851
1851
  ${c}`:i,MF)},"build")},e)}a(_x,"runPromptHook");K();pl();import aU from"node:fs/promises";ke();import GF from"node:crypto";import WF from"node:fs/promises";function Rr(n){let e=[];for(let t of n.split(`
1852
1852
  `)){let r=t.trim();if(r)try{let s=JSON.parse(r);s&&typeof s=="object"&&e.push(s)}catch{}}return e}a(Rr,"parseTranscriptJsonl");var Ix="friction-detector",BF=5,jx=400,qF=[/^\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],VF=[/\bshould be\b/i,/\brather than\b/i,/\binstead\b/i,/\bmás bien\b/i,/\ben realidad\b/i],JF=[/\bdoesn'?t work\b/i,/\bno funciona\b/i,/\bbroken\b/i,/\bestá roto\b/i,/\bagain\b.*\bsame\b/i];async function Dx(n,e,t,r={}){let s;if(r.preloadedLines)s=r.preloadedLines;else{let d="";try{d=await WF.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}s=XF(d)}let o=zF(s);if(o.length===0)return{signalsRecorded:0,signalsSkipped:0};let i=eH(n),c=$x(n)??void 0,l=0,u=0;for(let d of o.slice(0,BF)){let p=ZF(d.excerpt).slice(0,12);if(i.has(p)){u++;continue}try{await M.remember(n,{type:"improvement-signal",content:QF(d),tags:{source:Ix,category:d.category,...t?{session:t}:{},key:p},provenance:"extracted",projectId:c}),l++}catch{u++}}return{signalsRecorded:l,signalsSkipped:u}}a(Dx,"detectFriction");function XF(n){return Rr(n)}a(XF,"parseJsonl");function zF(n){let e=[],t="";for(let r of n){let s=r.role??r.message?.role,o=YF(r.content??r.message?.content);if(!o)continue;if(s==="assistant"){t=o;continue}if(s!=="user")continue;let i=o.slice(0,300),c=KF(i);c&&e.push({excerpt:o.slice(0,jx).trim(),category:c,precedingAssistantPreview:t.slice(0,jx).trim()})}return e}a(zF,"extractSignals");function KF(n){return JF.some(e=>e.test(n))?"complaint":qF.some(e=>e.test(n))?"negation":VF.some(e=>e.test(n))?"correction":null}a(KF,"classify");function YF(n){return typeof n=="string"?n:Array.isArray(n)?n.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
1853
1853
  `).trim():""}a(YF,"textOf");function QF(n){return[`[${n.category}] User pushback: "${n.excerpt}"`,n.precedingAssistantPreview?`Following assistant action: "${n.precedingAssistantPreview.slice(0,200)}"`:null].filter(t=>!!t).join(`
1854
1854
  `)}a(QF,"formatSignal");function ZF(n){let e=n.toLowerCase().replace(/\s+/g," ").trim();return GF.createHash("sha256").update(e).digest("hex")}a(ZF,"hashSignal");function eH(n){try{let e=$x(n);if(!e)return new Set;let t=M.recall(e,{types:["improvement-signal"],tags:{source:Ix},limit:100,dedupeByKey:!1}),r=new Set;for(let s of t){let o=s.tags.key;o&&r.add(o)}return r}catch{return new Set}}a(eH,"projectMemoryHashes");function $x(n){try{let e=rt("node:fs"),r=rt("node:path").join(n,".prjct","prjct.config.json"),s=e.readFileSync(r,"utf-8");return JSON.parse(s).projectId??null}catch{return null}}a($x,"projectIdFromPath");K();ke();import{execFile as tH}from"node:child_process";import{promisify as nH}from"node:util";var rH=nH(tH),Nx="lean-detector",sH="lean-debt-growth",oH=3,Mx=["off","lite","full","ultra"];function iH(n){let e=n?.lean?.mode;if(e&&Mx.includes(e))return e;let t=process.env.PRJCT_LEAN_MODE?.toLowerCase();return t&&Mx.includes(t)?t:"off"}a(iH,"effectiveMode");async function Ox(n,e){let t={active:!1,total:0,previous:0,persisted:!1},r=e!==void 0?e:await x.readConfig(n).catch(()=>null);if(!r?.projectId||iH(r)==="off")return t;t.active=!0;try{let s=await aH(n);if(t.total=s,s===0)return t;let o=cH(r.projectId);t.previous=o;let i=s-o;o>0&&i>=oH&&(await M.remember(n,{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:Nx,pattern:sH,total:String(s),previous:String(o),delta:String(i)},provenance:"inferred",projectId:r.projectId}),t.persisted=!0)}catch{}return t}a(Ox,"detectAndPersistLeanDebt");async function aH(n){try{let{stdout:e}=await rH("git",["grep","-cI","-e","lean:"],{cwd:n,maxBuffer:16777216}),t=0;for(let r of e.split(`
1855
- `)){let s=r.lastIndexOf(":");if(s<=0)continue;let o=Number.parseInt(r.slice(s+1),10);Number.isFinite(o)&&(t+=o)}return t}catch(e){if(e.code===1)return 0;throw e}}a(aH,"measureLeanMarkers");function cH(n){try{let{prjctDb:e}=(J(),st(rr)),t=e.query(n,"SELECT data FROM events WHERE type = 'memory.remember.lean-debt' ORDER BY id DESC LIMIT 50");for(let r of t){let s;try{s=JSON.parse(r.data)}catch{continue}if(!s||typeof s!="object")continue;let o=s.tags;if(!o||o.source!==Nx)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}a(cH,"collectPreviousSnapshot");K();ke();import{execFile as lH}from"node:child_process";import uH from"node:path";import{promisify as dH}from"node:util";var Lx=dH(lH),pH="hot-file",Fx="pattern-detector-auto",mH="recurring-bug",Hx="pattern-detector-recurring",fH="tech-debt-growth",Ux="pattern-detector-debt",Hl=7,gH=3,Ul=30,hH=2,yH=5,wH=[/^package(-lock)?\.json$/,/^bun\.lock(b)?$/,/^pnpm-lock\.yaml$/,/^yarn\.lock$/,/^CHANGELOG\.md$/,/^\.gitignore$/,/\.snap$/,/^dist\//,/^node_modules\//];async function Gx(n,e){let t={scanned:0,hotFiles:[],persisted:0,skipped:[],errors:[]},r=e!==void 0?e:await x.readConfig(n).catch(()=>null);if(!r?.projectId)return t.errors.push("no project config"),t;try{let s=await kH(n);if(t.scanned+=s.length,t.hotFiles=s,s.length>0){let o=TH(r.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 M.remember(n,{type:"learning",content:`Hot file: \`${i.path}\` \u2014 ${i.touches} touches in the last ${Hl} days. Worth a refactor pass or a deliberate decision about why it churns this often.`,tags:{source:Fx,pattern:pH,file:i.path,touches:String(i.touches),window_days:String(Hl)},provenance:"inferred"}),t.persisted+=1}catch(c){t.errors.push(`remember failed for ${i.path}: ${c.message}`)}}}}catch(s){t.errors.push(`hot-file detection failed: ${s.message}`)}try{let s=vH(r.projectId);if(s.length>0){let o=CH(r.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 M.remember(n,{type:"learning",content:`Recurring bug pattern: gotchas tagged \`topic:${i.topic}\` reported ${i.occurrences} times in the last ${Ul} days. Likely a real underlying issue \u2014 consider a focused investigation before patching the next instance.`,tags:{source:Hx,pattern:mH,topic:i.topic,occurrences:String(i.occurrences),window_days:String(Ul)},provenance:"inferred"}),t.persisted+=1}catch(c){t.errors.push(`remember failed for recurring ${i.topic}: ${c.message}`)}}}}catch(s){t.errors.push(`recurring-bug detection failed: ${s.message}`)}try{let s=await SH(n);if(s.totalCount>0){let o=EH(r.projectId),i=s.totalCount-o;if(o>0&&i>=yH)try{await M.remember(n,{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:Ux,pattern:fH,total:String(s.totalCount),previous:String(o),delta:String(i)},provenance:"inferred"}),t.persisted+=1}catch(c){t.errors.push(`remember failed for tech-debt: ${c.message}`)}}}catch(s){t.errors.push(`tech-debt detection failed: ${s.message}`)}return t}a(Gx,"detectAndPersistPatterns");async function kH(n){let{stdout:e}=await Lx("git",["log",`--since=${Hl}.days.ago`,"--name-only","--pretty=format:","-z"],{cwd:n,maxBuffer:16777216}),t=new Map;for(let s of e.split("\0")){let o=s.trim();o&&(bH(o)||t.set(o,(t.get(o)??0)+1))}let r=[];for(let[s,o]of t)o<gH||r.push({path:s,touches:o});return r.sort((s,o)=>o.touches-s.touches),r}a(kH,"detectHotFiles");function bH(n){let e=uH.basename(n);for(let t of wH)if(t.test(n)||t.test(e))return!0;return!1}a(bH,"isIgnored");function vH(n){try{let{prjctDb:e}=(J(),st(rr)),t=new Date(Date.now()-Ul*24*60*60*1e3).toISOString(),r=e.query(n,"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 r){let c;try{c=JSON.parse(i.data)}catch{continue}if(!c||typeof c!="object")continue;let l=c.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,c]of s)c<hH||o.push({topic:i,occurrences:c});return o.sort((i,c)=>c.occurrences-i.occurrences),o}catch{return[]}}a(vH,"detectRecurringBugs");async function SH(n){try{let{stdout:e}=await Lx("git",["grep","-cE","\\b(TODO|FIXME|XXX)\\b"],{cwd:n,maxBuffer:16777216}),t=0;for(let r of e.split(`
1856
- `)){let s=r.lastIndexOf(":");if(s<=0)continue;let o=Number.parseInt(r.slice(s+1),10);Number.isFinite(o)&&(t+=o)}return{totalCount:t}}catch(e){if(e.code===1)return{totalCount:0};throw e}}a(SH,"measureTechDebt");function EH(n){try{let{prjctDb:e}=(J(),st(rr)),t=e.query(n,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 50");for(let r of t){let s;try{s=JSON.parse(r.data)}catch{continue}if(!s||typeof s!="object")continue;let o=s.tags;if(!o||o.source!==Ux)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}a(EH,"collectPreviousDebtSnapshot");function TH(n){let e=new Set;try{let{prjctDb:t}=(J(),st(rr)),r=t.query(n,"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 r){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==Fx)continue;let l=c.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}a(TH,"collectAlreadyMarkedHotFiles");function CH(n){let e=new Set;try{let{prjctDb:t}=(J(),st(rr)),r=t.query(n,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),s=Date.now()-Ul*24*60*60*1e3;for(let o of r){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==Hx)continue;let l=c.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}a(CH,"collectAlreadyMarkedRecurringBugs");Re();ke();sr();J();import $i from"node:fs/promises";import Wx from"node:path";var RH={conservative:{inboxDays:30,archivesDays:180,checkpointsDays:null},standard:{inboxDays:14,archivesDays:90,checkpointsDays:30},aggressive:{inboxDays:7,archivesDays:30,checkpointsDays:14}};function xH(n=process.env){let e=(n.PRJCT_CLEANUP_AGGRESSIVENESS??"standard").toLowerCase();return RH[e==="conservative"||e==="standard"||e==="aggressive"?e:"standard"]}a(xH,"resolveProfile");async function PH(n,e){let t=Date.now()-e*24*60*60*1e3,s=M.recall(n,{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{ft.archive(n,{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 c=i.id.startsWith("mem_")?i.id.slice(4):null;c&&b.run(n,"UPDATE events SET type = ? WHERE id = ?","memory.archived.inbox",Number(c)),o++}catch{}return o}a(PH,"archiveAgedInbox");async function AH(n,e){if(e===null)return 0;let t=Wx.join(j.getGlobalProjectPath(n),"checkpoints"),r=[];try{r=await $i.readdir(t)}catch{return 0}let s=Date.now()-e*24*60*60*1e3,o=0;for(let i of r){if(!i.endsWith(".json"))continue;let c=Wx.join(t,i);try{(await $i.stat(c)).mtimeMs<s&&(await $i.unlink(c),o++)}catch{}}return o}a(AH,"pruneOldCheckpoints");async function _H(){let{getVerifyCachePath:n}=await Promise.resolve().then(()=>(ic(),yb)),e=n();try{let t=await $i.stat(e);if((Date.now()-t.mtimeMs)/(1440*60*1e3)>7)return await $i.unlink(e),!0}catch{}return!1}a(_H,"rotateContext7Cache");async function Bx(n){let e=xH(),t={inboxArchived:0,archivesPruned:0,checkpointsRemoved:0,context7CacheRotated:!1};try{t.inboxArchived=await PH(n,e.inboxDays)}catch{}try{t.archivesPruned=ft.pruneOldArchives(n,e.archivesDays)}catch{}try{t.checkpointsRemoved=await AH(n,e.checkpointsDays)}catch{}try{t.context7CacheRotated=await _H()}catch{}return t}a(Bx,"runSessionCleanup");async function qx(n,e){if(e.inboxArchived+e.archivesPruned+e.checkpointsRemoved+(e.context7CacheRotated?1:0)===0)return;let r=[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(", ");b.appendEvent(n,"memory.remember.system-event",{content:`Session cleanup: ${r}`,tags:{source:"session-cleanup",key:"last-cleanup"},provenance:"extracted"})}a(qx,"recordCleanupReport");ke();_o();dm();import jH from"node:crypto";import IH from"node:fs/promises";Ln();var Xx="skill-miss-detector",DH=3,$H=280,MH=["decision","gotcha","anti-pattern"],NH=5400*1e3,OH=360*60*1e3,LH=2,zx=5,FH=8,Kx=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"]);async function Yx(n,e,t,r={}){let s;if(r.preloadedLines)s=r.preloadedLines;else{let y="";try{y=await IH.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}s=UH(y)}let o=zH(n);if(!o)return{signalsRecorded:0,signalsSkipped:0};let i=GH(s);if(!i)return{signalsRecorded:0,signalsSkipped:0};let c;try{c=JH(o,t)}catch{return{signalsRecorded:0,signalsSkipped:0}}if(c.length===0)return{signalsRecorded:0,signalsSkipped:0};let l=[];try{l=await $w(n)}catch{l=[]}let u=new Set;try{let y=Date.now()-OH;for(let R of Jc.list(o))if(!(Date.parse(R.ended_at)<=y))for(let k of R.files_touched)u.add(k)}catch{u=new Set}let d=HH(i,l,c,u);if(d.length===0)return{signalsRecorded:0,signalsSkipped:0};let p=XH(o),m=0,f=0;for(let y of d.slice(0,DH)){let R=VH(y.memId,y.excerpt).slice(0,12);if(p.has(R)){f++;continue}try{await M.remember(n,{type:"improvement-signal",content:qH(y),tags:{source:Xx,kind:"skill-miss",category:"skill-miss",relates:y.memId,file:y.evidenceFile,key:R,...t?{session:t}:{}},provenance:"extracted",projectId:o}),ut.penalizeSkillMiss(o,y.memId),m++}catch{f++}}return{signalsRecorded:m,signalsSkipped:f}}a(Yx,"detectSkillMisses");function HH(n,e,t,r=new Set){let s=Vx(n);if(s.size===0)return[];let o=e.filter(l=>!r.has(l)),i=Gl(o),c=[];for(let l of t){let u=Vx(`${l.content} ${l.fileTag}`);if(u.size===0)continue;let d=l.fileTag!==""&&o.some(k=>Jx(k,l.fileTag))||[...i].some(k=>u.has(k)),p=BH(u),m=0;for(let k of u)p.has(k)||s.has(k)&&m++;if(!(d||m>=LH)||[...p].some(k=>s.has(k)))continue;let R=l.fileTag!==""&&o.some(k=>Jx(k,l.fileTag))?l.fileTag:o.find(k=>[...Gl([k])].some(S=>u.has(S)))??"";c.push({miss:{memId:l.id,memType:l.type,excerpt:l.content.replace(/\s+/g," ").trim().slice(0,$H),evidenceFile:R,reason:d?"path-overlap-unused":"topic-overlap-unused"},rank:d?2:1,overlap:m})}return c.sort((l,u)=>u.rank-l.rank||u.overlap-l.overlap),c.map(l=>l.miss)}a(HH,"analyze");function UH(n){return Rr(n)}a(UH,"parseJsonl");function GH(n){let e=[];for(let t of n){let r=t.role??t.message?.role;if(r!=="user"&&r!=="assistant")continue;let s=WH(t.content??t.message?.content);s&&e.push(s)}return e.join(`
1855
+ `)){let s=r.lastIndexOf(":");if(s<=0)continue;let o=Number.parseInt(r.slice(s+1),10);Number.isFinite(o)&&(t+=o)}return t}catch(e){if(e.code===1)return 0;throw e}}a(aH,"measureLeanMarkers");function cH(n){try{let{prjctDb:e}=(J(),st(sr)),t=e.query(n,"SELECT data FROM events WHERE type = 'memory.remember.lean-debt' ORDER BY id DESC LIMIT 50");for(let r of t){let s;try{s=JSON.parse(r.data)}catch{continue}if(!s||typeof s!="object")continue;let o=s.tags;if(!o||o.source!==Nx)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}a(cH,"collectPreviousSnapshot");K();ke();import{execFile as lH}from"node:child_process";import uH from"node:path";import{promisify as dH}from"node:util";var Lx=dH(lH),pH="hot-file",Fx="pattern-detector-auto",mH="recurring-bug",Hx="pattern-detector-recurring",fH="tech-debt-growth",Ux="pattern-detector-debt",Hl=7,gH=3,Ul=30,hH=2,yH=5,wH=[/^package(-lock)?\.json$/,/^bun\.lock(b)?$/,/^pnpm-lock\.yaml$/,/^yarn\.lock$/,/^CHANGELOG\.md$/,/^\.gitignore$/,/\.snap$/,/^dist\//,/^node_modules\//];async function Gx(n,e){let t={scanned:0,hotFiles:[],persisted:0,skipped:[],errors:[]},r=e!==void 0?e:await x.readConfig(n).catch(()=>null);if(!r?.projectId)return t.errors.push("no project config"),t;try{let s=await kH(n);if(t.scanned+=s.length,t.hotFiles=s,s.length>0){let o=TH(r.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 M.remember(n,{type:"learning",content:`Hot file: \`${i.path}\` \u2014 ${i.touches} touches in the last ${Hl} days. Worth a refactor pass or a deliberate decision about why it churns this often.`,tags:{source:Fx,pattern:pH,file:i.path,touches:String(i.touches),window_days:String(Hl)},provenance:"inferred"}),t.persisted+=1}catch(c){t.errors.push(`remember failed for ${i.path}: ${c.message}`)}}}}catch(s){t.errors.push(`hot-file detection failed: ${s.message}`)}try{let s=vH(r.projectId);if(s.length>0){let o=CH(r.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 M.remember(n,{type:"learning",content:`Recurring bug pattern: gotchas tagged \`topic:${i.topic}\` reported ${i.occurrences} times in the last ${Ul} days. Likely a real underlying issue \u2014 consider a focused investigation before patching the next instance.`,tags:{source:Hx,pattern:mH,topic:i.topic,occurrences:String(i.occurrences),window_days:String(Ul)},provenance:"inferred"}),t.persisted+=1}catch(c){t.errors.push(`remember failed for recurring ${i.topic}: ${c.message}`)}}}}catch(s){t.errors.push(`recurring-bug detection failed: ${s.message}`)}try{let s=await SH(n);if(s.totalCount>0){let o=EH(r.projectId),i=s.totalCount-o;if(o>0&&i>=yH)try{await M.remember(n,{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:Ux,pattern:fH,total:String(s.totalCount),previous:String(o),delta:String(i)},provenance:"inferred"}),t.persisted+=1}catch(c){t.errors.push(`remember failed for tech-debt: ${c.message}`)}}}catch(s){t.errors.push(`tech-debt detection failed: ${s.message}`)}return t}a(Gx,"detectAndPersistPatterns");async function kH(n){let{stdout:e}=await Lx("git",["log",`--since=${Hl}.days.ago`,"--name-only","--pretty=format:","-z"],{cwd:n,maxBuffer:16777216}),t=new Map;for(let s of e.split("\0")){let o=s.trim();o&&(bH(o)||t.set(o,(t.get(o)??0)+1))}let r=[];for(let[s,o]of t)o<gH||r.push({path:s,touches:o});return r.sort((s,o)=>o.touches-s.touches),r}a(kH,"detectHotFiles");function bH(n){let e=uH.basename(n);for(let t of wH)if(t.test(n)||t.test(e))return!0;return!1}a(bH,"isIgnored");function vH(n){try{let{prjctDb:e}=(J(),st(sr)),t=new Date(Date.now()-Ul*24*60*60*1e3).toISOString(),r=e.query(n,"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 r){let c;try{c=JSON.parse(i.data)}catch{continue}if(!c||typeof c!="object")continue;let l=c.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,c]of s)c<hH||o.push({topic:i,occurrences:c});return o.sort((i,c)=>c.occurrences-i.occurrences),o}catch{return[]}}a(vH,"detectRecurringBugs");async function SH(n){try{let{stdout:e}=await Lx("git",["grep","-cE","\\b(TODO|FIXME|XXX)\\b"],{cwd:n,maxBuffer:16777216}),t=0;for(let r of e.split(`
1856
+ `)){let s=r.lastIndexOf(":");if(s<=0)continue;let o=Number.parseInt(r.slice(s+1),10);Number.isFinite(o)&&(t+=o)}return{totalCount:t}}catch(e){if(e.code===1)return{totalCount:0};throw e}}a(SH,"measureTechDebt");function EH(n){try{let{prjctDb:e}=(J(),st(sr)),t=e.query(n,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 50");for(let r of t){let s;try{s=JSON.parse(r.data)}catch{continue}if(!s||typeof s!="object")continue;let o=s.tags;if(!o||o.source!==Ux)continue;let i=typeof o.total=="string"?Number.parseInt(o.total,10):0;if(Number.isFinite(i))return i}}catch{}return 0}a(EH,"collectPreviousDebtSnapshot");function TH(n){let e=new Set;try{let{prjctDb:t}=(J(),st(sr)),r=t.query(n,"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 r){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==Fx)continue;let l=c.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}a(TH,"collectAlreadyMarkedHotFiles");function CH(n){let e=new Set;try{let{prjctDb:t}=(J(),st(sr)),r=t.query(n,"SELECT data FROM events WHERE type = 'memory.remember.learning' ORDER BY id DESC LIMIT 200"),s=Date.now()-Ul*24*60*60*1e3;for(let o of r){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==Hx)continue;let l=c.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}a(CH,"collectAlreadyMarkedRecurringBugs");Re();ke();or();J();import $i from"node:fs/promises";import Wx from"node:path";var RH={conservative:{inboxDays:30,archivesDays:180,checkpointsDays:null},standard:{inboxDays:14,archivesDays:90,checkpointsDays:30},aggressive:{inboxDays:7,archivesDays:30,checkpointsDays:14}};function xH(n=process.env){let e=(n.PRJCT_CLEANUP_AGGRESSIVENESS??"standard").toLowerCase();return RH[e==="conservative"||e==="standard"||e==="aggressive"?e:"standard"]}a(xH,"resolveProfile");async function PH(n,e){let t=Date.now()-e*24*60*60*1e3,s=M.recall(n,{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{ft.archive(n,{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 c=i.id.startsWith("mem_")?i.id.slice(4):null;c&&b.run(n,"UPDATE events SET type = ? WHERE id = ?","memory.archived.inbox",Number(c)),o++}catch{}return o}a(PH,"archiveAgedInbox");async function AH(n,e){if(e===null)return 0;let t=Wx.join(j.getGlobalProjectPath(n),"checkpoints"),r=[];try{r=await $i.readdir(t)}catch{return 0}let s=Date.now()-e*24*60*60*1e3,o=0;for(let i of r){if(!i.endsWith(".json"))continue;let c=Wx.join(t,i);try{(await $i.stat(c)).mtimeMs<s&&(await $i.unlink(c),o++)}catch{}}return o}a(AH,"pruneOldCheckpoints");async function _H(){let{getVerifyCachePath:n}=await Promise.resolve().then(()=>(ic(),yb)),e=n();try{let t=await $i.stat(e);if((Date.now()-t.mtimeMs)/(1440*60*1e3)>7)return await $i.unlink(e),!0}catch{}return!1}a(_H,"rotateContext7Cache");async function Bx(n){let e=xH(),t={inboxArchived:0,archivesPruned:0,checkpointsRemoved:0,context7CacheRotated:!1};try{t.inboxArchived=await PH(n,e.inboxDays)}catch{}try{t.archivesPruned=ft.pruneOldArchives(n,e.archivesDays)}catch{}try{t.checkpointsRemoved=await AH(n,e.checkpointsDays)}catch{}try{t.context7CacheRotated=await _H()}catch{}return t}a(Bx,"runSessionCleanup");async function qx(n,e){if(e.inboxArchived+e.archivesPruned+e.checkpointsRemoved+(e.context7CacheRotated?1:0)===0)return;let r=[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(", ");b.appendEvent(n,"memory.remember.system-event",{content:`Session cleanup: ${r}`,tags:{source:"session-cleanup",key:"last-cleanup"},provenance:"extracted"})}a(qx,"recordCleanupReport");ke();_o();dm();import jH from"node:crypto";import IH from"node:fs/promises";Ln();var Xx="skill-miss-detector",DH=3,$H=280,MH=["decision","gotcha","anti-pattern"],NH=5400*1e3,OH=360*60*1e3,LH=2,zx=5,FH=8,Kx=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"]);async function Yx(n,e,t,r={}){let s;if(r.preloadedLines)s=r.preloadedLines;else{let y="";try{y=await IH.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}s=UH(y)}let o=zH(n);if(!o)return{signalsRecorded:0,signalsSkipped:0};let i=GH(s);if(!i)return{signalsRecorded:0,signalsSkipped:0};let c;try{c=JH(o,t)}catch{return{signalsRecorded:0,signalsSkipped:0}}if(c.length===0)return{signalsRecorded:0,signalsSkipped:0};let l=[];try{l=await $w(n)}catch{l=[]}let u=new Set;try{let y=Date.now()-OH;for(let R of Jc.list(o))if(!(Date.parse(R.ended_at)<=y))for(let k of R.files_touched)u.add(k)}catch{u=new Set}let d=HH(i,l,c,u);if(d.length===0)return{signalsRecorded:0,signalsSkipped:0};let p=XH(o),m=0,f=0;for(let y of d.slice(0,DH)){let R=VH(y.memId,y.excerpt).slice(0,12);if(p.has(R)){f++;continue}try{await M.remember(n,{type:"improvement-signal",content:qH(y),tags:{source:Xx,kind:"skill-miss",category:"skill-miss",relates:y.memId,file:y.evidenceFile,key:R,...t?{session:t}:{}},provenance:"extracted",projectId:o}),ut.penalizeSkillMiss(o,y.memId),m++}catch{f++}}return{signalsRecorded:m,signalsSkipped:f}}a(Yx,"detectSkillMisses");function HH(n,e,t,r=new Set){let s=Vx(n);if(s.size===0)return[];let o=e.filter(l=>!r.has(l)),i=Gl(o),c=[];for(let l of t){let u=Vx(`${l.content} ${l.fileTag}`);if(u.size===0)continue;let d=l.fileTag!==""&&o.some(k=>Jx(k,l.fileTag))||[...i].some(k=>u.has(k)),p=BH(u),m=0;for(let k of u)p.has(k)||s.has(k)&&m++;if(!(d||m>=LH)||[...p].some(k=>s.has(k)))continue;let R=l.fileTag!==""&&o.some(k=>Jx(k,l.fileTag))?l.fileTag:o.find(k=>[...Gl([k])].some(S=>u.has(S)))??"";c.push({miss:{memId:l.id,memType:l.type,excerpt:l.content.replace(/\s+/g," ").trim().slice(0,$H),evidenceFile:R,reason:d?"path-overlap-unused":"topic-overlap-unused"},rank:d?2:1,overlap:m})}return c.sort((l,u)=>u.rank-l.rank||u.overlap-l.overlap),c.map(l=>l.miss)}a(HH,"analyze");function UH(n){return Rr(n)}a(UH,"parseJsonl");function GH(n){let e=[];for(let t of n){let r=t.role??t.message?.role;if(r!=="user"&&r!=="assistant")continue;let s=WH(t.content??t.message?.content);s&&e.push(s)}return e.join(`
1857
1857
  `).toLowerCase()}a(GH,"transcriptTextOf");function WH(n){return typeof n=="string"?n:Array.isArray(n)?n.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
1858
1858
  `).trim():""}a(WH,"textOf");function Vx(n){let e=new Set;for(let t of n.toLowerCase().split(/[^a-z0-9]+/))t.length<zx||Kx.has(t)||e.add(t);return e}a(Vx,"tokenize");function BH(n){let e=[...n].filter(r=>r.length>=FH);if(e.length>0)return new Set(e);let t="";for(let r of n)(r.length>t.length||r.length===t.length&&r<t)&&(t=r);return t?new Set([t]):new Set}a(BH,"signatureOf");function Gl(n){let e=new Set;for(let t of n)for(let r of t.split("/")){let s=r.replace(/\.[a-z0-9]+$/i,"").toLowerCase();s.length>=zx&&!Kx.has(s)&&e.add(s)}return e}a(Gl,"fileStems");function Jx(n,e){let t=Gl([n]);for(let r of Gl([e]))if(t.has(r))return!0;return!1}a(Jx,"sharesStem");function qH(n){let e=n.evidenceFile!==""?`touched \`${n.evidenceFile}\``:"worked the same area";return[`[skill-miss] Unused project knowledge (${n.memType}, ${n.memId}): "${n.excerpt}"`,`This session ${e} but never referenced it. Apply it, or supersede it via: prjct remember decision "<resolution>" --tags resolves:skill-miss,relates:${n.memId}`].join(`
1859
1859
  `)}a(qH,"formatSkillMiss");function VH(n,e){let t=`${n}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return jH.createHash("sha256").update(t).digest("hex")}a(VH,"hashKey");function JH(n,e){let t=M.recall(n,{types:[...MH],limit:120}),r=Date.now()-NH,s=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>r||e&&o.tags.session===e||s.push({id:o.id,type:o.type,content:o.content,fileTag:o.tags.file??"",rememberedAt:o.rememberedAt,provenance:o.provenance,session:o.tags.session??""}));return s}a(JH,"recallCandidates");function XH(n){try{let e=M.recall(n,{types:["improvement-signal"],tags:{source:Xx},limit:100,dedupeByKey:!1}),t=new Set;for(let r of e)r.tags.key&&t.add(r.tags.key);return t}catch{return new Set}}a(XH,"existingSkillMissKeys");function zH(n){try{let e=rt("node:fs"),r=rt("node:path").join(n,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(r,"utf-8")).projectId??null}catch{return null}}a(zH,"projectIdFromPath");K();ke();import KH from"node:crypto";import YH from"node:fs/promises";var eP="transcript-auto",tP=80,Qx=1500,QH=12,ZH=[{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"}];async function nP(n,e,t,r={}){let s={scanned:0,ingested:0,skipped:[],errors:[]},o=r.preloadedConfig!==void 0?r.preloadedConfig:await x.readConfig(n).catch(()=>null);if(!o?.projectId)return s.errors.push("no project config"),s;let i;if(r.preloadedLines)i=r.preloadedLines;else{let p;try{p=await YH.readFile(e,"utf-8")}catch(m){return s.errors.push(`transcript read failed: ${m.message}`),s}i=Rr(p)}let c=eU(i);if(s.scanned=c.length,c.length===0)return s;let l=rU(c);if(l.length===0)return s;let u=iU(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 M.remember(n,{type:p.type,content:p.content,tags:{source:eP,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}a(nP,"ingestTranscript");function eU(n){let e=[];for(let t of n){let r=tU(t);if(r!=="assistant")continue;let s=nU(t);!s||s.length<tP||e.push({role:r,text:s})}return e}a(eU,"projectMessages");function tU(n){let e=n.role;if(typeof e=="string")return Zx(e);let t=n.message;if(t&&typeof t=="object"&&"role"in t){let s=t.role;if(typeof s=="string")return Zx(s)}let r=n.type;return r==="assistant"||r==="user"||r==="system"?r:null}a(tU,"inferRole");function Zx(n){let e=n.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}a(Zx,"normalizeRole");function nU(n){let e=n.content;if(e===void 0&&n.message&&typeof n.message=="object"&&(e=n.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let r of e){if(!r||typeof r!="object")continue;let s=r;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(`
1860
- `).trim()}return""}a(nU,"extractText");function rU(n){let e=[],t=new Set;for(let r of n){let s=sU(r.text);for(let o of s){if(e.length>=QH)return e;if(o.length<tP)continue;let i=o.toLowerCase(),c=ZH.find(d=>i.includes(d.phrase));if(!c)continue;let l=o.length>Qx?`${o.slice(0,Qx)}\u2026`:o,u=oU(l);t.has(u)||(t.add(u),e.push({type:c.type,content:l,hash:u,matchedPhrase:c.phrase}))}}return e}a(rU,"extractCandidates");function sU(n){return n.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}a(sU,"splitParagraphs");function oU(n){return KH.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}a(oU,"hashContent");function iU(n){let e=new Set;try{let{prjctDb:t}=(J(),st(rr)),{REMEMBER_EVENT_RANGE:r}=(lr(),st(Dw)),s=t.query(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...r);for(let o of s){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==eP)continue;let l=c.hash;typeof l=="string"&&e.add(l)}}catch{}return e}a(iU,"collectExistingAutoHashes");Ln();yn();Bc();function rP(n=process.cwd(),e){return Je({event:"Stop",projectPath:n,afterEmit:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await aU.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Rr(i))}try{await rm(r)}catch{}try{await om(r,s)}catch{}if(t.transcript_path)try{await nP(r,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await Gx(r,s)}catch{}try{await Ox(r,s)}catch{}try{let i=await Bx(s.projectId);await qx(s.projectId,i)}catch{}if(t.transcript_path)try{if((await Dx(r,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:c}=await Promise.resolve().then(()=>(fs(),Rw)),u=(await c(s.projectId,r)).current?.id;u&&ut.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await Yx(r,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await gi.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(Vm(),qm));await i(r,s)}catch{}await oi(r,s.projectId).catch(()=>{})},"afterEmit")},e)}a(rP,"runStopHook");function sP(n=process.cwd(),e){return Je({event:"SubagentStart",projectPath:n,build:a((t,r)=>Sx(r),"build")},e)}a(sP,"runSubagentStartHook");K();fs();Hn();$l();function oP(n=process.cwd(),e){return Je({event:"SubagentStop",projectPath:n,build:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId||oo(s)==="off")return null;let o=[];try{let i=await Cn(s.projectId,r);i.current&&o.push(`active: ${i.current.description}`)}catch{}try{let i=await tt.getActiveTasks(s.projectId);i.length>0&&o.push(`pending: ${i.length}`)}catch{}return await Dl("prjct \u2014 subagent finished",o.join(" \xB7 ")||"A subagent finished"),null},"build")},e)}a(oP,"runSubagentStopHook");var cU={"session-start":Ex,prompt:_x,"pre-commit":xx,"pre-edit":Px,"post-edit":Rx,stop:rP,"subagent-start":sP,"subagent-stop":oP,notification:Cx,"cwd-changed":Tx};function iP(n){return n?cU[n]:void 0}a(iP,"getHookRunner");J();Yg();function aP(n){let e=kt.getAll().map(s=>s.name),t=null,r=1/0;for(let s of e){let o=lU(n.toLowerCase(),s.toLowerCase());o<r&&(r=o,t=s)}return r<=2?t:null}a(aP,"findClosestCommand");function lU(n,e){let t=n.length,r=e.length,s=Array.from({length:t+1},()=>Array(r+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=r;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=r;i++)s[o][i]=n[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][r]}a(lU,"editDistance");function uU(n){return n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}a(uU,"kebab");function cP(n,e){let t=a(s=>n[s]!==void 0?n[s]:n[uU(s)],"pick"),r={md:n.md===!0};for(let s of e.booleans??[])r[s]=t(s)===!0;for(let s of e.strings??[]){let o=t(s);r[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;r[s]=Number.isNaN(i)?void 0:i}return r}a(cP,"mapOptions");var lP={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};function uP(n){return Object.hasOwn(lP,n)}a(uP,"isRemovedVerb");function dP(n){let e=lP[n];return e?`'prjct ${n}' was removed in v2.
1860
+ `).trim()}return""}a(nU,"extractText");function rU(n){let e=[],t=new Set;for(let r of n){let s=sU(r.text);for(let o of s){if(e.length>=QH)return e;if(o.length<tP)continue;let i=o.toLowerCase(),c=ZH.find(d=>i.includes(d.phrase));if(!c)continue;let l=o.length>Qx?`${o.slice(0,Qx)}\u2026`:o,u=oU(l);t.has(u)||(t.add(u),e.push({type:c.type,content:l,hash:u,matchedPhrase:c.phrase}))}}return e}a(rU,"extractCandidates");function sU(n){return n.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}a(sU,"splitParagraphs");function oU(n){return KH.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}a(oU,"hashContent");function iU(n){let e=new Set;try{let{prjctDb:t}=(J(),st(sr)),{REMEMBER_EVENT_RANGE:r}=(ur(),st(Dw)),s=t.query(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...r);for(let o of s){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==eP)continue;let l=c.hash;typeof l=="string"&&e.add(l)}}catch{}return e}a(iU,"collectExistingAutoHashes");Ln();cn();Bc();function rP(n=process.cwd(),e){return Je({event:"Stop",projectPath:n,afterEmit:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await aU.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Rr(i))}try{await rm(r)}catch{}try{await om(r,s)}catch{}if(t.transcript_path)try{await nP(r,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await Gx(r,s)}catch{}try{await Ox(r,s)}catch{}try{let i=await Bx(s.projectId);await qx(s.projectId,i)}catch{}if(t.transcript_path)try{if((await Dx(r,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:c}=await Promise.resolve().then(()=>(fs(),Rw)),u=(await c(s.projectId,r)).current?.id;u&&ut.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await Yx(r,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await gi.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(Vm(),qm));await i(r,s)}catch{}await oi(r,s.projectId).catch(()=>{})},"afterEmit")},e)}a(rP,"runStopHook");function sP(n=process.cwd(),e){return Je({event:"SubagentStart",projectPath:n,build:a((t,r)=>Sx(r),"build")},e)}a(sP,"runSubagentStartHook");K();fs();Hn();$l();function oP(n=process.cwd(),e){return Je({event:"SubagentStop",projectPath:n,build:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId||oo(s)==="off")return null;let o=[];try{let i=await Cn(s.projectId,r);i.current&&o.push(`active: ${i.current.description}`)}catch{}try{let i=await tt.getActiveTasks(s.projectId);i.length>0&&o.push(`pending: ${i.length}`)}catch{}return await Dl("prjct \u2014 subagent finished",o.join(" \xB7 ")||"A subagent finished"),null},"build")},e)}a(oP,"runSubagentStopHook");var cU={"session-start":Ex,prompt:_x,"pre-commit":xx,"pre-edit":Px,"post-edit":Rx,stop:rP,"subagent-start":sP,"subagent-stop":oP,notification:Cx,"cwd-changed":Tx};function iP(n){return n?cU[n]:void 0}a(iP,"getHookRunner");J();Yg();function aP(n){let e=kt.getAll().map(s=>s.name),t=null,r=1/0;for(let s of e){let o=lU(n.toLowerCase(),s.toLowerCase());o<r&&(r=o,t=s)}return r<=2?t:null}a(aP,"findClosestCommand");function lU(n,e){let t=n.length,r=e.length,s=Array.from({length:t+1},()=>Array(r+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=r;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=r;i++)s[o][i]=n[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][r]}a(lU,"editDistance");function uU(n){return n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}a(uU,"kebab");function cP(n,e){let t=a(s=>n[s]!==void 0?n[s]:n[uU(s)],"pick"),r={md:n.md===!0};for(let s of e.booleans??[])r[s]=t(s)===!0;for(let s of e.strings??[]){let o=t(s);r[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;r[s]=Number.isNaN(i)?void 0:i}return r}a(cP,"mapOptions");var lP={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};function uP(n){return Object.hasOwn(lP,n)}a(uP,"isRemovedVerb");function dP(n){let e=lP[n];return e?`'prjct ${n}' was removed in v2.
1861
1861
  \u2192 Use: ${e.replacement}
1862
- ${e.note}`:null}a(dP,"migrationMessage");var dU=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),pU=new Set(["draft","new","create"]);async function pP(n,e,t,r){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,c=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&pU.has(o))return n.spec(i,r,l);if(!o||!dU.has(o))return n.spec(c,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s,lenses:t.lenses?String(t.lenses):void 0});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}a(pP,"routeSpec");async function mP(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(uP(e.command)&&!kt.getByName(e.command))return{success:!1,error:dP(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!kt.getByName(e.command)&&!(e.args.length===0&&aP(e.command)!==null)){let i=[e.command,...e.args.filter(c=>!c.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=kt.getByName(e.command);if(o?.optionSchema)return kt.executeWithOptions(e.command,t,e.cwd,cP(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return pP(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s,lenses:r.lenses?String(r.lenses):void 0}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});default:return kt.execute(e.command,t,e.cwd)}}a(mP,"executeCommand");bl();var yh=class{static{a(this,"RequestJournal")}ttlMs;maxEntries;now;entries=new Map;constructor(e={}){this.ttlMs=e.ttlMs??12e4,this.maxEntries=e.maxEntries??512,this.now=e.now??Date.now}run(e,t){let r=this.now();this.prune(r);let s=mU(e),o=this.entries.get(e.id);if(o){if(o.fingerprint!==s)return Promise.resolve({id:e.id,success:!1,exitCode:1,stderr:"Duplicate daemon request id reused with different payload"});if(o.response)return Promise.resolve(Wl(o.response));if(o.promise)return o.promise.then(Wl)}let i={createdAt:r,fingerprint:s},c=t().then(l=>(i.response=Wl(l),i.promise=void 0,Wl(l))).catch(l=>{throw this.entries.delete(e.id),l});return i.promise=c,this.entries.set(e.id,i),this.enforceMaxEntries(),c}clear(){this.entries.clear()}size(){return this.entries.size}prune(e){for(let[t,r]of this.entries)e-r.createdAt>this.ttlMs&&this.entries.delete(t)}enforceMaxEntries(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(!e)break;this.entries.delete(e)}}};function mU(n){return wh({command:n.command,args:n.args,options:n.options,cwd:n.cwd,stdin:n.stdin})}a(mU,"requestFingerprint");function wh(n){return Array.isArray(n)?`[${n.map(wh).join(",")}]`:n&&typeof n=="object"?`{${Object.entries(n).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${wh(r)}`).join(",")}}`:JSON.stringify(n)}a(wh,"stableStringify");function Wl(n){return{...n}}a(Wl,"cloneResponse");var fP=new yh;bl();import ln from"node:fs";import fU from"node:os";import kn from"node:path";function gP(){let n=__dirname;for(let r=0;r<5;r++){if(ln.existsSync(kn.join(n,"package.json"))){let s=kn.join(n,"dist","daemon","entry.mjs");if(ln.existsSync(s))return s;break}n=kn.dirname(n)}let e=[kn.join(__dirname,"..","daemon","entry.mjs"),kn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(ln.existsSync(r))return r;let t=process.argv[1];return t&&ln.existsSync(t)?t:null}a(gP,"resolveEntryPath");function hP(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}a(hP,"decideRestart");function kh(n,e){if(!n||e===null)return!1;try{return ln.statSync(n).mtimeMs!==e}catch{return!1}}a(kh,"isCodeStale");function yP(){let n=__dirname;for(let e=0;e<6;e++){let t=kn.join(n,"package.json");try{let s=JSON.parse(ln.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=kn.dirname(n);if(r===n)break;n=r}return null}a(yP,"readOwnPackageVersion");function wP(n){if(!n)return!1;let e=fU.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let r of t){let s;try{s=ln.realpathSync(r)}catch{continue}let o=kn.dirname(s);for(let i=0;i<6;i++){let c=kn.join(o,"package.json");try{let u=JSON.parse(ln.readFileSync(c,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=kn.dirname(o);if(l===o)break;o=l}}return!1}a(wP,"isGlobalVersionDrifted");var gU=1024*1024;function kP(){let n=We.log();try{if(ln.statSync(n).size>gU){let t=`${n}.1`;try{ln.unlinkSync(t)}catch{}ln.renameSync(n,t)}}catch{}}a(kP,"rotateLog");function bP(n){try{return process.kill(n,0),!0}catch{return!1}}a(bP,"isProcessRunning");var yU=50,wU=1e3,uo=null,Mi=null,le=null,lo=null,vP=0,SP=Promise.resolve();async function TP(n){process.env.PRJCT_IN_DAEMON="1";let e=We.socket(),t=We.pid(),r=We.runDir(),s=Tr(e);if(Ut.mkdirSync(r,{recursive:!0}),Ut.existsSync(t)){let c=parseInt(Ut.readFileSync(t,"utf-8").trim(),10);bP(c)&&(console.error(`Daemon already running (PID ${c})`),process.exit(1)),Ut.unlinkSync(t)}!s&&Ut.existsSync(e)&&Ut.unlinkSync(e),kP();let o=gP(),i=null;if(o)try{i=Ut.statSync(o).mtimeMs}catch{}if(lo=yP(),le={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:$C,idleTimer:null,entryPath:o,entryMtime:i,activeRequests:0,restartPending:!1},lo)try{let{isSyncCurrent:c,runSelfHeal:l}=await Promise.resolve().then(()=>(fh(),mx));c(lo)||await l(lo)}catch{}if(Mi=new Ei,uo=hU(c=>kU(c)),uo.listen(e,()=>{s||Ut.chmodSync(e,384),Ut.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),o&&console.log(` Watching: ${o}`),CP(),Il.startAll().catch(()=>{})}),uo.on("error",c=>{console.error("Daemon socket error:",c.message),cs(1)}),process.on("SIGTERM",()=>cs(0)),process.on("SIGINT",()=>cs(0)),process.on("SIGHUP",()=>{Mi=new Ei,ax(),kt.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}a(TP,"startDaemon");function kU(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>MC){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(Zs(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
1862
+ ${e.note}`:null}a(dP,"migrationMessage");var dU=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),pU=new Set(["draft","new","create"]);async function pP(n,e,t,r){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,c=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&pU.has(o))return n.spec(i,r,l);if(!o||!dU.has(o))return n.spec(c,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s,lenses:t.lenses?String(t.lenses):void 0});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}a(pP,"routeSpec");async function mP(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(uP(e.command)&&!kt.getByName(e.command))return{success:!1,error:dP(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!kt.getByName(e.command)&&!(e.args.length===0&&aP(e.command)!==null)){let i=[e.command,...e.args.filter(c=>!c.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=kt.getByName(e.command);if(o?.optionSchema)return kt.executeWithOptions(e.command,t,e.cwd,cP(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return pP(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s,lenses:r.lenses?String(r.lenses):void 0}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});default:return kt.execute(e.command,t,e.cwd)}}a(mP,"executeCommand");bl();var yh=class{static{a(this,"RequestJournal")}ttlMs;maxEntries;now;entries=new Map;constructor(e={}){this.ttlMs=e.ttlMs??12e4,this.maxEntries=e.maxEntries??512,this.now=e.now??Date.now}run(e,t){let r=this.now();this.prune(r);let s=mU(e),o=this.entries.get(e.id);if(o){if(o.fingerprint!==s)return Promise.resolve({id:e.id,success:!1,exitCode:1,stderr:"Duplicate daemon request id reused with different payload"});if(o.response)return Promise.resolve(Wl(o.response));if(o.promise)return o.promise.then(Wl)}let i={createdAt:r,fingerprint:s},c=t().then(l=>(i.response=Wl(l),i.promise=void 0,Wl(l))).catch(l=>{throw this.entries.delete(e.id),l});return i.promise=c,this.entries.set(e.id,i),this.enforceMaxEntries(),c}clear(){this.entries.clear()}size(){return this.entries.size}prune(e){for(let[t,r]of this.entries)e-r.createdAt>this.ttlMs&&this.entries.delete(t)}enforceMaxEntries(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(!e)break;this.entries.delete(e)}}};function mU(n){return wh({command:n.command,args:n.args,options:n.options,cwd:n.cwd,stdin:n.stdin})}a(mU,"requestFingerprint");function wh(n){return Array.isArray(n)?`[${n.map(wh).join(",")}]`:n&&typeof n=="object"?`{${Object.entries(n).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${wh(r)}`).join(",")}}`:JSON.stringify(n)}a(wh,"stableStringify");function Wl(n){return{...n}}a(Wl,"cloneResponse");var fP=new yh;bl();import un from"node:fs";import fU from"node:os";import kn from"node:path";function gP(){let n=__dirname;for(let r=0;r<5;r++){if(un.existsSync(kn.join(n,"package.json"))){let s=kn.join(n,"dist","daemon","entry.mjs");if(un.existsSync(s))return s;break}n=kn.dirname(n)}let e=[kn.join(__dirname,"..","daemon","entry.mjs"),kn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(un.existsSync(r))return r;let t=process.argv[1];return t&&un.existsSync(t)?t:null}a(gP,"resolveEntryPath");function hP(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}a(hP,"decideRestart");function kh(n,e){if(!n||e===null)return!1;try{return un.statSync(n).mtimeMs!==e}catch{return!1}}a(kh,"isCodeStale");function yP(){let n=__dirname;for(let e=0;e<6;e++){let t=kn.join(n,"package.json");try{let s=JSON.parse(un.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=kn.dirname(n);if(r===n)break;n=r}return null}a(yP,"readOwnPackageVersion");function wP(n){if(!n)return!1;let e=fU.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let r of t){let s;try{s=un.realpathSync(r)}catch{continue}let o=kn.dirname(s);for(let i=0;i<6;i++){let c=kn.join(o,"package.json");try{let u=JSON.parse(un.readFileSync(c,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=kn.dirname(o);if(l===o)break;o=l}}return!1}a(wP,"isGlobalVersionDrifted");var gU=1024*1024;function kP(){let n=We.log();try{if(un.statSync(n).size>gU){let t=`${n}.1`;try{un.unlinkSync(t)}catch{}un.renameSync(n,t)}}catch{}}a(kP,"rotateLog");function bP(n){try{return process.kill(n,0),!0}catch{return!1}}a(bP,"isProcessRunning");var yU=50,wU=1e3,uo=null,Mi=null,le=null,lo=null,vP=0,SP=Promise.resolve();async function TP(n){process.env.PRJCT_IN_DAEMON="1";let e=We.socket(),t=We.pid(),r=We.runDir(),s=Tr(e);if(Ut.mkdirSync(r,{recursive:!0}),Ut.existsSync(t)){let c=parseInt(Ut.readFileSync(t,"utf-8").trim(),10);bP(c)&&(console.error(`Daemon already running (PID ${c})`),process.exit(1)),Ut.unlinkSync(t)}!s&&Ut.existsSync(e)&&Ut.unlinkSync(e),kP();let o=gP(),i=null;if(o)try{i=Ut.statSync(o).mtimeMs}catch{}if(lo=yP(),le={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:$C,idleTimer:null,entryPath:o,entryMtime:i,activeRequests:0,restartPending:!1},lo)try{let{isSyncCurrent:c,runSelfHeal:l}=await Promise.resolve().then(()=>(fh(),mx));c(lo)||await l(lo)}catch{}if(Mi=new Ei,uo=hU(c=>kU(c)),uo.listen(e,()=>{s||Ut.chmodSync(e,384),Ut.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),o&&console.log(` Watching: ${o}`),CP(),Il.startAll().catch(()=>{})}),uo.on("error",c=>{console.error("Daemon socket error:",c.message),cs(1)}),process.on("SIGTERM",()=>cs(0)),process.on("SIGINT",()=>cs(0)),process.on("SIGHUP",()=>{Mi=new Ei,ax(),kt.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}a(TP,"startDaemon");function kU(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>MC){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(Zs(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
1863
1863
  `))!==-1;){let s=e.slice(0,r);if(e=e.slice(r+1),!!s.trim())try{let o=JSON.parse(s),i=await vU(o);n.write(Zs(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(Zs(i))}}}),n.on("error",()=>{})}a(kU,"handleConnection");function bU(n){if(!le||le.restartPending)return;let e=kh(le.entryPath,le.entryMtime),t=hP({codeStale:e,command:n,ownVersion:lo,now:Date.now(),lastDriftCheckMs:vP,driftMinIntervalMs:wU,checkDrift:wP});vP=t.lastDriftCheckMs,t.restart&&(le.restartPending=!0,console.log(e?"Build change detected \u2014 daemon will restart; request runs on fresh code.":`Version drift detected \u2014 daemon v${lo} is stale; request runs on fresh code.`))}a(bU,"markStaleIfNeeded");async function vU(n){return!le||!Mi?{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"}:(bU(n.command),le.restartPending&&n.command!=="daemon"&&n.command!=="__ping"?(le.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>cs(0))),{id:n.id,success:!1,exitCode:1,retry:!0,stderr:"daemon code is stale \u2014 running directly"}):fP.run(n,async()=>{le.activeRequests++;try{let e=SP.then(()=>EP(n),()=>EP(n));return SP=e.then(()=>{},()=>{}),await e}finally{le.activeRequests--,le.restartPending&&le.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>cs(0)))}}))}a(vU,"handleRequest");async function EP(n){if(!le||!Mi)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(CP(),le.commandsServed++,le.lastActivity=Date.now(),le.commandsServed%yU===0&&b.checkpointAll(),n.command==="daemon")return EU(n);if(n.command==="hook")return SU(n);if(n.command==="__ping")return{id:n.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],r=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await mP(Mi,n);return{id:n.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1864
1864
  `)||o.message||void 0,stderr:t.join(`
1865
1865
  `)||o.error||void 0,result:o}}finally{console.log=r,console.error=s}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}a(EP,"handleRequestInner");async function SU(n){let e=iP(n.args[0]);if(!e)return{id:n.id,success:!0,exitCode:0,stdout:`{}