prjct-cli 2.19.8 → 2.19.9
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 +7 -0
- package/dist/bin/prjct-core.mjs +3 -3
- package/dist/daemon/entry.mjs +40 -40
- package/dist/mcp/server.mjs +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -829,8 +829,8 @@ ${k(P)}
|
|
|
829
829
|
`}},"runHook");for(let b of x)await w(b);y.length>0&&await Promise.all(y.map(w));let v=p.filter(b=>b.type==="step");for(let b of v){console.log(`
|
|
830
830
|
${Pt.dim(`[step] ${e}: ${b.action}`)}`);try{let P=Date.now();await bd(b,s,l,d,r,o);let T=Date.now()-P,M=T>1e3?`${(T/1e3).toFixed(1)}s`:`${T}ms`;console.log(`${Pt.green("\u2713")} ${Pt.dim(`step passed (${M})`)}`),r.stepsRun.push(b.description||b.action)}catch(P){return console.log(`${Pt.red("\u2717")} step failed: ${b.action}`),r.gatesFailed.push(b.description||b.action),r.success=!1,r.output+=`Step failed: ${b.action}
|
|
831
831
|
${k(P)}
|
|
832
|
-
`,r}}return r}var qw,Xw,zw,Nx,Jw,Lx,Sd,Fx,Td=h(()=>{"use strict";Pa();Lw();zn();Ww();kd();z();pt();$n();F();Ue();Vw();qw="status:",Xw="script:",zw="mcp:",Nx="persona:context",Jw="version:bump",Lx="changelog:add",Sd="git:commit",Fx="git:push";c(Hx,"runStatusTransition");c(Ux,"runShellAction");c(Wx,"runScriptAction");c(Gx,"buildMcpInstruction");c(Bx,"buildPersonaInstruction");c(Vx,"runVersionBump");c(qx,"runChangelogAdd");c(Jx,"expandTemplate");c(Xx,"runGitCommit");c(zx,"runGitPush");c(bd,"runRuleAction");c(Kx,"buildWhenContext");c(Yx,"resolveBranch");c(Qx,"resolveChangedFiles");c(Zx,"resolveActiveTags");c(es,"executeWorkflowRules")});import{z as Ce}from"zod";var ts,As,Ed,ej,Dn,Fo=h(()=>{"use strict";ts=["draft","reviewed","in_progress","shipped","archived"],As=["strategic","architecture","design"],Ed=Ce.object({verdict:Ce.enum(["pass","fail"]),notes:Ce.string(),ts:Ce.string()}),ej=Ce.object({risk:Ce.string().min(1),mitigation:Ce.string().min(1)}),Dn=Ce.object({goal:Ce.string().min(1),eli10:Ce.string().default(""),stakes:Ce.string().default(""),acceptance_criteria:Ce.array(Ce.string().min(1)).default([]),scope:Ce.array(Ce.string()).default([]),out_of_scope:Ce.array(Ce.string()).default([]),risks:Ce.array(ej).default([]),test_plan:Ce.array(Ce.string()).default([]),reviews:Ce.object({strategic:Ed.optional(),architecture:Ed.optional(),design:Ed.optional()}).optional(),linked_tasks:Ce.array(Ce.string()).default([]),notes:Ce.string().default(""),tasks_created_at:Ce.string().nullable().default(null)})});var Kw={};O(Kw,{specStorage:()=>Ae});var Cd,Ae,Ho=h(()=>{"use strict";Rn();Fo();le();z();Cd=class{static{c(this,"SpecStorage")}create(e,t){let n=Be(),r=C(),o=Dn.parse(t.content);return j.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
|
|
833
|
-
VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,t.title,JSON.stringify(o),t.tags?JSON.stringify(t.tags):null,r,r),{id:n,title:t.title,status:"draft",content:o,tags:t.tags??{},createdAt:r,updatedAt:r,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null}}get(e,t){let n=j.get(e,"SELECT * FROM specs WHERE id = ?",t);return n?this.rowToSpec(n):null}list(e,t={}){let n="SELECT * FROM specs WHERE 1=1",r=[];return t.status&&(n+=" AND status = ?",r.push(t.status)),!t.includeArchived&&!t.status&&(n+=" AND status != 'archived'"),n+=" ORDER BY created_at DESC",j.query(e,n,...r).map(i=>this.rowToSpec(i))}search(e,t){let n=`%${t}%`;return j.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(o=>this.rowToSpec(o))}updateContent(e,t,n){let r=Dn.parse(n),o=
|
|
832
|
+
`,r}}return r}var qw,Xw,zw,Nx,Jw,Lx,Sd,Fx,Td=h(()=>{"use strict";Pa();Lw();zn();Ww();kd();z();pt();$n();F();Ue();Vw();qw="status:",Xw="script:",zw="mcp:",Nx="persona:context",Jw="version:bump",Lx="changelog:add",Sd="git:commit",Fx="git:push";c(Hx,"runStatusTransition");c(Ux,"runShellAction");c(Wx,"runScriptAction");c(Gx,"buildMcpInstruction");c(Bx,"buildPersonaInstruction");c(Vx,"runVersionBump");c(qx,"runChangelogAdd");c(Jx,"expandTemplate");c(Xx,"runGitCommit");c(zx,"runGitPush");c(bd,"runRuleAction");c(Kx,"buildWhenContext");c(Yx,"resolveBranch");c(Qx,"resolveChangedFiles");c(Zx,"resolveActiveTags");c(es,"executeWorkflowRules")});import{z as Ce}from"zod";var ts,As,Ed,ej,Dn,Fo=h(()=>{"use strict";ts=["draft","reviewed","in_progress","shipped","archived"],As=["strategic","architecture","design"],Ed=Ce.object({verdict:Ce.enum(["pass","fail"]),notes:Ce.string(),ts:Ce.string()}),ej=Ce.object({risk:Ce.string().min(1),mitigation:Ce.string().min(1)}),Dn=Ce.object({goal:Ce.string().min(1),eli10:Ce.string().default(""),stakes:Ce.string().default(""),acceptance_criteria:Ce.array(Ce.string().min(1)).default([]),scope:Ce.array(Ce.string()).default([]),out_of_scope:Ce.array(Ce.string()).default([]),risks:Ce.array(ej).default([]),test_plan:Ce.array(Ce.string()).default([]),reviews:Ce.object({strategic:Ed.optional(),architecture:Ed.optional(),design:Ed.optional()}).optional(),linked_tasks:Ce.array(Ce.string()).default([]),notes:Ce.string().default(""),tasks_created_at:Ce.string().nullable().default(null)})});var Kw={};O(Kw,{specStorage:()=>Ae});var Cd,Ae,Ho=h(()=>{"use strict";Rn();Fo();le();z();Cd=class{static{c(this,"SpecStorage")}nextUpdatedAt(e,t){let n=C(),o=j.get(e,"SELECT updated_at FROM specs WHERE id = ?",t)?.updated_at;return!o||n>o?n:new Date(new Date(o).getTime()+1).toISOString()}create(e,t){let n=Be(),r=C(),o=Dn.parse(t.content);return j.run(e,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
|
|
833
|
+
VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,t.title,JSON.stringify(o),t.tags?JSON.stringify(t.tags):null,r,r),{id:n,title:t.title,status:"draft",content:o,tags:t.tags??{},createdAt:r,updatedAt:r,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null}}get(e,t){let n=j.get(e,"SELECT * FROM specs WHERE id = ?",t);return n?this.rowToSpec(n):null}list(e,t={}){let n="SELECT * FROM specs WHERE 1=1",r=[];return t.status&&(n+=" AND status = ?",r.push(t.status)),!t.includeArchived&&!t.status&&(n+=" AND status != 'archived'"),n+=" ORDER BY created_at DESC",j.query(e,n,...r).map(i=>this.rowToSpec(i))}search(e,t){let n=`%${t}%`;return j.query(e,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(o=>this.rowToSpec(o))}updateContent(e,t,n){let r=Dn.parse(n),o=this.nextUpdatedAt(e,t);return j.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(r),o,t),this.get(e,t)}casUpdate(e,t,n,r){let o=Dn.parse(n),i=this.nextUpdatedAt(e,t);return j.run(e,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(o),i,t,r).changes===1}setStatus(e,t,n){if(!ts.includes(n))throw new Error(`invalid spec status: ${n}`);let r=this.nextUpdatedAt(e,t),o=[],i=[n,r];n==="shipped"&&(o.push("shipped_at = ?"),i.push(r)),n==="archived"&&(o.push("archived_at = ?"),i.push(r));let a=["status = ?","updated_at = ?",...o].join(", ");return i.push(t),j.run(e,`UPDATE specs SET ${a} WHERE id = ?`,...i),this.get(e,t)}setShippedPr(e,t,n){return j.run(e,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}setShippedSha(e,t,n){return j.run(e,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(e,t),t),this.get(e,t)}linkTask(e,t,n){let r=this.get(e,t);if(!r)return null;if(r.content.linked_tasks.includes(n))return r;let o={...r.content,linked_tasks:[...r.content.linked_tasks,n]};return this.updateContent(e,t,o)}delete(e,t){return this.get(e,t)?(j.run(e,"DELETE FROM specs WHERE id = ?",t),!0):!1}count(e){let t=j.query(e,"SELECT status, COUNT(*) AS n FROM specs GROUP BY status"),n={total:0,draft:0,shipped:0};for(let r of t)n.total+=r.n,r.status==="draft"&&(n.draft=r.n),r.status==="shipped"&&(n.shipped=r.n);return n}rowToSpec(e){return{id:e.id,title:e.title,status:ts.includes(e.status)?e.status:"draft",content:Dn.parse(JSON.parse(e.content)),tags:e.tags?JSON.parse(e.tags):{},createdAt:e.created_at,updatedAt:e.updated_at,shippedAt:e.shipped_at,shippedPr:e.shipped_pr,shippedSha:e.shipped_sha,archivedAt:e.archived_at}}},Ae=new Cd});var Yw,Qw,Zw,ek,tk=h(()=>{"use strict";Yw={frontend:["component","page","view","ui","layout","style","css","scss","sass","hook","context","store","redux","zustand","react","vue","svelte","angular","next","nuxt","app","client"],backend:["api","route","controller","service","middleware","handler","resolver","schema","model","entity","repository","server","socket","graphql","rest","trpc"],database:["migration","seed","schema","model","entity","repository","prisma","drizzle","sequelize","typeorm","mongoose","knex","sql","db"],auth:["auth","login","logout","session","token","jwt","oauth","passport","credential","permission","role","user","account"],testing:["test","spec","e2e","integration","unit","mock","fixture","stub","jest","vitest","cypress","playwright"],config:["config","env","setting","constant","option","tsconfig","eslint","prettier","vite","webpack","rollup"],infra:["docker","compose","kubernetes","k8s","ci","cd","github","gitlab","jenkins","terraform","ansible","deploy"],util:["util","helper","lib","common","shared","core","base","abstract"]},Qw=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java",".kt",".swift",".rb",".php",".c",".cpp",".h",".hpp",".cs",".vue",".svelte"]),Zw=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","coverage",".cache","__pycache__",".pytest_cache","vendor","target",".turbo",".vercel"]),ek=new Set(["a","an","the","and","or","but","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","must","shall","can","need","to","of","in","for","on","with","at","by","from","as","into","through","during","before","after","above","below","between","under","again","further","then","once","here","there","when","where","why","how","all","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","just","add","create","make","implement","fix","update","change","modify","remove","delete","new"])});import tj from"node:fs/promises";import Wa from"node:path";async function nk(s,e,t={}){let n=Date.now(),r=t.maxFiles??30,o=t.minScore??.1,i=t.includeTests??!1,a=nj(s),l=await sj(e),u=await rj(e),d=[];for(let m of l){if(!i&&ij(m))continue;let g=oj(m,a,u,t.historicalBoosts);g.score>=o&&d.push(g)}d.sort((m,g)=>g.score-m.score);let p=d.slice(0,r);return{files:p,metrics:{filesScanned:l.length,filesReturned:p.length,scanDuration:Date.now()-n}}}function nj(s){return s.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).filter(t=>!ek.has(t)&&t.length>2)}async function sj(s){let e=[];async function t(n,r=""){try{let o=await tj.readdir(n,{withFileTypes:!0});for(let i of o){let a=Wa.join(n,i.name),l=Wa.join(r,i.name);if(i.isDirectory()){if(Zw.has(i.name)||i.name.startsWith("."))continue;await t(a,l)}else if(i.isFile()){let u=Wa.extname(i.name).toLowerCase();Qw.has(u)&&e.push(l)}}}catch(o){N(o)}}return c(t,"walk"),await t(s),e}async function rj(s){let e=new Map;try{let{stdout:t}=await W(`git log -30 --pretty=format:"%H %ct" --name-only | awk '
|
|
834
834
|
/^[a-f0-9]{40}/ { commit=$1; timestamp=$2; next }
|
|
835
835
|
NF { files[$0]++; if (!lastmod[$0]) lastmod[$0]=timestamp }
|
|
836
836
|
END { for (f in files) print files[f], lastmod[f], f }
|
|
@@ -1592,7 +1592,7 @@ ${Y.yellow(`Command '${s}' not found.`)}
|
|
|
1592
1592
|
|
|
1593
1593
|
Run 'prjct help' to see all available commands.
|
|
1594
1594
|
`}function ZI(){let s=[];s.push(""),s.push(Y.cyan.bold("All Commands")),s.push("");let e=Object.entries(ao).sort((t,n)=>t[1].order-n[1].order);for(let[t,n]of e){let r=Ln.filter(o=>o.group===t);if(r.length!==0){s.push(`${Y.bold(n.title)} ${Y.dim(`(${r.length} commands)`)}`),s.push(Y.dim(n.description)),s.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;s.push(` ${i} ${a}`)}s.push("")}}return s.push(Y.dim("Run 'prjct help <command>' for detailed help on a specific command.")),s.push(""),s.join(`
|
|
1595
|
-
`)}function e_(s){return s?s==="commands"||s==="all"?ZI():QI(s):zI()}var ET,XI,RT=h(()=>{"use strict";ai();Fe();ET=[{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"]}],XI=[{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(zI,"formatMainHelp");c(KI,"formatTerminalCommandHelp");c(YI,"formatAgentCommandHelp");c(QI,"formatCommandHelp");c(ZI,"formatCommandList");c(e_,"getHelp")});var PT=LT((u4,t_)=>{t_.exports={name:"prjct-cli",version:"2.19.8",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 c_={};import xT from"node:os";import Ec from"node:path";import Oe from"chalk";async function n_(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let n=await Promise.resolve().then(()=>FT(PT()));await i_(n.version),process.exit(0)}if(["-h","--help",void 0].includes(s)&&(a_(),process.exit(0)),s&&fc(s)&&!ct.getByName(s)){let n=gc[s];n&&(f.failWithHint({message:`'prjct ${s}' was removed in v2. ${n.note}`,hint:`Use: ${n.replacement}`}),process.exit(1))}if(s&&!ct.getByName(s)&&!(e.length===0&&Qo(s)!==null)){let r=[s,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));s="capture",e=[r,...o]}let t=e.includes("--md");t||f.start();try{let n=ct.getByName(s);if(!n){let m=Qo(s),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(vo("UNKNOWN_COMMAND",{message:`Unknown command: ${s}`,hint:g})),t||f.end(),process.exit(1)}if(n.deprecated){let m=n.replacedBy?`Use 'prjct ${n.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${s}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}n.implemented||(f.failWithHint({message:`Command '${s}' 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}=o_(n,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;n.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${s}' requires an AI agent to process its output`,hint:`Use 'p. ${s}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=r_(n,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 cr.expireIfStale(l),await cr.touch(l))}catch{}let d=new os,p;if(s==="analyze")p=await d.analyze(o);else if(s==="setup")p=await d.setup(o);else if(s==="update")p=await d.update(o);else{let m=r.join(" ")||null,g=o.md===!0,x={task:c(y=>d.task(y,process.cwd(),{md:g,spec:o.spec?String(o.spec):void 0}),"task"),spec:c(y=>s_(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")}[s];if(x)p=await x(m);else throw new Error(`Command '${s}' has no handler`)}if(l){let m=Date.now()-u;try{await cr.trackCommand(l,s,m)}catch{}try{await bo.recordTiming(l,"command_duration",m,{command:s});let g=globalThis.__perfStartNs;if(g){let S=Number(process.hrtime.bigint()-g)/1e6;await bo.recordTiming(l,"startup_time",S)}await bo.recordMemory(l,{command:s})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(n){console.error("Error:",k(n)),process.env.DEBUG&&console.error(Dc(n)),t||f.end(),process.exit(1)}}async function s_(s,e,t){let n=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 s.spec(i,process.cwd(),{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!o||!a.has(o))return s.spec(e,process.cwd(),{md:n,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 s.specList(u,{md:n,status:t.status?String(t.status):void 0});case"show":return s.specShow(i,u,{md:n});case"update":return s.specUpdate(i,u,{md:n,json:t.json?String(t.json):void 0});case"set-status":return s.specSetStatus(i,u,{md:n,status:t.status?String(t.status):void 0});case"record-review":return s.specRecordReview(i,u,{md:n,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 s.specLinkTask(i,u,{md:n,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return s.specShip(i,u,{md:n,pr:t.pr?String(t.pr):void 0});case"audit":return s.specAudit(i,u,{md:n});case"breakdown":return s.specBreakdown(i,u,{md:n,force:t.force===!0});case"inventory":return s.specInventory(u,{md:n,json:t.json===!0});default:return{success:!1,message:`unknown spec subverb: ${o}`}}}function r_(s,e){if(!s.params)return null;let t=s.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),r=s.usage.terminal||`prjct ${s.name} ${s.params}`;return vo("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function o_(s,e){let t=[],n={};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("--")?n[i]=e[++r]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function i_(s){let e=await Tn(),t=Ec.join(xT.homedir(),".claude","commands","p.md"),n=Ec.join(xT.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([E(t),E(n),E(Ec.join(process.cwd(),".cursor","commands","sync.md")),E(Ec.join(process.cwd(),".cursor"))]),l=await fo();if(console.log(`
|
|
1595
|
+
`)}function e_(s){return s?s==="commands"||s==="all"?ZI():QI(s):zI()}var ET,XI,RT=h(()=>{"use strict";ai();Fe();ET=[{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"]}],XI=[{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(zI,"formatMainHelp");c(KI,"formatTerminalCommandHelp");c(YI,"formatAgentCommandHelp");c(QI,"formatCommandHelp");c(ZI,"formatCommandList");c(e_,"getHelp")});var PT=LT((u4,t_)=>{t_.exports={name:"prjct-cli",version:"2.19.9",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 c_={};import xT from"node:os";import Ec from"node:path";import Oe from"chalk";async function n_(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let n=await Promise.resolve().then(()=>FT(PT()));await i_(n.version),process.exit(0)}if(["-h","--help",void 0].includes(s)&&(a_(),process.exit(0)),s&&fc(s)&&!ct.getByName(s)){let n=gc[s];n&&(f.failWithHint({message:`'prjct ${s}' was removed in v2. ${n.note}`,hint:`Use: ${n.replacement}`}),process.exit(1))}if(s&&!ct.getByName(s)&&!(e.length===0&&Qo(s)!==null)){let r=[s,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));s="capture",e=[r,...o]}let t=e.includes("--md");t||f.start();try{let n=ct.getByName(s);if(!n){let m=Qo(s),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(vo("UNKNOWN_COMMAND",{message:`Unknown command: ${s}`,hint:g})),t||f.end(),process.exit(1)}if(n.deprecated){let m=n.replacedBy?`Use 'prjct ${n.replacedBy}' instead`:"Run 'prjct --help' to see available commands";f.failWithHint({message:`Command '${s}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}n.implemented||(f.failWithHint({message:`Command '${s}' 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}=o_(n,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;n.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${s}' requires an AI agent to process its output`,hint:`Use 'p. ${s}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=r_(n,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 cr.expireIfStale(l),await cr.touch(l))}catch{}let d=new os,p;if(s==="analyze")p=await d.analyze(o);else if(s==="setup")p=await d.setup(o);else if(s==="update")p=await d.update(o);else{let m=r.join(" ")||null,g=o.md===!0,x={task:c(y=>d.task(y,process.cwd(),{md:g,spec:o.spec?String(o.spec):void 0}),"task"),spec:c(y=>s_(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")}[s];if(x)p=await x(m);else throw new Error(`Command '${s}' has no handler`)}if(l){let m=Date.now()-u;try{await cr.trackCommand(l,s,m)}catch{}try{await bo.recordTiming(l,"command_duration",m,{command:s});let g=globalThis.__perfStartNs;if(g){let S=Number(process.hrtime.bigint()-g)/1e6;await bo.recordTiming(l,"startup_time",S)}await bo.recordMemory(l,{command:s})}catch{}}p?.message&&console.log(p.message),t||f.end(),process.exit(p?.success?0:1)}catch(n){console.error("Error:",k(n)),process.env.DEBUG&&console.error(Dc(n)),t||f.end(),process.exit(1)}}async function s_(s,e,t){let n=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 s.spec(i,process.cwd(),{md:n,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0});if(!o||!a.has(o))return s.spec(e,process.cwd(),{md:n,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 s.specList(u,{md:n,status:t.status?String(t.status):void 0});case"show":return s.specShow(i,u,{md:n});case"update":return s.specUpdate(i,u,{md:n,json:t.json?String(t.json):void 0});case"set-status":return s.specSetStatus(i,u,{md:n,status:t.status?String(t.status):void 0});case"record-review":return s.specRecordReview(i,u,{md:n,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 s.specLinkTask(i,u,{md:n,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return s.specShip(i,u,{md:n,pr:t.pr?String(t.pr):void 0});case"audit":return s.specAudit(i,u,{md:n});case"breakdown":return s.specBreakdown(i,u,{md:n,force:t.force===!0});case"inventory":return s.specInventory(u,{md:n,json:t.json===!0});default:return{success:!1,message:`unknown spec subverb: ${o}`}}}function r_(s,e){if(!s.params)return null;let t=s.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),r=s.usage.terminal||`prjct ${s.name} ${s.params}`;return vo("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function o_(s,e){let t=[],n={};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("--")?n[i]=e[++r]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function i_(s){let e=await Tn(),t=Ec.join(xT.homedir(),".claude","commands","p.md"),n=Ec.join(xT.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([E(t),E(n),E(Ec.join(process.cwd(),".cursor","commands","sync.md")),E(Ec.join(process.cwd(),".cursor"))]),l=await fo();if(console.log(`
|
|
1596
1596
|
${Oe.cyan("p/")} prjct v${s}
|
|
1597
1597
|
${Oe.dim("Context layer for AI coding agents")}
|
|
1598
1598
|
|