prjct-cli 3.63.0 → 3.63.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/bin/prjct-core.mjs +3 -3
- package/dist/bin/prjct-hooks.mjs +2 -2
- package/dist/daemon/entry.mjs +2 -2
- package/dist/mcp/server.mjs +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -17,7 +17,7 @@ ${e}`,action:"appended"};let o=n.substring(0,n.indexOf(t)),i=n.substring(n.index
|
|
|
17
17
|
`)}
|
|
18
18
|
`}var yG,p_,wG,kG,_n,m_,f_,h_,y_,k_,b_,hy=y(()=>{"use strict";Rr();mo();yG=uy.join("/"),p_="Generated with [p/](https://www.prjct.app/)",wG="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",kG="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",_n={rag:"prjct is a RAG-backed project memory harness; do not preload project history.",entrypoint:'`prjct work "<intent>" --md` is the single entrypoint \u2014 recognize intent and run the verb yourself.',pull:"Pull only what surfaces: `prjct search` / `context memory` / `guard` / MCP \u2014 not something to load wholesale.",remember:'Save synthesized memory in English: `prjct remember <decision|learning|gotcha|context> "<text>"`.',kb:`KB (\`${yG}\`): \`remember <facet>\` / \`context memory <facet>\` \u2014 on demand, never injected here.`,ship:"Ship only after user OKs: `prjct ship --md`.",loop:"Loop: land; H2+ intent; tip\u2192user SoT; close.",identity:"L0 portable; id=cwd."};c(tp,"buildCompactSkill");m_=tp,f_=tp;c(g_,"buildGlobalConfig");h_=c(()=>g_("Gemini"),"buildGeminiConfig"),y_=c(()=>g_("Antigravity"),"buildAntigravityConfig");c(w_,"buildIdePointer");k_=c(()=>w_(`description: "prjct \u2014 pull project memory + workflow on demand"
|
|
19
19
|
alwaysApply: true`),"buildCursorRule"),b_=c(()=>w_(`trigger: always_on
|
|
20
|
-
description: "prjct \u2014 pull project memory + workflow on demand"`),"buildWindsurfRule")});var Hi={};R(Hi,{PACKAGE_ROOT:()=>Ln,VERSION:()=>xe,getPackageRoot:()=>wy,getVersion:()=>go,resetPackageRoot:()=>ky});import yy from"node:fs";import np from"node:path";function wy(){if(Fi)return Fi;let n=__dirname;for(let e=0;e<5;e++){let t=np.join(n,"package.json");if(yy.existsSync(t))try{if(JSON.parse(yy.readFileSync(t,"utf-8")).name==="prjct-cli")return Fi=n,n}catch{}n=np.dirname(n)}return Fi=np.join(__dirname,"..","..",".."),Fi}function go(){if(fo)return fo;let n="3.63.
|
|
20
|
+
description: "prjct \u2014 pull project memory + workflow on demand"`),"buildWindsurfRule")});var Hi={};R(Hi,{PACKAGE_ROOT:()=>Ln,VERSION:()=>xe,getPackageRoot:()=>wy,getVersion:()=>go,resetPackageRoot:()=>ky});import yy from"node:fs";import np from"node:path";function wy(){if(Fi)return Fi;let n=__dirname;for(let e=0;e<5;e++){let t=np.join(n,"package.json");if(yy.existsSync(t))try{if(JSON.parse(yy.readFileSync(t,"utf-8")).name==="prjct-cli")return Fi=n,n}catch{}n=np.dirname(n)}return Fi=np.join(__dirname,"..","..",".."),Fi}function go(){if(fo)return fo;let n="3.63.1";if(n&&/^\d+\.\d+\.\d+/.test(n))return fo=n,fo;try{let e=np.join(wy(),"package.json");return fo=JSON.parse(yy.readFileSync(e,"utf-8")).version,fo}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",S(e)),"0.0.0"}}function ky(n){Fi=n,fo=null}var fo,Fi,xe,Ln,pt=y(()=>{"use strict";V();fo=null,Fi=null;c(wy,"getPackageRoot");c(go,"getVersion");c(ky,"resetPackageRoot");xe=go(),Ln=wy()});var ip={};R(ip,{default:()=>_G,getTemplateContent:()=>xt,listTemplates:()=>op,resetBundle:()=>CG});import vy from"node:fs";import bG from"node:fs/promises";import sp from"node:path";function Ey(){if(by)return rp;by=!0;let n=sp.join(Ln,"dist","templates.json");try{let e=vy.readFileSync(n,"utf-8");return rp=JSON.parse(e),rp}catch{return null}}function EG(n){let e=ho.indexOf(n);e>-1&&ho.splice(e,1),ho.push(n)}function SG(){for(;Ui.size>=vG&&ho.length>0;){let n=ho.shift();n&&Ui.delete(n)}}function v_(n){let e=/^---\n([\s\S]+?)\n---\n([\s\S]*)$/,t=n.match(e);if(!t)return{frontmatter:{},content:n.trim()};let[,r,s]=t,o={};return r.split(`
|
|
21
21
|
`).forEach(i=>{let[a,...l]=i.split(":");if(a&&l.length>0){let u=l.join(":").trim();u.startsWith("[")&&u.endsWith("]")?o[a.trim()]=u.slice(1,-1).split(",").map(d=>d.trim()):o[a.trim()]=u.replace(/^["']|["']$/g,"")}}),{frontmatter:o,content:s.trim()}}async function E_(n){if(Ui.has(n))return EG(n),Ui.get(n);let e,t=Ey();if(t){let s=`commands/${n}.md`;e=t[s]}if(!e){let s=sp.join(Ln,"templates","commands",`${n}.md`);try{e=await bG.readFile(s,"utf-8")}catch{throw zd.notFound(n)}}let r=v_(e);return SG(),Ui.set(n,r),ho.push(n),r}async function TG(n){return(await E_(n)).frontmatter["allowed-tools"]||[]}function S_(){Ui.clear(),ho.length=0}function CG(){rp=null,by=!1,S_()}function xt(n){let e=Ey();if(e?.[n])return e[n];let t=xG(n);if(t)return t;let r=sp.join(Ln,"templates",n);try{return vy.readFileSync(r,"utf-8")}catch{return null}}function xG(n){switch(n){case"codex/SKILL.md":return m_();case"antigravity/SKILL.md":return f_();case"global/GEMINI.md":return h_();case"global/ANTIGRAVITY.md":return y_();case"global/CURSOR.mdc":return k_();case"global/WINDSURF.md":return b_();default:return null}}function op(n){let e=Ey();if(e)return Object.keys(e).filter(r=>r.startsWith(n));let t=sp.join(Ln,"templates",n);try{return vy.readdirSync(t).map(s=>`${n}${s}`)}catch{return[]}}var vG,Ui,ho,rp,by,RG,_G,ar=y(()=>{"use strict";ts();hy();pt();vG=50,Ui=new Map,ho=[],rp=null,by=!1;c(Ey,"loadBundle");c(EG,"updateLruOrder");c(SG,"evictLru");c(v_,"parseFrontmatter");c(E_,"load");c(TG,"getAllowedTools");c(S_,"clearCache");c(CG,"resetBundle");c(xt,"getTemplateContent");c(xG,"getGeneratedTemplateContent");c(op,"listTemplates");RG={load:E_,parseFrontmatter:v_,getAllowedTools:TG,clearCache:S_,getTemplateContent:xt,listTemplates:op},_G=RG});var ap=y(()=>{"use strict"});var C_={};R(C_,{resolveUserHome:()=>_r,resolveUserPath:()=>Re});import AG from"node:os";import T_ from"node:path";function _r(){let n=process.env.HOME?.trim()||process.env.USERPROFILE?.trim();return n?T_.resolve(n):AG.homedir()}function Re(...n){return T_.join(_r(),...n)}var Fn=y(()=>{"use strict";c(_r,"resolveUserHome");c(Re,"resolveUserPath")});var x_,cp,R_,lp=y(()=>{"use strict";x_=new Set(["node_modules",".git","dist","build","out",".next",".nuxt","coverage",".cache",".turbo",".vercel",".parcel-cache","__pycache__",".pytest_cache","target","vendor",".venv","venv","eggs","*.egg-info",".prjct",".worktrees"]),cp=["",".ts",".tsx",".js",".jsx","/index.ts","/index.js"],R_=/(?:import|from)\s+['"]([^'"]+)['"]/g});import I_ from"node:fs/promises";async function P_(n,e){let t;try{t=await I_.readFile(n,"utf-8")}catch(o){if(ne(o))return null;throw o}let r;try{r=JSON.parse(t)}catch{return await __(n,t),A_(n,"Malformed JSON"),null}let s=e.safeParse(r);return s.success?r:(await __(n,t),A_(n,IG(s.error)),null)}async function __(n,e){let t=`${n}.backup`;try{await I_.writeFile(t,e,{encoding:"utf-8",flag:"wx"})}catch{}}function A_(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 IG(n){return n.issues.slice(0,3).map(e=>`${e.path.join(".")}: ${e.message}`).join("; ")}var j_=y(()=>{"use strict";V();c(P_,"safeRead");c(__,"createBackup");c(A_,"logCorruption");c(IG,"formatZodError")});var Un={};R(Un,{batchProcess:()=>Hn,dirExists:()=>wt,ensureDir:()=>an,fileExists:()=>P,listFiles:()=>rs,readFile:()=>In,readJson:()=>ze,walkDir:()=>An,writeFile:()=>ns,writeFileAtomic:()=>yo,writeJson:()=>Fe});import on from"node:fs/promises";import Lc from"node:path";async function Sy(n,e,t){try{return await t()}catch(r){throw fy(r)||my(r)?new Error(Li(r,n,e)):r}}async function An(n,e={}){let t=[],r=e.maxFiles??1/0,s=e.dotfileAllowlist?new Set(e.dotfileAllowlist):null;async function o(i){if(t.length>=r)return;let a=await on.readdir(i,{withFileTypes:!0}).catch(()=>[]);for(let l of a){if(t.length>=r)break;let u=String(l.name);if(x_.has(u)||e.skipDotfiles&&u.startsWith(".")&&(!s||!s.has(u)))continue;let d=Lc.join(i,u);l.isDirectory()?await o(d):l.isFile()&&t.push(Lc.relative(n,d))}}return c(o,"walk"),await o(n),t}async function Hn(n,e,t){let r=[];for(let s=0;s<n.length;s+=e){let o=await Promise.all(n.slice(s,s+e).map(t));for(let i of o)i!==null&&r.push(i)}return r}async function ze(n,e=null,t){if(t)return await P_(n,t)??e;try{let r=await on.readFile(n,"utf-8");return JSON.parse(r)}catch(r){if(ne(r))return e;throw r}}async function Fe(n,e,t=2){await Sy(n,"config",async()=>{let r=Lc.dirname(n);await on.mkdir(r,{recursive:!0});let s=`${JSON.stringify(e,null,t)}
|
|
22
22
|
`;await on.writeFile(n,s,"utf-8")})}async function In(n,e=""){try{return await on.readFile(n,"utf-8")}catch(t){if(ne(t))return e;throw t}}async function ns(n,e){await Sy(n,"file",async()=>{let t=Lc.dirname(n);await on.mkdir(t,{recursive:!0}),await on.writeFile(n,e,"utf-8")})}async function yo(n,e){await Sy(n,"file",async()=>{let t=Lc.dirname(n);await on.mkdir(t,{recursive:!0});let r=`${n}.tmp`;await on.writeFile(r,e,"utf-8"),await on.rename(r,n)})}async function P(n){try{return await on.access(n),!0}catch(e){if(ne(e))return!1;throw e}}async function wt(n){try{return(await on.stat(n)).isDirectory()}catch(e){if(ne(e))return!1;throw e}}async function an(n){await on.mkdir(n,{recursive:!0})}async function rs(n,e={}){try{let r=await on.readdir(n,{withFileTypes:!0});return e.filesOnly&&(r=r.filter(s=>s.isFile())),e.dirsOnly&&(r=r.filter(s=>s.isDirectory())),e.extension&&(r=r.filter(s=>s.name.endsWith(e.extension))),r.map(s=>s.name)}catch(t){if(ne(t))return[];throw t}}var se=y(()=>{"use strict";lp();j_();V();c(Sy,"withWriteErrorContext");c(An,"walkDir");c(Hn,"batchProcess");c(ze,"readJson");c(Fe,"writeJson");c(In,"readFile");c(ns,"writeFile");c(yo,"writeFileAtomic");c(P,"fileExists");c(wt,"dirExists");c(an,"ensureDir");c(rs,"listFiles")});var Ty,$_=y(()=>{"use strict";Ty="mcp-remote@0.1.38"});import PG from"node:fs";import jG from"node:fs/promises";import N_ from"node:os";import ss from"node:path";function $G(){let n=NG();if(n)return{command:n,args:["mcp-server"],description:Cy};try{let e=ss.dirname(Cn.resolve("prjct-cli/package.json"));return{command:ss.join(e,"bin","prjct"),args:["mcp-server"],description:Cy}}catch{return{command:"npx",args:["-y","prjct-cli","mcp-server"],description:Cy}}}function NG(){let n=process.argv[1],e=[n?ss.resolve(ss.dirname(n),"prjct"):"",n?ss.resolve(ss.dirname(n),"..","bin","prjct"):"",ss.resolve(process.cwd(),"bin","prjct")].filter(Boolean);for(let t of e)if(PG.existsSync(t))return t;return null}function Wi(){return process.env.PRJCT_TEST_MODE==="1"?ss.join(N_.tmpdir(),"prjct-context7-test","mcp.json"):ss.join(N_.homedir(),".claude","mcp.json")}async function D_(n=Wi()){try{let e=await jG.readFile(n,"utf-8");return JSON.parse(e)}catch(e){let t=S(e).toLowerCase();if(t.includes("no such file")||t.includes("enoent"))return{};throw new Error(`Failed to read MCP config at ${n}: ${S(e)}`)}}async function DG(n,e=Wi()){await Fe(e,n)}async function Fc(n,e,t=Wi()){let r=await D_(t),s={...r.mcpServers||{}},o=s[n];s[n]=e,r.mcpServers=s;let i=JSON.stringify(o)!==JSON.stringify(e);return await DG(r,t),{path:t,changed:i}}async function O_(n,e=Wi()){return!!(await D_(e)).mcpServers?.[n]}var Cy,Wn,Bi=y(()=>{"use strict";V();se();$_();Cy="prjct: agentic harness with project memory, workflow gates, intent briefs, and performance context. Use prjct_task_start as the MCP entrypoint for a work cycle; prjct retrieves focused context, persists evidence stations, and keeps humans in the loop for risky gates. Agents resume from prjct_task_status/workflow output, create or link reviewed intent/spec briefs when required, and persist synthesized learning instead of raw transcript fragments.";c($G,"getPrjctMcpConfig");c(NG,"resolveLocalPrjctBin");Wn={context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"],description:"Library documentation lookup"},prjct:$G(),linear:{command:"npx",args:["-y",Ty,"https://mcp.linear.app/mcp"],description:"Linear MCP server (OAuth)"},jira:{command:"npx",args:["-y",Ty,"https://mcp.atlassian.com/v1/mcp"],description:"Atlassian MCP server for Jira (OAuth)"}};c(Wi,"getClaudeMcpConfigPath");c(D_,"readMcpConfig");c(DG,"writeMcpConfig");c(Fc,"upsertMcpServer");c(O_,"hasMcpServer")});var V_={};R(V_,{buildCodexStatusLineToml:()=>X_,buildContext7McpTomlBlock:()=>G_,buildPrjctMcpTomlBlock:()=>B_,codexHasContext7Server:()=>Ry,ensureCodexContext7Server:()=>Uc,ensureCodexMcpServer:()=>Hc,getCodexConfigTomlPath:()=>cr});import wo from"node:fs/promises";import xy from"node:path";function cr(){return process.env.PRJCT_TEST_MODE==="1"?xy.join(Re(".prjct-tests"),"codex","config.toml"):Re(".codex","config.toml")}function up(n){return`"${n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function W_(n,e,t,r){let s=(e.args??[]).map(up).join(", ");return[t,`[mcp_servers.${n}]`,`command = ${up(e.command)}`,`args = [${s}]`,r,""].join(`
|
|
23
23
|
`)}function B_(n=Wn.prjct){return W_("prjct",n,M_,L_)}function G_(n=Wn.context7){return W_("context7",n,F_,H_)}function q_(n,e,t,r,s){let o=n.indexOf(t),i=n.indexOf(r);if(o!==-1&&i!==-1&&i>o){let a=n.slice(0,o),l=n.slice(i+r.length);return l.startsWith(`
|
|
@@ -1391,7 +1391,7 @@ public static class PrjctCredentialManager {
|
|
|
1391
1391
|
CredDelete(target, CRED_TYPE_GENERIC, 0);
|
|
1392
1392
|
}
|
|
1393
1393
|
}
|
|
1394
|
-
`;c(Pw,"powershellArgs");c(jw,"windowsCommand");c(b0,"readWindowsCredentialManager");c(y2,"writeWindowsCredentialManager");c(w2,"clearWindowsCredentialManager");c(k2,"platformGet");c(b2,"hasSecureCredentialStore");c(v2,"platformSet");c(E2,"platformClear");c(S2,"platformLocation");c($w,"activeStore");c(ul,"getAuthToken");c(Nw,"setAuthToken");c(Dw,"clearAuthToken")});var Uw={};R(Uw,{default:()=>Ee});import T2 from"node:crypto";import Ow from"node:fs/promises";import Mw from"node:os";import E0 from"node:path";function Lw(){return T2.randomUUID()}function Fw(n){return{...n,apiKey:null}}var T0,S0,Hw,C2,Ee,us=y(()=>{"use strict";De();se();v0();T0="https://cli-api.prjct.app",S0={apiKey:null,apiUrl:T0,userId:null,email:null,lastAuth:null};c(Lw,"freshDeviceId");c(Fw,"metadataOnly");Hw=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=B.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig={...this.cachedConfig,apiKey:await ul()},this.cachedConfig;let e=await ze(this.configPath),t=await ul(),r={...e??S0,apiKey:t},s=!1;if(!t&&e?.apiKey&&(await Nw(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=Lw(),s=!0),r.hostname||(r.hostname=Mw.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await Fe(this.configPath,Fw(this.cachedConfig)),await Ow.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Lw()}async getHostname(){return(await this.read()).hostname??Mw.hostname()}async write(e){let t=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await Nw(e.apiKey):await Dw());let r={...t,...e,apiKey:await ul(),lastAuth:new Date().toISOString()};await an(E0.dirname(this.configPath)),await Fe(this.configPath,Fw(r)),await Ow.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await ul()}async getApiUrl(){return(await this.read()).apiUrl||T0}async saveAuth(e,t,r){await this.write({apiKey:e,userId:t,email:r})}async clearAuth(){await Dw();let e=this.cachedConfig??await ze(this.configPath);this.cachedConfig={...S0,deviceId:e?.deviceId??Lw(),hostname:e?.hostname??Mw.hostname()},await an(E0.dirname(this.configPath)),await Fe(this.configPath,Fw(this.cachedConfig)),await Ow.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},C2=new Hw,Ee=C2});import{createHash as x2,randomBytes as C0}from"node:crypto";function Ww(n){return n.toString("base64url")}function _0(){let n=Ww(C0(x0)),e=Ww(C0(x0)),t=Ww(x2("sha256").update(n,"ascii").digest());return{state:e,codeVerifier:n,codeChallenge:t,codeChallengeMethod:"S256"}}function A0(n){return new URLSearchParams({flow:R0,port:String(n.port),device_id:n.deviceId,hostname:n.hostname,state:n.state,code_challenge:n.codeChallenge,code_challenge_method:"S256"})}function I0(n,e){if(n.get("key"))return{ok:!1,reason:"legacy-bearer",message:"This CLI requires PKCE login. Update the web app or set flow=pkce-v1; bearer tokens in the callback URL are no longer accepted."};let r=n.get("code"),s=n.get("state");return!r||!s?{ok:!1,reason:"missing",message:"Missing authorization code or state in callback"}:s!==e?{ok:!1,reason:"mismatch",message:"Login state mismatch \u2014 try `prjct login` again"}:{ok:!0,code:r,state:s}}function P0(n){return{flow:R0,code:n.code,state:n.state,code_verifier:n.codeVerifier,device_id:n.deviceId,redirect_uri:`http://127.0.0.1:${n.port}/callback`}}function j0(n){if(!n||typeof n!="object")return null;let e=n,t=e.apiKey??e.api_key,r=e.userId??e.user_id,s=e.email,o=e.deviceId??e.device_id;return!t||!r||!s||!o?null:{apiKey:t,userId:r,email:s,deviceId:o}}var R0,x0,$0=y(()=>{"use strict";R0="pkce-v1",x0=32;c(Ww,"base64Url");c(_0,"generatePkceMaterial");c(A0,"buildCliLoginSearchParams");c(I0,"parsePkceCallback");c(P0,"buildExchangeBody");c(j0,"parseMintedKeyResponse")});function _o(n){if(n)return R2[n]}function N0(n,e){let t=_2[n];return t?{...Fp,...e??{}}[t]!==!1:!0}var R2,_2,Fp,Ice,Hp=y(()=>{"use strict";R2={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};c(_o,"toCloudTable");_2={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},Fp={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};c(N0,"isTableIncluded");Ice=Object.keys(Fp)});function A2(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function I2(n){let e={};for(let[t,r]of Object.entries(n))e[A2(t)]=r;return e}function P2(n,e){let[t,r]=e.type.split("."),s=_o(e.entityType)??_o(t);if(!s)return null;let i=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",a=e.data||{},l=I2(a),u=e.entityId||l.id||a.id||"",d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:n},project_id:n};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function D0(n,e){return e.map(t=>P2(n,t)).filter(t=>t!==null)}var O0=y(()=>{"use strict";Hp();c(A2,"camelToSnake");c(I2,"snakeCaseKeys");c(P2,"mapCliEventToWebFormat");c(D0,"mapCliEventsToWebFormat")});var M0={};R(M0,{default:()=>Ao,syncClient:()=>Os});var Bw,Os,Ao,na=y(()=>{"use strict";Ep();us();O0();Bw=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=D0(e,t),a=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async pullEvents(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a={projectId:e};typeof t=="number"&&t>0&&(a.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(a)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...r?{meta:r}:{}})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async setCloudLifecycle(e,t){try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${t}`,{method:"POST",headers:{...this.authHeaders(s,o)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,t){try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return{ok:!1};let i=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify(t)});if(!i.ok)return{ok:!1};let a=await i.json();return{ok:a.ok!==!1,nodes:a.nodes,links:a.links}}catch{return{ok:!1}}}async publishBenchmark(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ki("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await Ee.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Ee.hasAuth()}async getAuthHeaders(){let[e,t,r]=await Promise.all([Ee.getApiUrl(),Ee.getApiKey(),Ee.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:r}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,r=0){let s=new AbortController,o=setTimeout(()=>s.abort(),Ki("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),a&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ki("API_REQUEST")}ms)`);if(a&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),r=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await Ee.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await Ee.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,r){return{code:e,message:t,status:r}}sleep(e){return new Promise(t=>setTimeout(t,e))}},Os=new Bw,Ao=Os});var Gw,Io,L0=y(()=>{"use strict";pe();U();Gw=class{static{c(this,"SyncPendingStorage")}append(e,t){let r=I(),s=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&v.run(e,`DELETE FROM sync_pending
|
|
1394
|
+
`;c(Pw,"powershellArgs");c(jw,"windowsCommand");c(b0,"readWindowsCredentialManager");c(y2,"writeWindowsCredentialManager");c(w2,"clearWindowsCredentialManager");c(k2,"platformGet");c(b2,"hasSecureCredentialStore");c(v2,"platformSet");c(E2,"platformClear");c(S2,"platformLocation");c($w,"activeStore");c(ul,"getAuthToken");c(Nw,"setAuthToken");c(Dw,"clearAuthToken")});var Uw={};R(Uw,{default:()=>Ee});import T2 from"node:crypto";import Ow from"node:fs/promises";import Mw from"node:os";import E0 from"node:path";function Lw(){return T2.randomUUID()}function Fw(n){return{...n,apiKey:null}}var T0,S0,Hw,C2,Ee,us=y(()=>{"use strict";De();se();v0();T0="https://cli-api.prjct.app",S0={apiKey:null,apiUrl:T0,userId:null,email:null,lastAuth:null};c(Lw,"freshDeviceId");c(Fw,"metadataOnly");Hw=class{static{c(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=B.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig={...this.cachedConfig,apiKey:await ul()},this.cachedConfig;let e=await ze(this.configPath),t=await ul(),r={...e??S0,apiKey:t},s=!1;if(!t&&e?.apiKey&&(await Nw(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=Lw(),s=!0),r.hostname||(r.hostname=Mw.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await Fe(this.configPath,Fw(this.cachedConfig)),await Ow.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Lw()}async getHostname(){return(await this.read()).hostname??Mw.hostname()}async write(e){let t=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await Nw(e.apiKey):await Dw());let r={...t,...e,apiKey:await ul(),lastAuth:new Date().toISOString()};await an(E0.dirname(this.configPath)),await Fe(this.configPath,Fw(r)),await Ow.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await ul()}async getApiUrl(){return(await this.read()).apiUrl||T0}async saveAuth(e,t,r){await this.write({apiKey:e,userId:t,email:r})}async clearAuth(){await Dw();let e=this.cachedConfig??await ze(this.configPath);this.cachedConfig={...S0,deviceId:e?.deviceId??Lw(),hostname:e?.hostname??Mw.hostname()},await an(E0.dirname(this.configPath)),await Fe(this.configPath,Fw(this.cachedConfig)),await Ow.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},C2=new Hw,Ee=C2});import{createHash as x2,randomBytes as C0}from"node:crypto";function Ww(n){return n.toString("base64url")}function _0(){let n=Ww(C0(x0)),e=Ww(C0(x0)),t=Ww(x2("sha256").update(n,"ascii").digest());return{state:e,codeVerifier:n,codeChallenge:t,codeChallengeMethod:"S256"}}function A0(n){return new URLSearchParams({flow:R0,port:String(n.port),device_id:n.deviceId,hostname:n.hostname,state:n.state,code_challenge:n.codeChallenge,code_challenge_method:"S256"})}function I0(n,e){if(n.get("key"))return{ok:!1,reason:"legacy-bearer",message:"This CLI requires PKCE login. Update the web app or set flow=pkce-v1; bearer tokens in the callback URL are no longer accepted."};let r=n.get("code"),s=n.get("state");return!r||!s?{ok:!1,reason:"missing",message:"Missing authorization code or state in callback"}:s!==e?{ok:!1,reason:"mismatch",message:"Login state mismatch \u2014 try `prjct login` again"}:{ok:!0,code:r,state:s}}function P0(n){return{flow:R0,code:n.code,state:n.state,code_verifier:n.codeVerifier,device_id:n.deviceId,redirect_uri:`http://127.0.0.1:${n.port}/callback`}}function j0(n){if(!n||typeof n!="object")return null;let e=n,t=e.apiKey??e.api_key,r=e.userId??e.user_id,s=e.email,o=e.deviceId??e.device_id;return!t||!r||!s||!o?null:{apiKey:t,userId:r,email:s,deviceId:o}}var R0,x0,$0=y(()=>{"use strict";R0="pkce-v1",x0=32;c(Ww,"base64Url");c(_0,"generatePkceMaterial");c(A0,"buildCliLoginSearchParams");c(I0,"parsePkceCallback");c(P0,"buildExchangeBody");c(j0,"parseMintedKeyResponse")});function _o(n){if(n)return R2[n]}function N0(n,e){let t=_2[n];return t?{...Fp,...e??{}}[t]!==!1:!0}var R2,_2,Fp,Ice,Hp=y(()=>{"use strict";R2={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};c(_o,"toCloudTable");_2={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},Fp={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};c(N0,"isTableIncluded");Ice=Object.keys(Fp)});function A2(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function I2(n){let e={};for(let[t,r]of Object.entries(n))e[A2(t)]=r;return e}function P2(n,e){let[t,r]=e.type.split("."),s=_o(e.entityType)??_o(t);if(!s)return null;let i=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",a=e.data||{},l=I2(a),u=e.entityId||(typeof l.id=="string"?l.id:"")||(typeof a.id=="string"?a.id:"")||(typeof l.task_id=="string"?l.task_id:"")||(typeof a.taskId=="string"?a.taskId:"")||(typeof l.entity_id=="string"?l.entity_id:"")||"";u&&l.id==null&&(l.id=u);let d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:n},project_id:n};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function D0(n,e){return e.map(t=>P2(n,t)).filter(t=>t!==null)}var O0=y(()=>{"use strict";Hp();c(A2,"camelToSnake");c(I2,"snakeCaseKeys");c(P2,"mapCliEventToWebFormat");c(D0,"mapCliEventsToWebFormat")});var M0={};R(M0,{default:()=>Ao,syncClient:()=>Os});var Bw,Os,Ao,na=y(()=>{"use strict";Ep();us();O0();Bw=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=D0(e,t),a=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async pullEvents(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a={projectId:e};typeof t=="number"&&t>0&&(a.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(a)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...r?{meta:r}:{}})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async setCloudLifecycle(e,t){try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${t}`,{method:"POST",headers:{...this.authHeaders(s,o)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,t){try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return{ok:!1};let i=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify(t)});if(!i.ok)return{ok:!1};let a=await i.json();return{ok:a.ok!==!1,nodes:a.nodes,links:a.links}}catch{return{ok:!1}}}async publishBenchmark(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Ki("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await Ee.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await Ee.hasAuth()}async getAuthHeaders(){let[e,t,r]=await Promise.all([Ee.getApiUrl(),Ee.getApiKey(),Ee.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:r}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,r=0){let s=new AbortController,o=setTimeout(()=>s.abort(),Ki("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),a&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ki("API_REQUEST")}ms)`);if(a&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),r=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await Ee.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await Ee.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,r){return{code:e,message:t,status:r}}sleep(e){return new Promise(t=>setTimeout(t,e))}},Os=new Bw,Ao=Os});var Gw,Io,L0=y(()=>{"use strict";pe();U();Gw=class{static{c(this,"SyncPendingStorage")}append(e,t){let r=I(),s=JSON.stringify(t);return t.entityType&&t.entityId&&t.contentHash&&v.run(e,`DELETE FROM sync_pending
|
|
1395
1395
|
WHERE project_id = ?
|
|
1396
1396
|
AND entity_type = ?
|
|
1397
1397
|
AND entity_id = ?
|
|
@@ -3012,7 +3012,7 @@ ${ji.dim("Providers:")}`}var Ane,UR=y(()=>{"use strict";Ane={ready:ji.green("\u2
|
|
|
3012
3012
|
${s.dim("Run 'prjct start' to configure global/runtime adapters")}
|
|
3013
3013
|
${s.dim("Run 'prjct init' or 'prjct sync' to refresh AGENTS.md and project-level rules")}
|
|
3014
3014
|
${s.cyan("https://prjct.app")}
|
|
3015
|
-
`)}else return!1;return!0}var OB=y(()=>{"use strict";c(Ine,"runBinCommand")});var MB=JB((EBe,Pne)=>{Pne.exports={name:"prjct-cli",version:"3.63.
|
|
3015
|
+
`)}else return!1;return!0}var OB=y(()=>{"use strict";c(Ine,"runBinCommand")});var MB=JB((EBe,Pne)=>{Pne.exports={name:"prjct-cli",version:"3.63.1",description:"The agentic harness for AI coding agents \u2014 work cycles, bounded RAG context, persistent memory, guardrails, and performance evals.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct.cjs"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:unit":"bun test --path-ignore-patterns='**/e2e/**'","test:fast":"bun test --path-ignore-patterns='**/e2e/**' --dots","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .",knip:"knip","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write .","test:e2e":"bun test core/__tests__/e2e/","bench:ab":"bun scripts/bench-ab.ts","bench:weak-model":"bun scripts/bench-weak-model.ts","demo:weak-vs-frontier":"bun scripts/demo-weak-vs-frontier.ts","harness:score":"bun bin/prjct.ts harness score --md","gate:dominance":"bun test core/__tests__/services/weak-model-bench.test.ts core/__tests__/services/weak-frontier-demo.test.ts core/__tests__/services/harness-score.test.ts core/__tests__/services/dynasty-outcomes.test.ts core/__tests__/services/content-bound-stamp.test.ts core/__tests__/services/sot-bind.test.ts core/__tests__/services/trap-surface-slo.test.ts core/__tests__/services/impact-ready.test.ts core/__tests__/services/delivery-geometry.test.ts core/__tests__/services/cycle-budget-card.test.ts core/__tests__/services/land-rho.test.ts core/__tests__/services/one-breath-install.test.ts core/__tests__/services/doctor-heal.test.ts && bun run bench:weak-model && bun run demo:weak-vs-frontier"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:{name:"Juan Jos\xE9 L\xF3pez Lira",email:"jlopezlira@gmail.com",url:"https://prjct.app"},contributors:[{name:"prjct.app contributors"}],license:"MIT",licenses:[{type:"MIT",url:"https://opensource.org/licenses/MIT"}],dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:"4.12.27","ip-address":">=10.1.1",qs:"6.15.2"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.28.1",knip:"6.3.1",lefthook:"2.1.0",typescript:"5.9.3"},repository:{type:"git",url:"git+https://github.com/prjct-app/cli.git"},bugs:{url:"https://github.com/prjct-app/cli/issues"},homepage:"https://cli.prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.5.0"},files:["assets/","bin/prjct","bin/prjct.cjs","dist/","templates/","scripts/install.sh","LICENSE","NOTICE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var Mne={};import LB from"node:os";import ty from"node:path";import $i from"chalk";async function jne(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>KB(MB()));await Dne(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(One(),process.exit(0)),n&&nd(n)&&!At.getByName(n)){let r=td[n];r&&(h.failWithHint({message:`'prjct ${n}' was removed in v2. ${r.note}`,hint:`Use: ${r.replacement}`}),process.exit(1))}if(n&&!At.getByName(n)&&!(e.length===0&&jd(n)!==null)){let s=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[s,...o]}let t=e.includes("--md");t||h.start();try{let r=At.getByName(n);if(!r){let m=jd(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Bc("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||h.end(),process.exit(1)}if(r.deprecated){let m=r.replacedBy?`Use 'prjct ${r.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||h.end(),process.exit(1)}r.implemented||(h.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/prjct-app/cli"}),t||h.end(),process.exit(1));let{parsedArgs:s,options:o}=Nne(r,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;r.requiresLlm&&!i&&(h.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||h.end(),process.exit(1));let a=$ne(r,s);a&&(h.failWithHint(a),t||h.end(),process.exit(1));let l=null,u=Date.now();try{l=await _.getProjectId(process.cwd()),l&&(await mi.expireIfStale(l),await mi.touch(l))}catch{}let d=new Ri,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update"||n==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,g=At.getByName(n);if(g?.optionSchema)p=await At.executeWithOptions(n,m,process.cwd(),Jh(o,g.optionSchema));else{let k={spec:c(b=>$d(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),intent:c(b=>$d(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"intent"),"audit-spec":c(b=>b?d.specAudit(b,process.cwd(),{md:f,lenses:o.lenses?String(o.lenses):void 0}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:c(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),sync:c(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":c(b=>b?d.saveLlmAnalysis(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"}),"analysis-save-llm"),start:c(()=>d.start(),"start"),login:c(()=>d.login({md:f}),"login"),logout:c(()=>d.logout(),"logout"),auth:c(b=>d.auth(b,{md:f}),"auth")}[n];if(k)p=await k(m);else throw new Error(`Command '${n}' has no handler`)}}if(l){let m=Date.now()-u;try{await mi.trackCommand(l,n,m)}catch{}try{await rd.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let g=Number(process.hrtime.bigint()-f)/1e6;await rd.recordTiming(l,"startup_time",g)}await rd.recordMemory(l,{command:n})}catch{}}p?.message?console.log(p.message):p?.error&&console.error(p.error),t||h.end(),process.exit(p?.success?0:1)}catch(r){console.error("Error:",S(r)),process.env.DEBUG&&console.error(gy(r)),t||h.end(),process.exit(1)}}function $ne(n,e){if(!n.params)return null;let r=n.params.replace(/\[[^\]]*\]/g,"").match(/<[^>]+>/g);if(!r||r.length===0)return null;if(e.length<r.length){let s=r.map(i=>i.slice(1,-1)).join(", "),o=n.usage.terminal||`prjct ${n.name} ${n.params}`;return Bc("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${o}`})}return null}function Nne(n,e){let t=[],r={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?r[i]=e[++s]:r[i]=!0}else t.push(o)}return{parsedArgs:t,options:r}}async function Dne(n){let e=await vo(),t=ty.join(LB.homedir(),".claude","commands","p.md"),r=ty.join(LB.homedir(),".gemini","commands","p.toml"),[s,o,i,a]=await Promise.all([P(t),P(r),P(ty.join(process.cwd(),".cursor","commands","sync.md")),P(ty.join(process.cwd(),".cursor"))]),l=await Jc();console.log(HR(n)),console.log(_c("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?$i.dim(` (v${e.claude.version})`):"")),console.log(_c("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?$i.dim(` (v${e.gemini.version})`):"")),console.log(_c("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${$i.dim("(run prjct start)")}`:"")),console.log(_c("Cursor IDE",i?"ready":a?"detected":"missing",i?` ${$i.dim("(use prjct router)")}`:a?` ${$i.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
|
|
3016
3016
|
${$i.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
|
|
3017
3017
|
${$i.cyan("https://prjct.app")}
|
|
3018
3018
|
`)}function One(){console.log(`
|
package/dist/bin/prjct-hooks.mjs
CHANGED
|
@@ -1228,7 +1228,7 @@ CREATE TABLE velocity_sprints (
|
|
|
1228
1228
|
name TEXT NOT NULL,
|
|
1229
1229
|
applied_at TEXT NOT NULL
|
|
1230
1230
|
)
|
|
1231
|
-
`);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=Bo.filter(i=>!r.has(i.version));if(s.length!==0){if(n&&r.size>0)try{let i=`${n}.pre-migrate.bak`;ui.existsSync(i)&&ui.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)pu(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new Go,y=E});function Uh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function mu(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:Uh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:Uh(r.host),repoSlug:s}}catch{return{}}}async function nN(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function rN(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function nr(t){return typeof t=="string"&&t.length>0?t:void 0}function Wh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function sN(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Bh(t){let e=E.getDoc(t,"project")||{},n=nr(e.repoPath),{provider:r,repoSlug:s}=n?mu(await nN(n)||""):{},i=n?await rN(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return sN({provider:r,repoSlug:s,currentBranch:nr(e.currentBranch),defaultBranch:i,stack:nr(e.stack),techStack:o&&o.length>0?o:void 0,version:nr(e.version),commitCount:Wh(e.commitCount),fileCount:Wh(e.fileCount),lastCommit:nr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:nr(e.cliVersion),syncedAt:nr(e.lastSync)})}var gu=f(()=>{"use strict";O();ne();a(Uh,"providerForHost");a(mu,"parseRemote");a(nN,"gitRemoteUrl");a(rN,"gitDefaultBranch");a(nr,"str");a(Wh,"num");a(sN,"compact");a(Bh,"buildProjectMeta")});import{execFile as iN}from"node:child_process";import oN from"node:crypto";import{promisify as aN}from"node:util";function uN(t,e=lN){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=oN.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function dN(t){let e;try{let{stdout:s}=await cN("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=mu(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function Gh(t){let e=await dN(t);return e?uN(e):null}var cN,lN,Xh=f(()=>{"use strict";gu();cN=aN(iN),lN="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(uN,"uuidv5");a(dN,"repoKey");a(Gh,"deriveProjectId")});var yu={};A(yu,{PACKAGE_ROOT:()=>ln,VERSION:()=>Be,getPackageRoot:()=>hu,getVersion:()=>qo,resetPackageRoot:()=>pN});import fu from"node:fs";import Xo from"node:path";function hu(){if(Qr)return Qr;let t=__dirname;for(let e=0;e<5;e++){let n=Xo.join(t,"package.json");if(fu.existsSync(n))try{if(JSON.parse(fu.readFileSync(n,"utf-8")).name==="prjct-cli")return Qr=t,t}catch{}t=Xo.dirname(t)}return Qr=Xo.join(__dirname,"..","..",".."),Qr}function qo(){if(rr)return rr;let t="3.63.
|
|
1231
|
+
`);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(i=>i.version)),s=Bo.filter(i=>!r.has(i.version));if(s.length!==0){if(n&&r.size>0)try{let i=`${n}.pre-migrate.bak`;ui.existsSync(i)&&ui.rmSync(i,{force:!0}),e.prepare("VACUUM INTO ?").run(i)}catch(i){console.warn(`prjct: pre-migration backup failed (continuing): ${i?.message??i}`)}for(let i of s)pu(e,()=>{i.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(i.version,i.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},E=new Go,y=E});function Uh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function mu(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:Uh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:Uh(r.host),repoSlug:s}}catch{return{}}}async function nN(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function rN(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function nr(t){return typeof t=="string"&&t.length>0?t:void 0}function Wh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function sN(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Bh(t){let e=E.getDoc(t,"project")||{},n=nr(e.repoPath),{provider:r,repoSlug:s}=n?mu(await nN(n)||""):{},i=n?await rN(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return sN({provider:r,repoSlug:s,currentBranch:nr(e.currentBranch),defaultBranch:i,stack:nr(e.stack),techStack:o&&o.length>0?o:void 0,version:nr(e.version),commitCount:Wh(e.commitCount),fileCount:Wh(e.fileCount),lastCommit:nr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:nr(e.cliVersion),syncedAt:nr(e.lastSync)})}var gu=f(()=>{"use strict";O();ne();a(Uh,"providerForHost");a(mu,"parseRemote");a(nN,"gitRemoteUrl");a(rN,"gitDefaultBranch");a(nr,"str");a(Wh,"num");a(sN,"compact");a(Bh,"buildProjectMeta")});import{execFile as iN}from"node:child_process";import oN from"node:crypto";import{promisify as aN}from"node:util";function uN(t,e=lN){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=oN.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function dN(t){let e;try{let{stdout:s}=await cN("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=mu(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function Gh(t){let e=await dN(t);return e?uN(e):null}var cN,lN,Xh=f(()=>{"use strict";gu();cN=aN(iN),lN="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(uN,"uuidv5");a(dN,"repoKey");a(Gh,"deriveProjectId")});var yu={};A(yu,{PACKAGE_ROOT:()=>ln,VERSION:()=>Be,getPackageRoot:()=>hu,getVersion:()=>qo,resetPackageRoot:()=>pN});import fu from"node:fs";import Xo from"node:path";function hu(){if(Qr)return Qr;let t=__dirname;for(let e=0;e<5;e++){let n=Xo.join(t,"package.json");if(fu.existsSync(n))try{if(JSON.parse(fu.readFileSync(n,"utf-8")).name==="prjct-cli")return Qr=t,t}catch{}t=Xo.dirname(t)}return Qr=Xo.join(__dirname,"..","..",".."),Qr}function qo(){if(rr)return rr;let t="3.63.1";if(t&&/^\d+\.\d+\.\d+/.test(t))return rr=t,rr;try{let e=Xo.join(hu(),"package.json");return rr=JSON.parse(fu.readFileSync(e,"utf-8")).version,rr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",C(e)),"0.0.0"}}function pN(t){Qr=t,rr=null}var rr,Qr,Be,ln,Dt=f(()=>{"use strict";te();rr=null,Qr=null;a(hu,"getPackageRoot");a(qo,"getVersion");a(pN,"resetPackageRoot");Be=qo(),ln=hu()});async function Vo(t){try{let{stdout:e}=await H(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function mN(){let t=await Vo("gh api user --jq .login");return t.success&&t.output||(t=await Vo("git config --global github.user"),t.success&&t.output)?t.output:null}async function gN(){let t=await Vo("git config user.name");return t.success&&t.output?t.output:null}async function fN(){let t=await Vo("git config user.email");return t.success&&t.output?t.output:null}async function Zr(){let[t,e,n]=await Promise.all([mN(),gN(),fN()]);return{github:t,email:n,name:e||t||"Unknown"}}var Jo=f(()=>{"use strict";ne();a(Vo,"execCommand");a(mN,"detectGitHubUsername");a(gN,"detectGitName");a(fN,"detectGitEmail");a(Zr,"detect")});var Ko={};A(Ko,{worktreeService:()=>hN});import ku from"node:fs/promises";import qt from"node:path";var qh,wu,hN,Yo=f(()=>{"use strict";ne();Y();qh=".worktrees",wu=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=qt.join(s,qh,n),o=r.branch||`feat/${n}`;await ku.mkdir(qt.join(s,qh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await H(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await H("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await H(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await H(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await H("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await H("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await H("git rev-parse --git-dir",{cwd:e}),s=qt.resolve(e,n.trim()),i=qt.resolve(e,r.trim());if(s!==i){let{stdout:o}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await H("git rev-parse HEAD",{cwd:e}),{stdout:l}=await H("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=qt.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await H("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1232
1232
|
`)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await H("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=qt.join(n,".env");await L(r)&&await ku.copyFile(r,qt.join(e,".env"));let s=qt.join(n,".prjct"),i=qt.join(e,".prjct");await L(s)&&!await L(i)&&await ku.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await H("git worktree prune",{cwd:s});for(let i of n)i.isMain||await L(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
|
|
1233
1233
|
|
|
1234
1234
|
`);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
|
|
@@ -1342,7 +1342,7 @@ public static class PrjctCredentialManager {
|
|
|
1342
1342
|
CredDelete(target, CRED_TYPE_GENERIC, 0);
|
|
1343
1343
|
}
|
|
1344
1344
|
}
|
|
1345
|
-
`;a(Mu,"powershellArgs");a(ju,"windowsCommand");a(vy,"readWindowsCredentialManager");a(KN,"writeWindowsCredentialManager");a(YN,"clearWindowsCredentialManager");a(zN,"platformGet");a(QN,"hasSecureCredentialStore");a(ZN,"platformSet");a(e0,"platformClear");a(t0,"platformLocation");a($u,"activeStore");a(ki,"getAuthToken");a(Fu,"setAuthToken");a(Hu,"clearAuthToken")});var qu={};A(qu,{default:()=>fe});import n0 from"node:crypto";import Uu from"node:fs/promises";import Wu from"node:os";import xy from"node:path";function Bu(){return n0.randomUUID()}function Gu(t){return{...t,apiKey:null}}var Cy,Ry,Xu,r0,fe,ss=f(()=>{"use strict";Fe();Y();_y();Cy="https://cli-api.prjct.app",Ry={apiKey:null,apiUrl:Cy,userId:null,email:null,lastAuth:null};a(Bu,"freshDeviceId");a(Gu,"metadataOnly");Xu=class{static{a(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=W.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig={...this.cachedConfig,apiKey:await ki()},this.cachedConfig;let e=await De(this.configPath),n=await ki(),r={...e??Ry,apiKey:n},s=!1;if(!n&&e?.apiKey&&(await Fu(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=Bu(),s=!0),r.hostname||(r.hostname=Wu.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await ye(this.configPath,Gu(this.cachedConfig)),await Uu.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Bu()}async getHostname(){return(await this.read()).hostname??Wu.hostname()}async write(e){let n=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await Fu(e.apiKey):await Hu());let r={...n,...e,apiKey:await ki(),lastAuth:new Date().toISOString()};await Gt(xy.dirname(this.configPath)),await ye(this.configPath,Gu(r)),await Uu.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await ki()}async getApiUrl(){return(await this.read()).apiUrl||Cy}async saveAuth(e,n,r){await this.write({apiKey:e,userId:n,email:r})}async clearAuth(){await Hu();let e=this.cachedConfig??await De(this.configPath);this.cachedConfig={...Ry,deviceId:e?.deviceId??Bu(),hostname:e?.hostname??Wu.hostname()},await Gt(xy.dirname(this.configPath)),await ye(this.configPath,Gu(this.cachedConfig)),await Uu.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},r0=new Xu,fe=r0});import{createHash as s0,randomBytes as Ay}from"node:crypto";function Vu(t){return t.toString("base64url")}function Dy(){let t=Vu(Ay(Iy)),e=Vu(Ay(Iy)),n=Vu(s0("sha256").update(t,"ascii").digest());return{state:e,codeVerifier:t,codeChallenge:n,codeChallengeMethod:"S256"}}function Py(t){return new URLSearchParams({flow:Ny,port:String(t.port),device_id:t.deviceId,hostname:t.hostname,state:t.state,code_challenge:t.codeChallenge,code_challenge_method:"S256"})}function Ly(t,e){if(t.get("key"))return{ok:!1,reason:"legacy-bearer",message:"This CLI requires PKCE login. Update the web app or set flow=pkce-v1; bearer tokens in the callback URL are no longer accepted."};let r=t.get("code"),s=t.get("state");return!r||!s?{ok:!1,reason:"missing",message:"Missing authorization code or state in callback"}:s!==e?{ok:!1,reason:"mismatch",message:"Login state mismatch \u2014 try `prjct login` again"}:{ok:!0,code:r,state:s}}function Oy(t){return{flow:Ny,code:t.code,state:t.state,code_verifier:t.codeVerifier,device_id:t.deviceId,redirect_uri:`http://127.0.0.1:${t.port}/callback`}}function My(t){if(!t||typeof t!="object")return null;let e=t,n=e.apiKey??e.api_key,r=e.userId??e.user_id,s=e.email,i=e.deviceId??e.device_id;return!n||!r||!s||!i?null:{apiKey:n,userId:r,email:s,deviceId:i}}var Ny,Iy,jy=f(()=>{"use strict";Ny="pkce-v1",Iy=32;a(Vu,"base64Url");a(Dy,"generatePkceMaterial");a(Py,"buildCliLoginSearchParams");a(Ly,"parsePkceCallback");a(Oy,"buildExchangeBody");a(My,"parseMintedKeyResponse")});function ua(t){let e=`PRJCT_TIMEOUT_${t}`,n=process.env[e];if(n){let r=Number.parseInt(n,10);if(!Number.isNaN(r)&&r>0)return r}return i0[t]}var i0,Lt,Ju=f(()=>{"use strict";i0={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};a(ua,"getTimeout");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}});function ur(t){if(t)return o0[t]}function Fy(t,e){let n=a0[t];return n?{...$y,...e??{}}[n]!==!1:!0}var o0,a0,$y,G2,Ku=f(()=>{"use strict";o0={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};a(ur,"toCloudTable");a0={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},$y={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};a(Fy,"isTableIncluded");G2=Object.keys($y)});function c0(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function l0(t){let e={};for(let[n,r]of Object.entries(t))e[c0(n)]=r;return e}function u0(t,e){let[n,r]=e.type.split("."),s=ur(e.entityType)??ur(n);if(!s)return null;let o=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=l0(c),u=e.entityId||l.id||c.id||"",d={event_type:o,entity_type:s,entity_id:u,data:{...l,project_id:t},project_id:t};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function Hy(t,e){return e.map(n=>u0(t,n)).filter(n=>n!==null)}var Uy=f(()=>{"use strict";Ku();a(c0,"camelToSnake");a(l0,"snakeCaseKeys");a(u0,"mapCliEventToWebFormat");a(Hy,"mapCliEventsToWebFormat")});var Wy={};A(Wy,{default:()=>d0,syncClient:()=>Dn});var Yu,Dn,d0,da=f(()=>{"use strict";Ju();ss();Uy();Yu=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=Hy(e,n),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,events:o})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof n=="number"&&n>0&&(c.sinceEventId=n);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:n,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${n}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async linkProject(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify({projectId:e,...n?{name:n}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async setCloudLifecycle(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${n}`,{method:"POST",headers:{...this.authHeaders(s,i)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return{ok:!1};let o=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify(n)});if(!o.ok)return{ok:!1};let c=await o.json();return{ok:c.ok!==!1,nodes:c.nodes,links:c.links}}catch{return{ok:!1}}}async publishBenchmark(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,...n})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async testConnection(){let e=new AbortController,n=setTimeout(()=>e.abort(),ua("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return clearTimeout(n),!1;let o=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,i)},signal:e.signal});return clearTimeout(n),o.status===401||o.status===403?(await fe.clearAuth(),!1):o.ok}catch{return clearTimeout(n),!1}}async hasAuth(){return await fe.hasAuth()}async getAuthHeaders(){let[e,n,r]=await Promise.all([fe.getApiUrl(),fe.getApiKey(),fe.getDeviceId()]);return{apiUrl:e,apiKey:n,deviceId:r}}authHeaders(e,n){return{"X-Api-Key":e,"X-Device-Id":n}}async fetchWithRetry(e,n,r=0){let s=new AbortController,i=setTimeout(()=>s.abort(),ua("API_REQUEST")),o=(n.method??"GET").toUpperCase(),c=o==="GET"||o==="HEAD";try{let l=await fetch(e,{...n,signal:s.signal});if(clearTimeout(i),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}return l}catch(l){if(clearTimeout(i),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${ua("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let n=await e.json(),r=n.detail||n.message||n.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await fe.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await fe.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,n,r){return{code:e,message:n,status:r}}sleep(e){return new Promise(n=>setTimeout(n,e))}},Dn=new Yu,d0=Dn});var zu,dr,By=f(()=>{"use strict";K();O();zu=class{static{a(this,"SyncPendingStorage")}append(e,n){let r=v(),s=JSON.stringify(n);return n.entityType&&n.entityId&&n.contentHash&&y.run(e,`DELETE FROM sync_pending
|
|
1345
|
+
`;a(Mu,"powershellArgs");a(ju,"windowsCommand");a(vy,"readWindowsCredentialManager");a(KN,"writeWindowsCredentialManager");a(YN,"clearWindowsCredentialManager");a(zN,"platformGet");a(QN,"hasSecureCredentialStore");a(ZN,"platformSet");a(e0,"platformClear");a(t0,"platformLocation");a($u,"activeStore");a(ki,"getAuthToken");a(Fu,"setAuthToken");a(Hu,"clearAuthToken")});var qu={};A(qu,{default:()=>fe});import n0 from"node:crypto";import Uu from"node:fs/promises";import Wu from"node:os";import xy from"node:path";function Bu(){return n0.randomUUID()}function Gu(t){return{...t,apiKey:null}}var Cy,Ry,Xu,r0,fe,ss=f(()=>{"use strict";Fe();Y();_y();Cy="https://cli-api.prjct.app",Ry={apiKey:null,apiUrl:Cy,userId:null,email:null,lastAuth:null};a(Bu,"freshDeviceId");a(Gu,"metadataOnly");Xu=class{static{a(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=W.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig={...this.cachedConfig,apiKey:await ki()},this.cachedConfig;let e=await De(this.configPath),n=await ki(),r={...e??Ry,apiKey:n},s=!1;if(!n&&e?.apiKey&&(await Fu(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=Bu(),s=!0),r.hostname||(r.hostname=Wu.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await ye(this.configPath,Gu(this.cachedConfig)),await Uu.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??Bu()}async getHostname(){return(await this.read()).hostname??Wu.hostname()}async write(e){let n=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await Fu(e.apiKey):await Hu());let r={...n,...e,apiKey:await ki(),lastAuth:new Date().toISOString()};await Gt(xy.dirname(this.configPath)),await ye(this.configPath,Gu(r)),await Uu.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await ki()}async getApiUrl(){return(await this.read()).apiUrl||Cy}async saveAuth(e,n,r){await this.write({apiKey:e,userId:n,email:r})}async clearAuth(){await Hu();let e=this.cachedConfig??await De(this.configPath);this.cachedConfig={...Ry,deviceId:e?.deviceId??Bu(),hostname:e?.hostname??Wu.hostname()},await Gt(xy.dirname(this.configPath)),await ye(this.configPath,Gu(this.cachedConfig)),await Uu.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},r0=new Xu,fe=r0});import{createHash as s0,randomBytes as Ay}from"node:crypto";function Vu(t){return t.toString("base64url")}function Dy(){let t=Vu(Ay(Iy)),e=Vu(Ay(Iy)),n=Vu(s0("sha256").update(t,"ascii").digest());return{state:e,codeVerifier:t,codeChallenge:n,codeChallengeMethod:"S256"}}function Py(t){return new URLSearchParams({flow:Ny,port:String(t.port),device_id:t.deviceId,hostname:t.hostname,state:t.state,code_challenge:t.codeChallenge,code_challenge_method:"S256"})}function Ly(t,e){if(t.get("key"))return{ok:!1,reason:"legacy-bearer",message:"This CLI requires PKCE login. Update the web app or set flow=pkce-v1; bearer tokens in the callback URL are no longer accepted."};let r=t.get("code"),s=t.get("state");return!r||!s?{ok:!1,reason:"missing",message:"Missing authorization code or state in callback"}:s!==e?{ok:!1,reason:"mismatch",message:"Login state mismatch \u2014 try `prjct login` again"}:{ok:!0,code:r,state:s}}function Oy(t){return{flow:Ny,code:t.code,state:t.state,code_verifier:t.codeVerifier,device_id:t.deviceId,redirect_uri:`http://127.0.0.1:${t.port}/callback`}}function My(t){if(!t||typeof t!="object")return null;let e=t,n=e.apiKey??e.api_key,r=e.userId??e.user_id,s=e.email,i=e.deviceId??e.device_id;return!n||!r||!s||!i?null:{apiKey:n,userId:r,email:s,deviceId:i}}var Ny,Iy,jy=f(()=>{"use strict";Ny="pkce-v1",Iy=32;a(Vu,"base64Url");a(Dy,"generatePkceMaterial");a(Py,"buildCliLoginSearchParams");a(Ly,"parsePkceCallback");a(Oy,"buildExchangeBody");a(My,"parseMintedKeyResponse")});function ua(t){let e=`PRJCT_TIMEOUT_${t}`,n=process.env[e];if(n){let r=Number.parseInt(n,10);if(!Number.isNaN(r)&&r>0)return r}return i0[t]}var i0,Lt,Ju=f(()=>{"use strict";i0={TOOL_CHECK:5e3,GIT_OPERATION:1e4,GIT_CLONE:6e4,API_REQUEST:3e4,NPM_INSTALL:12e4,WORKFLOW_HOOK:6e4};a(ua,"getTimeout");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}});function ur(t){if(t)return o0[t]}function Fy(t,e){let n=a0[t];return n?{...$y,...e??{}}[n]!==!1:!0}var o0,a0,$y,G2,Ku=f(()=>{"use strict";o0={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};a(ur,"toCloudTable");a0={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},$y={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};a(Fy,"isTableIncluded");G2=Object.keys($y)});function c0(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function l0(t){let e={};for(let[n,r]of Object.entries(t))e[c0(n)]=r;return e}function u0(t,e){let[n,r]=e.type.split("."),s=ur(e.entityType)??ur(n);if(!s)return null;let o=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=l0(c),u=e.entityId||(typeof l.id=="string"?l.id:"")||(typeof c.id=="string"?c.id:"")||(typeof l.task_id=="string"?l.task_id:"")||(typeof c.taskId=="string"?c.taskId:"")||(typeof l.entity_id=="string"?l.entity_id:"")||"";u&&l.id==null&&(l.id=u);let d={event_type:o,entity_type:s,entity_id:u,data:{...l,project_id:t},project_id:t};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function Hy(t,e){return e.map(n=>u0(t,n)).filter(n=>n!==null)}var Uy=f(()=>{"use strict";Ku();a(c0,"camelToSnake");a(l0,"snakeCaseKeys");a(u0,"mapCliEventToWebFormat");a(Hy,"mapCliEventsToWebFormat")});var Wy={};A(Wy,{default:()=>d0,syncClient:()=>Dn});var Yu,Dn,d0,da=f(()=>{"use strict";Ju();ss();Uy();Yu=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=Hy(e,n),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,events:o})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof n=="number"&&n>0&&(c.sinceEventId=n);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:n,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${n}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async linkProject(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify({projectId:e,...n?{name:n}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async setCloudLifecycle(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${n}`,{method:"POST",headers:{...this.authHeaders(s,i)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return{ok:!1};let o=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify(n)});if(!o.ok)return{ok:!1};let c=await o.json();return{ok:c.ok!==!1,nodes:c.nodes,links:c.links}}catch{return{ok:!1}}}async publishBenchmark(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,...n})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async testConnection(){let e=new AbortController,n=setTimeout(()=>e.abort(),ua("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return clearTimeout(n),!1;let o=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,i)},signal:e.signal});return clearTimeout(n),o.status===401||o.status===403?(await fe.clearAuth(),!1):o.ok}catch{return clearTimeout(n),!1}}async hasAuth(){return await fe.hasAuth()}async getAuthHeaders(){let[e,n,r]=await Promise.all([fe.getApiUrl(),fe.getApiKey(),fe.getDeviceId()]);return{apiUrl:e,apiKey:n,deviceId:r}}authHeaders(e,n){return{"X-Api-Key":e,"X-Device-Id":n}}async fetchWithRetry(e,n,r=0){let s=new AbortController,i=setTimeout(()=>s.abort(),ua("API_REQUEST")),o=(n.method??"GET").toUpperCase(),c=o==="GET"||o==="HEAD";try{let l=await fetch(e,{...n,signal:s.signal});if(clearTimeout(i),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}return l}catch(l){if(clearTimeout(i),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${ua("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let n=await e.json(),r=n.detail||n.message||n.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await fe.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await fe.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,n,r){return{code:e,message:n,status:r}}sleep(e){return new Promise(n=>setTimeout(n,e))}},Dn=new Yu,d0=Dn});var zu,dr,By=f(()=>{"use strict";K();O();zu=class{static{a(this,"SyncPendingStorage")}append(e,n){let r=v(),s=JSON.stringify(n);return n.entityType&&n.entityId&&n.contentHash&&y.run(e,`DELETE FROM sync_pending
|
|
1346
1346
|
WHERE project_id = ?
|
|
1347
1347
|
AND entity_type = ?
|
|
1348
1348
|
AND entity_id = ?
|
package/dist/daemon/entry.mjs
CHANGED
|
@@ -1253,7 +1253,7 @@ CREATE TABLE velocity_sprints (
|
|
|
1253
1253
|
LIMIT ?`,s,t.kind,r).map(qa):b.query(n,`SELECT * FROM code_symbols
|
|
1254
1254
|
WHERE name LIKE ? COLLATE NOCASE OR qname LIKE ? COLLATE NOCASE
|
|
1255
1255
|
ORDER BY exported DESC, name
|
|
1256
|
-
LIMIT ?`,s,s,r).map(qa)}catch{return[]}}function Ug(n,e,t=20){let r=e.split(/[^A-Za-z0-9_]+/).flatMap(o=>o.replace(/([a-z])([A-Z])/g,"$1 $2").split(/\s+/)).map(o=>o.trim()).filter(o=>o.length>2);if(r.length===0||!Le(n))return[];let s=new Map;for(let o of r){let i=xn(n,o,{limit:40});for(let a of i){let l=a.name.toLowerCase()===o.toLowerCase()?1:.55,u=a.exported?1.15:1,d=a.kind==="function"||a.kind==="class"||a.kind==="route"?1.1:1,p=l*u*d,m=s.get(a.file)??{score:0,names:new Set};m.score+=p,m.names.add(a.name),s.set(a.file,m)}}return Array.from(s.entries()).map(([o,i])=>({path:o,score:i.score,matchedNames:[...i.names]})).sort((o,i)=>i.score-o.score).slice(0,t)}function Gs(n,e){try{return b.query(n,"SELECT * FROM code_symbols WHERE file = ? ORDER BY start_line",e).map(qa)}catch{return[]}}function Wg(n,e="CALLS"){let t=new Map,r=new Map;try{let s=b.query(n,"SELECT src, dst FROM code_symbol_edges WHERE edge_type = ?",e);for(let o of s)t.has(o.src)||t.set(o.src,[]),t.get(o.src).push(o.dst),r.has(o.dst)||r.set(o.dst,[]),r.get(o.dst).push(o.src)}catch{}return{forward:t,reverse:r}}function Mx(n,e){try{let t=b.get(n,"SELECT * FROM code_symbols WHERE id = ?",e);return t?qa(t):null}catch{return null}}function Xa(n,e,t={}){let r=t.direction??"both",s=Math.min(Math.max(t.depth??3,1),5),o=xn(n,e,{limit:10}).filter(f=>f.name.toLowerCase()===e.toLowerCase()),i=o.length>0?o:xn(n,e,{limit:5});if(i.length===0)return null;let{forward:a,reverse:l}=Wg(n,"CALLS"),u=[],d=[],p=c((f,g,k,w)=>{let S=new Set(f),C=f.map(T=>({id:T,depth:0}));for(let T=0;T<C.length;T++){let{id:$,depth:v}=C[T];if(!(v>=w))for(let I of g.get($)??[]){if(S.has(I))continue;if(S.add(I),I.startsWith("file:")){let ee=I.slice(5),Ne=Gs(n,ee),se=Ne.find(Q=>Q.exported&&(Q.kind==="function"||Q.kind==="class"))??Ne.find(Q=>Q.kind==="function"||Q.kind==="class")??Ne[0];se&&!S.has(se.id)&&(S.add(se.id),k.push({symbol:se,depth:v+1,via:"CALLS"}),C.push({id:se.id,depth:v+1})),C.push({id:I,depth:v+1});continue}let U=Mx(n,I);U&&(k.push({symbol:U,depth:v+1,via:"CALLS"}),C.push({id:I,depth:v+1}))}}},"bfs"),m=i.map(f=>f.id);return(r==="inbound"||r==="both")&&p(m,l,u,s),(r==="outbound"||r==="both")&&p(m,a,d,s),{root:i,inbound:u,outbound:d}}function Ja(n,e){let t=Gs(n,e);if(t.length===0)return 0;let{reverse:r}=Wg(n,"CALLS"),s=new Set;for(let o of t)for(let i of r.get(o.id)??[])s.add(i);return s.size}function Bg(n,e,t=2){let r=new Set(e),{reverse:s}=Wg(n,"CALLS"),o=new Set;for(let u of e)for(let d of Gs(n,u))o.add(d.id);let i=new Set,a=new Set(o),l=[...o];for(let u=0;u<t;u++){let d=[];for(let p of l)for(let m of s.get(p)??[])if(!a.has(m))if(a.add(m),d.push(m),m.startsWith("file:")){let f=m.slice(5);r.has(f)||i.add(f)}else{let f=Mx(n,m);f&&!r.has(f.file)&&i.add(f.file)}l=d}return[...i]}var Fg,m1,f1,g1,dn=y(()=>{"use strict";wu();F();de();Fg="symbol-graph",m1=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java"]),f1=new Set(["if","for","while","switch","catch","function","class","return","typeof","new","throw","await","void","super","this","import","require","console","Math","JSON","Object","Array","Promise","Map","Set","Date","Error","Buffer","process","describe","it","test","expect","beforeEach","afterEach","beforeAll","afterAll"]),g1=new Set(["if","for","while","switch","catch","return","await","typeof","new","throw","else","case","from","import","export","class","function","const","let","var","get","set","constructor","async","static","public","private","protected","readonly","abstract","extends","implements","interface","type","enum","default","as","of","in","do","try","finally","yield","with"]);c(Vt,"lineOf");c(h1,"symbolId");c(Ax,"qnameOf");c(Du,"isSourceFile");c(ai,"stripNoise");c(Ix,"emptyExtract");c(Px,"finalizeCalls");c(y1,"extractTsJs");c(k1,"extractPython");c(w1,"extractGo");c(b1,"extractRust");c(E1,"extractJava");c(jx,"extractFile");c(S1,"loadTsPathMap");c(v1,"applyTsPath");c(T1,"resolveSpecifierToFile");c(x1,"resolveImportsForExtract");c(_x,"matchFileToMod");c(Nx,"enclosingSymbol");c($x,"resolveCallTargets");c(Ox,"buildFromExtracts");c(Dx,"extractProject");c(C1,"persistGraph");c(R1,"patchGraph");c(Bs,"indexSymbols");c(Hg,"updateSymbols");c(Le,"hasSymbolIndex");c(Wt,"loadMeta");c(qa,"rowToSymbol");c(Cn,"listAllSymbols");c(xn,"searchSymbols");c(Ug,"scoreFilesFromQuery");c(Gs,"symbolsInFile");c(Wg,"loadEdges");c(Mx,"symbolById");c(Xa,"tracePath");c(Ja,"fileFanIn");c(Bg,"filesCallingInto")});function Mu(n){if(n.length===0)return[];let e=n[0]?.score||1;return n.map(t=>({path:t.path,score:t.score/e}))}var Va,Lx=y(()=>{"use strict";si();oi();_r();dn();c(Mu,"normalize");Va=[{name:"bm25",kind:"query",defaultWeight:.45,hasIndex:c(n=>bx(n),"hasIndex"),scoreFromQuery:c((n,e,t)=>Mu(ju(n,e,t)),"scoreFromQuery")},{name:"symbols",kind:"query",defaultWeight:.2,hasIndex:c(n=>Le(n),"hasIndex"),scoreFromQuery:c((n,e,t)=>Mu(Ug(n,e,t)),"scoreFromQuery")},{name:"imports",kind:"seed",defaultWeight:.2,hasIndex:c(n=>Tt(n)!==null,"hasIndex"),scoreFromSeeds:c((n,e,t)=>{let r=Tt(n);return r?Mu(ii(e,r,t.importDepth)):[]},"scoreFromSeeds")},{name:"cochange",kind:"seed",defaultWeight:.15,hasIndex:c(n=>Tn(n)!==null,"hasIndex"),scoreFromSeeds:c((n,e)=>{let t=Tn(n);return t?Mu(Hs(e,t)):[]},"scoreFromSeeds")}]});function Hx(n,e,t={}){let r={..._1,...t},s={bm25:r.bm25Weight,symbols:r.symbolsWeight,imports:r.importWeight,cochange:r.cochangeWeight},o=Va.filter(m=>m.kind==="query"),i=Va.filter(m=>m.kind==="seed"),a=new Map,l=new Map;for(let m of o){let f=m.scoreFromQuery(n,e,r.topN*3);if(f.length!==0){a.set(m.name,new Map(f.map(g=>[g.path,g.score])));for(let g of f.slice(0,Fx))l.set(g.path,Math.max(l.get(g.path)??0,g.score))}}if(a.size===0)return[];let u=[...l.entries()].sort((m,f)=>f[1]-m[1]).slice(0,Fx).map(([m])=>m);for(let m of i){let f=m.scoreFromSeeds(n,u,{importDepth:r.importDepth});f.length!==0&&a.set(m.name,new Map(f.map(g=>[g.path,g.score])))}let d=new Set;for(let m of a.values())for(let f of m.keys())d.add(f);let p=[];for(let m of d){let f=0;for(let[g,k]of a){let w=k.get(m)??0,S=s[g]??Va.find(C=>C.name===g)?.defaultWeight??0;f+=w*S}p.push({path:m,finalScore:f,signals:{bm25:a.get("bm25")?.get(m)??0,imports:a.get("imports")?.get(m)??0,cochange:a.get("cochange")?.get(m)??0,symbols:a.get("symbols")?.get(m)??0}})}return p.sort((m,f)=>f.finalScore-m.finalScore),p.slice(0,r.topN)}function Ux(n){let e={};for(let t of Va)e[t.name]=t.hasIndex(n);return{bm25:e.bm25??!1,imports:e.imports??!1,cochange:e.cochange??!1,symbols:e.symbols??!1}}var _1,Fx,Wx=y(()=>{"use strict";Lx();_1={bm25Weight:.45,importWeight:.2,cochangeWeight:.15,symbolsWeight:.2,topN:15,importDepth:2},Fx=10;c(Hx,"rankFiles");c(Ux,"hasIndexes")});function A1(n){return n instanceof ci}function lt(n){return A1(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var ci,Lu,Fu,Ka,Ar=y(()=>{"use strict";ci=class extends Error{static{c(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)}},Lu=class n extends ci{static{c(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Fu=class n extends ci{static{c(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new n(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new n(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Ka=class n extends ci{static{c(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};c(A1,"isPrjctError");c(lt,"getErrorMessage")});function Bx(n){let e=n.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function qg(n){let e=n.trim();if(!e)return{};let t=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(t)return{provider:Bx(t[1]),repoSlug:t[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:Bx(r.host),repoSlug:s}}catch{return{}}}async function I1(n){try{let{stdout:e}=await q("git",["remote","get-url","origin"],{cwd:n});return e.trim()||void 0}catch{return}}async function P1(n){try{let{stdout:e}=await q("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:n});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function qs(n){return typeof n=="string"&&n.length>0?n:void 0}function Gx(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function j1(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}async function Hu(n){let e=E.getDoc(n,"project")||{},t=qs(e.repoPath),{provider:r,repoSlug:s}=t?qg(await I1(t)||""):{},o=t?await P1(t):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(a=>typeof a=="string"):void 0;return j1({provider:r,repoSlug:s,currentBranch:qs(e.currentBranch),defaultBranch:o,stack:qs(e.stack),techStack:i&&i.length>0?i:void 0,version:qs(e.version),commitCount:Gx(e.commitCount),fileCount:Gx(e.fileCount),lastCommit:qs(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:qs(e.cliVersion),syncedAt:qs(e.lastSync)})}var Uu=y(()=>{"use strict";F();fe();c(Bx,"providerForHost");c(qg,"parseRemote");c(I1,"gitRemoteUrl");c(P1,"gitDefaultBranch");c(qs,"str");c(Gx,"num");c(j1,"compact");c(Hu,"buildProjectMeta")});import{execFile as N1}from"node:child_process";import $1 from"node:crypto";import{promisify as O1}from"node:util";function L1(n,e=M1){let t=Buffer.from(e.replace(/-/g,""),"hex"),s=$1.createHash("sha1").update(t).update(n,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let o=s.toString("hex");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20,32)}`}async function F1(n){let e;try{let{stdout:s}=await D1("git",["remote","get-url","origin"],{cwd:n});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:t,repoSlug:r}=qg(e);return!t||!r?null:`${t}:${r}`.toLowerCase()}async function qx(n){let e=await F1(n);return e?L1(e):null}var D1,M1,Xx=y(()=>{"use strict";Uu();D1=O1(N1),M1="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";c(L1,"uuidv5");c(F1,"repoKey");c(qx,"deriveProjectId")});var Kg={};R(Kg,{PACKAGE_ROOT:()=>Ir,VERSION:()=>ut,getPackageRoot:()=>Jg,getVersion:()=>Js,resetPackageRoot:()=>Vg});import Xg from"node:fs";import Wu from"node:path";function Jg(){if(li)return li;let n=__dirname;for(let e=0;e<5;e++){let t=Wu.join(n,"package.json");if(Xg.existsSync(t))try{if(JSON.parse(Xg.readFileSync(t,"utf-8")).name==="prjct-cli")return li=n,n}catch{}n=Wu.dirname(n)}return li=Wu.join(__dirname,"..","..",".."),li}function Js(){if(Xs)return Xs;let n="3.63.0";if(n&&/^\d+\.\d+\.\d+/.test(n))return Xs=n,Xs;try{let e=Wu.join(Jg(),"package.json");return Xs=JSON.parse(Xg.readFileSync(e,"utf-8")).version,Xs}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function Vg(n){li=n,Xs=null}var Xs,li,ut,Ir,Bt=y(()=>{"use strict";V();Xs=null,li=null;c(Jg,"getPackageRoot");c(Js,"getVersion");c(Vg,"resetPackageRoot");ut=Js(),Ir=Jg()});async function Bu(n){try{let{stdout:e}=await z(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function H1(){let n=await Bu("gh api user --jq .login");return n.success&&n.output||(n=await Bu("git config --global github.user"),n.success&&n.output)?n.output:null}async function U1(){let n=await Bu("git config user.name");return n.success&&n.output?n.output:null}async function W1(){let n=await Bu("git config user.email");return n.success&&n.output?n.output:null}async function ui(){let[n,e,t]=await Promise.all([H1(),U1(),W1()]);return{github:n,email:t,name:e||n||"Unknown"}}var Gu=y(()=>{"use strict";fe();c(Bu,"execCommand");c(H1,"detectGitHubUsername");c(U1,"detectGitName");c(W1,"detectGitEmail");c(ui,"detect")});var qu={};R(qu,{worktreeService:()=>B1});import Yg from"node:fs/promises";import sr from"node:path";var Jx,Qg,B1,Xu=y(()=>{"use strict";fe();de();Jx=".worktrees",Qg=class{static{c(this,"WorktreeService")}async create(e,t,r={}){let s=await this.getMainWorktree(e),o=sr.join(s,Jx,t),i=r.branch||`feat/${t}`;await Yg.mkdir(sr.join(s,Jx),{recursive:!0});let a=r.baseBranch?` ${r.baseBranch}`:"";await z(`git worktree add "${o}" -b "${i}"${a}`,{cwd:s});let{stdout:l}=await z("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let r=await this.getMainWorktree(e),s;if(t)try{let{stdout:o}=await z("git rev-parse --abbrev-ref HEAD",{cwd:e});s=o.trim()}catch{}if(await z(`git worktree remove "${e}" --force`,{cwd:r}),t&&s&&s!=="main"&&s!=="master")try{await z(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:r}=await z("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(r,t)}async detect(e){try{let{stdout:t}=await z("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await z("git rev-parse --git-dir",{cwd:e}),s=sr.resolve(e,t.trim()),o=sr.resolve(e,r.trim());if(s!==o){let{stdout:i}=await z("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await z("git rev-parse HEAD",{cwd:e}),{stdout:l}=await z("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=sr.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await z("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1256
|
+
LIMIT ?`,s,s,r).map(qa)}catch{return[]}}function Ug(n,e,t=20){let r=e.split(/[^A-Za-z0-9_]+/).flatMap(o=>o.replace(/([a-z])([A-Z])/g,"$1 $2").split(/\s+/)).map(o=>o.trim()).filter(o=>o.length>2);if(r.length===0||!Le(n))return[];let s=new Map;for(let o of r){let i=xn(n,o,{limit:40});for(let a of i){let l=a.name.toLowerCase()===o.toLowerCase()?1:.55,u=a.exported?1.15:1,d=a.kind==="function"||a.kind==="class"||a.kind==="route"?1.1:1,p=l*u*d,m=s.get(a.file)??{score:0,names:new Set};m.score+=p,m.names.add(a.name),s.set(a.file,m)}}return Array.from(s.entries()).map(([o,i])=>({path:o,score:i.score,matchedNames:[...i.names]})).sort((o,i)=>i.score-o.score).slice(0,t)}function Gs(n,e){try{return b.query(n,"SELECT * FROM code_symbols WHERE file = ? ORDER BY start_line",e).map(qa)}catch{return[]}}function Wg(n,e="CALLS"){let t=new Map,r=new Map;try{let s=b.query(n,"SELECT src, dst FROM code_symbol_edges WHERE edge_type = ?",e);for(let o of s)t.has(o.src)||t.set(o.src,[]),t.get(o.src).push(o.dst),r.has(o.dst)||r.set(o.dst,[]),r.get(o.dst).push(o.src)}catch{}return{forward:t,reverse:r}}function Mx(n,e){try{let t=b.get(n,"SELECT * FROM code_symbols WHERE id = ?",e);return t?qa(t):null}catch{return null}}function Xa(n,e,t={}){let r=t.direction??"both",s=Math.min(Math.max(t.depth??3,1),5),o=xn(n,e,{limit:10}).filter(f=>f.name.toLowerCase()===e.toLowerCase()),i=o.length>0?o:xn(n,e,{limit:5});if(i.length===0)return null;let{forward:a,reverse:l}=Wg(n,"CALLS"),u=[],d=[],p=c((f,g,k,w)=>{let S=new Set(f),C=f.map(T=>({id:T,depth:0}));for(let T=0;T<C.length;T++){let{id:$,depth:v}=C[T];if(!(v>=w))for(let I of g.get($)??[]){if(S.has(I))continue;if(S.add(I),I.startsWith("file:")){let ee=I.slice(5),Ne=Gs(n,ee),se=Ne.find(Q=>Q.exported&&(Q.kind==="function"||Q.kind==="class"))??Ne.find(Q=>Q.kind==="function"||Q.kind==="class")??Ne[0];se&&!S.has(se.id)&&(S.add(se.id),k.push({symbol:se,depth:v+1,via:"CALLS"}),C.push({id:se.id,depth:v+1})),C.push({id:I,depth:v+1});continue}let U=Mx(n,I);U&&(k.push({symbol:U,depth:v+1,via:"CALLS"}),C.push({id:I,depth:v+1}))}}},"bfs"),m=i.map(f=>f.id);return(r==="inbound"||r==="both")&&p(m,l,u,s),(r==="outbound"||r==="both")&&p(m,a,d,s),{root:i,inbound:u,outbound:d}}function Ja(n,e){let t=Gs(n,e);if(t.length===0)return 0;let{reverse:r}=Wg(n,"CALLS"),s=new Set;for(let o of t)for(let i of r.get(o.id)??[])s.add(i);return s.size}function Bg(n,e,t=2){let r=new Set(e),{reverse:s}=Wg(n,"CALLS"),o=new Set;for(let u of e)for(let d of Gs(n,u))o.add(d.id);let i=new Set,a=new Set(o),l=[...o];for(let u=0;u<t;u++){let d=[];for(let p of l)for(let m of s.get(p)??[])if(!a.has(m))if(a.add(m),d.push(m),m.startsWith("file:")){let f=m.slice(5);r.has(f)||i.add(f)}else{let f=Mx(n,m);f&&!r.has(f.file)&&i.add(f.file)}l=d}return[...i]}var Fg,m1,f1,g1,dn=y(()=>{"use strict";wu();F();de();Fg="symbol-graph",m1=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".py",".go",".rs",".java"]),f1=new Set(["if","for","while","switch","catch","function","class","return","typeof","new","throw","await","void","super","this","import","require","console","Math","JSON","Object","Array","Promise","Map","Set","Date","Error","Buffer","process","describe","it","test","expect","beforeEach","afterEach","beforeAll","afterAll"]),g1=new Set(["if","for","while","switch","catch","return","await","typeof","new","throw","else","case","from","import","export","class","function","const","let","var","get","set","constructor","async","static","public","private","protected","readonly","abstract","extends","implements","interface","type","enum","default","as","of","in","do","try","finally","yield","with"]);c(Vt,"lineOf");c(h1,"symbolId");c(Ax,"qnameOf");c(Du,"isSourceFile");c(ai,"stripNoise");c(Ix,"emptyExtract");c(Px,"finalizeCalls");c(y1,"extractTsJs");c(k1,"extractPython");c(w1,"extractGo");c(b1,"extractRust");c(E1,"extractJava");c(jx,"extractFile");c(S1,"loadTsPathMap");c(v1,"applyTsPath");c(T1,"resolveSpecifierToFile");c(x1,"resolveImportsForExtract");c(_x,"matchFileToMod");c(Nx,"enclosingSymbol");c($x,"resolveCallTargets");c(Ox,"buildFromExtracts");c(Dx,"extractProject");c(C1,"persistGraph");c(R1,"patchGraph");c(Bs,"indexSymbols");c(Hg,"updateSymbols");c(Le,"hasSymbolIndex");c(Wt,"loadMeta");c(qa,"rowToSymbol");c(Cn,"listAllSymbols");c(xn,"searchSymbols");c(Ug,"scoreFilesFromQuery");c(Gs,"symbolsInFile");c(Wg,"loadEdges");c(Mx,"symbolById");c(Xa,"tracePath");c(Ja,"fileFanIn");c(Bg,"filesCallingInto")});function Mu(n){if(n.length===0)return[];let e=n[0]?.score||1;return n.map(t=>({path:t.path,score:t.score/e}))}var Va,Lx=y(()=>{"use strict";si();oi();_r();dn();c(Mu,"normalize");Va=[{name:"bm25",kind:"query",defaultWeight:.45,hasIndex:c(n=>bx(n),"hasIndex"),scoreFromQuery:c((n,e,t)=>Mu(ju(n,e,t)),"scoreFromQuery")},{name:"symbols",kind:"query",defaultWeight:.2,hasIndex:c(n=>Le(n),"hasIndex"),scoreFromQuery:c((n,e,t)=>Mu(Ug(n,e,t)),"scoreFromQuery")},{name:"imports",kind:"seed",defaultWeight:.2,hasIndex:c(n=>Tt(n)!==null,"hasIndex"),scoreFromSeeds:c((n,e,t)=>{let r=Tt(n);return r?Mu(ii(e,r,t.importDepth)):[]},"scoreFromSeeds")},{name:"cochange",kind:"seed",defaultWeight:.15,hasIndex:c(n=>Tn(n)!==null,"hasIndex"),scoreFromSeeds:c((n,e)=>{let t=Tn(n);return t?Mu(Hs(e,t)):[]},"scoreFromSeeds")}]});function Hx(n,e,t={}){let r={..._1,...t},s={bm25:r.bm25Weight,symbols:r.symbolsWeight,imports:r.importWeight,cochange:r.cochangeWeight},o=Va.filter(m=>m.kind==="query"),i=Va.filter(m=>m.kind==="seed"),a=new Map,l=new Map;for(let m of o){let f=m.scoreFromQuery(n,e,r.topN*3);if(f.length!==0){a.set(m.name,new Map(f.map(g=>[g.path,g.score])));for(let g of f.slice(0,Fx))l.set(g.path,Math.max(l.get(g.path)??0,g.score))}}if(a.size===0)return[];let u=[...l.entries()].sort((m,f)=>f[1]-m[1]).slice(0,Fx).map(([m])=>m);for(let m of i){let f=m.scoreFromSeeds(n,u,{importDepth:r.importDepth});f.length!==0&&a.set(m.name,new Map(f.map(g=>[g.path,g.score])))}let d=new Set;for(let m of a.values())for(let f of m.keys())d.add(f);let p=[];for(let m of d){let f=0;for(let[g,k]of a){let w=k.get(m)??0,S=s[g]??Va.find(C=>C.name===g)?.defaultWeight??0;f+=w*S}p.push({path:m,finalScore:f,signals:{bm25:a.get("bm25")?.get(m)??0,imports:a.get("imports")?.get(m)??0,cochange:a.get("cochange")?.get(m)??0,symbols:a.get("symbols")?.get(m)??0}})}return p.sort((m,f)=>f.finalScore-m.finalScore),p.slice(0,r.topN)}function Ux(n){let e={};for(let t of Va)e[t.name]=t.hasIndex(n);return{bm25:e.bm25??!1,imports:e.imports??!1,cochange:e.cochange??!1,symbols:e.symbols??!1}}var _1,Fx,Wx=y(()=>{"use strict";Lx();_1={bm25Weight:.45,importWeight:.2,cochangeWeight:.15,symbolsWeight:.2,topN:15,importDepth:2},Fx=10;c(Hx,"rankFiles");c(Ux,"hasIndexes")});function A1(n){return n instanceof ci}function lt(n){return A1(n)||n instanceof Error?n.message:typeof n=="string"?n:"Unknown error"}var ci,Lu,Fu,Ka,Ar=y(()=>{"use strict";ci=class extends Error{static{c(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)}},Lu=class n extends ci{static{c(this,"ProjectError")}constructor(e,t="PROJECT_ERROR"){super(e,t),this.name="ProjectError"}static notInitialized(){return new n("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new n(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new n(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Fu=class n extends ci{static{c(this,"TemplateError")}constructor(e,t="TEMPLATE_ERROR"){super(e,t),this.name="TemplateError"}static notFound(e){return new n(`Template not found: ${e}.md`,"TEMPLATE_NOT_FOUND")}static parseFailed(e){return new n(`Failed to parse template: ${e}`,"TEMPLATE_PARSE_ERROR")}},Ka=class n extends ci{static{c(this,"AgentError")}constructor(e,t="AGENT_ERROR"){super(e,t),this.name="AgentError"}static notSupported(e){return new n(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new n(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};c(A1,"isPrjctError");c(lt,"getErrorMessage")});function Bx(n){let e=n.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function qg(n){let e=n.trim();if(!e)return{};let t=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(t)return{provider:Bx(t[1]),repoSlug:t[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:Bx(r.host),repoSlug:s}}catch{return{}}}async function I1(n){try{let{stdout:e}=await q("git",["remote","get-url","origin"],{cwd:n});return e.trim()||void 0}catch{return}}async function P1(n){try{let{stdout:e}=await q("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:n});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function qs(n){return typeof n=="string"&&n.length>0?n:void 0}function Gx(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function j1(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}async function Hu(n){let e=E.getDoc(n,"project")||{},t=qs(e.repoPath),{provider:r,repoSlug:s}=t?qg(await I1(t)||""):{},o=t?await P1(t):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(a=>typeof a=="string"):void 0;return j1({provider:r,repoSlug:s,currentBranch:qs(e.currentBranch),defaultBranch:o,stack:qs(e.stack),techStack:i&&i.length>0?i:void 0,version:qs(e.version),commitCount:Gx(e.commitCount),fileCount:Gx(e.fileCount),lastCommit:qs(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:qs(e.cliVersion),syncedAt:qs(e.lastSync)})}var Uu=y(()=>{"use strict";F();fe();c(Bx,"providerForHost");c(qg,"parseRemote");c(I1,"gitRemoteUrl");c(P1,"gitDefaultBranch");c(qs,"str");c(Gx,"num");c(j1,"compact");c(Hu,"buildProjectMeta")});import{execFile as N1}from"node:child_process";import $1 from"node:crypto";import{promisify as O1}from"node:util";function L1(n,e=M1){let t=Buffer.from(e.replace(/-/g,""),"hex"),s=$1.createHash("sha1").update(t).update(n,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let o=s.toString("hex");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20,32)}`}async function F1(n){let e;try{let{stdout:s}=await D1("git",["remote","get-url","origin"],{cwd:n});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:t,repoSlug:r}=qg(e);return!t||!r?null:`${t}:${r}`.toLowerCase()}async function qx(n){let e=await F1(n);return e?L1(e):null}var D1,M1,Xx=y(()=>{"use strict";Uu();D1=O1(N1),M1="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";c(L1,"uuidv5");c(F1,"repoKey");c(qx,"deriveProjectId")});var Kg={};R(Kg,{PACKAGE_ROOT:()=>Ir,VERSION:()=>ut,getPackageRoot:()=>Jg,getVersion:()=>Js,resetPackageRoot:()=>Vg});import Xg from"node:fs";import Wu from"node:path";function Jg(){if(li)return li;let n=__dirname;for(let e=0;e<5;e++){let t=Wu.join(n,"package.json");if(Xg.existsSync(t))try{if(JSON.parse(Xg.readFileSync(t,"utf-8")).name==="prjct-cli")return li=n,n}catch{}n=Wu.dirname(n)}return li=Wu.join(__dirname,"..","..",".."),li}function Js(){if(Xs)return Xs;let n="3.63.1";if(n&&/^\d+\.\d+\.\d+/.test(n))return Xs=n,Xs;try{let e=Wu.join(Jg(),"package.json");return Xs=JSON.parse(Xg.readFileSync(e,"utf-8")).version,Xs}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function Vg(n){li=n,Xs=null}var Xs,li,ut,Ir,Bt=y(()=>{"use strict";V();Xs=null,li=null;c(Jg,"getPackageRoot");c(Js,"getVersion");c(Vg,"resetPackageRoot");ut=Js(),Ir=Jg()});async function Bu(n){try{let{stdout:e}=await z(n,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function H1(){let n=await Bu("gh api user --jq .login");return n.success&&n.output||(n=await Bu("git config --global github.user"),n.success&&n.output)?n.output:null}async function U1(){let n=await Bu("git config user.name");return n.success&&n.output?n.output:null}async function W1(){let n=await Bu("git config user.email");return n.success&&n.output?n.output:null}async function ui(){let[n,e,t]=await Promise.all([H1(),U1(),W1()]);return{github:n,email:t,name:e||n||"Unknown"}}var Gu=y(()=>{"use strict";fe();c(Bu,"execCommand");c(H1,"detectGitHubUsername");c(U1,"detectGitName");c(W1,"detectGitEmail");c(ui,"detect")});var qu={};R(qu,{worktreeService:()=>B1});import Yg from"node:fs/promises";import sr from"node:path";var Jx,Qg,B1,Xu=y(()=>{"use strict";fe();de();Jx=".worktrees",Qg=class{static{c(this,"WorktreeService")}async create(e,t,r={}){let s=await this.getMainWorktree(e),o=sr.join(s,Jx,t),i=r.branch||`feat/${t}`;await Yg.mkdir(sr.join(s,Jx),{recursive:!0});let a=r.baseBranch?` ${r.baseBranch}`:"";await z(`git worktree add "${o}" -b "${i}"${a}`,{cwd:s});let{stdout:l}=await z("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:t}}async remove(e,t=!1){let r=await this.getMainWorktree(e),s;if(t)try{let{stdout:o}=await z("git rev-parse --abbrev-ref HEAD",{cwd:e});s=o.trim()}catch{}if(await z(`git worktree remove "${e}" --force`,{cwd:r}),t&&s&&s!=="main"&&s!=="master")try{await z(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let t=await this.getMainWorktree(e),{stdout:r}=await z("git worktree list --porcelain",{cwd:t});return this.parsePorcelainOutput(r,t)}async detect(e){try{let{stdout:t}=await z("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await z("git rev-parse --git-dir",{cwd:e}),s=sr.resolve(e,t.trim()),o=sr.resolve(e,r.trim());if(s!==o){let{stdout:i}=await z("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:a}=await z("git rev-parse HEAD",{cwd:e}),{stdout:l}=await z("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=sr.basename(u);return{path:u,branch:i.trim(),commit:a.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await z("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1257
1257
|
`)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:t}=await z("git rev-parse --show-toplevel",{cwd:e});return t.trim()}async setup(e,t){let r=sr.join(t,".env");await L(r)&&await Yg.copyFile(r,sr.join(e,".env"));let s=sr.join(t,".prjct"),o=sr.join(e,".prjct");await L(s)&&!await L(o)&&await Yg.symlink(s,o,"dir")}async teardown(e){}async clean(e){let t=await this.list(e),r=[],s=await this.getMainWorktree(e);await z("git worktree prune",{cwd:s});for(let o of t)o.isMain||await L(o.path)||r.push(o.slug);return r}parsePorcelainOutput(e,t){let r=[],s=e.trim().split(`
|
|
1258
1258
|
|
|
1259
1259
|
`);for(let o of s){if(!o.trim())continue;let i=o.trim().split(`
|
|
@@ -1642,7 +1642,7 @@ ${s}`:s,changed:!0}}async function hp(n=mr()){let e="";try{e=await bo.readFile(n
|
|
|
1642
1642
|
\u{1F50C} Configuring MCP servers...`);try{await Fi.install();let e=n.verifyContext7===!1?null:await Fi.verify();n.silent||(e?.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e?.message||""}`),console.log(" It will activate on the next time you open your AI client.")))}catch(e){n.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of X2)try{let t=Di(),r=await zA(e.name,t),s=await $c(e.name,Nn[e.name],t);r&&!s.changed?n.silent||console.log(e.ready):n.silent||console.log(e.added)}catch(t){n.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${x(t)}`),console.log(e.manual))}try{if((await as()).installed){let t=await hp(),r=await yp();n.silent||(t.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):t.changed||r.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){n.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}try{if((await Ig()).installed){let t=await bp();n.silent||console.log(t.changed?"\u2705 prjct Kimi config updated in ~/.kimi/mcp.json":"\u2705 prjct Kimi config already ready")}}catch(e){n.silent||(console.log(`\u26A0\uFE0F Kimi config setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}}var X2,xk=y(()=>{"use strict";Ht();wp();V();Li();Tk();Mi();X2=[{name:"prjct",ready:"\u2705 prjct MCP already configured",added:"\u2705 prjct MCP added to mcp.json",failed:"prjct MCP setup failed",manual:" Run `prjct start` again to retry."}];c(Ep,"setupMcpServers")});var kI={};R(kI,{CODEX_SKILL_MAX_BYTES:()=>Ck,buildCodexSkillContent:()=>Rk,installCodexSkill:()=>yI,verifyCodexPRouterReady:()=>_k});import Oc from"node:fs/promises";import J2 from"node:os";import mI from"node:path";function gI(){return mI.join(J2.homedir(),".codex","skills","prjct","SKILL.md")}function V2(n){return`<!-- ${fI}: ${JSON.stringify({v:ut,h:n})} -->`}function pI(n){let e=n.match(new RegExp(`<!--\\s*${fI}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{let t=JSON.parse(e[1]);return{version:t.v??t.version,templateHash:t.h??t.templateHash}}catch{return null}}function K2(n){return Tc(n).slice(0,12)}async function hI(){return kn("codex/SKILL.md")}function Rk(n){let e=n.trimEnd(),t=K2(e),r=V2(t);return{content:`${e}
|
|
1643
1643
|
|
|
1644
1644
|
${r}
|
|
1645
|
-
`,templateHash:t}}async function yI(){try{let n=gI(),e=mI.dirname(n);await Oc.mkdir(e,{recursive:!0});let t=await L(n),r=await hI();if(!r)return ie.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=Rk(r),o=Buffer.byteLength(s.content,"utf-8");return o>Ck&&ie.warn(`Codex SKILL.md is ${o} bytes \u2014 over Codex's ~${Ck}-byte hard limit; the skill may be rejected. Trim editor-surfaces.ts.`),t&&await Oc.readFile(n,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await Oc.writeFile(n,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(n){return ie.warn(`Codex skill warning: ${x(n)}`),{success:!1,action:null}}}async function _k(n={}){let e=gI();if(!(await as()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let r=await hI();if(!r)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=Rk(r),o=c(async()=>n.autoRepair?(await yI()).success:!1,"maybeRepair"),i="";if(!await L(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await Oc.readFile(e,"utf-8").catch(()=>"");let a=pI(i);if(!(a?.version===ut&&a?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await Oc.readFile(e,"utf-8").catch(()=>""),a=pI(i),!(a?.version===ut&&a?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,message:"Codex p. router ready"}}var fI,Ck,Ak=y(()=>{"use strict";Lr();V();de();xi();jn();Bt();Ht();fI="prjct-codex-router",Ck=1024;c(gI,"getCodexSkillPath");c(V2,"getCodexSkillMetadata");c(pI,"parseCodexSkillMetadata");c(K2,"hashContent");c(hI,"loadCodexSkillTemplate");c(Rk,"buildCodexSkillContent");c(yI,"installCodexSkill");c(_k,"verifyCodexPRouterReady")});var SI={};R(SI,{CLOUD_GRAPH_MAX_LINKS:()=>EI,CLOUD_GRAPH_MAX_NODES:()=>bI,buildCloudCodeGraphSnapshot:()=>Z2,isUploadableGraph:()=>eX});function Y2(n){return z2[n.toLowerCase()]??"Symbol"}function Q2(n){try{return b.query(n,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(e=>({src:e.src,dst:e.dst,edgeType:e.edge_type,confidence:e.confidence}))}catch{return[]}}function Z2(n,e={}){if(!Le(n))return null;let t=e.maxNodes??bI,r=e.maxLinks??EI,s=Cn(n);if(s.length===0)return null;let o=Q2(n),i=Wt(n),a=new Map;for(let v of o){let I=wI[v.edgeType]??1;a.set(v.src,(a.get(v.src)??0)+I),a.set(v.dst,(a.get(v.dst)??0)+I)}let l=c(v=>{switch(v){case"class":return 8;case"function":case"method":return 6;case"interface":case"type":return 4;case"route":return 5;default:return 2}},"kindWeight"),d=s.map(v=>{let I=a.get(v.id)??0,U=v.exported?4:0;return{s:v,score:I+U+l(v.kind)}}).sort((v,I)=>I.score-v.score||v.s.name.localeCompare(I.s.name)).slice(0,t).map(v=>v.s),p=new Set(d.map(v=>v.id)),m=new Map;for(let v of d)m.set(v.file,(m.get(v.file)??0)+1);let f=[...m.entries()].sort((v,I)=>I[1]-v[1]).slice(0,Math.min(80,Math.floor(t/5))).map(([v])=>v),g=c(v=>`file:${v}`,"fileNodeId"),k=[];for(let v of f){let I=v.split("/").pop()||v;k.push({id:g(v),name:I,kind:"File",file:v,exported:!1}),p.add(g(v))}for(let v of d)k.push({id:v.id,name:v.name,kind:Y2(v.kind),file:v.file,exported:v.exported});let w=[],S=new Set(f);for(let v of d)S.has(v.file)&&w.push({source:g(v.file),target:v.id,type:"DEFINES"});let C=o.filter(v=>p.has(v.src)&&p.has(v.dst)&&v.src!==v.dst).map(v=>({source:v.src,target:v.dst,type:v.edgeType,prio:wI[v.edgeType]??0,conf:v.confidence})).sort((v,I)=>I.prio-v.prio||I.conf-v.conf),T=new Set,$=[];for(let v of w){let I=`${v.source}->${v.target}:${v.type}`;if(!T.has(I)&&(T.add(I),$.push({source:v.source,target:v.target,type:v.type}),$.length>=r))break}for(let v of C){if($.length>=r)break;let I=`${v.source}->${v.target}:${v.type}`;T.has(I)||(T.add(I),$.push({source:v.source,target:v.target,type:v.type}))}return{version:1,builtAt:i?.builtAt??new Date().toISOString(),symbolCount:i?.symbolCount??s.length,edgeCount:i?.edgeCount??o.length,nodes:k,links:$}}function eX(n){return!!n&&n.nodes.length>0}var bI,EI,z2,wI,vI=y(()=>{"use strict";dn();F();bI=400,EI=900,z2={function:"Function",method:"Method",class:"Class",interface:"Interface",type:"Type",enum:"Enum",const:"Const",route:"Route",file:"File"},wI={CALLS:5,IMPORTS:4,DEFINES:3,HANDLES:2,TESTS:1};c(Y2,"mapKind");c(Q2,"loadEdges");c(Z2,"buildCloudCodeGraphSnapshot");c(eX,"isUploadableGraph")});function So(n){if(n)return tX[n]}function TI(n,e){let t=nX[n];return t?{...Sp,...e??{}}[t]!==!1:!0}var tX,nX,Sp,wle,vp=y(()=>{"use strict";tX={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};c(So,"toCloudTable");nX={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},Sp={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};c(TI,"isTableIncluded");wle=Object.keys(Sp)});function rX(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function sX(n){let e={};for(let[t,r]of Object.entries(n))e[rX(t)]=r;return e}function oX(n,e){let[t,r]=e.type.split("."),s=So(e.entityType)??So(t);if(!s)return null;let i=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",a=e.data||{},l=sX(a),u=e.entityId||l.id||a.id||"",d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:n},project_id:n};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function xI(n,e){return e.map(t=>oX(n,t)).filter(t=>t!==null)}var CI=y(()=>{"use strict";vp();c(rX,"camelToSnake");c(sX,"snakeCaseKeys");c(oX,"mapCliEventToWebFormat");c(xI,"mapCliEventsToWebFormat")});var RI={};R(RI,{default:()=>vo,syncClient:()=>Ss});var Ik,Ss,vo,Hi=y(()=>{"use strict";qy();jr();CI();Ik=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=xI(e,t),a=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async pullEvents(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a={projectId:e};typeof t=="number"&&t>0&&(a.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(a)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...r?{meta:r}:{}})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async setCloudLifecycle(e,t){try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${t}`,{method:"POST",headers:{...this.authHeaders(s,o)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,t){try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return{ok:!1};let i=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify(t)});if(!i.ok)return{ok:!1};let a=await i.json();return{ok:a.ok!==!1,nodes:a.nodes,links:a.links}}catch{return{ok:!1}}}async publishBenchmark(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Bd("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await ke.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await ke.hasAuth()}async getAuthHeaders(){let[e,t,r]=await Promise.all([ke.getApiUrl(),ke.getApiKey(),ke.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:r}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,r=0){let s=new AbortController,o=setTimeout(()=>s.abort(),Bd("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),a&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Bd("API_REQUEST")}ms)`);if(a&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),r=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await ke.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await ke.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,r){return{code:e,message:t,status:r}}sleep(e){return new Promise(t=>setTimeout(t,e))}},Ss=new Ik,vo=Ss});import Pk from"node:fs/promises";import _I from"node:path";import{gunzipSync as iX,gzipSync as aX}from"node:zlib";function AI(n){return _I.join(G.getGlobalProjectPath(n),cX)}async function jk(n){if(!Le(n))return null;let e=Cn(n),t=[];try{t=b.query(n,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(l=>({src:l.src,dst:l.dst,edgeType:l.edge_type,confidence:l.confidence}))}catch{t=[]}let r=Wt(n)??{symbolCount:e.length,edgeCount:t.length,fileCount:new Set(e.map(l=>l.file)).size,builtAt:new Date().toISOString()},s={version:1,projectId:n,exportedAt:new Date().toISOString(),meta:r,symbols:e,edges:t},o=Buffer.from(JSON.stringify(s),"utf-8"),i=aX(o,{level:6}),a=AI(n);return await Pk.mkdir(_I.dirname(a),{recursive:!0}),await Pk.writeFile(a,i),{path:a,bytes:i.length,symbols:e.length,edges:t.length}}async function Nk(n){let e=AI(n),t;try{t=await Pk.readFile(e)}catch{return{imported:!1,symbols:0,edges:0,reason:"no per-project artifact"}}let r;try{let s=iX(t).toString("utf-8");r=JSON.parse(s)}catch(s){return{imported:!1,symbols:0,edges:0,reason:`corrupt artifact: ${s instanceof Error?s.message:String(s)}`}}return r.version!==1||!Array.isArray(r.symbols)?{imported:!1,symbols:0,edges:0,reason:"unsupported artifact version"}:r.projectId&&r.projectId!==n?{imported:!1,symbols:0,edges:0,reason:`artifact projectId mismatch (got ${r.projectId}, expected ${n})`}:(b.transaction(n,s=>{s.prepare("DELETE FROM code_symbols").run(),s.prepare("DELETE FROM code_symbol_edges").run();let o=s.prepare(`INSERT INTO code_symbols (id, file, kind, name, qname, start_line, end_line, exported)
|
|
1645
|
+
`,templateHash:t}}async function yI(){try{let n=gI(),e=mI.dirname(n);await Oc.mkdir(e,{recursive:!0});let t=await L(n),r=await hI();if(!r)return ie.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=Rk(r),o=Buffer.byteLength(s.content,"utf-8");return o>Ck&&ie.warn(`Codex SKILL.md is ${o} bytes \u2014 over Codex's ~${Ck}-byte hard limit; the skill may be rejected. Trim editor-surfaces.ts.`),t&&await Oc.readFile(n,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await Oc.writeFile(n,s.content,"utf-8"),{success:!0,action:t?"updated":"created"})}catch(n){return ie.warn(`Codex skill warning: ${x(n)}`),{success:!1,action:null}}}async function _k(n={}){let e=gI();if(!(await as()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let r=await hI();if(!r)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=Rk(r),o=c(async()=>n.autoRepair?(await yI()).success:!1,"maybeRepair"),i="";if(!await L(e)&&!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};i=await Oc.readFile(e,"utf-8").catch(()=>"");let a=pI(i);if(!(a?.version===ut&&a?.templateHash===s.templateHash)){if(!await o())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(i=await Oc.readFile(e,"utf-8").catch(()=>""),a=pI(i),!(a?.version===ut&&a?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,message:"Codex p. router ready"}}var fI,Ck,Ak=y(()=>{"use strict";Lr();V();de();xi();jn();Bt();Ht();fI="prjct-codex-router",Ck=1024;c(gI,"getCodexSkillPath");c(V2,"getCodexSkillMetadata");c(pI,"parseCodexSkillMetadata");c(K2,"hashContent");c(hI,"loadCodexSkillTemplate");c(Rk,"buildCodexSkillContent");c(yI,"installCodexSkill");c(_k,"verifyCodexPRouterReady")});var SI={};R(SI,{CLOUD_GRAPH_MAX_LINKS:()=>EI,CLOUD_GRAPH_MAX_NODES:()=>bI,buildCloudCodeGraphSnapshot:()=>Z2,isUploadableGraph:()=>eX});function Y2(n){return z2[n.toLowerCase()]??"Symbol"}function Q2(n){try{return b.query(n,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(e=>({src:e.src,dst:e.dst,edgeType:e.edge_type,confidence:e.confidence}))}catch{return[]}}function Z2(n,e={}){if(!Le(n))return null;let t=e.maxNodes??bI,r=e.maxLinks??EI,s=Cn(n);if(s.length===0)return null;let o=Q2(n),i=Wt(n),a=new Map;for(let v of o){let I=wI[v.edgeType]??1;a.set(v.src,(a.get(v.src)??0)+I),a.set(v.dst,(a.get(v.dst)??0)+I)}let l=c(v=>{switch(v){case"class":return 8;case"function":case"method":return 6;case"interface":case"type":return 4;case"route":return 5;default:return 2}},"kindWeight"),d=s.map(v=>{let I=a.get(v.id)??0,U=v.exported?4:0;return{s:v,score:I+U+l(v.kind)}}).sort((v,I)=>I.score-v.score||v.s.name.localeCompare(I.s.name)).slice(0,t).map(v=>v.s),p=new Set(d.map(v=>v.id)),m=new Map;for(let v of d)m.set(v.file,(m.get(v.file)??0)+1);let f=[...m.entries()].sort((v,I)=>I[1]-v[1]).slice(0,Math.min(80,Math.floor(t/5))).map(([v])=>v),g=c(v=>`file:${v}`,"fileNodeId"),k=[];for(let v of f){let I=v.split("/").pop()||v;k.push({id:g(v),name:I,kind:"File",file:v,exported:!1}),p.add(g(v))}for(let v of d)k.push({id:v.id,name:v.name,kind:Y2(v.kind),file:v.file,exported:v.exported});let w=[],S=new Set(f);for(let v of d)S.has(v.file)&&w.push({source:g(v.file),target:v.id,type:"DEFINES"});let C=o.filter(v=>p.has(v.src)&&p.has(v.dst)&&v.src!==v.dst).map(v=>({source:v.src,target:v.dst,type:v.edgeType,prio:wI[v.edgeType]??0,conf:v.confidence})).sort((v,I)=>I.prio-v.prio||I.conf-v.conf),T=new Set,$=[];for(let v of w){let I=`${v.source}->${v.target}:${v.type}`;if(!T.has(I)&&(T.add(I),$.push({source:v.source,target:v.target,type:v.type}),$.length>=r))break}for(let v of C){if($.length>=r)break;let I=`${v.source}->${v.target}:${v.type}`;T.has(I)||(T.add(I),$.push({source:v.source,target:v.target,type:v.type}))}return{version:1,builtAt:i?.builtAt??new Date().toISOString(),symbolCount:i?.symbolCount??s.length,edgeCount:i?.edgeCount??o.length,nodes:k,links:$}}function eX(n){return!!n&&n.nodes.length>0}var bI,EI,z2,wI,vI=y(()=>{"use strict";dn();F();bI=400,EI=900,z2={function:"Function",method:"Method",class:"Class",interface:"Interface",type:"Type",enum:"Enum",const:"Const",route:"Route",file:"File"},wI={CALLS:5,IMPORTS:4,DEFINES:3,HANDLES:2,TESTS:1};c(Y2,"mapKind");c(Q2,"loadEdges");c(Z2,"buildCloudCodeGraphSnapshot");c(eX,"isUploadableGraph")});function So(n){if(n)return tX[n]}function TI(n,e){let t=nX[n];return t?{...Sp,...e??{}}[t]!==!1:!0}var tX,nX,Sp,wle,vp=y(()=>{"use strict";tX={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};c(So,"toCloudTable");nX={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},Sp={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};c(TI,"isTableIncluded");wle=Object.keys(Sp)});function rX(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function sX(n){let e={};for(let[t,r]of Object.entries(n))e[rX(t)]=r;return e}function oX(n,e){let[t,r]=e.type.split("."),s=So(e.entityType)??So(t);if(!s)return null;let i=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",a=e.data||{},l=sX(a),u=e.entityId||(typeof l.id=="string"?l.id:"")||(typeof a.id=="string"?a.id:"")||(typeof l.task_id=="string"?l.task_id:"")||(typeof a.taskId=="string"?a.taskId:"")||(typeof l.entity_id=="string"?l.entity_id:"")||"";u&&l.id==null&&(l.id=u);let d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:n},project_id:n};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function xI(n,e){return e.map(t=>oX(n,t)).filter(t=>t!==null)}var CI=y(()=>{"use strict";vp();c(rX,"camelToSnake");c(sX,"snakeCaseKeys");c(oX,"mapCliEventToWebFormat");c(xI,"mapCliEventsToWebFormat")});var RI={};R(RI,{default:()=>vo,syncClient:()=>Ss});var Ik,Ss,vo,Hi=y(()=>{"use strict";qy();jr();CI();Ik=class{static{c(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=xI(e,t),a=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async pullEvents(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a={projectId:e};typeof t=="number"&&t>0&&(a.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(a)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let a=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...r?{meta:r}:{}})});if(!a.ok)throw await this.parseErrorResponse(a);return await a.json()}async setCloudLifecycle(e,t){try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${t}`,{method:"POST",headers:{...this.authHeaders(s,o)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,t){try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return{ok:!1};let i=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify(t)});if(!i.ok)return{ok:!1};let a=await i.json();return{ok:a.ok!==!1,nodes:a.nodes,links:a.links}}catch{return{ok:!1}}}async publishBenchmark(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),Bd("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await ke.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await ke.hasAuth()}async getAuthHeaders(){let[e,t,r]=await Promise.all([ke.getApiUrl(),ke.getApiKey(),ke.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:r}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,r=0){let s=new AbortController,o=setTimeout(()=>s.abort(),Bd("API_REQUEST")),i=(t.method??"GET").toUpperCase(),a=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),a&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Bd("API_REQUEST")}ms)`);if(a&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),r=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await ke.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await ke.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,r){return{code:e,message:t,status:r}}sleep(e){return new Promise(t=>setTimeout(t,e))}},Ss=new Ik,vo=Ss});import Pk from"node:fs/promises";import _I from"node:path";import{gunzipSync as iX,gzipSync as aX}from"node:zlib";function AI(n){return _I.join(G.getGlobalProjectPath(n),cX)}async function jk(n){if(!Le(n))return null;let e=Cn(n),t=[];try{t=b.query(n,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(l=>({src:l.src,dst:l.dst,edgeType:l.edge_type,confidence:l.confidence}))}catch{t=[]}let r=Wt(n)??{symbolCount:e.length,edgeCount:t.length,fileCount:new Set(e.map(l=>l.file)).size,builtAt:new Date().toISOString()},s={version:1,projectId:n,exportedAt:new Date().toISOString(),meta:r,symbols:e,edges:t},o=Buffer.from(JSON.stringify(s),"utf-8"),i=aX(o,{level:6}),a=AI(n);return await Pk.mkdir(_I.dirname(a),{recursive:!0}),await Pk.writeFile(a,i),{path:a,bytes:i.length,symbols:e.length,edges:t.length}}async function Nk(n){let e=AI(n),t;try{t=await Pk.readFile(e)}catch{return{imported:!1,symbols:0,edges:0,reason:"no per-project artifact"}}let r;try{let s=iX(t).toString("utf-8");r=JSON.parse(s)}catch(s){return{imported:!1,symbols:0,edges:0,reason:`corrupt artifact: ${s instanceof Error?s.message:String(s)}`}}return r.version!==1||!Array.isArray(r.symbols)?{imported:!1,symbols:0,edges:0,reason:"unsupported artifact version"}:r.projectId&&r.projectId!==n?{imported:!1,symbols:0,edges:0,reason:`artifact projectId mismatch (got ${r.projectId}, expected ${n})`}:(b.transaction(n,s=>{s.prepare("DELETE FROM code_symbols").run(),s.prepare("DELETE FROM code_symbol_edges").run();let o=s.prepare(`INSERT INTO code_symbols (id, file, kind, name, qname, start_line, end_line, exported)
|
|
1646
1646
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`),i=s.prepare(`INSERT OR IGNORE INTO code_symbol_edges (src, dst, edge_type, confidence)
|
|
1647
1647
|
VALUES (?, ?, ?, ?)`);for(let a of r.symbols)o.run(a.id,a.file,a.kind,a.name,a.qname,a.startLine,a.endLine,a.exported?1:0);for(let a of r.edges)i.run(a.src,a.dst,a.edgeType,a.confidence)}),b.setDoc(n,"symbol-graph",{...r.meta,builtAt:r.meta.builtAt??r.exportedAt}),{imported:!0,symbols:r.symbols.length,edges:r.edges.length})}async function II(n){if(Le(n))return{bootstrapped:!1,detail:"local index already present"};let e=await Nk(n);return e.imported?{bootstrapped:!0,detail:`imported ${e.symbols} symbols / ${e.edges} edges from per-project cache`}:{bootstrapped:!1,detail:e.reason??"import failed"}}async function Tp(n){try{await jk(n)}catch{}try{await $k(n)}catch{}}async function $k(n){let{buildCloudCodeGraphSnapshot:e,isUploadableGraph:t}=await Promise.resolve().then(()=>(vI(),SI)),r=e(n);if(!t(r))return{uploaded:!1,reason:"no symbol index or empty graph"};try{let{default:s}=await Promise.resolve().then(()=>(Hi(),RI)),o=await s.uploadCodeGraph(n,r);return o.ok?{uploaded:!0,nodes:o.nodes??r.nodes.length,links:o.links??r.links.length}:{uploaded:!1,reason:"upload failed or unauthenticated"}}catch(s){return{uploaded:!1,reason:s instanceof Error?s.message:String(s)}}}var cX,Ok=y(()=>{"use strict";dn();qe();F();cX="code-graph.json.gz";c(AI,"artifactPath");c(jk,"exportCodeGraphArtifact");c(Nk,"importCodeGraphArtifact");c(II,"bootstrapCodeGraphFromArtifact");c(Tp,"maybeExportAfterIndex");c($k,"maybeUploadCodeGraphToCloud")});function uX(){let n=Mk.map(e=>`"${e}"`).join(", ");return`---
|
|
1648
1648
|
description: "${Dk}"
|
package/dist/mcp/server.mjs
CHANGED
|
@@ -1260,7 +1260,7 @@ CREATE TABLE velocity_sprints (
|
|
|
1260
1260
|
_No changes detected (clean tree / no base range)._
|
|
1261
1261
|
`;let e=["## Detect changes","",`- **Source**: ${t.source}`,`- **Changed**: ${t.changedFiles.length} file(s)`,`- **Blast radius**: ${t.affectedFiles.length} file(s) (imports + call-graph)`,`- **Risk**: critical ${t.summary.critical} \xB7 high ${t.summary.high} \xB7 medium ${t.summary.medium} \xB7 low ${t.summary.low}`,"","### Per-file risk",""];for(let n of t.changes){let r=n.touchedSymbols.length>0?` \xB7 symbols: ${n.touchedSymbols.slice(0,6).join(", ")}`:"";e.push(`- **${n.risk.toUpperCase()}** \`${n.file}\`${r}`,` - ${n.reasons.join("; ")}`)}if(t.affectedFiles.length>t.changedFiles.length){e.push("","### Affected beyond diff","");let n=t.affectedFiles.filter(r=>!t.changedFiles.includes(r)).slice(0,25);for(let r of n)e.push(`- \`${r}\``);t.affectedFiles.length-t.changedFiles.length>25&&e.push(`- _\u2026+${t.affectedFiles.length-t.changedFiles.length-25} more_`)}return e.push("","_Advisory. Expand with `prjct code trace <symbol>` or MCP `prjct_trace_path`._"),e.join(`
|
|
1262
1262
|
`)}function zR(t){if(t.changedFiles.length===0)return"detect-changes: no changes detected";let e=[`Detect changes (${t.source}): ${t.changedFiles.length} changed \u2192 blast ${t.affectedFiles.length}`,`Risk: critical=${t.summary.critical} high=${t.summary.high} medium=${t.summary.medium} low=${t.summary.low}`];for(let n of t.changes.slice(0,30)){let r=n.touchedSymbols.length?` [${n.touchedSymbols.slice(0,4).join(",")}]`:"";e.push(` [${n.risk.toUpperCase()}] ${n.file}${r} \u2014 ${n.reasons[0]??""}`)}return e.join(`
|
|
1263
|
-
`)}function QR(t){return t.changedFiles.length===0?null:t.summary.critical>0?`\u26A0\uFE0F Structural risk CRITICAL (${t.summary.critical} file(s), blast ${t.affectedFiles.length}). Review: \`prjct code impact --md\`.`:t.summary.high>0?`\u26A0\uFE0F Structural risk HIGH (${t.summary.high} file(s), blast ${t.affectedFiles.length}). Consider \`prjct code impact --md\`.`:null}var JR,KR,xl=h(()=>{"use strict";tn();Mt();le();a(ht,"safeGit");a(GR,"listWorkingTreeFiles");a(XR,"listCommittedFiles");a(qR,"resolveDiffBase");a(Zf,"parseChangedLinesFromUnifiedDiff");a(VR,"loadHunkLines");a(eh,"symbolsTouchedByHunks");JR=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,KR=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(YR,"classifyRisk");a(vl,"detectChanges");a(_l,"formatDetectChangesMd");a(zR,"formatDetectChangesText");a(QR,"shipStructuralRiskCue")});function ZR(t){return t instanceof Ks}function Se(t){return ZR(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ks,Po,Ys,nn=h(()=>{"use strict";Ks=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Po=class t extends Ks{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ys=class t extends Ks{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(ZR,"isPrjctError");a(Se,"getErrorMessage")});function nh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Rl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:nh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:nh(r.host),repoSlug:s}}catch{return{}}}async function eC(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function tC(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Yn(t){return typeof t=="string"&&t.length>0?t:void 0}function rh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function nC(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function sh(t){let e=w.getDoc(t,"project")||{},n=Yn(e.repoPath),{provider:r,repoSlug:s}=n?Rl(await eC(n)||""):{},i=n?await tC(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return nC({provider:r,repoSlug:s,currentBranch:Yn(e.currentBranch),defaultBranch:i,stack:Yn(e.stack),techStack:o&&o.length>0?o:void 0,version:Yn(e.version),commitCount:rh(e.commitCount),fileCount:rh(e.fileCount),lastCommit:Yn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Yn(e.cliVersion),syncedAt:Yn(e.lastSync)})}var Cl=h(()=>{"use strict";O();le();a(nh,"providerForHost");a(Rl,"parseRemote");a(eC,"gitRemoteUrl");a(tC,"gitDefaultBranch");a(Yn,"str");a(rh,"num");a(nC,"compact");a(sh,"buildProjectMeta")});import{execFile as rC}from"node:child_process";import sC from"node:crypto";import{promisify as iC}from"node:util";function cC(t,e=aC){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=sC.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function lC(t){let e;try{let{stdout:s}=await oC("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=Rl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function ih(t){let e=await lC(t);return e?cC(e):null}var oC,aC,oh=h(()=>{"use strict";Cl();oC=iC(rC),aC="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(cC,"uuidv5");a(lC,"repoKey");a(ih,"deriveProjectId")});var Il={};L(Il,{PACKAGE_ROOT:()=>An,VERSION:()=>Cn,getPackageRoot:()=>Nl,getVersion:()=>Lo,resetPackageRoot:()=>uC});import Al from"node:fs";import Do from"node:path";function Nl(){if(jr)return jr;let t=__dirname;for(let e=0;e<5;e++){let n=Do.join(t,"package.json");if(Al.existsSync(n))try{if(JSON.parse(Al.readFileSync(n,"utf-8")).name==="prjct-cli")return jr=t,t}catch{}t=Do.dirname(t)}return jr=Do.join(__dirname,"..","..",".."),jr}function Lo(){if(zn)return zn;let t="3.63.
|
|
1263
|
+
`)}function QR(t){return t.changedFiles.length===0?null:t.summary.critical>0?`\u26A0\uFE0F Structural risk CRITICAL (${t.summary.critical} file(s), blast ${t.affectedFiles.length}). Review: \`prjct code impact --md\`.`:t.summary.high>0?`\u26A0\uFE0F Structural risk HIGH (${t.summary.high} file(s), blast ${t.affectedFiles.length}). Consider \`prjct code impact --md\`.`:null}var JR,KR,xl=h(()=>{"use strict";tn();Mt();le();a(ht,"safeGit");a(GR,"listWorkingTreeFiles");a(XR,"listCommittedFiles");a(qR,"resolveDiffBase");a(Zf,"parseChangedLinesFromUnifiedDiff");a(VR,"loadHunkLines");a(eh,"symbolsTouchedByHunks");JR=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,KR=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(YR,"classifyRisk");a(vl,"detectChanges");a(_l,"formatDetectChangesMd");a(zR,"formatDetectChangesText");a(QR,"shipStructuralRiskCue")});function ZR(t){return t instanceof Ks}function Se(t){return ZR(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ks,Po,Ys,nn=h(()=>{"use strict";Ks=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Po=class t extends Ks{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},Ys=class t extends Ks{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(ZR,"isPrjctError");a(Se,"getErrorMessage")});function nh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Rl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:nh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:nh(r.host),repoSlug:s}}catch{return{}}}async function eC(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function tC(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Yn(t){return typeof t=="string"&&t.length>0?t:void 0}function rh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function nC(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function sh(t){let e=w.getDoc(t,"project")||{},n=Yn(e.repoPath),{provider:r,repoSlug:s}=n?Rl(await eC(n)||""):{},i=n?await tC(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return nC({provider:r,repoSlug:s,currentBranch:Yn(e.currentBranch),defaultBranch:i,stack:Yn(e.stack),techStack:o&&o.length>0?o:void 0,version:Yn(e.version),commitCount:rh(e.commitCount),fileCount:rh(e.fileCount),lastCommit:Yn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Yn(e.cliVersion),syncedAt:Yn(e.lastSync)})}var Cl=h(()=>{"use strict";O();le();a(nh,"providerForHost");a(Rl,"parseRemote");a(eC,"gitRemoteUrl");a(tC,"gitDefaultBranch");a(Yn,"str");a(rh,"num");a(nC,"compact");a(sh,"buildProjectMeta")});import{execFile as rC}from"node:child_process";import sC from"node:crypto";import{promisify as iC}from"node:util";function cC(t,e=aC){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=sC.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function lC(t){let e;try{let{stdout:s}=await oC("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=Rl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function ih(t){let e=await lC(t);return e?cC(e):null}var oC,aC,oh=h(()=>{"use strict";Cl();oC=iC(rC),aC="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(cC,"uuidv5");a(lC,"repoKey");a(ih,"deriveProjectId")});var Il={};L(Il,{PACKAGE_ROOT:()=>An,VERSION:()=>Cn,getPackageRoot:()=>Nl,getVersion:()=>Lo,resetPackageRoot:()=>uC});import Al from"node:fs";import Do from"node:path";function Nl(){if(jr)return jr;let t=__dirname;for(let e=0;e<5;e++){let n=Do.join(t,"package.json");if(Al.existsSync(n))try{if(JSON.parse(Al.readFileSync(n,"utf-8")).name==="prjct-cli")return jr=t,t}catch{}t=Do.dirname(t)}return jr=Do.join(__dirname,"..","..",".."),jr}function Lo(){if(zn)return zn;let t="3.63.1";if(t&&/^\d+\.\d+\.\d+/.test(t))return zn=t,zn;try{let e=Do.join(Nl(),"package.json");return zn=JSON.parse(Al.readFileSync(e,"utf-8")).version,zn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function uC(t){jr=t,zn=null}var zn,jr,Cn,An,rn=h(()=>{"use strict";ie();zn=null,jr=null;a(Nl,"getPackageRoot");a(Lo,"getVersion");a(uC,"resetPackageRoot");Cn=Lo(),An=Nl()});async function Oo(t){try{let{stdout:e}=await H(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function dC(){let t=await Oo("gh api user --jq .login");return t.success&&t.output||(t=await Oo("git config --global github.user"),t.success&&t.output)?t.output:null}async function pC(){let t=await Oo("git config user.name");return t.success&&t.output?t.output:null}async function mC(){let t=await Oo("git config user.email");return t.success&&t.output?t.output:null}async function Mr(){let[t,e,n]=await Promise.all([dC(),pC(),mC()]);return{github:t,email:n,name:e||t||"Unknown"}}var jo=h(()=>{"use strict";le();a(Oo,"execCommand");a(dC,"detectGitHubUsername");a(pC,"detectGitName");a(mC,"detectGitEmail");a(Mr,"detect")});var Mo={};L(Mo,{worktreeService:()=>gC});import Dl from"node:fs/promises";import $t from"node:path";var ah,Ll,gC,$o=h(()=>{"use strict";le();se();ah=".worktrees",Ll=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=$t.join(s,ah,n),o=r.branch||`feat/${n}`;await Dl.mkdir($t.join(s,ah),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await H(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await H("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await H(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await H(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await H("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await H("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await H("git rev-parse --git-dir",{cwd:e}),s=$t.resolve(e,n.trim()),i=$t.resolve(e,r.trim());if(s!==i){let{stdout:o}=await H("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await H("git rev-parse HEAD",{cwd:e}),{stdout:l}=await H("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=$t.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await H("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1264
1264
|
`)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await H("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=$t.join(n,".env");await N(r)&&await Dl.copyFile(r,$t.join(e,".env"));let s=$t.join(n,".prjct"),i=$t.join(e,".prjct");await N(s)&&!await N(i)&&await Dl.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await H("git worktree prune",{cwd:s});for(let i of n)i.isMain||await N(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
|
|
1265
1265
|
|
|
1266
1266
|
`);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
|
|
@@ -1647,7 +1647,7 @@ ${s}`:s,changed:!0}}async function Mw(t=Mi()){let e="";try{e=await hr.readFile(t
|
|
|
1647
1647
|
\u{1F50C} Configuring MCP servers...`);try{await $i.install();let e=t.verifyContext7===!1?null:await $i.verify();t.silent||(e?.verified?console.log("\u2705 Context7 MCP ready (framework API lookups)"):(console.log(`\u26A0\uFE0F Context7 configured but not yet verified: ${e?.message||""}`),console.log(" It will activate on the next time you open your AI client.")))}catch(e){t.silent||(console.log(`\u26A0\uFE0F Context7 MCP setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}for(let e of oL)try{let n=ds(),r=await Aw(e.name,n),s=await Oi(e.name,Jt[e.name],n);r&&!s.changed?t.silent||console.log(e.ready):t.silent||console.log(e.added)}catch(n){t.silent||(console.log(`\u26A0\uFE0F ${e.failed}: ${x(n)}`),console.log(e.manual))}try{if((await xn()).installed){let n=await Mw(),r=await Ka();t.silent||(n.skipped==="user-managed"?console.log("\u2705 prjct Codex config ready (MCP user-managed)"):n.changed||r.changed?console.log("\u2705 prjct Codex config updated in ~/.codex/config.toml"):console.log("\u2705 prjct Codex config already ready"))}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Codex config setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}try{if((await al()).installed){let n=await Xw();t.silent||console.log(n.changed?"\u2705 prjct Kimi config updated in ~/.kimi/mcp.json":"\u2705 prjct Kimi config already ready")}}catch(e){t.silent||(console.log(`\u26A0\uFE0F Kimi config setup failed: ${x(e)}`),console.log(" Run `prjct start` again to retry."))}}var oL,Jw=h(()=>{"use strict";gt();Jd();ie();Xd();qw();ji();oL=[{name:"prjct",ready:"\u2705 prjct MCP already configured",added:"\u2705 prjct MCP added to mcp.json",failed:"prjct MCP setup failed",manual:" Run `prjct start` again to retry."}];a(Vw,"setupMcpServers")});import Fi from"node:fs/promises";import aL from"node:os";import zw from"node:path";function Zw(){return zw.join(aL.homedir(),".codex","skills","prjct","SKILL.md")}function cL(t){return`<!-- ${Qw}: ${JSON.stringify({v:Cn,h:t})} -->`}function Yw(t){let e=t.match(new RegExp(`<!--\\s*${Qw}:\\s*(\\{[\\s\\S]*?\\})\\s*-->`));if(!e)return null;try{let n=JSON.parse(e[1]);return{version:n.v??n.version,templateHash:n.h??n.templateHash}}catch{return null}}function lL(t){return Di(t).slice(0,12)}async function eT(){return At("codex/SKILL.md")}function tT(t){let e=t.trimEnd(),n=lL(e),r=cL(n);return{content:`${e}
|
|
1648
1648
|
|
|
1649
1649
|
${r}
|
|
1650
|
-
`,templateHash:n}}async function uL(){try{let t=Zw(),e=zw.dirname(t);await Fi.mkdir(e,{recursive:!0});let n=await N(t),r=await eT();if(!r)return X.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=tT(r),i=Buffer.byteLength(s.content,"utf-8");return i>Kw&&X.warn(`Codex SKILL.md is ${i} bytes \u2014 over Codex's ~${Kw}-byte hard limit; the skill may be rejected. Trim editor-surfaces.ts.`),n&&await Fi.readFile(t,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await Fi.writeFile(t,s.content,"utf-8"),{success:!0,action:n?"updated":"created"})}catch(t){return X.warn(`Codex skill warning: ${x(t)}`),{success:!1,action:null}}}async function nT(t={}){let e=Zw();if(!(await xn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let r=await eT();if(!r)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=tT(r),i=a(async()=>t.autoRepair?(await uL()).success:!1,"maybeRepair"),o="";if(!await N(e)&&!await i())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};o=await Fi.readFile(e,"utf-8").catch(()=>"");let c=Yw(o);if(!(c?.version===Cn&&c?.templateHash===s.templateHash)){if(!await i())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(o=await Fi.readFile(e,"utf-8").catch(()=>""),c=Yw(o),!(c?.version===Cn&&c?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,message:"Codex p. router ready"}}var Qw,Kw,rT=h(()=>{"use strict";as();ie();se();us();yt();rn();gt();Qw="prjct-codex-router",Kw=1024;a(Zw,"getCodexSkillPath");a(cL,"getCodexSkillMetadata");a(Yw,"parseCodexSkillMetadata");a(lL,"hashContent");a(eT,"loadCodexSkillTemplate");a(tT,"buildCodexSkillContent");a(uL,"installCodexSkill");a(nT,"verifyCodexPRouterReady")});var aT={};L(aT,{CLOUD_GRAPH_MAX_LINKS:()=>oT,CLOUD_GRAPH_MAX_NODES:()=>iT,buildCloudCodeGraphSnapshot:()=>gL,isUploadableGraph:()=>fL});function pL(t){return dL[t.toLowerCase()]??"Symbol"}function mL(t){try{return y.query(t,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(e=>({src:e.src,dst:e.dst,edgeType:e.edge_type,confidence:e.confidence}))}catch{return[]}}function gL(t,e={}){if(!_e(t))return null;let n=e.maxNodes??iT,r=e.maxLinks??oT,s=jt(t);if(s.length===0)return null;let i=mL(t),o=rt(t),c=new Map;for(let k of i){let _=sT[k.edgeType]??1;c.set(k.src,(c.get(k.src)??0)+_),c.set(k.dst,(c.get(k.dst)??0)+_)}let l=a(k=>{switch(k){case"class":return 8;case"function":case"method":return 6;case"interface":case"type":return 4;case"route":return 5;default:return 2}},"kindWeight"),d=s.map(k=>{let _=c.get(k.id)??0,P=k.exported?4:0;return{s:k,score:_+P+l(k.kind)}}).sort((k,_)=>_.score-k.score||k.s.name.localeCompare(_.s.name)).slice(0,n).map(k=>k.s),p=new Set(d.map(k=>k.id)),m=new Map;for(let k of d)m.set(k.file,(m.get(k.file)??0)+1);let g=[...m.entries()].sort((k,_)=>_[1]-k[1]).slice(0,Math.min(80,Math.floor(n/5))).map(([k])=>k),f=a(k=>`file:${k}`,"fileNodeId"),E=[];for(let k of g){let _=k.split("/").pop()||k;E.push({id:f(k),name:_,kind:"File",file:k,exported:!1}),p.add(f(k))}for(let k of d)E.push({id:k.id,name:k.name,kind:pL(k.kind),file:k.file,exported:k.exported});let T=[],R=new Set(g);for(let k of d)R.has(k.file)&&T.push({source:f(k.file),target:k.id,type:"DEFINES"});let A=i.filter(k=>p.has(k.src)&&p.has(k.dst)&&k.src!==k.dst).map(k=>({source:k.src,target:k.dst,type:k.edgeType,prio:sT[k.edgeType]??0,conf:k.confidence})).sort((k,_)=>_.prio-k.prio||_.conf-k.conf),b=new Set,C=[];for(let k of T){let _=`${k.source}->${k.target}:${k.type}`;if(!b.has(_)&&(b.add(_),C.push({source:k.source,target:k.target,type:k.type}),C.length>=r))break}for(let k of A){if(C.length>=r)break;let _=`${k.source}->${k.target}:${k.type}`;b.has(_)||(b.add(_),C.push({source:k.source,target:k.target,type:k.type}))}return{version:1,builtAt:o?.builtAt??new Date().toISOString(),symbolCount:o?.symbolCount??s.length,edgeCount:o?.edgeCount??i.length,nodes:E,links:C}}function fL(t){return!!t&&t.nodes.length>0}var iT,oT,dL,sT,cT=h(()=>{"use strict";Mt();O();iT=400,oT=900,dL={function:"Function",method:"Method",class:"Class",interface:"Interface",type:"Type",enum:"Enum",const:"Const",route:"Route",file:"File"},sT={CALLS:5,IMPORTS:4,DEFINES:3,HANDLES:2,TESTS:1};a(pL,"mapKind");a(mL,"loadEdges");a(gL,"buildCloudCodeGraphSnapshot");a(fL,"isUploadableGraph")});function Er(t){if(t)return hL[t]}function uT(t,e){let n=yL[t];return n?{...lT,...e??{}}[n]!==!1:!0}var hL,yL,lT,JK,Kd=h(()=>{"use strict";hL={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};a(Er,"toCloudTable");yL={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},lT={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};a(uT,"isTableIncluded");JK=Object.keys(lT)});function EL(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function kL(t){let e={};for(let[n,r]of Object.entries(t))e[EL(n)]=r;return e}function wL(t,e){let[n,r]=e.type.split("."),s=Er(e.entityType)??Er(n);if(!s)return null;let o=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=kL(c),u=e.entityId||l.id||c.id||"",d={event_type:o,entity_type:s,entity_id:u,data:{...l,project_id:t},project_id:t};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function dT(t,e){return e.map(n=>wL(t,n)).filter(n=>n!==null)}var pT=h(()=>{"use strict";Kd();a(EL,"camelToSnake");a(kL,"snakeCaseKeys");a(wL,"mapCliEventToWebFormat");a(dT,"mapCliEventsToWebFormat")});var mT={};L(mT,{default:()=>TL,syncClient:()=>ps});var Yd,ps,TL,zd=h(()=>{"use strict";yd();ri();pT();Yd=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=dT(e,n),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,events:o})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof n=="number"&&n>0&&(c.sinceEventId=n);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:n,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${n}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async linkProject(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify({projectId:e,...n?{name:n}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async setCloudLifecycle(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${n}`,{method:"POST",headers:{...this.authHeaders(s,i)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return{ok:!1};let o=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify(n)});if(!o.ok)return{ok:!1};let c=await o.json();return{ok:c.ok!==!1,nodes:c.nodes,links:c.links}}catch{return{ok:!1}}}async publishBenchmark(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,...n})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async testConnection(){let e=new AbortController,n=setTimeout(()=>e.abort(),Ra("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return clearTimeout(n),!1;let o=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,i)},signal:e.signal});return clearTimeout(n),o.status===401||o.status===403?(await st.clearAuth(),!1):o.ok}catch{return clearTimeout(n),!1}}async hasAuth(){return await st.hasAuth()}async getAuthHeaders(){let[e,n,r]=await Promise.all([st.getApiUrl(),st.getApiKey(),st.getDeviceId()]);return{apiUrl:e,apiKey:n,deviceId:r}}authHeaders(e,n){return{"X-Api-Key":e,"X-Device-Id":n}}async fetchWithRetry(e,n,r=0){let s=new AbortController,i=setTimeout(()=>s.abort(),Ra("API_REQUEST")),o=(n.method??"GET").toUpperCase(),c=o==="GET"||o==="HEAD";try{let l=await fetch(e,{...n,signal:s.signal});if(clearTimeout(i),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}return l}catch(l){if(clearTimeout(i),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ra("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let n=await e.json(),r=n.detail||n.message||n.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await st.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await st.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,n,r){return{code:e,message:n,status:r}}sleep(e){return new Promise(n=>setTimeout(n,e))}},ps=new Yd,TL=ps});import Qd from"node:fs/promises";import gT from"node:path";import{gunzipSync as SL,gzipSync as bL}from"node:zlib";function fT(t){return gT.join(z.getGlobalProjectPath(t),vL)}async function _L(t){if(!_e(t))return null;let e=jt(t),n=[];try{n=y.query(t,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(l=>({src:l.src,dst:l.dst,edgeType:l.edge_type,confidence:l.confidence}))}catch{n=[]}let r=rt(t)??{symbolCount:e.length,edgeCount:n.length,fileCount:new Set(e.map(l=>l.file)).size,builtAt:new Date().toISOString()},s={version:1,projectId:t,exportedAt:new Date().toISOString(),meta:r,symbols:e,edges:n},i=Buffer.from(JSON.stringify(s),"utf-8"),o=bL(i,{level:6}),c=fT(t);return await Qd.mkdir(gT.dirname(c),{recursive:!0}),await Qd.writeFile(c,o),{path:c,bytes:o.length,symbols:e.length,edges:n.length}}async function xL(t){let e=fT(t),n;try{n=await Qd.readFile(e)}catch{return{imported:!1,symbols:0,edges:0,reason:"no per-project artifact"}}let r;try{let s=SL(n).toString("utf-8");r=JSON.parse(s)}catch(s){return{imported:!1,symbols:0,edges:0,reason:`corrupt artifact: ${s instanceof Error?s.message:String(s)}`}}return r.version!==1||!Array.isArray(r.symbols)?{imported:!1,symbols:0,edges:0,reason:"unsupported artifact version"}:r.projectId&&r.projectId!==t?{imported:!1,symbols:0,edges:0,reason:`artifact projectId mismatch (got ${r.projectId}, expected ${t})`}:(y.transaction(t,s=>{s.prepare("DELETE FROM code_symbols").run(),s.prepare("DELETE FROM code_symbol_edges").run();let i=s.prepare(`INSERT INTO code_symbols (id, file, kind, name, qname, start_line, end_line, exported)
|
|
1650
|
+
`,templateHash:n}}async function uL(){try{let t=Zw(),e=zw.dirname(t);await Fi.mkdir(e,{recursive:!0});let n=await N(t),r=await eT();if(!r)return X.warn("Codex SKILL.md template not found"),{success:!1,action:null};let s=tT(r),i=Buffer.byteLength(s.content,"utf-8");return i>Kw&&X.warn(`Codex SKILL.md is ${i} bytes \u2014 over Codex's ~${Kw}-byte hard limit; the skill may be rejected. Trim editor-surfaces.ts.`),n&&await Fi.readFile(t,"utf-8").catch(()=>"")===s.content?{success:!0,action:"unchanged"}:(await Fi.writeFile(t,s.content,"utf-8"),{success:!0,action:n?"updated":"created"})}catch(t){return X.warn(`Codex skill warning: ${x(t)}`),{success:!1,action:null}}}async function nT(t={}){let e=Zw();if(!(await xn()).installed)return{installed:!1,verified:!0,skillPath:e,message:"Codex not detected"};let r=await eT();if(!r)return{installed:!0,verified:!1,skillPath:e,message:"Codex SKILL.md template missing from prjct installation",fix:["Reinstall prjct-cli package","Run `prjct setup`"]};let s=tT(r),i=a(async()=>t.autoRepair?(await uL()).success:!1,"maybeRepair"),o="";if(!await N(e)&&!await i())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill missing at ~/.codex/skills/prjct/SKILL.md",fix:["Run `prjct start` to install Codex skill"]};o=await Fi.readFile(e,"utf-8").catch(()=>"");let c=Yw(o);if(!(c?.version===Cn&&c?.templateHash===s.templateHash)){if(!await i())return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill metadata mismatch (outdated router)",fix:["Run `prjct start` or `prjct setup` to refresh Codex skill"]};if(o=await Fi.readFile(e,"utf-8").catch(()=>""),c=Yw(o),!(c?.version===Cn&&c?.templateHash===s.templateHash))return{installed:!0,verified:!1,skillPath:e,templateHash:s.templateHash,message:"Codex skill could not be repaired automatically",fix:["Delete ~/.codex/skills/prjct/SKILL.md","Run `prjct setup`"]}}return{installed:!0,verified:!0,skillPath:e,templateHash:s.templateHash,message:"Codex p. router ready"}}var Qw,Kw,rT=h(()=>{"use strict";as();ie();se();us();yt();rn();gt();Qw="prjct-codex-router",Kw=1024;a(Zw,"getCodexSkillPath");a(cL,"getCodexSkillMetadata");a(Yw,"parseCodexSkillMetadata");a(lL,"hashContent");a(eT,"loadCodexSkillTemplate");a(tT,"buildCodexSkillContent");a(uL,"installCodexSkill");a(nT,"verifyCodexPRouterReady")});var aT={};L(aT,{CLOUD_GRAPH_MAX_LINKS:()=>oT,CLOUD_GRAPH_MAX_NODES:()=>iT,buildCloudCodeGraphSnapshot:()=>gL,isUploadableGraph:()=>fL});function pL(t){return dL[t.toLowerCase()]??"Symbol"}function mL(t){try{return y.query(t,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(e=>({src:e.src,dst:e.dst,edgeType:e.edge_type,confidence:e.confidence}))}catch{return[]}}function gL(t,e={}){if(!_e(t))return null;let n=e.maxNodes??iT,r=e.maxLinks??oT,s=jt(t);if(s.length===0)return null;let i=mL(t),o=rt(t),c=new Map;for(let k of i){let _=sT[k.edgeType]??1;c.set(k.src,(c.get(k.src)??0)+_),c.set(k.dst,(c.get(k.dst)??0)+_)}let l=a(k=>{switch(k){case"class":return 8;case"function":case"method":return 6;case"interface":case"type":return 4;case"route":return 5;default:return 2}},"kindWeight"),d=s.map(k=>{let _=c.get(k.id)??0,P=k.exported?4:0;return{s:k,score:_+P+l(k.kind)}}).sort((k,_)=>_.score-k.score||k.s.name.localeCompare(_.s.name)).slice(0,n).map(k=>k.s),p=new Set(d.map(k=>k.id)),m=new Map;for(let k of d)m.set(k.file,(m.get(k.file)??0)+1);let g=[...m.entries()].sort((k,_)=>_[1]-k[1]).slice(0,Math.min(80,Math.floor(n/5))).map(([k])=>k),f=a(k=>`file:${k}`,"fileNodeId"),E=[];for(let k of g){let _=k.split("/").pop()||k;E.push({id:f(k),name:_,kind:"File",file:k,exported:!1}),p.add(f(k))}for(let k of d)E.push({id:k.id,name:k.name,kind:pL(k.kind),file:k.file,exported:k.exported});let T=[],R=new Set(g);for(let k of d)R.has(k.file)&&T.push({source:f(k.file),target:k.id,type:"DEFINES"});let A=i.filter(k=>p.has(k.src)&&p.has(k.dst)&&k.src!==k.dst).map(k=>({source:k.src,target:k.dst,type:k.edgeType,prio:sT[k.edgeType]??0,conf:k.confidence})).sort((k,_)=>_.prio-k.prio||_.conf-k.conf),b=new Set,C=[];for(let k of T){let _=`${k.source}->${k.target}:${k.type}`;if(!b.has(_)&&(b.add(_),C.push({source:k.source,target:k.target,type:k.type}),C.length>=r))break}for(let k of A){if(C.length>=r)break;let _=`${k.source}->${k.target}:${k.type}`;b.has(_)||(b.add(_),C.push({source:k.source,target:k.target,type:k.type}))}return{version:1,builtAt:o?.builtAt??new Date().toISOString(),symbolCount:o?.symbolCount??s.length,edgeCount:o?.edgeCount??i.length,nodes:E,links:C}}function fL(t){return!!t&&t.nodes.length>0}var iT,oT,dL,sT,cT=h(()=>{"use strict";Mt();O();iT=400,oT=900,dL={function:"Function",method:"Method",class:"Class",interface:"Interface",type:"Type",enum:"Enum",const:"Const",route:"Route",file:"File"},sT={CALLS:5,IMPORTS:4,DEFINES:3,HANDLES:2,TESTS:1};a(pL,"mapKind");a(mL,"loadEdges");a(gL,"buildCloudCodeGraphSnapshot");a(fL,"isUploadableGraph")});function Er(t){if(t)return hL[t]}function uT(t,e){let n=yL[t];return n?{...lT,...e??{}}[n]!==!1:!0}var hL,yL,lT,JK,Kd=h(()=>{"use strict";hL={memories:"memories",tasks:"tasks",subtasks:"subtasks",ideas:"ideas",queue_tasks:"queue_tasks",custom_workflows:"custom_workflows",workflow_rules:"workflow_rules",archives:"archives",shipped_items:"shipped_items",shipped_features:"shipped_features",metrics_daily:"metrics_daily",work_cost_snapshots:"work_cost_snapshots",velocity_sprints:"velocity_sprints",analysis:"analysis",specs:"specs",memory:"memories",memory_entry:"memories",task:"tasks",paused_task:"tasks",subtask:"subtasks",idea:"ideas",queue:"queue_tasks",queue_task:"queue_tasks",shipped:"shipped_items",feature:"roadmap_features",workflow:"custom_workflows",workflow_rule:"workflow_rules",metric:"metrics_daily",work_cost_snapshot:"work_cost_snapshots",velocity:"velocity_sprints",spec:"specs",project:"projects",session:"sessions",agent:"agents"};a(Er,"toCloudTable");yL={memories:"memories",tasks:"tasks",subtasks:"tasks",queue_tasks:"tasks",ideas:"ideas",shipped_items:"shipped",shipped_features:"shipped",custom_workflows:"workflows",workflow_rules:"workflows",metrics_daily:"metrics",work_cost_snapshots:"metrics",velocity_sprints:"metrics",archives:"archives",analysis:"analysis",specs:"specs"},lT={memories:!0,tasks:!0,ideas:!0,shipped:!0,workflows:!0,metrics:!0,archives:!0,user_prompts:!1,agent_sessions:!1,analysis:!0,specs:!0};a(uT,"isTableIncluded");JK=Object.keys(lT)});function EL(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function kL(t){let e={};for(let[n,r]of Object.entries(t))e[EL(n)]=r;return e}function wL(t,e){let[n,r]=e.type.split("."),s=Er(e.entityType)??Er(n);if(!s)return null;let o=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=kL(c),u=e.entityId||(typeof l.id=="string"?l.id:"")||(typeof c.id=="string"?c.id:"")||(typeof l.task_id=="string"?l.task_id:"")||(typeof c.taskId=="string"?c.taskId:"")||(typeof l.entity_id=="string"?l.entity_id:"")||"";u&&l.id==null&&(l.id=u);let d={event_type:o,entity_type:s,entity_id:u,data:{...l,project_id:t},project_id:t};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function dT(t,e){return e.map(n=>wL(t,n)).filter(n=>n!==null)}var pT=h(()=>{"use strict";Kd();a(EL,"camelToSnake");a(kL,"snakeCaseKeys");a(wL,"mapCliEventToWebFormat");a(dT,"mapCliEventsToWebFormat")});var mT={};L(mT,{default:()=>TL,syncClient:()=>ps});var Yd,ps,TL,zd=h(()=>{"use strict";yd();ri();pT();Yd=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=dT(e,n),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,events:o})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof n=="number"&&n>0&&(c.sinceEventId=n);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:n,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${n}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async linkProject(e,n,r){let{apiUrl:s,apiKey:i,deviceId:o}=await this.getAuthHeaders();if(!i)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(i,o)},body:JSON.stringify({projectId:e,...n?{name:n}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async setCloudLifecycle(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();return s?(await this.fetchWithRetry(`${r}/sync/projects/${e}/${n}`,{method:"POST",headers:{...this.authHeaders(s,i)}})).ok:!1}catch{return!1}}async uploadCodeGraph(e,n){try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return{ok:!1};let o=await this.fetchWithRetry(`${r}/sync/projects/${e}/code-graph`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify(n)});if(!o.ok)return{ok:!1};let c=await o.json();return{ok:c.ok!==!1,nodes:c.nodes,links:c.links}}catch{return{ok:!1}}}async publishBenchmark(e,n){let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,i)},body:JSON.stringify({projectId:e,...n})});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async testConnection(){let e=new AbortController,n=setTimeout(()=>e.abort(),Ra("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:i}=await this.getAuthHeaders();if(!s)return clearTimeout(n),!1;let o=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,i)},signal:e.signal});return clearTimeout(n),o.status===401||o.status===403?(await st.clearAuth(),!1):o.ok}catch{return clearTimeout(n),!1}}async hasAuth(){return await st.hasAuth()}async getAuthHeaders(){let[e,n,r]=await Promise.all([st.getApiUrl(),st.getApiKey(),st.getDeviceId()]);return{apiUrl:e,apiKey:n,deviceId:r}}authHeaders(e,n){return{"X-Api-Key":e,"X-Device-Id":n}}async fetchWithRetry(e,n,r=0){let s=new AbortController,i=setTimeout(()=>s.abort(),Ra("API_REQUEST")),o=(n.method??"GET").toUpperCase(),c=o==="GET"||o==="HEAD";try{let l=await fetch(e,{...n,signal:s.signal});if(clearTimeout(i),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}return l}catch(l){if(clearTimeout(i),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${Ra("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,n,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let n=await e.json(),r=n.detail||n.message||n.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await st.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await st.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,n,r){return{code:e,message:n,status:r}}sleep(e){return new Promise(n=>setTimeout(n,e))}},ps=new Yd,TL=ps});import Qd from"node:fs/promises";import gT from"node:path";import{gunzipSync as SL,gzipSync as bL}from"node:zlib";function fT(t){return gT.join(z.getGlobalProjectPath(t),vL)}async function _L(t){if(!_e(t))return null;let e=jt(t),n=[];try{n=y.query(t,"SELECT src, dst, edge_type, confidence FROM code_symbol_edges").map(l=>({src:l.src,dst:l.dst,edgeType:l.edge_type,confidence:l.confidence}))}catch{n=[]}let r=rt(t)??{symbolCount:e.length,edgeCount:n.length,fileCount:new Set(e.map(l=>l.file)).size,builtAt:new Date().toISOString()},s={version:1,projectId:t,exportedAt:new Date().toISOString(),meta:r,symbols:e,edges:n},i=Buffer.from(JSON.stringify(s),"utf-8"),o=bL(i,{level:6}),c=fT(t);return await Qd.mkdir(gT.dirname(c),{recursive:!0}),await Qd.writeFile(c,o),{path:c,bytes:o.length,symbols:e.length,edges:n.length}}async function xL(t){let e=fT(t),n;try{n=await Qd.readFile(e)}catch{return{imported:!1,symbols:0,edges:0,reason:"no per-project artifact"}}let r;try{let s=SL(n).toString("utf-8");r=JSON.parse(s)}catch(s){return{imported:!1,symbols:0,edges:0,reason:`corrupt artifact: ${s instanceof Error?s.message:String(s)}`}}return r.version!==1||!Array.isArray(r.symbols)?{imported:!1,symbols:0,edges:0,reason:"unsupported artifact version"}:r.projectId&&r.projectId!==t?{imported:!1,symbols:0,edges:0,reason:`artifact projectId mismatch (got ${r.projectId}, expected ${t})`}:(y.transaction(t,s=>{s.prepare("DELETE FROM code_symbols").run(),s.prepare("DELETE FROM code_symbol_edges").run();let i=s.prepare(`INSERT INTO code_symbols (id, file, kind, name, qname, start_line, end_line, exported)
|
|
1651
1651
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`),o=s.prepare(`INSERT OR IGNORE INTO code_symbol_edges (src, dst, edge_type, confidence)
|
|
1652
1652
|
VALUES (?, ?, ?, ?)`);for(let c of r.symbols)i.run(c.id,c.file,c.kind,c.name,c.qname,c.startLine,c.endLine,c.exported?1:0);for(let c of r.edges)o.run(c.src,c.dst,c.edgeType,c.confidence)}),y.setDoc(t,"symbol-graph",{...r.meta,builtAt:r.meta.builtAt??r.exportedAt}),{imported:!0,symbols:r.symbols.length,edges:r.edges.length})}async function hT(t){if(_e(t))return{bootstrapped:!1,detail:"local index already present"};let e=await xL(t);return e.imported?{bootstrapped:!0,detail:`imported ${e.symbols} symbols / ${e.edges} edges from per-project cache`}:{bootstrapped:!1,detail:e.reason??"import failed"}}async function yT(t){try{await _L(t)}catch{}try{await RL(t)}catch{}}async function RL(t){let{buildCloudCodeGraphSnapshot:e,isUploadableGraph:n}=await Promise.resolve().then(()=>(cT(),aT)),r=e(t);if(!n(r))return{uploaded:!1,reason:"no symbol index or empty graph"};try{let{default:s}=await Promise.resolve().then(()=>(zd(),mT)),i=await s.uploadCodeGraph(t,r);return i.ok?{uploaded:!0,nodes:i.nodes??r.nodes.length,links:i.links??r.links.length}:{uploaded:!1,reason:"upload failed or unauthenticated"}}catch(s){return{uploaded:!1,reason:s instanceof Error?s.message:String(s)}}}var vL,ET=h(()=>{"use strict";Mt();Ve();O();vL="code-graph.json.gz";a(fT,"artifactPath");a(_L,"exportCodeGraphArtifact");a(xL,"importCodeGraphArtifact");a(hT,"bootstrapCodeGraphFromArtifact");a(yT,"maybeExportAfterIndex");a(RL,"maybeUploadCodeGraphToCloud")});function AL(){let t=ep.map(e=>`"${e}"`).join(", ");return`---
|
|
1653
1653
|
description: "${Zd}"
|
package/package.json
CHANGED