prjct-cli 2.46.0 → 2.46.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,11 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.46.1] - 2026-06-19
6
+
7
+ ### Fixed
8
+ - `prjct spec audit <id> --lenses a,b,c` now actually overrides the lens set. The flag was dropped by every CLI dispatch path (`route-spec`, daemon `dispatch`, and the `audit-spec` alias), which forwarded only `{ md }` — so the documented override silently fell back to the deterministic baseline (shipped that way in 2.46.0). Now forwarded through all paths, with a router-level test that drives `routeSpec` (the earlier tests called the method directly and missed the gap).
9
+
5
10
  ## [2.46.0] - 2026-06-19
6
11
 
7
12
  ### Added
@@ -1557,7 +1557,7 @@ ${o.map(l=>`- \`${l}\``).join(`
1557
1557
  `)}`:"### `lean:` markers in source\n> none found.";console.log(F("## Lean debt",i,a))}else{g.info(`Lean debt \u2014 ${s.length} logged, ${o.length} \`lean:\` markers in source`);for(let i of s)g.info(` \u2022 ${i.content.split(`
1558
1558
  `)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(r){return I(w(r),t)}}};c(ax,"effectiveMode");c(yo,"safeGit");c(PL,"resolveBase");c(AL,"collectReviewDiff");c(jL,"scanLeanMarkers");$L=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,cx=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;c(lx,"emptySmells");c(ux,"scanDiffSmells");c(dx,"leanFlags");c(sx,"formatSmells");_L={effectiveMode:ax,scanDiffSmells:ux,leanFlags:dx,LEAN_MODES:Li,MANY_NEW_FILES:ix,OVER_ENGINEERING_RE:cx}});function gx(){for(let n of fx)n()}function Ke(n){let e;return fx.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}function DL(){for(let[n,e]of Object.entries(Ai))Ue.registerCategory(n,e)}function ML(){if(!Ue.has("work")){DL();for(let n of mn)n.routing&&Ue.registerLazyMethod(n.name,IL[n.routing.group],n.routing.method,n)}}var fx,IL,dh=h(()=>{"use strict";Dl();ho();fx=[];c(gx,"resetGroupLoaders");c(Ke,"lazy");IL={workflow:Ke(async()=>new(await Promise.resolve().then(()=>(ig(),og))).WorkflowCommands),planning:Ke(async()=>new(await Promise.resolve().then(()=>(wl(),yl))).PlanningCommands),shipping:Ke(async()=>new(await Promise.resolve().then(()=>(hl(),gl))).ShippingCommands),analysis:Ke(async()=>new(await Promise.resolve().then(()=>(dl(),ul))).AnalysisCommands),setup:Ke(async()=>new(await Promise.resolve().then(()=>(gg(),fg))).SetupCommands),context:Ke(async()=>new(await Promise.resolve().then(()=>(Gl(),Wl))).ContextCommands),primitives:Ke(async()=>new(await Promise.resolve().then(()=>(Pg(),xg))).PrimitiveCommands),seed:Ke(async()=>new(await Promise.resolve().then(()=>(ql(),Bl))).SeedCommands),install:Ke(async()=>new(await Promise.resolve().then(()=>(Mi(),Di))).InstallCommands),capture:Ke(async()=>new(await Promise.resolve().then(()=>(Ig(),_g))).CaptureCommands),mcp:Ke(async()=>new(await Promise.resolve().then(()=>(Lg(),Ng))).McpCommands),team:Ke(async()=>new(await Promise.resolve().then(()=>(Gg(),Wg))).TeamCommands),config:Ke(async()=>new(await Promise.resolve().then(()=>(Vg(),qg))).ConfigCommands),uninstall:Ke(async()=>new(await Promise.resolve().then(()=>(lh(),ch))).UninstallCommands),update:Ke(async()=>new(await Promise.resolve().then(()=>(Eg(),Sg))).UpdateCommands),spec:Ke(async()=>new(await Promise.resolve().then(()=>(nh(),th))).SpecCommands),embeddings:Ke(async()=>new(await Promise.resolve().then(()=>(Xg(),Kg))).EmbeddingsCommands),guard:Ke(async()=>new(await Promise.resolve().then(()=>(Qg(),Yg))).GuardCommands),lean:Ke(async()=>new(await Promise.resolve().then(()=>(mx(),px))).LeanCommands)};c(DL,"registerCategories");c(ML,"registerAllCommands");ML()});function Fi(n){let e=Ue.getAll().map(s=>s.name),t=null,r=1/0;for(let s of e){let o=OL(n.toLowerCase(),s.toLowerCase());o<r&&(r=o,t=s)}return r<=2?t:null}function OL(n,e){let t=n.length,r=e.length,s=Array.from({length:t+1},()=>Array(r+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=r;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=r;i++)s[o][i]=n[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][r]}var ph=h(()=>{"use strict";ho();c(Fi,"findClosestCommand");c(OL,"editDistance")});function NL(n){return n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function zl(n,e){let t=c(s=>n[s]!==void 0?n[s]:n[NL(s)],"pick"),r={md:n.md===!0};for(let s of e.booleans??[])r[s]=t(s)===!0;for(let s of e.strings??[]){let o=t(s);r[s]=o!=null&&o!==!1&&o!==""?String(o):void 0}for(let s of e.numbers??[]){let o=t(s),i=o!=null&&o!==!1&&o!==""?Number(o):Number.NaN;r[s]=Number.isNaN(i)?void 0:i}return r}var mh=h(()=>{"use strict";c(NL,"kebab");c(zl,"mapOptions")});function Ql(n){return Object.hasOwn(Yl,n)}function hx(n){let e=Yl[n];return e?`'prjct ${n}' was removed in v2.
1559
1559
  \u2192 Use: ${e.replacement}
1560
- ${e.note}`:null}var Yl,fh=h(()=>{"use strict";Yl={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(Ql,"isRemovedVerb");c(hx,"migrationMessage")});async function Zl(n,e,t,r){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&&FL.has(o))return n.spec(i,r,l);if(!o||!LL.has(o))return n.spec(a,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}var LL,FL,gh=h(()=>{"use strict";LL=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),FL=new Set(["draft","new","create"]);c(Zl,"routeSpec")});async function yx(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(Ql(e.command)&&!Ue.getByName(e.command))return{success:!1,error:hx(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!Ue.getByName(e.command)&&!(e.args.length===0&&Fi(e.command)!==null)){let i=[e.command,...e.args.filter(a=>!a.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=Ue.getByName(e.command);if(o?.optionSchema)return Ue.executeWithOptions(e.command,t,e.cwd,zl(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return Zl(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});case"login":return n.login({md:s,url:r.url?String(r.url):void 0});case"logout":return n.logout();case"auth":return n.auth(t,{md:s});default:return Ue.execute(e.command,t,e.cwd)}}var wx=h(()=>{"use strict";ph();mh();ho();fh();gh();c(yx,"executeCommand")});import fn from"node:fs";import HL from"node:os";import Dn from"node:path";function kx(){let n=__dirname;for(let r=0;r<5;r++){if(fn.existsSync(Dn.join(n,"package.json"))){let s=Dn.join(n,"dist","daemon","entry.mjs");if(fn.existsSync(s))return s;break}n=Dn.dirname(n)}let e=[Dn.join(__dirname,"..","daemon","entry.mjs"),Dn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(fn.existsSync(r))return r;let t=process.argv[1];return t&&fn.existsSync(t)?t:null}function bx(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}function hh(n,e){if(!n||e===null)return!1;try{return fn.statSync(n).mtimeMs!==e}catch{return!1}}function vx(){let n=__dirname;for(let e=0;e<6;e++){let t=Dn.join(n,"package.json");try{let s=JSON.parse(fn.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=Dn.dirname(n);if(r===n)break;n=r}return null}function Sx(n){if(!n)return!1;let e=HL.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let r of t){let s;try{s=fn.realpathSync(r)}catch{continue}let o=Dn.dirname(s);for(let i=0;i<6;i++){let a=Dn.join(o,"package.json");try{let u=JSON.parse(fn.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=Dn.dirname(o);if(l===o)break;o=l}}return!1}function Ex(){let n=_e.log();try{if(fn.statSync(n).size>UL){let t=`${n}.1`;try{fn.unlinkSync(t)}catch{}fn.renameSync(n,t)}}catch{}}function Tx(n){try{return process.kill(n,0),!0}catch{return!1}}var UL,Cx=h(()=>{"use strict";Br();c(kx,"resolveEntryPath");c(bx,"decideRestart");c(hh,"isCodeStale");c(vx,"readOwnPackageVersion");c(Sx,"isGlobalVersionDrifted");UL=1024*1024;c(Ex,"rotateLog");c(Tx,"isProcessRunning")});var jx={};A(jx,{startDaemon:()=>qL});import Ft from"node:fs";import{createServer as WL}from"node:net";async function qL(n){process.env.PRJCT_IN_DAEMON="1";let e=_e.socket(),t=_e.pid(),r=_e.runDir();if(Ft.mkdirSync(r,{recursive:!0}),Ft.existsSync(t)){let i=parseInt(Ft.readFileSync(t,"utf-8").trim(),10);Tx(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ft.unlinkSync(t)}Ft.existsSync(e)&&Ft.unlinkSync(e),Ex();let s=kx(),o=null;if(s)try{o=Ft.statSync(s).mtimeMs}catch{}if(wo=vx(),ue={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:ld,idleTimer:null,entryPath:s,entryMtime:o,activeRequests:0,restartPending:!1},wo)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Oa(),xd));i(wo)||await a(wo)}catch{}if(Hi=new ds,ko=WL(i=>VL(i)),ko.listen(e,()=>{Ft.chmodSync(e,384),Ft.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),Ax()}),ko.on("error",i=>{console.error("Daemon socket error:",i.message),ps(1)}),process.on("SIGTERM",()=>ps(0)),process.on("SIGINT",()=>ps(0)),process.on("SIGHUP",()=>{Hi=new ds,gx(),Ue.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}function VL(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>ud){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(Gr(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
1560
+ ${e.note}`:null}var Yl,fh=h(()=>{"use strict";Yl={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(Ql,"isRemovedVerb");c(hx,"migrationMessage")});async function Zl(n,e,t,r){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&&FL.has(o))return n.spec(i,r,l);if(!o||!LL.has(o))return n.spec(a,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s,lenses:t.lenses?String(t.lenses):void 0});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}var LL,FL,gh=h(()=>{"use strict";LL=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),FL=new Set(["draft","new","create"]);c(Zl,"routeSpec")});async function yx(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(Ql(e.command)&&!Ue.getByName(e.command))return{success:!1,error:hx(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!Ue.getByName(e.command)&&!(e.args.length===0&&Fi(e.command)!==null)){let i=[e.command,...e.args.filter(a=>!a.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=Ue.getByName(e.command);if(o?.optionSchema)return Ue.executeWithOptions(e.command,t,e.cwd,zl(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return Zl(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s,lenses:r.lenses?String(r.lenses):void 0}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});case"login":return n.login({md:s,url:r.url?String(r.url):void 0});case"logout":return n.logout();case"auth":return n.auth(t,{md:s});default:return Ue.execute(e.command,t,e.cwd)}}var wx=h(()=>{"use strict";ph();mh();ho();fh();gh();c(yx,"executeCommand")});import fn from"node:fs";import HL from"node:os";import Dn from"node:path";function kx(){let n=__dirname;for(let r=0;r<5;r++){if(fn.existsSync(Dn.join(n,"package.json"))){let s=Dn.join(n,"dist","daemon","entry.mjs");if(fn.existsSync(s))return s;break}n=Dn.dirname(n)}let e=[Dn.join(__dirname,"..","daemon","entry.mjs"),Dn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(fn.existsSync(r))return r;let t=process.argv[1];return t&&fn.existsSync(t)?t:null}function bx(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}function hh(n,e){if(!n||e===null)return!1;try{return fn.statSync(n).mtimeMs!==e}catch{return!1}}function vx(){let n=__dirname;for(let e=0;e<6;e++){let t=Dn.join(n,"package.json");try{let s=JSON.parse(fn.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=Dn.dirname(n);if(r===n)break;n=r}return null}function Sx(n){if(!n)return!1;let e=HL.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let r of t){let s;try{s=fn.realpathSync(r)}catch{continue}let o=Dn.dirname(s);for(let i=0;i<6;i++){let a=Dn.join(o,"package.json");try{let u=JSON.parse(fn.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=Dn.dirname(o);if(l===o)break;o=l}}return!1}function Ex(){let n=_e.log();try{if(fn.statSync(n).size>UL){let t=`${n}.1`;try{fn.unlinkSync(t)}catch{}fn.renameSync(n,t)}}catch{}}function Tx(n){try{return process.kill(n,0),!0}catch{return!1}}var UL,Cx=h(()=>{"use strict";Br();c(kx,"resolveEntryPath");c(bx,"decideRestart");c(hh,"isCodeStale");c(vx,"readOwnPackageVersion");c(Sx,"isGlobalVersionDrifted");UL=1024*1024;c(Ex,"rotateLog");c(Tx,"isProcessRunning")});var jx={};A(jx,{startDaemon:()=>qL});import Ft from"node:fs";import{createServer as WL}from"node:net";async function qL(n){process.env.PRJCT_IN_DAEMON="1";let e=_e.socket(),t=_e.pid(),r=_e.runDir();if(Ft.mkdirSync(r,{recursive:!0}),Ft.existsSync(t)){let i=parseInt(Ft.readFileSync(t,"utf-8").trim(),10);Tx(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Ft.unlinkSync(t)}Ft.existsSync(e)&&Ft.unlinkSync(e),Ex();let s=kx(),o=null;if(s)try{o=Ft.statSync(s).mtimeMs}catch{}if(wo=vx(),ue={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:ld,idleTimer:null,entryPath:s,entryMtime:o,activeRequests:0,restartPending:!1},wo)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Oa(),xd));i(wo)||await a(wo)}catch{}if(Hi=new ds,ko=WL(i=>VL(i)),ko.listen(e,()=>{Ft.chmodSync(e,384),Ft.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),Ax()}),ko.on("error",i=>{console.error("Daemon socket error:",i.message),ps(1)}),process.on("SIGTERM",()=>ps(0)),process.on("SIGINT",()=>ps(0)),process.on("SIGHUP",()=>{Hi=new ds,gx(),Ue.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}function VL(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>ud){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(Gr(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
1561
1561
  `))!==-1;){let s=e.slice(0,r);if(e=e.slice(r+1),!!s.trim())try{let o=JSON.parse(s),i=await KL(o);n.write(Gr(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(Gr(i))}}}),n.on("error",()=>{})}function JL(n){if(!ue||ue.restartPending)return;let e=hh(ue.entryPath,ue.entryMtime),t=bx({codeStale:e,command:n,ownVersion:wo,now:Date.now(),lastDriftCheckMs:Rx,driftMinIntervalMs:BL,checkDrift:Sx});Rx=t.lastDriftCheckMs,t.restart&&(ue.restartPending=!0,console.log(e?"Build change detected \u2014 daemon will restart; request runs on fresh code.":`Version drift detected \u2014 daemon v${wo} is stale; request runs on fresh code.`))}async function KL(n){if(!ue||!Hi)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(JL(n.command),ue.restartPending&&n.command!=="daemon"&&n.command!=="__ping")return ue.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>ps(0))),{id:n.id,success:!1,exitCode:1,retry:!0,stderr:"daemon code is stale \u2014 running directly"};ue.activeRequests++;try{let e=xx.then(()=>Px(n),()=>Px(n));return xx=e.then(()=>{},()=>{}),await e}finally{ue.activeRequests--,ue.restartPending&&ue.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>ps(0)))}}async function Px(n){if(!ue||!Hi)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(Ax(),ue.commandsServed++,ue.lastActivity=Date.now(),ue.commandsServed%GL===0&&E.checkpointAll(),n.command==="daemon")return zL(n);if(n.command==="hook")return XL(n);if(n.command==="__ping")return{id:n.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],r=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await yx(Hi,n);return{id:n.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1562
1562
  `)||o.message||void 0,stderr:t.join(`
1563
1563
  `)||o.error||void 0,result:o}}finally{console.log=r,console.error=s}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}async function XL(n){let e=Bf(n.args[0]);if(!e)return{id:n.id,success:!0,exitCode:0,stdout:`{}
@@ -1790,7 +1790,7 @@ ${gs.dim("Providers:")}`}var pH,Hh=h(()=>{"use strict";pH={ready:gs.green("\u271
1790
1790
  ${s.dim("Run 'prjct start' to configure (CLI providers)")}
1791
1791
  ${s.dim("Run 'prjct init' to configure (Cursor/Windsurf IDE)")}
1792
1792
  ${s.cyan("https://prjct.app")}
1793
- `)}else return!1;return!0}var vP=h(()=>{"use strict";c(mH,"runBinCommand")});var SP=DP((oae,fH)=>{fH.exports={name:"prjct-cli",version:"2.46.0",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.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 bH={};import EP from"node:os";import su from"node:path";import hs from"chalk";async function gH(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>MP(SP()));await wH(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(kH(),process.exit(0)),n&&Ql(n)&&!Ue.getByName(n)){let r=Yl[n];r&&(g.failWithHint({message:`'prjct ${n}' was removed in v2. ${r.note}`,hint:`Use: ${r.replacement}`}),process.exit(1))}if(n&&!Ue.getByName(n)&&!(e.length===0&&Fi(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=Ue.getByName(n);if(!r){let m=Fi(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(Ho("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||g.end(),process.exit(1)}if(r.deprecated){let m=r.replacedBy?`Use 'prjct ${r.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}r.implemented||(g.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||g.end(),process.exit(1));let{parsedArgs:s,options:o}=yH(r,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;r.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let a=hH(r,s);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await P.getProjectId(process.cwd()),l&&(await ji.expireIfStale(l),await ji.touch(l))}catch{}let d=new ds,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update"||n==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,y=Ue.getByName(n);if(y?.optionSchema)p=await Ue.executeWithOptions(n,m,process.cwd(),zl(o,y.optionSchema));else{let k={spec:c(b=>Zl(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),"audit-spec":c(b=>b?d.specAudit(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(b=>b?d.saveLlmAnalysis(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:f}),"regen"),start:c(()=>d.start(),"start"),login:c(()=>d.login({md:f,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(b=>d.auth(b,{md:f}),"auth")}[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 ji.trackCommand(l,n,m)}catch{}try{await $i.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await $i.recordTiming(l,"startup_time",y)}await $i.recordMemory(l,{command:n})}catch{}}p?.message&&console.log(p.message),t||g.end(),process.exit(p?.success?0:1)}catch(r){console.error("Error:",w(r)),process.env.DEBUG&&console.error(hu(r)),t||g.end(),process.exit(1)}}function hH(n,e){if(!n.params)return null;let t=n.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let r=t.map(o=>o.slice(1,-1)).join(", "),s=n.usage.terminal||`prjct ${n.name} ${n.params}`;return Ho("MISSING_PARAM",{message:`Missing required parameter: ${r}`,hint:`Usage: ${s}`})}return null}function yH(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 wH(n){let e=await Gn(),t=su.join(EP.homedir(),".claude","commands","p.md"),r=su.join(EP.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([S(t),S(r),S(su.join(process.cwd(),".cursor","commands","sync.md")),S(su.join(process.cwd(),".cursor"))]),l=await Wo();console.log(Fh(n)),console.log(Po("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?hs.dim(` (v${e.claude.version})`):"")),console.log(Po("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?hs.dim(` (v${e.gemini.version})`):"")),console.log(Po("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${hs.dim("(run prjct start)")}`:"")),console.log(Po("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${hs.dim("(use /sync, /task)")}`:a?` ${hs.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
1793
+ `)}else return!1;return!0}var vP=h(()=>{"use strict";c(mH,"runBinCommand")});var SP=DP((oae,fH)=>{fH.exports={name:"prjct-cli",version:"2.46.1",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.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 bH={};import EP from"node:os";import su from"node:path";import hs from"chalk";async function gH(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>MP(SP()));await wH(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(kH(),process.exit(0)),n&&Ql(n)&&!Ue.getByName(n)){let r=Yl[n];r&&(g.failWithHint({message:`'prjct ${n}' was removed in v2. ${r.note}`,hint:`Use: ${r.replacement}`}),process.exit(1))}if(n&&!Ue.getByName(n)&&!(e.length===0&&Fi(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=Ue.getByName(n);if(!r){let m=Fi(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(Ho("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||g.end(),process.exit(1)}if(r.deprecated){let m=r.replacedBy?`Use 'prjct ${r.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}r.implemented||(g.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||g.end(),process.exit(1));let{parsedArgs:s,options:o}=yH(r,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;r.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let a=hH(r,s);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await P.getProjectId(process.cwd()),l&&(await ji.expireIfStale(l),await ji.touch(l))}catch{}let d=new ds,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update"||n==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,y=Ue.getByName(n);if(y?.optionSchema)p=await Ue.executeWithOptions(n,m,process.cwd(),zl(o,y.optionSchema));else{let k={spec:c(b=>Zl(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),"audit-spec":c(b=>b?d.specAudit(b,process.cwd(),{md:f,lenses:o.lenses?String(o.lenses):void 0}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(b=>b?d.saveLlmAnalysis(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:f}),"regen"),start:c(()=>d.start(),"start"),login:c(()=>d.login({md:f,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(b=>d.auth(b,{md:f}),"auth")}[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 ji.trackCommand(l,n,m)}catch{}try{await $i.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await $i.recordTiming(l,"startup_time",y)}await $i.recordMemory(l,{command:n})}catch{}}p?.message&&console.log(p.message),t||g.end(),process.exit(p?.success?0:1)}catch(r){console.error("Error:",w(r)),process.env.DEBUG&&console.error(hu(r)),t||g.end(),process.exit(1)}}function hH(n,e){if(!n.params)return null;let t=n.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let r=t.map(o=>o.slice(1,-1)).join(", "),s=n.usage.terminal||`prjct ${n.name} ${n.params}`;return Ho("MISSING_PARAM",{message:`Missing required parameter: ${r}`,hint:`Usage: ${s}`})}return null}function yH(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 wH(n){let e=await Gn(),t=su.join(EP.homedir(),".claude","commands","p.md"),r=su.join(EP.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([S(t),S(r),S(su.join(process.cwd(),".cursor","commands","sync.md")),S(su.join(process.cwd(),".cursor"))]),l=await Wo();console.log(Fh(n)),console.log(Po("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?hs.dim(` (v${e.claude.version})`):"")),console.log(Po("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?hs.dim(` (v${e.gemini.version})`):"")),console.log(Po("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${hs.dim("(run prjct start)")}`:"")),console.log(Po("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${hs.dim("(use /sync, /task)")}`:a?` ${hs.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
1794
1794
  ${hs.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1795
1795
  ${hs.cyan("https://prjct.app")}
1796
1796
  `)}function kH(){console.log(`
@@ -1519,7 +1519,7 @@ ${a}`:i,tD)},"build")},e)}c(GE,"runPromptHook");ie();oc();import x0 from"node:fs
1519
1519
  `)}c(d0,"formatSkillMiss");function p0(n,e){let t=`${n}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return YD.createHash("sha256").update(t).digest("hex")}c(p0,"hashKey");function m0(n,e){let t=$.recall(n,{types:[...t0],limit:120}),r=Date.now()-n0,s=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>r||e&&o.tags.session===e||s.push({id:o.id,type:o.type,content:o.content,fileTag:o.tags.file??"",rememberedAt:o.rememberedAt,provenance:o.provenance,session:o.tags.session??""}));return s}c(m0,"recallCandidates");function g0(n){try{let e=$.recall(n,{types:["improvement-signal"],tags:{source:aT},limit:100,dedupeByKey:!1}),t=new Set;for(let r of e)r.tags.key&&t.add(r.tags.key);return t}catch{return new Set}}c(g0,"existingSkillMissKeys");function f0(n){try{let e=Be("node:fs"),r=Be("node:path").join(n,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(r,"utf-8")).projectId??null}catch{return null}}c(f0,"projectIdFromPath");ie();he();import h0 from"node:crypto";import y0 from"node:fs/promises";var mT="transcript-auto",gT=80,dT=1500,w0=12,k0=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"}];async function fT(n,e,t,r={}){let s={scanned:0,ingested:0,skipped:[],errors:[]},o=r.preloadedConfig!==void 0?r.preloadedConfig:await _.readConfig(n).catch(()=>null);if(!o?.projectId)return s.errors.push("no project config"),s;let i;if(r.preloadedLines)i=r.preloadedLines;else{let p;try{p=await y0.readFile(e,"utf-8")}catch(m){return s.errors.push(`transcript read failed: ${m.message}`),s}i=Yn(p)}let a=b0(i);if(s.scanned=a.length,a.length===0)return s;let l=E0(a);if(l.length===0)return s;let u=R0(o.projectId),d=t?t.slice(0,12):"unknown";for(let p of l){if(u.has(p.hash)){s.skipped.push({reason:"duplicate",phrase:p.matchedPhrase});continue}try{await $.remember(n,{type:p.type,content:p.content,tags:{source:mT,session:d,hash:p.hash,phrase:p.matchedPhrase},provenance:"inferred",projectId:o.projectId}),s.ingested+=1}catch(m){s.errors.push(`remember failed: ${m.message}`)}}return s}c(fT,"ingestTranscript");function b0(n){let e=[];for(let t of n){let r=S0(t);if(r!=="assistant")continue;let s=v0(t);!s||s.length<gT||e.push({role:r,text:s})}return e}c(b0,"projectMessages");function S0(n){let e=n.role;if(typeof e=="string")return pT(e);let t=n.message;if(t&&typeof t=="object"&&"role"in t){let s=t.role;if(typeof s=="string")return pT(s)}let r=n.type;return r==="assistant"||r==="user"||r==="system"?r:null}c(S0,"inferRole");function pT(n){let e=n.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}c(pT,"normalizeRole");function v0(n){let e=n.content;if(e===void 0&&n.message&&typeof n.message=="object"&&(e=n.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let r of e){if(!r||typeof r!="object")continue;let s=r;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(`
1520
1520
  `).trim()}return""}c(v0,"extractText");function E0(n){let e=[],t=new Set;for(let r of n){let s=T0(r.text);for(let o of s){if(e.length>=w0)return e;if(o.length<gT)continue;let i=o.toLowerCase(),a=k0.find(d=>i.includes(d.phrase));if(!a)continue;let l=o.length>dT?`${o.slice(0,dT)}\u2026`:o,u=C0(l);t.has(u)||(t.add(u),e.push({type:a.type,content:l,hash:u,matchedPhrase:a.phrase}))}}return e}c(E0,"extractCandidates");function T0(n){return n.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}c(T0,"splitParagraphs");function C0(n){return h0.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}c(C0,"hashContent");function R0(n){let e=new Set;try{let{prjctDb:t}=(z(),Fe(An)),{REMEMBER_EVENT_RANGE:r}=(rr(),Fe(Yf)),s=t.query(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...r);for(let o of s){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let a=i.tags;if(!a||a.source!==mT)continue;let l=a.hash;typeof l=="string"&&e.add(l)}}catch{}return e}c(R0,"collectExistingAutoHashes");hn();tn();Ra();function hT(n=process.cwd(),e){return Ye({event:"Stop",projectPath:n,afterEmit:c(async(t,r)=>{let s=await _.readConfig(r).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await x0.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Yn(i))}try{await gd(r)}catch{}try{await hd(r,s)}catch{}if(t.transcript_path)try{await fT(r,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await tT(r,s)}catch{}try{await KE(r,s)}catch{}try{let i=await rT(s.projectId);await sT(s.projectId,i)}catch{}if(t.transcript_path)try{if((await VE(r,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:a}=await Promise.resolve().then(()=>(Ko(),zf)),u=(await a(s.projectId,r)).current?.id;u&&ze.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await uT(r,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await ko.backfill(s.projectId,s,new Date().toISOString())}catch{}await uo(r,s.projectId).catch(()=>{})},"afterEmit")},e)}c(hT,"runStopHook");function yT(n=process.cwd(),e){return Ye({event:"SubagentStart",projectPath:n,build:c((t,r)=>OE(r),"build")},e)}c(yT,"runSubagentStartHook");var P0={"session-start":NE,prompt:GE,"pre-commit":UE,"pre-edit":HE,"post-edit":FE,stop:hT,"subagent-start":yT,"cwd-changed":LE};function wT(n){return n?P0[n]:void 0}c(wT,"getHookRunner");z();function kT(n){let e=ot.getAll().map(s=>s.name),t=null,r=1/0;for(let s of e){let o=A0(n.toLowerCase(),s.toLowerCase());o<r&&(r=o,t=s)}return r<=2?t:null}c(kT,"findClosestCommand");function A0(n,e){let t=n.length,r=e.length,s=Array.from({length:t+1},()=>Array(r+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=r;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=r;i++)s[o][i]=n[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][r]}c(A0,"editDistance");function _0(n){return n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}c(_0,"kebab");function bT(n,e){let t=c(s=>n[s]!==void 0?n[s]:n[_0(s)],"pick"),r={md:n.md===!0};for(let s of e.booleans??[])r[s]=t(s)===!0;for(let s of e.strings??[]){let o=t(s);r[s]=o!=null&&o!==!1&&o!==""?String(o):void 0}for(let s of e.numbers??[]){let o=t(s),i=o!=null&&o!==!1&&o!==""?Number(o):Number.NaN;r[s]=Number.isNaN(i)?void 0:i}return r}c(bT,"mapOptions");var ST={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 vT(n){return Object.hasOwn(ST,n)}c(vT,"isRemovedVerb");function ET(n){let e=ST[n];return e?`'prjct ${n}' was removed in v2.
1521
1521
  \u2192 Use: ${e.replacement}
1522
- ${e.note}`:null}c(ET,"migrationMessage");var j0=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),I0=new Set(["draft","new","create"]);async function TT(n,e,t,r){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&&I0.has(o))return n.spec(i,r,l);if(!o||!j0.has(o))return n.spec(a,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}c(TT,"routeSpec");async function CT(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(vT(e.command)&&!ot.getByName(e.command))return{success:!1,error:ET(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!ot.getByName(e.command)&&!(e.args.length===0&&kT(e.command)!==null)){let i=[e.command,...e.args.filter(a=>!a.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=ot.getByName(e.command);if(o?.optionSchema)return ot.executeWithOptions(e.command,t,e.cwd,bT(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return TT(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});case"login":return n.login({md:s,url:r.url?String(r.url):void 0});case"logout":return n.logout();case"auth":return n.auth(t,{md:s});default:return ot.execute(e.command,t,e.cwd)}}c(CT,"executeCommand");Va();Va();import Bt from"node:fs";import $0 from"node:os";import rn from"node:path";function RT(){let n=__dirname;for(let r=0;r<5;r++){if(Bt.existsSync(rn.join(n,"package.json"))){let s=rn.join(n,"dist","daemon","entry.mjs");if(Bt.existsSync(s))return s;break}n=rn.dirname(n)}let e=[rn.join(__dirname,"..","daemon","entry.mjs"),rn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(Bt.existsSync(r))return r;let t=process.argv[1];return t&&Bt.existsSync(t)?t:null}c(RT,"resolveEntryPath");function xT(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}c(xT,"decideRestart");function Ym(n,e){if(!n||e===null)return!1;try{return Bt.statSync(n).mtimeMs!==e}catch{return!1}}c(Ym,"isCodeStale");function PT(){let n=__dirname;for(let e=0;e<6;e++){let t=rn.join(n,"package.json");try{let s=JSON.parse(Bt.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=rn.dirname(n);if(r===n)break;n=r}return null}c(PT,"readOwnPackageVersion");function AT(n){if(!n)return!1;let e=$0.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let r of t){let s;try{s=Bt.realpathSync(r)}catch{continue}let o=rn.dirname(s);for(let i=0;i<6;i++){let a=rn.join(o,"package.json");try{let u=JSON.parse(Bt.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=rn.dirname(o);if(l===o)break;o=l}}return!1}c(AT,"isGlobalVersionDrifted");var D0=1024*1024;function _T(){let n=Ae.log();try{if(Bt.statSync(n).size>D0){let t=`${n}.1`;try{Bt.unlinkSync(t)}catch{}Bt.renameSync(n,t)}}catch{}}c(_T,"rotateLog");function jT(n){try{return process.kill(n,0),!0}catch{return!1}}c(jT,"isProcessRunning");var O0=50,N0=1e3,Es=null,xo=null,re=null,vs=null,IT=0,$T=Promise.resolve();async function MT(n){process.env.PRJCT_IN_DAEMON="1";let e=Ae.socket(),t=Ae.pid(),r=Ae.runDir();if(Et.mkdirSync(r,{recursive:!0}),Et.existsSync(t)){let i=parseInt(Et.readFileSync(t,"utf-8").trim(),10);jT(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Et.unlinkSync(t)}Et.existsSync(e)&&Et.unlinkSync(e),_T();let s=RT(),o=null;if(s)try{o=Et.statSync(s).mtimeMs}catch{}if(vs=PT(),re={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:uv,idleTimer:null,entryPath:s,entryMtime:o,activeRequests:0,restartPending:!1},vs)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Xm(),xE));i(vs)||await a(vs)}catch{}if(xo=new bo,Es=M0(i=>L0(i)),Es.listen(e,()=>{Et.chmodSync(e,384),Et.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),OT()}),Es.on("error",i=>{console.error("Daemon socket error:",i.message),Cr(1)}),process.on("SIGTERM",()=>Cr(0)),process.on("SIGINT",()=>Cr(0)),process.on("SIGHUP",()=>{xo=new bo,SE(),ot.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}c(MT,"startDaemon");function L0(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>dv){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(gs(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
1522
+ ${e.note}`:null}c(ET,"migrationMessage");var j0=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),I0=new Set(["draft","new","create"]);async function TT(n,e,t,r){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&&I0.has(o))return n.spec(i,r,l);if(!o||!j0.has(o))return n.spec(a,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s,lenses:t.lenses?String(t.lenses):void 0});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}c(TT,"routeSpec");async function CT(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(vT(e.command)&&!ot.getByName(e.command))return{success:!1,error:ET(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!ot.getByName(e.command)&&!(e.args.length===0&&kT(e.command)!==null)){let i=[e.command,...e.args.filter(a=>!a.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=ot.getByName(e.command);if(o?.optionSchema)return ot.executeWithOptions(e.command,t,e.cwd,bT(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return TT(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s,lenses:r.lenses?String(r.lenses):void 0}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});case"login":return n.login({md:s,url:r.url?String(r.url):void 0});case"logout":return n.logout();case"auth":return n.auth(t,{md:s});default:return ot.execute(e.command,t,e.cwd)}}c(CT,"executeCommand");Va();Va();import Bt from"node:fs";import $0 from"node:os";import rn from"node:path";function RT(){let n=__dirname;for(let r=0;r<5;r++){if(Bt.existsSync(rn.join(n,"package.json"))){let s=rn.join(n,"dist","daemon","entry.mjs");if(Bt.existsSync(s))return s;break}n=rn.dirname(n)}let e=[rn.join(__dirname,"..","daemon","entry.mjs"),rn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(Bt.existsSync(r))return r;let t=process.argv[1];return t&&Bt.existsSync(t)?t:null}c(RT,"resolveEntryPath");function xT(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}c(xT,"decideRestart");function Ym(n,e){if(!n||e===null)return!1;try{return Bt.statSync(n).mtimeMs!==e}catch{return!1}}c(Ym,"isCodeStale");function PT(){let n=__dirname;for(let e=0;e<6;e++){let t=rn.join(n,"package.json");try{let s=JSON.parse(Bt.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=rn.dirname(n);if(r===n)break;n=r}return null}c(PT,"readOwnPackageVersion");function AT(n){if(!n)return!1;let e=$0.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let r of t){let s;try{s=Bt.realpathSync(r)}catch{continue}let o=rn.dirname(s);for(let i=0;i<6;i++){let a=rn.join(o,"package.json");try{let u=JSON.parse(Bt.readFileSync(a,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=rn.dirname(o);if(l===o)break;o=l}}return!1}c(AT,"isGlobalVersionDrifted");var D0=1024*1024;function _T(){let n=Ae.log();try{if(Bt.statSync(n).size>D0){let t=`${n}.1`;try{Bt.unlinkSync(t)}catch{}Bt.renameSync(n,t)}}catch{}}c(_T,"rotateLog");function jT(n){try{return process.kill(n,0),!0}catch{return!1}}c(jT,"isProcessRunning");var O0=50,N0=1e3,Es=null,xo=null,re=null,vs=null,IT=0,$T=Promise.resolve();async function MT(n){process.env.PRJCT_IN_DAEMON="1";let e=Ae.socket(),t=Ae.pid(),r=Ae.runDir();if(Et.mkdirSync(r,{recursive:!0}),Et.existsSync(t)){let i=parseInt(Et.readFileSync(t,"utf-8").trim(),10);jT(i)&&(console.error(`Daemon already running (PID ${i})`),process.exit(1)),Et.unlinkSync(t)}Et.existsSync(e)&&Et.unlinkSync(e),_T();let s=RT(),o=null;if(s)try{o=Et.statSync(s).mtimeMs}catch{}if(vs=PT(),re={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:uv,idleTimer:null,entryPath:s,entryMtime:o,activeRequests:0,restartPending:!1},vs)try{let{isSyncCurrent:i,runSelfHeal:a}=await Promise.resolve().then(()=>(Xm(),xE));i(vs)||await a(vs)}catch{}if(xo=new bo,Es=M0(i=>L0(i)),Es.listen(e,()=>{Et.chmodSync(e,384),Et.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),s&&console.log(` Watching: ${s}`),OT()}),Es.on("error",i=>{console.error("Daemon socket error:",i.message),Cr(1)}),process.on("SIGTERM",()=>Cr(0)),process.on("SIGINT",()=>Cr(0)),process.on("SIGHUP",()=>{xo=new bo,SE(),ot.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}c(MT,"startDaemon");function L0(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>dv){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(gs(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
1523
1523
  `))!==-1;){let s=e.slice(0,r);if(e=e.slice(r+1),!!s.trim())try{let o=JSON.parse(s),i=await U0(o);n.write(gs(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(gs(i))}}}),n.on("error",()=>{})}c(L0,"handleConnection");function F0(n){if(!re||re.restartPending)return;let e=Ym(re.entryPath,re.entryMtime),t=xT({codeStale:e,command:n,ownVersion:vs,now:Date.now(),lastDriftCheckMs:IT,driftMinIntervalMs:N0,checkDrift:AT});IT=t.lastDriftCheckMs,t.restart&&(re.restartPending=!0,console.log(e?"Build change detected \u2014 daemon will restart; request runs on fresh code.":`Version drift detected \u2014 daemon v${vs} is stale; request runs on fresh code.`))}c(F0,"markStaleIfNeeded");async function U0(n){if(!re||!xo)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(F0(n.command),re.restartPending&&n.command!=="daemon"&&n.command!=="__ping")return re.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>Cr(0))),{id:n.id,success:!1,exitCode:1,retry:!0,stderr:"daemon code is stale \u2014 running directly"};re.activeRequests++;try{let e=$T.then(()=>DT(n),()=>DT(n));return $T=e.then(()=>{},()=>{}),await e}finally{re.activeRequests--,re.restartPending&&re.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>Cr(0)))}}c(U0,"handleRequest");async function DT(n){if(!re||!xo)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(OT(),re.commandsServed++,re.lastActivity=Date.now(),re.commandsServed%O0===0&&v.checkpointAll(),n.command==="daemon")return W0(n);if(n.command==="hook")return H0(n);if(n.command==="__ping")return{id:n.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],r=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await CT(xo,n);return{id:n.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
1524
1524
  `)||o.message||void 0,stderr:t.join(`
1525
1525
  `)||o.error||void 0,result:o}}finally{console.log=r,console.error=s}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}c(DT,"handleRequestInner");async function H0(n){let e=wT(n.args[0]);if(!e)return{id:n.id,success:!0,exitCode:0,stdout:`{}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.46.0",
3
+ "version": "2.46.1",
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": {