prjct-cli 2.37.4 → 2.37.5

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,7 +2,20 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
- ## [2.37.4] - 2026-06-01
5
+ ## [2.37.5] - 2026-06-01
6
+
7
+ Robustness sweep: close an entire class of "works in the terminal, broken via the daemon" bugs — and add a test so it can't come back.
8
+
9
+ ### Fixed
10
+ - **Commands silently dropped their flags when run through the daemon.** A command whose cold handler (`core/index.ts`) reads option flags but has no explicit `case` in the daemon dispatcher fell through to the option-less registry path, dropping every flag. Beyond `embeddings` (fixed in 2.37.3), this hit:
11
+ - `prjct capture "…" --tags … --force` — tags and the secret-override were dropped (an explicit `capture` is registered, so it skipped the unknown-verb auto-route and fell through).
12
+ - `prjct init --pack … --persona … --yes` — onboarding pack/persona selection was ignored.
13
+ - `prjct regen --md` — agents got non-md output.
14
+ - `prjct login --url …`, `prjct logout`, `prjct auth` — flags/args dropped.
15
+ Each now has an explicit dispatch case mirroring the cold path (and `init` correctly uses the request's cwd, not the daemon's).
16
+
17
+ ### Internal
18
+ - New `dispatch-option-parity.test.ts`: every option-bearing cold command must be either cold-handled (`_binCommands`) or explicitly cased in the daemon dispatcher. CI now fails if a future option-taking command reintroduces this drift.
6
19
 
7
20
  Hot-path performance (batch 2 from the optimization audit) — the UserPromptSubmit hook fires on every prompt and blocks context injection, so its DB work is the most worth trimming.
8
21
 
@@ -1456,7 +1456,7 @@ No prjct installation found.`)),{success:!0,message:"Nothing to uninstall"};let
1456
1456
  Uninstall cancelled.`)),{success:!1,message:"Uninstall cancelled by user"};console.log(""),console.log(Ae.blue("Removing prjct..."));let{deleted:i,errors:a}=await VT(t,n,r);if(console.log(""),i.length>0&&console.log(Ae.green(`Removed ${i.length} items`)),a.length>0){console.log(Ae.yellow(`
1457
1457
  ${a.length} errors:`));for(let l of a)console.log(Ae.red(` - ${l}`))}return console.log(""),console.log(Ae.green("prjct has been uninstalled.")),console.log(Ae.dim("Thanks for using prjct! We hope to see you again.")),console.log(""),{success:a.length===0,message:`Removed ${i.length} items`,deleted:i,errors:a.length>0?a:void 0}}var vi,xg=h(()=>{"use strict";fe();Pe();JT();Rg();c(XT,"uninstall");vi=class extends q{static{c(this,"UninstallCommands")}async uninstall(e={},t=process.cwd()){return XT(e,t)}}});function _M(){for(let[r,e]of Object.entries(So))lt.registerCategory(r,e)}function IM(){if(!lt.has("work")){_M();for(let r of Gn){if(!r.routing)continue;let e=$M[r.routing.group];lt.registerMethod(r.name,e,r.routing.method,r)}}}var $M,Pg=h(()=>{"use strict";Jc();Wm();Ii();Bm();Kc();Gm();Vm();hi();Km();qc();zm();oo();Qc();rg();Vc();og();cg();xg();gg();Sg();$M={workflow:new so,planning:new qr,shipping:new Vr,analysis:new Jr,setup:new zs,context:new gr,primitives:new Xs,seed:new zr,install:new Xr,capture:new Bs,mcp:new Js,team:new eo,config:new Gs,uninstall:new vi,update:new ro,spec:new Qs,embeddings:new Vs,guard:new qs};c(_M,"registerCategories");c(IM,"registerAllCommands");IM()});function Si(r){let e=lt.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=DM(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}function DM(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}var Ag=h(()=>{"use strict";oo();c(Si,"findClosestCommand");c(DM,"editDistance")});function ll(r){return Object.hasOwn(cl,r)}function zT(r){let e=cl[r];return e?`'prjct ${r}' was removed in v2.
1458
1458
  \u2192 Use: ${e.replacement}
1459
- ${e.note}`:null}var cl,jg=h(()=>{"use strict";cl={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};c(ll,"isRemovedVerb");c(zT,"migrationMessage")});async function ul(r,e,t,n){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,a=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&OM.has(o))return r.spec(i,n,l);if(!o||!MM.has(o))return r.spec(a,n,l);switch(o){case"list":return r.specList(n,{md:s,status:t.status?String(t.status):void 0});case"show":return r.specShow(i,n,{md:s});case"update":return r.specUpdate(i,n,{md:s,json:t.json?String(t.json):void 0});case"set-status":return r.specSetStatus(i,n,{md:s,status:t.status?String(t.status):void 0});case"record-review":return r.specRecordReview(i,n,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return r.specLinkTask(i,n,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return r.specShip(i,n,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return r.specAudit(i,n,{md:s});case"breakdown":return r.specBreakdown(i,n,{md:s,force:t.force===!0});case"inventory":return r.specInventory(n,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}var MM,OM,$g=h(()=>{"use strict";MM=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),OM=new Set(["draft","new","create"]);c(ul,"routeSpec")});async function YT(r,e){let t=e.args.join(" ")||null,n=e.options,s=n.md===!0;if(ll(e.command)&&!lt.getByName(e.command))return{success:!1,error:zT(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!lt.getByName(e.command)&&!(e.args.length===0&&Si(e.command)!==null)){let o=[e.command,...e.args.filter(i=>!i.startsWith("-"))].join(" ");return r.capture(o,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0,force:n.force===!0})}switch(e.command){case"sync":return r.sync(e.cwd,{preview:n.preview===!0||n["dry-run"]===!0,yes:n.yes===!0,json:n.json===!0,md:s,package:n.package?String(n.package):void 0,full:n.full===!0});case"task":return r.task(t,e.cwd,{md:s,spec:n.spec?String(n.spec):void 0});case"ship":{let o=typeof n.intent=="string"?n.intent:void 0;return r.ship(t,e.cwd,{md:s,intent:o,skipHooks:n["skip-hooks"]===!0,noSpecGate:n["no-spec-gate"]===!0})}case"spec":return ul(r,e.args,n,e.cwd);case"audit-spec":return t?r.specAudit(t,e.cwd,{md:s}):{success:!1,error:"audit-spec requires a spec id"};case"workflow":return r.workflowPrefs(t,e.cwd,{md:s});case"analyze":return r.analyze(n,e.cwd);case"analysis-save-llm":return t?r.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"status":return r.status(t,e.cwd,{md:s});case"tag":return r.tag(t,e.cwd,{md:s});case"remember":return r.remember(t,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0});case"mcp":return r.mcp(t,e.cwd,{md:s});case"team":return r.team(t,e.cwd,{md:s,required:n.required===!0,minVersion:n["min-version"]?String(n["min-version"]):void 0,enforce:n.enforce===!0});case"config":return r.config(t,e.cwd,{md:s});case"guard":return r.guard(t,e.cwd,{md:s,limit:n.limit?Number(n.limit):void 0});case"embeddings":return r.embeddings(t,e.cwd,{md:s,key:n.key?String(n.key):void 0,model:n.model?String(n.model):void 0,baseUrl:n["base-url"]?String(n["base-url"]):void 0});default:return lt.execute(e.command,t,e.cwd)}}var QT=h(()=>{"use strict";Ag();oo();jg();$g();c(YT,"executeCommand")});import tn from"node:fs";import NM from"node:os";import hn from"node:path";function ZT(){let r=__dirname;for(let n=0;n<5;n++){if(tn.existsSync(hn.join(r,"package.json"))){let s=hn.join(r,"dist","daemon","entry.mjs");if(tn.existsSync(s))return s;break}r=hn.dirname(r)}let e=[hn.join(__dirname,"..","daemon","entry.mjs"),hn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of e)if(tn.existsSync(n))return n;let t=process.argv[1];return t&&tn.existsSync(t)?t:null}function _g(r,e){if(!r||e===null)return!1;try{return tn.statSync(r).mtimeMs!==e}catch{return!1}}function eC(){let r=__dirname;for(let e=0;e<6;e++){let t=hn.join(r,"package.json");try{let s=JSON.parse(tn.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let n=hn.dirname(r);if(n===r)break;r=n}return null}function tC(r){if(!r)return!1;let e=NM.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let n of t){let s;try{s=tn.realpathSync(n)}catch{continue}let o=hn.dirname(s);for(let i=0;i<6;i++){let a=hn.join(o,"package.json");try{let u=JSON.parse(tn.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==r}catch{}let l=hn.dirname(o);if(l===o)break;o=l}}return!1}function nC(){let r=$e.log();try{if(tn.statSync(r).size>LM){let t=`${r}.1`;try{tn.unlinkSync(t)}catch{}tn.renameSync(r,t)}}catch{}}function rC(r){try{return process.kill(r,0),!0}catch{return!1}}var LM,sC=h(()=>{"use strict";Rr();c(ZT,"resolveEntryPath");c(_g,"isCodeStale");c(eC,"readOwnPackageVersion");c(tC,"isGlobalVersionDrifted");LM=1024*1024;c(nC,"rotateLog");c(rC,"isProcessRunning")});var cC={};M(cC,{startDaemon:()=>WM});import Mt from"node:fs";import{createServer as FM}from"node:net";async function WM(r){process.env.PRJCT_IN_DAEMON="1";let e=$e.socket(),t=$e.pid(),n=$e.runDir();if(Mt.mkdirSync(n,{recursive:!0}),Mt.existsSync(t)){let i=parseInt(Mt.readFileSync(t,"utf-8").trim(),10);rC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Mt.unlinkSync(t)}Mt.existsSync(e)&&Mt.unlinkSync(e),nC();let s=ZT(),o=null;if(s)try{o=Mt.statSync(s).mtimeMs}catch{}if(Zr=eC(),ce={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:fu,idleTimer:null,entryPath:s,entryMtime:o,activeRequests:0,restartPending:!1},Zr)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Qi(),gu));i(Zr)||await a(Zr)}catch{}if(Ei=new hr,io=FM(i=>BM(i)),io.listen(e,()=>{Mt.chmodSync(e,384),Mt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),aC()}),io.on("error",i=>{console.error("Daemon socket error:",i.message),ao(1)}),process.on("SIGTERM",()=>ao(0)),process.on("SIGINT",()=>ao(0)),process.on("SIGHUP",()=>{Ei=new hr,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function BM(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>hu){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Cr(s)),r.destroy(),e="";return}let n;for(;(n=e.indexOf(`
1459
+ ${e.note}`:null}var cl,jg=h(()=>{"use strict";cl={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};c(ll,"isRemovedVerb");c(zT,"migrationMessage")});async function ul(r,e,t,n){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,a=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&OM.has(o))return r.spec(i,n,l);if(!o||!MM.has(o))return r.spec(a,n,l);switch(o){case"list":return r.specList(n,{md:s,status:t.status?String(t.status):void 0});case"show":return r.specShow(i,n,{md:s});case"update":return r.specUpdate(i,n,{md:s,json:t.json?String(t.json):void 0});case"set-status":return r.specSetStatus(i,n,{md:s,status:t.status?String(t.status):void 0});case"record-review":return r.specRecordReview(i,n,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return r.specLinkTask(i,n,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return r.specShip(i,n,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return r.specAudit(i,n,{md:s});case"breakdown":return r.specBreakdown(i,n,{md:s,force:t.force===!0});case"inventory":return r.specInventory(n,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}var MM,OM,$g=h(()=>{"use strict";MM=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),OM=new Set(["draft","new","create"]);c(ul,"routeSpec")});async function YT(r,e){let t=e.args.join(" ")||null,n=e.options,s=n.md===!0;if(ll(e.command)&&!lt.getByName(e.command))return{success:!1,error:zT(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!lt.getByName(e.command)&&!(e.args.length===0&&Si(e.command)!==null)){let o=[e.command,...e.args.filter(i=>!i.startsWith("-"))].join(" ");return r.capture(o,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0,force:n.force===!0})}switch(e.command){case"sync":return r.sync(e.cwd,{preview:n.preview===!0||n["dry-run"]===!0,yes:n.yes===!0,json:n.json===!0,md:s,package:n.package?String(n.package):void 0,full:n.full===!0});case"task":return r.task(t,e.cwd,{md:s,spec:n.spec?String(n.spec):void 0});case"ship":{let o=typeof n.intent=="string"?n.intent:void 0;return r.ship(t,e.cwd,{md:s,intent:o,skipHooks:n["skip-hooks"]===!0,noSpecGate:n["no-spec-gate"]===!0})}case"capture":return r.capture(t,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0,force:n.force===!0});case"spec":return ul(r,e.args,n,e.cwd);case"audit-spec":return t?r.specAudit(t,e.cwd,{md:s}):{success:!1,error:"audit-spec requires a spec id"};case"workflow":return r.workflowPrefs(t,e.cwd,{md:s});case"analyze":return r.analyze(n,e.cwd);case"analysis-save-llm":return t?r.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"status":return r.status(t,e.cwd,{md:s});case"tag":return r.tag(t,e.cwd,{md:s});case"remember":return r.remember(t,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0});case"mcp":return r.mcp(t,e.cwd,{md:s});case"team":return r.team(t,e.cwd,{md:s,required:n.required===!0,minVersion:n["min-version"]?String(n["min-version"]):void 0,enforce:n.enforce===!0});case"config":return r.config(t,e.cwd,{md:s});case"guard":return r.guard(t,e.cwd,{md:s,limit:n.limit?Number(n.limit):void 0});case"embeddings":return r.embeddings(t,e.cwd,{md:s,key:n.key?String(n.key):void 0,model:n.model?String(n.model):void 0,baseUrl:n["base-url"]?String(n["base-url"]):void 0});case"init":return r.init({idea:t,yes:n.yes===!0,pack:n.pack?String(n.pack):void 0,persona:n.persona?String(n.persona):void 0},e.cwd);case"regen":return r.regenVault(e.cwd,{md:s});case"login":return r.login({md:s,url:n.url?String(n.url):void 0});case"logout":return r.logout();case"auth":return r.auth(t,{md:s});default:return lt.execute(e.command,t,e.cwd)}}var QT=h(()=>{"use strict";Ag();oo();jg();$g();c(YT,"executeCommand")});import tn from"node:fs";import NM from"node:os";import hn from"node:path";function ZT(){let r=__dirname;for(let n=0;n<5;n++){if(tn.existsSync(hn.join(r,"package.json"))){let s=hn.join(r,"dist","daemon","entry.mjs");if(tn.existsSync(s))return s;break}r=hn.dirname(r)}let e=[hn.join(__dirname,"..","daemon","entry.mjs"),hn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of e)if(tn.existsSync(n))return n;let t=process.argv[1];return t&&tn.existsSync(t)?t:null}function _g(r,e){if(!r||e===null)return!1;try{return tn.statSync(r).mtimeMs!==e}catch{return!1}}function eC(){let r=__dirname;for(let e=0;e<6;e++){let t=hn.join(r,"package.json");try{let s=JSON.parse(tn.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let n=hn.dirname(r);if(n===r)break;r=n}return null}function tC(r){if(!r)return!1;let e=NM.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let n of t){let s;try{s=tn.realpathSync(n)}catch{continue}let o=hn.dirname(s);for(let i=0;i<6;i++){let a=hn.join(o,"package.json");try{let u=JSON.parse(tn.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==r}catch{}let l=hn.dirname(o);if(l===o)break;o=l}}return!1}function nC(){let r=$e.log();try{if(tn.statSync(r).size>LM){let t=`${r}.1`;try{tn.unlinkSync(t)}catch{}tn.renameSync(r,t)}}catch{}}function rC(r){try{return process.kill(r,0),!0}catch{return!1}}var LM,sC=h(()=>{"use strict";Rr();c(ZT,"resolveEntryPath");c(_g,"isCodeStale");c(eC,"readOwnPackageVersion");c(tC,"isGlobalVersionDrifted");LM=1024*1024;c(nC,"rotateLog");c(rC,"isProcessRunning")});var cC={};M(cC,{startDaemon:()=>WM});import Mt from"node:fs";import{createServer as FM}from"node:net";async function WM(r){process.env.PRJCT_IN_DAEMON="1";let e=$e.socket(),t=$e.pid(),n=$e.runDir();if(Mt.mkdirSync(n,{recursive:!0}),Mt.existsSync(t)){let i=parseInt(Mt.readFileSync(t,"utf-8").trim(),10);rC(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Mt.unlinkSync(t)}Mt.existsSync(e)&&Mt.unlinkSync(e),nC();let s=ZT(),o=null;if(s)try{o=Mt.statSync(s).mtimeMs}catch{}if(Zr=eC(),ce={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:fu,idleTimer:null,entryPath:s,entryMtime:o,activeRequests:0,restartPending:!1},Zr)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Qi(),gu));i(Zr)||await a(Zr)}catch{}if(Ei=new hr,io=FM(i=>BM(i)),io.listen(e,()=>{Mt.chmodSync(e,384),Mt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),aC()}),io.on("error",i=>{console.error("Daemon socket error:",i.message),ao(1)}),process.on("SIGTERM",()=>ao(0)),process.on("SIGINT",()=>ao(0)),process.on("SIGHUP",()=>{Ei=new hr,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}function BM(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>hu){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(Cr(s)),r.destroy(),e="";return}let n;for(;(n=e.indexOf(`
1460
1460
  `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await GM(o);r.write(Cr(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(Cr(i))}}}),r.on("error",()=>{})}async function GM(r){if(!ce||!Ei)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(ce.restartPending)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon restarting \u2014 retry the command"};ce.activeRequests++;try{let e=oC.then(()=>iC(r),()=>iC(r));return oC=e.then(()=>{},()=>{}),await e}finally{ce.activeRequests--,ce.restartPending&&ce.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>ao(0)))}}async function iC(r){if(!ce||!Ei)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(aC(),ce.commandsServed++,ce.lastActivity=Date.now(),ce.commandsServed%HM===0&&C.checkpointAll(),!ce.restartPending&&_g(ce.entryPath,ce.entryMtime)&&(console.log("Build changed detected \u2014 daemon will restart after this request"),ce.restartPending=!0),!ce.restartPending&&Zr&&ce.commandsServed%UM===0&&tC(Zr)&&(console.log(`Version drift detected \u2014 daemon v${Zr} is stale; shutting down so the next request spawns fresh.`),ce.restartPending=!0),r.command==="daemon")return qM(r);if(r.command==="hook")return VM(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await YT(Ei,r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1461
1461
  `)||o.message||void 0,stderr:t.join(`
1462
1462
  `)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}async function VM(r){let e=op(r.args[0]);if(!e)return{id:r.id,success:!0,exitCode:0,stdout:`{}
@@ -1697,7 +1697,7 @@ ${ee.yellow(`Command '${r}' not found.`)}
1697
1697
 
1698
1698
  Run 'prjct help' to see all available commands.
1699
1699
  `}function uN(){let r=[];r.push(""),r.push(ee.cyan.bold("All Commands")),r.push("");let e=Object.entries(So).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let s=Gn.filter(o=>o.group===t);if(s.length!==0){r.push(`${ee.bold(n.title)} ${ee.dim(`(${s.length} commands)`)}`),r.push(ee.dim(n.description)),r.push("");for(let o of s){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(ee.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1700
- `)}function dN(r){return r?r==="commands"||r==="all"?uN():lN(r):iN()}var YC,oN,ZC=h(()=>{"use strict";Ii();We();YC=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],oN=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];c(iN,"formatMainHelp");c(aN,"formatTerminalCommandHelp");c(cN,"formatAgentCommandHelp");c(lN,"formatCommandHelp");c(uN,"formatCommandList");c(dN,"getHelp")});var eR=pR((Rne,pN)=>{pN.exports={name:"prjct-cli",version:"2.37.4",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7",esbuild:"0.25.0",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.5.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var wN={};import tR from"node:os";import fl from"node:path";import Ne from"chalk";async function mN(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let n=await Promise.resolve().then(()=>mR(eR()));await hN(n.version),process.exit(0)}if(["-h","--help",void 0].includes(r)&&(yN(),process.exit(0)),r&&ll(r)&&!lt.getByName(r)){let n=cl[r];n&&(f.failWithHint({message:`'prjct ${r}' was removed in v2. ${n.note}`,hint:`Use: ${n.replacement}`}),process.exit(1))}if(r&&!lt.getByName(r)&&!(e.length===0&&Si(r)!==null)){let s=[r,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));r="capture",e=[s,...o]}let t=e.includes("--md");t||f.start();try{let n=lt.getByName(r);if(!n){let m=Si(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(ri("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(n.deprecated){let m=n.replacedBy?`Use 'prjct ${n.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}n.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:s,options:o}=fN(n,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;n.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=gN(n,s);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let l=null,u=Date.now();try{l=await I.getProjectId(process.cwd()),l&&(await As.expireIfStale(l),await As.touch(l))}catch{}let d=new hr,p;if(r==="analyze")p=await d.analyze(o);else if(r==="setup")p=await d.setup(o);else if(r==="update"||r==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,g=o.md===!0,E={task:c(y=>d.task(y,process.cwd(),{md:g,spec:o.spec?String(o.spec):void 0}),"task"),spec:c(y=>ul(d,(y??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),"audit-spec":c(y=>y?d.specAudit(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(y=>d.init({idea:y,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(y=>d.ship(y,process.cwd(),{md:g,noSpecGate:o["no-spec-gate"]===!0}),"ship"),workflow:c(y=>d.workflowPrefs(y,process.cwd(),{md:g}),"workflow"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(y=>y?d.saveLlmAnalysis(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:g}),"regen"),start:c(()=>d.start(),"start"),context:c(y=>d.context(y),"context"),status:c(y=>d.status(y,process.cwd(),{md:g}),"status"),tag:c(y=>d.tag(y,process.cwd(),{md:g}),"tag"),remember:c(y=>d.remember(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0}),"remember"),login:c(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(y=>d.auth(y,{md:g}),"auth"),seed:c(y=>d.seed(y,process.cwd(),{md:g}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:g}),"install"),capture:c(y=>d.capture(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture"),mcp:c(y=>d.mcp(y,process.cwd(),{md:g}),"mcp"),embeddings:c(y=>d.embeddings(y,process.cwd(),{md:g,key:o.key?String(o.key):void 0,model:o.model?String(o.model):void 0,baseUrl:o["base-url"]?String(o["base-url"]):void 0}),"embeddings"),guard:c(y=>d.guard(y,process.cwd(),{md:g,limit:o.limit?Number(o.limit):void 0}),"guard")}[r];if(E)p=await E(m);else throw new Error(`Command '${r}' has no handler`)}if(l){let m=Date.now()-u;try{await As.trackCommand(l,r,m)}catch{}try{await si.recordTiming(l,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let k=Number(process.hrtime.bigint()-g)/1e6;await si.recordTiming(l,"startup_time",k)}await si.recordMemory(l,{command:r})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(n){console.error("Error:",v(n)),process.env.DEBUG&&console.error(Pl(n)),t||f.end(),process.exit(1)}}function gN(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return ri("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function fN(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function hN(r){let e=await Cn(),t=fl.join(tR.homedir(),".claude","commands","p.md"),n=fl.join(tR.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([T(t),T(n),T(fl.join(process.cwd(),".cursor","commands","sync.md")),T(fl.join(process.cwd(),".cursor"))]),l=await Ao();if(console.log(`
1700
+ `)}function dN(r){return r?r==="commands"||r==="all"?uN():lN(r):iN()}var YC,oN,ZC=h(()=>{"use strict";Ii();We();YC=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],oN=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];c(iN,"formatMainHelp");c(aN,"formatTerminalCommandHelp");c(cN,"formatAgentCommandHelp");c(lN,"formatCommandHelp");c(uN,"formatCommandList");c(dN,"getHelp")});var eR=pR((Rne,pN)=>{pN.exports={name:"prjct-cli",version:"2.37.5",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7",esbuild:"0.25.0",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.5.0"},files:["assets/","bin/prjct","dist/","templates/","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var wN={};import tR from"node:os";import fl from"node:path";import Ne from"chalk";async function mN(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let n=await Promise.resolve().then(()=>mR(eR()));await hN(n.version),process.exit(0)}if(["-h","--help",void 0].includes(r)&&(yN(),process.exit(0)),r&&ll(r)&&!lt.getByName(r)){let n=cl[r];n&&(f.failWithHint({message:`'prjct ${r}' was removed in v2. ${n.note}`,hint:`Use: ${n.replacement}`}),process.exit(1))}if(r&&!lt.getByName(r)&&!(e.length===0&&Si(r)!==null)){let s=[r,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));r="capture",e=[s,...o]}let t=e.includes("--md");t||f.start();try{let n=lt.getByName(r);if(!n){let m=Si(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(ri("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,hint:g})),t||f.end(),process.exit(1)}if(n.deprecated){let m=n.replacedBy?`Use 'prjct ${n.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}n.implemented||(f.failWithHint({message:`Command '${r}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:s,options:o}=fN(n,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;n.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=gN(n,s);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let l=null,u=Date.now();try{l=await I.getProjectId(process.cwd()),l&&(await As.expireIfStale(l),await As.touch(l))}catch{}let d=new hr,p;if(r==="analyze")p=await d.analyze(o);else if(r==="setup")p=await d.setup(o);else if(r==="update"||r==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,g=o.md===!0,E={task:c(y=>d.task(y,process.cwd(),{md:g,spec:o.spec?String(o.spec):void 0}),"task"),spec:c(y=>ul(d,(y??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),"audit-spec":c(y=>y?d.specAudit(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(y=>d.init({idea:y,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(y=>d.ship(y,process.cwd(),{md:g,noSpecGate:o["no-spec-gate"]===!0}),"ship"),workflow:c(y=>d.workflowPrefs(y,process.cwd(),{md:g}),"workflow"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(y=>y?d.saveLlmAnalysis(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:g}),"regen"),start:c(()=>d.start(),"start"),context:c(y=>d.context(y),"context"),status:c(y=>d.status(y,process.cwd(),{md:g}),"status"),tag:c(y=>d.tag(y,process.cwd(),{md:g}),"tag"),remember:c(y=>d.remember(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0}),"remember"),login:c(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(y=>d.auth(y,{md:g}),"auth"),seed:c(y=>d.seed(y,process.cwd(),{md:g}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:g}),"install"),capture:c(y=>d.capture(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture"),mcp:c(y=>d.mcp(y,process.cwd(),{md:g}),"mcp"),embeddings:c(y=>d.embeddings(y,process.cwd(),{md:g,key:o.key?String(o.key):void 0,model:o.model?String(o.model):void 0,baseUrl:o["base-url"]?String(o["base-url"]):void 0}),"embeddings"),guard:c(y=>d.guard(y,process.cwd(),{md:g,limit:o.limit?Number(o.limit):void 0}),"guard")}[r];if(E)p=await E(m);else throw new Error(`Command '${r}' has no handler`)}if(l){let m=Date.now()-u;try{await As.trackCommand(l,r,m)}catch{}try{await si.recordTiming(l,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let k=Number(process.hrtime.bigint()-g)/1e6;await si.recordTiming(l,"startup_time",k)}await si.recordMemory(l,{command:r})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(n){console.error("Error:",v(n)),process.env.DEBUG&&console.error(Pl(n)),t||f.end(),process.exit(1)}}function gN(r,e){if(!r.params)return null;let t=r.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),s=r.usage.terminal||`prjct ${r.name} ${r.params}`;return ri("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${s}`})}return null}function fN(r,e){let t=[],n={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?n[i]=e[++s]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function hN(r){let e=await Cn(),t=fl.join(tR.homedir(),".claude","commands","p.md"),n=fl.join(tR.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([T(t),T(n),T(fl.join(process.cwd(),".cursor","commands","sync.md")),T(fl.join(process.cwd(),".cursor"))]),l=await Ao();if(console.log(`
1701
1701
  ${Ne.cyan("p/")} prjct v${r}
1702
1702
  ${Ne.dim("Context layer for AI coding agents")}
1703
1703
 
@@ -1451,7 +1451,7 @@ ${a.length} errors:`));for(let l of a)console.log(Ee.red(` - ${l}`))}return con
1451
1451
  `)){let n=t.trim();if(!n)continue;let s;try{s=JSON.parse(n)}catch{continue}let o=yI(s);if(o!=="assistant")continue;let i=wI(s);!i||i.length<OS||e.push({role:o,text:i})}return e}c(hI,"parseTranscript");function yI(r){let e=r.role;if(typeof e=="string")return $S(e);let t=r.message;if(t&&typeof t=="object"&&"role"in t){let s=t.role;if(typeof s=="string")return $S(s)}let n=r.type;return n==="assistant"||n==="user"||n==="system"?n:null}c(yI,"inferRole");function $S(r){let e=r.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}c($S,"normalizeRole");function wI(r){let e=r.content;if(e===void 0&&r.message&&typeof r.message=="object"&&(e=r.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let s=n;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(`
1452
1452
  `).trim()}return""}c(wI,"extractText");function kI(r){let e=[],t=new Set;for(let n of r){let s=bI(n.text);for(let o of s){if(e.length>=gI)return e;if(o.length<OS)continue;let i=o.toLowerCase(),a=fI.find(d=>i.includes(d.phrase));if(!a)continue;let l=o.length>IS?`${o.slice(0,IS)}\u2026`:o,u=SI(l);t.has(u)||(t.add(u),e.push({type:a.type,content:l,hash:u,matchedPhrase:a.phrase}))}}return e}c(kI,"extractCandidates");function bI(r){return r.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}c(bI,"splitParagraphs");function SI(r){return pI.createHash("sha256").update(r.toLowerCase().trim()).digest("hex").slice(0,16)}c(SI,"hashContent");function vI(r){let e=new Set;try{let{prjctDb:t}=(X(),Ve(Bn)),n=t.query(r,"SELECT data FROM events WHERE type LIKE 'memory.remember.%' ORDER BY id DESC LIMIT 500");for(let s of n){let o;try{o=JSON.parse(s.data)}catch{continue}if(!o||typeof o!="object")continue;let i=o.tags;if(!i||i.source!==DS)continue;let a=i.hash;typeof a=="string"&&e.add(a)}}catch{}return e}c(vI,"collectExistingAutoHashes");Ji();cr();nd();Ye();function NS(r=process.cwd(),e){return it({event:"Stop",projectPath:r,afterEmit:c(async(t,n)=>{let s=await I.readConfig(n).catch(()=>null);if(s?.projectId){try{await Bw(n)}catch{}try{await Xw(n)}catch{}if(t.transcript_path)try{await MS(n,t.transcript_path,t.session_id??null)}catch{}try{await ES(n)}catch{}try{let o=await TS(s.projectId);await CS(s.projectId,o)}catch{}if(t.transcript_path)try{if((await wS(n,t.transcript_path,t.session_id??null)).signalsRecorded>0){let i=await W.getCurrentTask(s.projectId);i?.id&&Xl.penalizeSurfaced(s.projectId,i.id)}}catch{}if(t.transcript_path)try{await _S(n,t.transcript_path,t.session_id??null)}catch{}try{await Ok.backfill(n,s,new Date().toISOString())}catch{}await ao(n,s.projectId).catch(()=>{})}},"afterEmit")},e)}c(NS,"runStopHook");function LS(r=process.cwd(),e){return it({event:"SubagentStart",projectPath:r,build:c((t,n)=>bo(n),"build")},e)}c(LS,"runSubagentStartHook");var EI={"session-start":cS,prompt:fS,"pre-commit":dS,"post-edit":uS,stop:NS,"subagent-start":LS,"cwd-changed":lS};function FS(r){return r?EI[r]:void 0}c(FS,"getHookRunner");X();function US(r){let e=Ct.getAll().map(s=>s.name),t=null,n=1/0;for(let s of e){let o=TI(r.toLowerCase(),s.toLowerCase());o<n&&(n=o,t=s)}return n<=2?t:null}c(US,"findClosestCommand");function TI(r,e){let t=r.length,n=e.length,s=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=n;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)s[o][i]=r[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][n]}c(TI,"editDistance");var HS={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};function WS(r){return Object.hasOwn(HS,r)}c(WS,"isRemovedVerb");function BS(r){let e=HS[r];return e?`'prjct ${r}' was removed in v2.
1453
1453
  \u2192 Use: ${e.replacement}
1454
- ${e.note}`:null}c(BS,"migrationMessage");var CI=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),RI=new Set(["draft","new","create"]);async function GS(r,e,t,n){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,a=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&RI.has(o))return r.spec(i,n,l);if(!o||!CI.has(o))return r.spec(a,n,l);switch(o){case"list":return r.specList(n,{md:s,status:t.status?String(t.status):void 0});case"show":return r.specShow(i,n,{md:s});case"update":return r.specUpdate(i,n,{md:s,json:t.json?String(t.json):void 0});case"set-status":return r.specSetStatus(i,n,{md:s,status:t.status?String(t.status):void 0});case"record-review":return r.specRecordReview(i,n,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return r.specLinkTask(i,n,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return r.specShip(i,n,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return r.specAudit(i,n,{md:s});case"breakdown":return r.specBreakdown(i,n,{md:s,force:t.force===!0});case"inventory":return r.specInventory(n,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}c(GS,"routeSpec");async function VS(r,e){let t=e.args.join(" ")||null,n=e.options,s=n.md===!0;if(WS(e.command)&&!Ct.getByName(e.command))return{success:!1,error:BS(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!Ct.getByName(e.command)&&!(e.args.length===0&&US(e.command)!==null)){let o=[e.command,...e.args.filter(i=>!i.startsWith("-"))].join(" ");return r.capture(o,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0,force:n.force===!0})}switch(e.command){case"sync":return r.sync(e.cwd,{preview:n.preview===!0||n["dry-run"]===!0,yes:n.yes===!0,json:n.json===!0,md:s,package:n.package?String(n.package):void 0,full:n.full===!0});case"task":return r.task(t,e.cwd,{md:s,spec:n.spec?String(n.spec):void 0});case"ship":{let o=typeof n.intent=="string"?n.intent:void 0;return r.ship(t,e.cwd,{md:s,intent:o,skipHooks:n["skip-hooks"]===!0,noSpecGate:n["no-spec-gate"]===!0})}case"spec":return GS(r,e.args,n,e.cwd);case"audit-spec":return t?r.specAudit(t,e.cwd,{md:s}):{success:!1,error:"audit-spec requires a spec id"};case"workflow":return r.workflowPrefs(t,e.cwd,{md:s});case"analyze":return r.analyze(n,e.cwd);case"analysis-save-llm":return t?r.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"status":return r.status(t,e.cwd,{md:s});case"tag":return r.tag(t,e.cwd,{md:s});case"remember":return r.remember(t,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0});case"mcp":return r.mcp(t,e.cwd,{md:s});case"team":return r.team(t,e.cwd,{md:s,required:n.required===!0,minVersion:n["min-version"]?String(n["min-version"]):void 0,enforce:n.enforce===!0});case"config":return r.config(t,e.cwd,{md:s});case"guard":return r.guard(t,e.cwd,{md:s,limit:n.limit?Number(n.limit):void 0});case"embeddings":return r.embeddings(t,e.cwd,{md:s,key:n.key?String(n.key):void 0,model:n.model?String(n.model):void 0,baseUrl:n["base-url"]?String(n["base-url"]):void 0});default:return Ct.execute(e.command,t,e.cwd)}}c(VS,"executeCommand");Oa();Oa();import Dt from"node:fs";import PI from"node:os";import Xt from"node:path";function JS(){let r=__dirname;for(let n=0;n<5;n++){if(Dt.existsSync(Xt.join(r,"package.json"))){let s=Xt.join(r,"dist","daemon","entry.mjs");if(Dt.existsSync(s))return s;break}r=Xt.dirname(r)}let e=[Xt.join(__dirname,"..","daemon","entry.mjs"),Xt.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of e)if(Dt.existsSync(n))return n;let t=process.argv[1];return t&&Dt.existsSync(t)?t:null}c(JS,"resolveEntryPath");function yp(r,e){if(!r||e===null)return!1;try{return Dt.statSync(r).mtimeMs!==e}catch{return!1}}c(yp,"isCodeStale");function qS(){let r=__dirname;for(let e=0;e<6;e++){let t=Xt.join(r,"package.json");try{let s=JSON.parse(Dt.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let n=Xt.dirname(r);if(n===r)break;r=n}return null}c(qS,"readOwnPackageVersion");function XS(r){if(!r)return!1;let e=PI.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let n of t){let s;try{s=Dt.realpathSync(n)}catch{continue}let o=Xt.dirname(s);for(let i=0;i<6;i++){let a=Xt.join(o,"package.json");try{let u=JSON.parse(Dt.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==r}catch{}let l=Xt.dirname(o);if(l===o)break;o=l}}return!1}c(XS,"isGlobalVersionDrifted");var xI=1024*1024;function zS(){let r=je.log();try{if(Dt.statSync(r).size>xI){let t=`${r}.1`;try{Dt.unlinkSync(t)}catch{}Dt.renameSync(r,t)}}catch{}}c(zS,"rotateLog");function KS(r){try{return process.kill(r,0),!0}catch{return!1}}c(KS,"isProcessRunning");var jI=50,_I=10,vs=null,vo=null,re=null,hr=null,YS=Promise.resolve();async function ZS(r){process.env.PRJCT_IN_DAEMON="1";let e=je.socket(),t=je.pid(),n=je.runDir();if(kt.mkdirSync(n,{recursive:!0}),kt.existsSync(t)){let i=parseInt(kt.readFileSync(t,"utf-8").trim(),10);KS(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),kt.unlinkSync(t)}kt.existsSync(e)&&kt.unlinkSync(e),zS();let s=JS(),o=null;if(s)try{o=kt.statSync(s).mtimeMs}catch{}if(hr=qS(),re={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:fb,idleTimer:null,entryPath:s,entryMtime:o,activeRequests:0,restartPending:!1},hr)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(mp(),Zb));i(hr)||await a(hr)}catch{}if(vo=new bs,vs=AI(i=>II(i)),vs.listen(e,()=>{kt.chmodSync(e,384),kt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),ev()}),vs.on("error",i=>{console.error("Daemon socket error:",i.message),Es(1)}),process.on("SIGTERM",()=>Es(0)),process.on("SIGINT",()=>Es(0)),process.on("SIGHUP",()=>{vo=new bs,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}c(ZS,"startDaemon");function II(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>hb){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(ys(s)),r.destroy(),e="";return}let n;for(;(n=e.indexOf(`
1454
+ ${e.note}`:null}c(BS,"migrationMessage");var CI=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),RI=new Set(["draft","new","create"]);async function GS(r,e,t,n){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,a=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&RI.has(o))return r.spec(i,n,l);if(!o||!CI.has(o))return r.spec(a,n,l);switch(o){case"list":return r.specList(n,{md:s,status:t.status?String(t.status):void 0});case"show":return r.specShow(i,n,{md:s});case"update":return r.specUpdate(i,n,{md:s,json:t.json?String(t.json):void 0});case"set-status":return r.specSetStatus(i,n,{md:s,status:t.status?String(t.status):void 0});case"record-review":return r.specRecordReview(i,n,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return r.specLinkTask(i,n,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return r.specShip(i,n,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return r.specAudit(i,n,{md:s});case"breakdown":return r.specBreakdown(i,n,{md:s,force:t.force===!0});case"inventory":return r.specInventory(n,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}c(GS,"routeSpec");async function VS(r,e){let t=e.args.join(" ")||null,n=e.options,s=n.md===!0;if(WS(e.command)&&!Ct.getByName(e.command))return{success:!1,error:BS(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!Ct.getByName(e.command)&&!(e.args.length===0&&US(e.command)!==null)){let o=[e.command,...e.args.filter(i=>!i.startsWith("-"))].join(" ");return r.capture(o,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0,force:n.force===!0})}switch(e.command){case"sync":return r.sync(e.cwd,{preview:n.preview===!0||n["dry-run"]===!0,yes:n.yes===!0,json:n.json===!0,md:s,package:n.package?String(n.package):void 0,full:n.full===!0});case"task":return r.task(t,e.cwd,{md:s,spec:n.spec?String(n.spec):void 0});case"ship":{let o=typeof n.intent=="string"?n.intent:void 0;return r.ship(t,e.cwd,{md:s,intent:o,skipHooks:n["skip-hooks"]===!0,noSpecGate:n["no-spec-gate"]===!0})}case"capture":return r.capture(t,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0,force:n.force===!0});case"spec":return GS(r,e.args,n,e.cwd);case"audit-spec":return t?r.specAudit(t,e.cwd,{md:s}):{success:!1,error:"audit-spec requires a spec id"};case"workflow":return r.workflowPrefs(t,e.cwd,{md:s});case"analyze":return r.analyze(n,e.cwd);case"analysis-save-llm":return t?r.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"status":return r.status(t,e.cwd,{md:s});case"tag":return r.tag(t,e.cwd,{md:s});case"remember":return r.remember(t,e.cwd,{md:s,tags:n.tags?String(n.tags):void 0});case"mcp":return r.mcp(t,e.cwd,{md:s});case"team":return r.team(t,e.cwd,{md:s,required:n.required===!0,minVersion:n["min-version"]?String(n["min-version"]):void 0,enforce:n.enforce===!0});case"config":return r.config(t,e.cwd,{md:s});case"guard":return r.guard(t,e.cwd,{md:s,limit:n.limit?Number(n.limit):void 0});case"embeddings":return r.embeddings(t,e.cwd,{md:s,key:n.key?String(n.key):void 0,model:n.model?String(n.model):void 0,baseUrl:n["base-url"]?String(n["base-url"]):void 0});case"init":return r.init({idea:t,yes:n.yes===!0,pack:n.pack?String(n.pack):void 0,persona:n.persona?String(n.persona):void 0},e.cwd);case"regen":return r.regenVault(e.cwd,{md:s});case"login":return r.login({md:s,url:n.url?String(n.url):void 0});case"logout":return r.logout();case"auth":return r.auth(t,{md:s});default:return Ct.execute(e.command,t,e.cwd)}}c(VS,"executeCommand");Oa();Oa();import Dt from"node:fs";import PI from"node:os";import Xt from"node:path";function JS(){let r=__dirname;for(let n=0;n<5;n++){if(Dt.existsSync(Xt.join(r,"package.json"))){let s=Xt.join(r,"dist","daemon","entry.mjs");if(Dt.existsSync(s))return s;break}r=Xt.dirname(r)}let e=[Xt.join(__dirname,"..","daemon","entry.mjs"),Xt.join(__dirname,"..","dist","daemon","entry.mjs")];for(let n of e)if(Dt.existsSync(n))return n;let t=process.argv[1];return t&&Dt.existsSync(t)?t:null}c(JS,"resolveEntryPath");function yp(r,e){if(!r||e===null)return!1;try{return Dt.statSync(r).mtimeMs!==e}catch{return!1}}c(yp,"isCodeStale");function qS(){let r=__dirname;for(let e=0;e<6;e++){let t=Xt.join(r,"package.json");try{let s=JSON.parse(Dt.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let n=Xt.dirname(r);if(n===r)break;r=n}return null}c(qS,"readOwnPackageVersion");function XS(r){if(!r)return!1;let e=PI.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let n of t){let s;try{s=Dt.realpathSync(n)}catch{continue}let o=Xt.dirname(s);for(let i=0;i<6;i++){let a=Xt.join(o,"package.json");try{let u=JSON.parse(Dt.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==r}catch{}let l=Xt.dirname(o);if(l===o)break;o=l}}return!1}c(XS,"isGlobalVersionDrifted");var xI=1024*1024;function zS(){let r=je.log();try{if(Dt.statSync(r).size>xI){let t=`${r}.1`;try{Dt.unlinkSync(t)}catch{}Dt.renameSync(r,t)}}catch{}}c(zS,"rotateLog");function KS(r){try{return process.kill(r,0),!0}catch{return!1}}c(KS,"isProcessRunning");var jI=50,_I=10,vs=null,vo=null,re=null,hr=null,YS=Promise.resolve();async function ZS(r){process.env.PRJCT_IN_DAEMON="1";let e=je.socket(),t=je.pid(),n=je.runDir();if(kt.mkdirSync(n,{recursive:!0}),kt.existsSync(t)){let i=parseInt(kt.readFileSync(t,"utf-8").trim(),10);KS(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),kt.unlinkSync(t)}kt.existsSync(e)&&kt.unlinkSync(e),zS();let s=JS(),o=null;if(s)try{o=kt.statSync(s).mtimeMs}catch{}if(hr=qS(),re={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:fb,idleTimer:null,entryPath:s,entryMtime:o,activeRequests:0,restartPending:!1},hr)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(mp(),Zb));i(hr)||await a(hr)}catch{}if(vo=new bs,vs=AI(i=>II(i)),vs.listen(e,()=>{kt.chmodSync(e,384),kt.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),ev()}),vs.on("error",i=>{console.error("Daemon socket error:",i.message),Es(1)}),process.on("SIGTERM",()=>Es(0)),process.on("SIGINT",()=>Es(0)),process.on("SIGHUP",()=>{vo=new bs,console.log("Daemon reloaded (SIGHUP)")}),!r.foreground)try{process.stdin?.unref?.()}catch{}}c(ZS,"startDaemon");function II(r){let e="";r.on("data",async t=>{if(e+=t.toString(),e.length>hb){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};r.write(ys(s)),r.destroy(),e="";return}let n;for(;(n=e.indexOf(`
1455
1455
  `))!==-1;){let s=e.slice(0,n);if(e=e.slice(n+1),!!s.trim())try{let o=JSON.parse(s),i=await $I(o);r.write(ys(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};r.write(ys(i))}}}),r.on("error",()=>{})}c(II,"handleConnection");async function $I(r){if(!re||!vo)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(re.restartPending)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon restarting \u2014 retry the command"};re.activeRequests++;try{let e=YS.then(()=>QS(r),()=>QS(r));return YS=e.then(()=>{},()=>{}),await e}finally{re.activeRequests--,re.restartPending&&re.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>Es(0)))}}c($I,"handleRequest");async function QS(r){if(!re||!vo)return{id:r.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(ev(),re.commandsServed++,re.lastActivity=Date.now(),re.commandsServed%jI===0&&v.checkpointAll(),!re.restartPending&&yp(re.entryPath,re.entryMtime)&&(console.log("Build changed detected \u2014 daemon will restart after this request"),re.restartPending=!0),!re.restartPending&&hr&&re.commandsServed%_I===0&&XS(hr)&&(console.log(`Version drift detected \u2014 daemon v${hr} is stale; shutting down so the next request spawns fresh.`),re.restartPending=!0),r.command==="daemon")return OI(r);if(r.command==="hook")return DI(r);if(r.command==="__ping")return{id:r.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],n=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await VS(vo,r);return{id:r.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1456
1456
  `)||o.message||void 0,stderr:t.join(`
1457
1457
  `)||o.error||void 0,result:o}}finally{console.log=n,console.error=s}}catch(e){return{id:r.id,success:!1,exitCode:1,stderr:e.message}}}c(QS,"handleRequestInner");async function DI(r){let e=FS(r.args[0]);if(!e)return{id:r.id,success:!0,exitCode:0,stdout:`{}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.37.4",
3
+ "version": "2.37.5",
4
4
  "description": "Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",
5
5
  "main": "dist/bin/prjct.mjs",
6
6
  "bin": {