prjct-cli 2.4.32 → 2.4.36

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
@@ -1,5 +1,25 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.4.36] - 2026-05-02
4
+
5
+ ### Added
6
+ - current work
7
+
8
+ ## [2.4.35] - 2026-05-02
9
+
10
+ ### Added
11
+ - current work
12
+
13
+ ## [2.4.34] - 2026-05-02
14
+
15
+ ### Added
16
+ - current work
17
+
18
+ ## [2.4.33] - 2026-05-02
19
+
20
+ ### Added
21
+ - current work
22
+
3
23
  ## [2.4.32] - 2026-05-02
4
24
 
5
25
  ### Added
package/README.md CHANGED
@@ -12,29 +12,26 @@
12
12
  Copy this prompt and paste it in Claude Code (works for fresh install AND upgrade):
13
13
 
14
14
  ```text
15
- Install or upgrade prjct on this machine: run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` and verify with `prjct -v`. If the cwd is a git repo, also run `prjct sync` to register it.
15
+ Install or upgrade prjct on this machine: run `npm install -g prjct-cli@latest`, then `prjct setup` to wire hooks, and `prjct sync` if the cwd is a git repo. Verify the version with `prjct -v`.
16
16
  ```
17
17
 
18
- ~30 seconds. The script downloads the standalone binary for your platform from GitHub Releases (no Node/npm needed), wires hooks + the lookup-first CLAUDE.md block, and registers the project. Re-running is safe — the script detects existing installs and upgrades to the latest published version.
18
+ ~30 seconds. Claude runs npm directly (no harness restrictions), wires the SessionStart/Stop hooks + the lookup-first CLAUDE.md block, and registers the project. Re-pasting upgrades to the latest published version.
19
19
 
20
- Prefer terminal? Same effect:
20
+ ### Prefer no Node/npm? (run in your own terminal)
21
+
22
+ If you'd rather have the standalone binary (Bun runtime embedded, no Node ecosystem needed), run this **yourself in a terminal** — it's a `curl | bash` install which Claude Code's harness intentionally blocks for safety:
21
23
 
22
24
  ```bash
23
25
  curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash
24
26
  ```
25
27
 
26
- Or via package manager:
27
-
28
- ```bash
29
- npm install -g prjct-cli@latest
30
- # or: bun install -g prjct-cli@latest
31
- ```
28
+ The script auto-detects platform (mac arm64/intel + linux x64), downloads the right binary from GitHub Releases, sets up `~/.local/bin/prjct` on your PATH, runs `prjct setup` + `prjct sync`, and warns you if a stale package-manager install is shadowing the new binary.
32
29
 
33
30
  ### After install — three upgrade paths
34
31
 
35
32
  | Method | Command | When |
36
33
  |---|---|---|
37
- | Same prompt | re-paste the install prompt | Default. Works whether installed or not. |
34
+ | Re-paste the install prompt | (same prompt above) | Default. Claude re-runs `npm install -g prjct-cli@latest` and re-verifies. |
38
35
  | CLI shortcut | `prjct update` | Already in a terminal. Auto-detects npm/pnpm/bun/yarn/homebrew. |
39
36
  | Silent (set once) | `prjct config set auto-update on` | Background check 1/hour throttled, logs to `~/.prjct-cli/state/auto-update.log`. |
40
37
 
@@ -15,7 +15,7 @@ ${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.index
15
15
 
16
16
  `).trim()}
17
17
  `}let m=po(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Ge.writeFile(r,m.content,"utf-8"),{success:!0,action:m.action,path:r}}catch(r){return{success:!1,error:b(r),action:"failed"}}}function ya(){let n=ko.homedir();return{claude:{commands:we.join(n,".claude","commands"),config:we.join(n,".claude"),router:we.join(n,".claude","commands","p.md")},gemini:{commands:we.join(n,".gemini","commands"),config:we.join(n,".gemini"),router:we.join(n,".gemini","commands","p.toml")}}}var md,Ut,Sy,Se,xt=k(()=>{"use strict";ms();V();J();la();md='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nYou are in a prjct project when any of these signs are present: `~/Documents/prjct/<slug>/_generated/` exists, OR `.prjct/` is in cwd, OR `~/.prjct-cli/projects/` has an entry for the current path.\n\n## Lookup FIRST, source LAST\n\nBefore reading source code or running broad searches for ANY question about the project (architecture, conventions, decisions, recent ships, bugs, patterns, tech debt, past analyses), READ these vault files first using Read/Glob \u2014 no CLI round-trip:\n\n- `~/Documents/prjct/<slug>/_generated/index.md` \u2014 overview, ships, memory counts, patterns count\n- `~/Documents/prjct/<slug>/_generated/architecture.md` \u2014 domains, conventions, key insights\n- `~/Documents/prjct/<slug>/_generated/{patterns,insights,tech-debt}.md` \u2014 inferred state of the project\n- `~/Documents/prjct/<slug>/_generated/memory/{decision,gotcha,learning,fact,inbox}.md` \u2014 captured knowledge\n- `~/Documents/prjct/<slug>/_generated/analysis/{anti-patterns,insights,patterns,refactors,risk-areas,tech-debt}/` \u2014 past analyses by category\n- `~/Documents/prjct/<slug>/_generated/{ships,releases,tags}/` \u2014 history & taxonomy\n\nOnly fall through to source/repo reading when the vault does not contain the answer.\n\n## Capture analyses BACK to prjct\n\nWhen you complete substantive work \u2014 analysis, decision, learning, gotcha discovered \u2014 persist it so the next session benefits:\n\n- `prjct remember decision "<choice + why>"` \u2014 choices made, with rationale\n- `prjct remember learning "<insight>"` \u2014 non-obvious insights gained\n- `prjct remember gotcha "<trap + how to avoid>"` \u2014 bugs/traps found\n- `prjct remember fact "<verifiable claim>"` \u2014 project facts (paths, conventions, IDs)\n- `prjct capture "<text>" --tags type:analysis,topic:<x>` \u2014 analytical dumps & inbox items\n\nTag with `--tags k:v,k:v` for searchability. Memory persists to SQLite; vault auto-regenerates. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.**\n\n## Workflow\n\n`prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`\nPause/resume: `prjct status paused` | `prjct status active` (also reopens completed tasks)\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `~/Documents/prjct/<slug>/_generated/` (Read/Glob freely; never hand-edit \u2014 fix the pipeline)\n- Project config: `.prjct/prjct.config.json` in repo root\n\nThe vault regenerates automatically on `remember`, `capture`, `ship`, `sync`, and the SessionStart/Stop hooks.\n\n**Auto-managed by prjct-cli** | https://prjct.app\n<!-- prjct:end - DO NOT REMOVE THIS MARKER -->\n';c(vy,"installDocs");c(gd,"installGlobalConfig");Ut=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=ko.homedir()}async ensureInit(){if(this._initialized)return;let t=await(We(),He(kt)).getActiveProvider();this.commandsPath=we.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),T(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),s=await(We(),He(kt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${s.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let s=we.join(this.commandsPath,t);try{await Ge.unlink(s),e.push(t)}catch(r){if(r.code!=="ENOENT")return{success:!1,error:b(r)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:b(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:b(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let s=we.join(this.commandsPath,t);try{await Ge.unlink(s),e=!0}catch(r){r.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=we.join(this.commandsPath,"p");try{if((await Ge.stat(e).catch(()=>null))?.isDirectory())return await Ge.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return gd()}async cleanupAllLegacy(){let e=ko.homedir(),t=[],s=[we.join(e,".claude","commands","p.md"),we.join(e,".claude","commands","p.toml"),we.join(e,".gemini","commands","p.md"),we.join(e,".gemini","commands","p.toml")];for(let i of s)try{await Ge.unlink(i),t.push(i)}catch{}let r=[we.join(e,".claude","commands","p"),we.join(e,".gemini","commands","p")];for(let i of r)try{(await Ge.stat(i).catch(()=>null))?.isDirectory()&&(await Ge.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[we.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await Ge.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return vy()}};c(ya,"getProviderPaths");Sy=new Ut,Se=Sy});var kd={};O(kd,{PRJCT_HOOKS:()=>Sr,install:()=>Ta,status:()=>Ca,uninstall:()=>Ea});import ka from"node:fs/promises";import Ty from"node:os";import hd from"node:path";function hn(){let n=process.env.HOME||Ty.homedir();return hd.join(n,".claude","settings.json")}async function va(){try{let n=await ka.readFile(hn(),"utf-8"),e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch(n){if(n.code==="ENOENT")return{};throw n}}async function yd(n){await ka.mkdir(hd.dirname(hn()),{recursive:!0}),await ka.writeFile(hn(),`${JSON.stringify(n,null,2)}
18
- `,"utf-8")}function wd(n){return`${process.env.PRJCT_BIN??"prjct"} hook ${n}`}function Sa(n){return n[ba]===!0}function Ey(n){if(n[ba]===!0)return!1;let e=n.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function fd(n){let e={type:"command",command:wd(n.subcommand),[ba]:!0};return"ifClause"in n&&n.ifClause&&(e.if=n.ifClause),e}async function Ta(){let n=await va(),e=n.hooks??{},t=0,s=0;for(let r of Sr){let o=e[r.event]??[],i=wd(r.subcommand),a=o.find(p=>(p.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(p=>!Ey(p));let u=l-a.hooks.length,d=a.hooks.find(p=>Sa(p));if(d){let p=fd(r);d.command===p.command&&d.if===p.if&&u===0?s++:(d.command=p.command,d.if=p.if,t++)}else a.hooks.push(fd(r)),t++;e[r.event]=o}return n.hooks=e,await yd(n),{settingsPath:hn(),hooksWritten:t,alreadyPresent:s}}async function Ea(){let n=await va();if(!n.hooks)return{settingsPath:hn(),hooksRemoved:0};let e=0;for(let[t,s]of Object.entries(n.hooks)){let r=[];for(let o of s){let i=o.hooks.filter(a=>Sa(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?n.hooks[t]=r:delete n.hooks[t]}return Object.keys(n.hooks).length===0&&delete n.hooks,await yd(n),{settingsPath:hn(),hooksRemoved:e}}async function Ca(){let e=(await va()).hooks??{},t=0;for(let s of Object.values(e))for(let r of s)for(let o of r.hooks)Sa(o)&&t++;return{installed:t,expected:Sr.length}}var ba,Sr,Pa=k(()=>{"use strict";c(hn,"settingsPath");ba="_prjctManaged",Sr=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(va,"readSettings");c(yd,"writeSettings");c(wd,"hookCommand");c(Sa,"isPrjctHook");c(Ey,"isLegacyPrjctHook");c(fd,"hookEntryFor");c(Ta,"install");c(Ea,"uninstall");c(Ca,"status")});var ja={};O(ja,{isSyncCurrent:()=>bo,runSelfHeal:()=>vo,selfHealIfStale:()=>jy});import Ra from"node:fs";import Cy from"node:os";import bd from"node:path";function Py(){try{return Ra.readFileSync(Sd,"utf-8").trim()}catch{return null}}function Ry(n){try{Ra.mkdirSync(vd,{recursive:!0}),Ra.writeFileSync(Sd,n,"utf-8")}catch{}}function bo(n){return n?Py()===n:!0}async function vo(n){if(n&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(xt(),wa));await e()}catch{}try{await(await Promise.resolve().then(()=>(Pa(),kd))).install()}catch{}Ry(n)}}async function jy(n){process.env.PRJCT_NO_SELF_SYNC!=="1"&&(bo(n)||await vo(n))}var vd,Sd,So=k(()=>{"use strict";vd=bd.join(Cy.homedir(),".prjct-cli","state"),Sd=bd.join(vd,"installed-version");c(Py,"readStamp");c(Ry,"writeStamp");c(bo,"isSyncCurrent");c(vo,"runSelfHeal");c(jy,"selfHealIfStale")});var Td={};O(Td,{DAEMON_PATHS:()=>Ee,IDLE_TIMEOUT_MS:()=>xa,MAX_BUFFER_SIZE:()=>Aa,encodeMessage:()=>Fs});function Fs(n){return Buffer.from(`${JSON.stringify(n)}
18
+ `,"utf-8")}function wd(n){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${n} || exit 0`}function Sa(n){return n[ba]===!0}function Ey(n){if(n[ba]===!0)return!1;let e=n.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function fd(n){let e={type:"command",command:wd(n.subcommand),[ba]:!0};return"ifClause"in n&&n.ifClause&&(e.if=n.ifClause),e}async function Ta(){let n=await va(),e=n.hooks??{},t=0,s=0;for(let r of Sr){let o=e[r.event]??[],i=wd(r.subcommand),a=o.find(p=>(p.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(p=>!Ey(p));let u=l-a.hooks.length,d=a.hooks.find(p=>Sa(p));if(d){let p=fd(r);d.command===p.command&&d.if===p.if&&u===0?s++:(d.command=p.command,d.if=p.if,t++)}else a.hooks.push(fd(r)),t++;e[r.event]=o}return n.hooks=e,await yd(n),{settingsPath:hn(),hooksWritten:t,alreadyPresent:s}}async function Ea(){let n=await va();if(!n.hooks)return{settingsPath:hn(),hooksRemoved:0};let e=0;for(let[t,s]of Object.entries(n.hooks)){let r=[];for(let o of s){let i=o.hooks.filter(a=>Sa(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?n.hooks[t]=r:delete n.hooks[t]}return Object.keys(n.hooks).length===0&&delete n.hooks,await yd(n),{settingsPath:hn(),hooksRemoved:e}}async function Ca(){let e=(await va()).hooks??{},t=0;for(let s of Object.values(e))for(let r of s)for(let o of r.hooks)Sa(o)&&t++;return{installed:t,expected:Sr.length}}var ba,Sr,Pa=k(()=>{"use strict";c(hn,"settingsPath");ba="_prjctManaged",Sr=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(va,"readSettings");c(yd,"writeSettings");c(wd,"hookCommand");c(Sa,"isPrjctHook");c(Ey,"isLegacyPrjctHook");c(fd,"hookEntryFor");c(Ta,"install");c(Ea,"uninstall");c(Ca,"status")});var ja={};O(ja,{isSyncCurrent:()=>bo,runSelfHeal:()=>vo,selfHealIfStale:()=>jy});import Ra from"node:fs";import Cy from"node:os";import bd from"node:path";function Py(){try{return Ra.readFileSync(Sd,"utf-8").trim()}catch{return null}}function Ry(n){try{Ra.mkdirSync(vd,{recursive:!0}),Ra.writeFileSync(Sd,n,"utf-8")}catch{}}function bo(n){return n?Py()===n:!0}async function vo(n){if(n&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(xt(),wa));await e()}catch{}try{await(await Promise.resolve().then(()=>(Pa(),kd))).install()}catch{}Ry(n)}}async function jy(n){process.env.PRJCT_NO_SELF_SYNC!=="1"&&(bo(n)||await vo(n))}var vd,Sd,So=k(()=>{"use strict";vd=bd.join(Cy.homedir(),".prjct-cli","state"),Sd=bd.join(vd,"installed-version");c(Py,"readStamp");c(Ry,"writeStamp");c(bo,"isSyncCurrent");c(vo,"runSelfHeal");c(jy,"selfHealIfStale")});var Td={};O(Td,{DAEMON_PATHS:()=>Ee,IDLE_TIMEOUT_MS:()=>xa,MAX_BUFFER_SIZE:()=>Aa,encodeMessage:()=>Fs});function Fs(n){return Buffer.from(`${JSON.stringify(n)}
19
19
  `)}var Ee,xa,Aa,To=k(()=>{"use strict";Ee={runDir:c(()=>`${process.env.HOME||De("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:c(()=>`${Ee.runDir()}/daemon.sock`,"socket"),pid:c(()=>`${Ee.runDir()}/daemon.pid`,"pid"),log:c(()=>`${Ee.runDir()}/daemon.log`,"log")},xa=30*60*1e3,Aa=1024*1024;c(Fs,"encodeMessage")});function Ed(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function Eo(){return Ed()==="bun"}function $a(){if(Ed()==="bun")return!0;try{let{execSync:n}=De("node:child_process");return n("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var Co=k(()=>{"use strict";c(Ed,"detectRuntime");c(Eo,"isBun");c($a,"isBunAvailable")});var ss={};O(ss,{executeViaDaemon:()=>$y,forceKillDaemon:()=>Dy,getDaemonStatus:()=>Ay,isDaemonRunning:()=>Cd,sendRequest:()=>Tr,spawnDaemon:()=>Pd,stopDaemon:()=>Iy});import Po from"node:crypto";import Le from"node:fs";import{connect as xy}from"node:net";async function Cd(){let n=Ee.socket();if(!Le.existsSync(n))return!1;try{return(await Tr({id:Po.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Le.unlinkSync(n)}catch{}return!1}}async function Ay(){let n=Ee.socket(),e=Ee.pid();if(!Le.existsSync(n))return{running:!1};try{let t=await Tr({id:Po.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Le.existsSync(e)?{running:!1,pid:parseInt(Le.readFileSync(e,"utf-8").trim(),10),socketPath:n}:{running:!1}}function Tr(n){return new Promise((e,t)=>{let s=Ee.socket(),r=xy(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(Fs(n))}),r.on("data",l=>{o+=l.toString();let u=o.indexOf(`
20
20
  `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(p)}catch(p){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),r.on("error",l=>{i||(i=!0,clearTimeout(a),t(l))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function $y(n,e,t,s,r,o=!0){let i=Ee.socket();if(!Le.existsSync(i))return o&&Pd().catch(()=>{}),null;try{return await Tr({id:Po.randomUUID(),command:n,args:e,options:t,cwd:s,perfStartNs:r})}catch{return null}}async function Iy(){try{return(await Tr({id:Po.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function Dy(){let n=Ee.pid(),e=Ee.socket(),t=!1;if(Le.existsSync(n)){let s=parseInt(Le.readFileSync(n,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Le.existsSync(n)&&Le.unlinkSync(n)}catch{}try{Le.existsSync(e)&&Le.unlinkSync(e)}catch{}return t}async function Pd(){let{spawn:n}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Le.existsSync(t))o=t,i="bun";else if(Le.existsSync(s))o=s,i=$a()?"bun":"node";else if(Le.existsSync(r))o=r,i=$a()?"bun":"node";else return!1;let a=Ee.runDir();Le.mkdirSync(a,{recursive:!0});let l=Ee.log(),u=Le.openSync(l,"a");n(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Le.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await Cd())return!0;return!1}var ns=k(()=>{"use strict";Co();To();c(Cd,"isDaemonRunning");c(Ay,"getDaemonStatus");c(Tr,"sendRequest");c($y,"executeViaDaemon");c(Iy,"stopDaemon");c(Dy,"forceKillDaemon");c(Pd,"spawnDaemon")});import{formatDistanceToNowStrict as vR}from"date-fns";function Rd(n){let e=n.getFullYear(),t=(n.getMonth()+1).toString().padStart(2,"0"),s=n.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function jd(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}function R(){return new Date().toISOString()}function yn(n){let e=new Date;return e.setDate(e.getDate()-n),e}function Er(n){let e=Math.floor(n/1e3),t=Math.floor(e/60),s=Math.floor(t/60),r=Math.floor(s/24);return r>0?`${r}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}var Ce=k(()=>{"use strict";c(Rd,"formatDate");c(jd,"getYearMonthDay");c(R,"getTimestamp");c(yn,"getDaysAgo");c(Er,"formatDuration")});async function Ro(n){try{let{stdout:e}=await N(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function My(){let n=await Ro("gh api user --jq .login");return n.success&&n.output||(n=await Ro("git config --global github.user"),n.success&&n.output)?n.output:null}async function Ny(){let n=await Ro("git config user.name");return n.success&&n.output?n.output:null}async function _y(){let n=await Ro("git config user.email");return n.success&&n.output?n.output:null}async function wn(){let[n,e,t]=await Promise.all([My(),Ny(),_y()]);return{github:n,email:t,name:e||n||"Unknown"}}var jo=k(()=>{"use strict";et();c(Ro,"execCommand");c(My,"detectGitHubUsername");c(Ny,"detectGitName");c(_y,"detectGitEmail");c(wn,"detect")});var xo={};O(xo,{default:()=>Oy,worktreeService:()=>Ad});import Da from"node:fs/promises";import Ht from"node:path";var xd,Ma,Ad,Oy,Ao=k(()=>{"use strict";et();J();xd=".worktrees",Ma=class{static{c(this,"WorktreeService")}async create(e,t,s={}){let r=await this.getMainWorktree(e),o=Ht.join(r,xd,t),i=s.branch||`feat/${t}`;await Da.mkdir(Ht.join(r,xd),{recursive:!0});let a=s.baseBranch?` ${s.baseBranch}`:"";await N(`git worktree add "${o}" -b "${i}"${a}`,{cwd:r});let{stdout:l}=await N("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let s=await this.getMainWorktree(e),r;if(t)try{let{stdout:o}=await N("git rev-parse --abbrev-ref HEAD",{cwd:e});r=o.trim()}catch{}if(await N(`git worktree remove "${e}" --force`,{cwd:s}),t&&r&&r!=="main"&&r!=="master")try{await N(`git branch -D "${r}"`,{cwd:s})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:s}=await N("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(s,t)}async detect(e){try{let{stdout:t}=await N("git rev-parse --git-common-dir",{cwd:e}),{stdout:s}=await N("git rev-parse --git-dir",{cwd:e}),r=Ht.resolve(e,t.trim()),o=Ht.resolve(e,s.trim());if(r!==o){let{stdout:i}=await N("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await N("git rev-parse HEAD",{cwd:e}),{stdout:l}=await N("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ht.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:s}=await N("git worktree list --porcelain",{cwd:e}),r=s.split(`
21
21
  `)[0];if(r?.startsWith("worktree "))return r.replace("worktree ","").trim()}catch{}let{stdout:t}=await N("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let s=Ht.join(t,".env");await T(s)&&await Da.copyFile(s,Ht.join(e,".env"));let r=Ht.join(t,".prjct"),o=Ht.join(e,".prjct");await T(r)&&!await T(o)&&await Da.symlink(r,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),s=[],r=await this.getMainWorktree(e);await N("git worktree prune",{cwd:r});for(let o of t)o.isMain||await T(o.path)||s.push(o.slug);return s}parsePorcelainOutput(e,t){let s=[],r=e.trim().split(`
@@ -1379,7 +1379,7 @@ ${B.yellow(`Command '${n}' not found.`)}
1379
1379
 
1380
1380
  Run 'prjct help' to see all available commands.
1381
1381
  `}function wC(){let n=[];n.push(""),n.push(B.cyan.bold("All Commands")),n.push("");let e=Object.entries(Xr).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let r=sr.filter(o=>o.group===t);if(r.length!==0){n.push(`${B.bold(s.title)} ${B.dim(`(${r.length} commands)`)}`),n.push(B.dim(s.description)),n.push("");for(let o of r){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;n.push(` ${i} ${a}`)}n.push("")}}return n.push(B.dim("Run 'prjct help <command>' for detailed help on a specific command.")),n.push(""),n.join(`
1382
- `)}function kC(n){return n?n==="commands"||n==="all"?wC():yC(n):gC()}var bh,mC,Sh=k(()=>{"use strict";pu();Ne();bh=[{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"]}],mC=[{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(gC,"formatMainHelp");c(fC,"formatTerminalCommandHelp");c(hC,"formatAgentCommandHelp");c(yC,"formatCommandHelp");c(wC,"formatCommandList");c(kC,"getHelp")});var Th=Mh((dH,bC)=>{bC.exports={name:"prjct-cli",version:"2.4.32",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",postinstall:"node scripts/postinstall.js",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 ."},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","better-sqlite3":"12.9.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"},devDependencies:{"@biomejs/biome":"2.3.13","@types/better-sqlite3":"7.6.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.22.2"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var PC={};import Eh from"node:os";import Vi from"node:path";import Re from"chalk";async function vC(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let s=await Promise.resolve().then(()=>Nh(Th()));await EC(s.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(CC(),process.exit(0)),n&&Li(n)&&!q.getByName(n)){let s=Oi[n];s&&(f.failWithHint({message:`'prjct ${n}' was removed in v2. ${s.note}`,hint:`Use: ${s.replacement}`}),process.exit(1))}if(n&&!q.getByName(n)&&!(e.length===0&&Ar(n)!==null)){let r=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[r,...o]}let t=e.includes("--md");t||f.start();try{let s=q.getByName(n);if(!s){let m=Ar(n),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(Rr("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${n}' 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:r,options:o}=TC(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=SC(s,r);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let l=null,u=Date.now();try{l=await j.getProjectId(process.cwd()),l&&(await Tn.expireIfStale(l),await Tn.touch(l))}catch{}let d=new Rs,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update")p=await d.update(o);else{let m=r.join(" ")||null,g=o.md===!0,P={task:c(h=>d.task(h,process.cwd(),{md:g}),"task"),init:c(h=>d.init({idea:h,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:c(h=>d.workflowPrefs(h,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(h=>h?d.saveLlmAnalysis(h,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(h=>d.context(h),"context"),status:c(h=>d.status(h,process.cwd(),{md:g}),"status"),tag:c(h=>d.tag(h,process.cwd(),{md:g}),"tag"),remember:c(h=>d.remember(h,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(h=>d.auth(h,{md:g}),"auth"),seed:c(h=>d.seed(h,process.cwd(),{md:g}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:g}),"install"),capture:c(h=>d.capture(h,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture"),mcp:c(h=>d.mcp(h,process.cwd(),{md:g}),"mcp")}[n];if(P)p=await P(m);else throw new Error(`Command '${n}' has no handler`)}if(l){let m=Date.now()-u;try{await Tn.trackCommand(l,n,m)}catch{}try{await jr.recordTiming(l,"command_duration",m,{command:n});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await jr.recordTiming(l,"startup_time",w)}await jr.recordMemory(l,{command:n})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",b(s)),process.env.DEBUG&&console.error(Zi(s)),t||f.end(),process.exit(1)}}function SC(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 s=t.map(o=>o.slice(1,-1)).join(", "),r=n.usage.terminal||`prjct ${n.name} ${n.params}`;return Rr("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${r}`})}return null}function TC(n,e){let t=[],s={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?s[i]=e[++r]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function EC(n){let e=await ts(),t=Vi.join(Eh.homedir(),".claude","commands","p.md"),s=Vi.join(Eh.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([T(t),T(s),T(Vi.join(process.cwd(),".cursor","commands","sync.md")),T(Vi.join(process.cwd(),".cursor"))]),l=await vr();if(console.log(`
1382
+ `)}function kC(n){return n?n==="commands"||n==="all"?wC():yC(n):gC()}var bh,mC,Sh=k(()=>{"use strict";pu();Ne();bh=[{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"]}],mC=[{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(gC,"formatMainHelp");c(fC,"formatTerminalCommandHelp");c(hC,"formatAgentCommandHelp");c(yC,"formatCommandHelp");c(wC,"formatCommandList");c(kC,"getHelp")});var Th=Mh((dH,bC)=>{bC.exports={name:"prjct-cli",version:"2.4.36",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",postinstall:"node scripts/postinstall.js",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 ."},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","better-sqlite3":"12.9.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"},devDependencies:{"@biomejs/biome":"2.3.13","@types/better-sqlite3":"7.6.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.22.2"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var PC={};import Eh from"node:os";import Vi from"node:path";import Re from"chalk";async function vC(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let s=await Promise.resolve().then(()=>Nh(Th()));await EC(s.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(CC(),process.exit(0)),n&&Li(n)&&!q.getByName(n)){let s=Oi[n];s&&(f.failWithHint({message:`'prjct ${n}' was removed in v2. ${s.note}`,hint:`Use: ${s.replacement}`}),process.exit(1))}if(n&&!q.getByName(n)&&!(e.length===0&&Ar(n)!==null)){let r=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[r,...o]}let t=e.includes("--md");t||f.start();try{let s=q.getByName(n);if(!s){let m=Ar(n),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(Rr("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${n}' 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:r,options:o}=TC(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=SC(s,r);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let l=null,u=Date.now();try{l=await j.getProjectId(process.cwd()),l&&(await Tn.expireIfStale(l),await Tn.touch(l))}catch{}let d=new Rs,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update")p=await d.update(o);else{let m=r.join(" ")||null,g=o.md===!0,P={task:c(h=>d.task(h,process.cwd(),{md:g}),"task"),init:c(h=>d.init({idea:h,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:c(h=>d.workflowPrefs(h,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(h=>h?d.saveLlmAnalysis(h,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(h=>d.context(h),"context"),status:c(h=>d.status(h,process.cwd(),{md:g}),"status"),tag:c(h=>d.tag(h,process.cwd(),{md:g}),"tag"),remember:c(h=>d.remember(h,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(h=>d.auth(h,{md:g}),"auth"),seed:c(h=>d.seed(h,process.cwd(),{md:g}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:g}),"install"),capture:c(h=>d.capture(h,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture"),mcp:c(h=>d.mcp(h,process.cwd(),{md:g}),"mcp")}[n];if(P)p=await P(m);else throw new Error(`Command '${n}' has no handler`)}if(l){let m=Date.now()-u;try{await Tn.trackCommand(l,n,m)}catch{}try{await jr.recordTiming(l,"command_duration",m,{command:n});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await jr.recordTiming(l,"startup_time",w)}await jr.recordMemory(l,{command:n})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",b(s)),process.env.DEBUG&&console.error(Zi(s)),t||f.end(),process.exit(1)}}function SC(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 s=t.map(o=>o.slice(1,-1)).join(", "),r=n.usage.terminal||`prjct ${n.name} ${n.params}`;return Rr("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${r}`})}return null}function TC(n,e){let t=[],s={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?s[i]=e[++r]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function EC(n){let e=await ts(),t=Vi.join(Eh.homedir(),".claude","commands","p.md"),s=Vi.join(Eh.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([T(t),T(s),T(Vi.join(process.cwd(),".cursor","commands","sync.md")),T(Vi.join(process.cwd(),".cursor"))]),l=await vr();if(console.log(`
1383
1383
  ${Re.cyan("p/")} prjct v${n}
1384
1384
  ${Re.dim("Context layer for AI coding agents")}
1385
1385
 
@@ -903,7 +903,7 @@ Generated: ${new Date().toLocaleString()}
903
903
  | Files skipped | ${p.filesSkipped} |
904
904
  | Files removed | ${p.filesRemoved} |
905
905
  `):console.log(JSON.stringify({success:!0,message:"Vault regenerated",...p})),{success:!0}}catch(s){return{success:!1,error:y(s)}}}async saveLlmAnalysis(e,t=process.cwd(),s={}){try{let r=await this.ensureProjectInit(t);if(!r.success)return r;let o=await $.getProjectId(t);if(!o)return{success:!1,error:"No project ID found"};let i=JSON.parse(e);if(!i.version||!i.architecture||!i.patterns)return{success:!1,error:"Invalid LLM analysis format. Missing required fields."};Ze.save(o,i);let{regenerateWikiDeferred:a}=await Promise.resolve().then(()=>(Gn(),Wn));return await a(t,o),s.md?console.log(N(we("LLM Analysis Saved"),Hs({Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0}}catch(r){return{success:!1,error:y(r)}}}async getLlmAnalysis(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=Ze.getActive(r);if(!o)return t.md?console.log(N("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(t.md){let i=[we(`LLM Analysis (${o.architecture.style})`),""];if(o.architecture.insights.length>0&&i.push(O("Architecture Insights",Se(o.architecture.insights.slice(0,5)))),o.patterns.length>0){let a=o.patterns.slice(0,8);i.push(O(`Patterns (${o.patterns.length})`,Se(a.map(l=>`**${l.name}** \u2014 ${l.description} (${l.category})`))))}if(o.antiPatterns.length>0){let a=o.antiPatterns.slice(0,5);i.push(O(`Anti-Patterns (${o.antiPatterns.length})`,Se(a.map(l=>`[${l.severity}] ${l.issue} \u2014 ${l.suggestion}`))))}if(o.techDebt.length>0){let a=o.techDebt.slice(0,5);i.push(O(`Tech Debt (${o.techDebt.length})`,Se(a.map(l=>`[${l.priority}/${l.effort}] ${l.description}`))))}o.conventions.length>0&&i.push(O("Conventions",Se(o.conventions.slice(0,5).map(a=>`**${a.category}**: ${a.rule}`)))),console.log(N(...i))}else{let i={...o,patterns:o.patterns.slice(0,10),antiPatterns:o.antiPatterns.slice(0,6),techDebt:o.techDebt.slice(0,6),conventions:o.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:i}))}return{success:!0,data:o}}catch(s){return{success:!1,error:y(s)}}}async stats(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Ls.getSummary(r),i=await Ls.getDailyStats(r,30),a=await td(r),l={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(t.json){let p={session:a,patterns:l,totalTokensSaved:o.totalTokensSaved,estimatedCostSaved:o.estimatedCostSaved,compressionRate:o.compressionRate,syncCount:o.syncCount,avgSyncDuration:o.avgSyncDuration,topAgents:o.topAgents.slice(0,5),last30DaysTokens:o.last30DaysTokens,trend:o.trend,dailyStats:i.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let u="Unknown";try{u=A.getDoc(r,"project")?.name||"Unknown"}catch{}let d=await Ls.read(r),m=d.firstSync?new Date(d.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${u.padEnd(20).slice(0,20)} | Since: ${m.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),a.sessionDuration&&console.log(` Duration: ${a.sessionDuration}`),console.log(` Tasks completed: ${a.tasksCompleted}`),console.log(` Features shipped: ${a.featuresShipped}`),a.agentsUsed.length>0){let p=a.agentsUsed.slice(0,3).map(f=>`${f.name} (${f.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(l.decisions>0||l.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${l.learnedDecisions} confirmed (${l.decisions} total)`),console.log(` Preferences: ${l.preferences} saved`),console.log(` Workflows: ${l.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Vs(o.totalTokensSaved)} tokens`),console.log(` Compression: ${(o.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${wr(o.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${o.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${aa(o.avgSyncDuration)}`),console.log(""),o.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=o.topAgents.reduce((f,h)=>f+h.usageCount,0);for(let f of o.topAgents){let h=p>0?(f.usageCount/p*100).toFixed(0):0;console.log(` ${f.agentName.padEnd(12)}: ${h}% (${f.usageCount} uses)`)}console.log("")}if(i.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=sd(i);if(console.log(` ${p} ${Vs(o.last30DaysTokens)} tokens saved`),o.trend!==0){let f=o.trend>0?"\u2191":"\u2193",h=o.trend>0?"+":"";console.log(` ${f} ${h}${o.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),t.export){let p=nd(o,i,u,m,a,l);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...o,session:a,patterns:l}}}catch(s){return console.error("\u274C Error:",y(s)),{success:!1,error:y(s)}}}async diff(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.diff(r);if(!o){let i="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return t.json?console.log(JSON.stringify({success:!1,error:i})):t.md?console.log(N("## Analysis Diff",`> ${i}`)):g.warn(i),{success:!1,error:i}}if(t.json)return console.log(JSON.stringify({success:!0,...o})),{success:!0,data:o};if(t.md)return console.log(N(zo(o))),{success:!0,data:o};if(!o.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(cl(o)),console.log("");let i=[];o.summary.added>0&&i.push(`${o.summary.added} added`),o.summary.removed>0&&i.push(`${o.summary.removed} removed`),o.summary.changed>0&&i.push(`${o.summary.changed} changed`),g.done(i.join(", "))}return console.log(""),{success:!0,data:o}}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(N("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async seal(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.seal(r);return t.json?(console.log(JSON.stringify({success:o.success,signature:o.signature,error:o.error})),{success:o.success,error:o.error}):o.success?(g.done("Analysis sealed"),console.log(` Signature: ${o.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:o.signature}}):(g.fail(o.error||"Seal failed"),{success:!1,error:o.error})}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}async rollback(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),{success:!1,error:"No project ID found"};let o=await Oe.rollback(r);return t.json?(console.log(JSON.stringify({success:o.success,restoredSignature:o.restoredSignature,error:o.error})),{success:o.success,error:o.error}):t.md?o.success?(console.log(N(we("Analysis Rolled Back"),Hs({"Restored signature":`${o.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:o.restoredSignature}}):(console.log(N("## Rollback Failed",`> ${o.error}`)),{success:!1,error:o.error}):o.success?(g.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${o.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:o.restoredSignature}}):(g.fail(o.error||"Rollback failed"),{success:!1,error:o.error})}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):t.md?console.log(N("## Rollback Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async verify(e=process.cwd(),t={}){if(t.semantic)return this.semanticVerify(e,t);try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return{success:!1,error:"No project ID found"};let o=await Oe.verify(r);return t.json?(console.log(JSON.stringify(o)),{success:o.valid}):(o.valid?g.done(o.message):g.fail(o.message),console.log(""),{success:o.valid,data:o})}catch(s){let r=y(s);return g.fail(r),{success:!1,error:r}}}async semanticVerify(e=process.cwd(),t={}){try{let s=await this.ensureProjectInit(e);if(!s.success)return s;let r=await $.getProjectId(e);if(!r)return t.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),{success:!1,error:"No project ID found"};let o=e;try{o=A.getDoc(r,"project")?.repoPath||e}catch{}let i=await Oe.semanticVerify(r,o);if(t.json)return console.log(JSON.stringify(i)),{success:i.passed,data:i};console.log(""),i.passed?(g.done("Semantic verification passed"),console.log(` ${i.passedCount}/${i.checks.length} checks passed (${i.totalMs}ms)`)):(g.fail("Semantic verification failed"),console.log(` ${i.failedCount}/${i.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let a of i.checks){let l=a.passed?"\u2713":"\u2717",u=a.passed?`${a.output} (${a.durationMs}ms)`:a.error||"Failed";console.log(` ${l} ${a.name}: ${u}`)}return console.log(""),{success:i.passed,data:i}}catch(s){let r=y(s);return t.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}}});var km={};Ee(km,{PRJCT_HOOKS:()=>Vn,install:()=>Ka,status:()=>Qa,uninstall:()=>Ya});import Ja from"node:fs/promises";import Sw from"node:os";import hm from"node:path";function en(){let n=process.env.HOME||Sw.homedir();return hm.join(n,".claude","settings.json")}async function za(){try{let n=await Ja.readFile(en(),"utf-8"),e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch(n){if(n.code==="ENOENT")return{};throw n}}async function ym(n){await Ja.mkdir(hm.dirname(en()),{recursive:!0}),await Ja.writeFile(en(),`${JSON.stringify(n,null,2)}
906
- `,"utf-8")}function wm(n){return`${process.env.PRJCT_BIN??"prjct"} hook ${n}`}function Xa(n){return n[qa]===!0}function Tw(n){if(n[qa]===!0)return!1;let e=n.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function fm(n){let e={type:"command",command:wm(n.subcommand),[qa]:!0};return"ifClause"in n&&n.ifClause&&(e.if=n.ifClause),e}async function Ka(){let n=await za(),e=n.hooks??{},t=0,s=0;for(let r of Vn){let o=e[r.event]??[],i=wm(r.subcommand),a=o.find(m=>(m.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(m=>!Tw(m));let u=l-a.hooks.length,d=a.hooks.find(m=>Xa(m));if(d){let m=fm(r);d.command===m.command&&d.if===m.if&&u===0?s++:(d.command=m.command,d.if=m.if,t++)}else a.hooks.push(fm(r)),t++;e[r.event]=o}return n.hooks=e,await ym(n),{settingsPath:en(),hooksWritten:t,alreadyPresent:s}}async function Ya(){let n=await za();if(!n.hooks)return{settingsPath:en(),hooksRemoved:0};let e=0;for(let[t,s]of Object.entries(n.hooks)){let r=[];for(let o of s){let i=o.hooks.filter(a=>Xa(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?n.hooks[t]=r:delete n.hooks[t]}return Object.keys(n.hooks).length===0&&delete n.hooks,await ym(n),{settingsPath:en(),hooksRemoved:e}}async function Qa(){let e=(await za()).hooks??{},t=0;for(let s of Object.values(e))for(let r of s)for(let o of r.hooks)Xa(o)&&t++;return{installed:t,expected:Vn.length}}var qa,Vn,Za=v(()=>{"use strict";c(en,"settingsPath");qa="_prjctManaged",Vn=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(za,"readSettings");c(ym,"writeSettings");c(wm,"hookCommand");c(Xa,"isPrjctHook");c(Tw,"isLegacyPrjctHook");c(fm,"hookEntryFor");c(Ka,"install");c(Ya,"uninstall");c(Qa,"status")});function un(n){return Buffer.from(`${JSON.stringify(n)}
906
+ `,"utf-8")}function wm(n){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${n} || exit 0`}function Xa(n){return n[qa]===!0}function Tw(n){if(n[qa]===!0)return!1;let e=n.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function fm(n){let e={type:"command",command:wm(n.subcommand),[qa]:!0};return"ifClause"in n&&n.ifClause&&(e.if=n.ifClause),e}async function Ka(){let n=await za(),e=n.hooks??{},t=0,s=0;for(let r of Vn){let o=e[r.event]??[],i=wm(r.subcommand),a=o.find(m=>(m.matcher??"")===r.matcher);a||(a={matcher:r.matcher,hooks:[]},o.push(a));let l=a.hooks.length;a.hooks=a.hooks.filter(m=>!Tw(m));let u=l-a.hooks.length,d=a.hooks.find(m=>Xa(m));if(d){let m=fm(r);d.command===m.command&&d.if===m.if&&u===0?s++:(d.command=m.command,d.if=m.if,t++)}else a.hooks.push(fm(r)),t++;e[r.event]=o}return n.hooks=e,await ym(n),{settingsPath:en(),hooksWritten:t,alreadyPresent:s}}async function Ya(){let n=await za();if(!n.hooks)return{settingsPath:en(),hooksRemoved:0};let e=0;for(let[t,s]of Object.entries(n.hooks)){let r=[];for(let o of s){let i=o.hooks.filter(a=>Xa(a)?(e++,!1):!0);i.length>0&&r.push({...o,hooks:i})}r.length>0?n.hooks[t]=r:delete n.hooks[t]}return Object.keys(n.hooks).length===0&&delete n.hooks,await ym(n),{settingsPath:en(),hooksRemoved:e}}async function Qa(){let e=(await za()).hooks??{},t=0;for(let s of Object.values(e))for(let r of s)for(let o of r.hooks)Xa(o)&&t++;return{installed:t,expected:Vn.length}}var qa,Vn,Za=v(()=>{"use strict";c(en,"settingsPath");qa="_prjctManaged",Vn=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PostToolUse",matcher:"Edit|Write",subcommand:"post-edit"},{event:"Stop",matcher:"",subcommand:"stop"},{event:"SubagentStart",matcher:"",subcommand:"subagent-start"},{event:"CwdChanged",matcher:"",subcommand:"cwd-changed"}];c(za,"readSettings");c(ym,"writeSettings");c(wm,"hookCommand");c(Xa,"isPrjctHook");c(Tw,"isLegacyPrjctHook");c(fm,"hookEntryFor");c(Ka,"install");c(Ya,"uninstall");c(Qa,"status")});function un(n){return Buffer.from(`${JSON.stringify(n)}
907
907
  `)}var ke,jm,xm,dc=v(()=>{"use strict";ke={runDir:c(()=>`${process.env.HOME||Te("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:c(()=>`${ke.runDir()}/daemon.sock`,"socket"),pid:c(()=>`${ke.runDir()}/daemon.pid`,"pid"),log:c(()=>`${ke.runDir()}/daemon.log`,"log")},jm=30*60*1e3,xm=1024*1024;c(un,"encodeMessage")});var Im={};Ee(Im,{executeViaDaemon:()=>ek,forceKillDaemon:()=>sk,getDaemonStatus:()=>Zw,isDaemonRunning:()=>$m,sendRequest:()=>Bn,spawnDaemon:()=>Dm,stopDaemon:()=>tk});import yo from"node:crypto";import Ae from"node:fs";import{connect as Qw}from"node:net";async function $m(){let n=ke.socket();if(!Ae.existsSync(n))return!1;try{return(await Bn({id:yo.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{Ae.unlinkSync(n)}catch{}return!1}}async function Zw(){let n=ke.socket(),e=ke.pid();if(!Ae.existsSync(n))return{running:!1};try{let t=await Bn({id:yo.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return Ae.existsSync(e)?{running:!1,pid:parseInt(Ae.readFileSync(e,"utf-8").trim(),10),socketPath:n}:{running:!1}}function Bn(n){return new Promise((e,t)=>{let s=ke.socket(),r=Qw(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,r.destroy(),t(new Error("Daemon request timed out")))},3e4);r.on("connect",()=>{r.write(un(n))}),r.on("data",l=>{o+=l.toString();let u=o.indexOf(`
908
908
  `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let m=JSON.parse(d);i=!0,clearTimeout(a),r.end(),e(m)}catch(m){i=!0,clearTimeout(a),r.end(),t(new Error(`Invalid daemon response: ${m.message}`))}}}),r.on("error",l=>{i||(i=!0,clearTimeout(a),t(l))}),r.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function ek(n,e,t,s,r,o=!0){let i=ke.socket();if(!Ae.existsSync(i))return o&&Dm().catch(()=>{}),null;try{return await Bn({id:yo.randomUUID(),command:n,args:e,options:t,cwd:s,perfStartNs:r})}catch{return null}}async function tk(){try{return(await Bn({id:yo.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function sk(){let n=ke.pid(),e=ke.socket(),t=!1;if(Ae.existsSync(n)){let s=parseInt(Ae.readFileSync(n,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{Ae.existsSync(n)&&Ae.unlinkSync(n)}catch{}try{Ae.existsSync(e)&&Ae.unlinkSync(e)}catch{}return t}async function Dm(){let{spawn:n}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),r=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(Ae.existsSync(t))o=t,i="bun";else if(Ae.existsSync(s))o=s,i=Yo()?"bun":"node";else if(Ae.existsSync(r))o=r,i=Yo()?"bun":"node";else return!1;let a=ke.runDir();Ae.mkdirSync(a,{recursive:!0});let l=ke.log(),u=Ae.openSync(l,"a");n(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),Ae.closeSync(u);let m=Date.now()+3e3;for(;Date.now()<m;)if(await new Promise(p=>setTimeout(p,300)),await $m())return!0;return!1}var _m=v(()=>{"use strict";br();dc();c($m,"isDaemonRunning");c(Zw,"getDaemonStatus");c(Bn,"sendRequest");c(ek,"executeViaDaemon");c(tk,"stopDaemon");c(sk,"forceKillDaemon");c(Dm,"spawnDaemon")});var Ym={};Ee(Ym,{isSyncCurrent:()=>Xm,runSelfHeal:()=>Km,selfHealIfStale:()=>Nk});import kc from"node:fs";import Dk from"node:os";import Jm from"node:path";function Ik(){try{return kc.readFileSync(zm,"utf-8").trim()}catch{return null}}function _k(n){try{kc.mkdirSync(qm,{recursive:!0}),kc.writeFileSync(zm,n,"utf-8")}catch{}}function Xm(n){return n?Ik()===n:!0}async function Km(n){if(n&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(bt(),sl));await e()}catch{}try{await(await Promise.resolve().then(()=>(Za(),km))).install()}catch{}_k(n)}}async function Nk(n){process.env.PRJCT_NO_SELF_SYNC!=="1"&&(Xm(n)||await Km(n))}var qm,zm,Qm=v(()=>{"use strict";qm=Jm.join(Dk.homedir(),".prjct-cli","state"),zm=Jm.join(qm,"installed-version");c(Ik,"readStamp");c(_k,"writeStamp");c(Xm,"isSyncCurrent");c(Km,"runSelfHeal");c(Nk,"selfHealIfStale")});import de from"node:fs";import{createServer as Mk}from"node:net";Ce();je();q();be();var Uo=class{static{c(this,"CommandRegistry")}handlers=new Map;handlerFns=new Map;metadata=new Map;categories=new Map;noProjectCommands=new Set(["init","setup","start","migrateAll"]);register(e,t){this.handlers.set(e.name,e),this.setMeta(e.name,t)}registerFn(e,t,s){this.handlerFns.set(e,t),this.setMeta(e,s)}setMeta(e,t){let s=t?.requiresProject??!this.noProjectCommands.has(e);this.metadata.set(e,{name:e,group:t?.group??"unknown",description:t?.description??"",requiresProject:s,usage:t?.usage??{claude:null,terminal:null},implemented:t?.implemented??!0,hasTemplate:t?.hasTemplate??!1,params:t?.params,blockingRules:t?.blockingRules,features:t?.features,isOptional:t?.isOptional,deprecated:t?.deprecated,replacedBy:t?.replacedBy})}registerCategory(e,t){this.categories.set(e,t)}registerMethod(e,t,s,r){let o=t[s];if(typeof o!="function")throw new Error(`${String(s)} is not a function`);let i=c(async(a,l)=>a!=null?o.call(t,a,l.projectPath):o.call(t,l.projectPath),"wrapper");this.handlerFns.set(e,i),this.setMeta(e,r)}has(e){return this.handlers.has(e)||this.handlerFns.has(e)}list(){return[...this.handlers.keys(),...this.handlerFns.keys()]}listByGroup(e){return Array.from(this.metadata.entries()).filter(([,t])=>t.group===e).map(([t])=>t)}getGroups(){let e=new Set;for(let t of this.metadata.values())e.add(t.group);return Array.from(e)}getMeta(e){return this.metadata.get(e)}getAll(){return Array.from(this.metadata.values())}getByName(e){return this.metadata.get(e)}getByCategory(e){return this.getAll().filter(t=>t.group===e)}getAllImplemented(){return this.getAll().filter(e=>e.implemented)}getAllWithTemplates(){return this.getAll().filter(e=>e.hasTemplate)}getClaudeCommands(){return this.getAll().filter(e=>e.usage.claude!==null)}getTerminalCommands(){return this.getAll().filter(e=>e.usage.terminal!==null)}getAllCategories(){return new Map(this.categories)}getCategory(e){return this.categories.get(e)}getRequiresInit(){return this.getAll().filter(e=>e.requiresProject)}getWithBlockingRules(){return this.getAll().filter(e=>e.blockingRules!==void 0)}getOptionalCommands(){return this.getAll().filter(e=>e.isOptional)}getDeprecatedCommands(){return this.getAll().filter(e=>e.deprecated)}getStats(){let e=this.getAll(),t={};for(let s of this.categories.keys())t[s]=e.filter(r=>r.group===s).length;return{total:e.length,implemented:e.filter(s=>s.implemented).length,withTemplates:e.filter(s=>s.hasTemplate).length,claudeOnly:e.filter(s=>s.usage.claude&&!s.usage.terminal).length,terminalOnly:e.filter(s=>!s.usage.claude&&s.usage.terminal).length,both:e.filter(s=>s.usage.claude&&s.usage.terminal).length,requiresInit:e.filter(s=>s.requiresProject).length,byCategory:t}}validate(){let e=[],t=this.getAll(),s=t.map(a=>a.name),r=s.filter((a,l)=>s.indexOf(a)!==l);r.length>0&&e.push(`Duplicate command names: ${r.join(", ")}`);let o=t.filter(a=>a.hasTemplate&&!a.implemented);o.length>0&&e.push(`Commands with templates but not implemented: ${o.map(a=>a.name).join(", ")}`);let i=Array.from(this.categories.keys());if(i.length>0){let a=t.filter(l=>!i.includes(l.group));a.length>0&&e.push(`Invalid categories: ${a.map(l=>`${l.name}:${l.group}`).join(", ")}`)}return{valid:e.length===0,issues:e}}async buildContext(e){let t=await $.getProjectId(e);if(!t)throw new Error("No prjct project found. Run /p:init first.");return{projectId:t,projectPath:e,globalPath:j.getGlobalProjectPath(t),timestamp:b()}}async execute(e,t,s=process.cwd()){let r=this.metadata.get(e),o;if(r?.requiresProject===!1)o={projectId:"",projectPath:s,globalPath:"",timestamp:b()};else try{o=await this.buildContext(s)}catch(l){return{success:!1,error:y(l)}}let i=this.handlers.get(e);if(i)return i.execute(t,o);let a=this.handlerFns.get(e);return a?a(t,o):{success:!1,error:`Command not found: ${e}`}}async executeWithoutProject(e,t,s=process.cwd()){let r=this.handlers.get(e);if(r){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return r.execute(t,i)}let o=this.handlerFns.get(e);if(o){let i={projectId:"",projectPath:s,globalPath:"",timestamp:b()};return o(t,i)}return{success:!1,error:`Command not found: ${e}`}}clear(){this.handlers.clear(),this.handlerFns.clear(),this.metadata.clear(),this.categories.clear()}},z=new Uo;function Xc(n){let e=z.getAll().map(r=>r.name),t=null,s=1/0;for(let r of e){let o=jp(n.toLowerCase(),r.toLowerCase());o<s&&(s=o,t=r)}return s<=2?t:null}c(Xc,"findClosestCommand");function jp(n,e){let t=n.length,s=e.length,r=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=s;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)r[o][i]=n[o-1]===e[i-1]?r[o-1][i-1]:1+Math.min(r[o-1][i],r[o][i-1],r[o-1][i-1]);return r[t][s]}c(jp,"editDistance");uo();Ln();no();q();Re();Fe();var Qs=class extends re{static{c(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),s={}){try{if(!e||!e.trim())return g.info('Usage: prjct capture "<anything>" [--tags k:v,...]'),{success:!1,error:"Content required"};let r=e.trim(),o=Un(r);if(o.length>0&&!s.force)return g.fail(`refusing to capture content that looks like a secret (${o.join(", ")}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"};let i=hw(s.tags),a=await this.ensureProjectInit(t);if(!a.success)return a;await qt.remember(t,{type:"inbox",content:r,tags:i,provenance:"declared"});let l=r.length>60?`${r.slice(0,57)}\u2026`:r;return s.md?console.log(`\u2713 captured: ${l}`):g.done(`captured: ${l}`),{success:!0,type:"inbox",content:r,tags:i}}catch(r){let o=y(r);return g.fail(o),{success:!1,error:o}}}};function hw(n){if(!n)return{};let e={};for(let t of n.split(",")){let s=t.trim(),r=s.indexOf(":");r>0&&(e[s.slice(0,r)]=s.slice(r+1))}return e}c(hw,"parseFlagTags");import Wa from"node:fs";import yw from"node:os";import lm from"node:path";var um=lm.join(yw.homedir(),".prjct-cli","config"),Ga=lm.join(um,"global.json");function Va(){try{let n=Wa.readFileSync(Ga,"utf-8"),e=JSON.parse(n);if(e&&typeof e=="object"&&!Array.isArray(e))return e}catch{}return{}}c(Va,"readRaw");function ww(n){Wa.mkdirSync(um,{recursive:!0}),Wa.writeFileSync(Ga,`${JSON.stringify(n,null,2)}
909
909
  `,"utf-8")}c(ww,"writeRaw");function dm(n){return Va()[n]}c(dm,"getConfig");function mm(){return Va()}c(mm,"getAll");function Ba(n,e){let t=Va();e===void 0?delete t[n]:t[n]=e,ww(t)}c(Ba,"setConfig");function pm(n){Ba(n,void 0)}c(pm,"unsetConfig");function gm(){return Ga}c(gm,"configPath");Wt();Re();Fe();var Zs=class extends re{static{c(this,"ConfigCommands")}async config(e=null,t=process.cwd(),s={}){let r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0]??"list";switch(o){case"list":return this.list(s);case"get":return this.get(r[1],s);case"set":return this.set(r[1],r.slice(2).join(" "),s);case"unset":return this.unset(r[1],s);default:return g.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=mm(),s=Object.keys(t).sort();if(e.md){let r=s.length===0?"_No global config set._":s.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.4.32",
3
+ "version": "2.4.36",
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": {