prjct-cli 1.56.10 → 1.56.12

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,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.56.12] - 2026-04-14
4
+
5
+ ### Bug Fixes
6
+
7
+ - exclude .worktrees from indexing (#248)
8
+
9
+
10
+ ## [1.56.11] - 2026-04-13
11
+
12
+ ### Fixed
13
+ - Exclude `.worktrees` from BM25 and import graph indexing to eliminate duplicate search results
14
+ - Exclude `.worktrees` from biome config to prevent nested root configuration errors
15
+
3
16
  ## [1.56.10] - 2026-04-11
4
17
 
5
18
  ### Bug Fixes
@@ -67,7 +80,6 @@
67
80
  - resolve biome check lint and format errors (#244)
68
81
  - prefer installed dist over source files (#243)
69
82
 
70
-
71
83
  ## [1.56.5] - 2026-04-07
72
84
 
73
85
  ### Added
@@ -6,7 +6,7 @@ var __filename = __fileURLToPath(import.meta.url);
6
6
  var __dirname = __pathDirname(__filename);
7
7
  var Zy=Object.create;var Zr=Object.defineProperty;var ew=Object.getOwnPropertyDescriptor;var tw=Object.getOwnPropertyNames;var sw=Object.getPrototypeOf,nw=Object.prototype.hasOwnProperty;var l=(r,e)=>Zr(r,"name",{value:e,configurable:!0}),Bt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var S=(r,e)=>()=>(r&&(e=r(r=0)),e);var rw=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ye=(r,e)=>{for(var t in e)Zr(r,t,{get:e[t],enumerable:!0})},Ld=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of tw(e))!nw.call(r,n)&&n!==t&&Zr(r,n,{get:()=>e[n],enumerable:!(s=ew(e,n))||s.enumerable});return r};var ow=(r,e,t)=>(t=r!=null?Zy(sw(r)):{},Ld(e||!r||!r.__esModule?Zr(t,"default",{value:r,enumerable:!0}):t,r)),bt=r=>Ld(Zr({},"__esModule",{value:!0}),r);var Fd={};ye(Fd,{DAEMON_PATHS:()=>Le,IDLE_TIMEOUT_MS:()=>Ka,MAX_BUFFER_SIZE:()=>Ya,decodeMessage:()=>iw,encodeMessage:()=>pn});function pn(r){return Buffer.from(`${JSON.stringify(r)}
8
8
  `)}function iw(r){return JSON.parse(r.trim())}var Le,Ka,Ya,Wo=S(()=>{"use strict";Le={runDir:l(()=>`${process.env.HOME||Bt("node:os").homedir()}/.prjct-cli/run`,"runDir"),socket:l(()=>`${Le.runDir()}/daemon.sock`,"socket"),pid:l(()=>`${Le.runDir()}/daemon.pid`,"pid"),log:l(()=>`${Le.runDir()}/daemon.log`,"log")},Ka=30*60*1e3,Ya=1024*1024;l(pn,"encodeMessage");l(iw,"decodeMessage")});function Ud(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}function gn(){return Ud()==="bun"}function Qa(){if(Ud()==="bun")return!0;try{let{execSync:r}=Bt("node:child_process");return r("bun --version",{stdio:"ignore"}),!0}catch{return!1}}var eo=S(()=>{"use strict";l(Ud,"detectRuntime");l(gn,"isBun");l(Qa,"isBunAvailable")});var vs={};ye(vs,{executeViaDaemon:()=>lw,forceKillDaemon:()=>dw,getDaemonStatus:()=>cw,isDaemonRunning:()=>Hd,sendRequest:()=>to,spawnDaemon:()=>Wd,stopDaemon:()=>uw});import Go from"node:crypto";import ct from"node:fs";import{connect as aw}from"node:net";async function Hd(){let r=Le.socket();if(!ct.existsSync(r))return!1;try{return(await to({id:Go.randomUUID(),command:"__ping",args:[],options:{},cwd:process.cwd()})).success}catch{try{ct.unlinkSync(r)}catch{}return!1}}async function cw(){let r=Le.socket(),e=Le.pid();if(!ct.existsSync(r))return{running:!1};try{let t=await to({id:Go.randomUUID(),command:"daemon",args:["status"],options:{},cwd:process.cwd()});if(t.success&&t.result)return t.result}catch{}return ct.existsSync(e)?{running:!1,pid:parseInt(ct.readFileSync(e,"utf-8").trim(),10),socketPath:r}:{running:!1}}function to(r){return new Promise((e,t)=>{let s=Le.socket(),n=aw(s),o="",i=!1,a=setTimeout(()=>{i||(i=!0,n.destroy(),t(new Error("Daemon request timed out")))},3e4);n.on("connect",()=>{n.write(pn(r))}),n.on("data",c=>{o+=c.toString();let u=o.indexOf(`
9
- `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function lw(r,e,t,s,n,o=!0){let i=Le.socket();if(!ct.existsSync(i))return o&&Wd().catch(()=>{}),null;try{return await to({id:Go.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function uw(){try{return(await to({id:Go.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function dw(){let r=Le.pid(),e=Le.socket(),t=!1;if(ct.existsSync(r)){let s=parseInt(ct.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{ct.existsSync(r)&&ct.unlinkSync(r)}catch{}try{ct.existsSync(e)&&ct.unlinkSync(e)}catch{}return t}async function Wd(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(ct.existsSync(t))o=t,i="bun";else if(ct.existsSync(s))o=s,i=Qa()?"bun":"node";else if(ct.existsSync(n))o=n,i=Qa()?"bun":"node";else return!1;let a=Le.runDir();ct.mkdirSync(a,{recursive:!0});let c=Le.log(),u=ct.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),ct.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await Hd())return!0;return!1}var Ts=S(()=>{"use strict";eo();Wo();l(Hd,"isDaemonRunning");l(cw,"getDaemonStatus");l(to,"sendRequest");l(lw,"executeViaDaemon");l(uw,"stopDaemon");l(dw,"forceKillDaemon");l(Wd,"spawnDaemon")});var so=S(()=>{"use strict"});import{z as ds}from"zod";function Gd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var UP,HP,WP,Gn,GP,qo=S(()=>{"use strict";UP=ds.enum(["opus","sonnet","haiku"]),HP=ds.enum(["2.5-pro","2.5-flash","2.0-flash"]),WP=ds.string().min(1),Gn=ds.object({provider:ds.string(),model:ds.string(),cliVersion:ds.string().optional(),recordedAt:ds.string()}),GP=ds.object({preferredModel:ds.string().optional(),lastAnalysisModel:Gn.optional()});l(Gd,"compareSemver")});var Bd={};ye(Bd,{execAsync:()=>F,execFileAsync:()=>fn});import{exec as mw,execFile as pw}from"node:child_process";import{promisify as qd}from"node:util";var F,fn,Je=S(()=>{"use strict";F=qd(mw),fn=qd(pw)});var Vd,Jd,zd,Za=S(()=>{"use strict";Vd=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct"]),Jd=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],zd=/(?:import|from)\s+['"]([^'"]+)['"]/g});function gw(r){return r instanceof Error&&"code"in r}function O(r){return gw(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function ec(r){if(r instanceof Error)return r.stack}var W=S(()=>{"use strict";l(gw,"isNodeError");l(O,"isNotFoundError");l(k,"getErrorMessage");l(ec,"getErrorStack")});import Yd from"node:fs/promises";async function Qd(r,e){let t;try{t=await Yd.readFile(r,"utf-8")}catch(o){if(O(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Xd(r,t),Kd(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await Xd(r,t),Kd(r,fw(n.error)),null)}async function Xd(r,e){let t=`${r}.backup`;try{await Yd.writeFile(t,e,"utf-8")}catch{}}function Kd(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function fw(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Zd=S(()=>{"use strict";W();l(Qd,"safeRead");l(Xd,"createBackup");l(Kd,"logCorruption");l(fw,"formatZodError")});var _t={};ye(_t,{appendLine:()=>tc,appendToFile:()=>yw,atomicWrite:()=>hw,batchProcess:()=>yn,copyFile:()=>Tw,deleteDir:()=>Sw,deleteFile:()=>kw,dirExists:()=>Kt,ensureDir:()=>rt,fileExists:()=>C,getFileExtension:()=>xw,getFileModifiedTime:()=>vw,getFileNameWithoutExtension:()=>jw,getFileSize:()=>bw,listFiles:()=>Cs,moveFile:()=>Ew,prependToFile:()=>ww,readFile:()=>_e,readJson:()=>Ae,readLines:()=>Cw,walkDir:()=>hn,writeFile:()=>Pt,writeJson:()=>de,writeLines:()=>Pw});import Re from"node:fs/promises";import Es from"node:path";async function hn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Re.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(Vd.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=Es.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(Es.relative(r,d))}}return l(o,"walk"),await o(r),t}async function yn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function Ae(r,e=null,t){if(t)return await Qd(r,t)??e;try{let s=await Re.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(O(s))return e;throw s}}async function de(r,e,t=2){let s=Es.dirname(r);await Re.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Re.writeFile(r,n,"utf-8")}async function _e(r,e=""){try{return await Re.readFile(r,"utf-8")}catch(t){if(O(t))return e;throw t}}async function Pt(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.writeFile(r,e,"utf-8")}async function hw(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await Re.writeFile(s,e,"utf-8"),await Re.rename(s,r)}async function yw(r,e){await Re.appendFile(r,e,"utf-8")}async function tc(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.appendFile(r,`${e}
9
+ `);if(u!==-1){let d=o.slice(0,u);o=o.slice(u+1);try{let p=JSON.parse(d);i=!0,clearTimeout(a),n.end(),e(p)}catch(p){i=!0,clearTimeout(a),n.end(),t(new Error(`Invalid daemon response: ${p.message}`))}}}),n.on("error",c=>{i||(i=!0,clearTimeout(a),t(c))}),n.on("close",()=>{i||(i=!0,clearTimeout(a),t(new Error("Connection closed before response")))})})}async function lw(r,e,t,s,n,o=!0){let i=Le.socket();if(!ct.existsSync(i))return o&&Wd().catch(()=>{}),null;try{return await to({id:Go.randomUUID(),command:r,args:e,options:t,cwd:s,perfStartNs:n})}catch{return null}}async function uw(){try{return(await to({id:Go.randomUUID(),command:"daemon",args:["stop"],options:{},cwd:process.cwd()})).success}catch{return!1}}function dw(){let r=Le.pid(),e=Le.socket(),t=!1;if(ct.existsSync(r)){let s=parseInt(ct.readFileSync(r,"utf-8").trim(),10);if(!Number.isNaN(s))try{process.kill(s,"SIGKILL"),t=!0}catch{}}try{ct.existsSync(r)&&ct.unlinkSync(r)}catch{}try{ct.existsSync(e)&&ct.unlinkSync(e)}catch{}return t}async function Wd(){let{spawn:r}=await import("node:child_process"),e=await import("node:path"),t=e.join(__dirname,"entry.ts"),s=e.join(__dirname,"..","daemon","entry.mjs"),n=e.join(__dirname,"..","dist","daemon","entry.mjs"),o,i;if(ct.existsSync(t))o=t,i="bun";else if(ct.existsSync(s))o=s,i=Qa()?"bun":"node";else if(ct.existsSync(n))o=n,i=Qa()?"bun":"node";else return!1;let a=Le.runDir();ct.mkdirSync(a,{recursive:!0});let c=Le.log(),u=ct.openSync(c,"a");r(i,[o],{detached:!0,stdio:["ignore",u,u],env:{...process.env,PRJCT_DAEMON:"1"}}).unref(),ct.closeSync(u);let p=Date.now()+3e3;for(;Date.now()<p;)if(await new Promise(m=>setTimeout(m,300)),await Hd())return!0;return!1}var Ts=S(()=>{"use strict";eo();Wo();l(Hd,"isDaemonRunning");l(cw,"getDaemonStatus");l(to,"sendRequest");l(lw,"executeViaDaemon");l(uw,"stopDaemon");l(dw,"forceKillDaemon");l(Wd,"spawnDaemon")});var so=S(()=>{"use strict"});import{z as ds}from"zod";function Gd(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<3;n++){let o=t[n]??0,i=s[n]??0;if(o<i)return-1;if(o>i)return 1}return 0}var UP,HP,WP,Gn,GP,qo=S(()=>{"use strict";UP=ds.enum(["opus","sonnet","haiku"]),HP=ds.enum(["2.5-pro","2.5-flash","2.0-flash"]),WP=ds.string().min(1),Gn=ds.object({provider:ds.string(),model:ds.string(),cliVersion:ds.string().optional(),recordedAt:ds.string()}),GP=ds.object({preferredModel:ds.string().optional(),lastAnalysisModel:Gn.optional()});l(Gd,"compareSemver")});var Bd={};ye(Bd,{execAsync:()=>F,execFileAsync:()=>fn});import{exec as mw,execFile as pw}from"node:child_process";import{promisify as qd}from"node:util";var F,fn,Je=S(()=>{"use strict";F=qd(mw),fn=qd(pw)});var Vd,Jd,zd,Za=S(()=>{"use strict";Vd=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct",".worktrees"]),Jd=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],zd=/(?:import|from)\s+['"]([^'"]+)['"]/g});function gw(r){return r instanceof Error&&"code"in r}function O(r){return gw(r)&&r.code==="ENOENT"}function k(r){return r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}function ec(r){if(r instanceof Error)return r.stack}var W=S(()=>{"use strict";l(gw,"isNodeError");l(O,"isNotFoundError");l(k,"getErrorMessage");l(ec,"getErrorStack")});import Yd from"node:fs/promises";async function Qd(r,e){let t;try{t=await Yd.readFile(r,"utf-8")}catch(o){if(O(o))return null;throw o}let s;try{s=JSON.parse(t)}catch{return await Xd(r,t),Kd(r,"Malformed JSON"),null}let n=e.safeParse(s);return n.success?s:(await Xd(r,t),Kd(r,fw(n.error)),null)}async function Xd(r,e){let t=`${r}.backup`;try{await Yd.writeFile(t,e,"utf-8")}catch{}}function Kd(r,e){console.error(`[prjct] Warning: Corrupted storage file: ${r}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function fw(r){return r.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Zd=S(()=>{"use strict";W();l(Qd,"safeRead");l(Xd,"createBackup");l(Kd,"logCorruption");l(fw,"formatZodError")});var _t={};ye(_t,{appendLine:()=>tc,appendToFile:()=>yw,atomicWrite:()=>hw,batchProcess:()=>yn,copyFile:()=>Tw,deleteDir:()=>Sw,deleteFile:()=>kw,dirExists:()=>Kt,ensureDir:()=>rt,fileExists:()=>C,getFileExtension:()=>xw,getFileModifiedTime:()=>vw,getFileNameWithoutExtension:()=>jw,getFileSize:()=>bw,listFiles:()=>Cs,moveFile:()=>Ew,prependToFile:()=>ww,readFile:()=>_e,readJson:()=>Ae,readLines:()=>Cw,walkDir:()=>hn,writeFile:()=>Pt,writeJson:()=>de,writeLines:()=>Pw});import Re from"node:fs/promises";import Es from"node:path";async function hn(r,e={}){let t=[],s=e.maxFiles??1/0,n=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=s)return;let a=await Re.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let c of a){if(t.length>=s)break;let u=String(c.name);if(Vd.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!n||!n.has(u)))continue;let d=Es.join(i,u);c.isDirectory()?await o(d):c.isFile()&&t.push(Es.relative(r,d))}}return l(o,"walk"),await o(r),t}async function yn(r,e,t){let s=[];for(let n=0;n<r.length;n+=e){let o=await Promise.all(r.slice(n,n+e).map(t));for(let i of o)i!==null&&s.push(i)}return s}async function Ae(r,e=null,t){if(t)return await Qd(r,t)??e;try{let s=await Re.readFile(r,"utf-8");return JSON.parse(s)}catch(s){if(O(s))return e;throw s}}async function de(r,e,t=2){let s=Es.dirname(r);await Re.mkdir(s,{recursive:!0});let n=JSON.stringify(e,null,t);await Re.writeFile(r,n,"utf-8")}async function _e(r,e=""){try{return await Re.readFile(r,"utf-8")}catch(t){if(O(t))return e;throw t}}async function Pt(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.writeFile(r,e,"utf-8")}async function hw(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0});let s=`${r}.${Date.now()}.tmp`;await Re.writeFile(s,e,"utf-8"),await Re.rename(s,r)}async function yw(r,e){await Re.appendFile(r,e,"utf-8")}async function tc(r,e){let t=Es.dirname(r);await Re.mkdir(t,{recursive:!0}),await Re.appendFile(r,`${e}
10
10
  `,"utf-8")}async function ww(r,e){try{let t=await Re.readFile(r,"utf-8");await Re.writeFile(r,e+t,"utf-8")}catch(t){if(O(t))await Re.writeFile(r,e,"utf-8");else throw t}}async function C(r){try{return await Re.access(r),!0}catch(e){if(O(e))return!1;throw e}}async function Kt(r){try{return(await Re.stat(r)).isDirectory()}catch(e){if(O(e))return!1;throw e}}async function rt(r){await Re.mkdir(r,{recursive:!0})}async function kw(r){try{return await Re.unlink(r),!0}catch(e){if(O(e))return!1;throw e}}async function Sw(r){try{return await Re.rm(r,{recursive:!0,force:!0}),!0}catch(e){if(O(e))return!1;throw e}}async function Cs(r,e={}){try{let s=await Re.readdir(r,{withFileTypes:!0});return e.filesOnly&&(s=s.filter(n=>n.isFile())),e.dirsOnly&&(s=s.filter(n=>n.isDirectory())),e.extension&&(s=s.filter(n=>n.name.endsWith(e.extension))),s.map(n=>n.name)}catch(t){if(O(t))return[];throw t}}async function bw(r){return(await Re.stat(r)).size}async function vw(r){return(await Re.stat(r)).mtime}async function Tw(r,e){await Re.copyFile(r,e)}async function Ew(r,e){await Re.rename(r,e)}async function Cw(r){return(await _e(r,"")).split(`
11
11
  `)}async function Pw(r,e){let t=e.join(`
12
12
  `);await Pt(r,t)}function xw(r){return Es.extname(r)}function jw(r){return Es.basename(r,Es.extname(r))}var B=S(()=>{"use strict";Za();Zd();W();l(hn,"walkDir");l(yn,"batchProcess");l(Ae,"readJson");l(de,"writeJson");l(_e,"readFile");l(Pt,"writeFile");l(hw,"atomicWrite");l(yw,"appendToFile");l(tc,"appendLine");l(ww,"prependToFile");l(C,"fileExists");l(Kt,"dirExists");l(rt,"ensureDir");l(kw,"deleteFile");l(Sw,"deleteDir");l(Cs,"listFiles");l(bw,"getFileSize");l(vw,"getFileModifiedTime");l(Tw,"copyFile");l(Ew,"moveFile");l(Cw,"readLines");l(Pw,"writeLines");l(xw,"getFileExtension");l(jw,"getFileNameWithoutExtension")});function Ws(r,e){let t=typeof r=="string"?new Date(r).getTime():r;return Date.now()-t>e}var qn,wn=S(()=>{"use strict";l(Ws,"isExpired");qn=class{static{l(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(e={}){this.ttl=e.ttl??5e3,this.maxSize=e.maxSize??50}isValid(e){let t=this.cache.get(e);return t?Date.now()-t.timestamp<this.ttl:!1}get(e){let t=this.cache.get(e);return t?this.isValid(e)?t.data:(this.cache.delete(e),null):null}set(e,t){this.cache.set(e,{data:t,timestamp:Date.now()}),this.evictOldEntries()}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}has(e){return this.cache.has(e)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let t=Array.from(this.cache.entries()).sort((s,n)=>s[1].timestamp-n[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[s]of t)this.cache.delete(s)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let e=0;for(let t of this.cache.keys())this.isValid(t)||(this.cache.delete(t),e++);return e}}});var sm={};ye(sm,{invalidateProviderCache:()=>Dw,readProviderCache:()=>nc,writeProviderCache:()=>rc});import em from"node:fs/promises";import Rw from"node:os";import tm from"node:path";async function nc(){try{let r=await em.readFile(sc,"utf-8"),e=JSON.parse(r);return!e.timestamp||!e.detection||!e.detection.claude||!e.detection.gemini||!e.detection.codex||Ws(e.timestamp,Iw)?null:e.detection}catch{return null}}async function rc(r){let e={timestamp:new Date().toISOString(),detection:r};await de(sc,e)}async function Dw(){try{await em.unlink(sc)}catch{}}var Aw,sc,Iw,oc=S(()=>{"use strict";wn();B();Aw=tm.join(Rw.homedir(),".prjct-cli","cache"),sc=tm.join(Aw,"providers.json"),Iw=10*60*1e3;l(nc,"readProviderCache");l(rc,"writeProviderCache");l(Dw,"invalidateProviderCache")});var Nt={};ye(Nt,{AntigravityProvider:()=>ac,ClaudeProvider:()=>Bo,CodexProvider:()=>cc,CursorProvider:()=>rm,GeminiProvider:()=>ic,Providers:()=>ze,WindsurfProvider:()=>om,detectAllProviders:()=>Ps,detectAntigravity:()=>Bn,detectCodex:()=>kn,detectCursorProject:()=>cm,detectProvider:()=>Vo,detectWindsurfProject:()=>lm,getActiveProvider:()=>_w,getCapabilities:()=>Mw,getCommandsDir:()=>Gw,getGlobalContextPath:()=>Uw,getGlobalSettingsPath:()=>Hw,getProjectCommandsPath:()=>qw,getProviderBranding:()=>Jo,getSkillsPath:()=>Ww,hasProviderConfig:()=>Nw,needsCursorRouterRegeneration:()=>Lw,needsWindsurfRouterRegeneration:()=>Fw,selectProvider:()=>lc,validateCliVersion:()=>am});import Gs from"node:os";import ot from"node:path";function Mw(r,e){return{...$w[r],...e}}async function im(r){try{let{stdout:e}=await F(`which ${r}`,{timeout:2e3});return e.trim()}catch{return null}}async function Ow(r){try{let{stdout:e}=await F(`${r} --version`,{timeout:2e3}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Vo(r){let e=ze[r];if(!e.cliCommand)return{installed:!1};let t=await im(e.cliCommand);if(!t)return{installed:!1};let s=await Ow(e.cliCommand),n=am(r,s||void 0);return{installed:!0,version:s||void 0,path:t,versionWarning:n||void 0}}function am(r,e){let t=ze[r];return!t.minCliVersion||!e?null:Gd(e,t.minCliVersion)<0?`\u26A0\uFE0F ${t.displayName} v${e} is below minimum v${t.minCliVersion}. Some features may not work correctly.`:null}async function Ps(r=!1){if(!r){let i=await nc();if(i)return i}let[e,t,s]=await Promise.all([Vo("claude"),Vo("gemini"),kn()]),n={installed:s.installed},o={claude:e,gemini:t,codex:n};return await rc(o).catch(()=>{}),o}async function _w(r){if(r&&ze[r])return ze[r];let e=await Ps();return e.claude.installed&&!e.gemini.installed?Bo:e.gemini.installed&&!e.claude.installed?ic:Bo}async function Nw(r){let e=ze[r];return e.configDir?C(e.configDir):!1}function Jo(r){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",windsurf:"\u26A1 prjct + Windsurf",codex:"\u26A1 prjct + Codex"}[r]||"\u26A1 prjct"}}async function cm(r){let e=ot.join(r,".cursor"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.mdc"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Lw(r){let e=await cm(r);return e.detected&&!e.routerInstalled}async function lm(r){let e=ot.join(r,".windsurf"),t=ot.join(e,"rules"),s=ot.join(t,"prjct.md"),[n,o]=await Promise.all([C(e),C(s)]);return{detected:n,routerInstalled:o,projectRoot:n?r:void 0}}async function Fw(r){let e=await lm(r);return e.detected&&!e.routerInstalled}async function Bn(){let r=ac.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=ot.join(r,"skills","prjct","SKILL.md"),[t,s]=await Promise.all([C(r),C(e)]);return{installed:t,skillInstalled:s,configPath:t?r:void 0}}async function kn(){let r=cc.configDir;if(!r)return{installed:!1,skillInstalled:!1};let e=await im("codex"),t=ot.join(r,"skills","prjct","SKILL.md"),s=await C(t),n=!!e;return{installed:n,skillInstalled:s,configPath:n?r:void 0}}function Uw(r){let e=ze[r];return e.configDir?ot.join(e.configDir,e.contextFile):null}function Hw(r){let e=ze[r];return!e.configDir||!e.settingsFile?null:ot.join(e.configDir,e.settingsFile)}function Ww(r){return ze[r].skillsDir}function Gw(r){return ze[r].commandsDir}function qw(r,e){let t=ze[r];return ot.join(e,t.commandsDir)}async function lc(){let r=await Ps(),e=r.claude.installed,t=r.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:r}:e&&!t?{provider:"claude",userSelected:!1,detection:r}:t&&!e?{provider:"gemini",userSelected:!1,detection:r}:{provider:"claude",userSelected:!0,detection:r}}var $w,Bo,ic,ac,rm,om,cc,ze,lt=S(()=>{"use strict";so();qo();Je();B();oc();$w={full:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!0,webFetch:!0,todoTracking:!0},standard:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!0,subagents:!1,webFetch:!1,todoTracking:!1},basic:{shell:!0,fileRead:!0,fileWrite:!0,fileSearch:!0,structuredQuestions:!1,subagents:!1,webFetch:!1,todoTracking:!1}};l(Mw,"getCapabilities");Bo={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:ot.join(Gs.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:ot.join(Gs.homedir(),".claude","skills"),commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",defaultModel:"sonnet",supportedModels:["opus","sonnet","haiku"],minCliVersion:"1.0.0",capabilityTier:"full"},ic={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:ot.join(Gs.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:ot.join(Gs.homedir(),".gemini","skills"),commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",defaultModel:"2.5-flash",supportedModels:["2.5-pro","2.5-flash","2.0-flash"],minCliVersion:"1.0.0",capabilityTier:"standard"},ac={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:ot.join(Gs.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:ot.join(Gs.homedir(),".gemini","antigravity","global_skills"),commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},rm={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},om={name:"windsurf",displayName:"Windsurf IDE",cliCommand:null,configDir:null,contextFile:"prjct.md",skillsDir:null,commandsDir:".windsurf/workflows",rulesDir:".windsurf/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".windsurfignore",isProjectLevel:!0,websiteUrl:"https://windsurf.com",docsUrl:"https://docs.windsurf.com",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},cc={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:ot.join(Gs.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:ot.join(Gs.homedir(),".codex","skills"),commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",defaultModel:null,supportedModels:[],minCliVersion:null,capabilityTier:"basic"},ze={claude:Bo,gemini:ic,cursor:rm,antigravity:ac,windsurf:om,codex:cc};l(im,"whichCommand");l(Ow,"getCliVersion");l(Vo,"detectProvider");l(am,"validateCliVersion");l(Ps,"detectAllProviders");l(_w,"getActiveProvider");l(Nw,"hasProviderConfig");l(Jo,"getProviderBranding");l(cm,"detectCursorProject");l(Lw,"needsCursorRouterRegeneration");l(lm,"detectWindsurfProject");l(Fw,"needsWindsurfRouterRegeneration");l(Bn,"detectAntigravity");l(kn,"detectCodex");l(Uw,"getGlobalContextPath");l(Hw,"getGlobalSettingsPath");l(Ww,"getSkillsPath");l(Gw,"getCommandsDir");l(qw,"getProjectCommandsPath");l(lc,"selectProvider")});import{z as De}from"zod";function Bw(r){return r instanceof Vn}function we(r){return Bw(r)||r instanceof Error?r.message:typeof r=="string"?r:"Unknown error"}var Jn,Ex,Cx,Px,xx,jx,Rx,Vn,zo,Xo,no,xs=S(()=>{"use strict";Jn={create(r,e){class t extends Error{static{l(this,"TypedError")}errorName;data;isOperational=!0;constructor(n){let o=e.parse(n);super(`${r}: ${JSON.stringify(o)}`),this.name=r,this.errorName=r,this.data=o,Error.captureStackTrace?.(this,this.constructor)}static throw(n){throw new t(n)}static is(n){return n instanceof t&&n.errorName===r}static create(n){return new t(n)}}return t}},Ex=Jn.create("FileError",De.object({path:De.string(),operation:De.enum(["read","write","delete","create","copy"]),reason:De.string().optional()})),Cx=Jn.create("ValidationError",De.object({field:De.string(),expected:De.string(),received:De.string().optional(),message:De.string().optional()})),Px=Jn.create("PermissionError",De.object({action:De.string(),resource:De.string(),reason:De.string().optional()})),xx=Jn.create("TaskError",De.object({taskId:De.string().optional(),operation:De.enum(["create","update","complete","pause","resume","delete"]),reason:De.string()})),jx=Jn.create("SessionError",De.object({sessionId:De.string().optional(),reason:De.string()})),Rx=Jn.create("SyncError",De.object({projectId:De.string().optional(),operation:De.enum(["push","pull","auth","connect"]),reason:De.string()})),Vn=class extends Error{static{l(this,"PrjctError")}code;isOperational;constructor(e,t="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=t,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},zo=class r extends Vn{static{l(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new r("Project not initialized. Run /p:init first.","PROJECT_NOT_INIT")}static notFound(e){return new r(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new r(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Xo=class r extends Vn{static{l(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new r(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new r(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},no=class r extends Vn{static{l(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new r(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new r(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};l(Bw,"isPrjctError");l(we,"getErrorMessage")});import{formatDistanceToNowStrict as $x}from"date-fns";function um(r){let e=r.getFullYear(),t=(r.getMonth()+1).toString().padStart(2,"0"),s=r.getDate().toString().padStart(2,"0");return`${e}-${t}-${s}`}function dm(r){return{year:r.getFullYear().toString(),month:(r.getMonth()+1).toString().padStart(2,"0"),day:r.getDate().toString().padStart(2,"0")}}function v(){return new Date().toISOString()}function qs(r){let e=new Date;return e.setDate(e.getDate()-r),e}function xt(r){let e=Math.floor(r/1e3),t=Math.floor(e/60),s=Math.floor(t/60),n=Math.floor(s/24);return n>0?`${n}d ${s%24}h`:s>0?`${s}h ${t%60}m`:t>0?`${t}m`:`${e}s`}function js(r,e=new Date){let t=e.getTime()-r.getTime();return xt(t)}function zn(r){let e=r.match(/^([+-])(\d+)([mh])$/);if(!e)return 0;let t=e[1]==="-"?-1:1,s=Number.parseInt(e[2],10),n=e[3];return t*(n==="h"?s*60:s)}function Lt(r){let e=0,t=r.match(/(\d+)h/);t&&(e+=Number.parseInt(t[1],10)*60);let s=r.match(/(\d+)m/);return s&&(e+=Number.parseInt(s[1],10)),r.match(/(\d+)s/)&&e===0&&(e=1),e}var K=S(()=>{"use strict";l(um,"formatDate");l(dm,"getYearMonthDay");l(v,"getTimestamp");l(qs,"getDaysAgo");l(xt,"formatDuration");l(js,"calculateDuration");l(zn,"parseVarianceMinutes");l(Lt,"parseDurationMinutes")});var Kn={};ye(Kn,{PACKAGE_ROOT:()=>jt,VERSION:()=>ke,compareVersions:()=>mm,getPackageInfo:()=>Vw,getPackageRoot:()=>dc,getVersion:()=>Sn,isCompatible:()=>Jw,needsMigration:()=>zw,resetPackageRoot:()=>mc});import uc from"node:fs";import Ko from"node:path";function dc(){if(Xn)return Xn;let r=__dirname;for(let e=0;e<5;e++){let t=Ko.join(r,"package.json");if(uc.existsSync(t))try{if(JSON.parse(uc.readFileSync(t,"utf-8")).name==="prjct-cli")return Xn=r,r}catch{}r=Ko.dirname(r)}return Xn=Ko.join(__dirname,"..","..",".."),Xn}function Sn(){if(ro)return ro;try{let r=Ko.join(dc(),"package.json"),e=JSON.parse(uc.readFileSync(r,"utf-8"));return ro=e.version,Yo=e,ro}catch(r){return console.error("Failed to read version from package.json:",k(r)),"0.0.0"}}function Vw(){return Yo||Sn(),Yo}function mm(r,e){let t=r.split(".").map(Number),s=e.split(".").map(Number);for(let n=0;n<Math.max(t.length,s.length);n++){let o=t[n]||0,i=s[n]||0;if(o>i)return 1;if(o<i)return-1}return 0}function Jw(r){let e=Sn(),[t,s]=e.split(".").map(Number),[n,o]=r.split(".").map(Number);return t===n&&s===o}function zw(r,e=null){let t=e||Sn();return mm(r,t)<0}function mc(r){Xn=r,ro=null,Yo=null}var ro,Yo,Xn,ke,jt,ut=S(()=>{"use strict";W();ro=null,Yo=null,Xn=null;l(dc,"getPackageRoot");l(Sn,"getVersion");l(Vw,"getPackageInfo");l(mm,"compareVersions");l(Jw,"isCompatible");l(zw,"needsMigration");l(mc,"resetPackageRoot");ke=Sn(),jt=dc()});async function Qo(r){try{let{stdout:e}=await F(r,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function Xw(){let r=await Qo("gh api user --jq .login");return r.success&&r.output||(r=await Qo("git config --global github.user"),r.success&&r.output)?r.output:null}async function Kw(){let r=await Qo("git config user.name");return r.success&&r.output?r.output:null}async function Yw(){let r=await Qo("git config user.email");return r.success&&r.output?r.output:null}async function Yn(){let[r,e,t]=await Promise.all([Xw(),Kw(),Yw()]);return{github:r,email:t,name:e||r||"Unknown"}}var Zo=S(()=>{"use strict";Je();l(Qo,"execCommand");l(Xw,"detectGitHubUsername");l(Kw,"detectGitName");l(Yw,"detectGitEmail");l(Yn,"detect")});import Qw from"node:crypto";import ms from"node:fs/promises";import gc from"node:os";import z from"node:path";import{globSync as Zw}from"glob";var fc,ek,A,ve=S(()=>{"use strict";K();B();fc=class{static{l(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?z.resolve(e):z.join(gc.homedir(),".prjct-cli"),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=z.resolve(e),this.globalProjectsDir=z.join(this.globalBaseDir,"projects"),this.globalConfigDir=z.join(this.globalBaseDir,"config")}generateProjectId(e){return Qw.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return z.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return z.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return z.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return z.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Kt(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await C(t)}async ensureGlobalStructure(){await rt(this.globalBaseDir),await rt(this.globalProjectsDir),await rt(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),s=["core","progress","planning","analysis","memory"];for(let n of s)await rt(z.join(t,n));return await rt(z.join(t,"planning","tasks")),await rt(z.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:s,month:n,day:o}=dm(t);return z.join(this.getGlobalProjectPath(e),"sessions",s,n,o)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let s=this.getSessionPath(e,t);return await rt(s),s}async listSessions(e,t=null,s=null){let n=z.join(this.getGlobalProjectPath(e),"sessions"),o=[];try{let i=await ms.readdir(n,{withFileTypes:!0});for(let a of i){if(!a.isDirectory()||t&&a.name!==t.toString())continue;let c=z.join(n,a.name),u=await ms.readdir(c,{withFileTypes:!0});for(let d of u){if(!d.isDirectory()||s&&d.name!==s.toString().padStart(2,"0"))continue;let p=z.join(c,d.name),m=await ms.readdir(p,{withFileTypes:!0});for(let g of m)g.isDirectory()&&o.push({year:a.name,month:d.name,day:g.name,path:z.join(p,g.name),date:new Date(`${a.name}-${d.name}-${g.name}`)})}}return o.sort((a,c)=>c.date.getTime()-a.date.getTime()),o}catch{return[]}}async getSessionsInRange(e,t,s=new Date){return(await this.listSessions(e)).filter(o=>o.date>=t&&o.date<=s)}getFilePath(e,t,s){return z.join(this.getGlobalProjectPath(e),t,s)}async listProjects(){try{return await this.ensureGlobalStructure(),(await ms.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name)}catch{return[]}}async projectExists(e){let t=this.getGlobalProjectPath(e);return await Kt(t)}getDisplayPath(e){let t=gc.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return z.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return z.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return z.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return z.join(this.globalBaseDir,".running")}getDocsPath(){return z.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(lt(),bt(Nt)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(lt(),bt(Nt)).getActiveProvider();return(lt(),bt(Nt)).getGlobalSettingsPath(e.name)}getClaudeDir(){return z.join(gc.homedir(),".claude")}getClaudeSettingsPath(){return z.join(this.getClaudeDir(),"settings.json")}getStoragePath(e,t){return z.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return z.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},s=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let n of s){let o=z.join(e,n.file);if(await C(o)){t.isMonorepo=!0,t.type=n.type;break}}if(!t.isMonorepo){let n=z.join(e,"package.json");if(await C(n))try{let o=await ms.readFile(n,"utf-8");JSON.parse(o).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await this.discoverMonorepoPackages(e,t.type)),t}async discoverMonorepoPackages(e,t){let s=[],n=[];try{if(t==="pnpm"){let i=(await ms.readFile(z.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);i&&(n=i[1].split(`
@@ -481,7 +481,7 @@ var Zy=Object.create;var Zr=Object.defineProperty;var ew=Object.getOwnPropertyDe
481
481
  name TEXT NOT NULL,
482
482
  applied_at TEXT NOT NULL
483
483
  )
484
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of ik)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new ni,N=E});import{z as J}from"zod";var ck,lk,Sm,uk,dk,mk,pk,gk,bm,Sj,vm=S(()=>{"use strict";ck=J.enum(["low","medium","high"]),lk=J.enum(["pending","converted","completed","archived","dormant"]),Sm=J.enum(["high","medium","low"]),uk=J.object({impact:Sm,effort:Sm}),dk=J.object({frontend:J.string().optional(),backend:J.string().optional(),payments:J.string().optional(),ai:J.string().optional(),deploy:J.string().optional(),other:J.array(J.string()).optional()}),mk=J.object({name:J.string(),description:J.string()}),pk=J.object({name:J.string(),description:J.string().optional()}),gk=J.object({id:J.string(),text:J.string(),details:J.string().optional(),priority:ck,status:lk,tags:J.array(J.string()),addedAt:J.string(),completedAt:J.string().optional(),convertedTo:J.string().optional(),source:J.string().optional(),sourceFiles:J.array(J.string()).optional(),painPoints:J.array(J.string()).optional(),solutions:J.array(J.string()).optional(),filesAffected:J.array(J.string()).optional(),impactEffort:uk.optional(),implementationNotes:J.string().optional(),stack:dk.optional(),modules:J.array(mk).optional(),roles:J.array(pk).optional(),risks:J.array(J.string()).optional(),risksCount:J.number().optional()}),bm=J.object({ideas:J.array(gk),lastUpdated:J.string()}),Sj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import fk from"node:crypto";import{homedir as hk}from"node:os";import{join as yk}from"node:path";function Z(){return fk.randomUUID()}var Pj,Ut=S(()=>{"use strict";l(Z,"generateUUID");Pj=yk(hk(),".prjct-cli","projects")});var Rs,Tc,Rt,Bs=S(()=>{"use strict";Ut();K();ee();Rs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Tc=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Z(),n=v();return E.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return E.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Z(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?E.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):E.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=E.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=E.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(E.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);E.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return E.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Rt=new Tc});var Ec,Vs,Cc=S(()=>{"use strict";ve();K();B();Ec=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Ae(t,[])??[];s.push(e),await de(t,s)}async getPending(e){let t=A.getSyncPendingPath(e);return await Ae(t,[])??[]}async clearPending(e){let t=A.getSyncPendingPath(e);await de(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:v(),success:!0};await de(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ae(t,null)}},Vs=new Ec});var dt,As=S(()=>{"use strict";Cc();wn();K();ee();dt=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new qn({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=E.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){E.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await Vs.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return E.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Pc,$e,Js=S(()=>{"use strict";vm();Ut();K();Bs();As();Pc=class extends dt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",bm)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:Z(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:v()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=qs(Rs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},$e=new Pc});import{z as P}from"zod";var wk,oi,kk,Sk,bk,xc,Em,Cm,Pm,jc,Tm,vk,Tk,Ek,xm,jm,Rm,Ck,Pk,Zj,Rc=S(()=>{"use strict";qo();wk=P.enum(["low","medium","high","critical"]),oi=P.enum(["feature","bug","improvement","chore"]),kk=P.enum(["active","backlog","previously_active"]),Sk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),bk=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),xc=P.object({title:P.string(),description:P.string(),filesChanged:P.array(P.object({path:P.string(),action:P.enum(["created","modified","deleted"])})),whatWasDone:P.array(P.string()).min(1),outputForNextAgent:P.string().min(1),notes:P.string().optional()}),Em=P.object({output:P.string().min(1,"Subtask output is required"),summary:xc}),Cm=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:Sk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:xc.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),Pm=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),jc=P.object({id:P.string(),description:P.string(),type:oi.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(Cm).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Pm.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:Gn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional(),parentDescription:P.string().optional(),branch:P.string().optional(),prUrl:P.string().optional()}),Tm=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:oi.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(Cm).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Pm.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:Gn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),vk=P.object({stackConfirmed:P.array(P.string()).optional(),patternsDiscovered:P.array(P.string()).optional(),agentAccuracy:P.array(P.object({agent:P.string(),rating:P.enum(["helpful","neutral","inaccurate"]),note:P.string().optional()})).optional(),issuesEncountered:P.array(P.string()).optional()}),Tk=P.object({taskId:P.string(),title:P.string(),classification:oi,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(xc),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:vk.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),Ek=jc.extend({workspaceId:P.string(),worktreePath:P.string().optional(),agentSessionId:P.string().optional(),jiraId:P.string().optional(),jiraUuid:P.string().optional(),dispatchedFrom:P.string().optional()}),xm=P.object({currentTask:jc.nullable(),previousTask:Tm.nullable().optional(),pausedTasks:P.array(Tm).optional(),taskHistory:P.array(Tk).optional(),activeTasks:P.array(Ek).optional(),lastUpdated:P.string()}),jm=P.object({id:P.string(),description:P.string(),body:P.string().optional(),priority:wk,type:oi,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:kk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Rm=P.object({tasks:P.array(jm),lastUpdated:P.string()}),Ck=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),Pk=P.object({type:bk,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),Zj=P.object({projectId:P.string(),currentTask:jc.nullable(),queue:P.array(jm),stats:Ck,recentActivity:P.array(Pk),lastSync:P.string()})});function ii(r){return[...r].sort((e,t)=>{let s=Im[e.section]-Im[t.section];return s!==0?s:Am[e.priority]-Am[t.priority]})}function Ac(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Am,Im,ai=S(()=>{"use strict";Am={critical:0,high:1,medium:2,low:3},Im={active:0,previously_active:1,backlog:2};l(ii,"sortBySectionAndPriority");l(Ac,"uniqueBy")});var Ic,ce,Vt=S(()=>{"use strict";Ut();Rc();ai();K();Bs();As();Ic=class extends dt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Rm)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return ii(t)[0]||null}async addTask(e,t){let s={...t,id:Z(),createdAt:v(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:v()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=v(),n=t.map(o=>({...o,id:Z(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async getTask(e,t){return(await this.read(e)).tasks.find(n=>n.id===t)||null}async updateTask(e,t,s){let n=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(n={...i,...s},n):i),lastUpdated:v()})),n&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),n}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=qs(Rs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},ce=new Ic});import{z as re}from"zod";var xk,Dm,jk,Rk,Ak,Ik,Dk,$k,Mk,$m,Mm=S(()=>{"use strict";xk=re.enum(["feature","fix","improvement","refactor"]),Dm=re.enum(["pass","warning","fail","skipped"]),jk=re.enum(["added","changed","fixed","removed"]),Rk=re.object({hours:re.number(),minutes:re.number(),totalMinutes:re.number()}),Ak=re.object({filesChanged:re.number().nullable().optional(),linesAdded:re.number().nullable().optional(),linesRemoved:re.number().nullable().optional(),commits:re.number().nullable().optional()}),Ik=re.object({description:re.string(),type:jk.optional()}),Dk=re.object({lintStatus:Dm.nullable().optional(),lintDetails:re.string().optional(),testStatus:Dm.nullable().optional(),testDetails:re.string().optional()}),$k=re.object({hash:re.string().optional(),message:re.string().optional(),branch:re.string().optional()}),Mk=re.object({id:re.string(),name:re.string(),version:re.string().nullable().optional(),type:xk,agent:re.string().optional(),description:re.string().optional(),changes:re.array(Ik).optional(),codeSnippets:re.array(re.string()).optional(),commit:$k.optional(),codeMetrics:Ak.optional(),qualityMetrics:Dk.optional(),quantitativeImpact:re.string().optional(),duration:Rk.optional(),tasksCompleted:re.number().nullable().optional(),shippedAt:re.string(),featureId:re.string().optional()}),$m=re.object({shipped:re.array(Mk),lastUpdated:re.string()})});var Dc,it,zs=S(()=>{"use strict";Ut();Mm();K();Bs();As();Dc=class extends dt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",$m)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Z(),shippedAt:v()};return await this.update(e,n=>({shipped:[s,...n.shipped],lastUpdated:v()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-7*24*60*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=qs(Rs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},it=new Dc});var ao,$c,bn,Mc=S(()=>{"use strict";ao={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},$c=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=ao[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return ao[e]}getPrompt(e){return ao[e].prompt}getValidCommands(e){return ao[e].transitions}formatNextSteps(e){return ao[e].transitions.map(s=>{switch(s){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${s}`}})}},bn=new $c});var Oc,L,vt=S(()=>{"use strict";Ut();Rc();K();Mc();Bs();As();Oc=class extends dt{static{l(this,"StateStorage")}constructor(){super("state.json",xm)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=bn.getCurrentState(e),n=bn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:v(),sessionId:i.sessionId??Z()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}getPausedTasksFromState(e){return e.pausedTasks&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Rt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:v()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:v()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:v()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=v(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:v()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:v()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=Em.safeParse(t);if(!s.success){let w=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
484
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(s=>s.version));for(let s of ik)t.has(s.version)||e.transaction(()=>{s.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(s.version,s.name,new Date().toISOString())})()}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new ni,N=E});import{z as J}from"zod";var ck,lk,Sm,uk,dk,mk,pk,gk,bm,Sj,vm=S(()=>{"use strict";ck=J.enum(["low","medium","high"]),lk=J.enum(["pending","converted","completed","archived","dormant"]),Sm=J.enum(["high","medium","low"]),uk=J.object({impact:Sm,effort:Sm}),dk=J.object({frontend:J.string().optional(),backend:J.string().optional(),payments:J.string().optional(),ai:J.string().optional(),deploy:J.string().optional(),other:J.array(J.string()).optional()}),mk=J.object({name:J.string(),description:J.string()}),pk=J.object({name:J.string(),description:J.string().optional()}),gk=J.object({id:J.string(),text:J.string(),details:J.string().optional(),priority:ck,status:lk,tags:J.array(J.string()),addedAt:J.string(),completedAt:J.string().optional(),convertedTo:J.string().optional(),source:J.string().optional(),sourceFiles:J.array(J.string()).optional(),painPoints:J.array(J.string()).optional(),solutions:J.array(J.string()).optional(),filesAffected:J.array(J.string()).optional(),impactEffort:uk.optional(),implementationNotes:J.string().optional(),stack:dk.optional(),modules:J.array(mk).optional(),roles:J.array(pk).optional(),risks:J.array(J.string()).optional(),risksCount:J.number().optional()}),bm=J.object({ideas:J.array(gk),lastUpdated:J.string()}),Sj={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()}});import fk from"node:crypto";import{homedir as hk}from"node:os";import{join as yk}from"node:path";function Z(){return fk.randomUUID()}var Pj,Ut=S(()=>{"use strict";l(Z,"generateUUID");Pj=yk(hk(),".prjct-cli","projects")});var Rs,Tc,Rt,Bs=S(()=>{"use strict";Ut();K();ee();Rs={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},Tc=class{static{l(this,"ArchiveStorage")}archive(e,t){let s=Z(),n=v();return E.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",s,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,n,t.reason),s}archiveMany(e,t){if(t.length===0)return 0;let s=v();return E.transaction(e,n=>{let o=n.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(Z(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,s,i.reason)}),t.length}getArchived(e,t,s=50){return t?E.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,s):E.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",s)}getStats(e){let t=E.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),s={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of t){let o=n.entity_type;o in s&&(s[o]=n.count),s.total+=n.count}return s}restore(e,t){let s=E.get(e,"SELECT * FROM archives WHERE id = ?",t);return s?(E.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(s.entity_data)):null}pruneOldArchives(e,t){let s=new Date(Date.now()-t*24*60*60*1e3).toISOString(),n=this.getTotalCount(e);E.run(e,"DELETE FROM archives WHERE archived_at < ?",s);let o=this.getTotalCount(e);return n-o}getTotalCount(e){return E.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Rt=new Tc});var Ec,Vs,Cc=S(()=>{"use strict";ve();K();B();Ec=class{static{l(this,"SyncEventBus")}async publish(e){let t=A.getSyncPendingPath(e.projectId),s=await Ae(t,[])??[],n=Array.isArray(s)?s:[];n.push(e),await de(t,n)}async getPending(e){let t=A.getSyncPendingPath(e),s=await Ae(t,[])??[];return Array.isArray(s)?s:[]}async clearPending(e){let t=A.getSyncPendingPath(e);await de(t,[])}async updateLastSync(e){let t=A.getLastSyncPath(e),s={timestamp:v(),success:!0};await de(t,s)}async getLastSync(e){let t=A.getLastSyncPath(e);return await Ae(t,null)}},Vs=new Ec});var dt,As=S(()=>{"use strict";Cc();wn();K();ee();dt=class{static{l(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new qn({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){let t=this.cache.get(e);if(t!==null)return t;try{let s=E.getDoc(e,this.getStoreKey());if(s!==null)return this.cache.set(e,s),s}catch{}return this.getDefault()}async write(e,t){E.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let s=await this.read(e),n=t(s);return await this.write(e,n),n}async publishEvent(e,t,s){let n={type:t,path:[this.filename.replace(".json","")],data:s,timestamp:v(),projectId:e};await Vs.publish(n)}async publishEntityEvent(e,t,s,n){let o=`${t}.${s}`,i={...n,timestamp:v()};await this.publishEvent(e,o,i)}async exists(e){try{return E.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}}});var Pc,$e,Js=S(()=>{"use strict";vm();Ut();K();Bs();As();Pc=class extends dt{static{l(this,"IdeasStorage")}constructor(){super("ideas.json",bm)}getDefault(){return{ideas:[],lastUpdated:""}}getEventType(e){return`ideas.${e}d`}async getAll(e){return(await this.read(e)).ideas}async getPending(e){return(await this.read(e)).ideas.filter(s=>s.status==="pending")}async addIdea(e,t,s={}){let n={id:Z(),text:t,status:"pending",priority:s.priority||"medium",tags:s.tags||[],addedAt:v()};return await this.update(e,o=>({ideas:[n,...o.ideas],lastUpdated:v()})),await this.publishEvent(e,"idea.created",{ideaId:n.id,text:n.text,priority:n.priority}),n}async getById(e,t){return(await this.read(e)).ideas.find(n=>n.id===t)}async convertToFeature(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,status:"converted",convertedTo:s}:o),lastUpdated:v()})),await this.publishEvent(e,"idea.converted",{ideaId:t,featureId:s})}async archive(e,t){await this.update(e,s=>({ideas:s.ideas.map(n=>n.id===t?{...n,status:"archived"}:n),lastUpdated:v()})),await this.publishEvent(e,"idea.archived",{ideaId:t})}async setPriority(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async addTags(e,t,s){await this.update(e,n=>({ideas:n.ideas.map(o=>o.id===t?{...o,tags:[...new Set([...o.tags,...s])]}:o),lastUpdated:v()}))}async removeIdea(e,t){await this.update(e,s=>({ideas:s.ideas.filter(n=>n.id!==t),lastUpdated:v()}))}async getCounts(e){let t=await this.read(e);return{pending:t.ideas.filter(s=>s.status==="pending").length,converted:t.ideas.filter(s=>s.status==="converted").length,archived:t.ideas.filter(s=>s.status==="archived").length}}async cleanup(e){let s=(await this.read(e)).ideas.filter(a=>a.status==="archived");if(s.length<=50)return{removed:0};let n=s.sort((a,c)=>new Date(c.addedAt).getTime()-new Date(a.addedAt).getTime()),o=new Set(n.slice(50).map(a=>a.id)),i=o.size;return await this.update(e,a=>({ideas:a.ideas.filter(c=>!o.has(c.id)),lastUpdated:v()})),{removed:i}}async markDormantIdeas(e){let t=await this.read(e),s=qs(Rs.IDEA_DORMANT_DAYS),n=t.ideas.filter(i=>i.status==="pending"&&new Date(i.addedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"idea",entityId:i.id,entityData:i,summary:i.text,reason:"dormant"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({ideas:i.ideas.map(a=>o.has(a.id)?{...a,status:"dormant"}:a),lastUpdated:v()})),await this.publishEvent(e,"ideas.dormant",{count:n.length}),n.length}},$e=new Pc});import{z as P}from"zod";var wk,oi,kk,Sk,bk,xc,Em,Cm,Pm,jc,Tm,vk,Tk,Ek,xm,jm,Rm,Ck,Pk,Zj,Rc=S(()=>{"use strict";qo();wk=P.enum(["low","medium","high","critical"]),oi=P.enum(["feature","bug","improvement","chore"]),kk=P.enum(["active","backlog","previously_active"]),Sk=P.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),bk=P.enum(["task_completed","feature_shipped","idea_captured","session_started"]),xc=P.object({title:P.string(),description:P.string(),filesChanged:P.array(P.object({path:P.string(),action:P.enum(["created","modified","deleted"])})),whatWasDone:P.array(P.string()).min(1),outputForNextAgent:P.string().min(1),notes:P.string().optional()}),Em=P.object({output:P.string().min(1,"Subtask output is required"),summary:xc}),Cm=P.object({id:P.string(),description:P.string(),domain:P.string(),agent:P.string(),status:Sk,dependsOn:P.array(P.string()),startedAt:P.string().optional(),completedAt:P.string().optional(),output:P.string().optional(),summary:xc.optional(),skipReason:P.string().optional(),blockReason:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional()}),Pm=P.object({completed:P.number(),total:P.number(),percentage:P.number()}),jc=P.object({id:P.string(),description:P.string(),type:oi.optional(),startedAt:P.string(),sessionId:P.string(),featureId:P.string().optional(),subtasks:P.array(Cm).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Pm.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:Gn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional(),parentDescription:P.string().optional(),branch:P.string().optional(),prUrl:P.string().optional()}),Tm=P.object({id:P.string(),description:P.string(),status:P.literal("paused"),startedAt:P.string(),pausedAt:P.string(),pauseReason:P.string().optional(),type:oi.optional(),sessionId:P.string().optional(),featureId:P.string().optional(),subtasks:P.array(Cm).optional(),currentSubtaskIndex:P.number().optional(),subtaskProgress:Pm.optional(),linearId:P.string().optional(),linearUuid:P.string().optional(),estimatedPoints:P.number().optional(),estimatedMinutes:P.number().optional(),modelMetadata:Gn.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),vk=P.object({stackConfirmed:P.array(P.string()).optional(),patternsDiscovered:P.array(P.string()).optional(),agentAccuracy:P.array(P.object({agent:P.string(),rating:P.enum(["helpful","neutral","inaccurate"]),note:P.string().optional()})).optional(),issuesEncountered:P.array(P.string()).optional()}),Tk=P.object({taskId:P.string(),title:P.string(),classification:oi,startedAt:P.string(),completedAt:P.string(),subtaskCount:P.number(),subtaskSummaries:P.array(xc),outcome:P.string(),branchName:P.string(),linearId:P.string().optional(),linearUuid:P.string().optional(),prUrl:P.string().optional(),feedback:vk.optional(),tokensIn:P.number().optional(),tokensOut:P.number().optional()}),Ek=jc.extend({workspaceId:P.string(),worktreePath:P.string().optional(),agentSessionId:P.string().optional(),jiraId:P.string().optional(),jiraUuid:P.string().optional(),dispatchedFrom:P.string().optional()}),xm=P.object({currentTask:jc.nullable(),previousTask:Tm.nullable().optional(),pausedTasks:P.array(Tm).optional(),taskHistory:P.array(Tk).optional(),activeTasks:P.array(Ek).optional(),lastUpdated:P.string()}),jm=P.object({id:P.string(),description:P.string(),body:P.string().optional(),priority:wk,type:oi,featureId:P.string().optional(),originFeature:P.string().optional(),completed:P.boolean(),completedAt:P.string().optional(),createdAt:P.string(),section:kk,agent:P.string().optional(),groupName:P.string().optional(),groupId:P.string().optional()}),Rm=P.object({tasks:P.array(jm),lastUpdated:P.string()}),Ck=P.object({tasksToday:P.number(),tasksThisWeek:P.number(),streak:P.number(),velocity:P.string(),avgDuration:P.string()}),Pk=P.object({type:bk,description:P.string(),timestamp:P.string(),duration:P.string().optional()}),Zj=P.object({projectId:P.string(),currentTask:jc.nullable(),queue:P.array(jm),stats:Ck,recentActivity:P.array(Pk),lastSync:P.string()})});function ii(r){return[...r].sort((e,t)=>{let s=Im[e.section]-Im[t.section];return s!==0?s:Am[e.priority]-Am[t.priority]})}function Ac(r,e){let t=new Set;return r.filter(s=>{let n=e(s);return t.has(n)?!1:(t.add(n),!0)})}var Am,Im,ai=S(()=>{"use strict";Am={critical:0,high:1,medium:2,low:3},Im={active:0,previously_active:1,backlog:2};l(ii,"sortBySectionAndPriority");l(Ac,"uniqueBy")});var Ic,ce,Vt=S(()=>{"use strict";Ut();Rc();ai();K();Bs();As();Ic=class extends dt{static{l(this,"QueueStorage")}constructor(){super("queue.json",Rm)}getDefault(){return{tasks:[],lastUpdated:""}}getEventType(e){return`queue.${e}d`}async getTasks(e){return(await this.read(e)).tasks}async getActiveTasks(e){return(await this.read(e)).tasks.filter(s=>s.section==="active"&&!s.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(s=>s.section==="backlog"&&!s.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return ii(t)[0]||null}async addTask(e,t){let s={...t,id:Z(),createdAt:v(),completed:!1};return await this.update(e,n=>({tasks:[...n.tasks,s],lastUpdated:v()})),await this.publishEvent(e,"queue.task_added",{taskId:s.id,description:s.description,priority:s.priority,section:s.section}),s}async addTasks(e,t){let s=v(),n=t.map(o=>({...o,id:Z(),createdAt:s,completed:!1}));return await this.update(e,o=>({tasks:[...o.tasks,...n],lastUpdated:s})),await this.publishEvent(e,"queue.tasks_added",{count:n.length,tasks:n.map(o=>({id:o.id,description:o.description}))}),n}async removeTask(e,t){await this.update(e,s=>({tasks:s.tasks.filter(n=>n.id!==t),lastUpdated:v()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let s=null;if(await this.update(e,n=>({tasks:n.tasks.map(i=>i.id===t?(s={...i,completed:!0,completedAt:v()},s):i),lastUpdated:v()})),s){let n=s;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:n.description,completedAt:n.completedAt})}return s}async moveToSection(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,section:s}:o),lastUpdated:v()}))}async setPriority(e,t,s){await this.update(e,n=>({tasks:n.tasks.map(o=>o.id===t?{...o,priority:s}:o),lastUpdated:v()}))}async getTask(e,t){return(await this.read(e)).tasks.find(n=>n.id===t)||null}async updateTask(e,t,s){let n=null;return await this.update(e,o=>({tasks:o.tasks.map(i=>i.id===t?(n={...i,...s},n):i),lastUpdated:v()})),n&&await this.publishEvent(e,"queue.task_updated",{taskId:t}),n}async clearCompleted(e){let s=(await this.read(e)).tasks.filter(n=>n.completed).length;return await this.update(e,n=>({tasks:n.tasks.filter(o=>!o.completed),lastUpdated:v()})),s}async removeStaleCompleted(e){let t=await this.read(e),s=qs(Rs.QUEUE_COMPLETED_DAYS),n=t.tasks.filter(i=>i.completed&&i.completedAt&&new Date(i.completedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"queue_task",entityId:i.id,entityData:i,summary:i.description,reason:"age"})));let o=new Set(n.map(i=>i.id));return await this.update(e,i=>({tasks:i.tasks.filter(a=>!o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"queue.stale_removed",{count:n.length}),n.length}},ce=new Ic});import{z as re}from"zod";var xk,Dm,jk,Rk,Ak,Ik,Dk,$k,Mk,$m,Mm=S(()=>{"use strict";xk=re.enum(["feature","fix","improvement","refactor"]),Dm=re.enum(["pass","warning","fail","skipped"]),jk=re.enum(["added","changed","fixed","removed"]),Rk=re.object({hours:re.number(),minutes:re.number(),totalMinutes:re.number()}),Ak=re.object({filesChanged:re.number().nullable().optional(),linesAdded:re.number().nullable().optional(),linesRemoved:re.number().nullable().optional(),commits:re.number().nullable().optional()}),Ik=re.object({description:re.string(),type:jk.optional()}),Dk=re.object({lintStatus:Dm.nullable().optional(),lintDetails:re.string().optional(),testStatus:Dm.nullable().optional(),testDetails:re.string().optional()}),$k=re.object({hash:re.string().optional(),message:re.string().optional(),branch:re.string().optional()}),Mk=re.object({id:re.string(),name:re.string(),version:re.string().nullable().optional(),type:xk,agent:re.string().optional(),description:re.string().optional(),changes:re.array(Ik).optional(),codeSnippets:re.array(re.string()).optional(),commit:$k.optional(),codeMetrics:Ak.optional(),qualityMetrics:Dk.optional(),quantitativeImpact:re.string().optional(),duration:Rk.optional(),tasksCompleted:re.number().nullable().optional(),shippedAt:re.string(),featureId:re.string().optional()}),$m=re.object({shipped:re.array(Mk),lastUpdated:re.string()})});var Dc,it,zs=S(()=>{"use strict";Ut();Mm();K();Bs();As();Dc=class extends dt{static{l(this,"ShippedStorage")}constructor(){super("shipped.json",$m)}getDefault(){return{shipped:[],lastUpdated:""}}getEventType(e){return`shipped.${e}d`}async getAll(e){return(await this.read(e)).shipped}async getRecent(e,t=5){return(await this.read(e)).shipped.sort((n,o)=>new Date(o.shippedAt).getTime()-new Date(n.shippedAt).getTime()).slice(0,t)}async addShipped(e,t){let s={...t,id:Z(),shippedAt:v()};return await this.update(e,n=>({shipped:[s,...Array.isArray(n.shipped)?n.shipped:[]],lastUpdated:v()})),await this.publishEvent(e,"feature.shipped",{shipId:s.id,name:s.name,version:s.version,shippedAt:s.shippedAt}),s}async getByVersion(e,t){return(await this.read(e)).shipped.find(n=>n.version===t)}async getCount(e){return(await this.read(e)).shipped.length}async getByDateRange(e,t,s){return(await this.read(e)).shipped.filter(o=>{let i=new Date(o.shippedAt);return i>=t&&i<=s})}async getStats(e,t="month"){let s=new Date,n;switch(t){case"week":n=new Date(s.getTime()-7*24*60*60*1e3);break;case"month":n=new Date(s.getFullYear(),s.getMonth(),1);break;case"year":n=new Date(s.getFullYear(),0,1);break}return{count:(await this.getByDateRange(e,n,s)).length,period:t}}async archiveOldShipped(e){let t=await this.read(e),s=qs(Rs.SHIPPED_RETENTION_DAYS),n=t.shipped.filter(i=>new Date(i.shippedAt)<s);if(n.length===0)return 0;Rt.archiveMany(e,n.map(i=>({entityType:"shipped",entityId:i.id,entityData:i,summary:`${i.name} v${i.version}`,reason:"age"})));let o=new Set(t.shipped.filter(i=>new Date(i.shippedAt)>=s).map(i=>i.id));return await this.update(e,i=>({shipped:i.shipped.filter(a=>o.has(a.id)),lastUpdated:v()})),await this.publishEvent(e,"shipped.archived",{count:n.length,oldestShippedAt:n[n.length-1]?.shippedAt}),n.length}},it=new Dc});var ao,$c,bn,Mc=S(()=>{"use strict";ao={idle:{transitions:["task","next"],prompt:"p. task <description> Start working",description:"No active task"},working:{transitions:["done","pause"],prompt:"p. done Complete task | p. pause Switch context",description:"Task in progress"},paused:{transitions:["resume","task","ship"],prompt:"p. resume Continue | p. task <new> Start different | p. ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","next","pause","reopen"],prompt:"p. ship Ship it | p. task <next> Start next | p. reopen Reopen for rework",description:"Task completed"},shipped:{transitions:["task","next"],prompt:"p. task <description> Start new task",description:"Feature shipped"}},$c=class{static{l(this,"WorkflowStateMachine")}getCurrentState(e,t){let s=null;if(t&&e?.activeTasks?.length&&(s=e.activeTasks.find(o=>o.workspaceId===t)),s||(s=e?.currentTask),!s)return(e?.pausedTasks?.length||0)>0||e?.previousTask?.status==="paused"?"paused":"idle";switch((typeof s.status=="string"?s.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return s?"working":"idle"}}canTransition(e,t){let s=ao[e];if(s.transitions.includes(t))return{valid:!0};let n=s.transitions.map(o=>`p. ${o}`).join(", ");return{valid:!1,error:`Cannot run 'p. ${t}' in ${e} state`,suggestion:`Valid commands: ${n}`}}getNextState(e,t){switch(t){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";case"next":return e;default:return e}}getStateInfo(e){return ao[e]}getPrompt(e){return ao[e].prompt}getValidCommands(e){return ao[e].transitions}formatNextSteps(e){return ao[e].transitions.map(s=>{switch(s){case"task":return"p. task <desc> Start new task";case"done":return"p. done Complete current task";case"pause":return"p. pause Pause and switch context";case"resume":return"p. resume Continue paused task";case"ship":return"p. ship Ship the feature";case"reopen":return"p. reopen Reopen for rework";case"next":return"p. next View task queue";default:return`p. ${s}`}})}},bn=new $c});var Oc,L,vt=S(()=>{"use strict";Ut();Rc();K();Mc();Bs();As();Oc=class extends dt{static{l(this,"StateStorage")}constructor(){super("state.json",xm)}getDefault(){return{currentTask:null,previousTask:null,pausedTasks:[],taskHistory:[],activeTasks:[],lastUpdated:""}}getEventType(e){return`state.${e}d`}validateTransition(e,t){let s=bn.getCurrentState(e),n=bn.canTransition(s,t);if(!n.valid)throw new Error(`${n.error}. ${n.suggestion||""}`.trim())}async getCurrentTask(e){return(await this.read(e)).currentTask}async startTask(e,t){let s=await this.read(e);this.validateTransition(s,"task");let n={...t,startedAt:v()};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId}),n}async updateCurrentTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;let n={...s.currentTask,...t};return await this.update(e,o=>({...o,currentTask:n,lastUpdated:v()})),n}async completeTask(e,t){let s=await this.read(e),n=s.currentTask;if(!n)return null;this.validateTransition(s,"done");let o=v(),i=this.createTaskHistoryEntry(n,o,t),a=this.getTaskHistoryFromState(s),c=[i,...a].slice(0,this.maxTaskHistory);return await this.update(e,u=>({...u,currentTask:null,previousTask:null,taskHistory:c,lastUpdated:o})),await this.publishEvent(e,"task.completed",{taskId:n.id,description:n.description,startedAt:n.startedAt,completedAt:o}),n}createTaskHistoryEntry(e,t,s){let n=(e.subtasks||[]).filter(a=>a.status==="completed"&&a.summary).map(a=>a.summary),o=n.length>0?n.map(a=>a.title).join(", "):"Task completed",i={taskId:e.id,title:e.parentDescription||e.description,classification:e.type||"improvement",startedAt:e.startedAt,completedAt:t,subtaskCount:e.subtasks?.length||0,subtaskSummaries:n,outcome:o,branchName:e.branch||"unknown",linearId:e.linearId,linearUuid:e.linearUuid,prUrl:e.prUrl};return s&&(i.feedback=s),e.tokensIn&&(i.tokensIn=e.tokensIn),e.tokensOut&&(i.tokensOut=e.tokensOut),i}maxPausedTasks=5;maxTaskHistory=20;stalenessThresholdDays=30;async pauseTask(e,t){let s=await this.read(e);if(!s.currentTask)return null;this.validateTransition(s,"pause");let n={...s.currentTask,status:"paused",pausedAt:v(),pauseReason:t},o=this.getPausedTasksFromState(s),i=[n,...o].slice(0,this.maxPausedTasks);return await this.update(e,a=>({...a,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:v()})),await this.publishEvent(e,"task.paused",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:t,pausedCount:i.length}),n}async resumeTask(e,t){let s=await this.read(e),n=this.getPausedTasksFromState(s);if(n.length===0)return null;this.validateTransition(s,"resume");let o=0;if(t&&(o=n.findIndex(g=>g.id===t),o===-1))return null;let i=n[o],a=n.filter((g,w)=>w!==o),{status:c,pausedAt:u,pauseReason:d,...p}=i,m={...p,startedAt:v(),sessionId:i.sessionId??Z()};return await this.update(e,g=>({...g,currentTask:m,previousTask:null,pausedTasks:a,lastUpdated:v()})),await this.publishEvent(e,"task.resumed",{taskId:m.id,description:m.description,resumedAt:m.startedAt,remainingPaused:a.length}),m}getPausedTasksFromState(e){return Array.isArray(e.pausedTasks)&&e.pausedTasks.length>0?e.pausedTasks:e.previousTask?[e.previousTask]:[]}getTaskHistoryFromState(e){return e.taskHistory||[]}async getStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3;return s.filter(o=>new Date(o.pausedAt).getTime()<n)}async archiveStalePausedTasks(e){let t=await this.read(e),s=this.getPausedTasksFromState(t),n=Date.now()-this.stalenessThresholdDays*24*60*60*1e3,o=s.filter(a=>new Date(a.pausedAt).getTime()<n),i=s.filter(a=>new Date(a.pausedAt).getTime()>=n);if(o.length===0)return[];Rt.archiveMany(e,o.map(a=>({entityType:"paused_task",entityId:a.id,entityData:a,summary:a.description,reason:"staleness"}))),await this.update(e,a=>({...a,pausedTasks:i,previousTask:null,lastUpdated:v()}));for(let a of o)await this.publishEvent(e,"task.archived",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:"staleness"});return o}async clearTask(e){await this.update(e,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:v()}))}async hasTask(e){let t=await this.read(e),s=this.getPausedTasksFromState(t);return t.currentTask!==null||s.length>0}async getPausedTask(e){let t=await this.read(e);return this.getPausedTasksFromState(t)[0]||null}async getAllPausedTasks(e){let t=await this.read(e);return this.getPausedTasksFromState(t)}async getTaskHistory(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)}async getMostRecentTask(e){let t=await this.read(e);return this.getTaskHistoryFromState(t)[0]||null}async getTaskHistoryByType(e,t){let s=await this.read(e);return this.getTaskHistoryFromState(s).filter(o=>o.classification===t)}async getAggregatedFeedback(e){let s=(await this.getTaskHistory(e)).filter(m=>m.feedback),n=[],o=[],i=[],a=[];for(let m of s){let g=m.feedback;Array.isArray(g.stackConfirmed)&&n.push(...g.stackConfirmed),Array.isArray(g.patternsDiscovered)&&o.push(...g.patternsDiscovered),Array.isArray(g.agentAccuracy)&&i.push(...g.agentAccuracy),Array.isArray(g.issuesEncountered)&&a.push(...g.issuesEncountered)}let c=[...new Set(n)],u=[...new Set(o)],d=new Map;for(let m of a)d.set(m,(d.get(m)||0)+1);let p=[...d.entries()].filter(([m,g])=>g>=2).map(([m])=>m);return{stackConfirmed:c,patternsDiscovered:u,agentAccuracy:i,issuesEncountered:[...new Set(a)],knownGotchas:p}}async startTaskInWorkspace(e,t,s){let n={...t,workspaceId:s,startedAt:v()};return await this.update(e,o=>({...o,activeTasks:[...o.activeTasks||[],n],lastUpdated:v()})),await this.publishEvent(e,"task.started",{taskId:n.id,description:n.description,startedAt:n.startedAt,sessionId:n.sessionId,workspaceId:s}),n}async getCurrentTaskForWorkspace(e,t){return((await this.read(e)).activeTasks||[]).find(n=>n.workspaceId===t)??null}async completeTaskInWorkspace(e,t,s){let n=await this.read(e),i=(n.activeTasks||[]).find(p=>p.workspaceId===t);if(!i)return null;let a=v(),c=this.createTaskHistoryEntry(i,a,s),u=this.getTaskHistoryFromState(n),d=[c,...u].slice(0,this.maxTaskHistory);return await this.update(e,p=>({...p,activeTasks:(p.activeTasks||[]).filter(m=>m.workspaceId!==t),taskHistory:d,lastUpdated:a})),await this.publishEvent(e,"task.completed",{taskId:i.id,description:i.description,startedAt:i.startedAt,completedAt:a,workspaceId:t}),i}async getActiveTasks(e){return(await this.read(e)).activeTasks||[]}async getActiveTaskCount(e){return((await this.read(e)).activeTasks||[]).length}async updateWorkspaceTask(e,t,s){let o=(await this.read(e)).activeTasks||[],i=o.findIndex(c=>c.workspaceId===t);if(i===-1)return null;let a={...o[i],...s,workspaceId:t};return await this.update(e,c=>{let u=[...c.activeTasks||[]];return u[i]=a,{...c,activeTasks:u,lastUpdated:v()}}),a}async addTokens(e,t,s){let n=await this.read(e);if(!n.currentTask)return null;let o=(n.currentTask.tokensIn||0)+t,i=(n.currentTask.tokensOut||0)+s;return await this.update(e,a=>({...a,currentTask:{...a.currentTask,tokensIn:o,tokensOut:i},lastUpdated:v()})),{tokensIn:o,tokensOut:i}}async createSubtasks(e,t){let s=await this.read(e);if(!s.currentTask)return;let n=t.map((o,i)=>({...o,status:i===0?"in_progress":"pending",startedAt:i===0?v():void 0,dependsOn:o.dependsOn||[]}));await this.update(e,o=>({...o,currentTask:{...o.currentTask,subtasks:n,currentSubtaskIndex:0,subtaskProgress:{completed:0,total:n.length,percentage:0}},lastUpdated:v()})),await this.publishEvent(e,"subtasks.created",{taskId:s.currentTask.id,subtaskCount:n.length,subtasks:n.map(o=>({id:o.id,description:o.description,domain:o.domain}))})}async completeSubtask(e,t){let s=Em.safeParse(t);if(!s.success){let w=s.error.issues.map(b=>`${b.path.join(".")}: ${b.message}`);throw new Error(`Subtask completion requires handoff data:
485
485
  ${w.join(`
486
486
  `)}`)}let{output:n,summary:o}=s.data,i=await this.read(e);if(!i.currentTask?.subtasks)return null;let a=i.currentTask.currentSubtaskIndex||0,c=i.currentTask.subtasks[a];if(!c)return null;let u=[...i.currentTask.subtasks];u[a]={...c,status:"completed",completedAt:v(),output:n,summary:o};let d=u.filter(w=>w.status==="completed").length,p=u.length,m=Math.round(d/p*100),g=a+1;return g<u.length&&(u[g]={...u[g],status:"in_progress",startedAt:v()}),await this.update(e,w=>({...w,currentTask:{...w.currentTask,subtasks:u,currentSubtaskIndex:g<p?g:a,subtaskProgress:{completed:d,total:p,percentage:m}},lastUpdated:v()})),await this.publishEvent(e,"subtask.completed",{taskId:i.currentTask.id,subtaskId:c.id,description:c.description,output:n,handoff:o.outputForNextAgent,filesChanged:o.filesChanged.length,progress:{completed:d,total:p,percentage:m}}),g<p?u[g]:null}async getCurrentSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=t.currentTask.currentSubtaskIndex||0;return t.currentTask.subtasks[s]||null}async getNextSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)+1;return t.currentTask.subtasks[s]||null}async getPreviousSubtask(e){let t=await this.read(e);if(!t.currentTask?.subtasks)return null;let s=(t.currentTask.currentSubtaskIndex||0)-1;return s<0?null:t.currentTask.subtasks[s]||null}async getPreviousHandoff(e){let t=await this.getPreviousSubtask(e);return t?.summary?.outputForNextAgent?{fromSubtask:t.description,outputForNextAgent:t.summary.outputForNextAgent,filesChanged:t.summary.filesChanged,whatWasDone:t.summary.whatWasDone}:null}async getSubtasks(e){return(await this.read(e)).currentTask?.subtasks||[]}async getSubtaskProgress(e){return(await this.read(e)).currentTask?.subtaskProgress||null}async hasSubtasks(e){return((await this.read(e)).currentTask?.subtasks?.length||0)>0}async areAllSubtasksComplete(e){let t=await this.read(e);return t.currentTask?.subtasks?t.currentTask.subtasks.every(s=>s.status==="completed"||s.status==="failed"||s.status==="skipped"):!0}async failSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"failed",completedAt:v(),output:`Failed: ${t}`};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.failed",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,error:t}),a<c?i[a]:null}async skipSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"skipped",completedAt:v(),output:`Skipped: ${t}`,skipReason:t};let a=n+1,c=i.length;a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()});let u=i.filter(p=>p.status==="completed"||p.status==="failed"||p.status==="skipped").length,d=Math.round(u/c*100);return await this.update(e,p=>({...p,currentTask:{...p.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n,subtaskProgress:{completed:u,total:c,percentage:d}},lastUpdated:v()})),await this.publishEvent(e,"subtask.skipped",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,reason:t}),a<c?i[a]:null}async blockSubtask(e,t){let s=await this.read(e);if(!s.currentTask?.subtasks)return null;let n=s.currentTask.currentSubtaskIndex||0,o=s.currentTask.subtasks[n];if(!o)return null;let i=[...s.currentTask.subtasks];i[n]={...o,status:"blocked",output:`Blocked: ${t}`,blockReason:t};let a=n+1,c=i.length;return a<c&&(i[a]={...i[a],status:"in_progress",startedAt:v()}),await this.update(e,u=>({...u,currentTask:{...u.currentTask,subtasks:i,currentSubtaskIndex:a<c?a:n},lastUpdated:v()})),await this.publishEvent(e,"subtask.blocked",{taskId:s.currentTask.id,subtaskId:o.id,description:o.description,blocker:t}),a<c?i[a]:null}},L=new Oc});function _k(){let r=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!r)return{level:-1,name:"disabled"};if(Ok.has(r)||r.includes("prjct"))return{level:Qn.debug,name:"debug"};let e=Qn[r]??-1,t=e>=0?r:"disabled";return{level:e,name:t}}function ci(r,e,t){return Om>=r?(...s)=>console[t](e,...s):Lk}var Qn,Ok,Om,Nk,Lk,Fk,V,Is=S(()=>{"use strict";Qn={error:0,warn:1,info:2,debug:3},Ok=new Set(["1","true","*"]);l(_k,"getLogLevel");({level:Om,name:Nk}=_k()),Lk=l(()=>{},"noop");l(ci,"createLogMethod");Fk={error:ci(Qn.error,"[prjct:error]","error"),warn:ci(Qn.warn,"[prjct:warn]","warn"),info:ci(Qn.info,"[prjct:info]","log"),debug:ci(Qn.debug,"[prjct:debug]","log"),isEnabled:l(()=>Om>=0,"isEnabled"),level:l(()=>Nk,"level")},V=Fk});import Uk from"node:fs/promises";import Hk from"node:path";import{Hono as Wk}from"hono";function Gk(r){return A.getGlobalProjectPath(r)}function _m(r,e){let t=new Wk,s=Gk(r);return t.get("/state",async n=>{let o=await L.read(r);return n.json(o)}),t.get("/queue",async n=>{let o=await ce.read(r);return n.json(o)}),t.get("/ideas",async n=>{let o=await $e.read(r);return n.json(o)}),t.get("/roadmap",async n=>{let o=E.getDoc(r,"roadmap");return o?n.json(o):n.json({features:[],backlog:[],lastUpdated:""})}),t.get("/shipped",async n=>{let o=await it.read(r);return n.json(o)}),t.get("/dashboard",async n=>{let[o,i,a,c]=await Promise.all([L.read(r),ce.read(r),$e.read(r),it.read(r)]),u=E.getDoc(r,"roadmap");return n.json({projectId:r,state:o,queue:i,ideas:a,roadmap:u||{features:[],backlog:[],lastUpdated:""},shipped:c,timestamp:new Date().toISOString()})}),t.post("/state",async n=>{try{let o=await n.req.json();if(!o||typeof o!="object"||Array.isArray(o))return n.json({success:!1,error:"Invalid state object"},400);let i=["currentTask","previousTask","lastUpdated"],a={};for(let c of i)c in o&&(a[c]=o[c]);return await L.write(r,a),n.json({success:!0})}catch{return n.json({success:!1,error:"Internal server error"},400)}}),t.get("/context/:name",async n=>{let o=n.req.param("name");if(!["now","next","ideas","shipped"].includes(o))return n.json({error:"Invalid context file"},400);try{let a=Hk.join(s,"context",`${o}.md`),c=await Uk.readFile(a,"utf-8");return n.text(c,200,{"Content-Type":"text/markdown"})}catch(a){return O(a)||V.error(`Context read error: ${k(a)}`),n.text("",200,{"Content-Type":"text/markdown"})}}),t}var Nm=S(()=>{"use strict";ve();ee();Js();Vt();zs();vt();W();Is();l(Gk,"getProjectDataPath");l(_m,"createRoutes")});function qk(r){return{id:r.id,taskId:r.task_id,author:r.author,content:r.content,createdAt:r.created_at,updatedAt:r.updated_at}}function Bk(){return`cmt_${Math.random().toString(36).slice(2,10)}${Date.now().toString(36)}`}var _c,co,Lm=S(()=>{"use strict";ee();l(qk,"rowToComment");l(Bk,"generateId");_c=class{static{l(this,"CommentStorage")}addComment(e,t,s,n="user"){let o=Bk(),i=new Date().toISOString();return E.run(e,`INSERT INTO queue_task_comments (id, task_id, author, content, created_at, updated_at)
487
487
  VALUES (?, ?, ?, ?, ?, ?)`,o,t,n,s,i,i),{id:o,taskId:t,author:n,content:s,createdAt:i,updatedAt:i}}getComments(e,t){return E.query(e,"SELECT * FROM queue_task_comments WHERE task_id = ? ORDER BY created_at ASC",t).map(qk)}updateComment(e,t,s){return E.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(E.run(e,"UPDATE queue_task_comments SET content = ?, updated_at = ? WHERE id = ?",s,new Date().toISOString(),t),!0):!1}deleteComment(e,t){return E.get(e,"SELECT id FROM queue_task_comments WHERE id = ?",t)?(E.run(e,"DELETE FROM queue_task_comments WHERE id = ?",t),!0):!1}},co=new _c});var Nc,lo,Lc=S(()=>{"use strict";ee();Nc=class{static{l(this,"ContextZoneStorage")}recordTransition(e,t,s){E.run(e,`INSERT INTO context_zone_events (project_id, session_id, zone_from, zone_to, usage_percent, action, timestamp)
@@ -1882,7 +1882,7 @@ ${Y.yellow(`Command '${r}' not found.`)}
1882
1882
 
1883
1883
  Run 'prjct help' to see all available commands.
1884
1884
  `}function fP(){let r=[];r.push(""),r.push(Y.cyan.bold("All Commands")),r.push("");let e=Object.entries(_o).sort((t,s)=>t[1].order-s[1].order);for(let[t,s]of e){let n=qr.filter(o=>o.group===t);if(n.length!==0){r.push(`${Y.bold(s.title)} ${Y.dim(`(${n.length} commands)`)}`),r.push(Y.dim(s.description)),r.push("");for(let o of n){let i=`p. ${o.name}`.padEnd(18),a=o.description.length>45?`${o.description.slice(0,42)}...`:o.description;r.push(` ${i} ${a}`)}r.push("")}}return r.push(Y.dim("Run 'prjct help <command>' for detailed help on a specific command.")),r.push(""),r.join(`
1885
- `)}function hP(r){return r?r==="commands"||r==="all"?fP():gP(r):dP()}var Vy,uP,zy=S(()=>{"use strict";jd();ut();Vy=[{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:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{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"]}],uP=[{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"}];l(dP,"formatMainHelp");l(mP,"formatTerminalCommandHelp");l(pP,"formatAgentCommandHelp");l(gP,"formatCommandHelp");l(fP,"formatCommandList");l(hP,"getHelp")});var Xy=rw((qV,yP)=>{yP.exports={name:"prjct-cli",version:"1.56.10",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","@hono/node-server":"1.13.7","@modelcontextprotocol/sdk":"1.28.0","better-sqlite3":"12.6.2",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1",hono:"4.11.3","jsonc-parser":"3.3.1",zod:"3.24.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 CP={};import Ky from"node:os";import Ha from"node:path";import Be from"chalk";async function wP(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>ow(Xy()));await TP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(EP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=H.getByName(r);if(!s){let m=SP(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(ho("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,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 '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' 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:n,options:o}=vP(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=kP(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await $.getProjectId(process.cwd()),c&&(await Qs.expireIfStale(c),await Qs.touch(c))}catch{}let d=new ln,p;if(r==="parallel"&&n[0]==="spawn"&&n.length>1){let m=n.slice(1).join(" ");p=await d.parallelSpawn(m,process.cwd(),{md:o.md===!0})}else if(r==="parallel"&&n[0]==="batch"){let m=n.slice(1);m.length===0&&(f.failWithHint({message:"No tasks provided",hint:'Usage: prjct parallel batch "task1" "task2" "task3"'}),process.exit(1)),p=await d.parallelBatch(m,process.cwd())}else if(r==="design"){let m=n.join(" ");p=await d.design(m,o)}else if(r==="analyze")p=await d.analyze(o);else if(r==="cleanup")p=await d.cleanup(o);else if(r==="cleanup-projects")p=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")p=await d.setup(o);else if(r==="update")p=await d.update(o);else{let m=n.join(" ")||null,g=o.md===!0,b={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>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"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth"),parallel:l(h=>d.parallel(h,process.cwd(),{md:g,max:o.max?Number(o.max):void 0,fromQueue:o["from-queue"]===!0,fromLinear:o["from-linear"]===!0,fromJira:o["from-jira"]===!0,includeBacklog:o["include-backlog"]===!0}),"parallel"),worktree:l(h=>d.parallel(h,process.cwd(),{md:g}),"worktree"),conductor:l(h=>d.parallel(h,process.cwd(),{md:g}),"conductor"),obsidian:l(h=>d.obsidian(h,process.cwd()),"obsidian")}[r];if(b)p=await b(m);else throw new Error(`Command '${r}' has no handler`)}if(c){let m=Date.now()-u;try{await Qs.trackCommand(c,r,m)}catch{}try{await xn.recordTiming(c,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await xn.recordTiming(c,"startup_time",w)}await xn.recordMemory(c,{command:r})}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(ec(s)),t||f.end(),process.exit(1)}}function kP(r,e){if(!r.params)return null;let t=r.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(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return ho("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function SP(r){let e=H.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=bP(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function bP(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function vP(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function TP(r){let e=await Ps(),t=Ha.join(Ky.homedir(),".claude","commands","p.md"),s=Ha.join(Ky.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([C(t),C(s),C(Ha.join(process.cwd(),".cursor","commands","sync.md")),C(Ha.join(process.cwd(),".cursor"))]),c=await Bn();if(console.log(`
1885
+ `)}function hP(r){return r?r==="commands"||r==="all"?fP():gP(r):dP()}var Vy,uP,zy=S(()=>{"use strict";jd();ut();Vy=[{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:"serve",description:"Start web dashboard server",example:"prjct serve [port]"},{name:"context",description:"Smart context filtering tools for AI",example:'prjct context files "add auth"',subcommands:["files","signatures","imports","recent","summary"]},{name:"enrich",description:"Prepare issue enrichment context from local code",example:'prjct enrich "PROJ-123 improve auth flow" --md'},{name:"linear",description:"Linear issue tracker MCP gateway",example:"prjct linear setup",subcommands:["setup","status","sync","list","get","create","update","start","done","comment"]},{name:"jira",description:"Jira issue tracker MCP gateway",example:"prjct jira setup",subcommands:["setup","status","sync","list","get","create","update","start","done","transition","comment"]},{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"]}],uP=[{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"}];l(dP,"formatMainHelp");l(mP,"formatTerminalCommandHelp");l(pP,"formatAgentCommandHelp");l(gP,"formatCommandHelp");l(fP,"formatCommandList");l(hP,"getHelp")});var Xy=rw((qV,yP)=>{yP.exports={name:"prjct-cli",version:"1.56.12",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","@hono/node-server":"1.13.7","@modelcontextprotocol/sdk":"1.28.0","better-sqlite3":"12.6.2",chalk:"4.1.2",chokidar:"5.0.0","date-fns":"4.1.0",glob:"13.0.1",hono:"4.11.3","jsonc-parser":"3.3.1",zod:"3.24.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 CP={};import Ky from"node:os";import Ha from"node:path";import Be from"chalk";async function wP(){let[r,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(r)){let s=await Promise.resolve().then(()=>ow(Xy()));await TP(s.version),process.exit(0)}["-h","--help",void 0].includes(r)&&(EP(),process.exit(0));let t=e.includes("--md");t||f.start();try{let s=H.getByName(r);if(!s){let m=SP(r),g=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";f.failWithHint(ho("UNKNOWN_COMMAND",{message:`Unknown command: ${r}`,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 '${r}' is deprecated`,hint:m}),t||f.end(),process.exit(1)}s.implemented||(f.failWithHint({message:`Command '${r}' 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:n,options:o}=vP(s,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;s.requiresLlm&&!i&&(f.failWithHint({message:`'prjct ${r}' requires an AI agent to process its output`,hint:`Use 'p. ${r}' inside Claude/Cursor, or add --md flag`}),t||f.end(),process.exit(1));let a=kP(s,n);a&&(f.failWithHint(a),t||f.end(),process.exit(1));let c=null,u=Date.now();try{c=await $.getProjectId(process.cwd()),c&&(await Qs.expireIfStale(c),await Qs.touch(c))}catch{}let d=new ln,p;if(r==="parallel"&&n[0]==="spawn"&&n.length>1){let m=n.slice(1).join(" ");p=await d.parallelSpawn(m,process.cwd(),{md:o.md===!0})}else if(r==="parallel"&&n[0]==="batch"){let m=n.slice(1);m.length===0&&(f.failWithHint({message:"No tasks provided",hint:'Usage: prjct parallel batch "task1" "task2" "task3"'}),process.exit(1)),p=await d.parallelBatch(m,process.cwd())}else if(r==="design"){let m=n.join(" ");p=await d.design(m,o)}else if(r==="analyze")p=await d.analyze(o);else if(r==="cleanup")p=await d.cleanup(o);else if(r==="cleanup-projects")p=await d.cleanupProjects({dryRun:o["dry-run"]===!0,md:o.md===!0});else if(r==="setup")p=await d.setup(o);else if(r==="update")p=await d.update(o);else{let m=n.join(" ")||null,g=o.md===!0,b={task:l(h=>d.task(h,process.cwd(),{md:g}),"task"),done:l(()=>d.done(process.cwd(),{md:g}),"done"),next:l(()=>d.next(process.cwd(),{md:g}),"next"),pause:l(h=>d.pause(h||"",process.cwd(),{md:g}),"pause"),resume:l(h=>d.resume(h,process.cwd(),{md:g}),"resume"),init:l(h=>d.init(h),"init"),bug:l(h=>d.bug(h||"",process.cwd(),{md:g}),"bug"),idea:l(h=>d.idea(h||"",process.cwd(),{md:g}),"idea"),spec:l(h=>d.spec(h),"spec"),ship:l(h=>d.ship(h,process.cwd(),{md:g}),"ship"),workflow:l(h=>d.workflowPrefs(h,process.cwd(),{md:g}),"workflow"),sessions:l(()=>d.sessions(process.cwd(),{md:g,cleanup:o.cleanup===!0}),"sessions"),dash:l(h=>d.dash(h||"default",process.cwd(),{md:g}),"dash"),stats:l(()=>d.stats(process.cwd(),{json:o.json===!0,export:o.export===!0}),"stats"),status:l(()=>d.status(process.cwd(),{json:o.json===!0,md:g}),"status"),help:l(h=>d.help(h||""),"help"),perf:l(h=>d.perf(h||"7"),"perf"),velocity:l(h=>d.velocity(h||"0"),"velocity"),recover:l(()=>d.recover(),"recover"),undo:l(()=>d.undo(),"undo"),redo:l(()=>d.redo(),"redo"),history:l(()=>d.history(),"history"),enrich:l(h=>d.enrich(h,process.cwd(),{md:g,json:o.json===!0}),"enrich"),sync:l(()=>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"),diff:l(()=>d.diff(process.cwd(),{json:o.json===!0,md:g}),"diff"),seal:l(()=>d.seal(process.cwd(),{json:o.json===!0}),"seal"),rollback:l(()=>d.rollback(process.cwd(),{json:o.json===!0,md:g}),"rollback"),verify:l(()=>d.verify(process.cwd(),{json:o.json===!0,semantic:o.semantic===!0}),"verify"),"analysis-payload":l(()=>d.analysisPayload(process.cwd(),{json:o.json===!0,md:g}),"analysis-payload"),"analysis-save-llm":l(h=>d.saveLlmAnalysis(h||"",process.cwd(),{md:g}),"analysis-save-llm"),"analysis-llm":l(()=>d.getLlmAnalysis(process.cwd(),{json:o.json===!0,md:g}),"analysis-llm"),start:l(()=>d.start(),"start"),context:l(h=>d.context(h),"context"),login:l(()=>d.login({md:g,url:o.url?String(o.url):void 0}),"login"),logout:l(()=>d.logout(),"logout"),auth:l(h=>d.auth(h,{md:g}),"auth"),parallel:l(h=>d.parallel(h,process.cwd(),{md:g,max:o.max?Number(o.max):void 0,fromQueue:o["from-queue"]===!0,fromLinear:o["from-linear"]===!0,fromJira:o["from-jira"]===!0,includeBacklog:o["include-backlog"]===!0}),"parallel"),worktree:l(h=>d.parallel(h,process.cwd(),{md:g}),"worktree"),conductor:l(h=>d.parallel(h,process.cwd(),{md:g}),"conductor"),obsidian:l(h=>d.obsidian(h,process.cwd()),"obsidian")}[r];if(b)p=await b(m);else throw new Error(`Command '${r}' has no handler`)}if(c){let m=Date.now()-u;try{await Qs.trackCommand(c,r,m)}catch{}try{await xn.recordTiming(c,"command_duration",m,{command:r});let g=globalThis.__perfStartNs;if(g){let w=Number(process.hrtime.bigint()-g)/1e6;await xn.recordTiming(c,"startup_time",w)}await xn.recordMemory(c,{command:r})}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(ec(s)),t||f.end(),process.exit(1)}}function kP(r,e){if(!r.params)return null;let t=r.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(", "),n=r.usage.terminal||`prjct ${r.name} ${r.params}`;return ho("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${n}`})}return null}function SP(r){let e=H.getAll().map(n=>n.name),t=null,s=1/0;for(let n of e){let o=bP(r.toLowerCase(),n.toLowerCase());o<s&&(s=o,t=n)}return s<=2?t:null}function bP(r,e){let t=r.length,s=e.length,n=Array.from({length:t+1},()=>Array(s+1).fill(0));for(let o=0;o<=t;o++)n[o][0]=o;for(let o=0;o<=s;o++)n[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=s;i++)n[o][i]=r[o-1]===e[i-1]?n[o-1][i-1]:1+Math.min(n[o-1][i],n[o][i-1],n[o-1][i-1]);return n[t][s]}function vP(r,e){let t=[],s={};for(let n=0;n<e.length;n++){let o=e[n];if(o.startsWith("--")){let i=o.slice(2);n+1<e.length&&!e[n+1].startsWith("--")?s[i]=e[++n]:s[i]=!0}else t.push(o)}return{parsedArgs:t,options:s}}async function TP(r){let e=await Ps(),t=Ha.join(Ky.homedir(),".claude","commands","p.md"),s=Ha.join(Ky.homedir(),".gemini","commands","p.toml"),[n,o,i,a]=await Promise.all([C(t),C(s),C(Ha.join(process.cwd(),".cursor","commands","sync.md")),C(Ha.join(process.cwd(),".cursor"))]),c=await Bn();if(console.log(`
1886
1886
  ${Be.cyan("p/")} prjct v${r}
1887
1887
  ${Be.dim("Context layer for AI coding agents")}
1888
1888
 
package/dist/cli/jira.mjs CHANGED
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  var require = __createRequire(import.meta.url);
6
6
  var __filename = __fileURLToPath(import.meta.url);
7
7
  var __dirname = __pathDirname(__filename);
8
- var Dt=Object.defineProperty;var o=(t,e)=>Dt(t,"name",{value:e,configurable:!0}),y=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import jt from"node:fs/promises";import xt from"node:os";import nt from"node:path";import gt from"node:fs";import ht from"node:path";import{z as l}from"zod";var S={create(t,e){class r extends Error{static{o(this,"TypedError")}errorName;data;isOperational=!0;constructor(i){let a=e.parse(i);super(`${t}: ${JSON.stringify(a)}`),this.name=t,this.errorName=t,this.data=a,Error.captureStackTrace?.(this,this.constructor)}static throw(i){throw new r(i)}static is(i){return i instanceof r&&i.errorName===t}static create(i){return new r(i)}}return r}},ue=S.create("FileError",l.object({path:l.string(),operation:l.enum(["read","write","delete","create","copy"]),reason:l.string().optional()})),le=S.create("ValidationError",l.object({field:l.string(),expected:l.string(),received:l.string().optional(),message:l.string().optional()})),pe=S.create("PermissionError",l.object({action:l.string(),resource:l.string(),reason:l.string().optional()})),de=S.create("TaskError",l.object({taskId:l.string().optional(),operation:l.enum(["create","update","complete","pause","resume","delete"]),reason:l.string()})),fe=S.create("SessionError",l.object({sessionId:l.string().optional(),reason:l.string()})),me=S.create("SyncError",l.object({projectId:l.string().optional(),operation:l.enum(["push","pull","auth","connect"]),reason:l.string()}));import K from"node:fs";import V from"node:path";function $t(t){return t instanceof Error&&"code"in t}o($t,"isNodeError");function _(t){return $t(t)&&t.code==="ENOENT"}o(_,"isNotFoundError");function x(t){return t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}o(x,"getErrorMessage");var L=null,It=null,A=null;function ft(){if(A)return A;let t=__dirname;for(let e=0;e<5;e++){let r=V.join(t,"package.json");if(K.existsSync(r))try{if(JSON.parse(K.readFileSync(r,"utf-8")).name==="prjct-cli")return A=t,t}catch{}t=V.dirname(t)}return A=V.join(__dirname,"..","..",".."),A}o(ft,"getPackageRoot");function Z(){if(L)return L;try{let t=V.join(ft(),"package.json"),e=JSON.parse(K.readFileSync(t,"utf-8"));return L=e.version,It=e,L}catch(t){return console.error("Failed to read version from package.json:",x(t)),"0.0.0"}}o(Z,"getVersion");var Pe=Z(),Q=ft();var tt=null,mt=!1;function Jt(){if(mt)return tt;mt=!0;let t=ht.join(Q,"dist","templates.json");try{let e=gt.readFileSync(t,"utf-8");return tt=JSON.parse(e),tt}catch{return null}}o(Jt,"loadBundle");function yt(t){let e=Jt();if(e?.[t])return e[t];let r=ht.join(Q,"templates",t);try{return gt.readFileSync(r,"utf-8")}catch{return null}}o(yt,"getTemplateContent");import{exec as Lt,execFile as Vt}from"node:child_process";import{promisify as vt}from"node:util";var Fe=vt(Lt),wt=vt(Vt);import et from"node:fs/promises";import qt from"node:path";async function q(t,e,r=2){let n=qt.dirname(t);await et.mkdir(n,{recursive:!0});let i=JSON.stringify(e,null,r);await et.writeFile(t,i,"utf-8")}o(q,"writeJson");async function rt(t){try{return(await et.stat(t)).isDirectory()}catch(e){if(_(e))return!1;throw e}}o(rt,"dirExists");var it={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},T=null;function Ut(){let t=yt("mcp-config.json");if(!t)return{mcpServers:{context7:it}};try{return JSON.parse(t)}catch{return{mcpServers:{context7:it}}}}o(Ut,"parseTemplateConfig");function St(){return Ut().mcpServers?.context7||it}o(St,"getContext7Config");function Et(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?nt.join(xt.tmpdir(),"prjct-context7-test","mcp.json"):nt.join(xt.homedir(),".claude","mcp.json")}o(Et,"getConfigPath");async function Pt(t){try{let e=await jt.readFile(t,"utf-8");return JSON.parse(e)}catch(e){if(_(e))return{};throw e}}o(Pt,"readConfig");async function Wt(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let t=St(),e=[...t.args||[],"--help"];await wt(t.command||"npx",e,{timeout:15e3})}o(Wt,"runSmokeCheck");var ot=class{static{o(this,"Context7Service")}async install(){let e=Et(),r=nt.dirname(e);await jt.mkdir(r,{recursive:!0});let n=await Pt(e),i=n.mcpServers||{};return i.context7=St(),n.mcpServers=i,await q(e,n),T=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(T&&Date.now()-T.at<3e5)return T.status;let e=Et(),i=((await Pt(e)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await Wt();let a={installed:!0,verified:!0,configPath:e};return T={at:Date.now(),status:a},a}catch(a){let s={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${x(a)}`};return T={at:Date.now(),status:s},s}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let r=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(r)}return e}},Tt=new ot;import Ct from"node:fs";import B from"node:path";function Ht(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}o(Ht,"detectRuntime");function kt(){return Ht()==="bun"}o(kt,"isBun");function Xt(t){if(kt()){let{Database:i}=y("bun:sqlite");return new i(t,{create:!0})}let e=y("better-sqlite3"),r=new e(t),n=r.exec.bind(r);return r.run=i=>n(i),r}o(Xt,"openDatabase");var st=class{static{o(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),r=e?B.resolve(e):B.join(y("node:os").homedir(),".prjct-cli");this.dbPath=B.join(r,"system.db")}getDb(){if(this.db)return this.db;let e=B.dirname(this.dbPath);Ct.existsSync(e)||Ct.mkdirSync(e,{recursive:!0});let r=Xt(this.dbPath);return r.run("PRAGMA journal_mode = WAL"),r.run("PRAGMA synchronous = NORMAL"),r.run("PRAGMA cache_size = -1000"),r.run("PRAGMA temp_store = MEMORY"),this.runMigrations(r),this.db=r,r}runMigrations(e){e.run(`
8
+ var Dt=Object.defineProperty;var o=(t,e)=>Dt(t,"name",{value:e,configurable:!0}),y=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import jt from"node:fs/promises";import xt from"node:os";import nt from"node:path";import gt from"node:fs";import ht from"node:path";import{z as l}from"zod";var S={create(t,e){class r extends Error{static{o(this,"TypedError")}errorName;data;isOperational=!0;constructor(i){let a=e.parse(i);super(`${t}: ${JSON.stringify(a)}`),this.name=t,this.errorName=t,this.data=a,Error.captureStackTrace?.(this,this.constructor)}static throw(i){throw new r(i)}static is(i){return i instanceof r&&i.errorName===t}static create(i){return new r(i)}}return r}},ue=S.create("FileError",l.object({path:l.string(),operation:l.enum(["read","write","delete","create","copy"]),reason:l.string().optional()})),le=S.create("ValidationError",l.object({field:l.string(),expected:l.string(),received:l.string().optional(),message:l.string().optional()})),pe=S.create("PermissionError",l.object({action:l.string(),resource:l.string(),reason:l.string().optional()})),de=S.create("TaskError",l.object({taskId:l.string().optional(),operation:l.enum(["create","update","complete","pause","resume","delete"]),reason:l.string()})),fe=S.create("SessionError",l.object({sessionId:l.string().optional(),reason:l.string()})),me=S.create("SyncError",l.object({projectId:l.string().optional(),operation:l.enum(["push","pull","auth","connect"]),reason:l.string()}));import K from"node:fs";import V from"node:path";function $t(t){return t instanceof Error&&"code"in t}o($t,"isNodeError");function _(t){return $t(t)&&t.code==="ENOENT"}o(_,"isNotFoundError");function x(t){return t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}o(x,"getErrorMessage");var L=null,It=null,A=null;function ft(){if(A)return A;let t=__dirname;for(let e=0;e<5;e++){let r=V.join(t,"package.json");if(K.existsSync(r))try{if(JSON.parse(K.readFileSync(r,"utf-8")).name==="prjct-cli")return A=t,t}catch{}t=V.dirname(t)}return A=V.join(__dirname,"..","..",".."),A}o(ft,"getPackageRoot");function Z(){if(L)return L;try{let t=V.join(ft(),"package.json"),e=JSON.parse(K.readFileSync(t,"utf-8"));return L=e.version,It=e,L}catch(t){return console.error("Failed to read version from package.json:",x(t)),"0.0.0"}}o(Z,"getVersion");var Pe=Z(),Q=ft();var tt=null,mt=!1;function Jt(){if(mt)return tt;mt=!0;let t=ht.join(Q,"dist","templates.json");try{let e=gt.readFileSync(t,"utf-8");return tt=JSON.parse(e),tt}catch{return null}}o(Jt,"loadBundle");function yt(t){let e=Jt();if(e?.[t])return e[t];let r=ht.join(Q,"templates",t);try{return gt.readFileSync(r,"utf-8")}catch{return null}}o(yt,"getTemplateContent");import{exec as Lt,execFile as Vt}from"node:child_process";import{promisify as vt}from"node:util";var Fe=vt(Lt),wt=vt(Vt);import et from"node:fs/promises";import qt from"node:path";async function q(t,e,r=2){let n=qt.dirname(t);await et.mkdir(n,{recursive:!0});let i=JSON.stringify(e,null,r);await et.writeFile(t,i,"utf-8")}o(q,"writeJson");async function rt(t){try{return(await et.stat(t)).isDirectory()}catch(e){if(_(e))return!1;throw e}}o(rt,"dirExists");var it={command:"npx",args:["-y","@upstash/context7-mcp@latest"]},k=null;function Ut(){let t=yt("mcp-config.json");if(!t)return{mcpServers:{context7:it}};try{return JSON.parse(t)}catch{return{mcpServers:{context7:it}}}}o(Ut,"parseTemplateConfig");function St(){return Ut().mcpServers?.context7||it}o(St,"getContext7Config");function Et(){return process.env.PRJCT_CONTEXT7_CONFIG?process.env.PRJCT_CONTEXT7_CONFIG:process.env.NODE_ENV==="test"?nt.join(xt.tmpdir(),"prjct-context7-test","mcp.json"):nt.join(xt.homedir(),".claude","mcp.json")}o(Et,"getConfigPath");async function Pt(t){try{let e=await jt.readFile(t,"utf-8");return JSON.parse(e)}catch(e){if(_(e))return{};throw e}}o(Pt,"readConfig");async function Wt(){if(process.env.PRJCT_SKIP_CONTEXT7_SMOKE==="1"||process.env.NODE_ENV==="test")return;let t=St(),e=[...t.args||[],"--help"];await wt(t.command||"npx",e,{timeout:15e3})}o(Wt,"runSmokeCheck");var ot=class{static{o(this,"Context7Service")}async install(){let e=Et(),r=nt.dirname(e);await jt.mkdir(r,{recursive:!0});let n=await Pt(e),i=n.mcpServers||{};return i.context7=St(),n.mcpServers=i,await q(e,n),k=null,{installed:!0,verified:!1,configPath:e,message:"Context7 MCP configured"}}async verify(){if(k&&Date.now()-k.at<3e5)return k.status;let e=Et(),i=((await Pt(e)).mcpServers||{}).context7;if(!i?.command||!Array.isArray(i.args)||i.args.length===0)return{installed:!1,verified:!1,configPath:e,message:"Context7 MCP not configured in ~/.claude/mcp.json"};try{await Wt();let a={installed:!0,verified:!0,configPath:e};return k={at:Date.now(),status:a},a}catch(a){let s={installed:!0,verified:!1,configPath:e,message:`Context7 smoke check failed: ${x(a)}`};return k={at:Date.now(),status:s},s}}async ensureReady(){await this.install();let e=await this.verify();if(!e.verified){let r=e.message||"Context7 MCP is required but not ready. Run `prjct start` to repair configuration.";throw new Error(r)}return e}},kt=new ot;import Ct from"node:fs";import B from"node:path";function Ht(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}o(Ht,"detectRuntime");function Tt(){return Ht()==="bun"}o(Tt,"isBun");function Xt(t){if(Tt()){let{Database:i}=y("bun:sqlite");return new i(t,{create:!0})}let e=y("better-sqlite3"),r=new e(t),n=r.exec.bind(r);return r.run=i=>n(i),r}o(Xt,"openDatabase");var st=class{static{o(this,"SystemDatabase")}db=null;dbPath;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim(),r=e?B.resolve(e):B.join(y("node:os").homedir(),".prjct-cli");this.dbPath=B.join(r,"system.db")}getDb(){if(this.db)return this.db;let e=B.dirname(this.dbPath);Ct.existsSync(e)||Ct.mkdirSync(e,{recursive:!0});let r=Xt(this.dbPath);return r.run("PRAGMA journal_mode = WAL"),r.run("PRAGMA synchronous = NORMAL"),r.run("PRAGMA cache_size = -1000"),r.run("PRAGMA temp_store = MEMORY"),this.runMigrations(r),this.db=r,r}runMigrations(e){e.run(`
9
9
  CREATE TABLE IF NOT EXISTS _system_migrations (
10
10
  version INTEGER PRIMARY KEY,
11
11
  name TEXT NOT NULL,
@@ -26,7 +26,7 @@ var Dt=Object.defineProperty;var o=(t,e)=>Dt(t,"name",{value:e,configurable:!0})
26
26
  INSERT OR REPLACE INTO mcp_health
27
27
  (provider, status, last_checked, last_error, token_version, config_valid, oauth_valid, updated_at)
28
28
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
29
- `).run(e,r.status,i,r.lastError??null,r.tokenVersion??null,r.configValid?1:0,r.oauthValid?1:0,i)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},k=new st;import g from"node:fs/promises";import C from"node:os";import d from"node:path";var N="mcp-remote@0.1.38";function Gt(){try{let t=d.dirname(y.resolve("prjct-cli/package.json"));return{command:"node",args:[d.join(t,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}o(Gt,"getPrjctMcpConfig");var at={prjct:Gt(),linear:{command:"npx",args:["-y",N,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",N,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},P={linear:`npx -y ${N} https://mcp.linear.app/mcp`,jira:`npx -y ${N} https://mcp.atlassian.com/v1/mcp`};function b(){return N.split("@")[1]}o(b,"getMcpRemoteVersion");function F(){return process.env.PRJCT_TEST_MODE==="1"?d.join(C.tmpdir(),"prjct-context7-test","mcp.json"):d.join(C.homedir(),".claude","mcp.json")}o(F,"getClaudeMcpConfigPath");async function ct(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:F(),mergeIntoExisting:!1}];let t=C.homedir(),e=[],r=d.join(t,".claude");await rt(r)&&e.push({provider:"claude",configPath:d.join(r,"mcp.json"),mergeIntoExisting:!1});let n=d.join(t,".gemini");return await rt(n)&&e.push({provider:"gemini",configPath:d.join(n,"settings.json"),mergeIntoExisting:!0}),e}o(ct,"getActiveMcpConfigPaths");async function bt(t,e){let r=await ct();return Promise.all(r.map(async n=>{let i=await Yt(t,e,n.configPath);return{provider:n.provider,...i}}))}o(bt,"upsertMcpServerAll");async function R(t){let e=await ct(),r=await Promise.all(e.map(async n=>({provider:n.provider,configured:await zt(t,n.configPath),path:n.configPath})));return{configured:r.some(n=>n.configured),providers:r}}o(R,"hasMcpServerAny");async function U(t){let e;try{e=await g.readdir(t)}catch{return{valid:!1,reason:"directory not found"}}if(e.length===0)return{valid:!1,reason:"directory empty"};let r=e.filter(n=>n.endsWith("_tokens.json")||n.endsWith(".json"));if(r.length===0)return{valid:!1,reason:"no token files found"};for(let n of r){let i=d.join(t,n);try{let a=await g.readFile(i,"utf-8"),s=JSON.parse(a);if(s.access_token||s.refresh_token)return{valid:!0}}catch{return{valid:!1,reason:`corrupt JSON in ${n}`}}}return{valid:!1,reason:"no valid tokens (missing access_token/refresh_token)"}}o(U,"validateTokenFiles");async function W(){let t=b(),e=d.join(C.homedir(),".mcp-auth"),r=d.join(e,`mcp-remote-${t}`);if((await U(r)).valid)return{migrated:!1,from:null,to:r};let i;try{i=await g.readdir(e)}catch{return{migrated:!1,from:null,to:r}}let a=i.filter(s=>s.startsWith("mcp-remote-")&&s!==`mcp-remote-${t}`).sort().reverse();for(let s of a){let c=d.join(e,s);if((await U(c)).valid){await g.mkdir(r,{recursive:!0});let p=await g.readdir(c);for(let u of p)await g.copyFile(d.join(c,u),d.join(r,u));return{migrated:!0,from:c,to:r}}}return{migrated:!1,from:null,to:r}}o(W,"migrateOAuthTokens");async function H(t){if((await U(t)).valid)return!1;try{let r=await g.readdir(t);for(let n of r)await g.unlink(d.join(t,n));return await g.rmdir(t),!0}catch{return!1}}o(H,"cleanCorruptedTokens");async function X(t){let e=[],r=!1,n=await ct();for(let i of n){let a=await ut(i.configPath),s=a.mcpServers?.[t];if(!s){e.push(`${i.provider}: no ${t} entry in mcp.json`);continue}let c=at[t];if(s.command!==c.command||JSON.stringify(s.args)!==JSON.stringify(c.args)){e.push(`${i.provider}: ${t} config doesn't match preset (stale version?)`);let m={...a.mcpServers||{}};m[t]=c,a.mcpServers=m,await Mt(a,i.configPath),r=!0}}return{valid:e.length===0,issues:e,autoFixed:r}}o(X,"validateMcpConfig");async function G(t){let e=b(),r=d.join(C.homedir(),".mcp-auth"),n=d.join(r,`mcp-remote-${e}`),i=!1,a=!1,s=await U(n);if(s.valid)return k.setMcpHealth(t,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:n,hint:"OAuth tokens verified \u2014 restart your AI client.",validated:!0,migrated:!1,cleaned:!1};s.reason&&s.reason!=="directory not found"&&s.reason!=="directory empty"&&(a=await H(n));let c=await W();if(c.migrated)return i=!0,k.setMcpHealth(t,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:n,hint:`Tokens migrated from ${d.basename(c.from)} \u2014 restart your AI client.`,validated:!0,migrated:!0,cleaned:a};let m=[];try{m=(await g.readdir(r)).filter(v=>v.startsWith("mcp-remote-")&&v!==`mcp-remote-${e}`)}catch{}let p=a?`Previous tokens were invalid and cleaned. Run in a terminal: ${P[t]}`:m.length>0?`Legacy tokens found (${m.join(", ")}) but invalid. Run: ${P[t]}`:`OAuth not completed. Run in a terminal: ${P[t]}`;return k.setMcpHealth(t,{status:"unhealthy",lastError:p,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:p,validated:!1,migrated:!1,cleaned:a}}o(G,"checkOAuthTokens");async function Rt(){let t=b(),e=d.join(C.homedir(),".mcp-auth"),r=[],n;try{n=await g.readdir(e)}catch{return{expectedVersion:t,dirs:r}}let i=n.filter(a=>a.startsWith("mcp-remote-")).sort();for(let a of i){let s=d.join(e,a),c=a.replace("mcp-remote-",""),m=c===t,p=[];try{if(!(await g.stat(s)).isDirectory())continue;p=await g.readdir(s)}catch{continue}let u=p.find(E=>E.endsWith("_tokens.json"))??null,v=!1,h,M=!1,O=!1,z;if(u)try{let E=await g.readFile(d.join(s,u),"utf-8"),w=JSON.parse(E);M=!!w.access_token,O=!!w.refresh_token,w.expires_in&&(z=w.expires_in),v=M||O,v||(h="no valid tokens (missing access_token/refresh_token)")}catch{h=`corrupt JSON in ${u}`}else{let E=p.filter(w=>w.endsWith(".json"));if(E.length===0)h="no token files found";else{for(let w of E)try{let Ft=await g.readFile(d.join(s,w),"utf-8"),J=JSON.parse(Ft);J.access_token&&(M=!0),J.refresh_token&&(O=!0),J.expires_in&&(z=J.expires_in)}catch{h=`corrupt JSON in ${w}`}v=M||O,!v&&!h&&(h="no valid tokens (missing access_token/refresh_token)")}}r.push({version:c,path:s,isCurrent:m,files:p,tokenFile:u,valid:v,reason:h,hasAccessToken:M,hasRefreshToken:O,expiresIn:z})}return{expectedVersion:t,dirs:r}}o(Rt,"scanTokenDirectories");async function ut(t=F()){try{let e=await g.readFile(t,"utf-8");return JSON.parse(e)}catch(e){let r=x(e).toLowerCase();if(r.includes("no such file")||r.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${t}: ${x(e)}`)}}o(ut,"readMcpConfig");async function Mt(t,e=F()){await q(e,t)}o(Mt,"writeMcpConfig");async function Yt(t,e,r=F()){let n=await ut(r),i={...n.mcpServers||{}},a=i[t];i[t]=e,n.mcpServers=i;let s=JSON.stringify(a)!==JSON.stringify(e);return await Mt(n,r),{path:r,changed:s}}o(Yt,"upsertMcpServer");async function zt(t,e=F()){return!!(await ut(e)).mcpServers?.[t]}o(zt,"hasMcpServer");function Kt(){return"---"}o(Kt,"mdHeader");function Zt(){return`---
29
+ `).run(e,r.status,i,r.lastError??null,r.tokenVersion??null,r.configValid?1:0,r.oauthValid?1:0,i)}clearMcpHealth(e){this.getDb().prepare("DELETE FROM mcp_health WHERE provider = ?").run(e)}close(){this.db&&(this.db.close(),this.db=null)}},T=new st;import g from"node:fs/promises";import C from"node:os";import d from"node:path";var N="mcp-remote@0.1.38";function Gt(){try{let t=d.dirname(y.resolve("prjct-cli/package.json"));return{command:"node",args:[d.join(t,"dist","mcp","server.mjs")],description:"prjct data layer (memories, analysis, files, workflows)"}}catch{return{command:"npx",args:["-y","prjct-cli","mcp"],description:"prjct data layer (memories, analysis, files, workflows)"}}}o(Gt,"getPrjctMcpConfig");var at={prjct:Gt(),linear:{command:"npx",args:["-y",N,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",N,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}},P={linear:`npx -y ${N} https://mcp.linear.app/mcp`,jira:`npx -y ${N} https://mcp.atlassian.com/v1/mcp`};function b(){return N.split("@")[1]}o(b,"getMcpRemoteVersion");function F(){return process.env.PRJCT_TEST_MODE==="1"?d.join(C.tmpdir(),"prjct-context7-test","mcp.json"):d.join(C.homedir(),".claude","mcp.json")}o(F,"getClaudeMcpConfigPath");async function ct(){if(process.env.PRJCT_TEST_MODE==="1")return[{provider:"claude",configPath:F(),mergeIntoExisting:!1}];let t=C.homedir(),e=[],r=d.join(t,".claude");await rt(r)&&e.push({provider:"claude",configPath:d.join(r,"mcp.json"),mergeIntoExisting:!1});let n=d.join(t,".gemini");return await rt(n)&&e.push({provider:"gemini",configPath:d.join(n,"settings.json"),mergeIntoExisting:!0}),e}o(ct,"getActiveMcpConfigPaths");async function bt(t,e){let r=await ct();return Promise.all(r.map(async n=>{let i=await Yt(t,e,n.configPath);return{provider:n.provider,...i}}))}o(bt,"upsertMcpServerAll");async function R(t){let e=await ct(),r=await Promise.all(e.map(async n=>({provider:n.provider,configured:await zt(t,n.configPath),path:n.configPath})));return{configured:r.some(n=>n.configured),providers:r}}o(R,"hasMcpServerAny");async function U(t){let e;try{e=await g.readdir(t)}catch{return{valid:!1,reason:"directory not found"}}if(e.length===0)return{valid:!1,reason:"directory empty"};let r=e.filter(n=>n.endsWith("_tokens.json")||n.endsWith(".json"));if(r.length===0)return{valid:!1,reason:"no token files found"};for(let n of r){let i=d.join(t,n);try{let a=await g.readFile(i,"utf-8"),s=JSON.parse(a);if(s.access_token||s.refresh_token)return{valid:!0}}catch{return{valid:!1,reason:`corrupt JSON in ${n}`}}}return{valid:!1,reason:"no valid tokens (missing access_token/refresh_token)"}}o(U,"validateTokenFiles");async function W(){let t=b(),e=d.join(C.homedir(),".mcp-auth"),r=d.join(e,`mcp-remote-${t}`);if((await U(r)).valid)return{migrated:!1,from:null,to:r};let i;try{i=await g.readdir(e)}catch{return{migrated:!1,from:null,to:r}}let a=i.filter(s=>s.startsWith("mcp-remote-")&&s!==`mcp-remote-${t}`).sort().reverse();for(let s of a){let c=d.join(e,s);if((await U(c)).valid){await g.mkdir(r,{recursive:!0});let p=await g.readdir(c);for(let u of p)await g.copyFile(d.join(c,u),d.join(r,u));return{migrated:!0,from:c,to:r}}}return{migrated:!1,from:null,to:r}}o(W,"migrateOAuthTokens");async function H(t){if((await U(t)).valid)return!1;try{let r=await g.readdir(t);for(let n of r)await g.unlink(d.join(t,n));return await g.rmdir(t),!0}catch{return!1}}o(H,"cleanCorruptedTokens");async function X(t){let e=[],r=!1,n=await ct();for(let i of n){let a=await ut(i.configPath),s=a.mcpServers?.[t];if(!s){e.push(`${i.provider}: no ${t} entry in mcp.json`);continue}let c=at[t];if(s.command!==c.command||JSON.stringify(s.args)!==JSON.stringify(c.args)){e.push(`${i.provider}: ${t} config doesn't match preset (stale version?)`);let m={...a.mcpServers||{}};m[t]=c,a.mcpServers=m,await Mt(a,i.configPath),r=!0}}return{valid:e.length===0,issues:e,autoFixed:r}}o(X,"validateMcpConfig");async function G(t){let e=b(),r=d.join(C.homedir(),".mcp-auth"),n=d.join(r,`mcp-remote-${e}`),i=!1,a=!1,s=await U(n);if(s.valid)return T.setMcpHealth(t,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:n,hint:"OAuth tokens verified \u2014 restart your AI client.",validated:!0,migrated:!1,cleaned:!1};s.reason&&s.reason!=="directory not found"&&s.reason!=="directory empty"&&(a=await H(n));let c=await W();if(c.migrated)return i=!0,T.setMcpHealth(t,{status:"healthy",tokenVersion:e,oauthValid:!0}),{ready:!0,tokenDir:n,hint:`Tokens migrated from ${d.basename(c.from)} \u2014 restart your AI client.`,validated:!0,migrated:!0,cleaned:a};let m=[];try{m=(await g.readdir(r)).filter(v=>v.startsWith("mcp-remote-")&&v!==`mcp-remote-${e}`)}catch{}let p=a?`Previous tokens were invalid and cleaned. Run in a terminal: ${P[t]}`:m.length>0?`Legacy tokens found (${m.join(", ")}) but invalid. Run: ${P[t]}`:`OAuth not completed. Run in a terminal: ${P[t]}`;return T.setMcpHealth(t,{status:"unhealthy",lastError:p,tokenVersion:e,oauthValid:!1}),{ready:!1,tokenDir:null,hint:p,validated:!1,migrated:!1,cleaned:a}}o(G,"checkOAuthTokens");async function Rt(){let t=b(),e=d.join(C.homedir(),".mcp-auth"),r=[],n;try{n=await g.readdir(e)}catch{return{expectedVersion:t,dirs:r}}let i=n.filter(a=>a.startsWith("mcp-remote-")).sort();for(let a of i){let s=d.join(e,a),c=a.replace("mcp-remote-",""),m=c===t,p=[];try{if(!(await g.stat(s)).isDirectory())continue;p=await g.readdir(s)}catch{continue}let u=p.find(E=>E.endsWith("_tokens.json"))??null,v=!1,h,M=!1,O=!1,z;if(u)try{let E=await g.readFile(d.join(s,u),"utf-8"),w=JSON.parse(E);M=!!w.access_token,O=!!w.refresh_token,w.expires_in&&(z=w.expires_in),v=M||O,v||(h="no valid tokens (missing access_token/refresh_token)")}catch{h=`corrupt JSON in ${u}`}else{let E=p.filter(w=>w.endsWith(".json"));if(E.length===0)h="no token files found";else{for(let w of E)try{let Ft=await g.readFile(d.join(s,w),"utf-8"),J=JSON.parse(Ft);J.access_token&&(M=!0),J.refresh_token&&(O=!0),J.expires_in&&(z=J.expires_in)}catch{h=`corrupt JSON in ${w}`}v=M||O,!v&&!h&&(h="no valid tokens (missing access_token/refresh_token)")}}r.push({version:c,path:s,isCurrent:m,files:p,tokenFile:u,valid:v,reason:h,hasAccessToken:M,hasRefreshToken:O,expiresIn:z})}return{expectedVersion:t,dirs:r}}o(Rt,"scanTokenDirectories");async function ut(t=F()){try{let e=await g.readFile(t,"utf-8");return JSON.parse(e)}catch(e){let r=x(e).toLowerCase();if(r.includes("no such file")||r.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${t}: ${x(e)}`)}}o(ut,"readMcpConfig");async function Mt(t,e=F()){await q(e,t)}o(Mt,"writeMcpConfig");async function Yt(t,e,r=F()){let n=await ut(r),i={...n.mcpServers||{}},a=i[t];i[t]=e,n.mcpServers=i;let s=JSON.stringify(a)!==JSON.stringify(e);return await Mt(n,r),{path:r,changed:s}}o(Yt,"upsertMcpServer");async function zt(t,e=F()){return!!(await ut(e)).mcpServers?.[t]}o(zt,"hasMcpServer");function Kt(){return"---"}o(Kt,"mdHeader");function Zt(){return`---
30
30
  prjct v${Z()}`}o(Zt,"mdFooter");function Y(...t){return Qt(Kt(),...t.filter(Boolean),Zt())}o(Y,"mdOutput");function D(t,e){let r=`| ${t.join(" | ")} |`,n=`|${t.map(()=>"---").join("|")}|`,i=e.map(a=>`| ${a.join(" | ")} |`);return[r,n,...i].join(`
31
31
  `)}o(D,"mdTable");function Ot(t,e=""){return`\`\`\`${e}
32
32
  ${t}
@@ -34,5 +34,5 @@ ${t}
34
34
  ${e}`}o($,"mdSection");function _t(t,e=!1){return t.map((r,n)=>e?`${n+1}. ${r}`:`- ${r}`).join(`
35
35
  `)}o(_t,"mdList");function Qt(...t){return t.filter(Boolean).join(`
36
36
 
37
- `)}o(Qt,"mdJoin");function At(t=process.argv){let e=t.slice(2),r=e.indexOf("--json"),n=r!==-1;n&&e.splice(r,1);let i=e.indexOf("--md"),a=i!==-1;a&&e.splice(i,1);let[s,...c]=e;return{command:s,commandArgs:c,jsonMode:n,mdMode:a}}o(At,"parseCliArgs");var{command:lt,commandArgs:pt,jsonMode:Nt,mdMode:dt}=At();function j(t){if(Nt){console.log(JSON.stringify(t,null,2));return}if(typeof t=="string"){console.log(t);return}console.log(JSON.stringify(t,null,2))}o(j,"output");function I(t,e=1){console.error(Nt?JSON.stringify({error:t}):`Error: ${t}`),process.exit(e)}o(I,"error");async function te(){let t=b(),e=y("node:path").join(y("node:os").homedir(),".mcp-auth",`mcp-remote-${t}`),r=await X("jira"),n=await H(e),i=await bt("jira",at.jira),a=await W(),s=await G("jira");if(k.setMcpHealth("jira",{status:s.ready?"healthy":"unhealthy",tokenVersion:t,configValid:!0,oauthValid:s.ready,lastError:s.ready?null:s.hint}),dt){let c=[];c.push("## Jira MCP Setup"),r.autoFixed&&c.push(f("warn","MCP config was outdated and has been auto-fixed.")),n&&c.push(f("warn","Corrupted token files were cleaned up."));let m=i.map(p=>[p.provider,p.path,p.changed?"updated":"unchanged"]);c.push($("MCP Config",D(["Provider","Path","Status"],m))),a.migrated&&c.push(f("success",`Tokens migrated from ${y("node:path").basename(a.from)}.`)),s.ready?c.push(f("success","Jira MCP is ready. Restart your AI client to activate.")):(c.push(f("info","OAuth required \u2014 complete the steps below.")),c.push($("Next Steps",_t([`Open a NEW terminal and run:
38
- ${Ot(P.jira,"bash")}`,"Complete OAuth authorization in the browser.","Run `prjct jira verify --md` to confirm tokens were saved.","Restart your AI client. Jira MCP tools will be ready."],!0)))),console.log(Y(...c));return}j({success:!0,provider:"jira",mode:"mcp",configAutoFixed:r.autoFixed,tokensCleaned:n,tokensMigrated:a.migrated,oauthReady:s.ready,installedIn:i.map(c=>({provider:c.provider,path:c.path,updated:c.changed})),nextSteps:s.ready?["Restart your AI client \u2014 Jira MCP is ready."]:[`STEP 1 (done): MCP config written to ${i.map(c=>c.provider).join(", ")}.`,`STEP 2: Open a NEW terminal and run: ${P.jira}`,"STEP 2: A browser will open for OAuth \u2014 complete the authorization.","STEP 3: Run `prjct jira verify` to confirm tokens were saved.","STEP 4: Restart your AI client. Jira MCP tools will be ready."],authCommand:P.jira})}o(te,"setup");async function ee(){let t=await Rt(),e=await X("jira"),r=await R("jira"),n=await W(),i=b(),a=y("node:path").join(y("node:os").homedir(),".mcp-auth",`mcp-remote-${i}`),s=!1,c=t.dirs.find(u=>u.isCurrent);c&&!c.valid&&c.files.length>0&&!n.migrated&&(s=await H(a));let m=await G("jira"),p={installed:!1,verified:!1};try{p=await Tt.verify()}catch(u){p={installed:!1,verified:!1,message:`check failed: ${u instanceof Error?u.message:"unknown"}`}}if(dt){let u=[];if(u.push("## Jira MCP Verification"),r.configured?e.autoFixed&&u.push(f("warn","MCP config was outdated and has been auto-fixed.")):u.push(f("error","Jira MCP not configured. Run `prjct jira setup` first.")),t.dirs.length===0)u.push(f("error","No token directories found in `~/.mcp-auth/`. OAuth has not been completed."));else{let v=t.dirs.map(h=>[`mcp-remote-${h.version}`,h.isCurrent?"yes":"no",h.valid?"valid":"invalid",h.tokenFile??"\u2014",h.reason??(h.valid?"OK":"\u2014")]);u.push($("Token Directories",D(["Directory","Current","Status","Token File","Details"],v)))}n.migrated&&u.push(f("success",`Tokens auto-migrated from ${y("node:path").basename(n.from)}.`)),s&&u.push(f("warn","Corrupted token files were cleaned up.")),p.installed?p.verified?u.push(f("success","Context7 MCP is healthy.")):u.push(f("warn",`Context7 MCP configured but not working: ${p.message??"smoke check failed"}. Run \`prjct sync\` to repair.`)):u.push(f("warn","Context7 MCP not configured. Run `prjct sync` to install.")),m.ready?u.push(f("success","READY \u2014 Jira OAuth tokens verified. Restart your AI client to activate.")):u.push(f("error",`NOT READY \u2014 ${m.hint}`)),console.log(Y(...u));return}j({provider:"jira",command:"verify",expectedVersion:t.expectedVersion,dirs:t.dirs.map(u=>({version:u.version,isCurrent:u.isCurrent,valid:u.valid,tokenFile:u.tokenFile,reason:u.reason,hasAccessToken:u.hasAccessToken,hasRefreshToken:u.hasRefreshToken})),configValid:e.valid,configAutoFixed:e.autoFixed,migrated:n.migrated,migratedFrom:n.from,cleaned:s,ready:m.ready,hint:m.hint,context7:{installed:p.installed,verified:p.verified,message:p.message}})}o(ee,"verify");async function re(){let t=await R("jira"),e=await X("jira"),r=t.configured?await G("jira"):null;if(dt){let n=[];n.push("## Jira MCP Status");let i=[["MCP configured",t.configured?"yes":"no"],["Config valid",e.valid?"yes":`no (${e.issues.join(", ")})`]];r&&(i.push(["OAuth tokens",r.ready?"valid":"missing/invalid"]),r.migrated&&i.push(["Tokens migrated","yes"]),r.cleaned&&i.push(["Corrupted cleaned","yes"]));let a=t.providers.map(s=>[s.provider,s.configured?"yes":"no",s.path]);n.push(D(["Check","Result"],i)),n.push($("Providers",D(["Provider","Configured","Path"],a))),t.configured?r?.ready?n.push(f("success","Jira MCP is healthy. Restart your AI client if tools are not visible.")):n.push(f("warn",r?.hint??"OAuth tokens not found.")):n.push(f("error","Jira MCP not configured. Run `prjct jira setup` to configure.")),e.autoFixed&&n.push(f("info","MCP config was auto-fixed during this check.")),console.log(Y(...n));return}j({provider:"jira",mode:"mcp",configured:t.configured,configValid:e.valid,configAutoFixed:e.autoFixed,oauthReady:r?.ready??!1,oauthValidated:r?.validated??!1,oauthMigrated:r?.migrated??!1,oauthCleaned:r?.cleaned??!1,providers:t.providers,hint:t.configured?r?.hint??"":"Run `prjct jira setup` to configure Jira MCP."})}o(re,"status");async function ne(t,e,r){let{configured:n}=await R("jira");n||I("Jira MCP is not configured. Run `prjct jira setup` first.");let i={success:!0,provider:"jira",mode:"mcp",delegated:!0,command:t,args:e,hint:r?.hint??"Run this operation using Jira MCP tools in your current AI client session.",nextSteps:["Open your MCP-enabled AI client/session.",`Execute the Jira MCP operation for "${t}".`]};r?.jql&&(i.jql=r.jql),r?.scope&&(i.scope=r.scope),j(i)}o(ne,"runMcpOperation");async function ie(t){let{configured:e}=await R("jira");e||I("Jira MCP is not configured. Run `prjct jira setup` first."),j({success:!0,provider:"jira",mode:"mcp",delegated:!0,command:"sprint",scope:"active_sprint",args:t,jql:"sprint = currentSprint() AND assignee = currentUser() ORDER BY priority DESC",hint:"Fetch your issues in the active sprint via Jira MCP tools.",nextSteps:["Use the Jira MCP search tool with the JQL above to list your active sprint issues.","Issues returned include sprint metadata (sprint name, start/end dates)."]})}o(ie,"sprintOperation");async function oe(t){let{configured:e}=await R("jira");e||I("Jira MCP is not configured. Run `prjct jira setup` first."),j({success:!0,provider:"jira",mode:"mcp",delegated:!0,command:"backlog",scope:"backlog",args:t,jql:"sprint is EMPTY AND assignee = currentUser() AND statusCategory != Done ORDER BY priority DESC",hint:"Fetch your backlog issues (not in any sprint) via Jira MCP tools.",nextSteps:["Use the Jira MCP search tool with the JQL above to list your backlog issues.","Backlog issues have no sprint assigned \u2014 differentiate from sprint issues by the sprint field being empty."]})}o(oe,"backlogOperation");async function se(){try{switch(lt){case"setup":await te();break;case"verify":await ee();break;case"status":await re();break;case"help":case"--help":case"-h":case void 0:j({usage:"prjct jira <command>",commands:{setup:"Configure Jira MCP server",verify:"Verify OAuth tokens after completing authorization",status:"Check Jira MCP configuration",sprint:"List your issues in the active sprint (MCP)",backlog:"List your backlog issues not in any sprint (MCP)",sync:"Delegate issue sync via MCP tools",list:"Delegate issue listing via MCP tools",get:"Delegate issue retrieval via MCP tools",create:"Delegate issue creation via MCP tools",update:"Delegate issue update via MCP tools",start:"Delegate status transition to in-progress via MCP tools",done:"Delegate status transition to done via MCP tools",transition:"Delegate workflow transition via MCP tools"},note:"Jira is MCP-only. sprint/backlog provide JQL for your AI client MCP session."});break;case"sprint":await ie(pt);break;case"backlog":await oe(pt);break;case"sync":case"start":case"done":case"list":case"get":case"create":case"update":case"transition":case"comment":case"projects":case"boards":await ne(lt,pt);break;default:I(`Unknown command: ${lt}. Use --help to see available commands.`)}}catch(t){I(x(t))}}o(se,"main");se();
37
+ `)}o(Qt,"mdJoin");function At(t=process.argv){let e=t.slice(2),r=e.indexOf("--json"),n=r!==-1;n&&e.splice(r,1);let i=e.indexOf("--md"),a=i!==-1;a&&e.splice(i,1);let[s,...c]=e;return{command:s,commandArgs:c,jsonMode:n,mdMode:a}}o(At,"parseCliArgs");var{command:lt,commandArgs:pt,jsonMode:Nt,mdMode:dt}=At();function j(t){if(Nt){console.log(JSON.stringify(t,null,2));return}if(typeof t=="string"){console.log(t);return}console.log(JSON.stringify(t,null,2))}o(j,"output");function I(t,e=1){console.error(Nt?JSON.stringify({error:t}):`Error: ${t}`),process.exit(e)}o(I,"error");async function te(){let t=b(),e=y("node:path").join(y("node:os").homedir(),".mcp-auth",`mcp-remote-${t}`),r=await X("jira"),n=await H(e),i=await bt("jira",at.jira),a=await W(),s=await G("jira");if(T.setMcpHealth("jira",{status:s.ready?"healthy":"unhealthy",tokenVersion:t,configValid:!0,oauthValid:s.ready,lastError:s.ready?null:s.hint}),dt){let c=[];c.push("## Jira MCP Setup"),r.autoFixed&&c.push(f("warn","MCP config was outdated and has been auto-fixed.")),n&&c.push(f("warn","Corrupted token files were cleaned up."));let m=i.map(p=>[p.provider,p.path,p.changed?"updated":"unchanged"]);c.push($("MCP Config",D(["Provider","Path","Status"],m))),a.migrated&&c.push(f("success",`Tokens migrated from ${y("node:path").basename(a.from)}.`)),s.ready?c.push(f("success","Jira MCP is ready. Restart your AI client to activate.")):(c.push(f("info","OAuth required \u2014 complete the steps below.")),c.push($("Next Steps",_t([`Open a NEW terminal and run:
38
+ ${Ot(P.jira,"bash")}`,"Complete OAuth authorization in the browser.","Run `prjct jira verify --md` to confirm tokens were saved.","Restart your AI client. Jira MCP tools will be ready."],!0)))),console.log(Y(...c));return}j({success:!0,provider:"jira",mode:"mcp",configAutoFixed:r.autoFixed,tokensCleaned:n,tokensMigrated:a.migrated,oauthReady:s.ready,installedIn:i.map(c=>({provider:c.provider,path:c.path,updated:c.changed})),nextSteps:s.ready?["Restart your AI client \u2014 Jira MCP is ready."]:[`STEP 1 (done): MCP config written to ${i.map(c=>c.provider).join(", ")}.`,`STEP 2: Open a NEW terminal and run: ${P.jira}`,"STEP 2: A browser will open for OAuth \u2014 complete the authorization.","STEP 3: Run `prjct jira verify` to confirm tokens were saved.","STEP 4: Restart your AI client. Jira MCP tools will be ready."],authCommand:P.jira})}o(te,"setup");async function ee(){let t=await Rt(),e=await X("jira"),r=await R("jira"),n=await W(),i=b(),a=y("node:path").join(y("node:os").homedir(),".mcp-auth",`mcp-remote-${i}`),s=!1,c=t.dirs.find(u=>u.isCurrent);c&&!c.valid&&c.files.length>0&&!n.migrated&&(s=await H(a));let m=await G("jira"),p={installed:!1,verified:!1};try{p=await kt.verify()}catch(u){p={installed:!1,verified:!1,message:`check failed: ${u instanceof Error?u.message:"unknown"}`}}if(dt){let u=[];if(u.push("## Jira MCP Verification"),r.configured?e.autoFixed&&u.push(f("warn","MCP config was outdated and has been auto-fixed.")):u.push(f("error","Jira MCP not configured. Run `prjct jira setup` first.")),t.dirs.length===0)u.push(f("error","No token directories found in `~/.mcp-auth/`. OAuth has not been completed."));else{let v=t.dirs.map(h=>[`mcp-remote-${h.version}`,h.isCurrent?"yes":"no",h.valid?"valid":"invalid",h.tokenFile??"\u2014",h.reason??(h.valid?"OK":"\u2014")]);u.push($("Token Directories",D(["Directory","Current","Status","Token File","Details"],v)))}n.migrated&&u.push(f("success",`Tokens auto-migrated from ${y("node:path").basename(n.from)}.`)),s&&u.push(f("warn","Corrupted token files were cleaned up.")),p.installed?p.verified?u.push(f("success","Context7 MCP is healthy.")):u.push(f("warn",`Context7 MCP configured but not working: ${p.message??"smoke check failed"}. Run \`prjct sync\` to repair.`)):u.push(f("warn","Context7 MCP not configured. Run `prjct sync` to install.")),m.ready?u.push(f("success","READY \u2014 Jira OAuth tokens verified. Restart your AI client to activate.")):u.push(f("error",`NOT READY \u2014 ${m.hint}`)),console.log(Y(...u));return}j({provider:"jira",command:"verify",expectedVersion:t.expectedVersion,dirs:t.dirs.map(u=>({version:u.version,isCurrent:u.isCurrent,valid:u.valid,tokenFile:u.tokenFile,reason:u.reason,hasAccessToken:u.hasAccessToken,hasRefreshToken:u.hasRefreshToken})),configValid:e.valid,configAutoFixed:e.autoFixed,migrated:n.migrated,migratedFrom:n.from,cleaned:s,ready:m.ready,hint:m.hint,context7:{installed:p.installed,verified:p.verified,message:p.message}})}o(ee,"verify");async function re(){let t=await R("jira"),e=await X("jira"),r=t.configured?await G("jira"):null;if(dt){let n=[];n.push("## Jira MCP Status");let i=[["MCP configured",t.configured?"yes":"no"],["Config valid",e.valid?"yes":`no (${e.issues.join(", ")})`]];r&&(i.push(["OAuth tokens",r.ready?"valid":"missing/invalid"]),r.migrated&&i.push(["Tokens migrated","yes"]),r.cleaned&&i.push(["Corrupted cleaned","yes"]));let a=t.providers.map(s=>[s.provider,s.configured?"yes":"no",s.path]);n.push(D(["Check","Result"],i)),n.push($("Providers",D(["Provider","Configured","Path"],a))),t.configured?r?.ready?n.push(f("success","Jira MCP is healthy. Restart your AI client if tools are not visible.")):n.push(f("warn",r?.hint??"OAuth tokens not found.")):n.push(f("error","Jira MCP not configured. Run `prjct jira setup` to configure.")),e.autoFixed&&n.push(f("info","MCP config was auto-fixed during this check.")),console.log(Y(...n));return}j({provider:"jira",mode:"mcp",configured:t.configured,configValid:e.valid,configAutoFixed:e.autoFixed,oauthReady:r?.ready??!1,oauthValidated:r?.validated??!1,oauthMigrated:r?.migrated??!1,oauthCleaned:r?.cleaned??!1,providers:t.providers,hint:t.configured?r?.hint??"":"Run `prjct jira setup` to configure Jira MCP."})}o(re,"status");async function ne(t,e,r){let{configured:n}=await R("jira");n||I("Jira MCP is not configured. Run `prjct jira setup` first.");let i={success:!0,provider:"jira",mode:"mcp",delegated:!0,command:t,args:e,hint:r?.hint??"Run this operation using Jira MCP tools in your current AI client session.",nextSteps:["Open your MCP-enabled AI client/session.",`Execute the Jira MCP operation for "${t}".`]};r?.jql&&(i.jql=r.jql),r?.scope&&(i.scope=r.scope),j(i)}o(ne,"runMcpOperation");async function ie(t){let{configured:e}=await R("jira");e||I("Jira MCP is not configured. Run `prjct jira setup` first."),j({success:!0,provider:"jira",mode:"mcp",delegated:!0,command:"sprint",scope:"active_sprint",args:t,jql:"sprint = currentSprint() AND assignee = currentUser() ORDER BY priority DESC",hint:"Fetch your issues in the active sprint via Jira MCP tools.",nextSteps:["Use the Jira MCP search tool with the JQL above to list your active sprint issues.","Issues returned include sprint metadata (sprint name, start/end dates)."]})}o(ie,"sprintOperation");async function oe(t){let{configured:e}=await R("jira");e||I("Jira MCP is not configured. Run `prjct jira setup` first."),j({success:!0,provider:"jira",mode:"mcp",delegated:!0,command:"backlog",scope:"backlog",args:t,jql:"sprint is EMPTY AND assignee = currentUser() AND statusCategory != Done ORDER BY priority DESC",hint:"Fetch your backlog issues (not in any sprint) via Jira MCP tools.",nextSteps:["Use the Jira MCP search tool with the JQL above to list your backlog issues.","Backlog issues have no sprint assigned \u2014 differentiate from sprint issues by the sprint field being empty."]})}o(oe,"backlogOperation");async function se(){try{switch(lt){case"setup":await te();break;case"verify":await ee();break;case"status":await re();break;case"help":case"--help":case"-h":case void 0:j({usage:"prjct jira <command>",commands:{setup:"Configure Jira MCP server",verify:"Verify OAuth tokens after completing authorization",status:"Check Jira MCP configuration",sprint:"List your issues in the active sprint (MCP)",backlog:"List your backlog issues not in any sprint (MCP)",sync:"Delegate issue sync via MCP tools",list:"Delegate issue listing via MCP tools",get:"Delegate issue retrieval via MCP tools",create:"Delegate issue creation via MCP tools",update:"Delegate issue update via MCP tools",start:"Delegate status transition to in-progress via MCP tools",done:"Delegate status transition to done via MCP tools",transition:"Delegate workflow transition via MCP tools"},note:"Jira is MCP-only. sprint/backlog provide JQL for your AI client MCP session."});break;case"sprint":await ie(pt);break;case"backlog":await oe(pt);break;case"sync":case"start":case"done":case"list":case"get":case"create":case"update":case"transition":case"comment":case"projects":case"boards":await ne(lt,pt);break;default:I(`Unknown command: ${lt}. Use --help to see available commands.`)}}catch(t){I(x(t))}}o(se,"main");se();