prjct-cli 3.59.0 → 3.59.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [3.59.1] - 2026-07-14
6
+
7
+ ### Bug Fixes
8
+
9
+ - bench-ab interleaved A/B reps + confirm pass — kill phantom regressions (#567)
10
+
11
+
5
12
  ## [3.59.0] - 2026-07-14
6
13
 
7
14
  ### Added
@@ -17,7 +17,7 @@ ${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.index
17
17
  `)}
18
18
  `}var FW,px,HW,UW,vn,mx,fx,hx,yx,kx,bx,Dh=y(()=>{"use strict";wr();to();FW=Ah.join("/"),px="Generated with [p/](https://www.prjct.app/)",HW="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",UW="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",vn={rag:"prjct is a RAG-backed project memory harness; do not preload project history.",entrypoint:'`prjct work "<intent>" --md` is the single entrypoint \u2014 recognize intent and run the verb yourself.',pull:"Pull only what surfaces: `prjct search` / `context memory` / `guard` / MCP \u2014 not something to load wholesale.",remember:'Save synthesized memory in English: `prjct remember <decision|learning|gotcha|context> "<text>"`.',kb:`KB (\`${FW}\`): \`remember <facet>\` / \`context memory <facet>\` \u2014 on demand, never injected here.`,ship:"Ship only after user OKs: `prjct ship --md`.",loop:"Loop: land; H2+ intent; tip\u2192user SoT; close.",identity:"L0 portable; id=cwd."};a(Dd,"buildCompactSkill");mx=Dd,fx=Dd;a(gx,"buildGlobalConfig");hx=a(()=>gx("Gemini"),"buildGeminiConfig"),yx=a(()=>gx("Antigravity"),"buildAntigravityConfig");a(wx,"buildIdePointer");kx=a(()=>wx(`description: "prjct \u2014 pull project memory + workflow on demand"
19
19
  alwaysApply: true`),"buildCursorRule"),bx=a(()=>wx(`trigger: always_on
20
- description: "prjct \u2014 pull project memory + workflow on demand"`),"buildWindsurfRule")});var Ai={};R(Ai,{PACKAGE_ROOT:()=>Pn,VERSION:()=>Se,getPackageRoot:()=>Mh,getVersion:()=>ro,resetPackageRoot:()=>Lh});import Oh from"node:fs";import Od from"node:path";function Mh(){if(_i)return _i;let n=__dirname;for(let e=0;e<5;e++){let t=Od.join(n,"package.json");if(Oh.existsSync(t))try{if(JSON.parse(Oh.readFileSync(t,"utf-8")).name==="prjct-cli")return _i=n,n}catch{}n=Od.dirname(n)}return _i=Od.join(__dirname,"..","..",".."),_i}function ro(){if(no)return no;let n="3.59.0";if(n&&/^\d+\.\d+\.\d+/.test(n))return no=n,no;try{let e=Od.join(Mh(),"package.json");return no=JSON.parse(Oh.readFileSync(e,"utf-8")).version,no}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",E(e)),"0.0.0"}}function Lh(n){_i=n,no=null}var no,_i,Se,Pn,ut=y(()=>{"use strict";V();no=null,_i=null;a(Mh,"getPackageRoot");a(ro,"getVersion");a(Lh,"resetPackageRoot");Se=ro(),Pn=Mh()});var Hd={};R(Hd,{default:()=>zW,getTemplateContent:()=>Rt,listTemplates:()=>Fd,resetBundle:()=>VW});import Hh from"node:fs";import WW from"node:fs/promises";import Ld from"node:path";function Uh(){if(Fh)return Md;Fh=!0;let n=Ld.join(Pn,"dist","templates.json");try{let e=Hh.readFileSync(n,"utf-8");return Md=JSON.parse(e),Md}catch{return null}}function GW(n){let e=so.indexOf(n);e>-1&&so.splice(e,1),so.push(n)}function qW(){for(;Ii.size>=BW&&so.length>0;){let n=so.shift();n&&Ii.delete(n)}}function vx(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(`
20
+ description: "prjct \u2014 pull project memory + workflow on demand"`),"buildWindsurfRule")});var Ai={};R(Ai,{PACKAGE_ROOT:()=>Pn,VERSION:()=>Se,getPackageRoot:()=>Mh,getVersion:()=>ro,resetPackageRoot:()=>Lh});import Oh from"node:fs";import Od from"node:path";function Mh(){if(_i)return _i;let n=__dirname;for(let e=0;e<5;e++){let t=Od.join(n,"package.json");if(Oh.existsSync(t))try{if(JSON.parse(Oh.readFileSync(t,"utf-8")).name==="prjct-cli")return _i=n,n}catch{}n=Od.dirname(n)}return _i=Od.join(__dirname,"..","..",".."),_i}function ro(){if(no)return no;let n="3.59.1";if(n&&/^\d+\.\d+\.\d+/.test(n))return no=n,no;try{let e=Od.join(Mh(),"package.json");return no=JSON.parse(Oh.readFileSync(e,"utf-8")).version,no}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",E(e)),"0.0.0"}}function Lh(n){_i=n,no=null}var no,_i,Se,Pn,ut=y(()=>{"use strict";V();no=null,_i=null;a(Mh,"getPackageRoot");a(ro,"getVersion");a(Lh,"resetPackageRoot");Se=ro(),Pn=Mh()});var Hd={};R(Hd,{default:()=>zW,getTemplateContent:()=>Rt,listTemplates:()=>Fd,resetBundle:()=>VW});import Hh from"node:fs";import WW from"node:fs/promises";import Ld from"node:path";function Uh(){if(Fh)return Md;Fh=!0;let n=Ld.join(Pn,"dist","templates.json");try{let e=Hh.readFileSync(n,"utf-8");return Md=JSON.parse(e),Md}catch{return null}}function GW(n){let e=so.indexOf(n);e>-1&&so.splice(e,1),so.push(n)}function qW(){for(;Ii.size>=BW&&so.length>0;){let n=so.shift();n&&Ii.delete(n)}}function vx(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(`
21
21
  `).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 Ex(n){if(Ii.has(n))return GW(n),Ii.get(n);let e,t=Uh();if(t){let s=`commands/${n}.md`;e=t[s]}if(!e){let s=Ld.join(Pn,"templates","commands",`${n}.md`);try{e=await WW.readFile(s,"utf-8")}catch{throw Id.notFound(n)}}let r=vx(e);return qW(),Ii.set(n,r),so.push(n),r}async function XW(n){return(await Ex(n)).frontmatter["allowed-tools"]||[]}function Sx(){Ii.clear(),so.length=0}function VW(){Md=null,Fh=!1,Sx()}function Rt(n){let e=Uh();if(e?.[n])return e[n];let t=JW(n);if(t)return t;let r=Ld.join(Pn,"templates",n);try{return Hh.readFileSync(r,"utf-8")}catch{return null}}function JW(n){switch(n){case"codex/SKILL.md":return mx();case"antigravity/SKILL.md":return fx();case"global/GEMINI.md":return hx();case"global/ANTIGRAVITY.md":return yx();case"global/CURSOR.mdc":return kx();case"global/WINDSURF.md":return bx();default:return null}}function Fd(n){let e=Uh();if(e)return Object.keys(e).filter(r=>r.startsWith(n));let t=Ld.join(Pn,"templates",n);try{return Hh.readdirSync(t).map(s=>`${n}${s}`)}catch{return[]}}var BW,Ii,so,Md,Fh,KW,zW,zn=y(()=>{"use strict";Xr();Dh();ut();BW=50,Ii=new Map,so=[],Md=null,Fh=!1;a(Uh,"loadBundle");a(GW,"updateLruOrder");a(qW,"evictLru");a(vx,"parseFrontmatter");a(Ex,"load");a(XW,"getAllowedTools");a(Sx,"clearCache");a(VW,"resetBundle");a(Rt,"getTemplateContent");a(JW,"getGeneratedTemplateContent");a(Fd,"listTemplates");KW={load:Ex,parseFrontmatter:vx,getAllowedTools:XW,clearCache:Sx,getTemplateContent:Rt,listTemplates:Fd},zW=KW});var Ud=y(()=>{"use strict"});var Rx={};R(Rx,{resolveUserHome:()=>kr,resolveUserPath:()=>Re});import YW from"node:os";import Tx from"node:path";function kr(){let n=process.env.HOME?.trim()||process.env.USERPROFILE?.trim();return n?Tx.resolve(n):YW.homedir()}function Re(...n){return Tx.join(kr(),...n)}var jn=y(()=>{"use strict";a(kr,"resolveUserHome");a(Re,"resolveUserPath")});var Cx,xx,_x,Wh=y(()=>{"use strict";Cx=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"]),xx=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],_x=/(?:import|from)\s+['"]([^'"]+)['"]/g});import Px from"node:fs/promises";async function jx(n,e){let t;try{t=await Px.readFile(n,"utf-8")}catch(o){if(te(o))return null;throw o}let r;try{r=JSON.parse(t)}catch{return await Ax(n,t),Ix(n,"Malformed JSON"),null}let s=e.safeParse(r);return s.success?r:(await Ax(n,t),Ix(n,QW(s.error)),null)}async function Ax(n,e){let t=`${n}.backup`;try{await Px.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function Ix(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 QW(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var $x=y(()=>{"use strict";V();a(jx,"safeRead");a(Ax,"createBackup");a(Ix,"logCorruption");a(QW,"formatZodError")});var $n={};R($n,{batchProcess:()=>Vr,dirExists:()=>ht,ensureDir:()=>en,fileExists:()=>A,listFiles:()=>Kr,readFile:()=>En,readJson:()=>Ke,walkDir:()=>Yn,writeFile:()=>Jr,writeFileAtomic:()=>oo,writeJson:()=>Le});import Zt from"node:fs/promises";import Tc from"node:path";async function Bh(n,e,t){try{return await t()}catch(r){throw $h(r)||jh(r)?new Error(xi(r,n,e)):r}}async function Yn(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 Zt.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of c){if(t.length>=r)break;let u=String(l.name);if(Cx.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!s||!s.has(u)))continue;let d=Tc.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(Tc.relative(n,d))}}return a(o,"walk"),await o(n),t}async function Vr(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 Ke(n,e=null,t){if(t)return await jx(n,t)??e;try{let r=await Zt.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(te(r))return e;throw r}}async function Le(n,e,t=2){await Bh(n,"config",async()=>{let r=Tc.dirname(n);await Zt.mkdir(r,{recursive:!0});let s=`${JSON.stringify(e,null,t)}
22
22
  `;await Zt.writeFile(n,s,"utf-8")})}async function En(n,e=""){try{return await Zt.readFile(n,"utf-8")}catch(t){if(te(t))return e;throw t}}async function Jr(n,e){await Bh(n,"file",async()=>{let t=Tc.dirname(n);await Zt.mkdir(t,{recursive:!0}),await Zt.writeFile(n,e,"utf-8")})}async function oo(n,e){await Bh(n,"file",async()=>{let t=Tc.dirname(n);await Zt.mkdir(t,{recursive:!0});let r=`${n}.tmp`;await Zt.writeFile(r,e,"utf-8"),await Zt.rename(r,n)})}async function A(n){try{return await Zt.access(n),!0}catch(e){if(te(e))return!1;throw e}}async function ht(n){try{return(await Zt.stat(n)).isDirectory()}catch(e){if(te(e))return!1;throw e}}async function en(n){await Zt.mkdir(n,{recursive:!0})}async function Kr(n,e={}){try{let r=await Zt.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(te(t))return[];throw t}}var re=y(()=>{"use strict";Wh();$x();V();a(Bh,"withWriteErrorContext");a(Yn,"walkDir");a(Vr,"batchProcess");a(Ke,"readJson");a(Le,"writeJson");a(En,"readFile");a(Jr,"writeFile");a(oo,"writeFileAtomic");a(A,"fileExists");a(ht,"dirExists");a(en,"ensureDir");a(Kr,"listFiles")});var Gh,Nx=y(()=>{"use strict";Gh="mcp-remote@0.1.38"});import ZW from"node:fs";import eB from"node:fs/promises";import Dx from"node:os";import zr from"node:path";function tB(){let n=nB();if(n)return{command:n,args:["mcp-server"],description:qh};try{let e=zr.dirname(wn.resolve("prjct-cli/package.json"));return{command:zr.join(e,"bin","prjct"),args:["mcp-server"],description:qh}}catch{return{command:"npx",args:["-y","prjct-cli","mcp-server"],description:qh}}}function nB(){let n=process.argv[1],e=[n?zr.resolve(zr.dirname(n),"prjct"):"",n?zr.resolve(zr.dirname(n),"..","bin","prjct"):"",zr.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let t of e)if(ZW.existsSync(t))return t;return null}function Pi(){return process.env.PRJCT_TEST_MODE==="1"?zr.join(Dx.tmpdir(),"prjct-context7-test","mcp.json"):zr.join(Dx.homedir(),".claude","mcp.json")}async function Ox(n=Pi()){try{let e=await eB.readFile(n,"utf-8");return JSON.parse(e)}catch(e){let t=E(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${n}: ${E(e)}`)}}async function rB(n,e=Pi()){await Le(e,n)}async function Rc(n,e,t=Pi()){let r=await Ox(t),s={...r.mcpServers||{}},o=s[n];s[n]=e,r.mcpServers=s;let i=JSON.stringify(o)!==JSON.stringify(e);return await rB(r,t),{path:t,changed:i}}async function Mx(n,e=Pi()){return!!(await Ox(e)).mcpServers?.[n]}var qh,Nn,ji=y(()=>{"use strict";V();re();Nx();qh="prjct: AI Agile OS with project memory, workflow gates, intent briefs, and performance context. Use prjct_task_start as the MCP entrypoint for a work cycle; prjct retrieves focused context, persists evidence stations, and keeps humans in the loop for risky gates. Agents resume from prjct_task_status/workflow output, create or link reviewed intent/spec briefs when required, and persist synthesized learning instead of raw transcript fragments.";a(tB,"getPrjctMcpConfig");a(nB,"resolveLocalPrjctBin");Nn={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:tB(),linear:{command:"npx",args:["-y",Gh,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Gh,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};a(Pi,"getClaudeMcpConfigPath");a(Ox,"readMcpConfig");a(rB,"writeMcpConfig");a(Rc,"upsertMcpServer");a(Mx,"hasMcpServer")});var Jx={};R(Jx,{buildCodexStatusLineToml:()=>Vx,buildContext7McpTomlBlock:()=>qx,buildPrjctMcpTomlBlock:()=>Gx,codexHasContext7Server:()=>Vh,ensureCodexContext7Server:()=>xc,ensureCodexMcpServer:()=>Cc,getCodexConfigTomlPath:()=>Qn});import io from"node:fs/promises";import Xh from"node:path";function Qn(){return process.env.PRJCT_TEST_MODE==="1"?Xh.join(Re(".prjct-tests"),"codex","config.toml"):Re(".codex","config.toml")}function Wd(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function Bx(n,e,t,r){let s=(e.args??[]).map(Wd).join(", ");return[t,`[mcp_servers.${n}]`,`command = ${Wd(e.command)}`,`args = [${s}]`,r,""].join(`
23
23
  `)}function Gx(n=Nn.prjct){return Bx("prjct",n,Lx,Fx)}function qx(n=Nn.context7){return Bx("context7",n,Hx,Ux)}function Xx(n,e,t,r,s){let o=n.indexOf(t),i=n.indexOf(r);if(o!==-1&&i!==-1&&i>o){let c=n.slice(0,o),l=n.slice(i+r.length);return l.startsWith(`
@@ -2941,7 +2941,7 @@ ${vi.dim("Providers:")}`}var oee,UC=y(()=>{"use strict";oee={ready:vi.green("\u2
2941
2941
  ${s.dim("Run 'prjct start' to configure global/runtime adapters")}
2942
2942
  ${s.dim("Run 'prjct init' or 'prjct sync' to refresh AGENTS.md and project-level rules")}
2943
2943
  ${s.cyan("https://prjct.app")}
2944
- `)}else return!1;return!0}var sW=y(()=>{"use strict";a(iee,"runBinCommand")});var oW=hW((MHe,aee)=>{aee.exports={name:"prjct-cli",version:"3.59.0",description:"Project memory and workflow context for AI coding agents.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct.cjs"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:unit":"bun test --path-ignore-patterns='**/e2e/**'","test:fast":"bun test --path-ignore-patterns='**/e2e/**' --dots","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/","bench:ab":"bun scripts/bench-ab.ts","bench:weak-model":"bun scripts/bench-weak-model.ts","demo:weak-vs-frontier":"bun scripts/demo-weak-vs-frontier.ts","harness:score":"bun bin/prjct.ts harness score --md","gate:dominance":"bun test core/__tests__/services/weak-model-bench.test.ts core/__tests__/services/weak-frontier-demo.test.ts core/__tests__/services/harness-score.test.ts core/__tests__/services/dynasty-outcomes.test.ts core/__tests__/services/content-bound-stamp.test.ts core/__tests__/services/sot-bind.test.ts core/__tests__/services/trap-surface-slo.test.ts core/__tests__/services/impact-ready.test.ts core/__tests__/services/delivery-geometry.test.ts core/__tests__/services/cycle-budget-card.test.ts core/__tests__/services/land-rho.test.ts core/__tests__/services/one-breath-install.test.ts core/__tests__/services/doctor-heal.test.ts && bun run bench:weak-model && bun run demo:weak-vs-frontier"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:{name:"Juan Jos\xE9 L\xF3pez Lira",email:"jlopezlira@gmail.com",url:"https://prjct.app"},contributors:[{name:"prjct.app contributors"}],license:"MIT",licenses:[{type:"MIT",url:"https://opensource.org/licenses/MIT"}],dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:"4.12.27","ip-address":">=10.1.1",qs:"6.15.2"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.28.1",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/prjct-app/cli.git"},bugs:{url:"https://github.com/prjct-app/cli/issues"},homepage:"https://cli.prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.5.0"},files:["assets/","bin/prjct","bin/prjct.cjs","dist/","templates/","scripts/install.sh","LICENSE","NOTICE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var mee={};import iW from"node:os";import bh from"node:path";import Ei from"chalk";async function cee(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>yW(oW()));await dee(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(pee(),process.exit(0)),n&&Mu(n)&&!_t.getByName(n)){let r=Ou[n];r&&(g.failWithHint({message:`'prjct ${n}' was removed in v2. ${r.note}`,hint:`Use: ${r.replacement}`}),process.exit(1))}if(n&&!_t.getByName(n)&&!(e.length===0&&pd(n)!==null)){let s=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[s,...o]}let t=e.includes("--md");t||g.start();try{let r=_t.getByName(n);if(!r){let m=pd(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(Ac("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||g.end(),process.exit(1)}if(r.deprecated){let m=r.replacedBy?`Use 'prjct ${r.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}r.implemented||(g.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/prjct-app/cli"}),t||g.end(),process.exit(1));let{parsedArgs:s,options:o}=uee(r,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;r.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let c=lee(r,s);c&&(g.failWithHint(c),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await _.getProjectId(process.cwd()),l&&(await ti.expireIfStale(l),await ti.touch(l))}catch{}let d=new hi,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update"||n==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,h=_t.getByName(n);if(h?.optionSchema)p=await _t.executeWithOptions(n,m,process.cwd(),mh(o,h.optionSchema));else{let k={spec:a(b=>md(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),intent:a(b=>md(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"intent"),"audit-spec":a(b=>b?d.specAudit(b,process.cwd(),{md:f,lenses:o.lenses?String(o.lenses):void 0}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:a(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),sync:a(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":a(b=>b?d.saveLlmAnalysis(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"}),"analysis-save-llm"),start:a(()=>d.start(),"start"),login:a(()=>d.login({md:f}),"login"),logout:a(()=>d.logout(),"logout"),auth:a(b=>d.auth(b,{md:f}),"auth")}[n];if(k)p=await k(m);else throw new Error(`Command '${n}' has no handler`)}}if(l){let m=Date.now()-u;try{await ti.trackCommand(l,n,m)}catch{}try{await Lu.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let h=Number(process.hrtime.bigint()-f)/1e6;await Lu.recordTiming(l,"startup_time",h)}await Lu.recordMemory(l,{command:n})}catch{}}p?.message?console.log(p.message):p?.error&&console.error(p.error),t||g.end(),process.exit(p?.success?0:1)}catch(r){console.error("Error:",E(r)),process.env.DEBUG&&console.error(Nh(r)),t||g.end(),process.exit(1)}}function lee(n,e){if(!n.params)return null;let r=n.params.replace(/\[[^\]]*\]/g,"").match(/<[^>]+>/g);if(!r||r.length===0)return null;if(e.length<r.length){let s=r.map(i=>i.slice(1,-1)).join(", "),o=n.usage.terminal||`prjct ${n.name} ${n.params}`;return Ac("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${o}`})}return null}function uee(n,e){let t=[],r={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?r[i]=e[++s]:r[i]=!0}else t.push(o)}return{parsedArgs:t,options:r}}async function dee(n){let e=await lo(),t=bh.join(iW.homedir(),".claude","commands","p.md"),r=bh.join(iW.homedir(),".gemini","commands","p.toml"),[s,o,i,c]=await Promise.all([A(t),A(r),A(bh.join(process.cwd(),".cursor","commands","sync.md")),A(bh.join(process.cwd(),".cursor"))]),l=await Nc();console.log(HC(n)),console.log(fc("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?Ei.dim(` (v${e.claude.version})`):"")),console.log(fc("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?Ei.dim(` (v${e.gemini.version})`):"")),console.log(fc("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${Ei.dim("(run prjct start)")}`:"")),console.log(fc("Cursor IDE",i?"ready":c?"detected":"missing",i?` ${Ei.dim("(use prjct router)")}`:c?` ${Ei.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
2944
+ `)}else return!1;return!0}var sW=y(()=>{"use strict";a(iee,"runBinCommand")});var oW=hW((MHe,aee)=>{aee.exports={name:"prjct-cli",version:"3.59.1",description:"Project memory and workflow context for AI coding agents.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct.cjs"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:unit":"bun test --path-ignore-patterns='**/e2e/**'","test:fast":"bun test --path-ignore-patterns='**/e2e/**' --dots","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/","bench:ab":"bun scripts/bench-ab.ts","bench:weak-model":"bun scripts/bench-weak-model.ts","demo:weak-vs-frontier":"bun scripts/demo-weak-vs-frontier.ts","harness:score":"bun bin/prjct.ts harness score --md","gate:dominance":"bun test core/__tests__/services/weak-model-bench.test.ts core/__tests__/services/weak-frontier-demo.test.ts core/__tests__/services/harness-score.test.ts core/__tests__/services/dynasty-outcomes.test.ts core/__tests__/services/content-bound-stamp.test.ts core/__tests__/services/sot-bind.test.ts core/__tests__/services/trap-surface-slo.test.ts core/__tests__/services/impact-ready.test.ts core/__tests__/services/delivery-geometry.test.ts core/__tests__/services/cycle-budget-card.test.ts core/__tests__/services/land-rho.test.ts core/__tests__/services/one-breath-install.test.ts core/__tests__/services/doctor-heal.test.ts && bun run bench:weak-model && bun run demo:weak-vs-frontier"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:{name:"Juan Jos\xE9 L\xF3pez Lira",email:"jlopezlira@gmail.com",url:"https://prjct.app"},contributors:[{name:"prjct.app contributors"}],license:"MIT",licenses:[{type:"MIT",url:"https://opensource.org/licenses/MIT"}],dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:"4.12.27","ip-address":">=10.1.1",qs:"6.15.2"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.28.1",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/prjct-app/cli.git"},bugs:{url:"https://github.com/prjct-app/cli/issues"},homepage:"https://cli.prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.5.0"},files:["assets/","bin/prjct","bin/prjct.cjs","dist/","templates/","scripts/install.sh","LICENSE","NOTICE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var mee={};import iW from"node:os";import bh from"node:path";import Ei from"chalk";async function cee(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>yW(oW()));await dee(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(pee(),process.exit(0)),n&&Mu(n)&&!_t.getByName(n)){let r=Ou[n];r&&(g.failWithHint({message:`'prjct ${n}' was removed in v2. ${r.note}`,hint:`Use: ${r.replacement}`}),process.exit(1))}if(n&&!_t.getByName(n)&&!(e.length===0&&pd(n)!==null)){let s=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[s,...o]}let t=e.includes("--md");t||g.start();try{let r=_t.getByName(n);if(!r){let m=pd(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(Ac("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||g.end(),process.exit(1)}if(r.deprecated){let m=r.replacedBy?`Use 'prjct ${r.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}r.implemented||(g.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/prjct-app/cli"}),t||g.end(),process.exit(1));let{parsedArgs:s,options:o}=uee(r,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;r.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let c=lee(r,s);c&&(g.failWithHint(c),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await _.getProjectId(process.cwd()),l&&(await ti.expireIfStale(l),await ti.touch(l))}catch{}let d=new hi,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update"||n==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,h=_t.getByName(n);if(h?.optionSchema)p=await _t.executeWithOptions(n,m,process.cwd(),mh(o,h.optionSchema));else{let k={spec:a(b=>md(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),intent:a(b=>md(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"intent"),"audit-spec":a(b=>b?d.specAudit(b,process.cwd(),{md:f,lenses:o.lenses?String(o.lenses):void 0}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:a(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),sync:a(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":a(b=>b?d.saveLlmAnalysis(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"}),"analysis-save-llm"),start:a(()=>d.start(),"start"),login:a(()=>d.login({md:f}),"login"),logout:a(()=>d.logout(),"logout"),auth:a(b=>d.auth(b,{md:f}),"auth")}[n];if(k)p=await k(m);else throw new Error(`Command '${n}' has no handler`)}}if(l){let m=Date.now()-u;try{await ti.trackCommand(l,n,m)}catch{}try{await Lu.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let h=Number(process.hrtime.bigint()-f)/1e6;await Lu.recordTiming(l,"startup_time",h)}await Lu.recordMemory(l,{command:n})}catch{}}p?.message?console.log(p.message):p?.error&&console.error(p.error),t||g.end(),process.exit(p?.success?0:1)}catch(r){console.error("Error:",E(r)),process.env.DEBUG&&console.error(Nh(r)),t||g.end(),process.exit(1)}}function lee(n,e){if(!n.params)return null;let r=n.params.replace(/\[[^\]]*\]/g,"").match(/<[^>]+>/g);if(!r||r.length===0)return null;if(e.length<r.length){let s=r.map(i=>i.slice(1,-1)).join(", "),o=n.usage.terminal||`prjct ${n.name} ${n.params}`;return Ac("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${o}`})}return null}function uee(n,e){let t=[],r={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?r[i]=e[++s]:r[i]=!0}else t.push(o)}return{parsedArgs:t,options:r}}async function dee(n){let e=await lo(),t=bh.join(iW.homedir(),".claude","commands","p.md"),r=bh.join(iW.homedir(),".gemini","commands","p.toml"),[s,o,i,c]=await Promise.all([A(t),A(r),A(bh.join(process.cwd(),".cursor","commands","sync.md")),A(bh.join(process.cwd(),".cursor"))]),l=await Nc();console.log(HC(n)),console.log(fc("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?Ei.dim(` (v${e.claude.version})`):"")),console.log(fc("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?Ei.dim(` (v${e.gemini.version})`):"")),console.log(fc("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${Ei.dim("(run prjct start)")}`:"")),console.log(fc("Cursor IDE",i?"ready":c?"detected":"missing",i?` ${Ei.dim("(use prjct router)")}`:c?` ${Ei.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
2945
2945
  ${Ei.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
2946
2946
  ${Ei.cyan("https://prjct.app")}
2947
2947
  `)}function pee(){console.log(`
@@ -1209,7 +1209,7 @@ CREATE TABLE velocity_sprints (
1209
1209
  name TEXT NOT NULL,
1210
1210
  applied_at TEXT NOT NULL
1211
1211
  )
1212
- `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=Ao.filter(i=>!r.has(i.version));if(s.length!==0){if(n&&r.size>0)try{let i=`${n}.pre-migrate.bak`;ei.existsSync(i)&&ei.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)Yl(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new Io,y=E});function kh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:kh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:kh(r.host),repoSlug:s}}catch{return{}}}async function rI(t){try{let{stdout:e}=await F("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function sI(t){try{let{stdout:e}=await F("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Yn(t){return typeof t=="string"&&t.length>0?t:void 0}function wh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function iI(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Th(t){let e=E.getDoc(t,"project")||{},n=Yn(e.repoPath),{provider:r,repoSlug:s}=n?zl(await rI(n)||""):{},i=n?await sI(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return iI({provider:r,repoSlug:s,currentBranch:Yn(e.currentBranch),defaultBranch:i,stack:Yn(e.stack),techStack:o&&o.length>0?o:void 0,version:Yn(e.version),commitCount:wh(e.commitCount),fileCount:wh(e.fileCount),lastCommit:Yn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Yn(e.cliVersion),syncedAt:Yn(e.lastSync)})}var Ql=f(()=>{"use strict";N();te();a(kh,"providerForHost");a(zl,"parseRemote");a(rI,"gitRemoteUrl");a(sI,"gitDefaultBranch");a(Yn,"str");a(wh,"num");a(iI,"compact");a(Th,"buildProjectMeta")});import{execFile as oI}from"node:child_process";import aI from"node:crypto";import{promisify as cI}from"node:util";function dI(t,e=uI){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=aI.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function pI(t){let e;try{let{stdout:s}=await lI("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function Sh(t){let e=await pI(t);return e?dI(e):null}var lI,uI,bh=f(()=>{"use strict";Ql();lI=cI(oI),uI="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(dI,"uuidv5");a(pI,"repoKey");a(Sh,"deriveProjectId")});var tu={};C(tu,{PACKAGE_ROOT:()=>rn,VERSION:()=>Ue,getPackageRoot:()=>eu,getVersion:()=>Do,resetPackageRoot:()=>mI});import Zl from"node:fs";import No from"node:path";function eu(){if(Wr)return Wr;let t=__dirname;for(let e=0;e<5;e++){let n=No.join(t,"package.json");if(Zl.existsSync(n))try{if(JSON.parse(Zl.readFileSync(n,"utf-8")).name==="prjct-cli")return Wr=t,t}catch{}t=No.dirname(t)}return Wr=No.join(__dirname,"..","..",".."),Wr}function Do(){if(zn)return zn;let t="3.59.0";if(t&&/^\d+\.\d+\.\d+/.test(t))return zn=t,zn;try{let e=No.join(eu(),"package.json");return zn=JSON.parse(Zl.readFileSync(e,"utf-8")).version,zn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",R(e)),"0.0.0"}}function mI(t){Wr=t,zn=null}var zn,Wr,Ue,rn,_t=f(()=>{"use strict";ee();zn=null,Wr=null;a(eu,"getPackageRoot");a(Do,"getVersion");a(mI,"resetPackageRoot");Ue=Do(),rn=eu()});async function Po(t){try{let{stdout:e}=await $(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function gI(){let t=await Po("gh api user --jq .login");return t.success&&t.output||(t=await Po("git config --global github.user"),t.success&&t.output)?t.output:null}async function fI(){let t=await Po("git config user.name");return t.success&&t.output?t.output:null}async function hI(){let t=await Po("git config user.email");return t.success&&t.output?t.output:null}async function Br(){let[t,e,n]=await Promise.all([gI(),fI(),hI()]);return{github:t,email:n,name:e||t||"Unknown"}}var Lo=f(()=>{"use strict";te();a(Po,"execCommand");a(gI,"detectGitHubUsername");a(fI,"detectGitName");a(hI,"detectGitEmail");a(Br,"detect")});var Oo={};C(Oo,{worktreeService:()=>yI});import ru from"node:fs/promises";import Ut from"node:path";var vh,su,yI,jo=f(()=>{"use strict";te();Y();vh=".worktrees",su=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Ut.join(s,vh,n),o=r.branch||`feat/${n}`;await ru.mkdir(Ut.join(s,vh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await $(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await $("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await $(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await $(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await $("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await $("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await $("git rev-parse --git-dir",{cwd:e}),s=Ut.resolve(e,n.trim()),i=Ut.resolve(e,r.trim());if(s!==i){let{stdout:o}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await $("git rev-parse HEAD",{cwd:e}),{stdout:l}=await $("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ut.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await $("git worktree list --porcelain",{cwd:e}),s=r.split(`
1212
+ `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=Ao.filter(i=>!r.has(i.version));if(s.length!==0){if(n&&r.size>0)try{let i=`${n}.pre-migrate.bak`;ei.existsSync(i)&&ei.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)Yl(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new Io,y=E});function kh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:kh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:kh(r.host),repoSlug:s}}catch{return{}}}async function rI(t){try{let{stdout:e}=await F("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function sI(t){try{let{stdout:e}=await F("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Yn(t){return typeof t=="string"&&t.length>0?t:void 0}function wh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function iI(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Th(t){let e=E.getDoc(t,"project")||{},n=Yn(e.repoPath),{provider:r,repoSlug:s}=n?zl(await rI(n)||""):{},i=n?await sI(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return iI({provider:r,repoSlug:s,currentBranch:Yn(e.currentBranch),defaultBranch:i,stack:Yn(e.stack),techStack:o&&o.length>0?o:void 0,version:Yn(e.version),commitCount:wh(e.commitCount),fileCount:wh(e.fileCount),lastCommit:Yn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Yn(e.cliVersion),syncedAt:Yn(e.lastSync)})}var Ql=f(()=>{"use strict";N();te();a(kh,"providerForHost");a(zl,"parseRemote");a(rI,"gitRemoteUrl");a(sI,"gitDefaultBranch");a(Yn,"str");a(wh,"num");a(iI,"compact");a(Th,"buildProjectMeta")});import{execFile as oI}from"node:child_process";import aI from"node:crypto";import{promisify as cI}from"node:util";function dI(t,e=uI){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=aI.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function pI(t){let e;try{let{stdout:s}=await lI("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function Sh(t){let e=await pI(t);return e?dI(e):null}var lI,uI,bh=f(()=>{"use strict";Ql();lI=cI(oI),uI="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(dI,"uuidv5");a(pI,"repoKey");a(Sh,"deriveProjectId")});var tu={};C(tu,{PACKAGE_ROOT:()=>rn,VERSION:()=>Ue,getPackageRoot:()=>eu,getVersion:()=>Do,resetPackageRoot:()=>mI});import Zl from"node:fs";import No from"node:path";function eu(){if(Wr)return Wr;let t=__dirname;for(let e=0;e<5;e++){let n=No.join(t,"package.json");if(Zl.existsSync(n))try{if(JSON.parse(Zl.readFileSync(n,"utf-8")).name==="prjct-cli")return Wr=t,t}catch{}t=No.dirname(t)}return Wr=No.join(__dirname,"..","..",".."),Wr}function Do(){if(zn)return zn;let t="3.59.1";if(t&&/^\d+\.\d+\.\d+/.test(t))return zn=t,zn;try{let e=No.join(eu(),"package.json");return zn=JSON.parse(Zl.readFileSync(e,"utf-8")).version,zn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",R(e)),"0.0.0"}}function mI(t){Wr=t,zn=null}var zn,Wr,Ue,rn,_t=f(()=>{"use strict";ee();zn=null,Wr=null;a(eu,"getPackageRoot");a(Do,"getVersion");a(mI,"resetPackageRoot");Ue=Do(),rn=eu()});async function Po(t){try{let{stdout:e}=await $(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function gI(){let t=await Po("gh api user --jq .login");return t.success&&t.output||(t=await Po("git config --global github.user"),t.success&&t.output)?t.output:null}async function fI(){let t=await Po("git config user.name");return t.success&&t.output?t.output:null}async function hI(){let t=await Po("git config user.email");return t.success&&t.output?t.output:null}async function Br(){let[t,e,n]=await Promise.all([gI(),fI(),hI()]);return{github:t,email:n,name:e||t||"Unknown"}}var Lo=f(()=>{"use strict";te();a(Po,"execCommand");a(gI,"detectGitHubUsername");a(fI,"detectGitName");a(hI,"detectGitEmail");a(Br,"detect")});var Oo={};C(Oo,{worktreeService:()=>yI});import ru from"node:fs/promises";import Ut from"node:path";var vh,su,yI,jo=f(()=>{"use strict";te();Y();vh=".worktrees",su=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Ut.join(s,vh,n),o=r.branch||`feat/${n}`;await ru.mkdir(Ut.join(s,vh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await $(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await $("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await $(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await $(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await $("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await $("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await $("git rev-parse --git-dir",{cwd:e}),s=Ut.resolve(e,n.trim()),i=Ut.resolve(e,r.trim());if(s!==i){let{stdout:o}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await $("git rev-parse HEAD",{cwd:e}),{stdout:l}=await $("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ut.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await $("git worktree list --porcelain",{cwd:e}),s=r.split(`
1213
1213
  `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await $("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=Ut.join(n,".env");await I(r)&&await ru.copyFile(r,Ut.join(e,".env"));let s=Ut.join(n,".prjct"),i=Ut.join(e,".prjct");await I(s)&&!await I(i)&&await ru.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await $("git worktree prune",{cwd:s});for(let i of n)i.isMain||await I(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
1214
1214
 
1215
1215
  `);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
@@ -1214,7 +1214,7 @@ CREATE TABLE velocity_sprints (
1214
1214
  `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(o=>o.version)),s=cu.filter(o=>!r.has(o.version));if(s.length!==0){if(t&&r.size>0)try{let o=`${t}.pre-migrate.bak`;_a.existsSync(o)&&_a.rmSync(o,{force:!0}),e.prepare("VACUUM INTO ?").run(o)}catch(o){console.warn(`prjct: pre-migration backup failed (continuing): ${o?.message??o}`)}for(let o of s)eg(e,()=>{o.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(o.version,o.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new lu,b=E});import kT from"node:fs/promises";import wT from"node:path";function qo(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 bT(n,e){let t=[],r=e.replace(/\.[^.]+$/,"").split(/[/\\]/).filter(Boolean);for(let m of r)t.push(...qo(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(...qo(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(...qo(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(...qo(m));else{let f=m.startsWith("@")?m.split("/").slice(0,2).join("/"):m.split("/")[0];t.push(...qo(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&&!ET.has(m)&&/^[a-z][a-z0-9]*$/.test(m))}function oH(n){return n.split(/\s+/).flatMap(e=>qo(e)).filter(e=>e.length>1&&!ET.has(e)&&/^[a-z][a-z0-9]*$/.test(e))}function uu(){return Object.create(null)}async function iH(n){let e=await Jn(n),t={},r=uu(),s=0,o=await Br(e,50,async c=>{try{let l=await kT.readFile(wT.join(n,c),"utf-8"),u=bT(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 tg(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 aH(n,e){return Math.log((e-n+.5)/(n+.5)+1)}function cH(n,e){let t=oH(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=aH(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 tg(n){let e=new Map;for(let t of n)e.set(t,(e.get(t)||0)+1);return e}function lH(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 uH(n,e,t){if(t.length!==0){n.documents[e]={tokens:t,length:t.length};for(let[r,s]of tg(t))n.invertedIndex[r]||(n.invertedIndex[r]=[]),n.invertedIndex[r].push({path:e,tf:s})}}function dH(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 vT(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 ST(n,e,t,r,s){if(r.length!==0){n.run(t,JSON.stringify(r),r.length,s);for(let[o,i]of tg(r))e.run(o,t,i)}}function pH(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))ST(s,o,i,c.tokens,r)})}catch{}}function mH(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&&ST(c,l,d,p.tokens,u)}})}catch{}}function fH(n,e){b.setDoc(n,Aa,vT(e)),pH(n,e),As.delete(n)}function gH(n,e,t,r){b.setDoc(n,Aa,vT(e)),mH(n,e,t,r),As.delete(n)}function hH(n,e,t){try{let r=b.query(n,"SELECT path, length FROM bm25_documents ORDER BY path");if(r.length===0){if(t?.totalDocs===0){let d={documents:{},invertedIndex:uu(),avgDocLength:0,totalDocs:0,builtAt:t.builtAt};return As.set(n,{index:d,updatedAt:e}),d}return null}let s={},o=uu(),i=0;for(let d of r)s[d.path]={tokens:[],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 As.set(n,{index:u,updatedAt:e}),u}catch{return null}}function TT(n){try{return b.get(n,"SELECT key AS k FROM kv_store WHERE key = ? LIMIT 1",Aa)!=null}catch{return!1}}function Xo(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",Aa);if(!e)return As.delete(n),null;let t=As.get(n);if(t&&t.updatedAt===e.updated_at)return t.index;let r=b.getDoc(n,Aa),s=hH(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:Object.assign(uu(),r.invertedIndex),avgDocLength:r.avgDocLength,totalDocs:r.totalDocs,builtAt:r.builtAt};return As.set(n,{index:i,updatedAt:e.updated_at}),i}async function ng(n,e){let t=await iH(n);return fH(e,t),t}async function RT(n,e,t,r=[]){let s=Xo(e);if(!s)return ng(n,e);let o=new Set([...t,...r]);for(let c of o)lH(s,c);let i=await Br(t,50,async c=>{try{let l=await kT.readFile(wT.join(n,c),"utf-8"),u=bT(l,c);return{filePath:c,tokens:u}}catch{return null}});for(let{filePath:c,tokens:l}of i)uH(s,c,l);return dH(s),gH(e,s,t,r),s}function du(n,e,t=15){let r=Xo(n);return r?cH(e,r).slice(0,t):[]}var ET,Aa,As,Vo=y(()=>{"use strict";Mf();L();pe();ET=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(qo,"splitIdentifier");a(bT,"tokenizeFile");a(oH,"tokenizeQuery");a(uu,"emptyInvertedIndex");a(iH,"buildIndex");a(aH,"idf");a(cH,"score");Aa="bm25-index";a(tg,"termFrequencies");a(lH,"removeDocument");a(uH,"addDocument");a(dH,"recalculateStats");As=new Map;a(vT,"indexMetadata");a(ST,"writeDocumentRows");a(pH,"replacePerFileTables");a(mH,"updatePerFileTables");a(fH,"saveIndex");a(gH,"saveIndexUpdate");a(hH,"loadIndexFromPerFileTables");a(TT,"hasIndex");a(Xo,"loadIndex");a(ng,"indexProject");a(RT,"updateProjectIndex");a(du,"queryFiles")});async function kH(n,e=100){try{let{stdout:t}=await z(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:n,maxBuffer:10485760}),r=[],s=null;for(let o of t.split(`
1215
1215
  `)){let i=o.trim();i==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):i&&s&&wH(i)&&s.add(i)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}function wH(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 EH(n,e=100){let t=await kH(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=bH(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 bH(n,e){return n<e?`${n}\0${e}`:`${e}\0${n}`}function Is(n,e){let t=new Set(n),r=new Map;for(let s of n){let o=e.matrix[s];if(o)for(let[i,c]of Object.entries(o)){if(t.has(i))continue;let l=r.get(i)||0;c>l&&r.set(i,c)}}return Array.from(r.entries()).map(([s,o])=>({path:s,score:o})).sort((s,o)=>o.score-s.score)}function vH(n,e){b.setDoc(n,rg,e),pu.delete(n)}function yn(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",rg);if(!e)return pu.delete(n),null;let t=pu.get(n);if(t&&t.updatedAt===e.updated_at)return t.matrix;let r=b.getDoc(n,rg);return r&&pu.set(n,{matrix:r,updatedAt:e.updated_at}),r}async function SH(n,e){try{let{stdout:t}=await z(`git rev-list --max-count=${e} HEAD`,{cwd:n,maxBuffer:1048576}),r=t.split(`
1216
1216
  `).map(s=>s.trim()).filter(Boolean);return r.length>0?r.join(`
1217
- `):null}catch{return null}}async function mu(n,e,t=100){let r=await SH(n,t),s=r?yn(e):null;if(s?.historyFingerprint===r)return s;let o=await EH(n,t);return r&&(o.historyFingerprint=r),vH(e,o),o}var rg,pu,Jo=y(()=>{"use strict";Mf();L();fe();a(kH,"parseGitLog");a(wH,"isSourceFile");a(EH,"buildMatrix");a(bH,"pairKey");a(Is,"scoreFromSeeds");rg="cochange-index",pu=new Map;a(vH,"saveMatrix");a(yn,"loadMatrix");a(SH,"recentHistoryFingerprint");a(mu,"indexCoChanges")});import sg from"node:fs/promises";import Ps from"node:path";function _T(n){let e=[],t,r=new RegExp($S.source,"g");for(;(t=r.exec(n))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function AT(n,e,t){let r;if(n.startsWith("@/"))r=Ps.join(t,"src",n.slice(2));else{let s=Ps.dirname(Ps.join(t,e));r=Ps.resolve(s,n)}for(let s of jS){let o=r+s;try{if((await sg.stat(o)).isFile())return Ps.relative(t,o)}catch{}}return null}async function TH(n){let e=await Jn(n),t={},r={},s=0,o=await Br(e,50,async i=>{try{let c=await sg.readFile(Ps.join(n,i),"utf-8"),l=_T(c),u=[];for(let d of l){let p=await AT(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 Ko(n,e,t=2){let r=new Set(n),s=new Map,o=[];for(let i of n){let c=e.forward[i]||[],l=e.reverse[i]||[];for(let u of[...c,...l])r.has(u)||o.push({file:u,depth:1})}for(let i=0;i<o.length;i++){let{file:c,depth:l}=o[i];if(l>t)continue;let u=1/(l+1),d=s.get(c);if(d){u>d.score&&s.set(c,{score:u,depth:l});continue}if(s.set(c,{score:u,depth:l}),l<t){let p=e.forward[c]||[],m=e.reverse[c]||[];for(let f of[...p,...m])!r.has(f)&&!s.has(f)&&o.push({file:f,depth:l+1})}}return Array.from(s.entries()).map(([i,{score:c,depth:l}])=>({path:i,score:c,depth:l})).sort((i,c)=>c.score-i.score)}function RH(n){return Object.values(n).reduce((e,t)=>e+t.length,0)}function xH(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 CH(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 _H(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 AH(n,e){try{let t=await sg.readFile(Ps.join(n,e),"utf-8"),r=_T(t),s=[];for(let o of r){let i=await AT(o,e,n);i&&i!==e&&s.push(i)}return{filePath:e,imports:s}}catch{return null}}function IT(n){return{schemaVersion:2,fileCount:n.fileCount,edgeCount:n.edgeCount,builtAt:n.builtAt}}function IH(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 PH(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 NH(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 Ns.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 Ns.set(n,{graph:c,updatedAt:e}),c}catch{return null}}function jH(n,e){b.setDoc(n,fu,IT(e)),IH(n,e),Ns.delete(n)}function $H(n,e,t,r){b.setDoc(n,fu,IT(e)),PH(n,e,t,r),Ns.delete(n)}function Bt(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",fu);if(!e)return Ns.delete(n),null;let t=Ns.get(n);if(t&&t.updatedAt===e.updated_at)return t.graph;let r=b.getDoc(n,fu),s=NH(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 Ns.set(n,{graph:o,updatedAt:e.updated_at}),o}async function Ia(n,e){let t=await TH(n);return jH(e,t),t}async function PT(n,e,t,r=[]){let s=Bt(e);if(!s)return Ia(n,e);let o=new Set([...t,...r]);for(let l of o)xH(s,l);let i=new Set;for(let l of r)for(let u of CH(s,l))i.add(u);let c=await Br(t,50,l=>AH(n,l));for(let l of c)_H(s,l.filePath,l.imports);return s.edgeCount=RH(s.forward),s.builtAt=new Date().toISOString(),$H(e,s,[...t,...i],r),s}var fu,Ns,js=y(()=>{"use strict";Lf();L();pe();a(_T,"extractImportSources");a(AT,"resolveImport");a(TH,"buildGraph");a(Ko,"scoreFromSeeds");fu="import-graph",Ns=new Map;a(RH,"countEdges");a(xH,"removeOutgoingEdges");a(CH,"removeIncomingEdges");a(_H,"addEdges");a(AH,"importsForFile");a(IT,"graphMetadata");a(IH,"replacePerFileEdges");a(PH,"updatePerFileEdges");a(NH,"loadGraphFromPerFileEdges");a(jH,"saveGraph");a($H,"saveGraphUpdate");a(Bt,"loadGraph");a(Ia,"indexImports");a(PT,"updateImportGraph")});function og(n){if(n.length===0)return[];let e=n[0]?.score||1;return n.map(t=>({path:t.path,score:t.score/e}))}var Pa,NT=y(()=>{"use strict";Vo();Jo();js();a(og,"normalize");Pa=[{name:"bm25",kind:"query",defaultWeight:.5,hasIndex:a(n=>TT(n),"hasIndex"),scoreFromQuery:a((n,e,t)=>og(du(n,e,t)),"scoreFromQuery")},{name:"imports",kind:"seed",defaultWeight:.3,hasIndex:a(n=>Bt(n)!==null,"hasIndex"),scoreFromSeeds:a((n,e,t)=>{let r=Bt(n);return r?og(Ko(e,r,t.importDepth)):[]},"scoreFromSeeds")},{name:"cochange",kind:"seed",defaultWeight:.2,hasIndex:a(n=>yn(n)!==null,"hasIndex"),scoreFromSeeds:a((n,e)=>{let t=yn(n);return t?og(Is(e,t)):[]},"scoreFromSeeds")}]});function jT(n,e,t={}){let r={...DH,...t},s={bm25:r.bm25Weight,imports:r.importWeight,cochange:r.cochangeWeight},o=Pa.filter(p=>p.kind==="query"),i=Pa.filter(p=>p.kind==="seed"),c=new Map,l=[];for(let p of o){let m=p.scoreFromQuery(n,e,r.topN*3);m.length!==0&&(c.set(p.name,new Map(m.map(f=>[f.path,f.score]))),l.length===0&&(l=m.slice(0,OH).map(f=>f.path)))}if(c.size===0)return[];for(let p of i){let m=p.scoreFromSeeds(n,l,{importDepth:r.importDepth});m.length!==0&&c.set(p.name,new Map(m.map(f=>[f.path,f.score])))}let u=new Set;for(let p of c.values())for(let m of p.keys())u.add(m);let d=[];for(let p of u){let m=0;for(let[f,g]of c){let w=g.get(p)??0,k=s[f]??Pa.find(v=>v.name===f)?.defaultWeight??0;m+=w*k}d.push({path:p,finalScore:m,signals:{bm25:c.get("bm25")?.get(p)??0,imports:c.get("imports")?.get(p)??0,cochange:c.get("cochange")?.get(p)??0}})}return d.sort((p,m)=>m.finalScore-p.finalScore),d.slice(0,r.topN)}function $T(n){let e={};for(let t of Pa)e[t.name]=t.hasIndex(n);return{bm25:e.bm25??!1,imports:e.imports??!1,cochange:e.cochange??!1}}var DH,OH,DT=y(()=>{"use strict";NT();DH={bm25Weight:.5,importWeight:.3,cochangeWeight:.2,topN:15,importDepth:2},OH=10;a(jT,"rankFiles");a($T,"hasIndexes")});function MH(n){return n instanceof zo}function ct(n){return MH(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var zo,gu,hu,Na,wr=y(()=>{"use strict";zo=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)}},gu=class n extends zo{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")}},hu=class n extends zo{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")}},Na=class n extends zo{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(MH,"isPrjctError");a(ct,"getErrorMessage")});function OT(n){let e=n.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function ig(n){let e=n.trim();if(!e)return{};let t=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(t)return{provider:OT(t[1]),repoSlug:t[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:OT(r.host),repoSlug:s}}catch{return{}}}async function LH(n){try{let{stdout:e}=await B("git",["remote","get-url","origin"],{cwd:n});return e.trim()||void 0}catch{return}}async function FH(n){try{let{stdout:e}=await B("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:n});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function $s(n){return typeof n=="string"&&n.length>0?n:void 0}function MT(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function HH(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}async function yu(n){let e=E.getDoc(n,"project")||{},t=$s(e.repoPath),{provider:r,repoSlug:s}=t?ig(await LH(t)||""):{},o=t?await FH(t):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return HH({provider:r,repoSlug:s,currentBranch:$s(e.currentBranch),defaultBranch:o,stack:$s(e.stack),techStack:i&&i.length>0?i:void 0,version:$s(e.version),commitCount:MT(e.commitCount),fileCount:MT(e.fileCount),lastCommit:$s(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:$s(e.cliVersion),syncedAt:$s(e.lastSync)})}var ku=y(()=>{"use strict";L();fe();a(OT,"providerForHost");a(ig,"parseRemote");a(LH,"gitRemoteUrl");a(FH,"gitDefaultBranch");a($s,"str");a(MT,"num");a(HH,"compact");a(yu,"buildProjectMeta")});import{execFile as UH}from"node:child_process";import WH from"node:crypto";import{promisify as BH}from"node:util";function XH(n,e=qH){let t=Buffer.from(e.replace(/-/g,""),"hex"),s=WH.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 VH(n){let e;try{let{stdout:s}=await GH("git",["remote","get-url","origin"],{cwd:n});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:t,repoSlug:r}=ig(e);return!t||!r?null:`${t}:${r}`.toLowerCase()}async function LT(n){let e=await VH(n);return e?XH(e):null}var GH,qH,FT=y(()=>{"use strict";ku();GH=BH(UH),qH="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(XH,"uuidv5");a(VH,"repoKey");a(LT,"deriveProjectId")});var ug={};C(ug,{PACKAGE_ROOT:()=>Er,VERSION:()=>lt,getPackageRoot:()=>cg,getVersion:()=>Os,resetPackageRoot:()=>lg});import ag from"node:fs";import wu from"node:path";function cg(){if(Yo)return Yo;let n=__dirname;for(let e=0;e<5;e++){let t=wu.join(n,"package.json");if(ag.existsSync(t))try{if(JSON.parse(ag.readFileSync(t,"utf-8")).name==="prjct-cli")return Yo=n,n}catch{}n=wu.dirname(n)}return Yo=wu.join(__dirname,"..","..",".."),Yo}function Os(){if(Ds)return Ds;let n="3.59.0";if(n&&/^\d+\.\d+\.\d+/.test(n))return Ds=n,Ds;try{let e=wu.join(cg(),"package.json");return Ds=JSON.parse(ag.readFileSync(e,"utf-8")).version,Ds}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",S(e)),"0.0.0"}}function lg(n){Yo=n,Ds=null}var Ds,Yo,lt,Er,Mt=y(()=>{"use strict";J();Ds=null,Yo=null;a(cg,"getPackageRoot");a(Os,"getVersion");a(lg,"resetPackageRoot");lt=Os(),Er=cg()});async function Eu(n){try{let{stdout:e}=await z(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function JH(){let n=await Eu("gh api user --jq .login");return n.success&&n.output||(n=await Eu("git config --global github.user"),n.success&&n.output)?n.output:null}async function KH(){let n=await Eu("git config user.name");return n.success&&n.output?n.output:null}async function zH(){let n=await Eu("git config user.email");return n.success&&n.output?n.output:null}async function Qo(){let[n,e,t]=await Promise.all([JH(),KH(),zH()]);return{github:n,email:t,name:e||n||"Unknown"}}var bu=y(()=>{"use strict";fe();a(Eu,"execCommand");a(JH,"detectGitHubUsername");a(KH,"detectGitName");a(zH,"detectGitEmail");a(Qo,"detect")});var vu={};C(vu,{worktreeService:()=>YH});import pg from"node:fs/promises";import Kn from"node:path";var HT,mg,YH,Su=y(()=>{"use strict";fe();pe();HT=".worktrees",mg=class{static{a(this,"WorktreeService")}async create(e,t,r={}){let s=await this.getMainWorktree(e),o=Kn.join(s,HT,t),i=r.branch||`feat/${t}`;await pg.mkdir(Kn.join(s,HT),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await z(`git worktree add "${o}" -b "${i}"${c}`,{cwd:s});let{stdout:l}=await z("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 z("git rev-parse --abbrev-ref HEAD",{cwd:e});s=o.trim()}catch{}if(await z(`git worktree remove "${e}" --force`,{cwd:r}),t&&s&&s!=="main"&&s!=="master")try{await z(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:r}=await z("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(r,t)}async detect(e){try{let{stdout:t}=await z("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await z("git rev-parse --git-dir",{cwd:e}),s=Kn.resolve(e,t.trim()),o=Kn.resolve(e,r.trim());if(s!==o){let{stdout:i}=await z("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await z("git rev-parse HEAD",{cwd:e}),{stdout:l}=await z("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Kn.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 z("git worktree list --porcelain",{cwd:e}),s=r.split(`
1217
+ `):null}catch{return null}}async function mu(n,e,t=100){let r=await SH(n,t),s=r?yn(e):null;if(s?.historyFingerprint===r)return s;let o=await EH(n,t);return r&&(o.historyFingerprint=r),vH(e,o),o}var rg,pu,Jo=y(()=>{"use strict";Mf();L();fe();a(kH,"parseGitLog");a(wH,"isSourceFile");a(EH,"buildMatrix");a(bH,"pairKey");a(Is,"scoreFromSeeds");rg="cochange-index",pu=new Map;a(vH,"saveMatrix");a(yn,"loadMatrix");a(SH,"recentHistoryFingerprint");a(mu,"indexCoChanges")});import sg from"node:fs/promises";import Ps from"node:path";function _T(n){let e=[],t,r=new RegExp($S.source,"g");for(;(t=r.exec(n))!==null;){let s=t[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function AT(n,e,t){let r;if(n.startsWith("@/"))r=Ps.join(t,"src",n.slice(2));else{let s=Ps.dirname(Ps.join(t,e));r=Ps.resolve(s,n)}for(let s of jS){let o=r+s;try{if((await sg.stat(o)).isFile())return Ps.relative(t,o)}catch{}}return null}async function TH(n){let e=await Jn(n),t={},r={},s=0,o=await Br(e,50,async i=>{try{let c=await sg.readFile(Ps.join(n,i),"utf-8"),l=_T(c),u=[];for(let d of l){let p=await AT(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 Ko(n,e,t=2){let r=new Set(n),s=new Map,o=[];for(let i of n){let c=e.forward[i]||[],l=e.reverse[i]||[];for(let u of[...c,...l])r.has(u)||o.push({file:u,depth:1})}for(let i=0;i<o.length;i++){let{file:c,depth:l}=o[i];if(l>t)continue;let u=1/(l+1),d=s.get(c);if(d){u>d.score&&s.set(c,{score:u,depth:l});continue}if(s.set(c,{score:u,depth:l}),l<t){let p=e.forward[c]||[],m=e.reverse[c]||[];for(let f of[...p,...m])!r.has(f)&&!s.has(f)&&o.push({file:f,depth:l+1})}}return Array.from(s.entries()).map(([i,{score:c,depth:l}])=>({path:i,score:c,depth:l})).sort((i,c)=>c.score-i.score)}function RH(n){return Object.values(n).reduce((e,t)=>e+t.length,0)}function xH(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 CH(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 _H(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 AH(n,e){try{let t=await sg.readFile(Ps.join(n,e),"utf-8"),r=_T(t),s=[];for(let o of r){let i=await AT(o,e,n);i&&i!==e&&s.push(i)}return{filePath:e,imports:s}}catch{return null}}function IT(n){return{schemaVersion:2,fileCount:n.fileCount,edgeCount:n.edgeCount,builtAt:n.builtAt}}function IH(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 PH(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 NH(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 Ns.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 Ns.set(n,{graph:c,updatedAt:e}),c}catch{return null}}function jH(n,e){b.setDoc(n,fu,IT(e)),IH(n,e),Ns.delete(n)}function $H(n,e,t,r){b.setDoc(n,fu,IT(e)),PH(n,e,t,r),Ns.delete(n)}function Bt(n){let e=b.get(n,"SELECT updated_at FROM kv_store WHERE key = ?",fu);if(!e)return Ns.delete(n),null;let t=Ns.get(n);if(t&&t.updatedAt===e.updated_at)return t.graph;let r=b.getDoc(n,fu),s=NH(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 Ns.set(n,{graph:o,updatedAt:e.updated_at}),o}async function Ia(n,e){let t=await TH(n);return jH(e,t),t}async function PT(n,e,t,r=[]){let s=Bt(e);if(!s)return Ia(n,e);let o=new Set([...t,...r]);for(let l of o)xH(s,l);let i=new Set;for(let l of r)for(let u of CH(s,l))i.add(u);let c=await Br(t,50,l=>AH(n,l));for(let l of c)_H(s,l.filePath,l.imports);return s.edgeCount=RH(s.forward),s.builtAt=new Date().toISOString(),$H(e,s,[...t,...i],r),s}var fu,Ns,js=y(()=>{"use strict";Lf();L();pe();a(_T,"extractImportSources");a(AT,"resolveImport");a(TH,"buildGraph");a(Ko,"scoreFromSeeds");fu="import-graph",Ns=new Map;a(RH,"countEdges");a(xH,"removeOutgoingEdges");a(CH,"removeIncomingEdges");a(_H,"addEdges");a(AH,"importsForFile");a(IT,"graphMetadata");a(IH,"replacePerFileEdges");a(PH,"updatePerFileEdges");a(NH,"loadGraphFromPerFileEdges");a(jH,"saveGraph");a($H,"saveGraphUpdate");a(Bt,"loadGraph");a(Ia,"indexImports");a(PT,"updateImportGraph")});function og(n){if(n.length===0)return[];let e=n[0]?.score||1;return n.map(t=>({path:t.path,score:t.score/e}))}var Pa,NT=y(()=>{"use strict";Vo();Jo();js();a(og,"normalize");Pa=[{name:"bm25",kind:"query",defaultWeight:.5,hasIndex:a(n=>TT(n),"hasIndex"),scoreFromQuery:a((n,e,t)=>og(du(n,e,t)),"scoreFromQuery")},{name:"imports",kind:"seed",defaultWeight:.3,hasIndex:a(n=>Bt(n)!==null,"hasIndex"),scoreFromSeeds:a((n,e,t)=>{let r=Bt(n);return r?og(Ko(e,r,t.importDepth)):[]},"scoreFromSeeds")},{name:"cochange",kind:"seed",defaultWeight:.2,hasIndex:a(n=>yn(n)!==null,"hasIndex"),scoreFromSeeds:a((n,e)=>{let t=yn(n);return t?og(Is(e,t)):[]},"scoreFromSeeds")}]});function jT(n,e,t={}){let r={...DH,...t},s={bm25:r.bm25Weight,imports:r.importWeight,cochange:r.cochangeWeight},o=Pa.filter(p=>p.kind==="query"),i=Pa.filter(p=>p.kind==="seed"),c=new Map,l=[];for(let p of o){let m=p.scoreFromQuery(n,e,r.topN*3);m.length!==0&&(c.set(p.name,new Map(m.map(f=>[f.path,f.score]))),l.length===0&&(l=m.slice(0,OH).map(f=>f.path)))}if(c.size===0)return[];for(let p of i){let m=p.scoreFromSeeds(n,l,{importDepth:r.importDepth});m.length!==0&&c.set(p.name,new Map(m.map(f=>[f.path,f.score])))}let u=new Set;for(let p of c.values())for(let m of p.keys())u.add(m);let d=[];for(let p of u){let m=0;for(let[f,g]of c){let w=g.get(p)??0,k=s[f]??Pa.find(v=>v.name===f)?.defaultWeight??0;m+=w*k}d.push({path:p,finalScore:m,signals:{bm25:c.get("bm25")?.get(p)??0,imports:c.get("imports")?.get(p)??0,cochange:c.get("cochange")?.get(p)??0}})}return d.sort((p,m)=>m.finalScore-p.finalScore),d.slice(0,r.topN)}function $T(n){let e={};for(let t of Pa)e[t.name]=t.hasIndex(n);return{bm25:e.bm25??!1,imports:e.imports??!1,cochange:e.cochange??!1}}var DH,OH,DT=y(()=>{"use strict";NT();DH={bm25Weight:.5,importWeight:.3,cochangeWeight:.2,topN:15,importDepth:2},OH=10;a(jT,"rankFiles");a($T,"hasIndexes")});function MH(n){return n instanceof zo}function ct(n){return MH(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var zo,gu,hu,Na,wr=y(()=>{"use strict";zo=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)}},gu=class n extends zo{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")}},hu=class n extends zo{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")}},Na=class n extends zo{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(MH,"isPrjctError");a(ct,"getErrorMessage")});function OT(n){let e=n.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function ig(n){let e=n.trim();if(!e)return{};let t=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(t)return{provider:OT(t[1]),repoSlug:t[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:OT(r.host),repoSlug:s}}catch{return{}}}async function LH(n){try{let{stdout:e}=await B("git",["remote","get-url","origin"],{cwd:n});return e.trim()||void 0}catch{return}}async function FH(n){try{let{stdout:e}=await B("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:n});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function $s(n){return typeof n=="string"&&n.length>0?n:void 0}function MT(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function HH(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}async function yu(n){let e=E.getDoc(n,"project")||{},t=$s(e.repoPath),{provider:r,repoSlug:s}=t?ig(await LH(t)||""):{},o=t?await FH(t):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return HH({provider:r,repoSlug:s,currentBranch:$s(e.currentBranch),defaultBranch:o,stack:$s(e.stack),techStack:i&&i.length>0?i:void 0,version:$s(e.version),commitCount:MT(e.commitCount),fileCount:MT(e.fileCount),lastCommit:$s(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:$s(e.cliVersion),syncedAt:$s(e.lastSync)})}var ku=y(()=>{"use strict";L();fe();a(OT,"providerForHost");a(ig,"parseRemote");a(LH,"gitRemoteUrl");a(FH,"gitDefaultBranch");a($s,"str");a(MT,"num");a(HH,"compact");a(yu,"buildProjectMeta")});import{execFile as UH}from"node:child_process";import WH from"node:crypto";import{promisify as BH}from"node:util";function XH(n,e=qH){let t=Buffer.from(e.replace(/-/g,""),"hex"),s=WH.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 VH(n){let e;try{let{stdout:s}=await GH("git",["remote","get-url","origin"],{cwd:n});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:t,repoSlug:r}=ig(e);return!t||!r?null:`${t}:${r}`.toLowerCase()}async function LT(n){let e=await VH(n);return e?XH(e):null}var GH,qH,FT=y(()=>{"use strict";ku();GH=BH(UH),qH="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(XH,"uuidv5");a(VH,"repoKey");a(LT,"deriveProjectId")});var ug={};C(ug,{PACKAGE_ROOT:()=>Er,VERSION:()=>lt,getPackageRoot:()=>cg,getVersion:()=>Os,resetPackageRoot:()=>lg});import ag from"node:fs";import wu from"node:path";function cg(){if(Yo)return Yo;let n=__dirname;for(let e=0;e<5;e++){let t=wu.join(n,"package.json");if(ag.existsSync(t))try{if(JSON.parse(ag.readFileSync(t,"utf-8")).name==="prjct-cli")return Yo=n,n}catch{}n=wu.dirname(n)}return Yo=wu.join(__dirname,"..","..",".."),Yo}function Os(){if(Ds)return Ds;let n="3.59.1";if(n&&/^\d+\.\d+\.\d+/.test(n))return Ds=n,Ds;try{let e=wu.join(cg(),"package.json");return Ds=JSON.parse(ag.readFileSync(e,"utf-8")).version,Ds}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",S(e)),"0.0.0"}}function lg(n){Yo=n,Ds=null}var Ds,Yo,lt,Er,Mt=y(()=>{"use strict";J();Ds=null,Yo=null;a(cg,"getPackageRoot");a(Os,"getVersion");a(lg,"resetPackageRoot");lt=Os(),Er=cg()});async function Eu(n){try{let{stdout:e}=await z(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function JH(){let n=await Eu("gh api user --jq .login");return n.success&&n.output||(n=await Eu("git config --global github.user"),n.success&&n.output)?n.output:null}async function KH(){let n=await Eu("git config user.name");return n.success&&n.output?n.output:null}async function zH(){let n=await Eu("git config user.email");return n.success&&n.output?n.output:null}async function Qo(){let[n,e,t]=await Promise.all([JH(),KH(),zH()]);return{github:n,email:t,name:e||n||"Unknown"}}var bu=y(()=>{"use strict";fe();a(Eu,"execCommand");a(JH,"detectGitHubUsername");a(KH,"detectGitName");a(zH,"detectGitEmail");a(Qo,"detect")});var vu={};C(vu,{worktreeService:()=>YH});import pg from"node:fs/promises";import Kn from"node:path";var HT,mg,YH,Su=y(()=>{"use strict";fe();pe();HT=".worktrees",mg=class{static{a(this,"WorktreeService")}async create(e,t,r={}){let s=await this.getMainWorktree(e),o=Kn.join(s,HT,t),i=r.branch||`feat/${t}`;await pg.mkdir(Kn.join(s,HT),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await z(`git worktree add "${o}" -b "${i}"${c}`,{cwd:s});let{stdout:l}=await z("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 z("git rev-parse --abbrev-ref HEAD",{cwd:e});s=o.trim()}catch{}if(await z(`git worktree remove "${e}" --force`,{cwd:r}),t&&s&&s!=="main"&&s!=="master")try{await z(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:r}=await z("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(r,t)}async detect(e){try{let{stdout:t}=await z("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await z("git rev-parse --git-dir",{cwd:e}),s=Kn.resolve(e,t.trim()),o=Kn.resolve(e,r.trim());if(s!==o){let{stdout:i}=await z("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await z("git rev-parse HEAD",{cwd:e}),{stdout:l}=await z("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Kn.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 z("git worktree list --porcelain",{cwd:e}),s=r.split(`
1218
1218
  `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:t}=await z("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let r=Kn.join(t,".env");await O(r)&&await pg.copyFile(r,Kn.join(e,".env"));let s=Kn.join(t,".prjct"),o=Kn.join(e,".prjct");await O(s)&&!await O(o)&&await pg.symlink(s,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),r=[],s=await this.getMainWorktree(e);await z("git worktree prune",{cwd:s});for(let o of t)o.isMain||await O(o.path)||r.push(o.slug);return r}parsePorcelainOutput(e,t){let r=[],s=e.trim().split(`
1219
1219
 
1220
1220
  `);for(let o of s){if(!o.trim())continue;let i=o.trim().split(`
@@ -1212,7 +1212,7 @@ CREATE TABLE velocity_sprints (
1212
1212
  `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=so.filter(i=>!r.has(i.version));if(s.length!==0){if(n&&r.size>0)try{let i=`${n}.pre-migrate.bak`;Cs.existsSync(i)&&Cs.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)qc(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new io,y=E});import Vc from"node:fs/promises";import Mn from"node:path";function Qg(t){let e=[],n,r=new RegExp(lg.source,"g");for(;(n=r.exec(t))!==null;){let s=n[1];(s.startsWith(".")||s.startsWith("@/"))&&e.push(s)}return e}async function Zg(t,e,n){let r;if(t.startsWith("@/"))r=Mn.join(n,"src",t.slice(2));else{let s=Mn.dirname(Mn.join(n,e));r=Mn.resolve(s,t)}for(let s of cg){let i=r+s;try{if((await Vc.stat(i)).isFile())return Mn.relative(n,i)}catch{}}return null}async function rx(t){let e=await At(t),n={},r={},s=0,i=await dn(e,50,async o=>{try{let c=await Vc.readFile(Mn.join(t,o),"utf-8"),l=Qg(c),u=[];for(let d of l){let p=await Zg(d,o,t);p&&p!==o&&u.push(p)}return u.length>0?{filePath:o,imports:u}:null}catch{return null}});for(let{filePath:o,imports:c}of i){n[o]=c,s+=c.length;for(let l of c)r[l]||(r[l]=[]),r[l].push(o)}return{forward:n,reverse:r,fileCount:e.length,edgeCount:s,builtAt:new Date().toISOString()}}function vr(t,e,n=2){let r=new Set(t),s=new Map,i=[];for(let o of t){let c=e.forward[o]||[],l=e.reverse[o]||[];for(let u of[...c,...l])r.has(u)||i.push({file:u,depth:1})}for(let o=0;o<i.length;o++){let{file:c,depth:l}=i[o];if(l>n)continue;let u=1/(l+1),d=s.get(c);if(d){u>d.score&&s.set(c,{score:u,depth:l});continue}if(s.set(c,{score:u,depth:l}),l<n){let p=e.forward[c]||[],m=e.reverse[c]||[];for(let g of[...p,...m])!r.has(g)&&!s.has(g)&&i.push({file:g,depth:l+1})}}return Array.from(s.entries()).map(([o,{score:c,depth:l}])=>({path:o,score:c,depth:l})).sort((o,c)=>c.score-o.score)}function sx(t){return Object.values(t).reduce((e,n)=>e+n.length,0)}function ix(t,e){let n=t.forward[e]||[];delete t.forward[e];for(let r of n){let s=(t.reverse[r]||[]).filter(i=>i!==e);s.length===0?delete t.reverse[r]:t.reverse[r]=s}}function ox(t,e){let n=t.reverse[e]||[];delete t.reverse[e];let r=[];for(let s of n){let i=(t.forward[s]||[]).filter(o=>o!==e);i.length===0?delete t.forward[s]:t.forward[s]=i,r.push(s)}return r}function ax(t,e,n){if(n.length===0)return;let r=Array.from(new Set(n));t.forward[e]=r;for(let s of r)t.reverse[s]||(t.reverse[s]=[]),t.reverse[s].includes(e)||t.reverse[s].push(e)}async function cx(t,e){try{let n=await Vc.readFile(Mn.join(t,e),"utf-8"),r=Qg(n),s=[];for(let i of r){let o=await Zg(i,e,t);o&&o!==e&&s.push(o)}return{filePath:e,imports:s}}catch{return null}}function ef(t){return{schemaVersion:2,fileCount:t.fileCount,edgeCount:t.edgeCount,builtAt:t.builtAt}}function lx(t,e){try{y.transaction(t,n=>{n.prepare("DELETE FROM import_graph_edges").run();let r=n.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let[s,i]of Object.entries(e.forward))for(let[o,c]of i.entries())r.run(s,c,o)})}catch{}}function ux(t,e,n,r){try{y.transaction(t,s=>{let i=s.prepare("DELETE FROM import_graph_edges WHERE from_path = ?"),o=s.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let c of new Set([...n,...r]))i.run(c);for(let c of n){let l=e.forward[c]||[];for(let[u,d]of l.entries())o.run(c,d,u)}})}catch{}}function dx(t,e,n){try{let r=y.query(t,"SELECT from_path, to_path FROM import_graph_edges ORDER BY from_path, sort_order, to_path");if(r.length===0){if(n?.edgeCount===0){let l={forward:{},reverse:{},fileCount:n.fileCount,edgeCount:0,builtAt:n.builtAt};return $n.set(t,{graph:l,updatedAt:e}),l}return null}let s={},i={};for(let l of r)s[l.from_path]||(s[l.from_path]=[]),s[l.from_path].push(l.to_path),i[l.to_path]||(i[l.to_path]=[]),i[l.to_path].push(l.from_path);let o=new Set;for(let[l,u]of Object.entries(s)){o.add(l);for(let d of u)o.add(d)}let c={forward:s,reverse:i,fileCount:n?.fileCount??o.size,edgeCount:r.length,builtAt:n?.builtAt??e};return $n.set(t,{graph:c,updatedAt:e}),c}catch{return null}}function px(t,e){y.setDoc(t,oo,ef(e)),lx(t,e),$n.delete(t)}function mx(t,e,n,r){y.setDoc(t,oo,ef(e)),ux(t,e,n,r),$n.delete(t)}function Je(t){let e=y.get(t,"SELECT updated_at FROM kv_store WHERE key = ?",oo);if(!e)return $n.delete(t),null;let n=$n.get(t);if(n&&n.updatedAt===e.updated_at)return n.graph;let r=y.getDoc(t,oo),s=dx(t,e.updated_at,r);if(s)return s;if(!r?.forward||!r?.reverse)return null;let i={forward:r.forward,reverse:r.reverse,fileCount:r.fileCount,edgeCount:r.edgeCount,builtAt:r.builtAt};return $n.set(t,{graph:i,updatedAt:e.updated_at}),i}async function Is(t,e){let n=await rx(t);return px(e,n),n}async function tf(t,e,n,r=[]){let s=Je(e);if(!s)return Is(t,e);let i=new Set([...n,...r]);for(let l of i)ix(s,l);let o=new Set;for(let l of r)for(let u of ox(s,l))o.add(u);let c=await dn(n,50,l=>cx(t,l));for(let l of c)ax(s,l.filePath,l.imports);return s.edgeCount=sx(s.forward),s.builtAt=new Date().toISOString(),mx(e,s,[...n,...o],r),s}var oo,$n,Fn=f(()=>{"use strict";Cc();D();re();a(Qg,"extractImportSources");a(Zg,"resolveImport");a(rx,"buildGraph");a(vr,"scoreFromSeeds");oo="import-graph",$n=new Map;a(sx,"countEdges");a(ix,"removeOutgoingEdges");a(ox,"removeIncomingEdges");a(ax,"addEdges");a(cx,"importsForFile");a(ef,"graphMetadata");a(lx,"replacePerFileEdges");a(ux,"updatePerFileEdges");a(dx,"loadGraphFromPerFileEdges");a(px,"saveGraph");a(mx,"saveGraphUpdate");a(Je,"loadGraph");a(Is,"indexImports");a(tf,"updateImportGraph")});function ao(t,e){let n=[...t.added,...t.modified],r=new Set(n),s=new Set,i=Je(e);if(i)for(let l of n){let u=i.reverse[l];if(u)for(let d of u)r.has(d)||s.add(d)}let o=Array.from(s),c=[...n,...o];return{directlyChanged:n,affectedByImports:o,deleted:t.deleted,allAffected:c}}function co(t){let e=new Set;for(let n of t){let r=n.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 Jc=f(()=>{"use strict";Fn();a(ao,"propagateChanges");a(co,"affectedDomains")});var Kc=f(()=>{"use strict"});async function fx(t,e=100){try{let{stdout:n}=await $(`git log --name-only --pretty=format:'---COMMIT---' -${e}`,{cwd:t,maxBuffer:10485760}),r=[],s=null;for(let i of n.split(`
1213
1213
  `)){let o=i.trim();o==="---COMMIT---"?(s&&s.size>0&&s.size<=30&&r.push(s),s=new Set):o&&s&&hx(o)&&s.add(o)}return s&&s.size>0&&s.size<=30&&r.push(s),r}catch{return[]}}function hx(t){return/\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|cs|rb|php|vue|svelte)$/i.test(t)&&!t.includes("node_modules/")}async function yx(t,e=100){let n=await fx(t,e),r=new Map,s=new Map;for(let o of n){let c=Array.from(o);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=Ex(c[l],c[u]);s.set(d,(s.get(d)||0)+1)}}let i={};for(let[o,c]of s){let[l,u]=o.split("\0"),d=r.get(l)||0,p=r.get(u)||0;if(d<2||p<2)continue;let m=d+p-c,g=m>0?c/m:0;g<.1||(i[l]||(i[l]={}),i[u]||(i[u]={}),i[l][u]=g,i[u][l]=g)}return{matrix:i,commitsAnalyzed:n.length,filesAnalyzed:r.size,builtAt:new Date().toISOString()}}function Ex(t,e){return t<e?`${t}\0${e}`:`${e}\0${t}`}function Un(t,e){let n=new Set(t),r=new Map;for(let s of t){let i=e.matrix[s];if(i)for(let[o,c]of Object.entries(i)){if(n.has(o))continue;let l=r.get(o)||0;c>l&&r.set(o,c)}}return Array.from(r.entries()).map(([s,i])=>({path:s,score:i})).sort((s,i)=>i.score-s.score)}function kx(t,e){y.setDoc(t,Yc,e),lo.delete(t)}function ct(t){let e=y.get(t,"SELECT updated_at FROM kv_store WHERE key = ?",Yc);if(!e)return lo.delete(t),null;let n=lo.get(t);if(n&&n.updatedAt===e.updated_at)return n.matrix;let r=y.getDoc(t,Yc);return r&&lo.set(t,{matrix:r,updatedAt:e.updated_at}),r}async function Tx(t,e){try{let{stdout:n}=await $(`git rev-list --max-count=${e} HEAD`,{cwd:t,maxBuffer:1048576}),r=n.split(`
1214
1214
  `).map(s=>s.trim()).filter(Boolean);return r.length>0?r.join(`
1215
- `):null}catch{return null}}async function uo(t,e,n=100){let r=await Tx(t,n),s=r?ct(e):null;if(s?.historyFingerprint===r)return s;let i=await yx(t,n);return r&&(i.historyFingerprint=r),kx(e,i),i}var Yc,lo,br=f(()=>{"use strict";Kc();D();pe();a(fx,"parseGitLog");a(hx,"isSourceFile");a(yx,"buildMatrix");a(Ex,"pairKey");a(Un,"scoreFromSeeds");Yc="cochange-index",lo=new Map;a(kx,"saveMatrix");a(ct,"loadMatrix");a(Tx,"recentHistoryFingerprint");a(uo,"indexCoChanges")});function wx(t){return t instanceof Ps}function Se(t){return wx(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ps,po,Ds,Vt=f(()=>{"use strict";Ps=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},po=class t extends Ps{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ds=class t extends Ps{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(wx,"isPrjctError");a(Se,"getErrorMessage")});function sf(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zc(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:sf(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:sf(r.host),repoSlug:s}}catch{return{}}}async function Sx(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function vx(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Hn(t){return typeof t=="string"&&t.length>0?t:void 0}function of(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function bx(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function af(t){let e=E.getDoc(t,"project")||{},n=Hn(e.repoPath),{provider:r,repoSlug:s}=n?zc(await Sx(n)||""):{},i=n?await vx(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return bx({provider:r,repoSlug:s,currentBranch:Hn(e.currentBranch),defaultBranch:i,stack:Hn(e.stack),techStack:o&&o.length>0?o:void 0,version:Hn(e.version),commitCount:of(e.commitCount),fileCount:of(e.fileCount),lastCommit:Hn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Hn(e.cliVersion),syncedAt:Hn(e.lastSync)})}var Qc=f(()=>{"use strict";D();pe();a(sf,"providerForHost");a(zc,"parseRemote");a(Sx,"gitRemoteUrl");a(vx,"gitDefaultBranch");a(Hn,"str");a(of,"num");a(bx,"compact");a(af,"buildProjectMeta")});import{execFile as _x}from"node:child_process";import xx from"node:crypto";import{promisify as Rx}from"node:util";function Nx(t,e=Cx){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=xx.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function Ix(t){let e;try{let{stdout:s}=await Ax("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zc(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function cf(t){let e=await Ix(t);return e?Nx(e):null}var Ax,Cx,lf=f(()=>{"use strict";Qc();Ax=Rx(_x),Cx="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(Nx,"uuidv5");a(Ix,"repoKey");a(cf,"deriveProjectId")});var tl={};I(tl,{PACKAGE_ROOT:()=>Tn,VERSION:()=>kn,getPackageRoot:()=>el,getVersion:()=>go,resetPackageRoot:()=>Px});import Zc from"node:fs";import mo from"node:path";function el(){if(_r)return _r;let t=__dirname;for(let e=0;e<5;e++){let n=mo.join(t,"package.json");if(Zc.existsSync(n))try{if(JSON.parse(Zc.readFileSync(n,"utf-8")).name==="prjct-cli")return _r=t,t}catch{}t=mo.dirname(t)}return _r=mo.join(__dirname,"..","..",".."),_r}function go(){if(Wn)return Wn;let t="3.59.0";if(t&&/^\d+\.\d+\.\d+/.test(t))return Wn=t,Wn;try{let e=mo.join(el(),"package.json");return Wn=JSON.parse(Zc.readFileSync(e,"utf-8")).version,Wn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",_(e)),"0.0.0"}}function Px(t){_r=t,Wn=null}var Wn,_r,kn,Tn,Jt=f(()=>{"use strict";ne();Wn=null,_r=null;a(el,"getPackageRoot");a(go,"getVersion");a(Px,"resetPackageRoot");kn=go(),Tn=el()});async function fo(t){try{let{stdout:e}=await $(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Dx(){let t=await fo("gh api user --jq .login");return t.success&&t.output||(t=await fo("git config --global github.user"),t.success&&t.output)?t.output:null}async function Lx(){let t=await fo("git config user.name");return t.success&&t.output?t.output:null}async function Ox(){let t=await fo("git config user.email");return t.success&&t.output?t.output:null}async function xr(){let[t,e,n]=await Promise.all([Dx(),Lx(),Ox()]);return{github:t,email:n,name:e||t||"Unknown"}}var ho=f(()=>{"use strict";pe();a(fo,"execCommand");a(Dx,"detectGitHubUsername");a(Lx,"detectGitName");a(Ox,"detectGitEmail");a(xr,"detect")});var yo={};I(yo,{worktreeService:()=>jx});import rl from"node:fs/promises";import Nt from"node:path";var uf,sl,jx,Eo=f(()=>{"use strict";pe();re();uf=".worktrees",sl=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Nt.join(s,uf,n),o=r.branch||`feat/${n}`;await rl.mkdir(Nt.join(s,uf),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await $(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await $("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await $(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await $(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await $("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await $("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await $("git rev-parse --git-dir",{cwd:e}),s=Nt.resolve(e,n.trim()),i=Nt.resolve(e,r.trim());if(s!==i){let{stdout:o}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await $("git rev-parse HEAD",{cwd:e}),{stdout:l}=await $("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Nt.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await $("git worktree list --porcelain",{cwd:e}),s=r.split(`
1215
+ `):null}catch{return null}}async function uo(t,e,n=100){let r=await Tx(t,n),s=r?ct(e):null;if(s?.historyFingerprint===r)return s;let i=await yx(t,n);return r&&(i.historyFingerprint=r),kx(e,i),i}var Yc,lo,br=f(()=>{"use strict";Kc();D();pe();a(fx,"parseGitLog");a(hx,"isSourceFile");a(yx,"buildMatrix");a(Ex,"pairKey");a(Un,"scoreFromSeeds");Yc="cochange-index",lo=new Map;a(kx,"saveMatrix");a(ct,"loadMatrix");a(Tx,"recentHistoryFingerprint");a(uo,"indexCoChanges")});function wx(t){return t instanceof Ps}function Se(t){return wx(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ps,po,Ds,Vt=f(()=>{"use strict";Ps=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},po=class t extends Ps{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ds=class t extends Ps{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(wx,"isPrjctError");a(Se,"getErrorMessage")});function sf(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zc(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:sf(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:sf(r.host),repoSlug:s}}catch{return{}}}async function Sx(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function vx(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Hn(t){return typeof t=="string"&&t.length>0?t:void 0}function of(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function bx(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function af(t){let e=E.getDoc(t,"project")||{},n=Hn(e.repoPath),{provider:r,repoSlug:s}=n?zc(await Sx(n)||""):{},i=n?await vx(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return bx({provider:r,repoSlug:s,currentBranch:Hn(e.currentBranch),defaultBranch:i,stack:Hn(e.stack),techStack:o&&o.length>0?o:void 0,version:Hn(e.version),commitCount:of(e.commitCount),fileCount:of(e.fileCount),lastCommit:Hn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Hn(e.cliVersion),syncedAt:Hn(e.lastSync)})}var Qc=f(()=>{"use strict";D();pe();a(sf,"providerForHost");a(zc,"parseRemote");a(Sx,"gitRemoteUrl");a(vx,"gitDefaultBranch");a(Hn,"str");a(of,"num");a(bx,"compact");a(af,"buildProjectMeta")});import{execFile as _x}from"node:child_process";import xx from"node:crypto";import{promisify as Rx}from"node:util";function Nx(t,e=Cx){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=xx.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function Ix(t){let e;try{let{stdout:s}=await Ax("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zc(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function cf(t){let e=await Ix(t);return e?Nx(e):null}var Ax,Cx,lf=f(()=>{"use strict";Qc();Ax=Rx(_x),Cx="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(Nx,"uuidv5");a(Ix,"repoKey");a(cf,"deriveProjectId")});var tl={};I(tl,{PACKAGE_ROOT:()=>Tn,VERSION:()=>kn,getPackageRoot:()=>el,getVersion:()=>go,resetPackageRoot:()=>Px});import Zc from"node:fs";import mo from"node:path";function el(){if(_r)return _r;let t=__dirname;for(let e=0;e<5;e++){let n=mo.join(t,"package.json");if(Zc.existsSync(n))try{if(JSON.parse(Zc.readFileSync(n,"utf-8")).name==="prjct-cli")return _r=t,t}catch{}t=mo.dirname(t)}return _r=mo.join(__dirname,"..","..",".."),_r}function go(){if(Wn)return Wn;let t="3.59.1";if(t&&/^\d+\.\d+\.\d+/.test(t))return Wn=t,Wn;try{let e=mo.join(el(),"package.json");return Wn=JSON.parse(Zc.readFileSync(e,"utf-8")).version,Wn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",_(e)),"0.0.0"}}function Px(t){_r=t,Wn=null}var Wn,_r,kn,Tn,Jt=f(()=>{"use strict";ne();Wn=null,_r=null;a(el,"getPackageRoot");a(go,"getVersion");a(Px,"resetPackageRoot");kn=go(),Tn=el()});async function fo(t){try{let{stdout:e}=await $(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Dx(){let t=await fo("gh api user --jq .login");return t.success&&t.output||(t=await fo("git config --global github.user"),t.success&&t.output)?t.output:null}async function Lx(){let t=await fo("git config user.name");return t.success&&t.output?t.output:null}async function Ox(){let t=await fo("git config user.email");return t.success&&t.output?t.output:null}async function xr(){let[t,e,n]=await Promise.all([Dx(),Lx(),Ox()]);return{github:t,email:n,name:e||t||"Unknown"}}var ho=f(()=>{"use strict";pe();a(fo,"execCommand");a(Dx,"detectGitHubUsername");a(Lx,"detectGitName");a(Ox,"detectGitEmail");a(xr,"detect")});var yo={};I(yo,{worktreeService:()=>jx});import rl from"node:fs/promises";import Nt from"node:path";var uf,sl,jx,Eo=f(()=>{"use strict";pe();re();uf=".worktrees",sl=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Nt.join(s,uf,n),o=r.branch||`feat/${n}`;await rl.mkdir(Nt.join(s,uf),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await $(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await $("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await $(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await $(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await $("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await $("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await $("git rev-parse --git-dir",{cwd:e}),s=Nt.resolve(e,n.trim()),i=Nt.resolve(e,r.trim());if(s!==i){let{stdout:o}=await $("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await $("git rev-parse HEAD",{cwd:e}),{stdout:l}=await $("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Nt.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await $("git worktree list --porcelain",{cwd:e}),s=r.split(`
1216
1216
  `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await $("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=Nt.join(n,".env");await x(r)&&await rl.copyFile(r,Nt.join(e,".env"));let s=Nt.join(n,".prjct"),i=Nt.join(e,".prjct");await x(s)&&!await x(i)&&await rl.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await $("git worktree prune",{cwd:s});for(let i of n)i.isMain||await x(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
1217
1217
 
1218
1218
  `);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "3.59.0",
3
+ "version": "3.59.1",
4
4
  "description": "Project memory and workflow context for AI coding agents.",
5
5
  "main": "dist/bin/prjct.mjs",
6
6
  "bin": {