prjct-cli 2.19.3 → 2.19.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.19.5] - 2026-05-13
4
+
5
+ ### Added
6
+ - current work
7
+
8
+ ## [2.19.4] - 2026-05-11
9
+
10
+ ### Bug Fixes
11
+
12
+ - Stop `prjct ship` from creating two release commits per invocation. Root cause: the production CLI shim emitted by `generateDaemonShim()` in `scripts/build.js` had a 5s timeout and unconditionally called `fallback()` on timeout/error/close — re-importing `prjct-core.mjs` in-process while the daemon kept running. For any daemon-routed command that took longer than 5s (notably `ship`, whose push step alone is ~10s), the in-process fallback ran a second copy that saw the daemon's first commit at HEAD, bumped the version again, and produced a duplicate release commit. Sync the shim's fallback policy with the hardening from commit d08727b8 (May 1): timeout = 30s, refuse to re-execute on anything except `ECONNREFUSED`/`ENOENT`. Adds 4 regression tests in `core/__tests__/infrastructure/daemon-shim-sync.test.ts` that fail if the shim's policy drifts from the source again.
13
+
3
14
  ## [2.19.3] - 2026-05-11
4
15
 
5
16
  ### Features
@@ -1583,7 +1583,7 @@ ${Y.yellow(`Command '${n}' not found.`)}
1583
1583
 
1584
1584
  Run 'prjct help' to see all available commands.
1585
1585
  `}function J0(){let n=[];n.push(""),n.push(Y.cyan.bold("All Commands")),n.push("");let e=Object.entries(eo).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let r=$s.filter(o=>o.group===t);if(r.length!==0){n.push(`${Y.bold(s.title)} ${Y.dim(`(${r.length} commands)`)}`),n.push(Y.dim(s.description)),n.push("");for(let o of r){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;n.push(` ${i} ${a}`)}n.push("")}}return n.push(Y.dim("Run 'prjct help <command>' for detailed help on a specific command.")),n.push(""),n.join(`
1586
- `)}function X0(n){return n?n==="commands"||n==="all"?J0():q0(n):G0()}var _S,W0,MS=h(()=>{"use strict";Yo();Ne();_S=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],W0=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];c(G0,"formatMainHelp");c(B0,"formatTerminalCommandHelp");c(V0,"formatAgentCommandHelp");c(q0,"formatCommandHelp");c(J0,"formatCommandList");c(X0,"getHelp")});var NS=qS((R6,z0)=>{z0.exports={name:"prjct-cli",version:"2.19.3",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0","better-sqlite3":"12.9.0",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/better-sqlite3":"7.6.13","@types/bun":"latest","@types/chokidar":"2.1.7",esbuild:"0.25.0",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.22.2"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var sI={};import LS from"node:os";import ic from"node:path";import De from"chalk";async function K0(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let s=await Promise.resolve().then(()=>JS(NS()));await eI(s.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(tI(),process.exit(0)),n&&Ya(n)&&!at.getByName(n)){let s=Ka[n];s&&(f.failWithHint({message:`'prjct ${n}' was removed in v2. ${s.note}`,hint:`Use: ${s.replacement}`}),process.exit(1))}if(n&&!at.getByName(n)&&!(e.length===0&&Wo(n)!==null)){let r=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[r,...o]}let t=e.includes("--md");t||f.start();try{let s=at.getByName(n);if(!s){let m=Wo(n),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(po("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:r,options:o}=Z0(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=Q0(s,r);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let l=null,u=Date.now();try{l=await I.getProjectId(process.cwd()),l&&(await nr.expireIfStale(l),await nr.touch(l))}catch{}let d=new sn,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update")p=await d.update(o);else{let m=r.join(" ")||null,g=o.md===!0,R={task:c(y=>d.task(y,process.cwd(),{md:g,spec:o.spec?String(o.spec):void 0}),"task"),spec:c(y=>Y0(d,y,o),"spec"),"audit-spec":c(y=>y?d.specAudit(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(y=>d.init({idea:y,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(y=>d.ship(y,process.cwd(),{md:g,noSpecGate:o["no-spec-gate"]===!0}),"ship"),workflow:c(y=>d.workflowPrefs(y,process.cwd(),{md:g}),"workflow"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(y=>y?d.saveLlmAnalysis(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:g}),"regen"),start:c(()=>d.start(),"start"),context:c(y=>d.context(y),"context"),status:c(y=>d.status(y,process.cwd(),{md:g}),"status"),tag:c(y=>d.tag(y,process.cwd(),{md:g}),"tag"),remember:c(y=>d.remember(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0}),"remember"),login:c(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(y=>d.auth(y,{md:g}),"auth"),seed:c(y=>d.seed(y,process.cwd(),{md:g}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:g}),"install"),capture:c(y=>d.capture(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture"),mcp:c(y=>d.mcp(y,process.cwd(),{md:g}),"mcp")}[n];if(R)p=await R(m);else throw new Error(`Command '${n}' has no handler`)}if(l){let m=Date.now()-u;try{await nr.trackCommand(l,n,m)}catch{}try{await mo.recordTiming(l,"command_duration",m,{command:n});let g=globalThis.__perfStartNs;if(g){let v=Number(process.hrtime.bigint()-g)/1e6;await mo.recordTiming(l,"startup_time",v)}await mo.recordMemory(l,{command:n})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(hc(s)),t||f.end(),process.exit(1)}}async function Y0(n,e,t){let s=t.md===!0,r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0],i=r.slice(1).join(" ")||null,a=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","inventory"]);if(o&&new Set(["draft","new","create"]).has(o))return n.spec(i,process.cwd(),{md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!o||!a.has(o))return n.spec(e,process.cwd(),{md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});let u=process.cwd();switch(o){case"list":return n.specList(u,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,u,{md:s});case"update":return n.specUpdate(i,u,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,u,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,u,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,u,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,u,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,u,{md:s});case"inventory":return n.specInventory(u,{md:s,json:t.json===!0});default:return{success:!1,message:`unknown spec subverb: ${o}`}}}function Q0(n,e){if(!n.params)return null;let t=n.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),r=n.usage.terminal||`prjct ${n.name} ${n.params}`;return po("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${r}`})}return null}function Z0(n,e){let t=[],s={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?s[i]=e[++r]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function eI(n){let e=await ys(),t=ic.join(LS.homedir(),".claude","commands","p.md"),s=ic.join(LS.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([T(t),T(s),T(ic.join(process.cwd(),".cursor","commands","sync.md")),T(ic.join(process.cwd(),".cursor"))]),l=await io();if(console.log(`
1586
+ `)}function X0(n){return n?n==="commands"||n==="all"?J0():q0(n):G0()}var _S,W0,MS=h(()=>{"use strict";Yo();Ne();_S=[{name:"start",description:"First-time setup wizard",example:"prjct start"},{name:"init",description:"Initialize project in current directory",example:"prjct init"},{name:"sync",description:"Sync project state and update context files",example:"prjct sync"},{name:"watch",description:"Auto-sync on file changes",example:"prjct watch",options:["--verbose","--debounce=<ms>","--interval=<sec>"]},{name:"hooks",description:"Manage git hooks for auto-sync",example:"prjct hooks install",subcommands:["install","uninstall","status"]},{name:"doctor",description:"Check system health and dependencies",example:"prjct doctor"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"stop",description:"Stop the background daemon",example:"prjct stop",options:["--force"]},{name:"restart",description:"Restart the background daemon",example:"prjct restart"},{name:"uninstall",description:"Complete system removal of prjct",example:"prjct uninstall --backup",options:["--force","--backup","--dry-run","--keep-package"]}],W0=[{flag:"-q, --quiet",description:"Suppress all output (errors to stderr only)"},{flag:"-v, --version",description:"Show version and provider status"},{flag:"-h, --help",description:"Show this help message"}];c(G0,"formatMainHelp");c(B0,"formatTerminalCommandHelp");c(V0,"formatAgentCommandHelp");c(q0,"formatCommandHelp");c(J0,"formatCommandList");c(X0,"getHelp")});var NS=qS((R6,z0)=>{z0.exports={name:"prjct-cli",version:"2.19.5",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0","better-sqlite3":"12.9.0",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:">=4.12.18","ip-address":">=10.1.1"},devDependencies:{"@biomejs/biome":"2.3.13","@types/better-sqlite3":"7.6.13","@types/bun":"latest","@types/chokidar":"2.1.7",esbuild:"0.25.0",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.22.2"},files:["assets/","bin/prjct","dist/","templates/","scripts/postinstall.js","scripts/ensure-bun.sh","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk"]}});var sI={};import LS from"node:os";import ic from"node:path";import De from"chalk";async function K0(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let s=await Promise.resolve().then(()=>JS(NS()));await eI(s.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(tI(),process.exit(0)),n&&Ya(n)&&!at.getByName(n)){let s=Ka[n];s&&(f.failWithHint({message:`'prjct ${n}' was removed in v2. ${s.note}`,hint:`Use: ${s.replacement}`}),process.exit(1))}if(n&&!at.getByName(n)&&!(e.length===0&&Wo(n)!==null)){let r=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[r,...o]}let t=e.includes("--md");t||f.start();try{let s=at.getByName(n);if(!s){let m=Wo(n),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(po("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:g})),t||f.end(),process.exit(1)}if(s.deprecated){let m=s.replacedBy?`Use 'prjct ${s.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||f.end(),process.exit(1));let{parsedArgs:r,options:o}=Z0(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=Q0(s,r);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let l=null,u=Date.now();try{l=await I.getProjectId(process.cwd()),l&&(await nr.expireIfStale(l),await nr.touch(l))}catch{}let d=new sn,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update")p=await d.update(o);else{let m=r.join(" ")||null,g=o.md===!0,R={task:c(y=>d.task(y,process.cwd(),{md:g,spec:o.spec?String(o.spec):void 0}),"task"),spec:c(y=>Y0(d,y,o),"spec"),"audit-spec":c(y=>y?d.specAudit(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(y=>d.init({idea:y,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),ship:c(y=>d.ship(y,process.cwd(),{md:g,noSpecGate:o["no-spec-gate"]===!0}),"ship"),workflow:c(y=>d.workflowPrefs(y,process.cwd(),{md:g}),"workflow"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:g,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(y=>y?d.saveLlmAnalysis(y,process.cwd(),{md:g}):Promise.resolve({success:!1,error:"analysis-save-llm requires a JSON payload as positional arg"}),"analysis-save-llm"),regen:c(()=>d.regenVault(process.cwd(),{md:g}),"regen"),start:c(()=>d.start(),"start"),context:c(y=>d.context(y),"context"),status:c(y=>d.status(y,process.cwd(),{md:g}),"status"),tag:c(y=>d.tag(y,process.cwd(),{md:g}),"tag"),remember:c(y=>d.remember(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0}),"remember"),login:c(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(y=>d.auth(y,{md:g}),"auth"),seed:c(y=>d.seed(y,process.cwd(),{md:g}),"seed"),install:c(()=>d.install(null,process.cwd(),{md:g}),"install"),capture:c(y=>d.capture(y,process.cwd(),{md:g,tags:o.tags?String(o.tags):void 0,force:o.force===!0}),"capture"),mcp:c(y=>d.mcp(y,process.cwd(),{md:g}),"mcp")}[n];if(R)p=await R(m);else throw new Error(`Command '${n}' has no handler`)}if(l){let m=Date.now()-u;try{await nr.trackCommand(l,n,m)}catch{}try{await mo.recordTiming(l,"command_duration",m,{command:n});let g=globalThis.__perfStartNs;if(g){let v=Number(process.hrtime.bigint()-g)/1e6;await mo.recordTiming(l,"startup_time",v)}await mo.recordMemory(l,{command:n})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(s){console.error("Error:",k(s)),process.env.DEBUG&&console.error(hc(s)),t||f.end(),process.exit(1)}}async function Y0(n,e,t){let s=t.md===!0,r=(e??"").trim().split(/\s+/).filter(Boolean),o=r[0],i=r.slice(1).join(" ")||null,a=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","inventory"]);if(o&&new Set(["draft","new","create"]).has(o))return n.spec(i,process.cwd(),{md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!o||!a.has(o))return n.spec(e,process.cwd(),{md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});let u=process.cwd();switch(o){case"list":return n.specList(u,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,u,{md:s});case"update":return n.specUpdate(i,u,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,u,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,u,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,u,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,u,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,u,{md:s});case"inventory":return n.specInventory(u,{md:s,json:t.json===!0});default:return{success:!1,message:`unknown spec subverb: ${o}`}}}function Q0(n,e){if(!n.params)return null;let t=n.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let s=t.map(o=>o.slice(1,-1)).join(", "),r=n.usage.terminal||`prjct ${n.name} ${n.params}`;return po("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${r}`})}return null}function Z0(n,e){let t=[],s={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?s[i]=e[++r]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function eI(n){let e=await ys(),t=ic.join(LS.homedir(),".claude","commands","p.md"),s=ic.join(LS.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([T(t),T(s),T(ic.join(process.cwd(),".cursor","commands","sync.md")),T(ic.join(process.cwd(),".cursor"))]),l=await io();if(console.log(`
1587
1587
  ${De.cyan("p/")} prjct v${n}
1588
1588
  ${De.dim("Context layer for AI coding agents")}
1589
1589
 
@@ -4,15 +4,17 @@ const sockPath=homedir()+"/.prjct-cli/run/daemon.sock";
4
4
  const args=process.argv.slice(2);
5
5
  const cmd=args.find(a=>!a.startsWith("-"));
6
6
  const skip=new Set(["daemon","stop","restart","start","setup","update","dev","web","serve","context","hooks","doctor","uninstall","watch","help","-h","--help","version","-v","--version","claude","hook","seed","install","crew","mcp","prefs","retro","health","context-save","context-restore","spec","audit-spec"]);
7
+ function refuse(m){console.error("prjct: daemon dropped the request ("+m+"). Retry: prjct "+args.join(" "));process.exit(1)}
8
+ function isSafeRetry(e){const c=e&&e.code||"",m=e&&e.message||"";return c==="ECONNREFUSED"||c==="ENOENT"||m.includes("ECONNREFUSED")||m.includes("ENOENT")}
7
9
  if(cmd&&!skip.has(cmd)&&process.env.PRJCT_NO_DAEMON!=="1"&&existsSync(sockPath)){
8
10
  const cArgs=[],cOpts={};
9
11
  for(let i=0;i<args.length;i++){const a=args[i];if(a.startsWith("--")){const r=a.slice(2);if(r.includes("=")){const e=r.indexOf("=");cOpts[r.slice(0,e)]=r.slice(e+1)}else if(i+1<args.length&&!args[i+1].startsWith("--")){cOpts[r]=args[++i]}else{cOpts[r]=true}}else if(a.startsWith("-")&&a.length===2){cOpts[a.slice(1)]=true}else if(i>0){cArgs.push(a)}}
10
12
  const msg=JSON.stringify({id:randomUUID(),command:cmd,args:cArgs,options:cOpts,cwd:process.cwd()})+"\n";
11
13
  const sock=connect(sockPath);let buf="",done=false;
12
- const t=setTimeout(()=>{if(!done){done=true;sock.destroy();fallback()}},5000);
14
+ const t=setTimeout(()=>{if(!done){done=true;sock.destroy();refuse("timed out")}},30000);
13
15
  sock.on("connect",()=>sock.write(msg));
14
16
  sock.on("data",c=>{buf+=c.toString();const n=buf.indexOf("\n");if(n!==-1){const r=JSON.parse(buf.slice(0,n));done=true;clearTimeout(t);sock.end();if(r.stdout)console.log(r.stdout);if(r.stderr)console.error(r.stderr);process.exit(r.exitCode)}});
15
- sock.on("error",()=>{if(!done){done=true;clearTimeout(t);fallback()}});
16
- sock.on("close",()=>{if(!done){done=true;clearTimeout(t);fallback()}});
17
+ sock.on("error",e=>{if(!done){done=true;clearTimeout(t);if(isSafeRetry(e))fallback();else refuse(e&&e.message||String(e))}});
18
+ sock.on("close",()=>{if(!done){done=true;clearTimeout(t);refuse("Connection closed before response")}});
17
19
  }else{fallback()}
18
20
  async function fallback(){await import("./prjct-core.mjs")}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prjct-cli",
3
- "version": "2.19.3",
3
+ "version": "2.19.5",
4
4
  "description": "Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",
5
5
  "main": "dist/bin/prjct.mjs",
6
6
  "bin": {