prjct-cli 1.41.0 → 1.42.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,8 +5,8 @@ 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 Te=Object.defineProperty;var Pr=Object.getOwnPropertyDescriptor;var Ir=Object.getOwnPropertyNames;var kr=Object.prototype.hasOwnProperty;var o=(n,e)=>Te(n,"name",{value:e,configurable:!0}),yt=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var ee=(n,e)=>()=>(n&&(e=n(n=0)),e);var St=(n,e)=>{for(var t in e)Te(n,t,{get:e[t],enumerable:!0})},wr=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ir(e))!kr.call(n,s)&&s!==t&&Te(n,s,{get:()=>e[s],enumerable:!(r=Pr(e,s))||r.enumerable});return n};var Ge=n=>wr(Te({},"__esModule",{value:!0}),n);function Et(n){return n instanceof Error&&"code"in n}function V(n){return Et(n)&&n.code==="ENOENT"}function N(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var X=ee(()=>{"use strict";o(Et,"isNodeError");o(V,"isNotFoundError");o(N,"getErrorMessage")});var Tt={};St(Tt,{deleteCredential:()=>Dr,getCredential:()=>ie,getCredentialWithSource:()=>_r,hasCredential:()=>Rr,setCredential:()=>Ar});import{exec as vr}from"node:child_process";import{promisify as Cr}from"node:util";async function Ar(n,e){if(process.platform!=="darwin")return console.warn("[keychain] macOS Keychain only available on macOS"),!1;try{return await le(`security delete-generic-password -s "${ue}" -a "${n}" 2>/dev/null || true`),await le(`security add-generic-password -s "${ue}" -a "${n}" -w "${e}"`),!0}catch(t){return console.error("[keychain] Failed to store credential:",N(t)),!1}}async function ie(n){if(process.platform!=="darwin")return He(n);try{let{stdout:e}=await le(`security find-generic-password -s "${ue}" -a "${n}" -w 2>/dev/null`);return e.trim()||null}catch{return He(n)}}async function Dr(n){if(process.platform!=="darwin")return!1;try{return await le(`security delete-generic-password -s "${ue}" -a "${n}" 2>/dev/null`),!0}catch{return!1}}async function Rr(n){let e=await ie(n);return e!==null&&e.length>0}function He(n){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[n];return process.env[t]||null}async function _r(n){if(process.platform==="darwin")try{let{stdout:t}=await le(`security find-generic-password -s "${ue}" -a "${n}" -w 2>/dev/null`),r=t.trim();if(r)return{value:r,source:"keychain"}}catch{}let e=He(n);return e?{value:e,source:"env"}:{value:null,source:"none"}}var le,ue,be=ee(()=>{"use strict";X();le=Cr(vr),ue="prjct-cli";o(Ar,"setCredential");o(ie,"getCredential");o(Dr,"deleteCredential");o(Rr,"hasCredential");o(He,"getEnvFallback");o(_r,"getCredentialWithSource")});import Ct from"node:fs/promises";async function At(n,e){let t;try{t=await Ct.readFile(n,"utf-8")}catch(i){if(V(i))return null;throw i}let r;try{r=JSON.parse(t)}catch{return await wt(n,t),vt(n,"Malformed JSON"),null}let s=e.safeParse(r);return s.success?r:(await wt(n,t),vt(n,$r(s.error)),null)}async function wt(n,e){let t=`${n}.backup`;try{await Ct.writeFile(t,e,"utf-8")}catch{}}function vt(n,e){console.error(`[prjct] Warning: Corrupted storage file: ${n}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function $r(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Dt=ee(()=>{"use strict";X();o(At,"safeRead");o(wt,"createBackup");o(vt,"logCorruption");o($r,"formatZodError")});import pe from"node:fs/promises";async function ke(n,e=null,t){if(t)return await At(n,t)??e;try{let r=await pe.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(V(r))return e;throw r}}async function we(n,e,t=2){let r=JSON.stringify(e,null,t);await pe.writeFile(n,r,"utf-8")}async function k(n){try{return await pe.access(n),!0}catch(e){if(V(e))return!1;throw e}}async function Ke(n){try{return(await pe.stat(n)).isDirectory()}catch(e){if(V(e))return!1;throw e}}async function q(n){await pe.mkdir(n,{recursive:!0})}var de=ee(()=>{"use strict";Dt();X();o(ke,"readJson");o(we,"writeJson");o(k,"fileExists");o(Ke,"dirExists");o(q,"ensureDir")});import{z as J}from"zod";function _t(n,e){let t=n.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<3;s++){let i=t[s]??0,u=r[s]??0;if(i<u)return-1;if(i>u)return 1}return 0}var Di,Ri,_i,me,Li,ge=ee(()=>{"use strict";Di=J.enum(["opus","sonnet","haiku"]),Ri=J.enum(["2.5-pro","2.5-flash","2.0-flash"]),_i=J.string().min(1),me=J.object({provider:J.string(),model:J.string(),cliVersion:J.string().optional(),recordedAt:J.string()}),Li=J.object({preferredModel:J.string().optional(),lastAnalysisModel:me.optional()});o(_t,"compareSemver")});import Be from"node:fs/promises";import zr from"node:os";import Lt from"node:path";async function jt(){try{let n=await Be.readFile(Nt,"utf-8"),e=JSON.parse(n);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Gr?null:e.detection}catch{return null}}async function Mt(n){let e={timestamp:new Date().toISOString(),detection:n};await Be.mkdir(Ot,{recursive:!0}),await Be.writeFile(Nt,JSON.stringify(e,null,2))}var Ot,Nt,Gr,Ft=ee(()=>{"use strict";Ot=Lt.join(zr.homedir(),".prjct-cli","cache"),Nt=Lt.join(Ot,"providers.json"),Gr=600*1e3;o(jt,"readProviderCache");o(Mt,"writeProviderCache")});var Ae={};St(Ae,{AntigravityProvider:()=>Ye,ClaudeProvider:()=>ve,CodexProvider:()=>We,CursorProvider:()=>zt,GeminiProvider:()=>qe,Providers:()=>z,WindsurfProvider:()=>Gt,detectAllProviders:()=>Qe,detectAntigravity:()=>Qr,detectCodex:()=>Bt,detectCursorProject:()=>Ht,detectProvider:()=>Ve,detectWindsurfProject:()=>Kt,getActiveProvider:()=>Vr,getCapabilities:()=>Kr,getCommandsDir:()=>rn,getGlobalContextPath:()=>Zr,getGlobalSettingsPath:()=>en,getProjectCommandsPath:()=>nn,getProviderBranding:()=>Ce,getSkillsPath:()=>tn,hasProviderConfig:()=>qr,needsCursorRouterRegeneration:()=>Yr,needsWindsurfRouterRegeneration:()=>Wr,selectProvider:()=>sn,validateCliVersion:()=>Jt});import{exec as Xr}from"node:child_process";import Y from"node:os";import w from"node:path";import{promisify as Jr}from"node:util";function Kr(n,e){return{...Hr[n],...e}}async function Xt(n){try{let{stdout:e}=await Ut(`which ${n}`,{timeout:$t});return e.trim()}catch{return null}}async function Br(n){try{let{stdout:e}=await Ut(`${n} --version`,{timeout:$t}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Ve(n){let e=z[n];if(!e.cliCommand)return{installed:!1};let t=await Xt(e.cliCommand);if(!t)return{installed:!1};let r=await Br(e.cliCommand),s=Jt(n,r||void 0);return{installed:!0,version:r||void 0,path:t,versionWarning:s||void 0}}function Jt(n,e){let t=z[n];return!t.minCliVersion||!e?null:_t(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 Qe(n=!1){if(!n){let u=await jt();if(u)return u}let[e,t,r]=await Promise.all([Ve("claude"),Ve("gemini"),Bt()]),s={installed:r.installed},i={claude:e,gemini:t,codex:s};return await Mt(i).catch(()=>{}),i}async function Vr(n){if(n&&z[n])return z[n];let e=await Qe();return e.claude.installed&&!e.gemini.installed?ve:e.gemini.installed&&!e.claude.installed?qe:ve}async function qr(n){let e=z[n];return e.configDir?k(e.configDir):!1}function Ce(n){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"}[n]||"\u26A1 prjct"}}async function Ht(n){let e=w.join(n,".cursor"),t=w.join(e,"rules"),r=w.join(t,"prjct.mdc"),[s,i]=await Promise.all([k(e),k(r)]);return{detected:s,routerInstalled:i,projectRoot:s?n:void 0}}async function Yr(n){let e=await Ht(n);return e.detected&&!e.routerInstalled}async function Kt(n){let e=w.join(n,".windsurf"),t=w.join(e,"rules"),r=w.join(t,"prjct.md"),[s,i]=await Promise.all([k(e),k(r)]);return{detected:s,routerInstalled:i,projectRoot:s?n:void 0}}async function Wr(n){let e=await Kt(n);return e.detected&&!e.routerInstalled}async function Qr(){let n=Ye.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=w.join(n,"skills","prjct","SKILL.md"),[t,r]=await Promise.all([k(n),k(e)]);return{installed:t,skillInstalled:r,configPath:t?n:void 0}}async function Bt(){let n=We.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=await Xt("codex"),t=w.join(n,"skills","prjct","SKILL.md"),r=await k(t),s=!!e;return{installed:s,skillInstalled:r,configPath:s?n:void 0}}function Zr(n){let e=z[n];return e.configDir?w.join(e.configDir,e.contextFile):null}function en(n){let e=z[n];return!e.configDir||!e.settingsFile?null:w.join(e.configDir,e.settingsFile)}function tn(n){return z[n].skillsDir}function rn(n){return z[n].commandsDir}function nn(n,e){let t=z[n];return w.join(e,t.commandsDir)}async function sn(){let n=await Qe(),e=n.claude.installed,t=n.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:n}:e&&!t?{provider:"claude",userSelected:!1,detection:n}:t&&!e?{provider:"gemini",userSelected:!1,detection:n}:{provider:"claude",userSelected:!0,detection:n}}var Ut,$t,Hr,ve,qe,Ye,zt,Gt,We,z,fe=ee(()=>{"use strict";ge();de();Ft();Ut=Jr(Xr),$t=2e3,Hr={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}};o(Kr,"getCapabilities");ve={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:w.join(Y.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:w.join(Y.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"},qe={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:w.join(Y.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:w.join(Y.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"},Ye={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:w.join(Y.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:w.join(Y.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"},zt={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"},Gt={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"},We={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:w.join(Y.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:w.join(Y.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"},z={claude:ve,gemini:qe,cursor:zt,antigravity:Ye,windsurf:Gt,codex:We};o(Xt,"whichCommand");o(Br,"getCliVersion");o(Ve,"detectProvider");o(Jt,"validateCliVersion");o(Qe,"detectAllProviders");o(Vr,"getActiveProvider");o(qr,"hasProviderConfig");o(Ce,"getProviderBranding");o(Ht,"detectCursorProject");o(Yr,"needsCursorRouterRegeneration");o(Kt,"detectWindsurfProject");o(Wr,"needsWindsurfRouterRegeneration");o(Qr,"detectAntigravity");o(Bt,"detectCodex");o(Zr,"getGlobalContextPath");o(en,"getGlobalSettingsPath");o(tn,"getSkillsPath");o(rn,"getCommandsDir");o(nn,"getProjectCommandsPath");o(sn,"selectProvider")});var K=class{static{o(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((r,s)=>r[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of t)this.cache.delete(r)}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 xe=300*1e3,R=new K({ttl:xe,maxSize:100}),$=new K({ttl:xe,maxSize:10}),ne=new K({ttl:xe,maxSize:5}),se=new K({ttl:xe,maxSize:5});function Xe(){R.clear(),$.clear(),ne.clear(),se.clear()}o(Xe,"clearLinearCache");function Je(){return{issues:R.stats(),assignedIssues:$.stats(),teams:ne.stats(),projects:se.stats()}}o(Je,"getLinearCacheStats");X();be();var Lr={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},Or={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},xt={none:0,urgent:1,high:2,medium:3,low:4},Pe=class{static{o(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ie("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:r}=await import("@linear/sdk");this.sdk=new r({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${N(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,r={};e?.includeCompleted||(r.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(r.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(r).length>0?r:void 0});return Promise.all(s.nodes.map(i=>this.mapIssue(i)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(i=>this.mapIssue(i)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let r=e.match(/^([A-Z]+)-(\d+)$/);if(!r)return null;let[,s,i]=r,u=parseInt(i,10),x=(await this.sdk.teams({first:50})).nodes.find(F=>F.key===s);if(!x)return null;let A=await x.issues({first:1,filter:{number:{eq:u}}});return A.nodes.length>0?this.mapIssue(A.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?xt[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let r=await this.fetchIssue(e);if(!r)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=xt[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&r.team&&(s.labelIds=await this.resolveLabelIds(r.team.id,t.labels)),await this.sdk.updateIssue(r.id,s);let i=await this.fetchIssue(r.id);if(!i)throw new Error("Failed to fetch updated issue");return i}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let u=(await s.states()).nodes.find(p=>p.type==="started");u&&await this.sdk.updateIssue(t.id,{stateId:u.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let u=(await s.states()).nodes.find(p=>p.type==="completed");u&&await this.sdk.updateIssue(t.id,{stateId:u.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let r=await this.fetchIssue(e);if(!r)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:r.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,r=await e.assignee,s=await e.team,i=await e.project,u=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:Lr[t?.type||"backlog"]||"backlog",priority:Or[e.priority]||"none",type:this.inferType(e.title,u.nodes.map(p=>p.name)),assignee:r?{id:r.id,name:r.name,email:r.email}:void 0,labels:u.nodes.map(p=>p.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:i?{id:i.id,name:i.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let r=e.toLowerCase(),s=t.map(i=>i.toLowerCase());return s.includes("bug")||r.includes("fix")||r.includes("bug")?"bug":s.includes("feature")||r.includes("add")||r.includes("implement")?"feature":s.includes("improvement")||r.includes("improve")||r.includes("enhance")?"improvement":s.includes("chore")||r.includes("chore")||r.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(i=>t.includes(i.name)).map(i=>i.id):[]}},j=new Pe;var Ie=class{static{o(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&j.isConfigured()}async initialize(e){this.initialized||(await j.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let r={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(r)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,r=$.get(t);if(r)return r;let s=await j.fetchAssignedIssues(e);$.set(t,s);for(let i of s)R.set(`issue:${i.id}`,i),R.set(`issue:${i.externalId}`,i);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let r=`team:${e}`,s=$.get(r);if(s)return s;let i=await j.fetchTeamIssues(e,t);$.set(r,i);for(let u of i)R.set(`issue:${u.id}`,u),R.set(`issue:${u.externalId}`,u);return i}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,r=R.get(t);if(r)return r;let s=await j.fetchIssue(e);return s&&(R.set(`issue:${s.id}`,s),R.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await j.createIssue(e);return R.set(`issue:${t.id}`,t),R.set(`issue:${t.externalId}`,t),$.clear(),t}async updateIssue(e,t){this.ensureInitialized();let r=await j.updateIssue(e,t);return R.set(`issue:${r.id}`,r),R.set(`issue:${r.externalId}`,r),r}async markInProgress(e){this.ensureInitialized(),await j.markInProgress(e),R.delete(`issue:${e}`),$.clear()}async markDone(e){this.ensureInitialized(),await j.markDone(e),R.delete(`issue:${e}`),$.clear()}async addComment(e,t){this.ensureInitialized(),await j.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=ne.get("teams");if(e)return e;let t=await j.getTeams();return ne.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=se.get("projects");if(e)return e;let t=await j.getProjects();return se.set("projects",t),t}clearCache(){Xe()}getCacheStats(){return Je()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},T=new Ie;import{z as g}from"zod";var bt=g.enum(["linear","jira","github","monday","asana","none"]),Nr=g.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),jr=g.enum(["none","urgent","high","medium","low"]),Mr=g.enum(["feature","bug","improvement","task","chore","epic"]),Fr=g.object({id:g.string(),identifier:g.string(),title:g.string(),description:g.string().optional(),status:Nr,priority:jr,type:Mr.optional(),assignee:g.object({id:g.string(),name:g.string(),email:g.string().optional()}).optional(),labels:g.array(g.string()).default([]),team:g.object({id:g.string(),name:g.string(),key:g.string().optional()}).optional(),project:g.object({id:g.string(),name:g.string()}).optional(),url:g.string(),createdAt:g.string(),updatedAt:g.string(),fetchedAt:g.string()}),gi=g.object({provider:bt,lastSync:g.string(),staleAfter:g.number().default(18e5),issues:g.record(g.string(),Fr)}),fi=g.object({provider:bt,fetched:g.number(),updated:g.number(),errors:g.array(g.object({issueId:g.string(),error:g.string()})),timestamp:g.string()});function Pt(n){return{provider:n,lastSync:"",staleAfter:18e5,issues:{}}}o(Pt,"createEmptyIssues");import tt from"node:fs";import qt from"node:path";import on from"node:crypto";import H from"node:fs/promises";import Ze from"node:os";import d from"node:path";import{globSync as an}from"glob";import{formatDistanceToNowStrict as Ei}from"date-fns";function It(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}o(It,"getYearMonthDay");function I(){return new Date().toISOString()}o(I,"getTimestamp");function kt(n){let e=new Date;return e.setDate(e.getDate()-n),e}o(kt,"getDaysAgo");de();var et=class{static{o(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?d.resolve(e):d.join(Ze.homedir(),".prjct-cli"),this.globalProjectsDir=d.join(this.globalBaseDir,"projects"),this.globalConfigDir=d.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=d.resolve(e),this.globalProjectsDir=d.join(this.globalBaseDir,"projects"),this.globalConfigDir=d.join(this.globalBaseDir,"config")}generateProjectId(e){return on.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return d.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return d.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return d.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return d.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Ke(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await k(t)}async ensureGlobalStructure(){await q(this.globalBaseDir),await q(this.globalProjectsDir),await q(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),r=["core","progress","planning","analysis","memory","agents"];for(let s of r)await q(d.join(t,s));return await q(d.join(t,"planning","tasks")),await q(d.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:r,month:s,day:i}=It(t);return d.join(this.getGlobalProjectPath(e),"sessions",r,s,i)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let r=this.getSessionPath(e,t);return await q(r),r}async listSessions(e,t=null,r=null){let s=d.join(this.getGlobalProjectPath(e),"sessions"),i=[];try{let u=await H.readdir(s,{withFileTypes:!0});for(let p of u){if(!p.isDirectory()||t&&p.name!==t.toString())continue;let x=d.join(s,p.name),A=await H.readdir(x,{withFileTypes:!0});for(let F of A){if(!F.isDirectory()||r&&F.name!==r.toString().padStart(2,"0"))continue;let Se=d.join(x,F.name),ze=await H.readdir(Se,{withFileTypes:!0});for(let Ee of ze)Ee.isDirectory()&&i.push({year:p.name,month:F.name,day:Ee.name,path:d.join(Se,Ee.name),date:new Date(`${p.name}-${F.name}-${Ee.name}`)})}}return i.sort((p,x)=>x.date.getTime()-p.date.getTime()),i}catch{return[]}}async getSessionsInRange(e,t,r=new Date){return(await this.listSessions(e)).filter(i=>i.date>=t&&i.date<=r)}getFilePath(e,t,r){return d.join(this.getGlobalProjectPath(e),t,r)}async listProjects(){try{return await this.ensureGlobalStructure(),(await H.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 Ke(t)}getDisplayPath(e){let t=Ze.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return d.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return d.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return d.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return d.join(this.globalBaseDir,".running")}getDocsPath(){return d.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(fe(),Ge(Ae)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(fe(),Ge(Ae)).getActiveProvider();return(fe(),Ge(Ae)).getGlobalSettingsPath(e.name)}getClaudeDir(){return d.join(Ze.homedir(),".claude")}getClaudeSettingsPath(){return d.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?d.join(this.getGlobalProjectPath(e),"agents"):d.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return d.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return d.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},r=[{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 s of r){let i=d.join(e,s.file);if(await k(i)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=d.join(e,"package.json");if(await k(s))try{let i=await H.readFile(s,"utf-8");JSON.parse(i).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 r=[],s=[];try{if(t==="pnpm"){let u=(await H.readFile(d.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);u&&(s=u[1].split(`
9
- `).map(p=>p.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let i=d.join(e,"package.json"),u=await H.readFile(i,"utf-8"),p=JSON.parse(u);if(Array.isArray(p.workspaces)?s=p.workspaces:p.workspaces?.packages&&(s=p.workspaces.packages),t==="lerna"){let x=d.join(e,"lerna.json");if(await k(x)){let A=await H.readFile(x,"utf-8"),F=JSON.parse(A);F.packages&&(s=F.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let i=d.join(e,"package.json"),u=await H.readFile(i,"utf-8"),p=JSON.parse(u);Array.isArray(p.workspaces)&&(s=p.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let i of s){if(i.startsWith("!"))continue;let u=an(i,{cwd:e,absolute:!1});for(let p of u){let x=d.join(e,p),A=d.join(x,"package.json");if(await k(A))try{let F=await H.readFile(A,"utf-8"),Se=JSON.parse(F),ze=d.join(x,"PRJCT.md");r.push({name:Se.name||d.basename(p),path:x,relativePath:p,hasPrjctMd:await k(ze)})}catch{}}}}catch{}return r}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let r=d.resolve(e);for(let s of t.packages){let i=d.resolve(s.path);if(r.startsWith(i))return s}return null}async findMonorepoRoot(e){let t=d.resolve(e),r=d.parse(t).root;for(;t!==r;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=d.dirname(t)}return null}},cn=new et,W=cn;function ln(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}o(ln,"detectRuntime");function Vt(){return ln()==="bun"}o(Vt,"isBun");function un(n){if(Vt()){let{Database:s}=yt("bun:sqlite");return new s(n,{create:!0})}let e=yt("better-sqlite3"),t=new e(n),r=t.exec.bind(t);return t.run=s=>r(s),t}o(un,"openDatabase");var pn=[{version:1,name:"initial-schema",up:o(n=>{n.run(`
8
+ var Te=Object.defineProperty;var Pr=Object.getOwnPropertyDescriptor;var Ir=Object.getOwnPropertyNames;var kr=Object.prototype.hasOwnProperty;var o=(n,e)=>Te(n,"name",{value:e,configurable:!0}),St=(n=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(n,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):n)(function(n){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+n+'" is not supported')});var ee=(n,e)=>()=>(n&&(e=n(n=0)),e);var Et=(n,e)=>{for(var t in e)Te(n,t,{get:e[t],enumerable:!0})},wr=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ir(e))!kr.call(n,s)&&s!==t&&Te(n,s,{get:()=>e[s],enumerable:!(r=Pr(e,s))||r.enumerable});return n};var Ge=n=>wr(Te({},"__esModule",{value:!0}),n);function Tt(n){return n instanceof Error&&"code"in n}function V(n){return Tt(n)&&n.code==="ENOENT"}function N(n){return n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var X=ee(()=>{"use strict";o(Tt,"isNodeError");o(V,"isNotFoundError");o(N,"getErrorMessage")});var xt={};Et(xt,{deleteCredential:()=>Dr,getCredential:()=>ie,getCredentialWithSource:()=>_r,hasCredential:()=>Rr,setCredential:()=>Ar});import{exec as vr}from"node:child_process";import{promisify as Cr}from"node:util";async function Ar(n,e){if(process.platform!=="darwin")return console.warn("[keychain] macOS Keychain only available on macOS"),!1;try{return await le(`security delete-generic-password -s "${ue}" -a "${n}" 2>/dev/null || true`),await le(`security add-generic-password -s "${ue}" -a "${n}" -w "${e}"`),!0}catch(t){return console.error("[keychain] Failed to store credential:",N(t)),!1}}async function ie(n){if(process.platform!=="darwin")return He(n);try{let{stdout:e}=await le(`security find-generic-password -s "${ue}" -a "${n}" -w 2>/dev/null`);return e.trim()||null}catch{return He(n)}}async function Dr(n){if(process.platform!=="darwin")return!1;try{return await le(`security delete-generic-password -s "${ue}" -a "${n}" 2>/dev/null`),!0}catch{return!1}}async function Rr(n){let e=await ie(n);return e!==null&&e.length>0}function He(n){let t={"linear-api-key":"LINEAR_API_KEY","jira-api-token":"JIRA_API_TOKEN"}[n];return process.env[t]||null}async function _r(n){if(process.platform==="darwin")try{let{stdout:t}=await le(`security find-generic-password -s "${ue}" -a "${n}" -w 2>/dev/null`),r=t.trim();if(r)return{value:r,source:"keychain"}}catch{}let e=He(n);return e?{value:e,source:"env"}:{value:null,source:"none"}}var le,ue,be=ee(()=>{"use strict";X();le=Cr(vr),ue="prjct-cli";o(Ar,"setCredential");o(ie,"getCredential");o(Dr,"deleteCredential");o(Rr,"hasCredential");o(He,"getEnvFallback");o(_r,"getCredentialWithSource")});import At from"node:fs/promises";async function Dt(n,e){let t;try{t=await At.readFile(n,"utf-8")}catch(i){if(V(i))return null;throw i}let r;try{r=JSON.parse(t)}catch{return await vt(n,t),Ct(n,"Malformed JSON"),null}let s=e.safeParse(r);return s.success?r:(await vt(n,t),Ct(n,$r(s.error)),null)}async function vt(n,e){let t=`${n}.backup`;try{await At.writeFile(t,e,"utf-8")}catch{}}function Ct(n,e){console.error(`[prjct] Warning: Corrupted storage file: ${n}`),console.error(`[prjct] Reason: ${e}`),console.error("[prjct] A .backup file has been created. Returning defaults.")}function $r(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var Rt=ee(()=>{"use strict";X();o(Dt,"safeRead");o(vt,"createBackup");o(Ct,"logCorruption");o($r,"formatZodError")});import pe from"node:fs/promises";async function ke(n,e=null,t){if(t)return await Dt(n,t)??e;try{let r=await pe.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(V(r))return e;throw r}}async function we(n,e,t=2){let r=JSON.stringify(e,null,t);await pe.writeFile(n,r,"utf-8")}async function k(n){try{return await pe.access(n),!0}catch(e){if(V(e))return!1;throw e}}async function Ke(n){try{return(await pe.stat(n)).isDirectory()}catch(e){if(V(e))return!1;throw e}}async function q(n){await pe.mkdir(n,{recursive:!0})}var de=ee(()=>{"use strict";Rt();X();o(ke,"readJson");o(we,"writeJson");o(k,"fileExists");o(Ke,"dirExists");o(q,"ensureDir")});import{z as J}from"zod";function Lt(n,e){let t=n.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<3;s++){let i=t[s]??0,u=r[s]??0;if(i<u)return-1;if(i>u)return 1}return 0}var Di,Ri,_i,me,Li,ge=ee(()=>{"use strict";Di=J.enum(["opus","sonnet","haiku"]),Ri=J.enum(["2.5-pro","2.5-flash","2.0-flash"]),_i=J.string().min(1),me=J.object({provider:J.string(),model:J.string(),cliVersion:J.string().optional(),recordedAt:J.string()}),Li=J.object({preferredModel:J.string().optional(),lastAnalysisModel:me.optional()});o(Lt,"compareSemver")});import Be from"node:fs/promises";import zr from"node:os";import Ot from"node:path";async function Mt(){try{let n=await Be.readFile(jt,"utf-8"),e=JSON.parse(n);return!e.timestamp||!e.detection||Date.now()-new Date(e.timestamp).getTime()>Gr?null:e.detection}catch{return null}}async function Ft(n){let e={timestamp:new Date().toISOString(),detection:n};await Be.mkdir(Nt,{recursive:!0}),await Be.writeFile(jt,JSON.stringify(e,null,2))}var Nt,jt,Gr,Ut=ee(()=>{"use strict";Nt=Ot.join(zr.homedir(),".prjct-cli","cache"),jt=Ot.join(Nt,"providers.json"),Gr=600*1e3;o(Mt,"readProviderCache");o(Ft,"writeProviderCache")});var Ae={};Et(Ae,{AntigravityProvider:()=>Ye,ClaudeProvider:()=>ve,CodexProvider:()=>We,CursorProvider:()=>Gt,GeminiProvider:()=>qe,Providers:()=>z,WindsurfProvider:()=>Xt,detectAllProviders:()=>Qe,detectAntigravity:()=>Qr,detectCodex:()=>Vt,detectCursorProject:()=>Kt,detectProvider:()=>Ve,detectWindsurfProject:()=>Bt,getActiveProvider:()=>Vr,getCapabilities:()=>Kr,getCommandsDir:()=>rn,getGlobalContextPath:()=>Zr,getGlobalSettingsPath:()=>en,getProjectCommandsPath:()=>nn,getProviderBranding:()=>Ce,getSkillsPath:()=>tn,hasProviderConfig:()=>qr,needsCursorRouterRegeneration:()=>Yr,needsWindsurfRouterRegeneration:()=>Wr,selectProvider:()=>sn,validateCliVersion:()=>Ht});import{exec as Xr}from"node:child_process";import Y from"node:os";import w from"node:path";import{promisify as Jr}from"node:util";function Kr(n,e){return{...Hr[n],...e}}async function Jt(n){try{let{stdout:e}=await $t(`which ${n}`,{timeout:zt});return e.trim()}catch{return null}}async function Br(n){try{let{stdout:e}=await $t(`${n} --version`,{timeout:zt}),t=e.match(/\d+\.\d+\.\d+/);return t?t[0]:e.trim()}catch{return null}}async function Ve(n){let e=z[n];if(!e.cliCommand)return{installed:!1};let t=await Jt(e.cliCommand);if(!t)return{installed:!1};let r=await Br(e.cliCommand),s=Ht(n,r||void 0);return{installed:!0,version:r||void 0,path:t,versionWarning:s||void 0}}function Ht(n,e){let t=z[n];return!t.minCliVersion||!e?null:Lt(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 Qe(n=!1){if(!n){let u=await Mt();if(u)return u}let[e,t,r]=await Promise.all([Ve("claude"),Ve("gemini"),Vt()]),s={installed:r.installed},i={claude:e,gemini:t,codex:s};return await Ft(i).catch(()=>{}),i}async function Vr(n){if(n&&z[n])return z[n];let e=await Qe();return e.claude.installed&&!e.gemini.installed?ve:e.gemini.installed&&!e.claude.installed?qe:ve}async function qr(n){let e=z[n];return e.configDir?k(e.configDir):!1}function Ce(n){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"}[n]||"\u26A1 prjct"}}async function Kt(n){let e=w.join(n,".cursor"),t=w.join(e,"rules"),r=w.join(t,"prjct.mdc"),[s,i]=await Promise.all([k(e),k(r)]);return{detected:s,routerInstalled:i,projectRoot:s?n:void 0}}async function Yr(n){let e=await Kt(n);return e.detected&&!e.routerInstalled}async function Bt(n){let e=w.join(n,".windsurf"),t=w.join(e,"rules"),r=w.join(t,"prjct.md"),[s,i]=await Promise.all([k(e),k(r)]);return{detected:s,routerInstalled:i,projectRoot:s?n:void 0}}async function Wr(n){let e=await Bt(n);return e.detected&&!e.routerInstalled}async function Qr(){let n=Ye.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=w.join(n,"skills","prjct","SKILL.md"),[t,r]=await Promise.all([k(n),k(e)]);return{installed:t,skillInstalled:r,configPath:t?n:void 0}}async function Vt(){let n=We.configDir;if(!n)return{installed:!1,skillInstalled:!1};let e=await Jt("codex"),t=w.join(n,"skills","prjct","SKILL.md"),r=await k(t),s=!!e;return{installed:s,skillInstalled:r,configPath:s?n:void 0}}function Zr(n){let e=z[n];return e.configDir?w.join(e.configDir,e.contextFile):null}function en(n){let e=z[n];return!e.configDir||!e.settingsFile?null:w.join(e.configDir,e.settingsFile)}function tn(n){return z[n].skillsDir}function rn(n){return z[n].commandsDir}function nn(n,e){let t=z[n];return w.join(e,t.commandsDir)}async function sn(){let n=await Qe(),e=n.claude.installed,t=n.gemini.installed;return!e&&!t?{provider:"claude",userSelected:!1,detection:n}:e&&!t?{provider:"claude",userSelected:!1,detection:n}:t&&!e?{provider:"gemini",userSelected:!1,detection:n}:{provider:"claude",userSelected:!0,detection:n}}var $t,zt,Hr,ve,qe,Ye,Gt,Xt,We,z,fe=ee(()=>{"use strict";ge();de();Ut();$t=Jr(Xr),zt=2e3,Hr={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}};o(Kr,"getCapabilities");ve={name:"claude",displayName:"Claude Code",cliCommand:"claude",configDir:w.join(Y.homedir(),".claude"),contextFile:"CLAUDE.md",skillsDir:w.join(Y.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"},qe={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",configDir:w.join(Y.homedir(),".gemini"),contextFile:"GEMINI.md",skillsDir:w.join(Y.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"},Ye={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,configDir:w.join(Y.homedir(),".gemini","antigravity"),contextFile:"ANTIGRAVITY.md",skillsDir:w.join(Y.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"},Gt={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"},Xt={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"},We={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",configDir:w.join(Y.homedir(),".codex"),contextFile:"AGENTS.md",skillsDir:w.join(Y.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"},z={claude:ve,gemini:qe,cursor:Gt,antigravity:Ye,windsurf:Xt,codex:We};o(Jt,"whichCommand");o(Br,"getCliVersion");o(Ve,"detectProvider");o(Ht,"validateCliVersion");o(Qe,"detectAllProviders");o(Vr,"getActiveProvider");o(qr,"hasProviderConfig");o(Ce,"getProviderBranding");o(Kt,"detectCursorProject");o(Yr,"needsCursorRouterRegeneration");o(Bt,"detectWindsurfProject");o(Wr,"needsWindsurfRouterRegeneration");o(Qr,"detectAntigravity");o(Vt,"detectCodex");o(Zr,"getGlobalContextPath");o(en,"getGlobalSettingsPath");o(tn,"getSkillsPath");o(rn,"getCommandsDir");o(nn,"getProjectCommandsPath");o(sn,"selectProvider")});var K=class{static{o(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((r,s)=>r[1].timestamp-s[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of t)this.cache.delete(r)}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 xe=300*1e3,R=new K({ttl:xe,maxSize:100}),$=new K({ttl:xe,maxSize:10}),ne=new K({ttl:xe,maxSize:5}),se=new K({ttl:xe,maxSize:5});function Xe(){R.clear(),$.clear(),ne.clear(),se.clear()}o(Xe,"clearLinearCache");function Je(){return{issues:R.stats(),assignedIssues:$.stats(),teams:ne.stats(),projects:se.stats()}}o(Je,"getLinearCacheStats");X();be();var Lr={backlog:"backlog",unstarted:"todo",started:"in_progress",completed:"done",canceled:"cancelled",cancelled:"cancelled"},Or={0:"none",1:"urgent",2:"high",3:"medium",4:"low"},bt={none:0,urgent:1,high:2,medium:3,low:4},Pe=class{static{o(this,"LinearProvider")}name="linear";displayName="Linear";sdk=null;config=null;isConfigured(){return this.sdk!==null&&this.config?.enabled===!0}async initialize(e){this.config=e;let t=e.apiKey||await ie("linear-api-key");if(!t)throw new Error("LINEAR_API_KEY not configured. Run `p. linear setup` to configure.");let{LinearClient:r}=await import("@linear/sdk");this.sdk=new r({apiKey:t});try{await this.sdk.viewer}catch(s){throw this.sdk=null,new Error(`Linear connection failed: ${N(s)}`)}}async fetchAssignedIssues(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.sdk.viewer,r={};e?.includeCompleted||(r.state={type:{nin:["completed","canceled"]}}),this.config?.defaultTeamId&&(r.team={id:{eq:this.config.defaultTeamId}});let s=await t.assignedIssues({first:e?.limit||50,filter:Object.keys(r).length>0?r:void 0});return Promise.all(s.nodes.map(i=>this.mapIssue(i)))}async fetchTeamIssues(e,t){if(!this.sdk)throw new Error("Linear not initialized");let s=await(await this.sdk.team(e)).issues({first:t?.limit||50,filter:t?.includeCompleted?void 0:{state:{type:{nin:["completed","canceled"]}}}});return Promise.all(s.nodes.map(i=>this.mapIssue(i)))}async fetchIssue(e){if(!this.sdk)throw new Error("Linear not initialized");try{if(e.includes("-")&&/^[A-Z]+-\d+$/.test(e)){let r=e.match(/^([A-Z]+)-(\d+)$/);if(!r)return null;let[,s,i]=r,u=parseInt(i,10),x=(await this.sdk.teams({first:50})).nodes.find(F=>F.key===s);if(!x)return null;let A=await x.issues({first:1,filter:{number:{eq:u}}});return A.nodes.length>0?this.mapIssue(A.nodes[0]):null}let t=await this.sdk.issue(e);return this.mapIssue(t)}catch{return null}}async createIssue(e){if(!this.sdk)throw new Error("Linear not initialized");let t=e.teamId||this.config?.defaultTeamId;if(!t)throw new Error("Team ID required for creating issues");let s=await(await this.sdk.createIssue({teamId:t,title:e.title,description:e.description,priority:e.priority?bt[e.priority]:void 0,projectId:e.projectId||this.config?.defaultProjectId,assigneeId:e.assigneeId,labelIds:e.labels?await this.resolveLabelIds(t,e.labels):void 0})).issue;if(!s)throw new Error("Failed to create issue");return this.mapIssue(s)}async updateIssue(e,t){if(!this.sdk)throw new Error("Linear not initialized");let r=await this.fetchIssue(e);if(!r)throw new Error(`Issue ${e} not found`);let s={};t.title!==void 0&&(s.title=t.title),t.description!==void 0&&(s.description=t.description),t.priority!==void 0&&(s.priority=bt[t.priority]),t.assigneeId!==void 0&&(s.assigneeId=t.assigneeId),t.stateId!==void 0&&(s.stateId=t.stateId),t.projectId!==void 0&&(s.projectId=t.projectId),t.labels!==void 0&&r.team&&(s.labelIds=await this.resolveLabelIds(r.team.id,t.labels)),await this.sdk.updateIssue(r.id,s);let i=await this.fetchIssue(r.id);if(!i)throw new Error("Failed to fetch updated issue");return i}async markInProgress(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let u=(await s.states()).nodes.find(p=>p.type==="started");u&&await this.sdk.updateIssue(t.id,{stateId:u.id})}async markDone(e){if(!this.sdk)throw new Error("Linear not initialized");let t=await this.fetchIssue(e);if(!t)throw new Error(`Issue ${e} not found`);let s=await(await this.sdk.issue(t.id)).team;if(!s)throw new Error("Issue has no team");let u=(await s.states()).nodes.find(p=>p.type==="completed");u&&await this.sdk.updateIssue(t.id,{stateId:u.id})}async addComment(e,t){if(!this.sdk)throw new Error("Linear not initialized");let r=await this.fetchIssue(e);if(!r)throw new Error(`Issue ${e} not found`);await this.sdk.createComment({issueId:r.id,body:t})}async getTeams(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.teams({first:50})).nodes.map(t=>({id:t.id,name:t.name,key:t.key}))}async getProjects(){if(!this.sdk)throw new Error("Linear not initialized");return(await this.sdk.projects({first:50})).nodes.map(t=>({id:t.id,name:t.name}))}async mapIssue(e){let t=await e.state,r=await e.assignee,s=await e.team,i=await e.project,u=await e.labels();return{id:e.id,externalId:e.identifier,provider:"linear",title:e.title,description:e.description||void 0,status:Lr[t?.type||"backlog"]||"backlog",priority:Or[e.priority]||"none",type:this.inferType(e.title,u.nodes.map(p=>p.name)),assignee:r?{id:r.id,name:r.name,email:r.email}:void 0,labels:u.nodes.map(p=>p.name),team:s?{id:s.id,name:s.name,key:s.key}:void 0,project:i?{id:i.id,name:i.name}:void 0,url:e.url,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString(),raw:e}}inferType(e,t){let r=e.toLowerCase(),s=t.map(i=>i.toLowerCase());return s.includes("bug")||r.includes("fix")||r.includes("bug")?"bug":s.includes("feature")||r.includes("add")||r.includes("implement")?"feature":s.includes("improvement")||r.includes("improve")||r.includes("enhance")?"improvement":s.includes("chore")||r.includes("chore")||r.includes("deps")?"chore":"task"}async resolveLabelIds(e,t){return this.sdk?(await(await this.sdk.team(e)).labels()).nodes.filter(i=>t.includes(i.name)).map(i=>i.id):[]}},j=new Pe;var Ie=class{static{o(this,"LinearService")}initialized=!1;userId=null;isReady(){return this.initialized&&j.isConfigured()}async initialize(e){this.initialized||(await j.initialize(e),this.initialized=!0)}async initializeFromApiKey(e,t){let r={enabled:!0,provider:"linear",apiKey:e,defaultTeamId:t,syncOn:{task:!0,done:!0,ship:!0},enrichment:{enabled:!0,updateProvider:!0}};await this.initialize(r)}async fetchAssignedIssues(e){this.ensureInitialized();let t=`assigned:${this.userId||"me"}`,r=$.get(t);if(r)return r;let s=await j.fetchAssignedIssues(e);$.set(t,s);for(let i of s)R.set(`issue:${i.id}`,i),R.set(`issue:${i.externalId}`,i);return s}async fetchTeamIssues(e,t){this.ensureInitialized();let r=`team:${e}`,s=$.get(r);if(s)return s;let i=await j.fetchTeamIssues(e,t);$.set(r,i);for(let u of i)R.set(`issue:${u.id}`,u),R.set(`issue:${u.externalId}`,u);return i}async fetchIssue(e){this.ensureInitialized();let t=`issue:${e}`,r=R.get(t);if(r)return r;let s=await j.fetchIssue(e);return s&&(R.set(`issue:${s.id}`,s),R.set(`issue:${s.externalId}`,s)),s}async createIssue(e){this.ensureInitialized();let t=await j.createIssue(e);return R.set(`issue:${t.id}`,t),R.set(`issue:${t.externalId}`,t),$.clear(),t}async updateIssue(e,t){this.ensureInitialized();let r=await j.updateIssue(e,t);return R.set(`issue:${r.id}`,r),R.set(`issue:${r.externalId}`,r),r}async markInProgress(e){this.ensureInitialized(),await j.markInProgress(e),R.delete(`issue:${e}`),$.clear()}async markDone(e){this.ensureInitialized(),await j.markDone(e),R.delete(`issue:${e}`),$.clear()}async addComment(e,t){this.ensureInitialized(),await j.addComment(e,t)}async getTeams(){this.ensureInitialized();let e=ne.get("teams");if(e)return e;let t=await j.getTeams();return ne.set("teams",t),t}async getProjects(){this.ensureInitialized();let e=se.get("projects");if(e)return e;let t=await j.getProjects();return se.set("projects",t),t}clearCache(){Xe()}getCacheStats(){return Je()}ensureInitialized(){if(!this.initialized)throw new Error("Linear service not initialized. Call linearService.initialize() first or run `p. linear setup`.")}},T=new Ie;import{z as g}from"zod";var Pt=g.enum(["linear","jira","github","monday","asana","none"]),Nr=g.enum(["backlog","todo","in_progress","in_review","done","cancelled"]),jr=g.enum(["none","urgent","high","medium","low"]),Mr=g.enum(["feature","bug","improvement","task","chore","epic"]),Fr=g.object({id:g.string(),identifier:g.string(),title:g.string(),description:g.string().optional(),status:Nr,priority:jr,type:Mr.optional(),assignee:g.object({id:g.string(),name:g.string(),email:g.string().optional()}).optional(),labels:g.array(g.string()).default([]),team:g.object({id:g.string(),name:g.string(),key:g.string().optional()}).optional(),project:g.object({id:g.string(),name:g.string()}).optional(),url:g.string(),createdAt:g.string(),updatedAt:g.string(),fetchedAt:g.string()}),gi=g.object({provider:Pt,lastSync:g.string(),staleAfter:g.number().default(18e5),issues:g.record(g.string(),Fr)}),fi=g.object({provider:Pt,fetched:g.number(),updated:g.number(),errors:g.array(g.object({issueId:g.string(),error:g.string()})),timestamp:g.string()});function It(n){return{provider:n,lastSync:"",staleAfter:18e5,issues:{}}}o(It,"createEmptyIssues");import tt from"node:fs";import Yt from"node:path";import on from"node:crypto";import H from"node:fs/promises";import Ze from"node:os";import d from"node:path";import{globSync as an}from"glob";import{formatDistanceToNowStrict as Ei}from"date-fns";function kt(n){return{year:n.getFullYear().toString(),month:(n.getMonth()+1).toString().padStart(2,"0"),day:n.getDate().toString().padStart(2,"0")}}o(kt,"getYearMonthDay");function I(){return new Date().toISOString()}o(I,"getTimestamp");function wt(n){let e=new Date;return e.setDate(e.getDate()-n),e}o(wt,"getDaysAgo");de();var et=class{static{o(this,"PathManager")}globalBaseDir;globalProjectsDir;globalConfigDir;constructor(){let e=process.env.PRJCT_CLI_HOME?.trim();this.globalBaseDir=e?d.resolve(e):d.join(Ze.homedir(),".prjct-cli"),this.globalProjectsDir=d.join(this.globalBaseDir,"projects"),this.globalConfigDir=d.join(this.globalBaseDir,"config")}setGlobalBaseDir(e){this.globalBaseDir=d.resolve(e),this.globalProjectsDir=d.join(this.globalBaseDir,"projects"),this.globalConfigDir=d.join(this.globalBaseDir,"config")}generateProjectId(e){return on.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(e){return d.join(this.globalProjectsDir,e)}getLocalConfigPath(e){return d.join(e,".prjct","prjct.config.json")}getGlobalProjectConfigPath(e){return d.join(this.getGlobalProjectPath(e),"project.json")}getLegacyPrjctPath(e){return d.join(e,".prjct")}async hasLegacyStructure(e){let t=this.getLegacyPrjctPath(e);return await Ke(t)}async hasConfig(e){let t=this.getLocalConfigPath(e);return await k(t)}async ensureGlobalStructure(){await q(this.globalBaseDir),await q(this.globalProjectsDir),await q(this.globalConfigDir)}async ensureProjectStructure(e){await this.ensureGlobalStructure();let t=this.getGlobalProjectPath(e),r=["core","progress","planning","analysis","memory","agents"];for(let s of r)await q(d.join(t,s));return await q(d.join(t,"planning","tasks")),await q(d.join(t,"sessions")),t}getSessionPath(e,t=new Date){let{year:r,month:s,day:i}=kt(t);return d.join(this.getGlobalProjectPath(e),"sessions",r,s,i)}getCurrentSessionPath(e){return this.getSessionPath(e,new Date)}async ensureSessionPath(e,t=new Date){let r=this.getSessionPath(e,t);return await q(r),r}async listSessions(e,t=null,r=null){let s=d.join(this.getGlobalProjectPath(e),"sessions"),i=[];try{let u=await H.readdir(s,{withFileTypes:!0});for(let p of u){if(!p.isDirectory()||t&&p.name!==t.toString())continue;let x=d.join(s,p.name),A=await H.readdir(x,{withFileTypes:!0});for(let F of A){if(!F.isDirectory()||r&&F.name!==r.toString().padStart(2,"0"))continue;let Se=d.join(x,F.name),ze=await H.readdir(Se,{withFileTypes:!0});for(let Ee of ze)Ee.isDirectory()&&i.push({year:p.name,month:F.name,day:Ee.name,path:d.join(Se,Ee.name),date:new Date(`${p.name}-${F.name}-${Ee.name}`)})}}return i.sort((p,x)=>x.date.getTime()-p.date.getTime()),i}catch{return[]}}async getSessionsInRange(e,t,r=new Date){return(await this.listSessions(e)).filter(i=>i.date>=t&&i.date<=r)}getFilePath(e,t,r){return d.join(this.getGlobalProjectPath(e),t,r)}async listProjects(){try{return await this.ensureGlobalStructure(),(await H.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 Ke(t)}getDisplayPath(e){let t=Ze.homedir();return e.startsWith(t)?e.replace(t,"~"):e}getAuthConfigPath(){return d.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(e){return d.join(this.getGlobalProjectPath(e),"sync","pending.json")}getLastSyncPath(e){return d.join(this.getGlobalProjectPath(e),"sync","last-sync.json")}getRunningStatusPath(){return d.join(this.globalBaseDir,".running")}getDocsPath(){return d.join(this.globalBaseDir,"docs")}async getAgentDir(){return(await(fe(),Ge(Ae)).getActiveProvider()).configDir}async getAgentSettingsPath(){let e=await(fe(),Ge(Ae)).getActiveProvider();return(fe(),Ge(Ae)).getGlobalSettingsPath(e.name)}getClaudeDir(){return d.join(Ze.homedir(),".claude")}getClaudeSettingsPath(){return d.join(this.getClaudeDir(),"settings.json")}getAgentsPath(e){return e?d.join(this.getGlobalProjectPath(e),"agents"):d.join(this.globalBaseDir,"agents")}getStoragePath(e,t){return d.join(this.getGlobalProjectPath(e),"storage",t)}getContextPath(e){return d.join(this.getGlobalProjectPath(e),"context")}async detectMonorepo(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},r=[{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 s of r){let i=d.join(e,s.file);if(await k(i)){t.isMonorepo=!0,t.type=s.type;break}}if(!t.isMonorepo){let s=d.join(e,"package.json");if(await k(s))try{let i=await H.readFile(s,"utf-8");JSON.parse(i).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 r=[],s=[];try{if(t==="pnpm"){let u=(await H.readFile(d.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);u&&(s=u[1].split(`
9
+ `).map(p=>p.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean))}else if(t==="npm"||t==="lerna"){let i=d.join(e,"package.json"),u=await H.readFile(i,"utf-8"),p=JSON.parse(u);if(Array.isArray(p.workspaces)?s=p.workspaces:p.workspaces?.packages&&(s=p.workspaces.packages),t==="lerna"){let x=d.join(e,"lerna.json");if(await k(x)){let A=await H.readFile(x,"utf-8"),F=JSON.parse(A);F.packages&&(s=F.packages)}}}else if(t==="nx")s=["apps/*","libs/*","packages/*"];else if(t==="turborepo"){let i=d.join(e,"package.json"),u=await H.readFile(i,"utf-8"),p=JSON.parse(u);Array.isArray(p.workspaces)&&(s=p.workspaces)}s.length===0&&(s=["packages/*","apps/*","libs/*"]);for(let i of s){if(i.startsWith("!"))continue;let u=an(i,{cwd:e,absolute:!1});for(let p of u){let x=d.join(e,p),A=d.join(x,"package.json");if(await k(A))try{let F=await H.readFile(A,"utf-8"),Se=JSON.parse(F),ze=d.join(x,"PRJCT.md");r.push({name:Se.name||d.basename(p),path:x,relativePath:p,hasPrjctMd:await k(ze)})}catch{}}}}catch{}return r}async findContainingPackage(e,t){if(!t.isMonorepo)return null;let r=d.resolve(e);for(let s of t.packages){let i=d.resolve(s.path);if(r.startsWith(i))return s}return null}async findMonorepoRoot(e){let t=d.resolve(e),r=d.parse(t).root;for(;t!==r;){if((await this.detectMonorepo(t)).isMonorepo)return t;t=d.dirname(t)}return null}},cn=new et,W=cn;function ln(){return typeof globalThis<"u"&&"Bun"in globalThis?"bun":"node"}o(ln,"detectRuntime");function qt(){return ln()==="bun"}o(qt,"isBun");function un(n){if(qt()){let{Database:s}=St("bun:sqlite");return new s(n,{create:!0})}let e=St("better-sqlite3"),t=new e(n),r=t.exec.bind(t);return t.run=s=>r(s),t}o(un,"openDatabase");var pn=[{version:1,name:"initial-schema",up:o(n=>{n.run(`
10
10
  -- =======================================================================
11
11
  -- Document storage (backward-compatible with JSON file pattern)
12
12
  -- =======================================================================
@@ -296,18 +296,18 @@ var Te=Object.defineProperty;var Pr=Object.getOwnPropertyDescriptor;var Ir=Objec
296
296
 
297
297
  CREATE INDEX idx_llm_analysis_status ON llm_analysis(status);
298
298
  CREATE INDEX idx_llm_analysis_commit ON llm_analysis(commit_hash);
299
- `)},"up")}],rt=class{static{o(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return qt.join(W.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let r=this.getDbPath(e),s=qt.dirname(r);tt.existsSync(s)||tt.mkdirSync(s,{recursive:!0});let i=un(r);return i.run("PRAGMA journal_mode = WAL"),i.run("PRAGMA synchronous = NORMAL"),i.run("PRAGMA cache_size = -2000"),i.run("PRAGMA temp_store = MEMORY"),i.run("PRAGMA mmap_size = 268435456"),this.runMigrations(i),this.connections.set(e,i),i}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return tt.existsSync(this.getDbPath(e))}getDoc(e,t){let s=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,r){let s=this.getDb(e),i=JSON.stringify(r),u=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,i,u)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,r,s){let i=this.getDb(e),u=new Date().toISOString();i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(r),u)}getEvents(e,t,r=100){let s=this.getDb(e);return t?s.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,r):s.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(r)}query(e,t,...r){return this.getDb(e).prepare(t).all(...r)}run(e,t,...r){this.getDb(e).prepare(t).run(...r)}get(e,t,...r){return this.getDb(e).prepare(t).get(...r)??null}transaction(e,t){let r=this.getDb(e);return r.transaction(t)(r)}runMigrations(e){e.run(`
299
+ `)},"up")}],rt=class{static{o(this,"PrjctDatabase")}connections=new Map;getDbPath(e){return Yt.join(W.getGlobalProjectPath(e),"prjct.db")}getDb(e){let t=this.connections.get(e);if(t)return t;let r=this.getDbPath(e),s=Yt.dirname(r);tt.existsSync(s)||tt.mkdirSync(s,{recursive:!0});let i=un(r);return i.run("PRAGMA journal_mode = WAL"),i.run("PRAGMA synchronous = NORMAL"),i.run("PRAGMA cache_size = -2000"),i.run("PRAGMA temp_store = MEMORY"),i.run("PRAGMA mmap_size = 268435456"),this.runMigrations(i),this.connections.set(e,i),i}close(e){if(e){let t=this.connections.get(e);t&&(t.close(),this.connections.delete(e))}else this.connections.forEach(t=>{t.close()}),this.connections.clear()}exists(e){return tt.existsSync(this.getDbPath(e))}getDoc(e,t){let s=this.getDb(e).prepare("SELECT data FROM kv_store WHERE key = ?").get(t);return s?JSON.parse(s.data):null}setDoc(e,t,r){let s=this.getDb(e),i=JSON.stringify(r),u=new Date().toISOString();s.prepare("INSERT OR REPLACE INTO kv_store (key, data, updated_at) VALUES (?, ?, ?)").run(t,i,u)}deleteDoc(e,t){this.getDb(e).prepare("DELETE FROM kv_store WHERE key = ?").run(t)}hasDoc(e,t){return this.getDb(e).prepare("SELECT 1 FROM kv_store WHERE key = ?").get(t)!==null}appendEvent(e,t,r,s){let i=this.getDb(e),u=new Date().toISOString();i.prepare("INSERT INTO events (type, task_id, data, timestamp) VALUES (?, ?, ?, ?)").run(t,s??null,JSON.stringify(r),u)}getEvents(e,t,r=100){let s=this.getDb(e);return t?s.prepare("SELECT * FROM events WHERE type = ? ORDER BY id DESC LIMIT ?").all(t,r):s.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(r)}query(e,t,...r){return this.getDb(e).prepare(t).all(...r)}run(e,t,...r){this.getDb(e).prepare(t).run(...r)}get(e,t,...r){return this.getDb(e).prepare(t).get(...r)??null}transaction(e,t){let r=this.getDb(e);return r.transaction(t)(r)}runMigrations(e){e.run(`
300
300
  CREATE TABLE IF NOT EXISTS _migrations (
301
301
  version INTEGER PRIMARY KEY,
302
302
  name TEXT NOT NULL,
303
303
  applied_at TEXT NOT NULL
304
304
  )
305
- `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(r=>r.version));for(let r of pn)t.has(r.version)||e.transaction(()=>{r.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(r.version,r.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}},P=new rt;X();ge();import{z as f}from"zod";var dn=f.enum(["draft","verified","sealed"]),mn=f.object({name:f.string(),description:f.string(),location:f.string().optional(),severity:f.enum(["low","medium","high"]).optional(),language:f.string().optional(),framework:f.string().optional(),source:f.enum(["baseline","repo","context7","feedback"]).optional(),confidence:f.number().min(0).max(1).optional()}),gn=f.object({issue:f.string(),file:f.string(),suggestion:f.string(),severity:f.enum(["low","medium","high"]).optional(),language:f.string().optional(),framework:f.string().optional(),source:f.enum(["baseline","repo","context7","feedback"]).optional(),confidence:f.number().min(0).max(1).optional()}),fo=f.object({projectId:f.string(),languages:f.array(f.string()),frameworks:f.array(f.string()),packageManager:f.string().optional(),sourceDir:f.string().optional(),testDir:f.string().optional(),configFiles:f.array(f.string()),fileCount:f.number(),patterns:f.array(mn),antiPatterns:f.array(gn),analyzedAt:f.string(),modelMetadata:me.optional(),status:dn.default("draft"),commitHash:f.string().optional(),signature:f.string().optional(),sealedAt:f.string().optional(),verifiedAt:f.string().optional()});var ho={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"};import{z as b}from"zod";var De=b.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),he=b.object({primaryDomain:De,secondaryDomains:b.array(De),confidence:b.number().min(0).max(1),filePatterns:b.array(b.string()),relevantAgents:b.array(b.string())}),fn=b.object({classification:he,classifiedAt:b.string(),source:b.enum(["cache","history","llm","heuristic"]),descriptionHash:b.string(),projectId:b.string()}),To=b.object({entries:b.record(b.string(),fn),confirmedPatterns:b.array(b.object({descriptionHash:b.string(),classification:he,confirmedAt:b.string(),taskDescription:b.string()}))});import{z as m}from"zod";var hn=m.enum(["low","medium","high"]),yn=m.enum(["pending","converted","completed","archived","dormant"]),Yt=m.enum(["high","medium","low"]),Sn=m.object({impact:Yt,effort:Yt}),En=m.object({frontend:m.string().optional(),backend:m.string().optional(),payments:m.string().optional(),ai:m.string().optional(),deploy:m.string().optional(),other:m.array(m.string()).optional()}),Tn=m.object({name:m.string(),description:m.string()}),xn=m.object({name:m.string(),description:m.string().optional()}),bn=m.object({id:m.string(),text:m.string(),details:m.string().optional(),priority:hn,status:yn,tags:m.array(m.string()),addedAt:m.string(),completedAt:m.string().optional(),convertedTo:m.string().optional(),source:m.string().optional(),sourceFiles:m.array(m.string()).optional(),painPoints:m.array(m.string()).optional(),solutions:m.array(m.string()).optional(),filesAffected:m.array(m.string()).optional(),impactEffort:Sn.optional(),implementationNotes:m.string().optional(),stack:En.optional(),modules:m.array(Tn).optional(),roles:m.array(xn).optional(),risks:m.array(m.string()).optional(),risksCount:m.number().optional()}),Po=m.object({ideas:m.array(bn),lastUpdated:m.string()});var Io={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()};import{z as U}from"zod";var Pn=U.object({agentName:U.string(),reasoning:U.string(),confidence:U.number().min(0).max(1)}),In=U.object({subtasks:U.array(U.object({description:U.string(),domain:De,agent:U.string(),dependsOn:U.array(U.number())})),effort:U.enum(["low","medium","high"])}),Ao={classification:{schema:he,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Pn,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:In,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};ge();import{z as c}from"zod";var Wt=c.number().min(1).max(5),kn=c.enum(["exceeded","met","partial","failed"]),wn=c.enum(["definitely","probably","maybe","no"]),Qt=c.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),vn=c.object({estimated:c.object({hours:c.number(),confidence:c.enum(["low","medium","high"]).optional(),source:c.enum(["prd","manual","historical"]).optional()}),actual:c.object({hours:c.number(),commits:c.number().optional(),linesAdded:c.number().optional(),linesRemoved:c.number().optional(),sessions:c.number().optional()}),variance:c.object({hours:c.number(),percentage:c.number(),reason:Qt.optional(),explanation:c.string().optional()})}),Cn=c.object({name:c.string(),baseline:c.number().nullable(),target:c.number(),actual:c.number(),unit:c.string(),achieved:c.boolean(),percentOfTarget:c.number()}),An=c.object({criteria:c.string(),met:c.boolean(),notes:c.string().optional()}),Dn=c.object({metrics:c.array(Cn),acceptanceCriteria:c.array(An),overallSuccess:kn,successScore:c.number().min(0).max(100)}),Rn=c.object({category:c.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:c.string(),actionable:c.boolean(),action:c.string().optional()}),_n=c.object({whatWorked:c.array(c.string()),whatDidnt:c.array(c.string()),surprises:c.array(c.string()),recommendations:c.array(Rn)}),Ln=c.object({valueDelivered:c.number().min(1).max(10),userImpact:c.enum(["none","low","medium","high","critical"]),businessImpact:c.enum(["none","low","medium","high","critical"]),roiScore:c.number(),worthIt:wn,worthItReason:c.string().optional(),alternativeConsidered:c.string().optional(),betterAlternativeExists:c.boolean().optional()}),Zt=c.object({id:c.string(),taskId:c.string(),description:c.string(),estimatedMinutes:c.number().optional(),actualMinutes:c.number(),completedAsPlanned:c.boolean(),qualityScore:Wt,blockers:c.array(c.string()),agentUsed:c.string().optional(),skillsUsed:c.array(c.string()).optional(),startedAt:c.string(),completedAt:c.string()}),On=c.object({id:c.string(),featureId:c.string(),featureName:c.string(),prdId:c.string().nullable(),version:c.string().optional(),branch:c.string().optional(),prUrl:c.string().optional(),effort:vn,success:Dn.optional(),learnings:_n,roi:Ln,rating:Wt,taskOutcomes:c.array(Zt).optional(),startedAt:c.string(),shippedAt:c.string(),reviewedAt:c.string().optional(),reviewedBy:c.string().optional(),legacy:c.boolean().optional()}),Nn=c.object({totalFeatures:c.number(),averageEstimationAccuracy:c.number(),averageSuccessRate:c.number(),averageROI:c.number(),bySuccessLevel:c.object({exceeded:c.number(),met:c.number(),partial:c.number(),failed:c.number()}),variancePatterns:c.array(c.object({reason:Qt,count:c.number(),averageVariance:c.number()})),topLearnings:c.array(c.object({insight:c.string(),frequency:c.number()}))}),Oo=c.object({outcomes:c.array(On),taskOutcomes:c.array(Zt).optional(),aggregates:Nn.optional(),lastUpdated:c.string(),lastAggregated:c.string().optional()});import{z as v}from"zod";var Re=v.enum(["allow","deny","ask"]),Fo=v.enum(["read","write","delete","create"]),jn=v.record(v.string(),Re),nt=v.record(v.string(),Re),Mn=v.object({enabled:v.boolean().default(!0),allowedDomains:v.array(v.string()).optional(),blockedDomains:v.array(v.string()).optional()}),Uo=v.object({bash:jn.optional(),files:v.object({read:nt.optional(),write:nt.optional(),delete:nt.optional()}).optional(),web:Mn.optional(),skills:v.record(v.string(),Re).optional(),doomLoop:v.object({enabled:v.boolean().default(!0),maxRetries:v.number().default(3)}).optional(),externalDirectories:Re.default("ask")}),Fn=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Un=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],$n=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];function zn(){let n={};for(let e of Fn)n[e]="allow";for(let e of Un)n[e]="ask";for(let e of $n)n[e]="deny";return{bash:n,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}o(zn,"buildDefaultPermissions");var $o=zn();import{z as O}from"zod";var Jo=O.object({projectId:O.string(),name:O.string(),repoPath:O.string(),description:O.string().optional(),version:O.string().optional(),cliVersion:O.string().optional(),techStack:O.array(O.string()),fileCount:O.number(),commitCount:O.number(),createdAt:O.string(),lastSync:O.string(),lastSyncCommit:O.string().optional(),lastSyncBranch:O.string().optional()});var Ho={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()};import{z as l}from"zod";var Gn=l.enum(["planned","active","completed","shipped"]),Xn=l.enum(["low","medium","high"]),Jn=l.enum(["feature","breaking_change","refactor","infrastructure"]),Hn=l.enum(["completed","active","planned"]),Kn=l.enum(["planned","active","completed"]),Bn=l.enum(["git","git-branch","manual","prd"]),Vn=l.object({id:l.string(),description:l.string(),completed:l.boolean(),completedAt:l.string().optional()}),qn=l.object({id:l.string(),name:l.string(),status:Hn,completedAt:l.string().optional()}),Yn=l.object({goal:l.string(),phases:l.array(qn),successMetrics:l.array(l.string()).optional()}),Wn=l.object({hours:l.number(),minutes:l.number(),totalMinutes:l.number(),display:l.string().optional()}),Qn=l.object({hash:l.string(),message:l.string(),date:l.string(),author:l.string().optional()}),Zn=l.object({hours:l.number(),confidence:l.enum(["low","medium","high"]).optional(),breakdown:l.array(l.object({area:l.string(),hours:l.number()})).optional()}),es=l.object({hours:l.number().optional(),commits:l.number().optional(),linesAdded:l.number().optional(),linesRemoved:l.number().optional()}),ts=l.object({estimated:Zn.nullable(),actual:es.nullable()}),rs=l.object({totalHours:l.number(),allocatedHours:l.number(),bufferPercent:l.number().optional()}),ns=l.object({id:l.string(),name:l.string(),theme:l.string().optional(),goals:l.array(l.string()).optional(),features:l.array(l.string()),capacity:rs.optional(),status:Kn,startDate:l.string().optional(),endDate:l.string().optional()}),ss=l.object({id:l.string(),name:l.string(),description:l.string().optional(),date:l.string(),status:Gn,impact:Xn,effort:l.string().optional(),progress:l.number(),type:Jn.optional(),roi:l.number().optional(),why:l.array(l.string()).optional(),technicalNotes:l.array(l.string()).optional(),compatibility:l.string().optional(),phase:l.string().optional(),tasks:l.array(Vn),createdAt:l.string(),shippedAt:l.string().optional(),version:l.string().optional(),duration:Wn.optional(),taskCount:l.number().optional(),agent:l.string().optional(),sprintName:l.string().optional(),completedDate:l.string().optional(),prdId:l.string().nullable().optional(),legacy:l.boolean().optional(),inferredFrom:Bn.optional(),quarter:l.string().nullable().optional(),dependencies:l.array(l.string()).optional(),blockedBy:l.array(l.string()).optional(),effortTracking:ts.optional(),valueScore:l.number().optional(),commits:l.array(Qn).optional(),branch:l.string().optional(),commitsAhead:l.number().optional()}),is=l.object({id:l.string(),title:l.string(),prdId:l.string().nullable().optional(),valueScore:l.number().optional(),effortEstimate:l.number().optional(),reason:l.string().optional()}),qo=l.object({strategy:Yn.nullable().optional(),features:l.array(ss),backlog:l.array(l.union([l.string(),is])),lastUpdated:l.string(),quarters:l.array(ns).optional(),generatedFrom:l.enum(["git-history","manual","prd"]).optional(),generatedAt:l.string().optional()});var Yo={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null};import os from"node:crypto";import{homedir as as}from"node:os";import{join as cs}from"node:path";function te(){return os.randomUUID()}o(te,"generateUUID");var ls=cs(as(),".prjct-cli","projects");import{z as _}from"zod";var ia=_.object({sessionId:_.string(),projectId:_.string(),projectPath:_.string(),projectName:_.string().optional(),taskDescription:_.string(),taskStatus:_.enum(["active","paused"]),activeSubtaskIndex:_.number().optional(),subtaskCount:_.number().optional(),branch:_.string().optional(),linearId:_.string().optional(),filesModified:_.array(_.string()).optional(),durationWorkedSec:_.number().optional(),timestamp:_.string(),resumeHint:_.string()});import{z as h}from"zod";var us=h.enum(["feature","fix","improvement","refactor"]),er=h.enum(["pass","warning","fail","skipped"]),ps=h.enum(["added","changed","fixed","removed"]),ds=h.object({hours:h.number(),minutes:h.number(),totalMinutes:h.number()}),ms=h.object({filesChanged:h.number().nullable().optional(),linesAdded:h.number().nullable().optional(),linesRemoved:h.number().nullable().optional(),commits:h.number().nullable().optional()}),gs=h.object({description:h.string(),type:ps.optional()}),fs=h.object({lintStatus:er.nullable().optional(),lintDetails:h.string().optional(),testStatus:er.nullable().optional(),testDetails:h.string().optional()}),hs=h.object({hash:h.string().optional(),message:h.string().optional(),branch:h.string().optional()}),ys=h.object({id:h.string(),name:h.string(),version:h.string().nullable().optional(),type:us,agent:h.string().optional(),description:h.string().optional(),changes:h.array(gs).optional(),codeSnippets:h.array(h.string()).optional(),commit:hs.optional(),codeMetrics:ms.optional(),qualityMetrics:fs.optional(),quantitativeImpact:h.string().optional(),duration:ds.optional(),tasksCompleted:h.number().nullable().optional(),shippedAt:h.string(),featureId:h.string().optional()}),ca=h.object({shipped:h.array(ys),lastUpdated:h.string()});ge();import{z as a}from"zod";var Ss=a.enum(["low","medium","high","critical"]),rr=a.enum(["feature","bug","improvement","chore"]),Es=a.enum(["active","backlog","previously_active"]),Ts=a.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),xs=a.enum(["task_completed","feature_shipped","idea_captured","session_started"]),st=a.object({title:a.string(),description:a.string(),filesChanged:a.array(a.object({path:a.string(),action:a.enum(["created","modified","deleted"])})),whatWasDone:a.array(a.string()).min(1),outputForNextAgent:a.string().min(1),notes:a.string().optional()}),ma=a.object({output:a.string().min(1,"Subtask output is required"),summary:st}),bs=a.object({id:a.string(),description:a.string(),domain:a.string(),agent:a.string(),status:Ts,dependsOn:a.array(a.string()),startedAt:a.string().optional(),completedAt:a.string().optional(),output:a.string().optional(),summary:st.optional(),skipReason:a.string().optional(),blockReason:a.string().optional(),estimatedPoints:a.number().optional(),estimatedMinutes:a.number().optional()}),Ps=a.object({completed:a.number(),total:a.number(),percentage:a.number()}),nr=a.object({id:a.string(),description:a.string(),startedAt:a.string(),sessionId:a.string(),featureId:a.string().optional(),subtasks:a.array(bs).optional(),currentSubtaskIndex:a.number().optional(),subtaskProgress:Ps.optional(),linearId:a.string().optional(),linearUuid:a.string().optional(),estimatedPoints:a.number().optional(),estimatedMinutes:a.number().optional(),modelMetadata:me.optional()}),tr=a.object({id:a.string(),description:a.string(),status:a.literal("paused"),startedAt:a.string(),pausedAt:a.string(),pauseReason:a.string().optional()}),Is=a.object({stackConfirmed:a.array(a.string()).optional(),patternsDiscovered:a.array(a.string()).optional(),agentAccuracy:a.array(a.object({agent:a.string(),rating:a.enum(["helpful","neutral","inaccurate"]),note:a.string().optional()})).optional(),issuesEncountered:a.array(a.string()).optional()}),ks=a.object({taskId:a.string(),title:a.string(),classification:rr,startedAt:a.string(),completedAt:a.string(),subtaskCount:a.number(),subtaskSummaries:a.array(st),outcome:a.string(),branchName:a.string(),linearId:a.string().optional(),linearUuid:a.string().optional(),prUrl:a.string().optional(),feedback:Is.optional()}),ga=a.object({currentTask:nr.nullable(),previousTask:tr.nullable().optional(),pausedTasks:a.array(tr).optional(),taskHistory:a.array(ks).optional(),lastUpdated:a.string()}),sr=a.object({id:a.string(),description:a.string(),priority:Ss,type:rr,featureId:a.string().optional(),originFeature:a.string().optional(),completed:a.boolean(),completedAt:a.string().optional(),createdAt:a.string(),section:Es,agent:a.string().optional(),groupName:a.string().optional(),groupId:a.string().optional()}),ir=a.object({tasks:a.array(sr),lastUpdated:a.string()}),ws=a.object({tasksToday:a.number(),tasksThisWeek:a.number(),streak:a.number(),velocity:a.string(),avgDuration:a.string()}),vs=a.object({type:xs,description:a.string(),timestamp:a.string(),duration:a.string().optional()}),fa=a.object({projectId:a.string(),currentTask:nr.nullable(),queue:a.array(sr),stats:ws,recentActivity:a.array(vs),lastSync:a.string()});import{z as y}from"zod";var Cs=y.enum(["improving","stable","declining"]),As=y.object({sprintNumber:y.number(),startDate:y.string(),endDate:y.string(),pointsCompleted:y.number(),tasksCompleted:y.number(),avgVariance:y.number(),estimationAccuracy:y.number()}),or=y.object({category:y.string(),avgVariance:y.number(),taskCount:y.number()}),Ea=y.object({totalPoints:y.number(),sprints:y.number(),estimatedDate:y.string()}),Ta=y.object({sprints:y.array(As),averageVelocity:y.number(),velocityTrend:Cs,estimationAccuracy:y.number(),overEstimated:y.array(or),underEstimated:y.array(or),lastUpdated:y.string()}),xa=y.object({sprintLengthDays:y.number().min(1).max(90).default(7),startDay:y.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:y.number().min(1).max(52).default(6),accuracyTolerance:y.number().min(0).max(100).default(20)});var ar={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},it=class{static{o(this,"ArchiveStorage")}archive(e,t){let r=te(),s=I();return P.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),r}archiveMany(e,t){if(t.length===0)return 0;let r=I();return P.transaction(e,s=>{let i=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let u of t)i.run(te(),u.entityType,u.entityId,JSON.stringify(u.entityData),u.summary??null,r,u.reason)}),t.length}getArchived(e,t,r=50){return t?P.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,r):P.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(e){let t=P.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let i=s.entity_type;i in r&&(r[i]=s.count),r.total+=s.count}return r}restore(e,t){let r=P.get(e,"SELECT * FROM archives WHERE id = ?",t);return r?(P.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(r.entity_data)):null}pruneOldArchives(e,t){let r=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);P.run(e,"DELETE FROM archives WHERE archived_at < ?",r);let i=this.getTotalCount(e);return s-i}getTotalCount(e){return P.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},cr=new it;import{z as E}from"zod";var oe={create(n,e){class t extends Error{static{o(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let i=e.parse(s);super(`${n}: ${JSON.stringify(i)}`),this.name=n,this.errorName=n,this.data=i,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===n}static create(s){return new t(s)}}return t}},Za=oe.create("FileError",E.object({path:E.string(),operation:E.enum(["read","write","delete","create","copy"]),reason:E.string().optional()})),ec=oe.create("ValidationError",E.object({field:E.string(),expected:E.string(),received:E.string().optional(),message:E.string().optional()})),tc=oe.create("PermissionError",E.object({action:E.string(),resource:E.string(),reason:E.string().optional()})),rc=oe.create("TaskError",E.object({taskId:E.string().optional(),operation:E.enum(["create","update","complete","pause","resume","delete"]),reason:E.string()})),nc=oe.create("SessionError",E.object({sessionId:E.string().optional(),reason:E.string()})),sc=oe.create("SyncError",E.object({projectId:E.string().optional(),operation:E.enum(["push","pull","auth","connect"]),reason:E.string()})),ot=class extends Error{static{o(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)}};function Ds(n){return n instanceof ot}o(Ds,"isPrjctError");function lr(n){return Ds(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}o(lr,"getErrorMessage");var _e={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"};X();var ct={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80};var ur={HISTORY_MAX:100};var ae={error:0,warn:1,info:2,debug:3},Ls=new Set(["1","true","*"]);function Os(){let n=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!n)return{level:-1,name:"disabled"};if(Ls.has(n)||n.includes("prjct"))return{level:ae.debug,name:"debug"};let e=ae[n]??-1,t=e>=0?n:"disabled";return{level:e,name:t}}o(Os,"getLogLevel");var{level:pr,name:Ns}=Os(),js=o(()=>{},"noop");function Le(n,e,t){return pr>=n?(...r)=>console[t](e,...r):js}o(Le,"createLogMethod");var Ms={error:Le(ae.error,"[prjct:error]","error"),warn:Le(ae.warn,"[prjct:warn]","warn"),info:Le(ae.info,"[prjct:info]","log"),debug:Le(ae.debug,"[prjct:debug]","log"),isEnabled:o(()=>pr>=0,"isEnabled"),level:o(()=>Ns,"level")},Oe=Ms;var Ne=class{static{o(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=ur.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let r=this.onceListeners.get(e);r&&r.delete(t)}}off(e,t){let r=this.listeners.get(e);r&&r.delete(t)}async emit(e,t={}){let r=new Date().toISOString(),s={type:e,timestamp:r,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let i=this.getMatchingListeners(e);(await Promise.allSettled(i.map(A=>this.executeCallback(A,s)))).forEach(A=>{A.status==="rejected"&&Oe.error(`Event listener error for ${e}:`,A.reason)});let p=this.onceListeners.get(e);if(p){for(let A of p)await this.executeCallback(A,s);this.onceListeners.delete(e)}let x=this.onceListeners.get(_e.ALL);if(x)for(let A of x)await this.executeCallback(A,s)}getMatchingListeners(e){let t=[],r=this.listeners.get(e);r&&t.push(...r);let s=this.listeners.get(_e.ALL);s&&t.push(...s);let i=e.split(".")[0],u=this.listeners.get(`${i}.*`);return u&&t.push(...u),t}async executeCallback(e,t){try{let r=e(t);r instanceof Promise&&await r}catch(r){throw Oe.error("Event callback error:",r),r}}async logEvent(e){try{P.appendEvent(this.projectId,e.type,e)}catch(t){Oe.debug("Failed to log event:",lr(t))}}getHistory(e=10,t=null){let r=this.history;return t&&(r=r.filter(s=>s.type===t||s.type.startsWith(t))),r.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Fs=new Ne;de();var je=class{static{o(this,"SyncEventBus")}async publish(e){let t=W.getSyncPendingPath(e.projectId),r=await ke(t,[])??[];r.push(e),await we(t,r)}async getPending(e){let t=W.getSyncPendingPath(e);return await ke(t,[])??[]}async clearPending(e){let t=W.getSyncPendingPath(e);await we(t,[])}async updateLastSync(e){let t=W.getLastSyncPath(e),r={timestamp:I(),success:!0};await we(t,r)}async getLastSync(e){let t=W.getLastSyncPath(e);return await ke(t,null)}},lt=new je;var Me=class{static{o(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new K({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 r=P.getDoc(e,this.getStoreKey());if(r!==null)return this.cache.set(e,r),r}catch{}return this.getDefault()}async write(e,t){P.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let r=await this.read(e),s=t(r);return await this.write(e,s),s}async publishEvent(e,t,r){let s={type:t,path:[this.filename.replace(".json","")],data:r,timestamp:I(),projectId:e};await lt.publish(s)}async publishEntityEvent(e,t,r,s){let i=`${t}.${r}`,u={...s,timestamp:I()};await this.publishEvent(e,i,u)}async exists(e){try{return P.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}};var ut=class extends Me{static{o(this,"QueueStorage")}constructor(){super("queue.json",ir)}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(r=>r.section==="active"&&!r.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(r=>r.section==="backlog"&&!r.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let r={...t,id:te(),createdAt:I(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,r],lastUpdated:I()})),await this.publishEvent(e,"queue.task_added",{taskId:r.id,description:r.description,priority:r.priority,section:r.section}),r}async addTasks(e,t){let r=I(),s=t.map(i=>({...i,id:te(),createdAt:r,completed:!1}));return await this.update(e,i=>({tasks:[...i.tasks,...s],lastUpdated:r})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(i=>({id:i.id,description:i.description}))}),s}async removeTask(e,t){await this.update(e,r=>({tasks:r.tasks.filter(s=>s.id!==t),lastUpdated:I()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let r=null;if(await this.update(e,s=>({tasks:s.tasks.map(u=>u.id===t?(r={...u,completed:!0,completedAt:I()},r):u),lastUpdated:I()})),r){let s=r;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return r}async moveToSection(e,t,r){await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?{...i,section:r}:i),lastUpdated:I()}))}async setPriority(e,t,r){await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?{...i,priority:r}:i),lastUpdated:I()}))}async clearCompleted(e){let r=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(i=>!i.completed),lastUpdated:I()})),r}async removeStaleCompleted(e){let t=await this.read(e),r=kt(ar.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(u=>u.completed&&u.completedAt&&new Date(u.completedAt)<r);if(s.length===0)return 0;cr.archiveMany(e,s.map(u=>({entityType:"queue_task",entityId:u.id,entityData:u,summary:u.description,reason:"age"})));let i=new Set(s.map(u=>u.id));return await this.update(e,u=>({tasks:u.tasks.filter(p=>!i.has(p.id)),lastUpdated:I()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},r={active:0,previously_active:1,backlog:2};return[...e].sort((s,i)=>{let u=r[s.section]-r[i.section];if(u!==0)return u;let p=t[s.priority]-t[i.priority];return p!==0?p:new Date(s.createdAt).getTime()-new Date(i.createdAt).getTime()})}},pt=new ut;X();var Us=/\b[A-Z]+-\d+\b/,dr=1800*1e3,Fe=class{static{o(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),r=[];try{let s=await T.fetchAssignedIssues({limit:100}),i={};for(let p of s)try{i[p.externalId]=this.toCachedIssue(p,t)}catch(x){r.push({issueId:p.externalId||p.id,error:N(x)})}let u={provider:"linear",lastSync:t,staleAfter:dr,issues:i};return P.setDoc(e,"issues",u),{provider:"linear",fetched:s.length,updated:Object.keys(i).length,errors:r,timestamp:t}}catch(s){return r.push({issueId:"all",error:N(s)}),{provider:"linear",fetched:0,updated:0,errors:r,timestamp:t}}}async getIssue(e,t){let r=this.loadIssues(e);if(r?.issues[t]){let s=r.issues[t],i=new Date(s.fetchedAt).getTime(),u=Date.now(),p=600*1e3;if(u-i<p)return s}try{let s=await T.fetchIssue(t);if(!s)return null;let i=new Date().toISOString(),u=this.toCachedIssue(s,i);return this.updateIssueInCache(e,t,u),u}catch{return r?.issues[t]?r.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,r){r==="in_progress"?await T.markInProgress(t):r==="done"&&await T.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let i=r==="done"?"done":"in_progress";s.issues[t].status=i,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let r=new Date(t.lastSync).getTime(),s=Date.now(),i=t.staleAfter||dr;return s-r>i}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}async reconcileQueue(e){let t=this.loadIssues(e);if(!t)return 0;let r=new Set;for(let[u,p]of Object.entries(t.issues))(p.status==="done"||p.status==="in_review")&&r.add(u);if(r.size===0)return 0;let s=await pt.getTasks(e),i=0;for(let u of s){if(u.completed)continue;let p=u.description.match(Us);p&&r.has(p[0])&&(await pt.completeTask(e,u.id),i++)}return i}loadIssues(e){try{return P.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){P.setDoc(e,"issues",t)}updateIssueInCache(e,t,r){let s=this.loadIssues(e);s||(s=Pt("linear")),s.issues[t]=r,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},ce=new Fe;X();import M from"chalk";fe();import re from"chalk";var mr=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],$s=80,zs={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:mr,speed:$s},cli:{header:o(()=>`${re.cyan.bold("\u26A1")} ${re.cyan("prjct")}`,"header"),footer:o(()=>re.dim("\u26A1 prjct"),"footer"),spin:o((n,e)=>`${re.cyan("\u26A1")} ${re.cyan("prjct")} ${re.cyan(mr[n%10])} ${re.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:o((n="claude")=>Ce(n).commitFooter,"getCommitFooter"),getSignature:o((n="claude")=>Ce(n).signature,"getSignature")},dt=zs;var jl=dt.spinner.frames,Ml=dt.spinner.speed,Xs={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},ye="compact";function gr(n){ye=n}o(gr,"setOutputTier");function gt(){return Xs[ye]}o(gt,"getTierConfig");var Fl={success:M.green("\u2713"),fail:M.red("\u2717"),warn:M.yellow("\u26A0"),info:M.blue("\u2139"),debug:M.dim("\u{1F527}"),bullet:M.dim("\u2022"),arrow:M.dim("\u2192"),check:M.green("\u2713"),cross:M.red("\u2717"),spinner:M.cyan("\u25D0")};var Ue=o((n,e)=>{let t=e??(gt().maxCharsPerLine||ct.FALLBACK_TRUNCATE);return n&&n.length>t?`${n.slice(0,t-1)}\u2026`:n||""},"truncate");function mt(n,e){let t=e??gt().maxLines;if(t===1/0||t===0)return n;let r=n.split(`
305
+ `);let t=new Set(e.prepare("SELECT version FROM _migrations").all().map(r=>r.version));for(let r of pn)t.has(r.version)||e.transaction(()=>{r.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(r.version,r.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}},P=new rt;X();ge();import{z as f}from"zod";var dn=f.enum(["draft","verified","sealed"]),mn=f.object({name:f.string(),description:f.string(),location:f.string().optional(),severity:f.enum(["low","medium","high"]).optional(),language:f.string().optional(),framework:f.string().optional(),source:f.enum(["baseline","repo","context7","feedback"]).optional(),confidence:f.number().min(0).max(1).optional()}),gn=f.object({issue:f.string(),file:f.string(),suggestion:f.string(),severity:f.enum(["low","medium","high"]).optional(),language:f.string().optional(),framework:f.string().optional(),source:f.enum(["baseline","repo","context7","feedback"]).optional(),confidence:f.number().min(0).max(1).optional()}),fo=f.object({projectId:f.string(),languages:f.array(f.string()),frameworks:f.array(f.string()),packageManager:f.string().optional(),sourceDir:f.string().optional(),testDir:f.string().optional(),configFiles:f.array(f.string()),fileCount:f.number(),patterns:f.array(mn),antiPatterns:f.array(gn),analyzedAt:f.string(),modelMetadata:me.optional(),status:dn.default("draft"),commitHash:f.string().optional(),signature:f.string().optional(),sealedAt:f.string().optional(),verifiedAt:f.string().optional()});var ho={languages:[],frameworks:[],configFiles:[],fileCount:0,patterns:[],antiPatterns:[],analyzedAt:new Date().toISOString(),status:"draft"};import{z as b}from"zod";var De=b.enum(["frontend","backend","database","devops","testing","docs","uxui","general"]),he=b.object({primaryDomain:De,secondaryDomains:b.array(De),confidence:b.number().min(0).max(1),filePatterns:b.array(b.string()),relevantAgents:b.array(b.string())}),fn=b.object({classification:he,classifiedAt:b.string(),source:b.enum(["cache","history","llm","heuristic"]),descriptionHash:b.string(),projectId:b.string()}),To=b.object({entries:b.record(b.string(),fn),confirmedPatterns:b.array(b.object({descriptionHash:b.string(),classification:he,confirmedAt:b.string(),taskDescription:b.string()}))});import{z as m}from"zod";var hn=m.enum(["low","medium","high"]),yn=m.enum(["pending","converted","completed","archived","dormant"]),Wt=m.enum(["high","medium","low"]),Sn=m.object({impact:Wt,effort:Wt}),En=m.object({frontend:m.string().optional(),backend:m.string().optional(),payments:m.string().optional(),ai:m.string().optional(),deploy:m.string().optional(),other:m.array(m.string()).optional()}),Tn=m.object({name:m.string(),description:m.string()}),xn=m.object({name:m.string(),description:m.string().optional()}),bn=m.object({id:m.string(),text:m.string(),details:m.string().optional(),priority:hn,status:yn,tags:m.array(m.string()),addedAt:m.string(),completedAt:m.string().optional(),convertedTo:m.string().optional(),source:m.string().optional(),sourceFiles:m.array(m.string()).optional(),painPoints:m.array(m.string()).optional(),solutions:m.array(m.string()).optional(),filesAffected:m.array(m.string()).optional(),impactEffort:Sn.optional(),implementationNotes:m.string().optional(),stack:En.optional(),modules:m.array(Tn).optional(),roles:m.array(xn).optional(),risks:m.array(m.string()).optional(),risksCount:m.number().optional()}),Po=m.object({ideas:m.array(bn),lastUpdated:m.string()});var Io={priority:"medium",status:"pending",tags:[],addedAt:new Date().toISOString()};import{z as U}from"zod";var Pn=U.object({agentName:U.string(),reasoning:U.string(),confidence:U.number().min(0).max(1)}),In=U.object({subtasks:U.array(U.object({description:U.string(),domain:De,agent:U.string(),dependsOn:U.array(U.number())})),effort:U.enum(["low","medium","high"])}),Ao={classification:{schema:he,example:JSON.stringify({primaryDomain:"backend",secondaryDomains:["database"],confidence:.9,filePatterns:["src/api/**"],relevantAgents:["backend.md"]},null,2)},agentAssignment:{schema:Pn,example:JSON.stringify({agentName:"backend.md",reasoning:"Task involves API endpoint creation",confidence:.85},null,2)},subtaskBreakdown:{schema:In,example:JSON.stringify({subtasks:[{description:"Add schema validation",domain:"backend",agent:"backend.md",dependsOn:[]},{description:"Add unit tests",domain:"testing",agent:"testing.md",dependsOn:[0]}],effort:"medium"},null,2)}};ge();import{z as c}from"zod";var Qt=c.number().min(1).max(5),kn=c.enum(["exceeded","met","partial","failed"]),wn=c.enum(["definitely","probably","maybe","no"]),Zt=c.enum(["scope_creep","underestimated_complexity","technical_debt","external_blockers","learning_curve","requirements_changed","optimistic_estimate","team_changes","other"]),vn=c.object({estimated:c.object({hours:c.number(),confidence:c.enum(["low","medium","high"]).optional(),source:c.enum(["prd","manual","historical"]).optional()}),actual:c.object({hours:c.number(),commits:c.number().optional(),linesAdded:c.number().optional(),linesRemoved:c.number().optional(),sessions:c.number().optional()}),variance:c.object({hours:c.number(),percentage:c.number(),reason:Zt.optional(),explanation:c.string().optional()})}),Cn=c.object({name:c.string(),baseline:c.number().nullable(),target:c.number(),actual:c.number(),unit:c.string(),achieved:c.boolean(),percentOfTarget:c.number()}),An=c.object({criteria:c.string(),met:c.boolean(),notes:c.string().optional()}),Dn=c.object({metrics:c.array(Cn),acceptanceCriteria:c.array(An),overallSuccess:kn,successScore:c.number().min(0).max(100)}),Rn=c.object({category:c.enum(["estimation","technical","process","communication","tooling","architecture","testing","other"]),insight:c.string(),actionable:c.boolean(),action:c.string().optional()}),_n=c.object({whatWorked:c.array(c.string()),whatDidnt:c.array(c.string()),surprises:c.array(c.string()),recommendations:c.array(Rn)}),Ln=c.object({valueDelivered:c.number().min(1).max(10),userImpact:c.enum(["none","low","medium","high","critical"]),businessImpact:c.enum(["none","low","medium","high","critical"]),roiScore:c.number(),worthIt:wn,worthItReason:c.string().optional(),alternativeConsidered:c.string().optional(),betterAlternativeExists:c.boolean().optional()}),er=c.object({id:c.string(),taskId:c.string(),description:c.string(),estimatedMinutes:c.number().optional(),actualMinutes:c.number(),completedAsPlanned:c.boolean(),qualityScore:Qt,blockers:c.array(c.string()),agentUsed:c.string().optional(),skillsUsed:c.array(c.string()).optional(),startedAt:c.string(),completedAt:c.string()}),On=c.object({id:c.string(),featureId:c.string(),featureName:c.string(),prdId:c.string().nullable(),version:c.string().optional(),branch:c.string().optional(),prUrl:c.string().optional(),effort:vn,success:Dn.optional(),learnings:_n,roi:Ln,rating:Qt,taskOutcomes:c.array(er).optional(),startedAt:c.string(),shippedAt:c.string(),reviewedAt:c.string().optional(),reviewedBy:c.string().optional(),legacy:c.boolean().optional()}),Nn=c.object({totalFeatures:c.number(),averageEstimationAccuracy:c.number(),averageSuccessRate:c.number(),averageROI:c.number(),bySuccessLevel:c.object({exceeded:c.number(),met:c.number(),partial:c.number(),failed:c.number()}),variancePatterns:c.array(c.object({reason:Zt,count:c.number(),averageVariance:c.number()})),topLearnings:c.array(c.object({insight:c.string(),frequency:c.number()}))}),Oo=c.object({outcomes:c.array(On),taskOutcomes:c.array(er).optional(),aggregates:Nn.optional(),lastUpdated:c.string(),lastAggregated:c.string().optional()});import{z as v}from"zod";var Re=v.enum(["allow","deny","ask"]),Fo=v.enum(["read","write","delete","create"]),jn=v.record(v.string(),Re),nt=v.record(v.string(),Re),Mn=v.object({enabled:v.boolean().default(!0),allowedDomains:v.array(v.string()).optional(),blockedDomains:v.array(v.string()).optional()}),Uo=v.object({bash:jn.optional(),files:v.object({read:nt.optional(),write:nt.optional(),delete:nt.optional()}).optional(),web:Mn.optional(),skills:v.record(v.string(),Re).optional(),doomLoop:v.object({enabled:v.boolean().default(!0),maxRetries:v.number().default(3)}).optional(),externalDirectories:Re.default("ask")}),Fn=["git status*","git log*","git diff*","git branch*","git remote*","ls*","pwd","cat*","head*","tail*","grep*","find*","which*","echo*","node -e*","bun -e*","npm list*","npm view*","npx tsc --noEmit*"],Un=["rm -rf*","rm -r*","git push*","git reset --hard*","git clean*","npm publish*","chmod*","chown*","sudo*","curl*|*sh","wget*|*sh"],$n=["rm -rf /*","rm -rf ~/*",":(){ :|:& };:*","mkfs*","dd if=*of=/dev/*"];function zn(){let n={};for(let e of Fn)n[e]="allow";for(let e of Un)n[e]="ask";for(let e of $n)n[e]="deny";return{bash:n,files:{read:{"**/*":"allow"},write:{"**/*":"allow"},delete:{"**/*":"ask"}},web:{enabled:!0},doomLoop:{enabled:!0,maxRetries:3},externalDirectories:"ask"}}o(zn,"buildDefaultPermissions");var $o=zn();import{z as O}from"zod";var Jo=O.object({projectId:O.string(),name:O.string(),repoPath:O.string(),description:O.string().optional(),version:O.string().optional(),cliVersion:O.string().optional(),techStack:O.array(O.string()),fileCount:O.number(),commitCount:O.number(),createdAt:O.string(),lastSync:O.string(),lastSyncCommit:O.string().optional(),lastSyncBranch:O.string().optional()});var Ho={techStack:[],fileCount:0,commitCount:0,createdAt:new Date().toISOString(),lastSync:new Date().toISOString()};import{z as l}from"zod";var Gn=l.enum(["planned","active","completed","shipped"]),Xn=l.enum(["low","medium","high"]),Jn=l.enum(["feature","breaking_change","refactor","infrastructure"]),Hn=l.enum(["completed","active","planned"]),Kn=l.enum(["planned","active","completed"]),Bn=l.enum(["git","git-branch","manual","prd"]),Vn=l.object({id:l.string(),description:l.string(),completed:l.boolean(),completedAt:l.string().optional()}),qn=l.object({id:l.string(),name:l.string(),status:Hn,completedAt:l.string().optional()}),Yn=l.object({goal:l.string(),phases:l.array(qn),successMetrics:l.array(l.string()).optional()}),Wn=l.object({hours:l.number(),minutes:l.number(),totalMinutes:l.number(),display:l.string().optional()}),Qn=l.object({hash:l.string(),message:l.string(),date:l.string(),author:l.string().optional()}),Zn=l.object({hours:l.number(),confidence:l.enum(["low","medium","high"]).optional(),breakdown:l.array(l.object({area:l.string(),hours:l.number()})).optional()}),es=l.object({hours:l.number().optional(),commits:l.number().optional(),linesAdded:l.number().optional(),linesRemoved:l.number().optional()}),ts=l.object({estimated:Zn.nullable(),actual:es.nullable()}),rs=l.object({totalHours:l.number(),allocatedHours:l.number(),bufferPercent:l.number().optional()}),ns=l.object({id:l.string(),name:l.string(),theme:l.string().optional(),goals:l.array(l.string()).optional(),features:l.array(l.string()),capacity:rs.optional(),status:Kn,startDate:l.string().optional(),endDate:l.string().optional()}),ss=l.object({id:l.string(),name:l.string(),description:l.string().optional(),date:l.string(),status:Gn,impact:Xn,effort:l.string().optional(),progress:l.number(),type:Jn.optional(),roi:l.number().optional(),why:l.array(l.string()).optional(),technicalNotes:l.array(l.string()).optional(),compatibility:l.string().optional(),phase:l.string().optional(),tasks:l.array(Vn),createdAt:l.string(),shippedAt:l.string().optional(),version:l.string().optional(),duration:Wn.optional(),taskCount:l.number().optional(),agent:l.string().optional(),sprintName:l.string().optional(),completedDate:l.string().optional(),prdId:l.string().nullable().optional(),legacy:l.boolean().optional(),inferredFrom:Bn.optional(),quarter:l.string().nullable().optional(),dependencies:l.array(l.string()).optional(),blockedBy:l.array(l.string()).optional(),effortTracking:ts.optional(),valueScore:l.number().optional(),commits:l.array(Qn).optional(),branch:l.string().optional(),commitsAhead:l.number().optional()}),is=l.object({id:l.string(),title:l.string(),prdId:l.string().nullable().optional(),valueScore:l.number().optional(),effortEstimate:l.number().optional(),reason:l.string().optional()}),qo=l.object({strategy:Yn.nullable().optional(),features:l.array(ss),backlog:l.array(l.union([l.string(),is])),lastUpdated:l.string(),quarters:l.array(ns).optional(),generatedFrom:l.enum(["git-history","manual","prd"]).optional(),generatedAt:l.string().optional()});var Yo={date:new Date().toISOString().split("T")[0],status:"planned",impact:"medium",progress:0,tasks:[],createdAt:new Date().toISOString(),prdId:null,legacy:!1,quarter:null};import os from"node:crypto";import{homedir as as}from"node:os";import{join as cs}from"node:path";function te(){return os.randomUUID()}o(te,"generateUUID");var ls=cs(as(),".prjct-cli","projects");import{z as _}from"zod";var ia=_.object({sessionId:_.string(),projectId:_.string(),projectPath:_.string(),projectName:_.string().optional(),taskDescription:_.string(),taskStatus:_.enum(["active","paused"]),activeSubtaskIndex:_.number().optional(),subtaskCount:_.number().optional(),branch:_.string().optional(),linearId:_.string().optional(),filesModified:_.array(_.string()).optional(),durationWorkedSec:_.number().optional(),timestamp:_.string(),resumeHint:_.string()});import{z as h}from"zod";var us=h.enum(["feature","fix","improvement","refactor"]),tr=h.enum(["pass","warning","fail","skipped"]),ps=h.enum(["added","changed","fixed","removed"]),ds=h.object({hours:h.number(),minutes:h.number(),totalMinutes:h.number()}),ms=h.object({filesChanged:h.number().nullable().optional(),linesAdded:h.number().nullable().optional(),linesRemoved:h.number().nullable().optional(),commits:h.number().nullable().optional()}),gs=h.object({description:h.string(),type:ps.optional()}),fs=h.object({lintStatus:tr.nullable().optional(),lintDetails:h.string().optional(),testStatus:tr.nullable().optional(),testDetails:h.string().optional()}),hs=h.object({hash:h.string().optional(),message:h.string().optional(),branch:h.string().optional()}),ys=h.object({id:h.string(),name:h.string(),version:h.string().nullable().optional(),type:us,agent:h.string().optional(),description:h.string().optional(),changes:h.array(gs).optional(),codeSnippets:h.array(h.string()).optional(),commit:hs.optional(),codeMetrics:ms.optional(),qualityMetrics:fs.optional(),quantitativeImpact:h.string().optional(),duration:ds.optional(),tasksCompleted:h.number().nullable().optional(),shippedAt:h.string(),featureId:h.string().optional()}),ca=h.object({shipped:h.array(ys),lastUpdated:h.string()});ge();import{z as a}from"zod";var Ss=a.enum(["low","medium","high","critical"]),st=a.enum(["feature","bug","improvement","chore"]),Es=a.enum(["active","backlog","previously_active"]),Ts=a.enum(["pending","in_progress","completed","blocked","paused","failed","skipped"]),xs=a.enum(["task_completed","feature_shipped","idea_captured","session_started"]),it=a.object({title:a.string(),description:a.string(),filesChanged:a.array(a.object({path:a.string(),action:a.enum(["created","modified","deleted"])})),whatWasDone:a.array(a.string()).min(1),outputForNextAgent:a.string().min(1),notes:a.string().optional()}),ma=a.object({output:a.string().min(1,"Subtask output is required"),summary:it}),bs=a.object({id:a.string(),description:a.string(),domain:a.string(),agent:a.string(),status:Ts,dependsOn:a.array(a.string()),startedAt:a.string().optional(),completedAt:a.string().optional(),output:a.string().optional(),summary:it.optional(),skipReason:a.string().optional(),blockReason:a.string().optional(),estimatedPoints:a.number().optional(),estimatedMinutes:a.number().optional()}),Ps=a.object({completed:a.number(),total:a.number(),percentage:a.number()}),nr=a.object({id:a.string(),description:a.string(),type:st.optional(),startedAt:a.string(),sessionId:a.string(),featureId:a.string().optional(),subtasks:a.array(bs).optional(),currentSubtaskIndex:a.number().optional(),subtaskProgress:Ps.optional(),linearId:a.string().optional(),linearUuid:a.string().optional(),estimatedPoints:a.number().optional(),estimatedMinutes:a.number().optional(),modelMetadata:me.optional()}),rr=a.object({id:a.string(),description:a.string(),status:a.literal("paused"),startedAt:a.string(),pausedAt:a.string(),pauseReason:a.string().optional()}),Is=a.object({stackConfirmed:a.array(a.string()).optional(),patternsDiscovered:a.array(a.string()).optional(),agentAccuracy:a.array(a.object({agent:a.string(),rating:a.enum(["helpful","neutral","inaccurate"]),note:a.string().optional()})).optional(),issuesEncountered:a.array(a.string()).optional()}),ks=a.object({taskId:a.string(),title:a.string(),classification:st,startedAt:a.string(),completedAt:a.string(),subtaskCount:a.number(),subtaskSummaries:a.array(it),outcome:a.string(),branchName:a.string(),linearId:a.string().optional(),linearUuid:a.string().optional(),prUrl:a.string().optional(),feedback:Is.optional()}),ga=a.object({currentTask:nr.nullable(),previousTask:rr.nullable().optional(),pausedTasks:a.array(rr).optional(),taskHistory:a.array(ks).optional(),lastUpdated:a.string()}),sr=a.object({id:a.string(),description:a.string(),priority:Ss,type:st,featureId:a.string().optional(),originFeature:a.string().optional(),completed:a.boolean(),completedAt:a.string().optional(),createdAt:a.string(),section:Es,agent:a.string().optional(),groupName:a.string().optional(),groupId:a.string().optional()}),ir=a.object({tasks:a.array(sr),lastUpdated:a.string()}),ws=a.object({tasksToday:a.number(),tasksThisWeek:a.number(),streak:a.number(),velocity:a.string(),avgDuration:a.string()}),vs=a.object({type:xs,description:a.string(),timestamp:a.string(),duration:a.string().optional()}),fa=a.object({projectId:a.string(),currentTask:nr.nullable(),queue:a.array(sr),stats:ws,recentActivity:a.array(vs),lastSync:a.string()});import{z as y}from"zod";var Cs=y.enum(["improving","stable","declining"]),As=y.object({sprintNumber:y.number(),startDate:y.string(),endDate:y.string(),pointsCompleted:y.number(),tasksCompleted:y.number(),avgVariance:y.number(),estimationAccuracy:y.number()}),or=y.object({category:y.string(),avgVariance:y.number(),taskCount:y.number()}),Ea=y.object({totalPoints:y.number(),sprints:y.number(),estimatedDate:y.string()}),Ta=y.object({sprints:y.array(As),averageVelocity:y.number(),velocityTrend:Cs,estimationAccuracy:y.number(),overEstimated:y.array(or),underEstimated:y.array(or),lastUpdated:y.string()}),xa=y.object({sprintLengthDays:y.number().min(1).max(90).default(7),startDay:y.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:y.number().min(1).max(52).default(6),accuracyTolerance:y.number().min(0).max(100).default(20)});var ar={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},ot=class{static{o(this,"ArchiveStorage")}archive(e,t){let r=te(),s=I();return P.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),r}archiveMany(e,t){if(t.length===0)return 0;let r=I();return P.transaction(e,s=>{let i=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let u of t)i.run(te(),u.entityType,u.entityId,JSON.stringify(u.entityData),u.summary??null,r,u.reason)}),t.length}getArchived(e,t,r=50){return t?P.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,r):P.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(e){let t=P.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let i=s.entity_type;i in r&&(r[i]=s.count),r.total+=s.count}return r}restore(e,t){let r=P.get(e,"SELECT * FROM archives WHERE id = ?",t);return r?(P.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(r.entity_data)):null}pruneOldArchives(e,t){let r=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);P.run(e,"DELETE FROM archives WHERE archived_at < ?",r);let i=this.getTotalCount(e);return s-i}getTotalCount(e){return P.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},cr=new ot;import{z as E}from"zod";var oe={create(n,e){class t extends Error{static{o(this,"TypedError")}errorName;data;isOperational=!0;constructor(s){let i=e.parse(s);super(`${n}: ${JSON.stringify(i)}`),this.name=n,this.errorName=n,this.data=i,Error.captureStackTrace?.(this,this.constructor)}static throw(s){throw new t(s)}static is(s){return s instanceof t&&s.errorName===n}static create(s){return new t(s)}}return t}},Za=oe.create("FileError",E.object({path:E.string(),operation:E.enum(["read","write","delete","create","copy"]),reason:E.string().optional()})),ec=oe.create("ValidationError",E.object({field:E.string(),expected:E.string(),received:E.string().optional(),message:E.string().optional()})),tc=oe.create("PermissionError",E.object({action:E.string(),resource:E.string(),reason:E.string().optional()})),rc=oe.create("TaskError",E.object({taskId:E.string().optional(),operation:E.enum(["create","update","complete","pause","resume","delete"]),reason:E.string()})),nc=oe.create("SessionError",E.object({sessionId:E.string().optional(),reason:E.string()})),sc=oe.create("SyncError",E.object({projectId:E.string().optional(),operation:E.enum(["push","pull","auth","connect"]),reason:E.string()})),at=class extends Error{static{o(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)}};function Ds(n){return n instanceof at}o(Ds,"isPrjctError");function lr(n){return Ds(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}o(lr,"getErrorMessage");var _e={SESSION_STARTED:"session.started",SESSION_PAUSED:"session.paused",SESSION_RESUMED:"session.resumed",SESSION_COMPLETED:"session.completed",TASK_CREATED:"task.created",TASK_COMPLETED:"task.completed",TASK_UPDATED:"task.updated",FEATURE_ADDED:"feature.added",FEATURE_SHIPPED:"feature.shipped",FEATURE_UPDATED:"feature.updated",IDEA_CAPTURED:"idea.captured",IDEA_PROMOTED:"idea.promoted",SNAPSHOT_CREATED:"snapshot.created",SNAPSHOT_RESTORED:"snapshot.restored",COMMIT_CREATED:"git.commit",PUSH_COMPLETED:"git.push",PROJECT_INITIALIZED:"project.init",PROJECT_SYNCED:"project.sync",ANALYSIS_COMPLETED:"analysis.completed",ALL:"*"};X();var lt={SPINNER_MSG:45,DONE_MSG:50,FAIL_MSG:65,WARN_MSG:65,STEP_MSG:35,PROGRESS_TEXT:25,ISSUE_TITLE:50,FALLBACK_TRUNCATE:50,CLEAR_WIDTH:80};var ur={HISTORY_MAX:100};var ae={error:0,warn:1,info:2,debug:3},Ls=new Set(["1","true","*"]);function Os(){let n=process.env.PRJCT_DEBUG||process.env.DEBUG||"";if(!n)return{level:-1,name:"disabled"};if(Ls.has(n)||n.includes("prjct"))return{level:ae.debug,name:"debug"};let e=ae[n]??-1,t=e>=0?n:"disabled";return{level:e,name:t}}o(Os,"getLogLevel");var{level:pr,name:Ns}=Os(),js=o(()=>{},"noop");function Le(n,e,t){return pr>=n?(...r)=>console[t](e,...r):js}o(Le,"createLogMethod");var Ms={error:Le(ae.error,"[prjct:error]","error"),warn:Le(ae.warn,"[prjct:warn]","warn"),info:Le(ae.info,"[prjct:info]","log"),debug:Le(ae.debug,"[prjct:debug]","log"),isEnabled:o(()=>pr>=0,"isEnabled"),level:o(()=>Ns,"level")},Oe=Ms;var Ne=class{static{o(this,"EventBus")}listeners;onceListeners;history;historyLimit;projectId;constructor(){this.listeners=new Map,this.onceListeners=new Map,this.history=[],this.historyLimit=ur.HISTORY_MAX,this.projectId=null}async initialize(e){this.projectId=e}on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>this.off(e,t)}once(e,t){return this.onceListeners.has(e)||this.onceListeners.set(e,new Set),this.onceListeners.get(e).add(t),()=>{let r=this.onceListeners.get(e);r&&r.delete(t)}}off(e,t){let r=this.listeners.get(e);r&&r.delete(t)}async emit(e,t={}){let r=new Date().toISOString(),s={type:e,timestamp:r,projectId:this.projectId,...t};this.history.push(s),this.history.length>this.historyLimit&&this.history.shift(),this.projectId&&await this.logEvent(s);let i=this.getMatchingListeners(e);(await Promise.allSettled(i.map(A=>this.executeCallback(A,s)))).forEach(A=>{A.status==="rejected"&&Oe.error(`Event listener error for ${e}:`,A.reason)});let p=this.onceListeners.get(e);if(p){for(let A of p)await this.executeCallback(A,s);this.onceListeners.delete(e)}let x=this.onceListeners.get(_e.ALL);if(x)for(let A of x)await this.executeCallback(A,s)}getMatchingListeners(e){let t=[],r=this.listeners.get(e);r&&t.push(...r);let s=this.listeners.get(_e.ALL);s&&t.push(...s);let i=e.split(".")[0],u=this.listeners.get(`${i}.*`);return u&&t.push(...u),t}async executeCallback(e,t){try{let r=e(t);r instanceof Promise&&await r}catch(r){throw Oe.error("Event callback error:",r),r}}async logEvent(e){try{P.appendEvent(this.projectId,e.type,e)}catch(t){Oe.debug("Failed to log event:",lr(t))}}getHistory(e=10,t=null){let r=this.history;return t&&(r=r.filter(s=>s.type===t||s.type.startsWith(t))),r.slice(-e)}clear(){this.listeners.clear(),this.onceListeners.clear()}flush(){this.history=[],this.onceListeners.clear()}removeAllListeners(e){e?(this.listeners.delete(e),this.onceListeners.delete(e)):(this.listeners.clear(),this.onceListeners.clear())}listenerCount(e){let t=this.listeners.get(e);return t?t.size:0}getRegisteredEvents(){return Array.from(this.listeners.keys())}},Fs=new Ne;de();var je=class{static{o(this,"SyncEventBus")}async publish(e){let t=W.getSyncPendingPath(e.projectId),r=await ke(t,[])??[];r.push(e),await we(t,r)}async getPending(e){let t=W.getSyncPendingPath(e);return await ke(t,[])??[]}async clearPending(e){let t=W.getSyncPendingPath(e);await we(t,[])}async updateLastSync(e){let t=W.getLastSyncPath(e),r={timestamp:I(),success:!0};await we(t,r)}async getLastSync(e){let t=W.getLastSyncPath(e);return await ke(t,null)}},ut=new je;var Me=class{static{o(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new K({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 r=P.getDoc(e,this.getStoreKey());if(r!==null)return this.cache.set(e,r),r}catch{}return this.getDefault()}async write(e,t){P.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let r=await this.read(e),s=t(r);return await this.write(e,s),s}async publishEvent(e,t,r){let s={type:t,path:[this.filename.replace(".json","")],data:r,timestamp:I(),projectId:e};await ut.publish(s)}async publishEntityEvent(e,t,r,s){let i=`${t}.${r}`,u={...s,timestamp:I()};await this.publishEvent(e,i,u)}async exists(e){try{return P.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}};var pt=class extends Me{static{o(this,"QueueStorage")}constructor(){super("queue.json",ir)}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(r=>r.section==="active"&&!r.completed)}async getBacklog(e){return(await this.read(e)).tasks.filter(r=>r.section==="backlog"&&!r.completed)}async getNextTask(e){let t=await this.getActiveTasks(e);return this.sortTasks(t)[0]||null}async addTask(e,t){let r={...t,id:te(),createdAt:I(),completed:!1};return await this.update(e,s=>({tasks:[...s.tasks,r],lastUpdated:I()})),await this.publishEvent(e,"queue.task_added",{taskId:r.id,description:r.description,priority:r.priority,section:r.section}),r}async addTasks(e,t){let r=I(),s=t.map(i=>({...i,id:te(),createdAt:r,completed:!1}));return await this.update(e,i=>({tasks:[...i.tasks,...s],lastUpdated:r})),await this.publishEvent(e,"queue.tasks_added",{count:s.length,tasks:s.map(i=>({id:i.id,description:i.description}))}),s}async removeTask(e,t){await this.update(e,r=>({tasks:r.tasks.filter(s=>s.id!==t),lastUpdated:I()})),await this.publishEvent(e,"queue.task_removed",{taskId:t})}async completeTask(e,t){let r=null;if(await this.update(e,s=>({tasks:s.tasks.map(u=>u.id===t?(r={...u,completed:!0,completedAt:I()},r):u),lastUpdated:I()})),r){let s=r;await this.publishEvent(e,"queue.task_completed",{taskId:t,description:s.description,completedAt:s.completedAt})}return r}async moveToSection(e,t,r){await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?{...i,section:r}:i),lastUpdated:I()}))}async setPriority(e,t,r){await this.update(e,s=>({tasks:s.tasks.map(i=>i.id===t?{...i,priority:r}:i),lastUpdated:I()}))}async clearCompleted(e){let r=(await this.read(e)).tasks.filter(s=>s.completed).length;return await this.update(e,s=>({tasks:s.tasks.filter(i=>!i.completed),lastUpdated:I()})),r}async removeStaleCompleted(e){let t=await this.read(e),r=wt(ar.QUEUE_COMPLETED_DAYS),s=t.tasks.filter(u=>u.completed&&u.completedAt&&new Date(u.completedAt)<r);if(s.length===0)return 0;cr.archiveMany(e,s.map(u=>({entityType:"queue_task",entityId:u.id,entityData:u,summary:u.description,reason:"age"})));let i=new Set(s.map(u=>u.id));return await this.update(e,u=>({tasks:u.tasks.filter(p=>!i.has(p.id)),lastUpdated:I()})),await this.publishEvent(e,"queue.stale_removed",{count:s.length}),s.length}sortTasks(e){let t={critical:0,high:1,medium:2,low:3},r={active:0,previously_active:1,backlog:2};return[...e].sort((s,i)=>{let u=r[s.section]-r[i.section];if(u!==0)return u;let p=t[s.priority]-t[i.priority];return p!==0?p:new Date(s.createdAt).getTime()-new Date(i.createdAt).getTime()})}},dt=new pt;X();var Us=/\b[A-Z]+-\d+\b/,dr=1800*1e3,Fe=class{static{o(this,"LinearSync")}async pullAll(e){let t=new Date().toISOString(),r=[];try{let s=await T.fetchAssignedIssues({limit:100}),i={};for(let p of s)try{i[p.externalId]=this.toCachedIssue(p,t)}catch(x){r.push({issueId:p.externalId||p.id,error:N(x)})}let u={provider:"linear",lastSync:t,staleAfter:dr,issues:i};return P.setDoc(e,"issues",u),{provider:"linear",fetched:s.length,updated:Object.keys(i).length,errors:r,timestamp:t}}catch(s){return r.push({issueId:"all",error:N(s)}),{provider:"linear",fetched:0,updated:0,errors:r,timestamp:t}}}async getIssue(e,t){let r=this.loadIssues(e);if(r?.issues[t]){let s=r.issues[t],i=new Date(s.fetchedAt).getTime(),u=Date.now(),p=600*1e3;if(u-i<p)return s}try{let s=await T.fetchIssue(t);if(!s)return null;let i=new Date().toISOString(),u=this.toCachedIssue(s,i);return this.updateIssueInCache(e,t,u),u}catch{return r?.issues[t]?r.issues[t]:null}}async getIssueLocal(e,t){return this.loadIssues(e)?.issues[t]||null}async pushStatus(e,t,r){r==="in_progress"?await T.markInProgress(t):r==="done"&&await T.markDone(t);let s=this.loadIssues(e);if(s?.issues[t]){let i=r==="done"?"done":"in_progress";s.issues[t].status=i,s.issues[t].fetchedAt=new Date().toISOString(),this.saveIssues(e,s)}}async isStale(e){let t=this.loadIssues(e);if(!t||!t.lastSync)return!0;let r=new Date(t.lastSync).getTime(),s=Date.now(),i=t.staleAfter||dr;return s-r>i}async getSyncStatus(e){let t=this.loadIssues(e);return t?{hasCache:!0,lastSync:t.lastSync||null,issueCount:Object.keys(t.issues).length,isStale:await this.isStale(e)}:{hasCache:!1,lastSync:null,issueCount:0,isStale:!0}}async listCachedIssues(e){let t=this.loadIssues(e);return t?Object.values(t.issues):[]}async reconcileQueue(e){let t=this.loadIssues(e);if(!t)return 0;let r=new Set;for(let[u,p]of Object.entries(t.issues))(p.status==="done"||p.status==="in_review")&&r.add(u);if(r.size===0)return 0;let s=await dt.getTasks(e),i=0;for(let u of s){if(u.completed)continue;let p=u.description.match(Us);p&&r.has(p[0])&&(await dt.completeTask(e,u.id),i++)}return i}loadIssues(e){try{return P.getDoc(e,"issues")}catch{return null}}saveIssues(e,t){P.setDoc(e,"issues",t)}updateIssueInCache(e,t,r){let s=this.loadIssues(e);s||(s=It("linear")),s.issues[t]=r,this.saveIssues(e,s)}toCachedIssue(e,t){return{id:e.id,identifier:e.externalId,title:e.title,description:e.description,status:e.status,priority:e.priority,type:e.type,assignee:e.assignee,labels:e.labels,team:e.team,project:e.project,url:e.url,createdAt:e.createdAt,updatedAt:e.updatedAt,fetchedAt:t}}},ce=new Fe;X();import M from"chalk";fe();import re from"chalk";var mr=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],$s=80,zs={name:"prjct",icon:"\u26A1",signature:"\u26A1 prjct",spinner:{frames:mr,speed:$s},cli:{header:o(()=>`${re.cyan.bold("\u26A1")} ${re.cyan("prjct")}`,"header"),footer:o(()=>re.dim("\u26A1 prjct"),"footer"),spin:o((n,e)=>`${re.cyan("\u26A1")} ${re.cyan("prjct")} ${re.cyan(mr[n%10])} ${re.dim(e||"")}`,"spin")},template:{header:"\u26A1 prjct",footer:"\u26A1 prjct"},commitFooter:"Generated with [p/](https://www.prjct.app/)",urls:{website:"https://prjct.app",docs:"https://prjct.app/docs"},getCommitFooter:o((n="claude")=>Ce(n).commitFooter,"getCommitFooter"),getSignature:o((n="claude")=>Ce(n).signature,"getSignature")},mt=zs;var jl=mt.spinner.frames,Ml=mt.spinner.speed,Xs={silent:{maxLines:0,maxCharsPerLine:0,showMetrics:!1},minimal:{maxLines:1,maxCharsPerLine:65,showMetrics:!1},compact:{maxLines:4,maxCharsPerLine:80,showMetrics:!0},verbose:{maxLines:1/0,maxCharsPerLine:1/0,showMetrics:!0}},ye="compact";function gr(n){ye=n}o(gr,"setOutputTier");function ft(){return Xs[ye]}o(ft,"getTierConfig");var Fl={success:M.green("\u2713"),fail:M.red("\u2717"),warn:M.yellow("\u26A0"),info:M.blue("\u2139"),debug:M.dim("\u{1F527}"),bullet:M.dim("\u2022"),arrow:M.dim("\u2192"),check:M.green("\u2713"),cross:M.red("\u2717"),spinner:M.cyan("\u25D0")};var Ue=o((n,e)=>{let t=e??(ft().maxCharsPerLine||lt.FALLBACK_TRUNCATE);return n&&n.length>t?`${n.slice(0,t-1)}\u2026`:n||""},"truncate");function gt(n,e){let t=e??ft().maxLines;if(t===1/0||t===0)return n;let r=n.split(`
306
306
  `);if(r.length<=t)return n;let s=r.slice(0,t),i=r.length-t;return`${s.join(`
307
307
  `)}
308
- ${M.dim(`...${i} more lines`)}`}o(mt,"limitLines");function fr(n){let e=gt();if(ye==="silent")return"";if(ye==="verbose")return JSON.stringify(n,null,2);if(typeof n!="object"||n===null)return Ue(String(n),e.maxCharsPerLine);let t=n;if("identifier"in t&&"title"in t){let i=[];return i.push(`${t.identifier}: ${Ue(String(t.title),e.maxCharsPerLine-10)}`),t.status&&i.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&i.push(`Priority: ${t.priority}`),t.url&&ye==="compact"&&i.push(M.dim(String(t.url))),mt(i.join(`
309
- `),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let i=t.issues,u=i.slice(0,e.maxLines).map(p=>{let x=p.priority&&p.priority!=="none"?` [${p.priority}]`:"";return`${p.identifier} ${Ue(String(p.title),ct.ISSUE_TITLE)}${x}`});return i.length>e.maxLines&&u.push(M.dim(`...${i.length-e.maxLines} more`)),u.join(`
310
- `)}let s=["id","name","title","status","message","success","error"].filter(i=>i in t);return s.length>0?mt(s.map(i=>`${i}: ${Ue(String(t[i]),e.maxCharsPerLine-i.length-2)}`).join(`
311
- `),e.maxLines):mt(JSON.stringify(n,null,2),e.maxLines)}o(fr,"formatForHuman");X();de();be();import ft from"node:fs/promises";import Js from"node:os";import hr from"node:path";function yr(n){return hr.join(Js.homedir(),".prjct-cli","projects",n,"config","credentials.json")}o(yr,"getCredentialsPath");async function Q(n){let e=yr(n);if(!await k(e))return{};try{return JSON.parse(await ft.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",N(t)),{}}}o(Q,"getProjectCredentials");async function Sr(n,e){let t=yr(n),r=hr.dirname(t);await k(r)||await ft.mkdir(r,{recursive:!0});let s=await Q(n);s.linear=e,await ft.writeFile(t,JSON.stringify(s,null,2))}o(Sr,"setLinearCredentials");async function ht(n){let e=await Q(n);return e.linear?.apiKey?e.linear.apiKey:ie("linear-api-key")}o(ht,"getLinearApiKey");async function Er(n){if((await Q(n)).linear?.apiKey)return"project";let{getCredentialWithSource:t}=await Promise.resolve().then(()=>(be(),Tt)),r=await t("linear-api-key");return r.value?r.source==="keychain"?"keychain":"env":"none"}o(Er,"getCredentialSource");var B=process.argv.slice(2),$e=B.indexOf("--project"),C=null;$e!==-1&&B[$e+1]&&(C=B[$e+1],B.splice($e,2));var xr=B.indexOf("--json"),Z=xr!==-1;Z&&B.splice(xr,1);var br=B.indexOf("--verbose"),Hs=br!==-1;Hs&&(B.splice(br,1),gr("verbose"));var[Tr,...L]=B;function D(n){console.log(Z?JSON.stringify(n,null,2):fr(n))}o(D,"output");function S(n,e=1){console.error(Z?JSON.stringify({error:n}):`Error: ${n}`),process.exit(e)}o(S,"error");async function G(){C||S("No --project specified. Usage: linear.ts --project <projectId> <command>");let n=await ht(C);n||S("Linear not configured. Run: p. linear setup");let e=await Q(C);await T.initializeFromApiKey(n,e.linear?.teamId)}o(G,"initFromProject");async function Ks(){try{switch(Tr){case"setup":{C||S("--project required for setup");let n=L[0],e=L[1];n||S("API key required. Usage: setup <apiKey> [teamId]"),await T.initializeFromApiKey(n,e);let t=await T.getTeams();t.length===0&&S("No teams found. Check your API key permissions.");let r=e,s;if(!r&&t.length===1)r=t[0].id,s=t[0].key;else if(r){let i=t.find(u=>u.id===r||u.key===r);i&&(r=i.id,s=i.key)}await Sr(C,{apiKey:n,teamId:r,teamKey:s,setupAt:new Date().toISOString()}),D({success:!0,teams:t,defaultTeam:r?{id:r,key:s}:null});break}case"list":{await G();let n=L[0]?parseInt(L[0],10):20,e=await Q(C),t;e.linear?.teamId?t=await T.fetchTeamIssues(e.linear.teamId,{limit:n}):t=await T.fetchAssignedIssues({limit:n});let r=t.map(s=>({id:s.id,identifier:s.externalId,title:s.title,status:s.status,priority:s.priority,url:s.url}));if(Z)D({count:t.length,issues:r});else{console.log(`Your issues (${t.length}):`);for(let s of r.slice(0,10)){let i=s.priority&&s.priority!=="none"?` [${s.priority}]`:"";console.log(` ${s.identifier} ${s.title.slice(0,50)}${i}`)}t.length>10&&console.log(` ...${t.length-10} more`)}break}case"list-team":{await G();let n=L[0],e=L[1]?parseInt(L[1],10):20;n||S("Team ID required. Usage: list-team <teamId> [limit]");let t=await T.fetchTeamIssues(n,{limit:e});D({count:t.length,issues:t.map(r=>({id:r.id,identifier:r.externalId,title:r.title,status:r.status,priority:r.priority,url:r.url}))});break}case"get":{await G();let n=L[0];n||S("Issue ID required. Usage: get <id>");let e=await T.fetchIssue(n);if(e||S(`Issue not found: ${n}`),Z)D(e);else{if(console.log(`${e.externalId}: ${e.title}`),console.log(`Status: ${e.status} | Priority: ${e.priority||"none"}`),e.description){let t=e.description.slice(0,200);console.log(`
308
+ ${M.dim(`...${i} more lines`)}`}o(gt,"limitLines");function fr(n){let e=ft();if(ye==="silent")return"";if(ye==="verbose")return JSON.stringify(n,null,2);if(typeof n!="object"||n===null)return Ue(String(n),e.maxCharsPerLine);let t=n;if("identifier"in t&&"title"in t){let i=[];return i.push(`${t.identifier}: ${Ue(String(t.title),e.maxCharsPerLine-10)}`),t.status&&i.push(`Status: ${t.status}`),t.priority&&t.priority!=="none"&&i.push(`Priority: ${t.priority}`),t.url&&ye==="compact"&&i.push(M.dim(String(t.url))),gt(i.join(`
309
+ `),e.maxLines)}if("issues"in t&&Array.isArray(t.issues)){let i=t.issues,u=i.slice(0,e.maxLines).map(p=>{let x=p.priority&&p.priority!=="none"?` [${p.priority}]`:"";return`${p.identifier} ${Ue(String(p.title),lt.ISSUE_TITLE)}${x}`});return i.length>e.maxLines&&u.push(M.dim(`...${i.length-e.maxLines} more`)),u.join(`
310
+ `)}let s=["id","name","title","status","message","success","error"].filter(i=>i in t);return s.length>0?gt(s.map(i=>`${i}: ${Ue(String(t[i]),e.maxCharsPerLine-i.length-2)}`).join(`
311
+ `),e.maxLines):gt(JSON.stringify(n,null,2),e.maxLines)}o(fr,"formatForHuman");X();de();be();import ht from"node:fs/promises";import Js from"node:os";import hr from"node:path";function yr(n){return hr.join(Js.homedir(),".prjct-cli","projects",n,"config","credentials.json")}o(yr,"getCredentialsPath");async function Q(n){let e=yr(n);if(!await k(e))return{};try{return JSON.parse(await ht.readFile(e,"utf-8"))}catch(t){return console.error("[project-credentials] Failed to read credentials:",N(t)),{}}}o(Q,"getProjectCredentials");async function Sr(n,e){let t=yr(n),r=hr.dirname(t);await k(r)||await ht.mkdir(r,{recursive:!0});let s=await Q(n);s.linear=e,await ht.writeFile(t,JSON.stringify(s,null,2))}o(Sr,"setLinearCredentials");async function yt(n){let e=await Q(n);return e.linear?.apiKey?e.linear.apiKey:ie("linear-api-key")}o(yt,"getLinearApiKey");async function Er(n){if((await Q(n)).linear?.apiKey)return"project";let{getCredentialWithSource:t}=await Promise.resolve().then(()=>(be(),xt)),r=await t("linear-api-key");return r.value?r.source==="keychain"?"keychain":"env":"none"}o(Er,"getCredentialSource");var B=process.argv.slice(2),$e=B.indexOf("--project"),C=null;$e!==-1&&B[$e+1]&&(C=B[$e+1],B.splice($e,2));var xr=B.indexOf("--json"),Z=xr!==-1;Z&&B.splice(xr,1);var br=B.indexOf("--verbose"),Hs=br!==-1;Hs&&(B.splice(br,1),gr("verbose"));var[Tr,...L]=B;function D(n){console.log(Z?JSON.stringify(n,null,2):fr(n))}o(D,"output");function S(n,e=1){console.error(Z?JSON.stringify({error:n}):`Error: ${n}`),process.exit(e)}o(S,"error");async function G(){C||S("No --project specified. Usage: linear.ts --project <projectId> <command>");let n=await yt(C);n||S("Linear not configured. Run: p. linear setup");let e=await Q(C);await T.initializeFromApiKey(n,e.linear?.teamId)}o(G,"initFromProject");async function Ks(){try{switch(Tr){case"setup":{C||S("--project required for setup");let n=L[0],e=L[1];n||S("API key required. Usage: setup <apiKey> [teamId]"),await T.initializeFromApiKey(n,e);let t=await T.getTeams();t.length===0&&S("No teams found. Check your API key permissions.");let r=e,s;if(!r&&t.length===1)r=t[0].id,s=t[0].key;else if(r){let i=t.find(u=>u.id===r||u.key===r);i&&(r=i.id,s=i.key)}await Sr(C,{apiKey:n,teamId:r,teamKey:s,setupAt:new Date().toISOString()}),D({success:!0,teams:t,defaultTeam:r?{id:r,key:s}:null});break}case"list":{await G();let n=L[0]?parseInt(L[0],10):20,e=await Q(C),t;e.linear?.teamId?t=await T.fetchTeamIssues(e.linear.teamId,{limit:n}):t=await T.fetchAssignedIssues({limit:n});let r=t.map(s=>({id:s.id,identifier:s.externalId,title:s.title,status:s.status,priority:s.priority,url:s.url}));if(Z)D({count:t.length,issues:r});else{console.log(`Your issues (${t.length}):`);for(let s of r.slice(0,10)){let i=s.priority&&s.priority!=="none"?` [${s.priority}]`:"";console.log(` ${s.identifier} ${s.title.slice(0,50)}${i}`)}t.length>10&&console.log(` ...${t.length-10} more`)}break}case"list-team":{await G();let n=L[0],e=L[1]?parseInt(L[1],10):20;n||S("Team ID required. Usage: list-team <teamId> [limit]");let t=await T.fetchTeamIssues(n,{limit:e});D({count:t.length,issues:t.map(r=>({id:r.id,identifier:r.externalId,title:r.title,status:r.status,priority:r.priority,url:r.url}))});break}case"get":{await G();let n=L[0];n||S("Issue ID required. Usage: get <id>");let e=await T.fetchIssue(n);if(e||S(`Issue not found: ${n}`),Z)D(e);else{if(console.log(`${e.externalId}: ${e.title}`),console.log(`Status: ${e.status} | Priority: ${e.priority||"none"}`),e.description){let t=e.description.slice(0,200);console.log(`
312
312
  ${t}${e.description.length>200?"...":""}`)}console.log(`
313
- ${e.url}`)}break}case"get-local":{C||S("--project required for get-local");let n=L[0];n||S("Issue ID required. Usage: get-local <id>");let e=await ce.getIssueLocal(C,n);e||S(`Issue not in local cache: ${n}. Run 'sync' first.`),D(e);break}case"sync":{C||S("--project required for sync"),await G();let n=await ce.pullAll(C),e=await ce.reconcileQueue(C);D({success:n.errors.length===0,...n,reconciled:e});break}case"sync-status":{C||S("--project required for sync-status");let n=await ce.getSyncStatus(C);D(n);break}case"create":{await G();let n=L[0];n||S(`JSON input required. Usage: create '{"title":"...", "teamId":"..."}'`);let e;try{e=JSON.parse(n)}catch{S(`Invalid JSON: ${n}`)}if(e.title||S("title is required"),!e.teamId){let r=await Q(C);r.linear?.teamId?e.teamId=r.linear.teamId:S("teamId is required (no default team configured)")}let t=await T.createIssue(e);D(t);break}case"update":{await G();let n=L[0],e=L[1];n||S(`Issue ID required. Usage: update <id> '{"description":"..."}'`),e||S(`JSON input required. Usage: update <id> '{"description":"..."}'`);let t;try{t=JSON.parse(e)}catch{S(`Invalid JSON: ${e}`)}let r=await T.updateIssue(n,t);D(r);break}case"start":{await G();let n=L[0];n||S("Issue ID required. Usage: start <id>"),await T.markInProgress(n),D({success:!0,id:n,status:"in_progress"});break}case"done":{await G();let n=L[0];n||S("Issue ID required. Usage: done <id>"),await T.markDone(n),D({success:!0,id:n,status:"done"});break}case"comment":{await G();let n=L[0],e=L.slice(1).join(" ");n||S("Issue ID required. Usage: comment <id> <text>"),e||S("Comment text required. Usage: comment <id> <text>"),await T.addComment(n,e),D({success:!0,id:n});break}case"teams":{await G();let n=await T.getTeams();D({count:n.length,teams:n});break}case"projects":{await G();let n=await T.getProjects();D({count:n.length,projects:n});break}case"status":{C||S("--project required for status");let n=await Er(C),e=await ht(C),t=await Q(C);if(!e){Z?D({configured:!1,source:"none",message:"Linear not configured"}):(console.log("Linear: Not configured"),console.log("Run: p. linear setup"));break}try{await T.initializeFromApiKey(e,t.linear?.teamId);let r=await T.getTeams();Z?D({configured:!0,source:n,teamId:t.linear?.teamId,teamKey:t.linear?.teamKey,teamsAvailable:r.length}):(console.log("Linear: Connected"),t.linear?.teamKey&&console.log(`Team: ${t.linear.teamKey}`),console.log(`Teams: ${r.length} available`))}catch(r){Z?D({configured:!0,source:n,connectionError:N(r)}):(console.log("Linear: Connection error"),console.log(`Error: ${N(r)}`))}break}case"help":case"--help":case"-h":case void 0:{D({usage:"linear.ts --project <projectId> <command> [args...]",commands:{setup:"setup <apiKey> [teamId] - Store API key",list:"list [limit] - List my assigned issues","list-team":"list-team <teamId> [limit] - List team issues",get:"get <id> - Get issue by ID or identifier","get-local":"get-local <id> - Get from local cache (no API)",sync:"sync - Pull all assigned issues to local storage","sync-status":"sync-status - Check local cache status",create:"create <json> - Create issue",update:"update <id> <json> - Update issue",start:"start <id> - Mark as in progress",done:"done <id> - Mark as done",comment:"comment <id> <text> - Add comment",teams:"teams - List available teams",projects:"projects - List available projects",status:"status - Check connection"}});break}default:S(`Unknown command: ${Tr}. Use --help to see available commands.`)}}catch(n){S(N(n))}}o(Ks,"main");Ks();
313
+ ${e.url}`)}break}case"get-local":{C||S("--project required for get-local");let n=L[0];n||S("Issue ID required. Usage: get-local <id>");let e=await ce.getIssueLocal(C,n);e||S(`Issue not in local cache: ${n}. Run 'sync' first.`),D(e);break}case"sync":{C||S("--project required for sync"),await G();let n=await ce.pullAll(C),e=await ce.reconcileQueue(C);D({success:n.errors.length===0,...n,reconciled:e});break}case"sync-status":{C||S("--project required for sync-status");let n=await ce.getSyncStatus(C);D(n);break}case"create":{await G();let n=L[0];n||S(`JSON input required. Usage: create '{"title":"...", "teamId":"..."}'`);let e;try{e=JSON.parse(n)}catch{S(`Invalid JSON: ${n}`)}if(e.title||S("title is required"),!e.teamId){let r=await Q(C);r.linear?.teamId?e.teamId=r.linear.teamId:S("teamId is required (no default team configured)")}let t=await T.createIssue(e);D(t);break}case"update":{await G();let n=L[0],e=L[1];n||S(`Issue ID required. Usage: update <id> '{"description":"..."}'`),e||S(`JSON input required. Usage: update <id> '{"description":"..."}'`);let t;try{t=JSON.parse(e)}catch{S(`Invalid JSON: ${e}`)}let r=await T.updateIssue(n,t);D(r);break}case"start":{await G();let n=L[0];n||S("Issue ID required. Usage: start <id>"),await T.markInProgress(n),D({success:!0,id:n,status:"in_progress"});break}case"done":{await G();let n=L[0];n||S("Issue ID required. Usage: done <id>"),await T.markDone(n),D({success:!0,id:n,status:"done"});break}case"comment":{await G();let n=L[0],e=L.slice(1).join(" ");n||S("Issue ID required. Usage: comment <id> <text>"),e||S("Comment text required. Usage: comment <id> <text>"),await T.addComment(n,e),D({success:!0,id:n});break}case"teams":{await G();let n=await T.getTeams();D({count:n.length,teams:n});break}case"projects":{await G();let n=await T.getProjects();D({count:n.length,projects:n});break}case"status":{C||S("--project required for status");let n=await Er(C),e=await yt(C),t=await Q(C);if(!e){Z?D({configured:!1,source:"none",message:"Linear not configured"}):(console.log("Linear: Not configured"),console.log("Run: p. linear setup"));break}try{await T.initializeFromApiKey(e,t.linear?.teamId);let r=await T.getTeams();Z?D({configured:!0,source:n,teamId:t.linear?.teamId,teamKey:t.linear?.teamKey,teamsAvailable:r.length}):(console.log("Linear: Connected"),t.linear?.teamKey&&console.log(`Team: ${t.linear.teamKey}`),console.log(`Teams: ${r.length} available`))}catch(r){Z?D({configured:!0,source:n,connectionError:N(r)}):(console.log("Linear: Connection error"),console.log(`Error: ${N(r)}`))}break}case"help":case"--help":case"-h":case void 0:{D({usage:"linear.ts --project <projectId> <command> [args...]",commands:{setup:"setup <apiKey> [teamId] - Store API key",list:"list [limit] - List my assigned issues","list-team":"list-team <teamId> [limit] - List team issues",get:"get <id> - Get issue by ID or identifier","get-local":"get-local <id> - Get from local cache (no API)",sync:"sync - Pull all assigned issues to local storage","sync-status":"sync-status - Check local cache status",create:"create <json> - Create issue",update:"update <id> <json> - Update issue",start:"start <id> - Mark as in progress",done:"done <id> - Mark as done",comment:"comment <id> <text> - Add comment",teams:"teams - List available teams",projects:"projects - List available projects",status:"status - Check connection"}});break}default:S(`Unknown command: ${Tr}. Use --help to see available commands.`)}}catch(n){S(N(n))}}o(Ks,"main");Ks();