prjct-cli 2.44.0 → 2.44.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,14 +2,18 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ### Improved
6
+ - **Token diet across every injected surface** (~17% less per session). Per-turn state block: timestamps use day-level buckets (`today`/`yesterday`/`Nd ago` — minute-level strings flipped every turn for zero signal) and a clean tree with nothing unpushed emits just the branch name. Skill body: the State section is counts-only (task descriptions were stale by the next sync and duplicated by the live prompt hook — detail moves to `prjct context --md`). Session-start: dropped the recall-verb line the skill already carries. Global CLAUDE.md: capture/workflow sections collapsed to the parts the skill doesn't cover. Team-mode block: one-line contract instead of repeating the global instructions.
7
+
5
8
  ### Fixed
6
- - **Superseded knowledge can no longer surface as live advice.** `searchFts` (the per-prompt trap cue + the FTS leg of every recall) only filtered soft-deletes an obsolete decision/gotcha could still inject as current. It now prunes author-declared retirements (`supersedes:` / `superseded-by:` / `duplicates:`) using a mirror-wide dead-id set, catching the case where BM25 never co-returns the superseding entry.
7
- - **Spanish prompts now produce real retrieval signal.** Keyword extraction was ASCII-only ("búsqueda" → mangled, "qué pasó" → nothing); it now tokenizes unicode, deburrs to match FTS5's diacritic-stripped index, and drops Spanish function words. FTS query sanitizing deburrs too.
9
+ - The `review-risk` git-integration tests carry a 15s timeoutthe default 5s flaked under CI runner load and took down a release run.
10
+
11
+ ## [2.44.1] - 2026-06-12
12
+
13
+ ### Performance
14
+
15
+ - token diet — coarse timestamps, quiet state lines, counts-only skill State, instruction dedupe (#430)
8
16
 
9
- ### Improved
10
- - **MCP memory tools retrieve like the CLI.** `prjct_mem_list` used plain recency recall and `prjct_mem_similar` a shared-keyword heuristic — subagents (who do the bulk of the editing) got strictly worse retrieval than `prjct context memory`. Both now run the shared `enrichedRecall` pipeline: FTS-first, semantic blend, usefulness rerank, link expansion, ship attribution.
11
- - **Digest slots are proven-first.** The session-start and subagent digests picked the 3 most RECENT gotchas/decisions; they now overfetch and rerank by the usefulness ledger, so knowledge that keeps paying off wins the slots.
12
- - **Push-surfaced knowledge earns ship credit.** The pre-edit guard hook, the prompt trap cue, `prjct guard`, and `prjct_guard` now log surfaced entries against the active task — previously only PULL recalls did, so the most effective gotchas decayed in ranking precisely because the push delivery worked.
13
17
 
14
18
  ## [2.44.0] - 2026-06-11
15
19
 
@@ -24,7 +24,7 @@ var hP=Object.create;var _o=Object.defineProperty;var yP=Object.getOwnPropertyDe
24
24
  ${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.indexOf(r)+r.length),a;return e.includes(t)&&e.includes(r)?a=e.substring(e.indexOf(t),e.indexOf(r)+r.length):a=e,{content:o+a+i,action:"updated"}}var Go=h(()=>{"use strict";c(mr,"mergeWithMarkers")});import Jn from"node:fs/promises";import qr from"node:path";async function Ny(){try{let n=_.getDocsPath();await Jn.mkdir(n,{recursive:!0});let e=_s("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=qe(s);o&&await Jn.writeFile(qr.join(n,qr.basename(s)),o,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:t}=(Pe(),et(dr)),r=qr.join(t,"templates/global/docs");try{let s=await Jn.readdir(r);for(let o of s)if(o.endsWith(".md")){let i=await Jn.readFile(qr.join(r,o),"utf-8");await Jn.writeFile(qr.join(n,o),i,"utf-8")}}catch{}return{success:!0}}catch(n){return{success:!1,error:w(n)}}}async function qu(){let n=(Ge(),et(Pt)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await Jn.mkdir(e.configDir,{recursive:!0});let s=qr.join(e.configDir,e.contextFile),o=Oy;if(t!=="claude"){let f=qe(`global/${e.contextFile}`);if(f)o=f;else{let{PACKAGE_ROOT:y}=(Pe(),et(dr)),S=qr.join(y,"templates","global",e.contextFile);try{o=await Jn.readFile(S,"utf-8")}catch{t==="gemini"&&(o=Oy.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await Jn.readFile(s,"utf-8"),a=!0}catch(f){if(F(f))a=!1;else throw f}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let f=i.substring(0,i.indexOf(l)),y=i.substring(i.indexOf(u)+u.length);i=`${(f+y).replace(/\n{3,}/g,`
25
25
 
26
26
  `).trim()}
27
- `}let m=mr(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Jn.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}var Oy,Ly=h(()=>{"use strict";vn();N();Go();fe();Oy='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when any of these signs are present: `~/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.** **Author every persisted entry in ENGLISH**, whatever language the user speaks \u2014 translate the intent; one canonical language keeps retrieval sharp and token cost flat.\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(Ny,"installDocs");c(qu,"installGlobalConfig")});var Xu={};A(Xu,{CommandInstaller:()=>En,default:()=>Le,getProviderPaths:()=>Ju,installGlobalConfig:()=>EA});import fr from"node:fs/promises";import Vu from"node:os";import tt from"node:path";async function EA(){return qu()}function Ju(){let n=Vu.homedir();return{claude:{commands:tt.join(n,".claude","commands"),config:tt.join(n,".claude"),router:tt.join(n,".claude","commands","p.md")},gemini:{commands:tt.join(n,".gemini","commands"),config:tt.join(n,".gemini"),router:tt.join(n,".gemini","commands","p.toml")}}}var En,TA,Le,en=h(()=>{"use strict";N();V();Ly();c(EA,"installGlobalConfig");En=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=Vu.homedir()}async ensureInit(){if(this._initialized)return;let t=await(Ge(),et(Pt)).getActiveProvider();this.commandsPath=tt.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),v(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),r=await(Ge(),et(Pt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${r.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let r=tt.join(this.commandsPath,t);try{await fr.unlink(r),e.push(t)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:w(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let r=tt.join(this.commandsPath,t);try{await fr.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=tt.join(this.commandsPath,"p");try{if((await fr.stat(e).catch(()=>null))?.isDirectory())return await fr.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return qu()}async cleanupAllLegacy(){let e=Vu.homedir(),t=[],r=[tt.join(e,".claude","commands","p.md"),tt.join(e,".claude","commands","p.toml"),tt.join(e,".gemini","commands","p.md"),tt.join(e,".gemini","commands","p.toml")];for(let i of r)try{await fr.unlink(i),t.push(i)}catch{}let s=[tt.join(e,".claude","commands","p"),tt.join(e,".gemini","commands","p")];for(let i of s)try{(await fr.stat(i).catch(()=>null))?.isDirectory()&&(await fr.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[tt.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await fr.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Ny()}};c(Ju,"getProviderPaths");TA=new En,Le=TA});var td={};A(td,{PRJCT_HOOKS:()=>Ds,install:()=>Qu,status:()=>ed,uninstall:()=>Zu});import Ku from"node:fs/promises";import CA from"node:os";import Hy from"node:path";function Is(){let n=process.env.HOME||CA.homedir();return Hy.join(n,".claude","settings.json")}function RA(n){let e=n.command?.match(/\bhook\s+(\S+)/);return e?e[1]:null}function xA(n){let e=new Set(Ds.map(r=>r.subcommand)),t=0;for(let r of Object.keys(n)){let s=n[r],o=[];for(let i of s)i.hooks=i.hooks.filter(a=>{if(!wa(a))return!0;let l=RA(a);return l&&!e.has(l)?(t++,!1):!0}),i.hooks.length>0&&o.push(i);o.length>0?n[r]=o:delete n[r]}return t}async function Yu(){try{let n=await Ku.readFile(Is(),"utf-8"),e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch(n){if(n.code==="ENOENT")return{};throw n}}async function Uy(n){await Ku.mkdir(Hy.dirname(Is()),{recursive:!0}),await Ku.writeFile(Is(),`${JSON.stringify(n,null,2)}
27
+ `}let m=mr(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Jn.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}var Oy,Ly=h(()=>{"use strict";vn();N();Go();fe();Oy='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when any of these signs are present: `~/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 \u2014 persist it: `prjct remember <decision|learning|gotcha|fact> "..."` or `prjct capture "<text>" --tags k:v`. **Author every entry in ENGLISH**, whatever language the user speaks. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.** The full verb map and task workflow live in the `prjct` skill.\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `~/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(Ny,"installDocs");c(qu,"installGlobalConfig")});var Xu={};A(Xu,{CommandInstaller:()=>En,default:()=>Le,getProviderPaths:()=>Ju,installGlobalConfig:()=>EA});import fr from"node:fs/promises";import Vu from"node:os";import tt from"node:path";async function EA(){return qu()}function Ju(){let n=Vu.homedir();return{claude:{commands:tt.join(n,".claude","commands"),config:tt.join(n,".claude"),router:tt.join(n,".claude","commands","p.md")},gemini:{commands:tt.join(n,".gemini","commands"),config:tt.join(n,".gemini"),router:tt.join(n,".gemini","commands","p.toml")}}}var En,TA,Le,en=h(()=>{"use strict";N();V();Ly();c(EA,"installGlobalConfig");En=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=Vu.homedir()}async ensureInit(){if(this._initialized)return;let t=await(Ge(),et(Pt)).getActiveProvider();this.commandsPath=tt.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),v(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),r=await(Ge(),et(Pt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${r.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let r=tt.join(this.commandsPath,t);try{await fr.unlink(r),e.push(t)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:w(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let r=tt.join(this.commandsPath,t);try{await fr.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=tt.join(this.commandsPath,"p");try{if((await fr.stat(e).catch(()=>null))?.isDirectory())return await fr.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return qu()}async cleanupAllLegacy(){let e=Vu.homedir(),t=[],r=[tt.join(e,".claude","commands","p.md"),tt.join(e,".claude","commands","p.toml"),tt.join(e,".gemini","commands","p.md"),tt.join(e,".gemini","commands","p.toml")];for(let i of r)try{await fr.unlink(i),t.push(i)}catch{}let s=[tt.join(e,".claude","commands","p"),tt.join(e,".gemini","commands","p")];for(let i of s)try{(await fr.stat(i).catch(()=>null))?.isDirectory()&&(await fr.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[tt.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await fr.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return Ny()}};c(Ju,"getProviderPaths");TA=new En,Le=TA});var td={};A(td,{PRJCT_HOOKS:()=>Ds,install:()=>Qu,status:()=>ed,uninstall:()=>Zu});import Ku from"node:fs/promises";import CA from"node:os";import Hy from"node:path";function Is(){let n=process.env.HOME||CA.homedir();return Hy.join(n,".claude","settings.json")}function RA(n){let e=n.command?.match(/\bhook\s+(\S+)/);return e?e[1]:null}function xA(n){let e=new Set(Ds.map(r=>r.subcommand)),t=0;for(let r of Object.keys(n)){let s=n[r],o=[];for(let i of s)i.hooks=i.hooks.filter(a=>{if(!wa(a))return!0;let l=RA(a);return l&&!e.has(l)?(t++,!1):!0}),i.hooks.length>0&&o.push(i);o.length>0?n[r]=o:delete n[r]}return t}async function Yu(){try{let n=await Ku.readFile(Is(),"utf-8"),e=JSON.parse(n);return e&&typeof e=="object"?e:{}}catch(n){if(n.code==="ENOENT")return{};throw n}}async function Uy(n){await Ku.mkdir(Hy.dirname(Is()),{recursive:!0}),await Ku.writeFile(Is(),`${JSON.stringify(n,null,2)}
28
28
  `,"utf-8")}function Wy(n){let e=process.env.PRJCT_BIN??"prjct";return`command -v ${e} >/dev/null 2>&1 && ${e} hook ${n} || exit 0`}function wa(n){return n[zu]===!0}function PA(n){if(n[zu]===!0)return!1;let e=n.command?.trim()??"";return/(^|\/|\s)prjct\s+hook\s+\S+/.test(e)}function Fy(n){let e={type:"command",command:Wy(n.subcommand),[zu]:!0};return"ifClause"in n&&n.ifClause&&(e.if=n.ifClause),e}async function Qu(){let n=await Yu(),e=n.hooks??{},t=0,r=0;for(let o of Ds){let i=e[o.event]??[],a=Wy(o.subcommand),l=i.find(m=>(m.matcher??"")===o.matcher);l||(l={matcher:o.matcher,hooks:[]},i.push(l));let u=l.hooks.length;l.hooks=l.hooks.filter(m=>!PA(m));let d=u-l.hooks.length,p=l.hooks.find(m=>wa(m));if(p){let m=Fy(o);p.command===m.command&&p.if===m.if&&d===0?r++:(p.command=m.command,p.if=m.if,t++)}else l.hooks.push(Fy(o)),t++;e[o.event]=i}let s=xA(e);return n.hooks=e,await Uy(n),{settingsPath:Is(),hooksWritten:t,alreadyPresent:r,hooksPruned:s}}async function Zu(){let n=await Yu();if(!n.hooks)return{settingsPath:Is(),hooksRemoved:0};let e=0;for(let[t,r]of Object.entries(n.hooks)){let s=[];for(let o of r){let i=o.hooks.filter(a=>wa(a)?(e++,!1):!0);i.length>0&&s.push({...o,hooks:i})}s.length>0?n.hooks[t]=s:delete n.hooks[t]}return Object.keys(n.hooks).length===0&&delete n.hooks,await Uy(n),{settingsPath:Is(),hooksRemoved:e}}async function ed(){let e=(await Yu()).hooks??{},t=0;for(let r of Object.values(e))for(let s of r)for(let o of s.hooks)wa(o)&&t++;return{installed:t,expected:Ds.length}}var zu,Ds,ka=h(()=>{"use strict";c(Is,"settingsPath");zu="_prjctManaged",Ds=[{event:"SessionStart",matcher:"",subcommand:"session-start"},{event:"UserPromptSubmit",matcher:"",subcommand:"prompt"},{event:"PreToolUse",matcher:"Bash",subcommand:"pre-commit",ifClause:"Bash(git commit *)"},{event:"PreToolUse",matcher:"Edit|Write",subcommand:"pre-edit"},{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(RA,"subcommandOf");c(xA,"pruneOrphanedManagedHooks");c(Yu,"readSettings");c(Uy,"writeSettings");c(Wy,"hookCommand");c(wa,"isPrjctHook");c(PA,"isLegacyPrjctHook");c(Fy,"hookEntryFor");c(Qu,"install");c(Zu,"uninstall");c(ed,"status")});var od={};A(od,{isSyncCurrent:()=>rd,runSelfHeal:()=>sd});import nd from"node:fs";import AA from"node:path";function jA(){try{return nd.readFileSync(By(),"utf-8").trim()}catch{return null}}function $A(n){try{nd.mkdirSync(Gy(),{recursive:!0}),nd.writeFileSync(By(),n,"utf-8")}catch{}}function rd(n){return n?jA()===n:!0}async function sd(n){if(n&&process.env.PRJCT_NO_SELF_SYNC!=="1"){try{let{installGlobalConfig:e}=await Promise.resolve().then(()=>(en(),Xu));await e()}catch{}try{await(await Promise.resolve().then(()=>(ka(),td))).install()}catch{}$A(n)}}var Gy,By,ba=h(()=>{"use strict";fe();Gy=c(()=>_.getStatePath(),"stampDir"),By=c(()=>AA.join(Gy(),"installed-version"),"stampPath");c(jA,"readStamp");c($A,"writeStamp");c(rd,"isSyncCurrent");c(sd,"runSelfHeal")});function Ms(n){let e=[];for(let{name:t,re:r}of qy)r.test(n)&&e.push(t);return e}function Vy(n){return n.replace(/[`*_[\](){}<>\\]/g,e=>`\\${e}`)}var qy,FU,Bo=h(()=>{"use strict";qy=[{name:"instruction-override",re:/\b(ignore|disregard|override|forget)\b[^.]{0,40}\b(previous|prior|above|system|prompt|instructions?|rules?|constraints?)\b/i},{name:"role-play-injection",re:/\b(you\s+are\s+now|act\s+as|pretend\s+to\s+be|roleplay\s+as|assume\s+the\s+role)\b[^.]{0,40}\b(system|admin|root|developer|operator|jailbreak)\b/i},{name:"jailbreak-phrase",re:/\b(DAN\s+mode|do\s+anything\s+now|without\s+restrictions?|bypass\s+(?:safety|filters?|guidelines?)|jailbreak\s+mode)\b/i},{name:"fake-system-tag",re:/<\s*(?:system|assistant|tool[_-]?call|function[_-]?call)\s*>/i}],FU=qy.map(n=>n.name);c(Ms,"scanForPromptInjection");c(Vy,"escapeMarkdownInline")});function _A(n){return n.replace(/[[\]|]/g,"").replace(/\s+/g," ").trim()}function Fe(n){let e=(n.content??"").trim();e=e.replace(/^(?:[-*•]\s+|\s+)+/,""),e=e.replace(/^(?:\[\[[^\]]*\]\]|mem[_-]\d+)[\s:,-]*/i,"").trim();let t=e.length;for(let o of[/\n/,/\.\s/,/:\s/,/;\s/,/\s—\s/,/\s\(/]){let i=e.match(o);i&&i.index!==void 0&&i.index>4&&i.index<t&&(t=i.index)}let r=e.slice(0,t).replace(/\s+/g," ").trim();if(r=r.replace(/\[\[[^\]|]*\|([^\]]*)\]\]/g,"$1").replace(/\[\[([^\]]*)\]\]/g,"$1").trim(),r.length>Jy){let o=r.slice(0,Jy),i=o.lastIndexOf(" ");r=`${(i>40?o.slice(0,i):o).trim()}\u2026`}r.length<6&&(r=`${n.type} ${n.id}`);let s=n.tags?.pr;return s&&!new RegExp(`\\b#?${s}\\b`).test(r)&&(r=`${r} (PR #${s})`),r}function Tn(n,e){return n.replace(/\[\[(mem[_-]\d+)\]\]/gi,"$1").replace(/\bmem[_-](\d+)\b/g,(t,r)=>{let s=`mem_${r}`,o=e?.idTypeIndex?.get(s),i=e?.idTitleIndex?.get(s),a=e?.idSlugIndex?.get(s),l=i?_A(i):s;return e?.signalIds?.has(s)?`[[signals#^mem-${r}|${l}]]`:a&&o&&e?.perEntryTypes?.has(o)?`[[${a}|${l}]]`:o?`[[${o}#^mem-${r}|${l}]]`:i?`[[${s}|${l}]]`:`\`${s}\``})}function gr(n,e){if(n.length===0)return"> No matching memory entries.";let t=new Map;for(let u of n){let d=t.get(u.type)??[];d.push(u),t.set(u.type,d)}let r=["decision","learning","anti-pattern","gotcha","pattern","fact","inbox","todo","idea","insight","question","source","person","shipped"],s=[],o={declared:"DECL",extracted:"EXTR",inferred:"INFR",ambiguous:"AMBG"},i=e?.boundary==="llm",a=c((u,d)=>{if(d.length!==0){s.push(`### ${u.toUpperCase()}`);for(let p of d){let m=Object.entries(p.tags).filter(([C])=>!e?.vault||!Sa.has(C)).map(([C,I])=>`${C}=${i?Vy(I):I}`).join(" "),f=o[p.provenance],y=e?.vault?Tn(p.content,e):p.content,S=m?` _(${e?.vault?Tn(m,e):m})_`:"",k=p.id.replace(/^mem[_-]/,""),b=e?.vault?` ^mem-${k}`:"",x=`- \`${f}\` [${p.id} \xB7 ${p.type}] ${y}${S}${b}`;i?(s.push(`<user_content id="${p.id}" type="${p.type}">`),s.push(x),s.push("</user_content>")):s.push(x)}s.push("")}},"renderGroup"),l=new Set;for(let u of r){let d=t.get(u);!d||d.length===0||(a(u,d),l.add(u))}for(let[u,d]of t)l.has(u)||a(u,d);return s.join(`
29
29
  `).trim()}var Sa,Jy,qt=h(()=>{"use strict";Bo();Sa=new Set(["source","session","window_days","window-days","touches","occurrences","phrase","slug","hash","content-hash","content_hash","key","kind","spec-id","spec_id"]),Jy=72;c(_A,"linkLabel");c(Fe,"deriveTitle");c(Tn,"linkifyMemRefs");c(gr,"formatMemoryMd")});var Ky={};A(Ky,{MEMORY_EVENT_RANGE:()=>Vr,REMEMBER_ACTION_PREFIX:()=>Ea,REMEMBER_EVENT_PREFIX:()=>tn,REMEMBER_EVENT_RANGE:()=>hr,STATUS_CHANGE_ACTION:()=>yr,TAG_EVENT_TYPE:()=>id});function Xy(n){return n.slice(0,-1)+String.fromCharCode(n.charCodeAt(n.length-1)+1)}var va,Ea,tn,id,Vr,hr,yr,Jr=h(()=>{"use strict";va="memory.",Ea="remember.",tn=`${va}${Ea}`,id=`${va}task.tagged`;c(Xy,"prefixUpperBound");Vr=[va,Xy(va)],hr=[tn,Xy(tn)],yr="status.changed"});import IA from"node:crypto";function Ve(){return IA.randomUUID()}var Xn=h(()=>{"use strict";c(Ve,"generateUUID")});import DA from"node:crypto";function qo(n){let e=n.toLowerCase().replace(/\s+/g," ").trim();return DA.createHash("sha256").update(e).digest("hex")}var ad=h(()=>{"use strict";c(qo,"memoryFingerprint")});var zy,Yy=h(()=>{"use strict";zy=`
30
30
  -- =======================================================================
@@ -1062,10 +1062,9 @@ ${e.join(" | ")}
1062
1062
  |--------|---------|
1063
1063
  ${e.map(([t,r])=>`| ${t} | \`${r}\` |`).join(`
1064
1064
  `)}
1065
- `}function T0(n){let e=[];if(n.hasActiveTask&&e.push(`Active task: **${n.activeTaskDescription}**`),n.pausedTasks.length>0)for(let r of n.pausedTasks.slice(0,3))e.push(`Paused: ${r.description} (${r.pausedAt})`);if(n.backlogCount>0){let r=n.topBacklog.slice(0,3).map(s=>`${s.description} [${s.priority}]`).join(", ");e.push(`Backlog: ${n.backlogCount} items${r?` \u2014 ${r}`:""}`)}let t=[];return n.ideasCount>0&&t.push(`Ideas: ${n.ideasCount} pending`),n.shippedCount>0&&t.push(`Shipped: ${n.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
1065
+ `}function T0(n){let e=[];return n.pausedTasks.length>0&&e.push(`Paused: ${n.pausedTasks.length}`),n.backlogCount>0&&e.push(`Backlog: ${n.backlogCount}`),n.ideasCount>0&&e.push(`Ideas: ${n.ideasCount} pending`),n.shippedCount>0&&e.push(`Shipped: ${n.shippedCount}`),e.length===0?"":`
1066
1066
  ## State
1067
- ${e.join(`
1068
- `)}
1067
+ ${e.join(" | ")} \u2014 detail via \`prjct context --md\`
1069
1068
  `}function C0(n){return n.userPatterns.length===0?"":`
1070
1069
  ## User Patterns
1071
1070
  ${n.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
@@ -1151,7 +1150,7 @@ Goal: ${a.content.goal}`,tags:{...t.tags??{},spec_id:a.id,status:a.status},sourc
1151
1150
  \u26A0\uFE0F ${n.question}`),console.log(`
1152
1151
  Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}async function ID(n){if(!Gm(n))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(Ee(),Tu)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:n,timeout:3e3}),r=t.toString().trim();if(!r)return null;let{stdout:s}=await e("gh",["pr","list","--head",r,"--state","open","--json","number,title","--limit","1"],{cwd:n,timeout:5e3}),o=JSON.parse(s.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:r}}catch{return null}}var il,Wm,cl=h(()=>{"use strict";Qc();ls();z();Yr();Qn();N();le();be();Et();yi();de();rc();Re();Kt();il="ship:in_progress",Wm=class extends X{static{c(this,"ShippingCommands")}async ship(e,t=process.cwd(),r={}){try{let s=await me(t);if(!s.ok)return s.result;let o=s.value;try{let x=P.getDoc(o,il);x?.version&&(await kt.getByVersion(o,x.version)||(await kt.addShipped(o,{name:x.feature,version:x.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${x.feature} (v${x.version})`)),P.deleteDoc(o,il))}catch{}let i=e,a=await rr(o,t),l=a?.linkedSpecId;if(a&&(i||(i=a.description||"current work"),await qm(o,t)),i||(i="current work"),l&&!r.noSpecGate)try{let{specService:x}=await Promise.resolve().then(()=>(ol(),Um)),C=await x.get(t,l);if(C&&C.content.acceptance_criteria.length>0){let I=[];I.push(""),I.push(`## Spec acceptance gate \u2014 \`${C.title}\` (${C.id.slice(0,8)})`),I.push(""),I.push("Walk each criterion. STOP if any is unmet."),I.push("");for(let q of C.content.acceptance_criteria)I.push(`- [ ] ${q}`);I.push(""),I.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),I.push(""),console.log(I.join(`
1153
1152
  `))}}catch{}let u=se.getRulesForCommand(o,"ship");if(r.intent==="seed-code-workflow"){if(!await Bm(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=se.getRulesForCommand(o,"ship")}!u.some(x=>x.type==="step"&&x.position==="before")&&r.intent!=="register-only"&&await Bm(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=se.getRulesForCommand(o,"ship"));let p=await $D(o,t,u,r);if(p)return _D(p,r.md===!0),{success:!1,clarification:p};let m={feature:i},f=await er(o,"ship","before",{projectPath:t,skipRules:r.skipHooks,runContext:m});if(!f.success)return{success:!1,error:`Ship blocked: ${f.gatesFailed.length>0?f.gatesFailed.join(", "):"unknown step"}`};let y=typeof m.version=="string"?m.version:"unversioned";try{P.setDoc(o,il,{feature:i,version:y,startedAt:T()})}catch{}await kt.addShipped(o,{name:i,version:y});try{P.deleteDoc(o,il)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:y,timestamp:T()});let S=await er(o,"ship","after",{projectPath:t,skipRules:r.skipHooks,runContext:m}),k=[...f.instructions,...S.instructions];try{await Ar.sync(t)}catch(x){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(x))}try{let{regenerateWikiDeferred:x}=await Promise.resolve().then(()=>(Pn(),Tr));await x(t,o)}catch(x){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",w(x))}let b=f.stepsRun.length+S.stepsRun.length;if(r.md){let x=Zc("ship",!0),C=G(xe(`Shipped: ${i}`,`Version: ${y}`),K("Results",De([`Version: ${y}`,`Workflow steps run: ${b>0?[...f.stepsRun,...S.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${f.hooksFailed.length+S.hooksFailed.length}`])),k.length>0?K("Agent Instructions",De(k)):null,Be(x.map(I=>({label:I.desc,command:I.cmd}))));console.log(C)}else g.done(`v${y} shipped`),co("ship");if(a?.id)try{let{usefulnessService:x}=await Promise.resolve().then(()=>(Yn(),bd));x.creditShippedTask(o,a.id)}catch{}return{success:!0,feature:i,version:y}}catch(s){return g.fail(w(s)),Oe(s)}}};c(cT,"isCodeProject");c(Gm,"isGitRepo");c(Bm,"seedCodeShipRules");c($D,"buildClarification");c(_D,"renderClarification");c(ID,"findOpenPrForBranch")});var ll={};A(ll,{PlanningCommands:()=>Jm});async function DD(){if(!Vm){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(rl(),nl));Vm=new n}return Vm}var Vm,Jm,ul=h(()=>{"use strict";aa();en();ne();fe();Jb();Qb();Qn();N();be();de();bp();tS();Re();Vm=null;c(DD,"getAnalysisCommands");Jm=class extends X{static{c(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let r={};if(typeof e=="string"||e===null?r={idea:e}:r=e,await this.initializeAgent(),await j.isConfigured(t))return g.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=r.yes||!o||process.env.CI==="true",a=null;if(i)o&&r.yes&&(a=await new ui(t).runNonInteractive());else if(a=await new ui(t).run(),a.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await Ps(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await j.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,r),g.step(2,4,"Creating structure..."),await _.ensureProjectStructure(p),await this._seedShipWorkflow(p,t);let m=await this._detectEmptyDirectory(t),f=await this._detectExistingCode(t);if(f||!m){g.step(3,4,"Analyzing project...");let k=await DD();if((await k.analyze({},t)).success)return g.step(4,4,"Generating agents..."),await k.sync(t),g.done("initialized"),this._printNextSteps(a),{success:!0,mode:"existing",projectId:p,wizard:a}}let y=r.idea;if(m&&!f){if(!y)return g.done("blank project - provide idea for architect mode"),{success:!0,mode:"blank_no_idea",projectId:p,wizard:a};g.spin("architect mode...");let{projectMemory:k}=await Promise.resolve().then(()=>(Te(),ja));return await k.remember(t,{type:"idea",content:y,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await Le.installGlobalConfig(),g.done("architect mode ready"),{success:!0,mode:"architect",projectId:p,idea:y,wizard:a}}await Le.installGlobalConfig(),await Yb(t).catch(()=>{});let S=!1;try{let{detectCodex:k}=await Promise.resolve().then(()=>(Ge(),Pt));((await k()).installed||a?.agents.includes("codex"))&&(await Vb(t),S=!0)}catch{}return g.done("initialized"),this._printNextSteps(a,{agentsMdWritten:S}),{success:!0,projectId:p,wizard:a}}catch(r){return g.fail(w(r)),Oe(r)}}_printNextSteps(e,t={}){console.log(""),console.log(" \u2713 skill installed at ~/.claude/skills/prjct/"),console.log(" \u2713 project CLAUDE.md updated with routing block"),t.agentsMdWritten&&console.log(" \u2713 project AGENTS.md updated with routing block (Codex & friends)"),console.log(""),console.log(" You don't run prjct commands. Claude does."),console.log(""),console.log(" Just describe what you're doing \u2014 Claude reads the intent and"),console.log(" runs the right verb. Routine captures (decision, learning,"),console.log(" gotcha, idea) save automatically; ship and other destructive"),console.log(" verbs surface a one-line plan and wait for your OK."),console.log(""),console.log(" If you want to drive manually:"),console.log(" prjct sync Refresh context + skill body"),console.log(" prjct task Start a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e&&e.agents.length>0&&(console.log(` Detected agents: ${e.agents.join(", ")}`),console.log("")),console.log(" Docs: https://prjct.app/docs"),console.log("")}async _applyInitialPacksAndPersona(e,t){let{activatePacks:r,detectSuggestedPacks:s}=await Promise.resolve().then(()=>(Nm(),KE)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await s(e)),o.length>0&&await r(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(ne(),Vn))).default,a=await i.readConfig(e);if(a){let l=a.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...a,persona:l})}}}async _seedShipWorkflow(e,t){let r=await uc(t),s=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(cl(),al));await o(e,t),s=se.getRulesForCommand(e,"ship").reduce((i,a)=>Math.max(i,a.sortOrder??0),0)+1,se.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),r.lint&&se.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),r.test&&se.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var Xm,jn,lT,kc=h(()=>{"use strict";lr();aa();ne();fe();N();V();de();Xm=class{static{c(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await j.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(la(),ca));if(await o.detect(e)){let a=await o.getMainWorktree(e);if(a&&a!==e&&await j.isConfigured(a))return await o.setup(e,a),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ul(),ll)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await j.getProjectId(e);if(!t)throw na.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await _.ensureProjectStructure(t),_.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await Ps();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await Bn(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return F(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await Bn(e)).some(s=>t.includes(s))}catch(t){return F(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await j.isConfigured(e)}async needsMigration(e){return await j.needsMigration(e)}},jn=new Xm,lT=jn});import MD from"node:fs/promises";import uT from"node:path";async function dT(n){try{return await MD.realpath(n)}catch{return n}}function Km(n,e){return`${n} \xB7 ${e??"(detached)"}`}async function ds(n){let e=Date.now(),t=pT.get(n);if(t&&e-t.at<OD)return t.ctx;let r=await ND(n);return pT.set(n,{ctx:r,at:e}),r}async function ND(n){let e="",t="",r="",s;try{let{stdout:u}=await ae("git",["rev-parse","--show-toplevel","--git-dir","--git-common-dir","--abbrev-ref","HEAD"],{cwd:n}),[d="",p="",m="",f=""]=u.trim().split(`
1154
- `);e=d.trim(),t=p.trim(),r=m.trim(),s=f.trim()&&f.trim()!=="HEAD"?f.trim():void 0}catch{let u=await dT(n);return{workspaceId:Lt,worktreePath:u,shortId:Lt,isMain:!0,label:Km(Lt)}}let o=uT.resolve(n,t)===uT.resolve(n,r),i=await dT(e||n);if(o)return{workspaceId:Lt,worktreePath:i,shortId:Lt,branch:s,isMain:!0,label:Km(Lt,s)};let a=Ia(i),l=a.slice(0,6);return{workspaceId:a,worktreePath:i,shortId:l,branch:s,isMain:!1,label:Km(l,s)}}var Lt,pT,OD,zm=h(()=>{"use strict";Ee();Yo();Lt="main";c(dT,"safeRealpath");c(Km,"buildLabel");pT=new Map,OD=5e3;c(ds,"deriveWorkspace");c(ND,"computeWorkspace")});var Zm={};A(Zm,{completeActiveTask:()=>qm,readLastStatus:()=>wi,resolveActiveTask:()=>rr,setTaskStatus:()=>Qm,startTask:()=>Ym});async function Ym(n,e,t,r={}){let s=await er(n,"task","before",{projectPath:e,skipRules:r.skipHooks});if(!s.success)return{ok:!1,blocked:s.gatesFailed.length>0?`Blocked: ${s.gatesFailed.join(", ")}`:`Hook failed: ${s.hooksFailed.join(", ")}`};let o=/^[A-Z]+-\d+$/.test(t)?t:void 0,i=Ve(),a=r.spec,l=await ds(e),u={id:i,description:t,sessionId:Ve(),linearId:o,linkedSpecId:a};if(l.isMain?await J.startTask(n,u):await J.startTaskInWorkspace(n,{...u,branch:l.branch,workspaceId:l.workspaceId,worktreePath:l.worktreePath},l.workspaceId),a)try{let{specService:m}=await Promise.resolve().then(()=>(ol(),Um));await m.linkTask(e,a,i)}catch{}let d=await lT.ensureAuthor();await Je.log(e,"task_started",{task:t,taskId:i,timestamp:T()},d.name),await er(n,"task","after",{projectPath:e,skipRules:r.skipHooks});let p=await Za(e).catch(()=>"");return{ok:!0,taskId:i,description:t,branch:p,linearId:o,linkedSpecId:a,instructions:s.instructions}}async function Qm(n,e,t){let r=t.toLowerCase(),s=LD.includes(r),o=await ds(e);if(!o.isMain){let l=await J.getCurrentTaskForWorkspace(n,o.workspaceId);if(!l)return{ok:!1,reason:"no-active-task"};if(r==="done"||r==="completed"){let u=await wi(n,l.id);return await Je.log(e,yr,{taskId:l.id,from:u??null,to:t,workspaceId:o.workspaceId}),await J.completeTaskInWorkspace(n,o.workspaceId),{ok:!0,taskId:l.id,status:t}}return{ok:!1,reason:"unsupported",message:`'${t}' isn't supported for a worktree task yet \u2014 only 'done'. (pause/resume per-worktree is a planned follow-up)`}}if(s&&!await J.getCurrentTask(n)){let u=await J.resumeTask(n);if(u)return await Je.log(e,yr,{taskId:u.id,from:"paused",to:t}),{ok:!0,taskId:u.id,status:t}}let i=await J.getCurrentTask(n);if(!i)return{ok:!1,reason:"no-active-task"};let a=await wi(n,i.id);await Je.log(e,yr,{taskId:i.id,from:a??null,to:t});try{r==="done"||r==="completed"?await J.completeTask(n):r==="paused"||r==="pause"?await J.pauseTask(n):s&&(await J.getCurrentTask(n)||await J.resumeTask(n))}catch{}return{ok:!0,taskId:i.id,status:t}}async function rr(n,e){let t=await ds(e);return t.isMain?J.getCurrentTask(n):J.getCurrentTaskForWorkspace(n,t.workspaceId)}async function qm(n,e,t){let r=await ds(e);return r.isMain?J.completeTask(n,t):J.completeTaskInWorkspace(n,r.workspaceId,t)}async function wi(n,e){try{let{default:t}=await Promise.resolve().then(()=>(z(),Xr)),r=t.query(n,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${yr}`);for(let s of r)try{let o=JSON.parse(s.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var LD,ls=h(()=>{"use strict";Jr();Xn();ec();St();le();rc();zn();kc();zm();LD=["active","resume","in_progress","working"];c(Ym,"startTask");c(Qm,"setTaskStatus");c(rr,"resolveActiveTask");c(qm,"completeActiveTask");c(wi,"readLastStatus")});var gT={};A(gT,{buildSessionContext:()=>pl,buildSubagentDigest:()=>ef,runSessionStartHook:()=>tf});async function pl(n,e,t={}){let r=e??await j.readConfig(n);if(!r?.projectId)return null;let s=r.persona,o=t.digest?HD(r.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(GD(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn.","> For recall, run `prjct context memory [topic]` (per-turn topical memory is already injected by the prompt hook)."),o&&(s&&i.push(""),i.push(o)),i.join(`
1153
+ `);e=d.trim(),t=p.trim(),r=m.trim(),s=f.trim()&&f.trim()!=="HEAD"?f.trim():void 0}catch{let u=await dT(n);return{workspaceId:Lt,worktreePath:u,shortId:Lt,isMain:!0,label:Km(Lt)}}let o=uT.resolve(n,t)===uT.resolve(n,r),i=await dT(e||n);if(o)return{workspaceId:Lt,worktreePath:i,shortId:Lt,branch:s,isMain:!0,label:Km(Lt,s)};let a=Ia(i),l=a.slice(0,6);return{workspaceId:a,worktreePath:i,shortId:l,branch:s,isMain:!1,label:Km(l,s)}}var Lt,pT,OD,zm=h(()=>{"use strict";Ee();Yo();Lt="main";c(dT,"safeRealpath");c(Km,"buildLabel");pT=new Map,OD=5e3;c(ds,"deriveWorkspace");c(ND,"computeWorkspace")});var Zm={};A(Zm,{completeActiveTask:()=>qm,readLastStatus:()=>wi,resolveActiveTask:()=>rr,setTaskStatus:()=>Qm,startTask:()=>Ym});async function Ym(n,e,t,r={}){let s=await er(n,"task","before",{projectPath:e,skipRules:r.skipHooks});if(!s.success)return{ok:!1,blocked:s.gatesFailed.length>0?`Blocked: ${s.gatesFailed.join(", ")}`:`Hook failed: ${s.hooksFailed.join(", ")}`};let o=/^[A-Z]+-\d+$/.test(t)?t:void 0,i=Ve(),a=r.spec,l=await ds(e),u={id:i,description:t,sessionId:Ve(),linearId:o,linkedSpecId:a};if(l.isMain?await J.startTask(n,u):await J.startTaskInWorkspace(n,{...u,branch:l.branch,workspaceId:l.workspaceId,worktreePath:l.worktreePath},l.workspaceId),a)try{let{specService:m}=await Promise.resolve().then(()=>(ol(),Um));await m.linkTask(e,a,i)}catch{}let d=await lT.ensureAuthor();await Je.log(e,"task_started",{task:t,taskId:i,timestamp:T()},d.name),await er(n,"task","after",{projectPath:e,skipRules:r.skipHooks});let p=await Za(e).catch(()=>"");return{ok:!0,taskId:i,description:t,branch:p,linearId:o,linkedSpecId:a,instructions:s.instructions}}async function Qm(n,e,t){let r=t.toLowerCase(),s=LD.includes(r),o=await ds(e);if(!o.isMain){let l=await J.getCurrentTaskForWorkspace(n,o.workspaceId);if(!l)return{ok:!1,reason:"no-active-task"};if(r==="done"||r==="completed"){let u=await wi(n,l.id);return await Je.log(e,yr,{taskId:l.id,from:u??null,to:t,workspaceId:o.workspaceId}),await J.completeTaskInWorkspace(n,o.workspaceId),{ok:!0,taskId:l.id,status:t}}return{ok:!1,reason:"unsupported",message:`'${t}' isn't supported for a worktree task yet \u2014 only 'done'. (pause/resume per-worktree is a planned follow-up)`}}if(s&&!await J.getCurrentTask(n)){let u=await J.resumeTask(n);if(u)return await Je.log(e,yr,{taskId:u.id,from:"paused",to:t}),{ok:!0,taskId:u.id,status:t}}let i=await J.getCurrentTask(n);if(!i)return{ok:!1,reason:"no-active-task"};let a=await wi(n,i.id);await Je.log(e,yr,{taskId:i.id,from:a??null,to:t});try{r==="done"||r==="completed"?await J.completeTask(n):r==="paused"||r==="pause"?await J.pauseTask(n):s&&(await J.getCurrentTask(n)||await J.resumeTask(n))}catch{}return{ok:!0,taskId:i.id,status:t}}async function rr(n,e){let t=await ds(e);return t.isMain?J.getCurrentTask(n):J.getCurrentTaskForWorkspace(n,t.workspaceId)}async function qm(n,e,t){let r=await ds(e);return r.isMain?J.completeTask(n,t):J.completeTaskInWorkspace(n,r.workspaceId,t)}async function wi(n,e){try{let{default:t}=await Promise.resolve().then(()=>(z(),Xr)),r=t.query(n,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${yr}`);for(let s of r)try{let o=JSON.parse(s.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var LD,ls=h(()=>{"use strict";Jr();Xn();ec();St();le();rc();zn();kc();zm();LD=["active","resume","in_progress","working"];c(Ym,"startTask");c(Qm,"setTaskStatus");c(rr,"resolveActiveTask");c(qm,"completeActiveTask");c(wi,"readLastStatus")});var gT={};A(gT,{buildSessionContext:()=>pl,buildSubagentDigest:()=>ef,runSessionStartHook:()=>tf});async function pl(n,e,t={}){let r=e??await j.readConfig(n);if(!r?.projectId)return null;let s=r.persona,o=t.digest?HD(r.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(GD(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),o&&(s&&i.push(""),i.push(o)),i.join(`
1155
1154
  `)}function HD(n){let e=[],t=[];try{e=at.rerank(n,L.recall(n,{types:["gotcha","anti-pattern"],limit:dl*4})).slice(0,dl),t=at.rerank(n,L.recall(n,{types:["decision"],limit:dl*4})).slice(0,dl)}catch{return null}let r=fT(n,new Set([...e,...t].map(o=>o.id)));if(e.length===0&&t.length===0&&!r)return null;let s=["## What this project already knows",""];if(s.push("> Carried across sessions and model updates \u2014 this survived even if your conversation context did not."),e.length>0){s.push("","**Traps to avoid:**");for(let o of e)s.push(`- ${Fe(o)} \`${o.id}\``)}if(t.length>0){s.push("","**Decisions in force:**");for(let o of t)s.push(`- ${Fe(o)} \`${o.id}\``)}return r&&s.push("","**Keeps being missed:**",`- ${Fe(r.entry)} \`${r.entry.id}\` \u2014 flagged relevant-but-unused ${r.count}\xD7. Apply it or supersede it.`),s.push("","> Resolve any `mem_id` with `prjct search <id>`. Who the developer is lives in `developer.md` in the vault."),Fn(s.join(`
1156
1155
  `),FD)}function fT(n,e){try{let t=L.recall(n,{types:["improvement-signal"],tags:{kind:"skill-miss"},limit:50,dedupeByKey:!1}),r=new Map;for(let a of t){let l=a.tags?.relates;l&&r.set(l,(r.get(l)??0)+1)}let s=null,o=0;for(let[a,l]of r)l>o&&(s=a,o=l);if(!s||o<UD||e.has(s))return null;let i=L.getById(n,s);return i?{entry:i,count:o}:null}catch{return null}}async function ef(n){let e=await j.readConfig(n).catch(()=>null);if(!e?.projectId)return null;let t=["# prjct: subagent context"];e.persona?.role&&t.push(`Role in this project: ${e.persona.role}`);try{let{resolveActiveTask:r}=await Promise.resolve().then(()=>(ls(),Zm)),s=await r(e.projectId,n);s&&t.push(`Active task (this worktree): ${s.description}`)}catch{}try{let r=at.rerank(e.projectId,L.recall(e.projectId,{types:["gotcha","anti-pattern"],limit:mT*4})).slice(0,mT);if(r.length>0){t.push("Traps to avoid:");for(let o of r)t.push(`- ${Fe(o)} \`${o.id}\``)}let s=fT(e.projectId,new Set(r.map(o=>o.id)));s&&t.push(`Keeps being missed: ${Fe(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:Fn(t.join(`
1157
1156
  `),WD)}function GD(n){let e=[];return e.push(`## Your role in this project: **${n.role}**`),n.focus&&e.push(`Focus: ${n.focus}`),n.mcps&&n.mcps.length>0&&e.push(`Available MCPs this project expects: ${n.mcps.join(", ")}`),n.packs&&n.packs.length>0&&e.push(`Active packs: ${n.packs.join(", ")}`),e.join(`
@@ -1160,9 +1159,9 @@ Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}asyn
1160
1159
  `);return Fn(a,qD)}function af(n=process.cwd(),e){return it({event:"PreToolUse",projectPath:n,build:c(async(t,r)=>{let s=t.tool_input?.command??"";return/\bgit\s+commit\b/.test(s)?zD(r):null},"build")},e)}var qD,VD,cf=h(()=>{"use strict";ne();qt();Te();Hn();Ts();qD=1200,VD=3;c(JD,"stagedFiles");c(XD,"pathFragments");c(KD,"mentionsFragment");c(zD,"buildPreCommitContext");c(af,"runPreCommitHook")});async function uo(n,e,t){if(t.length!==0)try{let{resolveActiveTask:r}=await Promise.resolve().then(()=>(ls(),Zm)),s=await r(n,e);s?.id&&at.recordSurfaced(n,t,s.id)}catch{}}var ml=h(()=>{"use strict";Yn();c(uo,"recordSurfacedForActiveTask")});var kT={};A(kT,{runPreEditHook:()=>lf});function ZD(n){return n.type==="gotcha"?"gotcha":n.tags?.pattern==="recurring-bug"?"recurring-bug":n.type}function eM(n,e=220){let t=n.replace(/\s+/g," ").trim();return t.length>e?`${t.slice(0,e-1)}\u2026`:t}async function tM(n,e){let t=await j.readConfig(n);if(!t?.projectId)return null;let r;try{r=L.recallForFile(t.projectId,e,QD)}catch{return null}if(r.length===0)return null;uo(t.projectId,n,r.map(i=>i.id));let o=[`# prjct: heads-up before editing \`${e.split("/").pop()??e}\``,""];o.push(`${r.length} preventive memory entr${r.length===1?"y":"ies"} recorded against this file:`),o.push("");for(let i of r)o.push(`- **[${ZD(i)}] ${Fe(i)}** \u2014 ${eM(i.content)} \`${i.id}\``);return o.push(""),o.push("> Nudge, not block. Apply if it still holds; proceed if not."),Fn(o.join(`
1161
1160
  `),YD)}function lf(n=process.cwd(),e){return it({event:"PreToolUse",projectPath:n,build:c(async(t,r)=>{let s=t.tool_input?.file_path?.trim();return s?tM(r,s):null},"build")},e)}var YD,QD,uf=h(()=>{"use strict";ne();qt();Te();ml();Hn();Ts();YD=1200,QD=3;c(ZD,"labelFor");c(eM,"flatDetail");c(tM,"buildPreEditContext");c(lf,"runPreEditHook")});var vT={};A(vT,{collectActiveTasks:()=>bi,formatActiveTaskLine:()=>ST,formatActiveTaskList:()=>nM});function bT(n,e){let t=n===Lt?Lt:n.slice(0,6);return{shortId:t,label:`${t} \xB7 ${e??"(detached)"}`}}async function bi(n,e){let t=await ds(e),r=[],s=await J.getCurrentTask(n);if(s){let{shortId:i,label:a}=bT(Lt,s.branch);r.push({id:s.id,description:s.description,workspaceId:Lt,shortId:i,label:a,branch:s.branch,linearId:s.linearId,startedAt:s.startedAt,isCurrent:t.workspaceId===Lt})}for(let i of await J.getActiveTasks(n)){if(i.workspaceId===Lt)continue;let{shortId:a,label:l}=bT(i.workspaceId,i.branch);r.push({id:i.id,description:i.description,workspaceId:i.workspaceId,shortId:a,label:l,branch:i.branch,linearId:i.linearId,startedAt:i.startedAt,isCurrent:t.workspaceId===i.workspaceId})}return r.sort((i,a)=>Number(a.isCurrent)-Number(i.isCurrent)),{current:r.find(i=>i.isCurrent)??null,all:r}}function ST(n){let e=n.isCurrent?"\u2192":" ",t=n.isCurrent?" (this worktree)":"";return`${e} ${n.label} ${n.description}${t}`}function nM(n){if(n.all.length===0)return"No active task.";if(n.all.length===1&&n.current){let t=n.current;return`Active: ${t.description}
1162
1161
  Workspace: ${t.label}`}let e=[`Active tasks (${n.all.length})`];for(let t of n.all)e.push(ST(t));return e.join(`
1163
- `)}var fl=h(()=>{"use strict";St();zm();c(bT,"labelFor");c(bi,"collectActiveTasks");c(ST,"formatActiveTaskLine");c(nM,"formatActiveTaskList")});var RT={};A(RT,{_resetGitSnapshotCacheForTests:()=>aM,buildProjectState:()=>TT,buildTopicalCue:()=>CT,runPromptHook:()=>df});import rM from"node:path";async function TT(n,e){let t=e!==void 0?e:await j.readConfig(n);if(!t?.projectId)return null;let r=["# prjct: project state"],s=!1;try{let o=await bi(t.projectId,n);if(o.current){let a=ET(o.current.startedAt);r.push(`- Active task: "${o.current.description}" (${a}) [${o.current.label}]`),s=!0}let i=o.all.filter(a=>!a.isCurrent);i.length>0&&(r.push(`- ${i.length} task(s) active in other workspace(s)`),s=!0)}catch{}if(await v(rM.join(n,".git"))){let o=await cM(n);if(o.branch){let i=[];o.modified>0&&i.push(`${o.modified} modified`),o.staged>0&&i.push(`${o.staged} staged`),o.untracked>0&&i.push(`${o.untracked} untracked`);let a=i.length>0?i.join(", "):"clean",l=o.ahead>0?`, ${o.ahead} unpushed`:"";r.push(`- Branch: ${o.branch} \u2014 working tree ${a}${l}`),s=!0}}try{let o=await kt.getRecent(t.projectId,1);if(o.length>0){let i=o[0],a=ET(i.shippedAt??""),l=i.version?`v${i.version}`:i.name;r.push(`- Last ship: ${l} (${a})`),s=!0}}catch{}try{let o=L.countByType(t.projectId,"inbox");o>0&&(r.push(`- Inbox: ${o} items pending`),s=!0)}catch{}return s?r.join(`
1162
+ `)}var fl=h(()=>{"use strict";St();zm();c(bT,"labelFor");c(bi,"collectActiveTasks");c(ST,"formatActiveTaskLine");c(nM,"formatActiveTaskList")});var RT={};A(RT,{_resetGitSnapshotCacheForTests:()=>aM,buildProjectState:()=>TT,buildTopicalCue:()=>CT,runPromptHook:()=>df});import rM from"node:path";async function TT(n,e){let t=e!==void 0?e:await j.readConfig(n);if(!t?.projectId)return null;let r=["# prjct: project state"],s=!1;try{let o=await bi(t.projectId,n);if(o.current){let a=ET(o.current.startedAt);r.push(`- Active task: "${o.current.description}" (${a}) [${o.current.label}]`),s=!0}let i=o.all.filter(a=>!a.isCurrent);i.length>0&&(r.push(`- ${i.length} task(s) active in other workspace(s)`),s=!0)}catch{}if(await v(rM.join(n,".git"))){let o=await cM(n);if(o.branch){let i=[];o.modified>0&&i.push(`${o.modified} modified`),o.staged>0&&i.push(`${o.staged} staged`),o.untracked>0&&i.push(`${o.untracked} untracked`);let a=i.length>0?` \u2014 working tree ${i.join(", ")}`:"",l=o.ahead>0?`${a?",":" \u2014"} ${o.ahead} unpushed`:"";r.push(`- Branch: ${o.branch}${a}${l}`),s=!0}}try{let o=await kt.getRecent(t.projectId,1);if(o.length>0){let i=o[0],a=ET(i.shippedAt??""),l=i.version?`v${i.version}`:i.name;r.push(`- Last ship: ${l} (${a})`),s=!0}}catch{}try{let o=L.countByType(t.projectId,"inbox");o>0&&(r.push(`- Inbox: ${o} items pending`),s=!0)}catch{}return s?r.join(`
1164
1163
  `):null}function CT(n,e,t){try{let r=ey(e);if(r.length===0)return null;let o=L.searchFts(n,r,oM).find(i=>i.type==="gotcha"||i.type==="anti-pattern");return o?(t&&uo(n,t,[o.id]),`> Trap on this topic: ${Fe(o)} \`${o.id}\``):null}catch{return null}}function aM(){Si.clear()}async function cM(n){let e=Si.get(n);if(e&&e.expiresAt>Date.now())return e.snapshot;let t=await lM(n);return Si.size>32&&Si.clear(),Si.set(n,{snapshot:t,expiresAt:Date.now()+iM}),t}async function lM(n){let e={branch:"",modified:0,staged:0,untracked:0,ahead:0},t=c(async d=>{try{return(await ae("git",d,{cwd:n,timeout:2e3})).stdout.trim()}catch{return""}},"safe"),[r,s,o]=await Promise.all([t(["branch","--show-current"]),t(["status","--porcelain"]),t(["rev-list","--count","@{u}..HEAD"])]);if(!r)return e;let i=0,a=0,l=0;for(let d of s.split(`
1165
- `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?l++:(p[0]!==" "&&p[0]!=="?"&&a++,p[1]!==" "&&i++)}let u=Number.parseInt(o,10)||0;return{branch:r,modified:i,staged:a,untracked:l,ahead:u}}function ET(n){if(!n)return"unknown";let e=Date.parse(n);if(Number.isNaN(e))return"unknown";let t=Math.max(0,Math.floor((Date.now()-e)/1e3));if(t<60)return"just now";let r=Math.floor(t/60);if(r<60)return`${r}m ago`;let s=Math.floor(r/60);if(s<24)return`${s}h ago`;let o=Math.floor(s/24);return o<30?`${o}d ago`:`${Math.floor(o/30)}mo ago`}function df(n=process.cwd(),e){return it({event:"UserPromptSubmit",projectPath:n,build:c(async(t,r)=>{let s=(t.prompt??"").trim();if(!s)return null;let o=await j.readConfig(r),i=await TT(r,o);if(!i)return null;let a=o?.projectId?CT(o.projectId,s,r):null;return Fn(a?`${i}
1164
+ `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?l++:(p[0]!==" "&&p[0]!=="?"&&a++,p[1]!==" "&&i++)}let u=Number.parseInt(o,10)||0;return{branch:r,modified:i,staged:a,untracked:l,ahead:u}}function ET(n){if(!n)return"unknown";let e=Date.parse(n);if(Number.isNaN(e))return"unknown";let t=Math.max(0,Math.floor((Date.now()-e)/864e5));return t<1?"today":t<2?"yesterday":t<30?`${t}d ago`:`${Math.floor(t/30)}mo ago`}function df(n=process.cwd(),e){return it({event:"UserPromptSubmit",projectPath:n,build:c(async(t,r)=>{let s=(t.prompt??"").trim();if(!s)return null;let o=await j.readConfig(r),i=await TT(r,o);if(!i)return null;let a=o?.projectId?CT(o.projectId,s,r):null;return Fn(a?`${i}
1166
1165
 
1167
1166
  ${a}`:i,sM)},"build")},e)}var sM,oM,iM,Si,pf=h(()=>{"use strict";ne();qt();Te();fl();ml();Yr();Ee();V();Hn();Ts();sM=900,oM=8;c(TT,"buildProjectState");c(CT,"buildTopicalCue");iM=3e3,Si=new Map;c(aM,"_resetGitSnapshotCacheForTests");c(cM,"captureGit");c(lM,"captureGitUncached");c(ET,"formatRelative");c(df,"runPromptHook")});function ff(n){let e=n.trim();if(/^sk-or-/i.test(e))return{baseUrl:"https://openrouter.ai/api/v1",provider:"OpenRouter"};if(!/^sk-ant-/i.test(e)&&!/^(gsk_|gpg_)/i.test(e)){if(/^sk-/i.test(e))return{baseUrl:"https://api.openai.com/v1",provider:"OpenAI"};if(/^pa-/i.test(e))return{baseUrl:"https://api.voyageai.com/v1",provider:"Voyage"}}}function uM(n){if(!(typeof n!="string"||!n.trim()))try{let e=JSON.parse(n);if(e&&typeof e=="object"&&!Array.isArray(e)){let t={};for(let[r,s]of Object.entries(e))t[r]=String(s);return Object.keys(t).length?t:void 0}}catch{}}function ps(){let n=Rt(gf),e=Rt(hl);if(n!=="openai-compatible"||!e)return null;let t=Rt(yf),r=Rt(hf),s=Rt(kf);return{provider:"openai-compatible",baseUrl:String(Rt(gl)??mf),model:String(e),authHeader:r!=null?String(r):void 0,authScheme:t!=null?String(t):void 0,extraHeaders:uM(Rt(wf)),query:s!=null?String(s):void 0}}function bf(n){let e=ps();if(Me(gf,"openai-compatible"),n.baseUrl?.trim()?Me(gl,n.baseUrl.trim()):e||Me(gl,mf),n.model?.trim()?Me(hl,n.model.trim()):e||Me(hl,yl),n.authHeader!==void 0&&Me(hf,n.authHeader.trim()||void 0),n.authScheme!==void 0&&Me(yf,n.authScheme),n.query!==void 0&&Me(kf,n.query.trim()||void 0),n.extraHeaders!==void 0){let r=Object.keys(n.extraHeaders).length>0;Me(wf,r?JSON.stringify(n.extraHeaders):void 0)}return ps()}function Sf(){Me(gf,void 0),Me(gl,void 0),Me(hl,void 0),Me(hf,void 0),Me(yf,void 0),Me(wf,void 0),Me(kf,void 0)}var mf,yl,gf,gl,hl,hf,yf,wf,kf,vf=h(()=>{"use strict";Yi();mf="https://api.openai.com/v1",yl="text-embedding-3-small";c(ff,"detectBaseUrlFromKey");gf="embeddings.provider",gl="embeddings.baseUrl",hl="embeddings.model",hf="embeddings.authHeader",yf="embeddings.authScheme",wf="embeddings.headers",kf="embeddings.query";c(uM,"parseHeaders");c(ps,"resolveGlobalEmbeddings");c(bf,"setGlobalEmbeddings");c(Sf,"clearGlobalEmbeddings")});import vi from"node:fs";import xT from"node:path";function Ei(){return xT.join(Ct(),"config","embeddings.key")}function wl(){return process.platform==="darwin"}async function PT(){try{let{stdout:n}=await ae("security",["find-generic-password","-a",Cf,"-s",Tf,"-w"]);return n.trim()||null}catch{return null}}function AT(){try{return vi.readFileSync(Ei(),"utf-8").trim()||null}catch{return null}}async function jT(){if($r!==void 0)return $r;let n=process.env[Ef]?.trim();return n?($r=n,$r):($r=(wl()?await PT():null)??AT(),$r)}async function $T(){return process.env[Ef]?.trim()?"env":wl()&&await PT()?"keychain":AT()?"file":"none"}async function _T(n){let e=n.trim();if($r=e,wl())try{return await ae("security",["add-generic-password","-U","-a",Cf,"-s",Tf,"-w",e]),"keychain"}catch{}vi.mkdirSync(xT.dirname(Ei()),{recursive:!0}),vi.writeFileSync(Ei(),e,{mode:384});try{vi.chmodSync(Ei(),384)}catch{}return"file"}async function IT(){if($r=null,wl())try{await ae("security",["delete-generic-password","-a",Cf,"-s",Tf])}catch{}try{vi.rmSync(Ei())}catch{}}var Ef,Tf,Cf,$r,kl=h(()=>{"use strict";Lr();Ee();Ef="PRJCT_EMBEDDINGS_API_KEY",Tf="prjct-embeddings",Cf="prjct";c(Ei,"keyFilePath");c(wl,"isDarwin");c(PT,"readKeychain");c(AT,"readFileKey");c(jT,"getEmbeddingsKey");c($T,"getKeyLocation");c(_T,"setEmbeddingsKey");c(IT,"clearEmbeddingsKey")});function dM(n){let e=n?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new bl(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}function pM(n,e,t,r,s={}){let o=n.replace(/\/+$/,""),i=s.query?.trim().replace(/^\?/,""),a=`${o}/embeddings${i?`?${i}`:""}`,l={"content-type":"application/json",...s.extraHeaders??{}};if(r){let u=s.authHeader?.trim()||"authorization",d=s.authScheme??"Bearer";l[u]=d?`${d} ${r}`:r}return{url:a,init:{method:"POST",headers:l,body:JSON.stringify({model:e,input:t})}}}function gM(n){let e=2166136261;for(let t=0;t<n.length;t++)e^=n.charCodeAt(t),e=Math.imul(e,16777619);return e>>>0}function hM(n,e,t){let r=[];if(n.length<e)return r.push(n),r;for(let s=e;s<=t;s++)for(let o=0;o+s<=n.length;o++)r.push(n.slice(o,o+s));return r}function yM(n){let e=new Float64Array(Ti),t=(n.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,fM);for(let o of t){let i=hM(`<${o}>`,3,5);i.push(o);for(let a of i){let l=gM(a),u=l%Ti,d=l&65536?1:-1;e[u]+=d}}let r=0;for(let o=0;o<Ti;o++)r+=e[o]*e[o];r=Math.sqrt(r)||1;let s=new Array(Ti);for(let o=0;o<Ti;o++)s[o]=e[o]/r;return s}function Sl(n){let e=dM(n);if(e)return e;let t=ps();return t?new bl(t.baseUrl,t.model,{authHeader:t.authHeader,authScheme:t.authScheme,extraHeaders:t.extraHeaders,query:t.query}):new xf}function wM(n){return Buffer.from(new Float32Array(n).buffer)}function kM(n){let e=Uint8Array.from(n);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}function Rf(n){let e=0;for(let t=0;t<n.length;t++)e+=n[t]*n[t];return Math.sqrt(e)}function bM(n,e){let t=Math.min(n.length,e.length),r=0;for(let s=0;s<t;s++)r+=n[s]*e[s];return r}var bl,mM,Ti,fM,xf,SM,vM,DT,Ci,vl=h(()=>{"use strict";Ls();Te();z();vf();kl();vf();kl();c(dM,"resolveProvider");c(pM,"buildEmbeddingsRequest");bl=class{constructor(e,t,r={}){this.baseUrl=e;this.model=t;this.auth=r}static{c(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let t=await jT(),{url:r,init:s}=pM(this.baseUrl,this.model,e,t,this.auth),o=await fetch(r,s);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(a=>a.embedding)}},mM="local-subword-v1",Ti=256,fM=800;c(gM,"fnv1a");c(hM,"charNGrams");c(yM,"embedLocal");xf=class{static{c(this,"LocalSubwordEmbeddingProvider")}model=mM;isLocal=!0;async embed(e){return e.map(t=>yM(t))}};c(Sl,"resolveActiveProvider");c(wM,"packVector");c(kM,"unpackVector");c(Rf,"l2Norm");c(bM,"dot");SM=2e3,vM=10,DT=new Map,Ci={isEnabled(n){return!0},store(n,e,t,r,s){E.run(n,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
1168
1167
  VALUES (?, ?, ?, ?, ?, ?)
@@ -1443,7 +1442,7 @@ Nothing to show.
1443
1442
  `;let r=[];r.push(t?"# MCP denylist \u2014 this project":"# MCP servers \u2014 this project"),r.push("");let s={cloud:e.filter(i=>i.source==="cloud"),project:e.filter(i=>i.source==="project"),global:e.filter(i=>i.source==="global")},o={cloud:"Cloud (claude.ai connected apps)",project:"Project (.mcp.json)",global:"Global (~/.claude.json)"};for(let[i,a]of Object.entries(s))if(a.length!==0){r.push(`## ${o[i]}`),r.push(""),r.push("| Status | Name | Tools | Description |"),r.push("|---|---|---|---|");for(let l of a){let u=l.denied?"\u2717 denied":"\u2713 active",d=l.estimatedTools>0?`~${l.estimatedTools}`:"\u2014";r.push(`| ${u} | \`${l.name}\` | ${d} | ${l.description} |`)}r.push("")}if(!t){let i=e.filter(l=>l.denied).reduce((l,u)=>l+u.estimatedTools,0),a=e.filter(l=>!l.denied).reduce((l,u)=>l+u.estimatedTools,0);r.push(`**Estimated tools loaded:** ${a} (denied: ${i})`),r.push(""),r.push("## Toggle in this project (project-local, no global side effects)"),r.push(""),r.push("- `prjct mcp deny <name>` \u2014 silence here, keep elsewhere"),r.push("- `prjct mcp allow <name>` \u2014 re-enable here"),r.push(""),r.push("Cloud MCPs come from your claude.ai connected apps. To disable one globally, disconnect it in claude.ai settings.")}return r.join(`
1444
1443
  `)}restartHint(e){return[`Wrote: ${e}`,"","Restart Claude Code for this to take effect:"," 1. Exit this Claude Code session (Ctrl+C or close the window)"," 2. Re-run `claude` in the same directory","","The harness caches MCP config at session start \u2014 denylist edits are","only read on a fresh session."].join(`
1445
1444
  `)}}});var _g={};A(_g,{TeamCommands:()=>$g});import{exec as RN}from"node:child_process";import gs from"node:fs/promises";import ho from"node:path";import{promisify as xN}from"node:util";function jg(n){let e={required:n.required,minVersion:n.minVersion,enrolledAt:n.enrolledAt};return n.enrolledBy!==null&&(e.enrolledBy=n.enrolledBy),`${JSON.stringify(e,null,2)}
1446
- `}function PN(n,e){let t;try{t=JSON.parse(n)}catch{return null}let r=t,s={required:r.required===!0,minVersion:typeof r.minVersion=="string"?r.minVersion:"",enrolledAt:typeof r.enrolledAt=="string"?r.enrolledAt:"",enrolledBy:typeof r.enrolledBy=="string"?r.enrolledBy:e.enrolledBy};return Ka(s)}function jN(n){return[ER,"# prjct (team mode)","",`This repo is enrolled in prjct team mode (required: ${n.required}, minVersion: ${n.minVersion}, enrolled: ${n.enrolledAt}).`,"","When working in this repo:","- prjct stores project memory (decisions, learnings, gotchas, patterns) per project.","- The vault lives at `~/Documents/prjct/<slug>/_generated/`.","- Always lookup the vault before re-reading source for project context.",'- Capture substantive analysis back via `prjct remember <type> "..."` \u2014 authored in ENGLISH, whatever language the contributor speaks.',"","Don't have prjct? Install once: `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash`",`${n.required?"This repo *requires* prjct \u2014 please install before contributing.":""}`,TR].filter(e=>e!=="").join(`
1445
+ `}function PN(n,e){let t;try{t=JSON.parse(n)}catch{return null}let r=t,s={required:r.required===!0,minVersion:typeof r.minVersion=="string"?r.minVersion:"",enrolledAt:typeof r.enrolledAt=="string"?r.enrolledAt:"",enrolledBy:typeof r.enrolledBy=="string"?r.enrolledBy:e.enrolledBy};return Ka(s)}function jN(n){return[ER,"# prjct (team mode)","",`This repo is enrolled in prjct team mode (required: ${n.required}, minVersion: ${n.minVersion}, enrolled: ${n.enrolledAt}).`,"",'Lookup the vault (`~/Documents/prjct/<slug>/_generated/`) before re-reading source; capture analysis back via `prjct remember <type> "..."` \u2014 in ENGLISH, whatever language the contributor speaks.',"","Don't have prjct? Install once: `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash`",`${n.required?"This repo *requires* prjct \u2014 please install before contributing.":""}`,TR].filter(e=>e!=="").join(`
1447
1446
  `)}function $N(n,e,t,r){if(!n.trim())return`${e}
1448
1447
  `;let s=n.indexOf(t),o=n.indexOf(r);if(s>=0&&o>s){let a=n.slice(0,s),l=n.slice(o+r.length);return`${`${a}${e}${l}`.replace(/\n{3,}/g,`
1449
1448
 
@@ -1784,7 +1783,7 @@ if [ -f "$CONFIG" ]; then
1784
1783
  fi
1785
1784
  fi
1786
1785
  echo "prjct"
1787
- `;await Ne.writeFile(s,S,{mode:493})}await rP(t,s),await nP(e,t)}catch(n){F(n)||B.warn(`Status line warning: ${w(n)}`)}}async function Zl(n,e){if(!await v(n))return;let t=await Ne.readdir(n);for(let r of t)if(r.endsWith(".sh")){let s=Qe.join(n,r),o=Qe.join(e,r);await Ne.copyFile(s,o),await Ne.chmod(o,493)}}async function rP(n,e){try{if(await v(n)){if((await Ne.lstat(n)).isSymbolicLink()&&await Ne.readlink(n)===e)return;await Ne.unlink(n)}await Ne.symlink(e,n)}catch{try{await v(e)&&(await Ne.copyFile(e,n),await Ne.chmod(n,493))}catch(r){F(r)||B.warn(`Symlink fallback warning: ${r.message}`)}}}var oP=h(()=>{"use strict";N();V();It();Pe();fe();c(nP,"ensureStatusLineSettings");c(sP,"installStatusLine");c(Zl,"installStatusLineModules");c(rP,"ensureStatusLineSymlink")});var aP={};A(aP,{run:()=>iP});import{execFileSync as MF}from"node:child_process";import hn from"node:fs/promises";import $h from"node:os";import On from"node:path";import ve from"chalk";async function OF(n){let e=n.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!eP.isAvailable("npm"))return console.log(`${ve.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${ve.dim(`Install ${n.displayName} using one of:`)}`),console.log(ve.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(ve.dim(` \u2022 Use Homebrew: brew install ${n.name==="claude"?"claude":"gemini"}`)),console.log(ve.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(ve.yellow(`\u{1F4E6} ${n.displayName} not found. Installing...`)),console.log(""),MF("npm",["install","-g",e],{stdio:"inherit",timeout:qs("NPM_INSTALL")}),console.log(""),console.log(`${ve.green("\u2713")} ${n.displayName} installed successfully`),console.log(""),!0}catch(t){let r=t;return r.killed&&r.signal==="SIGTERM"?(console.log(ve.yellow(`\u26A0\uFE0F Installation timed out for ${n.displayName}`)),console.log(""),console.log(ve.dim("The npm install took too long. Try:")),console.log(ve.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(ve.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(ve.yellow(`\u26A0\uFE0F Failed to install ${n.displayName}: ${r.message}`)),console.log(""),console.log(ve.dim("Alternative installation methods:")),console.log(ve.dim(` \u2022 npm: npm install -g ${e}`)),console.log(ve.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(ve.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(ve.dim(` \u2022 brew: brew install ${n.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function iP(){let n=await qn(),e=await Ou(),t={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let i of r){let a=wt[i],l=n[i],u={provider:i,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!l.installed)if(i===e.provider)if(await OF(a))u.cliInstalled=!0,t.cliInstalled=!0;else throw new Error(`${a.displayName} installation failed`);else continue;if(i==="claude"){if(await Le.detectActiveProvider()){let p=await Le.syncCommands();p.success&&(u.commandsAdded=p.added,u.commandsUpdated=p.updated,t.commandsAdded+=p.added,t.commandsUpdated+=p.updated);let m=await Le.installGlobalConfig();m.success&&(u.configAction=m.action,t.configAction||(t.configAction=m.action)),await Le.installDocs(),await sP(),await $n.ensureReady()}}else if(i==="gemini"){await NF()&&(u.commandsAdded=1,t.commandsAdded+=1);let p=await LF();p.success&&(u.configAction=p.action)}t.providers.push(u)}if((await Wo()).installed&&(await FF()).success&&console.log(` ${ve.green("\u2713")} Antigravity skill installed`),(await Sn()).installed){if(!(await _c()).success)throw new Error("Codex skill installation failed");let a=await as({autoRepair:!0});if(!a.verified)throw new Error(a.message||"Codex p. router verification failed");console.log(` ${ve.green("\u2713")} Codex skill installed`),console.log(` ${ve.green("\u2713")} Codex p. router ready`)}await Ai.saveConfig(ee,await Le.getInstallPath(),e.provider),await UF();for(let i of t.providers)WF(i,wt[i.provider]);return t}async function NF(){try{let n=On.join($h.homedir(),".gemini","commands"),e=On.join(n,"p.toml");try{return await hn.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(n){return B.warn(`Gemini router cleanup warning: ${w(n)}`),!1}}async function LF(){try{let n=On.join($h.homedir(),".gemini"),e=On.join(n,"GEMINI.md");await hn.mkdir(n,{recursive:!0});let t=qe("global/GEMINI.md");if(!t){let l=On.join(pt,"templates","global","GEMINI.md");t=await hn.readFile(l,"utf-8")}let r="",s=!1;try{r=await hn.readFile(e,"utf-8"),s=!0}catch(l){if(F(l))s=!1;else throw l}let a=mr(s?r:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await hn.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(n){return B.warn(`Gemini config warning: ${w(n)}`),{success:!1,action:null}}}async function FF(){try{let n=On.join($h.homedir(),".gemini","antigravity","skills"),e=On.join(n,"prjct"),t=On.join(e,"SKILL.md");await hn.mkdir(e,{recursive:!0});let r=await v(t),s=qe("antigravity/SKILL.md");if(!s){let o=On.join(pt,"templates","antigravity","SKILL.md");if(!await v(o))return B.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await hn.readFile(o,"utf-8")}return await hn.writeFile(t,s,"utf-8"),{success:!0,action:r?"updated":"created"}}catch(n){return B.warn(`Antigravity skill warning: ${w(n)}`),{success:!1,action:null}}}async function UF(){try{let n=_.globalProjectsDir;if(!await v(n))return;let e=(await hn.readdir(n,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name),t=0;for(let r of e)try{let s=On.join(n,r,HF);if((await hn.readFile(s,"utf-8").catch(()=>"")).trim()===ee)continue;let i=P.getDoc(r,"project");i&&i.cliVersion!==ee&&(i.cliVersion=ee,P.setDoc(r,"project",i),t++),await hn.writeFile(s,ee,"utf-8").catch(()=>{})}catch{}t>0&&console.log(` ${ve.green("\u2713")} Updated ${t} project(s) to v${ee}`)}catch(n){F(n)||B.warn(`Migration warning: ${w(n)}`)}}function WF(n,e){if(console.log(""),n.cliInstalled?console.log(` ${ve.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ve.green("\u2713")} ${e.displayName} CLI found`),n.commandsAdded+n.commandsUpdated>0){let r=[];n.commandsAdded>0&&r.push(`${n.commandsAdded} new`),n.commandsUpdated>0&&r.push(`${n.commandsUpdated} updated`),console.log(` ${ve.green("\u2713")} Commands synced (${r.join(", ")})`)}else console.log(` ${ve.green("\u2713")} Commands up to date`);n.configAction==="created"?console.log(` ${ve.green("\u2713")} Global config created (${e.contextFile})`):n.configAction==="updated"?console.log(` ${ve.green("\u2713")} Global config updated (${e.contextFile})`):n.configAction==="appended"&&console.log(` ${ve.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var HF,GF,cP=h(()=>{"use strict";vn();to();tP();z();N();sc();V();It();Pe();Ge();so();en();xl();Go();fe();oP();c(OF,"installAICLI");c(iP,"run");c(NF,"installGeminiRouter");c(LF,"installGeminiGlobalConfig");c(FF,"installAntigravitySkill");HF=".cli-version";c(UF,"migrateProjectsCliVersion");c(WF,"showResults");GF=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");GF&&iP().catch(n=>{console.error("Setup error:",n.message),process.exit(1)})});var lP=SP((Cie,BF)=>{BF.exports={name:"prjct-cli",version:"2.44.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 zF={};import uP from"node:os";import eu from"node:path";import bs from"chalk";async function qF(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>vP(lP()));await XF(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(KF(),process.exit(0)),n&&ql(n)&&!Ue.getByName(n)){let r=Bl[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&&Ni(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=Ni(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(ci("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}=JF(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=VF(r,s);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await j.getProjectId(process.cwd()),l&&(await po.expireIfStale(l),await po.touch(l))}catch{}let d=new Mr,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(),Gl(o,y.optionSchema));else{let k={spec:c(b=>Vl(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 po.trackCommand(l,n,m)}catch{}try{await ji.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await ji.recordTiming(l,"startup_time",y)}await ji.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(ku(r)),t||g.end(),process.exit(1)}}function VF(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 ci("MISSING_PARAM",{message:`Missing required parameter: ${r}`,hint:`Usage: ${s}`})}return null}function JF(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 XF(n){let e=await qn(),t=eu.join(uP.homedir(),".claude","commands","p.md"),r=eu.join(uP.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([v(t),v(r),v(eu.join(process.cwd(),".cursor","commands","sync.md")),v(eu.join(process.cwd(),".cursor"))]),l=await Wo();console.log(Ph(n)),console.log(Ao("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?bs.dim(` (v${e.claude.version})`):"")),console.log(Ao("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?bs.dim(` (v${e.gemini.version})`):"")),console.log(Ao("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${bs.dim("(run prjct start)")}`:"")),console.log(Ao("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${bs.dim("(use /sync, /task)")}`:a?` ${bs.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
1786
+ `;await Ne.writeFile(s,S,{mode:493})}await rP(t,s),await nP(e,t)}catch(n){F(n)||B.warn(`Status line warning: ${w(n)}`)}}async function Zl(n,e){if(!await v(n))return;let t=await Ne.readdir(n);for(let r of t)if(r.endsWith(".sh")){let s=Qe.join(n,r),o=Qe.join(e,r);await Ne.copyFile(s,o),await Ne.chmod(o,493)}}async function rP(n,e){try{if(await v(n)){if((await Ne.lstat(n)).isSymbolicLink()&&await Ne.readlink(n)===e)return;await Ne.unlink(n)}await Ne.symlink(e,n)}catch{try{await v(e)&&(await Ne.copyFile(e,n),await Ne.chmod(n,493))}catch(r){F(r)||B.warn(`Symlink fallback warning: ${r.message}`)}}}var oP=h(()=>{"use strict";N();V();It();Pe();fe();c(nP,"ensureStatusLineSettings");c(sP,"installStatusLine");c(Zl,"installStatusLineModules");c(rP,"ensureStatusLineSymlink")});var aP={};A(aP,{run:()=>iP});import{execFileSync as MF}from"node:child_process";import hn from"node:fs/promises";import $h from"node:os";import On from"node:path";import ve from"chalk";async function OF(n){let e=n.name==="claude"?"@anthropic-ai/claude-code":"@google/gemini-cli";if(!eP.isAvailable("npm"))return console.log(`${ve.yellow("\u26A0\uFE0F npm is not available")}`),console.log(""),console.log(`${ve.dim(`Install ${n.displayName} using one of:`)}`),console.log(ve.dim(" \u2022 Install Node.js: https://nodejs.org")),console.log(ve.dim(` \u2022 Use Homebrew: brew install ${n.name==="claude"?"claude":"gemini"}`)),console.log(ve.dim(` \u2022 Use npx directly: npx ${e}`)),console.log(""),!1;try{return console.log(ve.yellow(`\u{1F4E6} ${n.displayName} not found. Installing...`)),console.log(""),MF("npm",["install","-g",e],{stdio:"inherit",timeout:qs("NPM_INSTALL")}),console.log(""),console.log(`${ve.green("\u2713")} ${n.displayName} installed successfully`),console.log(""),!0}catch(t){let r=t;return r.killed&&r.signal==="SIGTERM"?(console.log(ve.yellow(`\u26A0\uFE0F Installation timed out for ${n.displayName}`)),console.log(""),console.log(ve.dim("The npm install took too long. Try:")),console.log(ve.dim(" \u2022 Set PRJCT_TIMEOUT_NPM_INSTALL=300000 for 5 minutes")),console.log(ve.dim(` \u2022 Run manually: npm install -g ${e}`))):console.log(ve.yellow(`\u26A0\uFE0F Failed to install ${n.displayName}: ${r.message}`)),console.log(""),console.log(ve.dim("Alternative installation methods:")),console.log(ve.dim(` \u2022 npm: npm install -g ${e}`)),console.log(ve.dim(` \u2022 yarn: yarn global add ${e}`)),console.log(ve.dim(` \u2022 pnpm: pnpm add -g ${e}`)),console.log(ve.dim(` \u2022 brew: brew install ${n.name==="claude"?"claude":"gemini"}`)),console.log(""),!1}}async function iP(){let n=await qn(),e=await Ou(),t={provider:e.provider,providers:[],cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null},r=["claude","gemini"];for(let i of r){let a=wt[i],l=n[i],u={provider:i,cliInstalled:!1,commandsAdded:0,commandsUpdated:0,configAction:null};if(!l.installed)if(i===e.provider)if(await OF(a))u.cliInstalled=!0,t.cliInstalled=!0;else throw new Error(`${a.displayName} installation failed`);else continue;if(i==="claude"){if(await Le.detectActiveProvider()){let p=await Le.syncCommands();p.success&&(u.commandsAdded=p.added,u.commandsUpdated=p.updated,t.commandsAdded+=p.added,t.commandsUpdated+=p.updated);let m=await Le.installGlobalConfig();m.success&&(u.configAction=m.action,t.configAction||(t.configAction=m.action)),await Le.installDocs(),await sP(),await $n.ensureReady()}}else if(i==="gemini"){await NF()&&(u.commandsAdded=1,t.commandsAdded+=1);let p=await LF();p.success&&(u.configAction=p.action)}t.providers.push(u)}if((await Wo()).installed&&(await FF()).success&&console.log(` ${ve.green("\u2713")} Antigravity skill installed`),(await Sn()).installed){if(!(await _c()).success)throw new Error("Codex skill installation failed");let a=await as({autoRepair:!0});if(!a.verified)throw new Error(a.message||"Codex p. router verification failed");console.log(` ${ve.green("\u2713")} Codex skill installed`),console.log(` ${ve.green("\u2713")} Codex p. router ready`)}await Ai.saveConfig(ee,await Le.getInstallPath(),e.provider),await UF();for(let i of t.providers)WF(i,wt[i.provider]);return t}async function NF(){try{let n=On.join($h.homedir(),".gemini","commands"),e=On.join(n,"p.toml");try{return await hn.unlink(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}catch(n){return B.warn(`Gemini router cleanup warning: ${w(n)}`),!1}}async function LF(){try{let n=On.join($h.homedir(),".gemini"),e=On.join(n,"GEMINI.md");await hn.mkdir(n,{recursive:!0});let t=qe("global/GEMINI.md");if(!t){let l=On.join(pt,"templates","global","GEMINI.md");t=await hn.readFile(l,"utf-8")}let r="",s=!1;try{r=await hn.readFile(e,"utf-8"),s=!0}catch(l){if(F(l))s=!1;else throw l}let a=mr(s?r:"",t,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await hn.writeFile(e,a.content,"utf-8"),{success:!0,action:a.action}}catch(n){return B.warn(`Gemini config warning: ${w(n)}`),{success:!1,action:null}}}async function FF(){try{let n=On.join($h.homedir(),".gemini","antigravity","skills"),e=On.join(n,"prjct"),t=On.join(e,"SKILL.md");await hn.mkdir(e,{recursive:!0});let r=await v(t),s=qe("antigravity/SKILL.md");if(!s){let o=On.join(pt,"templates","antigravity","SKILL.md");if(!await v(o))return B.warn("Antigravity SKILL.md template not found"),{success:!1,action:null};s=await hn.readFile(o,"utf-8")}return await hn.writeFile(t,s,"utf-8"),{success:!0,action:r?"updated":"created"}}catch(n){return B.warn(`Antigravity skill warning: ${w(n)}`),{success:!1,action:null}}}async function UF(){try{let n=_.globalProjectsDir;if(!await v(n))return;let e=(await hn.readdir(n,{withFileTypes:!0})).filter(r=>r.isDirectory()).map(r=>r.name),t=0;for(let r of e)try{let s=On.join(n,r,HF);if((await hn.readFile(s,"utf-8").catch(()=>"")).trim()===ee)continue;let i=P.getDoc(r,"project");i&&i.cliVersion!==ee&&(i.cliVersion=ee,P.setDoc(r,"project",i),t++),await hn.writeFile(s,ee,"utf-8").catch(()=>{})}catch{}t>0&&console.log(` ${ve.green("\u2713")} Updated ${t} project(s) to v${ee}`)}catch(n){F(n)||B.warn(`Migration warning: ${w(n)}`)}}function WF(n,e){if(console.log(""),n.cliInstalled?console.log(` ${ve.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${ve.green("\u2713")} ${e.displayName} CLI found`),n.commandsAdded+n.commandsUpdated>0){let r=[];n.commandsAdded>0&&r.push(`${n.commandsAdded} new`),n.commandsUpdated>0&&r.push(`${n.commandsUpdated} updated`),console.log(` ${ve.green("\u2713")} Commands synced (${r.join(", ")})`)}else console.log(` ${ve.green("\u2713")} Commands up to date`);n.configAction==="created"?console.log(` ${ve.green("\u2713")} Global config created (${e.contextFile})`):n.configAction==="updated"?console.log(` ${ve.green("\u2713")} Global config updated (${e.contextFile})`):n.configAction==="appended"&&console.log(` ${ve.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var HF,GF,cP=h(()=>{"use strict";vn();to();tP();z();N();sc();V();It();Pe();Ge();so();en();xl();Go();fe();oP();c(OF,"installAICLI");c(iP,"run");c(NF,"installGeminiRouter");c(LF,"installGeminiGlobalConfig");c(FF,"installAntigravitySkill");HF=".cli-version";c(UF,"migrateProjectsCliVersion");c(WF,"showResults");GF=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");GF&&iP().catch(n=>{console.error("Setup error:",n.message),process.exit(1)})});var lP=SP((Cie,BF)=>{BF.exports={name:"prjct-cli",version:"2.44.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 zF={};import uP from"node:os";import eu from"node:path";import bs from"chalk";async function qF(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>vP(lP()));await XF(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(KF(),process.exit(0)),n&&ql(n)&&!Ue.getByName(n)){let r=Bl[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&&Ni(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=Ni(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(ci("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}=JF(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=VF(r,s);a&&(g.failWithHint(a),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await j.getProjectId(process.cwd()),l&&(await po.expireIfStale(l),await po.touch(l))}catch{}let d=new Mr,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(),Gl(o,y.optionSchema));else{let k={spec:c(b=>Vl(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 po.trackCommand(l,n,m)}catch{}try{await ji.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await ji.recordTiming(l,"startup_time",y)}await ji.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(ku(r)),t||g.end(),process.exit(1)}}function VF(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 ci("MISSING_PARAM",{message:`Missing required parameter: ${r}`,hint:`Usage: ${s}`})}return null}function JF(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 XF(n){let e=await qn(),t=eu.join(uP.homedir(),".claude","commands","p.md"),r=eu.join(uP.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([v(t),v(r),v(eu.join(process.cwd(),".cursor","commands","sync.md")),v(eu.join(process.cwd(),".cursor"))]),l=await Wo();console.log(Ph(n)),console.log(Ao("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?bs.dim(` (v${e.claude.version})`):"")),console.log(Ao("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?bs.dim(` (v${e.gemini.version})`):"")),console.log(Ao("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${bs.dim("(run prjct start)")}`:"")),console.log(Ao("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${bs.dim("(use /sync, /task)")}`:a?` ${bs.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
1788
1787
  ${bs.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
1789
1788
  ${bs.cyan("https://prjct.app")}
1790
1789
  `)}function KF(){console.log(`
@@ -694,7 +694,7 @@ ${ce.bold(n)}`),console.log(ce.dim("\u2500".repeat(n.length))),this)},stop(){ret
694
694
  ${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.indexOf(r)+r.length),a;return e.includes(t)&&e.includes(r)?a=e.substring(e.indexOf(t),e.indexOf(r)+r.length):a=e,{content:o+a+i,action:"updated"}}var gi=h(()=>{"use strict";c(Gr,"mergeWithMarkers")});import pn from"node:fs/promises";import mr from"node:path";async function hh(){try{let n=_.getDocsPath();await pn.mkdir(n,{recursive:!0});let e=mi("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let o=Dt(s);o&&await pn.writeFile(mr.join(n,mr.basename(s)),o,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:t}=(it(),Be(rl)),r=mr.join(t,"templates/global/docs");try{let s=await pn.readdir(r);for(let o of s)if(o.endsWith(".md")){let i=await pn.readFile(mr.join(r,o),"utf-8");await pn.writeFile(mr.join(n,o),i,"utf-8")}}catch{}return{success:!0}}catch(n){return{success:!1,error:w(n)}}}async function vl(){let n=(Ze(),Be(_t)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await pn.mkdir(e.configDir,{recursive:!0});let s=mr.join(e.configDir,e.contextFile),o=fh;if(t!=="claude"){let g=Dt(`global/${e.contextFile}`);if(g)o=g;else{let{PACKAGE_ROOT:y}=(it(),Be(rl)),C=mr.join(y,"templates","global",e.contextFile);try{o=await pn.readFile(C,"utf-8")}catch{t==="gemini"&&(o=fh.replace(/Claude/g,"Gemini"))}}}let i="",a=!1;try{i=await pn.readFile(s,"utf-8"),a=!0}catch(g){if(N(g))a=!1;else throw g}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(i.includes(l)&&i.includes(u)){let g=i.substring(0,i.indexOf(l)),y=i.substring(i.indexOf(u)+u.length);i=`${(g+y).replace(/\n{3,}/g,`
695
695
 
696
696
  `).trim()}
697
- `}let m=Gr(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await pn.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}var fh,yh=h(()=>{"use strict";pr();U();gi();fe();fh='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when any of these signs are present: `~/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.** **Author every persisted entry in ENGLISH**, whatever language the user speaks \u2014 translate the intent; one canonical language keeps retrieval sharp and token cost flat.\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(hh,"installDocs");c(vl,"installGlobalConfig")});var wh={};F(wh,{CommandInstaller:()=>Kt,default:()=>nt,getProviderPaths:()=>Tl,installGlobalConfig:()=>IR});import Mn from"node:fs/promises";import El from"node:os";import qe from"node:path";async function IR(){return vl()}function Tl(){let n=El.homedir();return{claude:{commands:qe.join(n,".claude","commands"),config:qe.join(n,".claude"),router:qe.join(n,".claude","commands","p.md")},gemini:{commands:qe.join(n,".gemini","commands"),config:qe.join(n,".gemini"),router:qe.join(n,".gemini","commands","p.toml")}}}var Kt,DR,nt,mn=h(()=>{"use strict";U();Y();yh();c(IR,"installGlobalConfig");Kt=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=El.homedir()}async ensureInit(){if(this._initialized)return;let t=await(Ze(),Be(_t)).getActiveProvider();this.commandsPath=qe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),P(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),r=await(Ze(),Be(_t)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${r.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let r=qe.join(this.commandsPath,t);try{await Mn.unlink(r),e.push(t)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:w(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let r=qe.join(this.commandsPath,t);try{await Mn.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=qe.join(this.commandsPath,"p");try{if((await Mn.stat(e).catch(()=>null))?.isDirectory())return await Mn.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return vl()}async cleanupAllLegacy(){let e=El.homedir(),t=[],r=[qe.join(e,".claude","commands","p.md"),qe.join(e,".claude","commands","p.toml"),qe.join(e,".gemini","commands","p.md"),qe.join(e,".gemini","commands","p.toml")];for(let i of r)try{await Mn.unlink(i),t.push(i)}catch{}let s=[qe.join(e,".claude","commands","p"),qe.join(e,".gemini","commands","p")];for(let i of s)try{(await Mn.stat(i).catch(()=>null))?.isDirectory()&&(await Mn.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[qe.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await Mn.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return hh()}};c(Tl,"getProviderPaths");DR=new Kt,nt=DR});import kh from"node:fs/promises";import $R from"node:path";async function vh(n){let e=$R.join(n,"AGENTS.md"),t="",r=!0;try{t=await kh.readFile(e,"utf-8")}catch(o){if(!N(o))throw new Error(`Could not read ${e}: ${w(o)}`);r=!1}let s=Gr(r?t:"",OR,bh,Sh);return r&&s.content===t?{action:"unchanged",path:e}:(await kh.writeFile(e,s.content,"utf-8"),{action:r?"updated":"created",path:e})}var bh,Sh,MR,OR,Eh=h(()=>{"use strict";gi();U();bh="<!-- prjct:routing - do not edit between markers -->",Sh="<!-- /prjct:routing - managed by prjct -->",MR='## prjct \u2014 project memory & workflow\n\nThis project uses prjct for persistent memory + workflow tracking.\nRecognize the user\'s intent and run the right verb yourself \u2014 do not\nask them to type prjct commands.\n\n- Recall before re-reading source: `prjct search "<query>"` or\n `prjct context memory <topic>` (decisions, gotchas, learnings).\n- Flow: `prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`.\n- Persist outcomes as you go: `prjct remember <decision|gotcha|learning|fact> "<text>"`\n (author entries in English), `prjct capture "<text>"` for stray thoughts.\n- Before editing a risky file: `prjct guard <file>` surfaces known traps.\n- Prefer the `prjct_*` MCP tools when available; otherwise run the CLI\n with `--md` for agent-readable output.\n\nRoutine captures auto-execute (confirm in one line); `ship` and other\ndestructive verbs surface a one-line plan and wait for a green light.',OR=`${bh}
697
+ `}let m=Gr(a?i:"",o,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await pn.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:w(s),action:"failed"}}}var fh,yh=h(()=>{"use strict";pr();U();gi();fe();fh='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when any of these signs are present: `~/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 \u2014 persist it: `prjct remember <decision|learning|gotcha|fact> "..."` or `prjct capture "<text>" --tags k:v`. **Author every entry in ENGLISH**, whatever language the user speaks. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.** The full verb map and task workflow live in the `prjct` skill.\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `~/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(hh,"installDocs");c(vl,"installGlobalConfig")});var wh={};F(wh,{CommandInstaller:()=>Kt,default:()=>nt,getProviderPaths:()=>Tl,installGlobalConfig:()=>IR});import Mn from"node:fs/promises";import El from"node:os";import qe from"node:path";async function IR(){return vl()}function Tl(){let n=El.homedir();return{claude:{commands:qe.join(n,".claude","commands"),config:qe.join(n,".claude"),router:qe.join(n,".claude","commands","p.md")},gemini:{commands:qe.join(n,".gemini","commands"),config:qe.join(n,".gemini"),router:qe.join(n,".gemini","commands","p.toml")}}}var Kt,DR,nt,mn=h(()=>{"use strict";U();Y();yh();c(IR,"installGlobalConfig");Kt=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=El.homedir()}async ensureInit(){if(this._initialized)return;let t=await(Ze(),Be(_t)).getActiveProvider();this.commandsPath=qe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),P(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),r=await(Ze(),Be(_t)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${r.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let r=qe.join(this.commandsPath,t);try{await Mn.unlink(r),e.push(t)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:w(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:w(e)}}}async checkInstallation(){return await this.detectActiveProvider()?{installed:!0,providerDetected:!0,commands:[],path:this.commandsPath}:{installed:!1,providerDetected:!1}}async getInstallPath(){return await this.ensureInit(),this.commandsPath}async syncCommands(){if(!await this.detectActiveProvider())return{success:!1,error:"AI agent not detected",added:0,updated:0,removed:0};try{return{success:!0,added:0,updated:0,removed:await this.cleanupRouter()?1:0}}catch(t){return{success:!1,error:w(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let r=qe.join(this.commandsPath,t);try{await Mn.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=qe.join(this.commandsPath,"p");try{if((await Mn.stat(e).catch(()=>null))?.isDirectory())return await Mn.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return vl()}async cleanupAllLegacy(){let e=El.homedir(),t=[],r=[qe.join(e,".claude","commands","p.md"),qe.join(e,".claude","commands","p.toml"),qe.join(e,".gemini","commands","p.md"),qe.join(e,".gemini","commands","p.toml")];for(let i of r)try{await Mn.unlink(i),t.push(i)}catch{}let s=[qe.join(e,".claude","commands","p"),qe.join(e,".gemini","commands","p")];for(let i of s)try{(await Mn.stat(i).catch(()=>null))?.isDirectory()&&(await Mn.rm(i,{recursive:!0,force:!0}),t.push(i))}catch{}let o=[qe.join(e,".prjct-cli","config","homebrew-migrated")];for(let i of o)try{await Mn.unlink(i),t.push(i)}catch{}return{cleaned:t}}async installDocs(){return hh()}};c(Tl,"getProviderPaths");DR=new Kt,nt=DR});import kh from"node:fs/promises";import $R from"node:path";async function vh(n){let e=$R.join(n,"AGENTS.md"),t="",r=!0;try{t=await kh.readFile(e,"utf-8")}catch(o){if(!N(o))throw new Error(`Could not read ${e}: ${w(o)}`);r=!1}let s=Gr(r?t:"",OR,bh,Sh);return r&&s.content===t?{action:"unchanged",path:e}:(await kh.writeFile(e,s.content,"utf-8"),{action:r?"updated":"created",path:e})}var bh,Sh,MR,OR,Eh=h(()=>{"use strict";gi();U();bh="<!-- prjct:routing - do not edit between markers -->",Sh="<!-- /prjct:routing - managed by prjct -->",MR='## prjct \u2014 project memory & workflow\n\nThis project uses prjct for persistent memory + workflow tracking.\nRecognize the user\'s intent and run the right verb yourself \u2014 do not\nask them to type prjct commands.\n\n- Recall before re-reading source: `prjct search "<query>"` or\n `prjct context memory <topic>` (decisions, gotchas, learnings).\n- Flow: `prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`.\n- Persist outcomes as you go: `prjct remember <decision|gotcha|learning|fact> "<text>"`\n (author entries in English), `prjct capture "<text>"` for stray thoughts.\n- Before editing a risky file: `prjct guard <file>` surfaces known traps.\n- Prefer the `prjct_*` MCP tools when available; otherwise run the CLI\n with `--md` for agent-readable output.\n\nRoutine captures auto-execute (confirm in one line); `ship` and other\ndestructive verbs surface a one-line plan and wait for a green light.',OR=`${bh}
698
698
  ${MR}
699
699
  ${Sh}
700
700
  `;c(vh,"writeProjectAgentsMd")});import Th from"node:fs/promises";import NR from"node:path";async function xh(n){let e=NR.join(n,"CLAUDE.md"),t="",r=!0;try{t=await Th.readFile(e,"utf-8")}catch(o){if(!N(o))throw new Error(`Could not read ${e}: ${w(o)}`);r=!1}let s=Gr(r?t:"",FR,Ch,Rh);return r&&s.content===t?{action:"unchanged",path:e}:(await Th.writeFile(e,s.content,"utf-8"),{action:r?"updated":"created",path:e})}var Ch,Rh,LR,FR,Ph=h(()=>{"use strict";gi();U();Ch="<!-- prjct:routing - do not edit between markers -->",Rh="<!-- /prjct:routing - managed by prjct -->",LR=`## prjct usage
@@ -884,10 +884,9 @@ ${e.join(" | ")}
884
884
  |--------|---------|
885
885
  ${e.map(([t,r])=>`| ${t} | \`${r}\` |`).join(`
886
886
  `)}
887
- `}function HP(n){let e=[];if(n.hasActiveTask&&e.push(`Active task: **${n.activeTaskDescription}**`),n.pausedTasks.length>0)for(let r of n.pausedTasks.slice(0,3))e.push(`Paused: ${r.description} (${r.pausedAt})`);if(n.backlogCount>0){let r=n.topBacklog.slice(0,3).map(s=>`${s.description} [${s.priority}]`).join(", ");e.push(`Backlog: ${n.backlogCount} items${r?` \u2014 ${r}`:""}`)}let t=[];return n.ideasCount>0&&t.push(`Ideas: ${n.ideasCount} pending`),n.shippedCount>0&&t.push(`Shipped: ${n.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
887
+ `}function HP(n){let e=[];return n.pausedTasks.length>0&&e.push(`Paused: ${n.pausedTasks.length}`),n.backlogCount>0&&e.push(`Backlog: ${n.backlogCount}`),n.ideasCount>0&&e.push(`Ideas: ${n.ideasCount} pending`),n.shippedCount>0&&e.push(`Shipped: ${n.shippedCount}`),e.length===0?"":`
888
888
  ## State
889
- ${e.join(`
890
- `)}
889
+ ${e.join(" | ")} \u2014 detail via \`prjct context --md\`
891
890
  `}function WP(n){return n.userPatterns.length===0?"":`
892
891
  ## User Patterns
893
892
  ${n.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
@@ -1414,7 +1413,7 @@ Nothing to show.
1414
1413
  `;let r=[];r.push(t?"# MCP denylist \u2014 this project":"# MCP servers \u2014 this project"),r.push("");let s={cloud:e.filter(i=>i.source==="cloud"),project:e.filter(i=>i.source==="project"),global:e.filter(i=>i.source==="global")},o={cloud:"Cloud (claude.ai connected apps)",project:"Project (.mcp.json)",global:"Global (~/.claude.json)"};for(let[i,a]of Object.entries(s))if(a.length!==0){r.push(`## ${o[i]}`),r.push(""),r.push("| Status | Name | Tools | Description |"),r.push("|---|---|---|---|");for(let l of a){let u=l.denied?"\u2717 denied":"\u2713 active",d=l.estimatedTools>0?`~${l.estimatedTools}`:"\u2014";r.push(`| ${u} | \`${l.name}\` | ${d} | ${l.description} |`)}r.push("")}if(!t){let i=e.filter(l=>l.denied).reduce((l,u)=>l+u.estimatedTools,0),a=e.filter(l=>!l.denied).reduce((l,u)=>l+u.estimatedTools,0);r.push(`**Estimated tools loaded:** ${a} (denied: ${i})`),r.push(""),r.push("## Toggle in this project (project-local, no global side effects)"),r.push(""),r.push("- `prjct mcp deny <name>` \u2014 silence here, keep elsewhere"),r.push("- `prjct mcp allow <name>` \u2014 re-enable here"),r.push(""),r.push("Cloud MCPs come from your claude.ai connected apps. To disable one globally, disconnect it in claude.ai settings.")}return r.join(`
1415
1414
  `)}restartHint(e){return[`Wrote: ${e}`,"","Restart Claude Code for this to take effect:"," 1. Exit this Claude Code session (Ctrl+C or close the window)"," 2. Re-run `claude` in the same directory","","The harness caches MCP config at session start \u2014 denylist edits are","only read on a fresh session."].join(`
1416
1415
  `)}}});var ym={};F(ym,{TeamCommands:()=>hm});import{exec as AI}from"node:child_process";import Rr from"node:fs/promises";import Ss from"node:path";import{promisify as _I}from"node:util";function fm(n){let e={required:n.required,minVersion:n.minVersion,enrolledAt:n.enrolledAt};return n.enrolledBy!==null&&(e.enrolledBy=n.enrolledBy),`${JSON.stringify(e,null,2)}
1417
- `}function jI(n,e){let t;try{t=JSON.parse(n)}catch{return null}let r=t,s={required:r.required===!0,minVersion:typeof r.minVersion=="string"?r.minVersion:"",enrolledAt:typeof r.enrolledAt=="string"?r.enrolledAt:"",enrolledBy:typeof r.enrolledBy=="string"?r.enrolledBy:e.enrolledBy};return na(s)}function DI(n){return[Uv,"# prjct (team mode)","",`This repo is enrolled in prjct team mode (required: ${n.required}, minVersion: ${n.minVersion}, enrolled: ${n.enrolledAt}).`,"","When working in this repo:","- prjct stores project memory (decisions, learnings, gotchas, patterns) per project.","- The vault lives at `~/Documents/prjct/<slug>/_generated/`.","- Always lookup the vault before re-reading source for project context.",'- Capture substantive analysis back via `prjct remember <type> "..."` \u2014 authored in ENGLISH, whatever language the contributor speaks.',"","Don't have prjct? Install once: `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash`",`${n.required?"This repo *requires* prjct \u2014 please install before contributing.":""}`,Hv].filter(e=>e!=="").join(`
1416
+ `}function jI(n,e){let t;try{t=JSON.parse(n)}catch{return null}let r=t,s={required:r.required===!0,minVersion:typeof r.minVersion=="string"?r.minVersion:"",enrolledAt:typeof r.enrolledAt=="string"?r.enrolledAt:"",enrolledBy:typeof r.enrolledBy=="string"?r.enrolledBy:e.enrolledBy};return na(s)}function DI(n){return[Uv,"# prjct (team mode)","",`This repo is enrolled in prjct team mode (required: ${n.required}, minVersion: ${n.minVersion}, enrolled: ${n.enrolledAt}).`,"",'Lookup the vault (`~/Documents/prjct/<slug>/_generated/`) before re-reading source; capture analysis back via `prjct remember <type> "..."` \u2014 in ENGLISH, whatever language the contributor speaks.',"","Don't have prjct? Install once: `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash`",`${n.required?"This repo *requires* prjct \u2014 please install before contributing.":""}`,Hv].filter(e=>e!=="").join(`
1418
1417
  `)}function $I(n,e,t,r){if(!n.trim())return`${e}
1419
1418
  `;let s=n.indexOf(t),o=n.indexOf(r);if(s>=0&&o>s){let a=n.slice(0,s),l=n.slice(o+r.length);return`${`${a}${e}${l}`.replace(/\n{3,}/g,`
1420
1419
 
@@ -1492,16 +1491,16 @@ ${a.length} errors:`));for(let l of a)console.log(Se.red(` - ${l}`))}return con
1492
1491
  `)}c(Om,"emit");function iD(){Om({})}c(iD,"emitEmpty");async function gE(n){try{await n()}catch{iD()}}c(gE,"safeRun");var aD=new Set(["this","that","with","from","have","your","please","would","about","there","these","those","what","when","where","which","while","will","been","were","they","them","their","que","como","cuando","donde","porque","para","pero","por","con","sin","los","las","del","una","uno","unos","unas","este","esta","esto","estos","estas","eso","esos","esas","mas","muy","todo","toda","todos","todas","sobre","entre","hasta","desde","hace","hacer","tiene","tienen","debe","deben","puede","pueden","esta","estan","ser","son","algo","ahora","aqui","bien","cada","dale"]);function fE(n,e=8){let t=ss(n.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2")).toLowerCase(),r=new Set,s=[];for(let o of t.split(/[^\p{L}\p{N}]+/u))if(!(o.length<3)&&!aD.has(o)&&!r.has(o)&&(r.add(o),s.push(o),s.length>=e))break;return s}c(fE,"extractKeywords");function cD(n){return n.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,"\uFFFD")}c(cD,"stripLoneSurrogates");function bn(n,e,t=`
1493
1492
  \u2026 [truncated]`){if(n.length<=e)return n;let r=Math.max(0,e-t.length),s=n.charCodeAt(r-1);return s>=55296&&s<=56319&&(r-=1),n.slice(0,Math.max(0,r))+t}c(bn,"safeTruncate");function Nm(n,e){if(!e)return{};let t=cD(e);return oD.has(n)?{hookSpecificOutput:{hookEventName:n,additionalContext:t}}:{systemMessage:t}}c(Nm,"buildHookOutput");async function Ye(n,e){let t=n.projectPath??process.cwd();if(e){try{let r=e.input,s=n.build?await n.build(r,t):null;e.sink(`${JSON.stringify(Nm(n.event,s))}
1494
1493
  `),n.afterEmit&&e.detachAfterEmit(()=>n.afterEmit(r,t))}catch{e.sink(`{}
1495
- `)}return}await gE(async()=>{let r=await mE(),s=n.build?await n.build(r,t):null;Om(Nm(n.event,s)),n.afterEmit&&await n.afterEmit(r,t)})}c(Ye,"runHook");ie();Hm();Pt();ye();fn();tn();it();var SD=1400,dc=3;async function Gm(n,e,t={}){let r=e??await j.readConfig(n);if(!r?.projectId)return null;let s=r.persona,o=t.digest?vD(r.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(CD(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn.","> For recall, run `prjct context memory [topic]` (per-turn topical memory is already injected by the prompt hook)."),o&&(s&&i.push(""),i.push(o)),i.join(`
1494
+ `)}return}await gE(async()=>{let r=await mE(),s=n.build?await n.build(r,t):null;Om(Nm(n.event,s)),n.afterEmit&&await n.afterEmit(r,t)})}c(Ye,"runHook");ie();Hm();Pt();ye();fn();tn();it();var SD=1400,dc=3;async function Gm(n,e,t={}){let r=e??await j.readConfig(n);if(!r?.projectId)return null;let s=r.persona,o=t.digest?vD(r.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(CD(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),o&&(s&&i.push(""),i.push(o)),i.join(`
1496
1495
  `)}c(Gm,"buildSessionContext");function vD(n){let e=[],t=[];try{e=ze.rerank(n,$.recall(n,{types:["gotcha","anti-pattern"],limit:dc*4})).slice(0,dc),t=ze.rerank(n,$.recall(n,{types:["decision"],limit:dc*4})).slice(0,dc)}catch{return null}let r=RE(n,new Set([...e,...t].map(o=>o.id)));if(e.length===0&&t.length===0&&!r)return null;let s=["## What this project already knows",""];if(s.push("> Carried across sessions and model updates \u2014 this survived even if your conversation context did not."),e.length>0){s.push("","**Traps to avoid:**");for(let o of e)s.push(`- ${Ie(o)} \`${o.id}\``)}if(t.length>0){s.push("","**Decisions in force:**");for(let o of t)s.push(`- ${Ie(o)} \`${o.id}\``)}return r&&s.push("","**Keeps being missed:**",`- ${Ie(r.entry)} \`${r.entry.id}\` \u2014 flagged relevant-but-unused ${r.count}\xD7. Apply it or supersede it.`),s.push("","> Resolve any `mem_id` with `prjct search <id>`. Who the developer is lives in `developer.md` in the vault."),bn(s.join(`
1497
1496
  `),SD)}c(vD,"buildKnowledgeDigest");var ED=2;function RE(n,e){try{let t=$.recall(n,{types:["improvement-signal"],tags:{kind:"skill-miss"},limit:50,dedupeByKey:!1}),r=new Map;for(let a of t){let l=a.tags?.relates;l&&r.set(l,(r.get(l)??0)+1)}let s=null,o=0;for(let[a,l]of r)l>o&&(s=a,o=l);if(!s||o<ED||e.has(s))return null;let i=$.getById(n,s);return i?{entry:i,count:o}:null}catch{return null}}c(RE,"findRepeatMissedEntry");var TD=500,CE=2;async function xE(n){let e=await j.readConfig(n).catch(()=>null);if(!e?.projectId)return null;let t=["# prjct: subagent context"];e.persona?.role&&t.push(`Role in this project: ${e.persona.role}`);try{let{resolveActiveTask:r}=await Promise.resolve().then(()=>(br(),qd)),s=await r(e.projectId,n);s&&t.push(`Active task (this worktree): ${s.description}`)}catch{}try{let r=ze.rerank(e.projectId,$.recall(e.projectId,{types:["gotcha","anti-pattern"],limit:CE*4})).slice(0,CE);if(r.length>0){t.push("Traps to avoid:");for(let o of r)t.push(`- ${Ie(o)} \`${o.id}\``)}let s=RE(e.projectId,new Set(r.map(o=>o.id)));s&&t.push(`Keeps being missed: ${Ie(s.entry)} \`${s.entry.id}\``)}catch{}return t.length<=1?null:bn(t.join(`
1498
1497
  `),TD)}c(xE,"buildSubagentDigest");function CD(n){let e=[];return e.push(`## Your role in this project: **${n.role}**`),n.focus&&e.push(`Focus: ${n.focus}`),n.mcps&&n.mcps.length>0&&e.push(`Available MCPs this project expects: ${n.mcps.join(", ")}`),n.packs&&n.packs.length>0&&e.push(`Active packs: ${n.packs.join(", ")}`),e.join(`
1499
1498
  `)}c(CD,"formatPersona");function PE(n=process.cwd(),e){let t=null;return Ye({event:"SessionStart",projectPath:n,build:c(async(r,s)=>{t=await j.readConfig(s).catch(()=>null);let o=r.source??"startup";return Gm(s,t,{digest:o==="startup"||o==="clear"||o==="compact"})},"build"),afterEmit:c(async(r,s)=>{t?.projectId&&await go(s,t.projectId).catch(()=>{}),Fm(Re)||await Um(Re).catch(()=>{});try{let{maybeAutoUpdate:o}=await Promise.resolve().then(()=>(TE(),EE));o(Re)}catch{}},"afterEmit")},e)}c(PE,"runSessionStartHook");function AE(n=process.cwd(),e){return Ye({event:"CwdChanged",projectPath:n,build:c(async(t,r)=>{let s=t.cwd||r;return Gm(s)},"build")},e)}c(AE,"runCwdChangedHook");ie();ln();function _E(n=process.cwd(),e){return Ye({event:"PostToolUse",projectPath:n,afterEmit:c(async(t,r)=>{let s=t.tool_input?.file_path;if(!(!s||!(await j.readConfig(r))?.projectId))try{await Oe.log(r,"post_edit",{file:s,tool:t.tool_name??"unknown"})}catch{}},"afterEmit")},e)}c(_E,"runPostEditHook");ie();Pt();ye();import{execSync as RD}from"node:child_process";var xD=1200,PD=3;function AD(n){try{return RD("git diff --cached --name-only",{cwd:n,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
1500
1499
  `).map(e=>e.trim()).filter(Boolean)}catch{return[]}}c(AD,"stagedFiles");function _D(n){let e=new Set;for(let t of n){let r=t.split("/").filter(Boolean);for(let s of r){let o=s.replace(/\.[^.]+$/,"").toLowerCase();o.length>=3&&e.add(o)}}return[...e]}c(_D,"pathFragments");function jD(n,e){let t=n.content.toLowerCase();if(e.some(r=>t.includes(r)))return!0;for(let r of Object.values(n.tags)){let s=r.toLowerCase();if(e.some(o=>s.includes(o)))return!0}return!1}c(jD,"mentionsFragment");async function ID(n){let e=await j.readConfig(n);if(!e?.projectId)return null;let t=AD(n);if(t.length===0)return null;let r=_D(t);if(r.length===0)return null;let s;try{s=$.recall(e.projectId,{types:["anti-pattern","gotcha"],limit:50})}catch{return null}let o=s.filter(l=>jD(l,r)).slice(0,PD);if(o.length===0)return null;let i=["# prjct: heads-up for this commit",""];i.push(`${o.length} anti-pattern/gotcha entr${o.length===1?"y":"ies"} match the staged files.`),i.push(""),i.push(Gn(o)),i.push(""),i.push("> Nudge, not block. Proceed if you think it still applies.");let a=i.join(`
1501
1500
  `);return bn(a,xD)}c(ID,"buildPreCommitContext");function jE(n=process.cwd(),e){return Ye({event:"PreToolUse",projectPath:n,build:c(async(t,r)=>{let s=t.tool_input?.command??"";return/\bgit\s+commit\b/.test(s)?ID(r):null},"build")},e)}c(jE,"runPreCommitHook");ie();Pt();ye();ic();var DD=1200,$D=3;function MD(n){return n.type==="gotcha"?"gotcha":n.tags?.pattern==="recurring-bug"?"recurring-bug":n.type}c(MD,"labelFor");function OD(n,e=220){let t=n.replace(/\s+/g," ").trim();return t.length>e?`${t.slice(0,e-1)}\u2026`:t}c(OD,"flatDetail");async function ND(n,e){let t=await j.readConfig(n);if(!t?.projectId)return null;let r;try{r=$.recallForFile(t.projectId,e,$D)}catch{return null}if(r.length===0)return null;vs(t.projectId,n,r.map(i=>i.id));let o=[`# prjct: heads-up before editing \`${e.split("/").pop()??e}\``,""];o.push(`${r.length} preventive memory entr${r.length===1?"y":"ies"} recorded against this file:`),o.push("");for(let i of r)o.push(`- **[${MD(i)}] ${Ie(i)}** \u2014 ${OD(i.content)} \`${i.id}\``);return o.push(""),o.push("> Nudge, not block. Apply if it still holds; proceed if not."),bn(o.join(`
1502
- `),DD)}c(ND,"buildPreEditContext");function IE(n=process.cwd(),e){return Ye({event:"PreToolUse",projectPath:n,build:c(async(t,r)=>{let s=t.tool_input?.file_path?.trim();return s?ND(r,s):null},"build")},e)}c(IE,"runPreEditHook");ie();Pt();ye();zo();ic();wr();Ce();Y();import LD from"node:path";var FD=900,UD=8;async function HD(n,e){let t=e!==void 0?e:await j.readConfig(n);if(!t?.projectId)return null;let r=["# prjct: project state"],s=!1;try{let o=await Bs(t.projectId,n);if(o.current){let a=DE(o.current.startedAt);r.push(`- Active task: "${o.current.description}" (${a}) [${o.current.label}]`),s=!0}let i=o.all.filter(a=>!a.isCurrent);i.length>0&&(r.push(`- ${i.length} task(s) active in other workspace(s)`),s=!0)}catch{}if(await P(LD.join(n,".git"))){let o=await BD(n);if(o.branch){let i=[];o.modified>0&&i.push(`${o.modified} modified`),o.staged>0&&i.push(`${o.staged} staged`),o.untracked>0&&i.push(`${o.untracked} untracked`);let a=i.length>0?i.join(", "):"clean",l=o.ahead>0?`, ${o.ahead} unpushed`:"";r.push(`- Branch: ${o.branch} \u2014 working tree ${a}${l}`),s=!0}}try{let o=await at.getRecent(t.projectId,1);if(o.length>0){let i=o[0],a=DE(i.shippedAt??""),l=i.version?`v${i.version}`:i.name;r.push(`- Last ship: ${l} (${a})`),s=!0}}catch{}try{let o=$.countByType(t.projectId,"inbox");o>0&&(r.push(`- Inbox: ${o} items pending`),s=!0)}catch{}return s?r.join(`
1501
+ `),DD)}c(ND,"buildPreEditContext");function IE(n=process.cwd(),e){return Ye({event:"PreToolUse",projectPath:n,build:c(async(t,r)=>{let s=t.tool_input?.file_path?.trim();return s?ND(r,s):null},"build")},e)}c(IE,"runPreEditHook");ie();Pt();ye();zo();ic();wr();Ce();Y();import LD from"node:path";var FD=900,UD=8;async function HD(n,e){let t=e!==void 0?e:await j.readConfig(n);if(!t?.projectId)return null;let r=["# prjct: project state"],s=!1;try{let o=await Bs(t.projectId,n);if(o.current){let a=DE(o.current.startedAt);r.push(`- Active task: "${o.current.description}" (${a}) [${o.current.label}]`),s=!0}let i=o.all.filter(a=>!a.isCurrent);i.length>0&&(r.push(`- ${i.length} task(s) active in other workspace(s)`),s=!0)}catch{}if(await P(LD.join(n,".git"))){let o=await BD(n);if(o.branch){let i=[];o.modified>0&&i.push(`${o.modified} modified`),o.staged>0&&i.push(`${o.staged} staged`),o.untracked>0&&i.push(`${o.untracked} untracked`);let a=i.length>0?` \u2014 working tree ${i.join(", ")}`:"",l=o.ahead>0?`${a?",":" \u2014"} ${o.ahead} unpushed`:"";r.push(`- Branch: ${o.branch}${a}${l}`),s=!0}}try{let o=await at.getRecent(t.projectId,1);if(o.length>0){let i=o[0],a=DE(i.shippedAt??""),l=i.version?`v${i.version}`:i.name;r.push(`- Last ship: ${l} (${a})`),s=!0}}catch{}try{let o=$.countByType(t.projectId,"inbox");o>0&&(r.push(`- Inbox: ${o} items pending`),s=!0)}catch{}return s?r.join(`
1503
1502
  `):null}c(HD,"buildProjectState");function WD(n,e,t){try{let r=fE(e);if(r.length===0)return null;let o=$.searchFts(n,r,UD).find(i=>i.type==="gotcha"||i.type==="anti-pattern");return o?(t&&vs(n,t,[o.id]),`> Trap on this topic: ${Ie(o)} \`${o.id}\``):null}catch{return null}}c(WD,"buildTopicalCue");var GD=3e3,pc=new Map;async function BD(n){let e=pc.get(n);if(e&&e.expiresAt>Date.now())return e.snapshot;let t=await VD(n);return pc.size>32&&pc.clear(),pc.set(n,{snapshot:t,expiresAt:Date.now()+GD}),t}c(BD,"captureGit");async function VD(n){let e={branch:"",modified:0,staged:0,untracked:0,ahead:0},t=c(async d=>{try{return(await ge("git",d,{cwd:n,timeout:2e3})).stdout.trim()}catch{return""}},"safe"),[r,s,o]=await Promise.all([t(["branch","--show-current"]),t(["status","--porcelain"]),t(["rev-list","--count","@{u}..HEAD"])]);if(!r)return e;let i=0,a=0,l=0;for(let d of s.split(`
1504
- `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?l++:(p[0]!==" "&&p[0]!=="?"&&a++,p[1]!==" "&&i++)}let u=Number.parseInt(o,10)||0;return{branch:r,modified:i,staged:a,untracked:l,ahead:u}}c(VD,"captureGitUncached");function DE(n){if(!n)return"unknown";let e=Date.parse(n);if(Number.isNaN(e))return"unknown";let t=Math.max(0,Math.floor((Date.now()-e)/1e3));if(t<60)return"just now";let r=Math.floor(t/60);if(r<60)return`${r}m ago`;let s=Math.floor(r/60);if(s<24)return`${s}h ago`;let o=Math.floor(s/24);return o<30?`${o}d ago`:`${Math.floor(o/30)}mo ago`}c(DE,"formatRelative");function $E(n=process.cwd(),e){return Ye({event:"UserPromptSubmit",projectPath:n,build:c(async(t,r)=>{let s=(t.prompt??"").trim();if(!s)return null;let o=await j.readConfig(r),i=await HD(r,o);if(!i)return null;let a=o?.projectId?WD(o.projectId,s,r):null;return bn(a?`${i}
1503
+ `)){if(!d)continue;let p=d.slice(0,2);p.startsWith("??")?l++:(p[0]!==" "&&p[0]!=="?"&&a++,p[1]!==" "&&i++)}let u=Number.parseInt(o,10)||0;return{branch:r,modified:i,staged:a,untracked:l,ahead:u}}c(VD,"captureGitUncached");function DE(n){if(!n)return"unknown";let e=Date.parse(n);if(Number.isNaN(e))return"unknown";let t=Math.max(0,Math.floor((Date.now()-e)/864e5));return t<1?"today":t<2?"yesterday":t<30?`${t}d ago`:`${Math.floor(t/30)}mo ago`}c(DE,"formatRelative");function $E(n=process.cwd(),e){return Ye({event:"UserPromptSubmit",projectPath:n,build:c(async(t,r)=>{let s=(t.prompt??"").trim();if(!s)return null;let o=await j.readConfig(r),i=await HD(r,o);if(!i)return null;let a=o?.projectId?WD(o.projectId,s,r):null;return bn(a?`${i}
1505
1504
 
1506
1505
  ${a}`:i,FD)},"build")},e)}c($E,"runPromptHook");ie();nc();import r0 from"node:fs/promises";ye();import qD from"node:crypto";import JD from"node:fs/promises";function Kn(n){let e=[];for(let t of n.split(`
1507
1506
  `)){let r=t.trim();if(r)try{let s=JSON.parse(r);s&&typeof s=="object"&&e.push(s)}catch{}}return e}c(Kn,"parseTranscriptJsonl");var OE="friction-detector",XD=5,ME=400,zD=[/^\s*no[,.!\s]/i,/^\s*nope\b/i,/^\s*así no\b/i,/^\s*espera\b/i,/^\s*stop\b/i,/^\s*wait\b/i,/^\s*cancel\b/i],KD=[/\bshould be\b/i,/\brather than\b/i,/\binstead\b/i,/\bmás bien\b/i,/\ben realidad\b/i],YD=[/\bdoesn'?t work\b/i,/\bno funciona\b/i,/\bbroken\b/i,/\bestá roto\b/i,/\bagain\b.*\bsame\b/i];async function NE(n,e,t,r={}){let s;if(r.preloadedLines)s=r.preloadedLines;else{let d="";try{d=await JD.readFile(e,"utf-8")}catch{return{signalsRecorded:0,signalsSkipped:0}}s=QD(d)}let o=ZD(s);if(o.length===0)return{signalsRecorded:0,signalsSkipped:0};let i=s$(n),a=LE(n)??void 0,l=0,u=0;for(let d of o.slice(0,XD)){let p=r$(d.excerpt).slice(0,12);if(i.has(p)){u++;continue}try{await $.remember(n,{type:"improvement-signal",content:n$(d),tags:{source:OE,category:d.category,...t?{session:t}:{},key:p},provenance:"extracted",projectId:a}),l++}catch{u++}}return{signalsRecorded:l,signalsSkipped:u}}c(NE,"detectFriction");function QD(n){return Kn(n)}c(QD,"parseJsonl");function ZD(n){let e=[],t="";for(let r of n){let s=r.role??r.message?.role,o=t$(r.content??r.message?.content);if(!o)continue;if(s==="assistant"){t=o;continue}if(s!=="user")continue;let i=o.slice(0,300),a=e$(i);a&&e.push({excerpt:o.slice(0,ME).trim(),category:a,precedingAssistantPreview:t.slice(0,ME).trim()})}return e}c(ZD,"extractSignals");function e$(n){return YD.some(e=>e.test(n))?"complaint":zD.some(e=>e.test(n))?"negation":KD.some(e=>e.test(n))?"correction":null}c(e$,"classify");function t$(n){return typeof n=="string"?n:Array.isArray(n)?n.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
@@ -730,7 +730,7 @@ ${Z.bold(n)}`),console.log(Z.dim("\u2500".repeat(n.length))),this)},stop(){retur
730
730
  ${e}`,action:"appended"};let i=n.substring(0,n.indexOf(t)),o=n.substring(n.indexOf(r)+r.length),a;return e.includes(t)&&e.includes(r)?a=e.substring(e.indexOf(t),e.indexOf(r)+r.length):a=e,{content:i+a+o,action:"updated"}}var ti=f(()=>{"use strict";c(qn,"mergeWithMarkers")});import Ct from"node:fs/promises";import bn from"node:path";async function bp(){try{let n=$.getDocsPath();await Ct.mkdir(n,{recursive:!0});let e=Sp("global/docs/");if(e.length>0){for(let s of e)if(s.endsWith(".md")){let i=Rt(s);i&&await Ct.writeFile(bn.join(n,bn.basename(s)),i,"utf-8")}return{success:!0}}let{PACKAGE_ROOT:t}=(Tt(),At(Ao)),r=bn.join(t,"templates/global/docs");try{let s=await Ct.readdir(r);for(let i of s)if(i.endsWith(".md")){let o=await Ct.readFile(bn.join(r,i),"utf-8");await Ct.writeFile(bn.join(n,i),o,"utf-8")}}catch{}return{success:!0}}catch(n){return{success:!1,error:x(n)}}}async function Tp(){let n=(He(),At(Lt)),e=await n.getActiveProvider(),t=e.name;if(!(await n.detectProvider(t)).installed&&!e.configDir)return{success:!1,error:`${e.displayName} not detected`,action:"skipped"};try{await Ct.mkdir(e.configDir,{recursive:!0});let s=bn.join(e.configDir,e.contextFile),i=Ep;if(t!=="claude"){let g=Rt(`global/${e.contextFile}`);if(g)i=g;else{let{PACKAGE_ROOT:h}=(Tt(),At(Ao)),R=bn.join(h,"templates","global",e.contextFile);try{i=await Ct.readFile(R,"utf-8")}catch{t==="gemini"&&(i=Ep.replace(/Claude/g,"Gemini"))}}}let o="",a=!1;try{o=await Ct.readFile(s,"utf-8"),a=!0}catch(g){if(I(g))a=!1;else throw g}let l="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",u="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(o.includes(l)&&o.includes(u)){let g=o.substring(0,o.indexOf(l)),h=o.substring(o.indexOf(u)+u.length);o=`${(g+h).replace(/\n{3,}/g,`
731
731
 
732
732
  `).trim()}
733
- `}let m=qn(a?o:"",i,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Ct.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:x(s),action:"failed"}}}var Ep,vp=f(()=>{"use strict";Fr();q();ti();Pe();Ep='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when any of these signs are present: `~/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.** **Author every persisted entry in ENGLISH**, whatever language the user speaks \u2014 translate the intent; one canonical language keeps retrieval sharp and token cost flat.\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(bp,"installDocs");c(Tp,"installGlobalConfig")});import Vt from"node:fs/promises";import xp from"node:os";import Qe from"node:path";var Ra,FS,Xt,ni=f(()=>{"use strict";q();z();vp();Ra=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=xp.homedir()}async ensureInit(){if(this._initialized)return;let t=await(He(),At(Lt)).getActiveProvider();this.commandsPath=Qe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),_(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),r=await(He(),At(Lt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${r.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let r=Qe.join(this.commandsPath,t);try{await Vt.unlink(r),e.push(t)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:x(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:x(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:x(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let r=Qe.join(this.commandsPath,t);try{await Vt.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Qe.join(this.commandsPath,"p");try{if((await Vt.stat(e).catch(()=>null))?.isDirectory())return await Vt.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Tp()}async cleanupAllLegacy(){let e=xp.homedir(),t=[],r=[Qe.join(e,".claude","commands","p.md"),Qe.join(e,".claude","commands","p.toml"),Qe.join(e,".gemini","commands","p.md"),Qe.join(e,".gemini","commands","p.toml")];for(let o of r)try{await Vt.unlink(o),t.push(o)}catch{}let s=[Qe.join(e,".claude","commands","p"),Qe.join(e,".gemini","commands","p")];for(let o of s)try{(await Vt.stat(o).catch(()=>null))?.isDirectory()&&(await Vt.rm(o,{recursive:!0,force:!0}),t.push(o))}catch{}let i=[Qe.join(e,".prjct-cli","config","homebrew-migrated")];for(let o of i)try{await Vt.unlink(o),t.push(o)}catch{}return{cleaned:t}}async installDocs(){return bp()}},FS=new Ra,Xt=FS});import Rp from"node:fs/promises";import US from"node:path";async function _p(n){let e=US.join(n,"AGENTS.md"),t="",r=!0;try{t=await Rp.readFile(e,"utf-8")}catch(i){if(!I(i))throw new Error(`Could not read ${e}: ${x(i)}`);r=!1}let s=qn(r?t:"",HS,Cp,Pp);return r&&s.content===t?{action:"unchanged",path:e}:(await Rp.writeFile(e,s.content,"utf-8"),{action:r?"updated":"created",path:e})}var Cp,Pp,WS,HS,Ap=f(()=>{"use strict";ti();q();Cp="<!-- prjct:routing - do not edit between markers -->",Pp="<!-- /prjct:routing - managed by prjct -->",WS='## prjct \u2014 project memory & workflow\n\nThis project uses prjct for persistent memory + workflow tracking.\nRecognize the user\'s intent and run the right verb yourself \u2014 do not\nask them to type prjct commands.\n\n- Recall before re-reading source: `prjct search "<query>"` or\n `prjct context memory <topic>` (decisions, gotchas, learnings).\n- Flow: `prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`.\n- Persist outcomes as you go: `prjct remember <decision|gotcha|learning|fact> "<text>"`\n (author entries in English), `prjct capture "<text>"` for stray thoughts.\n- Before editing a risky file: `prjct guard <file>` surfaces known traps.\n- Prefer the `prjct_*` MCP tools when available; otherwise run the CLI\n with `--md` for agent-readable output.\n\nRoutine captures auto-execute (confirm in one line); `ship` and other\ndestructive verbs surface a one-line plan and wait for a green light.',HS=`${Cp}
733
+ `}let m=qn(a?o:"",i,"<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->");return await Ct.writeFile(s,m.content,"utf-8"),{success:!0,action:m.action,path:s}}catch(s){return{success:!1,error:x(s),action:"failed"}}}var Ep,vp=f(()=>{"use strict";Fr();q();ti();Pe();Ep='<!-- prjct:start - DO NOT REMOVE THIS MARKER -->\n# p/ \u2014 Project knowledge layer\n\nprjct stores project memory (decisions, learnings, gotchas, patterns, ships, analyses) per project and regenerates a readable Markdown vault. **Use it \u2014 don\'t re-read source from scratch.**\n\nprjct remembers and shows the path; it does not own execution. Treat prjct output as durable signals (task state, memories, specs, workflows, risks, recent learnings). Claude, GPT, and other agents decide the concrete HOW with their own native tools and judgment, then persist meaningful outcomes back to prjct.\n\nYou are in a prjct project when any of these signs are present: `~/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 \u2014 persist it: `prjct remember <decision|learning|gotcha|fact> "..."` or `prjct capture "<text>" --tags k:v`. **Author every entry in ENGLISH**, whatever language the user speaks. **Default to capturing \u2014 under-capture is the failure mode that makes prjct useless.** The full verb map and task workflow live in the `prjct` skill.\n\n## Where things live\n\n- Source of truth: SQLite at `~/.prjct-cli/projects/<id>/` (don\'t read directly \u2014 use `prjct` CLI)\n- Read snapshot: vault at `~/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(bp,"installDocs");c(Tp,"installGlobalConfig")});import Vt from"node:fs/promises";import xp from"node:os";import Qe from"node:path";var Ra,FS,Xt,ni=f(()=>{"use strict";q();z();vp();Ra=class{static{c(this,"CommandInstaller")}homeDir;commandsPath="";configPath="";_initialized=!1;constructor(){this.homeDir=xp.homedir()}async ensureInit(){if(this._initialized)return;let t=await(He(),At(Lt)).getActiveProvider();this.commandsPath=Qe.join(t.configDir,"commands"),this.configPath=t.configDir,this._initialized=!0}async detectActiveProvider(){return await this.ensureInit(),_(this.configPath)}async installCommands(){let e=await this.detectActiveProvider(),r=await(He(),At(Lt)).getActiveProvider();return e?(await this.cleanupRouter(),{success:!0,installed:[],path:this.commandsPath}):{success:!1,error:`${r.displayName} not detected. Please install it first.`}}async uninstallCommands(){try{let e=[];await this.ensureInit();for(let t of["p.md","p.toml"]){let r=Qe.join(this.commandsPath,t);try{await Vt.unlink(r),e.push(t)}catch(s){if(s.code!=="ENOENT")return{success:!1,error:x(s)}}}return{success:!0,uninstalled:e}}catch(e){return{success:!1,error:x(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:x(t),added:0,updated:0,removed:0}}}async cleanupRouter(){await this.ensureInit();let e=!1;for(let t of["p.md","p.toml"]){let r=Qe.join(this.commandsPath,t);try{await Vt.unlink(r),e=!0}catch(s){s.code}}return e}async cleanupLegacyCommands(){await this.ensureInit();let e=Qe.join(this.commandsPath,"p");try{if((await Vt.stat(e).catch(()=>null))?.isDirectory())return await Vt.rm(e,{recursive:!0,force:!0}),!0}catch{}return!1}async installGlobalConfig(){return Tp()}async cleanupAllLegacy(){let e=xp.homedir(),t=[],r=[Qe.join(e,".claude","commands","p.md"),Qe.join(e,".claude","commands","p.toml"),Qe.join(e,".gemini","commands","p.md"),Qe.join(e,".gemini","commands","p.toml")];for(let o of r)try{await Vt.unlink(o),t.push(o)}catch{}let s=[Qe.join(e,".claude","commands","p"),Qe.join(e,".gemini","commands","p")];for(let o of s)try{(await Vt.stat(o).catch(()=>null))?.isDirectory()&&(await Vt.rm(o,{recursive:!0,force:!0}),t.push(o))}catch{}let i=[Qe.join(e,".prjct-cli","config","homebrew-migrated")];for(let o of i)try{await Vt.unlink(o),t.push(o)}catch{}return{cleaned:t}}async installDocs(){return bp()}},FS=new Ra,Xt=FS});import Rp from"node:fs/promises";import US from"node:path";async function _p(n){let e=US.join(n,"AGENTS.md"),t="",r=!0;try{t=await Rp.readFile(e,"utf-8")}catch(i){if(!I(i))throw new Error(`Could not read ${e}: ${x(i)}`);r=!1}let s=qn(r?t:"",HS,Cp,Pp);return r&&s.content===t?{action:"unchanged",path:e}:(await Rp.writeFile(e,s.content,"utf-8"),{action:r?"updated":"created",path:e})}var Cp,Pp,WS,HS,Ap=f(()=>{"use strict";ti();q();Cp="<!-- prjct:routing - do not edit between markers -->",Pp="<!-- /prjct:routing - managed by prjct -->",WS='## prjct \u2014 project memory & workflow\n\nThis project uses prjct for persistent memory + workflow tracking.\nRecognize the user\'s intent and run the right verb yourself \u2014 do not\nask them to type prjct commands.\n\n- Recall before re-reading source: `prjct search "<query>"` or\n `prjct context memory <topic>` (decisions, gotchas, learnings).\n- Flow: `prjct task "<desc>"` \u2192 work \u2192 `prjct status done` \u2192 `prjct ship`.\n- Persist outcomes as you go: `prjct remember <decision|gotcha|learning|fact> "<text>"`\n (author entries in English), `prjct capture "<text>"` for stray thoughts.\n- Before editing a risky file: `prjct guard <file>` surfaces known traps.\n- Prefer the `prjct_*` MCP tools when available; otherwise run the CLI\n with `--md` for agent-readable output.\n\nRoutine captures auto-execute (confirm in one line); `ship` and other\ndestructive verbs surface a one-line plan and wait for a green light.',HS=`${Cp}
734
734
  ${WS}
735
735
  ${Pp}
736
736
  `;c(_p,"writeProjectAgentsMd")});import jp from"node:fs/promises";import BS from"node:path";async function Np(n){let e=BS.join(n,"CLAUDE.md"),t="",r=!0;try{t=await jp.readFile(e,"utf-8")}catch(i){if(!I(i))throw new Error(`Could not read ${e}: ${x(i)}`);r=!1}let s=qn(r?t:"",VS,Dp,Ip);return r&&s.content===t?{action:"unchanged",path:e}:(await jp.writeFile(e,s.content,"utf-8"),{action:r?"updated":"created",path:e})}var Dp,Ip,GS,VS,Mp=f(()=>{"use strict";ti();q();Dp="<!-- prjct:routing - do not edit between markers -->",Ip="<!-- /prjct:routing - managed by prjct -->",GS=`## prjct usage
@@ -919,10 +919,9 @@ ${e.join(" | ")}
919
919
  |--------|---------|
920
920
  ${e.map(([t,r])=>`| ${t} | \`${r}\` |`).join(`
921
921
  `)}
922
- `}function Nb(n){let e=[];if(n.hasActiveTask&&e.push(`Active task: **${n.activeTaskDescription}**`),n.pausedTasks.length>0)for(let r of n.pausedTasks.slice(0,3))e.push(`Paused: ${r.description} (${r.pausedAt})`);if(n.backlogCount>0){let r=n.topBacklog.slice(0,3).map(s=>`${s.description} [${s.priority}]`).join(", ");e.push(`Backlog: ${n.backlogCount} items${r?` \u2014 ${r}`:""}`)}let t=[];return n.ideasCount>0&&t.push(`Ideas: ${n.ideasCount} pending`),n.shippedCount>0&&t.push(`Shipped: ${n.shippedCount}`),t.length>0&&e.push(t.join(" | ")),e.length===0?"":`
922
+ `}function Nb(n){let e=[];return n.pausedTasks.length>0&&e.push(`Paused: ${n.pausedTasks.length}`),n.backlogCount>0&&e.push(`Backlog: ${n.backlogCount}`),n.ideasCount>0&&e.push(`Ideas: ${n.ideasCount} pending`),n.shippedCount>0&&e.push(`Shipped: ${n.shippedCount}`),e.length===0?"":`
923
923
  ## State
924
- ${e.join(`
925
- `)}
924
+ ${e.join(" | ")} \u2014 detail via \`prjct context --md\`
926
925
  `}function Mb(n){return n.userPatterns.length===0?"":`
927
926
  ## User Patterns
928
927
  ${n.userPatterns.slice(0,8).map(t=>`- ${t}`).join(`
@@ -1119,7 +1118,7 @@ Open this folder as an Obsidian vault to browse project memory.
1119
1118
  | Files written | ${m.filesWritten} |
1120
1119
  | Files skipped | ${m.filesSkipped} |
1121
1120
  | Files removed | ${m.filesRemoved} |
1122
- `):console.log(JSON.stringify({success:!0,message:"Vault regenerated",...m})),{success:!0}}catch(r){return Ie(r)}}async saveLlmAnalysis(...e){return _h(...e)}async getLlmAnalysis(...e){return Ah(...e)}async stats(...e){return $h(...e)}async diff(...e){return Lh(...e)}async seal(...e){return Rf(...e)}async rollback(...e){return Cf(...e)}async verify(...e){return Pf(...e)}async semanticVerify(...e){return Mc(...e)}}});function Gh(n){return is[n]??null}var is,mW,Vh=f(()=>{"use strict";is={code:{name:"code",description:"Coding work: features, bugs, refactors, TDD, shipping.",suggestedPersona:{role:"DEV",mcps:["github"]},memoryTypes:["fact","decision","learning","gotcha","pattern","anti-pattern","shipped"],workflowSlots:{ship:{description:"Publish finished work \u2014 tests, commit, push, PR."},review:{description:"Pre-commit or pre-PR review pass."}},hookSignals:[],suggestedTags:{domain:["auth","api","frontend","infra","data"]}},daily:{name:"daily",description:"Day-to-day capture + review. GTD-style inbox + weekly review.",memoryTypes:["inbox","todo","idea"],workflowSlots:{morning:{description:"Morning briefing \u2014 pull open todos + upcoming commitments."},clarify:{description:"Reclassify inbox entries to real memory types."},review:{description:"Weekly/biweekly review across memory."}},hookSignals:[]},pm:{name:"pm",description:"Product Management: specs, user interviews, roadmap, backlog triage.",suggestedPersona:{role:"PM",mcps:["linear","posthog"]},memoryTypes:["insight","question","stakeholder","decision","source"],workflowSlots:{spec:{description:"Draft a technical/product spec from captured insights."},triage:{description:"Review Linear backlog and prioritize."},interview:{description:"User interview pre-brief + post-synthesis."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"spec|requirements?|prd",inject:["type=insight","type=question"]}],suggestedTags:{audience:["team","stakeholders"],quarter:["q1","q2","q3","q4"]}},founder:{name:"founder",description:"Founder ops: strategy, fundraising, hiring, stakeholder comms.",suggestedPersona:{role:"Founder",mcps:["gmail","linear","posthog"]},memoryTypes:["goal","okr","person","stakeholder","decision","shipped"],workflowSlots:{"investor-update":{description:"Monthly investor update draft."},"1on1":{description:"1:1 prep + synthesis."},strategy:{description:"Strategy checkpoint \u2014 OKR progress + pivots."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"investor|board|update|fundrais",inject:["type=okr","type=shipped","type=stakeholder"]}],suggestedTags:{audience:["board","investors","team"]}},research:{name:"research",description:"Research: deep-dives, literature review, competitive scans.",suggestedPersona:{role:"Research",mcps:["web"]},memoryTypes:["source","claim","question","insight"],workflowSlots:{"lit-review":{description:"Literature review across captured sources."},analyze:{description:"Data analysis run via MCP, persist findings."}},hookSignals:[],suggestedTags:{confidence:["high","medium","low"]}}},mW=Object.keys(is);c(Gh,"getPackManifest")});var Xh={};se(Xh,{activatePacks:()=>Dv,deactivatePacks:()=>Iv,detectSuggestedPacks:()=>jv,listActivePacks:()=>Nv});async function jv(n){let e=await import("node:fs/promises"),t=await import("node:path"),r=new Set(["daily"]),s=["package.json","go.mod","Cargo.toml","pyproject.toml","Gemfile","pom.xml","build.gradle"];for(let i of s)try{await e.stat(t.join(n,i)),r.add("code");break}catch{}return[...r]}async function Dv(n,e,t={}){let r=[],s=[],i=await H.readConfig(n);if(!i)throw new Error("No prjct project here \u2014 run `prjct init` first.");let o=i.persona??{role:"DEV"},a=new Set(o.packs??[]);for(let p of e){if(!is[p]){s.push(p);continue}a.has(p)||(a.add(p),r.push(p))}let l=[...a],u={...o,packs:l};t.suggestPersona&&r.length>0&&Mv(u,r);let d={...i,persona:u};return await H.writeConfig(n,d),{activated:r,skipped:s}}async function Iv(n,e){let t=await H.readConfig(n);if(!t)throw new Error("No prjct project here \u2014 run `prjct init` first.");let r=t.persona??{role:"DEV"},s=new Set(r.packs??[]),i=[],o=[];for(let u of e)s.delete(u)?i.push(u):o.push(u);let a={...r,packs:[...s]},l={...t,persona:a};return await H.writeConfig(n,l),{deactivated:i,notActive:o}}async function Nv(n){let t=(await H.readConfig(n))?.persona?.packs??[],r=[];for(let s of t){let i=is[s];i&&r.push({name:i.name,description:i.description,memoryTypes:i.memoryTypes,slots:Object.keys(i.workflowSlots)})}return r}function Mv(n,e){let t=n.role&&n.role!=="DEV",r=n.mcps&&n.mcps.length>0;for(let s of e){let i=Gh(s);if(i?.suggestedPersona&&(!t&&i.suggestedPersona.role&&(n.role=i.suggestedPersona.role),!n.focus&&i.suggestedPersona.focus&&(n.focus=i.suggestedPersona.focus),!r&&i.suggestedPersona.mcps&&(n.mcps=[...i.suggestedPersona.mcps]),n.role&&n.role!=="DEV"))break}}var qh=f(()=>{"use strict";Ee();Vh();c(jv,"detectSuggestedPacks");c(Dv,"activatePacks");c(Iv,"deactivatePacks");c(Nv,"listActivePacks");c(Mv,"applyPersonaSuggestion")});var zh={};se(zh,{inferSpecContext:()=>Lv,warnNoContextMatch:()=>Wv});async function Lv(n,e,t){let[r,s]=await Promise.all([Ws(n,t,{maxFiles:Jh*4,minScore:$v}).catch(()=>({files:[]})),Promise.resolve(ie.recall(e,{topic:n,limit:Ov})).catch(()=>[])]),i=Fv(r.files.map(l=>l.path),Jh);return i.length===0&&s.length===0?{notesBlock:"",paths:[],memoryHits:0,empty:!0}:{notesBlock:Uv(n,i,s),paths:i,memoryHits:s.length,empty:!1}}function Fv(n,e){let t=new Set,r=[];for(let s of n){let i=s.split("/").slice(0,2).join("/");if(!t.has(i)&&(t.add(i),r.push(s),r.length>=e))break}return r}function Uv(n,e,t){let r=[];if(r.push("<!-- auto-context:tentative -->"),r.push("## Existing context (auto-inferred)"),r.push(""),r.push(`_Inferred from title "${n}". Validate before audit \u2014 entries tagged tentative._`),r.push(""),e.length>0){r.push("### Likely paths");for(let s of e)r.push(`- \`${s}\``);r.push("")}if(t.length>0){r.push("### Relevant prior memory");for(let s of t){let i=s.content.length>140?`${s.content.slice(0,137)}\u2026`:s.content,o=Object.entries(s.tags).map(([a,l])=>`${a}:${l}`).join(" ");r.push(`- **${s.type}**${o?` _(${o})_`:""} \u2014 ${i}`)}r.push("")}return r.push("<!-- /auto-context -->"),r.join(`
1121
+ `):console.log(JSON.stringify({success:!0,message:"Vault regenerated",...m})),{success:!0}}catch(r){return Ie(r)}}async saveLlmAnalysis(...e){return _h(...e)}async getLlmAnalysis(...e){return Ah(...e)}async stats(...e){return $h(...e)}async diff(...e){return Lh(...e)}async seal(...e){return Rf(...e)}async rollback(...e){return Cf(...e)}async verify(...e){return Pf(...e)}async semanticVerify(...e){return Mc(...e)}}});function Gh(n){return is[n]??null}var is,m1,Vh=f(()=>{"use strict";is={code:{name:"code",description:"Coding work: features, bugs, refactors, TDD, shipping.",suggestedPersona:{role:"DEV",mcps:["github"]},memoryTypes:["fact","decision","learning","gotcha","pattern","anti-pattern","shipped"],workflowSlots:{ship:{description:"Publish finished work \u2014 tests, commit, push, PR."},review:{description:"Pre-commit or pre-PR review pass."}},hookSignals:[],suggestedTags:{domain:["auth","api","frontend","infra","data"]}},daily:{name:"daily",description:"Day-to-day capture + review. GTD-style inbox + weekly review.",memoryTypes:["inbox","todo","idea"],workflowSlots:{morning:{description:"Morning briefing \u2014 pull open todos + upcoming commitments."},clarify:{description:"Reclassify inbox entries to real memory types."},review:{description:"Weekly/biweekly review across memory."}},hookSignals:[]},pm:{name:"pm",description:"Product Management: specs, user interviews, roadmap, backlog triage.",suggestedPersona:{role:"PM",mcps:["linear","posthog"]},memoryTypes:["insight","question","stakeholder","decision","source"],workflowSlots:{spec:{description:"Draft a technical/product spec from captured insights."},triage:{description:"Review Linear backlog and prioritize."},interview:{description:"User interview pre-brief + post-synthesis."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"spec|requirements?|prd",inject:["type=insight","type=question"]}],suggestedTags:{audience:["team","stakeholders"],quarter:["q1","q2","q3","q4"]}},founder:{name:"founder",description:"Founder ops: strategy, fundraising, hiring, stakeholder comms.",suggestedPersona:{role:"Founder",mcps:["gmail","linear","posthog"]},memoryTypes:["goal","okr","person","stakeholder","decision","shipped"],workflowSlots:{"investor-update":{description:"Monthly investor update draft."},"1on1":{description:"1:1 prep + synthesis."},strategy:{description:"Strategy checkpoint \u2014 OKR progress + pivots."}},hookSignals:[{event:"UserPromptSubmit",ifMatches:"investor|board|update|fundrais",inject:["type=okr","type=shipped","type=stakeholder"]}],suggestedTags:{audience:["board","investors","team"]}},research:{name:"research",description:"Research: deep-dives, literature review, competitive scans.",suggestedPersona:{role:"Research",mcps:["web"]},memoryTypes:["source","claim","question","insight"],workflowSlots:{"lit-review":{description:"Literature review across captured sources."},analyze:{description:"Data analysis run via MCP, persist findings."}},hookSignals:[],suggestedTags:{confidence:["high","medium","low"]}}},m1=Object.keys(is);c(Gh,"getPackManifest")});var Xh={};se(Xh,{activatePacks:()=>Dv,deactivatePacks:()=>Iv,detectSuggestedPacks:()=>jv,listActivePacks:()=>Nv});async function jv(n){let e=await import("node:fs/promises"),t=await import("node:path"),r=new Set(["daily"]),s=["package.json","go.mod","Cargo.toml","pyproject.toml","Gemfile","pom.xml","build.gradle"];for(let i of s)try{await e.stat(t.join(n,i)),r.add("code");break}catch{}return[...r]}async function Dv(n,e,t={}){let r=[],s=[],i=await H.readConfig(n);if(!i)throw new Error("No prjct project here \u2014 run `prjct init` first.");let o=i.persona??{role:"DEV"},a=new Set(o.packs??[]);for(let p of e){if(!is[p]){s.push(p);continue}a.has(p)||(a.add(p),r.push(p))}let l=[...a],u={...o,packs:l};t.suggestPersona&&r.length>0&&Mv(u,r);let d={...i,persona:u};return await H.writeConfig(n,d),{activated:r,skipped:s}}async function Iv(n,e){let t=await H.readConfig(n);if(!t)throw new Error("No prjct project here \u2014 run `prjct init` first.");let r=t.persona??{role:"DEV"},s=new Set(r.packs??[]),i=[],o=[];for(let u of e)s.delete(u)?i.push(u):o.push(u);let a={...r,packs:[...s]},l={...t,persona:a};return await H.writeConfig(n,l),{deactivated:i,notActive:o}}async function Nv(n){let t=(await H.readConfig(n))?.persona?.packs??[],r=[];for(let s of t){let i=is[s];i&&r.push({name:i.name,description:i.description,memoryTypes:i.memoryTypes,slots:Object.keys(i.workflowSlots)})}return r}function Mv(n,e){let t=n.role&&n.role!=="DEV",r=n.mcps&&n.mcps.length>0;for(let s of e){let i=Gh(s);if(i?.suggestedPersona&&(!t&&i.suggestedPersona.role&&(n.role=i.suggestedPersona.role),!n.focus&&i.suggestedPersona.focus&&(n.focus=i.suggestedPersona.focus),!r&&i.suggestedPersona.mcps&&(n.mcps=[...i.suggestedPersona.mcps]),n.role&&n.role!=="DEV"))break}}var qh=f(()=>{"use strict";Ee();Vh();c(jv,"detectSuggestedPacks");c(Dv,"activatePacks");c(Iv,"deactivatePacks");c(Nv,"listActivePacks");c(Mv,"applyPersonaSuggestion")});var zh={};se(zh,{inferSpecContext:()=>Lv,warnNoContextMatch:()=>Wv});async function Lv(n,e,t){let[r,s]=await Promise.all([Ws(n,t,{maxFiles:Jh*4,minScore:$v}).catch(()=>({files:[]})),Promise.resolve(ie.recall(e,{topic:n,limit:Ov})).catch(()=>[])]),i=Fv(r.files.map(l=>l.path),Jh);return i.length===0&&s.length===0?{notesBlock:"",paths:[],memoryHits:0,empty:!0}:{notesBlock:Uv(n,i,s),paths:i,memoryHits:s.length,empty:!1}}function Fv(n,e){let t=new Set,r=[];for(let s of n){let i=s.split("/").slice(0,2).join("/");if(!t.has(i)&&(t.add(i),r.push(s),r.length>=e))break}return r}function Uv(n,e,t){let r=[];if(r.push("<!-- auto-context:tentative -->"),r.push("## Existing context (auto-inferred)"),r.push(""),r.push(`_Inferred from title "${n}". Validate before audit \u2014 entries tagged tentative._`),r.push(""),e.length>0){r.push("### Likely paths");for(let s of e)r.push(`- \`${s}\``);r.push("")}if(t.length>0){r.push("### Relevant prior memory");for(let s of t){let i=s.content.length>140?`${s.content.slice(0,137)}\u2026`:s.content,o=Object.entries(s.tags).map(([a,l])=>`${a}:${l}`).join(" ");r.push(`- **${s.type}**${o?` _(${o})_`:""} \u2014 ${i}`)}r.push("")}return r.push("<!-- /auto-context -->"),r.join(`
1123
1122
  `)}function Wv(n,e){let t={level:"warn",code:"no_context_match",message:`No codebase or memory context matched "${n}"`,suggestion:e??"Fill spec.notes manually or run with `--skip-context` next time."};process.stderr.write(`${JSON.stringify(t)}
1124
1123
  `)}var Jh,Ov,$v,Kh=f(()=>{"use strict";ze();Jo();Jh=5,Ov=8,$v=.15;c(Lv,"inferSpecContext");c(Fv,"dedupeTopDirs");c(Uv,"buildNotesBlock");c(Wv,"warnNoContextMatch")});var Yh={};se(Yh,{breakdownSpecToTasks:()=>Hv});async function Hv(n,e,t){let r=t.content.acceptance_criteria;if(r.length===0)return{taskIds:[],skippedReason:"no_acceptance_criteria"};if(t.content.tasks_created_at!==null)return{taskIds:[],skippedReason:"already_broken_down"};let s=!1;if(t.content.linked_tasks.length>0){s=!0,await tt.deleteByFeatureId(n,t.id);let a={...t.content,linked_tasks:[]};ue.updateContent(n,t.id,a)}let i=await tt.addTasks(n,r.map(a=>({description:Bv(a),body:a,priority:"medium",type:"feature",section:"backlog",featureId:t.id,groupId:t.id,groupName:t.title})));for(let a of i)ue.linkTask(n,t.id,a.id);let o=ue.get(n,t.id);if(o){let a={...o.content,tasks_created_at:w()};ue.updateContent(n,t.id,a)}return await ie.remember(e,{type:"spec",content:`Auto-breakdown: ${i.length} tasks created from ${t.title}${s?" (recovered from partial)":""}`,tags:{spec_id:t.id,event:"auto_breakdown",task_count:String(i.length),...s?{recovered:"partial"}:{}},source:t.id}),{taskIds:i.map(a=>a.id),...s?{recoveredFromPartial:!0}:{}}}function Bv(n){let e=n.replace(/\s+/g," ").trim();return e.length<=140?e:`${e.slice(0,137)}\u2026`}var Qh=f(()=>{"use strict";ze();er();ss();Q();c(Hv,"breakdownSpecToTasks");c(Bv,"truncateForDescription")});var al={};se(al,{specService:()=>Et});async function Gv(n){try{let{stdout:e}=await me("git",["rev-parse","HEAD"],{cwd:n}),t=e.trim();return/^[0-9a-f]{7,40}$/.test(t)?t:null}catch{return null}}var ol,Et,Qi=f(()=>{"use strict";Ee();ze();ss();ns();Q();ye();c(Gv,"readGitHead");ol=class{static{c(this,"SpecService")}async create(e,t){let r=await this.requireProjectId(e),s=t.content.notes??"";if(t.autoContext!==!1&&!s.trim()){let{inferSpecContext:l,warnNoContextMatch:u}=await Promise.resolve().then(()=>(Kh(),zh)),d=await l(t.title,r,e);d.empty?u(t.title):s=d.notesBlock}let o=_t.parse({goal:t.content.goal,eli10:t.content.eli10??"",stakes:t.content.stakes??"",acceptance_criteria:t.content.acceptance_criteria??[],scope:t.content.scope??[],out_of_scope:t.content.out_of_scope??[],risks:t.content.risks??[],test_plan:t.content.test_plan??[],reviews:t.content.reviews,linked_tasks:t.content.linked_tasks??[],notes:s}),a=ue.create(r,{title:t.title,content:o,tags:t.tags});return await ie.remember(e,{type:"spec",content:`${a.title}
1125
1124
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.44.0",
3
+ "version": "2.44.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": {