openkitt 0.4.2 → 0.4.3

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.
Files changed (2) hide show
  1. package/dist/cli.js +1 -1
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1431,7 +1431,7 @@ restartPolicyMaxRetries = 3${J}`}function Ry($,z,Z,Y){let J=J8($,"railway.toml")
1431
1431
  `)){let Y=Z.match(/\*\*(.+?)\*\*/);if(Y){let Q=Y[1].trim();if(Q.endsWith(":")||Q.toLowerCase()==="note")continue;z.push(Q);continue}let J=Z.trim();if(J&&/^[a-zA-Z0-9]/.test(J)&&!J.includes(":")&&!J.startsWith("#")&&!J.startsWith("*"))z.push(J)}return z}function my($){try{let z=JSON.parse($);if(Array.isArray(z))return z}catch{}return[]}function ly($){switch($.toUpperCase()){case"SUCCESS":return d.default.green("✓ Success");case"FAILED":return d.default.red("✗ Failed");case"BUILDING":case"DEPLOYING":return d.default.yellow("● In Progress");case"REMOVED":return d.default.dim("○ Removed");case"CRASHED":return d.default.red("✗ Crashed");case"SLEEPING":return d.default.dim("◌ Sleeping");default:return d.default.dim($)}}function py($){try{let z=new Date($);return z.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})+" "+z.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",hour12:!1})}catch{return $}}async function iy($,z,Z,Y){let J=null;try{await Z.guardedCallTool(Y,"link-service",{workspacePath:z,serviceName:$});let K=eJ(`railway domain --json -s ${$}`,{cwd:z,encoding:"utf-8",stdio:"pipe",timeout:1e4}),W=JSON.parse(K);if(W.domains&&W.domains.length>0)J=W.domains[0]}catch{}let Q=d.default.dim("•"),X="";if(J)try{let K=new AbortController,W=setTimeout(()=>K.abort(),5000),G=await fetch(J,{method:"GET",signal:K.signal,redirect:"follow"});if(clearTimeout(W),G.ok)Q=d.default.green("✓"),X=d.default.green("ok");else Q=d.default.red("✗"),X=d.default.red(`${G.status}`)}catch{Q=d.default.red("✗"),X=d.default.red("down")}return{icon:Q,label:X,url:J}}async function l5($,z,Z){let Y=await Y0(process.cwd());if(!Y){E("No KITT workspace found. Run /kitt:init to create one, or /kitt:switch to select an existing workspace.");return}let J=l(Y);if(J.cmd("/deploy:status","START"),!p(Y)){E("Not a KITT workspace."),J.cmd("/deploy:status","FAILED","not a workspace");return}let Q=H0(Y);if(!Q){E("Could not read manifest."),J.cmd("/deploy:status","FAILED","manifest read failed");return}console.log(""),console.log(d.default.bold(d.default.cyan(" Workspace"))),console.log(d.default.dim(" ─────────────────────────────────")),console.log(` Name: ${d.default.white(Q.workspace.name)}`),console.log(` Package manager: ${d.default.white(Q.workspace.packageManager)}`);let X=Q.workspace.railway?.projectId;if(X){let V=cy(X);console.log(` Railway project: ${d.default.white(V??X.slice(0,8)+"...")}`)}else console.log(` Railway project: ${d.default.yellow("Not linked")} ${d.default.dim("(run /kitt:link)")}`);let K=Object.keys(Q.apps);if(console.log(""),console.log(d.default.bold(d.default.cyan(" Apps"))),console.log(d.default.dim(" ─────────────────────────────────")),K.length===0)console.log(d.default.dim(" No apps. Run /create to add one."));else for(let V of K){let f=Q.apps[V];console.log(` ${d.default.green("●")} ${d.default.white(V)} ${d.default.dim(f.framework)}`)}let W=m5(Y,Q),G=[...W.orphanedDirectories.map((V)=>`${V} exists on disk but not in manifest`),...W.missingDirectories.map((V)=>`${V} is in manifest but directory is missing`)];if(G.length>0){console.log(""),console.log(d.default.bold(d.default.yellow(" Drift"))),console.log(d.default.dim(" ─────────────────────────────────"));for(let V of G)console.log(` ${d.default.yellow("⚠")} ${V}`)}if(!X){console.log(""),J.cmd("/deploy:status","SUCCESS");return}let B=null;try{let V=await J$();B=await T$(V),await B.initialize();let f=u$(X),H=await f.guardedCallTool(B,"list-services",{workspacePath:Y}),U=H.content.map((P)=>P.text).join(`
1432
1432
  `),x=H.isError?[]:dy(U),S=x.filter((P)=>(P in Q.apps)),O=x.filter((P)=>!(P in Q.apps));if(O.length>0){console.log(""),console.log(d.default.bold(d.default.cyan(" Railway Templates"))),console.log(d.default.dim(" ─────────────────────────────────"));for(let P of O){let j=null;try{await f.guardedCallTool(B,"link-service",{workspacePath:Y,serviceName:P});let n=eJ(`railway domain --json -s ${P}`,{cwd:Y,encoding:"utf-8",stdio:"pipe",timeout:1e4}),B0=JSON.parse(n);if(B0.domains&&B0.domains.length>0)j=B0.domains[0]}catch{}let _=j?d.default.dim(j):"";console.log(` ${d.default.green("✓")} ${d.default.white(P)} ${_}`)}}if(console.log(""),console.log(d.default.bold(d.default.cyan(" Railway Services"))),console.log(d.default.dim(" ─────────────────────────────────")),H.isError)console.log(` ${d.default.yellow("⚠")} Could not fetch services`);else if(S.length===0)console.log(d.default.dim(" No services. Deploy an app to create one."));else for(let P of S){let{icon:j,label:_,url:n}=await iy(P,Y,f,B),B0=n?d.default.dim(n):d.default.dim("no domain"),Y$=_?` ${_}`:"";console.log(` ${j} ${d.default.white(P)}${Y$} ${B0}`)}let L=await f.guardedCallTool(B,"list-deployments",{workspacePath:Y,limit:5,json:!0}),h=L.content.map((P)=>P.text).join(`
1433
1433
  `);if(console.log(""),console.log(d.default.bold(d.default.cyan(" Recent Deployments"))),console.log(d.default.dim(" ─────────────────────────────────")),L.isError)console.log(` ${d.default.yellow("⚠")} Could not fetch deployments`);else{let P=my(h);if(P.length===0)console.log(d.default.dim(" No deployments yet."));else for(let j of P){let _=ly(j.status),n=py(j.createdAt),B0=j.id.slice(0,8);console.log(` ${_} ${d.default.dim(B0)} ${d.default.dim(n)}`)}}console.log(""),J.cmd("/deploy:status","SUCCESS")}catch(V){let f=V instanceof Error?V.message:String(V);console.log(""),y(`Railway status unavailable: ${f}`),J.cmd("/deploy:status","SUCCESS",f)}finally{B?.close(),await X$()}}j0();f2();var v=w0(A0(),1);import{existsSync as ny,readFileSync as ty}from"node:fs";import{homedir as sy}from"node:os";import{join as ry}from"node:path";W0();var p5={anthropic:"Anthropic",openai:"OpenAI",gemini:"Gemini"},ay=[{value:"anthropic",label:"Anthropic"},{value:"openai",label:"OpenAI"},{value:"gemini",label:"Gemini"}],oy={anthropic:[{value:"claude-sonnet-4-5",label:"claude-sonnet-4-5 (recommended)"},{value:"claude-opus-4-5",label:"claude-opus-4-5"},{value:"claude-3-5-haiku-20241022",label:"claude-3-5-haiku-20241022 (fast & cheap)"}],openai:[{value:"gpt-4o",label:"gpt-4o (recommended)"},{value:"gpt-4o-mini",label:"gpt-4o-mini"},{value:"o1",label:"o1"},{value:"o1-mini",label:"o1-mini"}],gemini:[{value:"gemini-2.0-flash",label:"gemini-2.0-flash (recommended)"},{value:"gemini-2.0-flash-lite",label:"gemini-2.0-flash-lite"},{value:"gemini-1.5-pro",label:"gemini-1.5-pro"}]},_H=[{value:"claude-haiku-4.5",label:"claude-haiku-4.5 (recommended — enabled for all Copilot plans)"},{value:"gpt-4.1",label:"gpt-4.1 (GPT-4.1 — enabled for all Copilot plans)"},{value:"claude-sonnet-4.6",label:"claude-sonnet-4.6 (requires opt-in at github.com/settings/copilot)"},{value:"claude-opus-4.6",label:"claude-opus-4.6 (requires opt-in at github.com/settings/copilot)"}],AH="Iv1.b507a08c87ecfe98";function A1(){return console.log(v.default.yellow("Cancelled.")),!0}function i5($){if($.authType==="github-copilot")return"GitHub Copilot";return p5[$.provider]??$.provider}async function yH(){let $=u0(process.cwd());if(!$)return;let z=H0($);if(!z)return;if(z.workspace.railway?.projectId)return;R(`Workspace "${z.workspace.name}" has no Railway project linked. Run /kitt:link to connect one.`)}async function RH(){let $=await m$();if($.authenticated){console.log(v.default.green("✓ Railway: authenticated")),await yH();return}if($.error==="Railway CLI not installed"){console.log(v.default.red("Railway CLI is not installed. Install Railway CLI first, then run /auth:railway."));return}console.log(v.default.cyan("Opening Railway login in your browser..."));let z=await nz();if(z.authenticated){console.log(v.default.green("✓ Railway: authenticated")),await yH();return}console.log(v.default.red(z.error??"Failed to authenticate with Railway."))}async function ey(){let $=await o({message:"How do you want to connect to an LLM?",options:[{value:"api-key",label:"API Key (Anthropic, OpenAI, or Gemini — pay per token)"},{value:"github-copilot",label:"GitHub Copilot (use your Copilot subscription — Claude, GPT, Gemini included)"}]});if(g($))return A1(),null;return $}async function $R(){let $=await o({message:"Select LLM provider:",options:ay});if(g($))return A1(),null;return $}async function jH($){let z=await o({message:`Select ${p5[$]} model:`,options:oy[$]});if(g(z))return A1(),null;return z}function zR(){try{let $=ry(sy(),".config","gh","hosts.yml");if(!ny($))return null;let z=ty($,"utf-8");for(let Z of z.split(`
1434
- `)){let Y=Z.match(/^\s*oauth_token:\s*(.+)$/);if(Y?.[1])return Y[1].trim()}return null}catch{return null}}async function ZR(){try{let $=await fetch("https://github.com/login/device/code",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({client_id:AH,scope:"read:user"})});if(!$.ok)return console.log(v.default.red("Failed to start GitHub login. Check your internet connection.")),null;let z=await $.json();console.log(),console.log(v.default.bold("GitHub login")),console.log(`Open ${v.default.cyan(z.verification_uri)} and enter code: ${v.default.bold(v.default.yellow(z.user_code))}`),console.log();try{await(await import("open")).default(z.verification_uri)}catch{}let Z=(z.interval??5)*1000,Y=Date.now()+(z.expires_in??900)*1000;while(Date.now()<Y){await new Promise((X)=>setTimeout(X,Z));let J=await fetch("https://github.com/login/oauth/access_token",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({client_id:AH,device_code:z.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"})});if(!J.ok)continue;let Q=await J.json();if(Q.access_token)return Q.access_token;if(Q.error==="authorization_pending")continue;if(Q.error==="slow_down"){await new Promise((X)=>setTimeout(X,Z));continue}return console.log(v.default.red(Q.error_description??`GitHub login failed: ${Q.error}`)),null}return console.log(v.default.red("GitHub login timed out. Run /auth:llm again to retry.")),null}catch{return console.log(v.default.red("GitHub login failed. Check your internet connection.")),null}}async function YR(){let $=zR();if($)return console.log(v.default.dim("Using existing GitHub CLI session.")),$;return console.log(v.default.cyan("No GitHub CLI session found. Opening GitHub login in your browser...")),ZR()}async function JR($){let z=await C$();if(z&&z.authType==="github-copilot"){if(console.log(v.default.green(`✓ GitHub Copilot (${z.model}) already configured`)),!$.yes){let Q=await _0({message:"Change Copilot model or re-authenticate?",initialValue:!1});if(g(Q)){A1();return}if(!Q)return}}let Z=await o({message:"Select model (via GitHub Copilot):",options:_H});if(g(Z)){A1();return}let Y=await YR();if(!Y)return;console.log(v.default.dim("Authenticating with GitHub Copilot..."));let J;try{J=await hz(Y)}catch(Q){let X=Q instanceof Error?Q.message:"Unknown error";console.log(v.default.red(`✗ ${X}`)),console.log(v.default.dim("Make sure your GitHub account has an active Copilot Pro, Pro+, Business, or Enterprise subscription."));return}await Dz(Z,Y,J.token,J.expiresAt),console.log(v.default.green(`✓ GitHub Copilot authenticated (${Z})`))}async function $X($){let z=await C$();if(z&&!$.yes){let X=i5(z);console.log(v.default.green(`✓ LLM ${X} (${z.model}) already configured`));let K=await _0({message:"Change LLM provider/model/key?",initialValue:!1});if(g(K)){A1();return}if(!K)return}let Z=await ey();if(!Z)return;if(Z==="github-copilot"){await JR($);return}let Y=await $R();if(!Y)return;let J=await jH(Y);if(!J)return;let Q=await QQ({message:`Enter your ${p5[Y]} API key:`,validate:(X)=>{if(!X||X.trim().length===0)return"API key is required.";return}});if(g(Q)){A1();return}await bz(Y,J,Q.trim()),console.log(v.default.green(`✓ LLM ${p5[Y]} (${J}) - key stored`))}async function CH(){let $=await C$();if(!$){console.log(v.default.red("No LLM provider configured. Run /auth:llm first."));return}if($.authType==="github-copilot"){let Y=await o({message:"Select model (via GitHub Copilot):",options:_H});if(g(Y)){A1();return}await D9(Y),console.log(v.default.green(`✓ Copilot model changed to ${Y}`));return}let z=$.provider,Z=await jH(z);if(!Z)return;await D9(Z),console.log(v.default.green(`✓ LLM model changed to ${Z}`))}async function XR($){let z=await m$();if(z.authenticated)console.log(v.default.green("✓ Railway: authenticated"));else if(z.error==="Railway CLI not installed")console.log(v.default.red("Railway CLI is not installed. Install Railway CLI first to enable Railway authentication."));else{console.log(v.default.cyan("Railway authentication required. Opening browser login..."));let K=await nz();if(K.authenticated)console.log(v.default.green("✓ Railway: authenticated"));else console.log(v.default.red(K.error??"Failed to authenticate with Railway."))}let[Z,Y]=await Promise.all([Q1(),C$()]);if(Z&&Y){let K=i5(Y);console.log(v.default.green(`✓ LLM ${K} (${Y.model})`))}else await $X($);let[J,Q,X]=await Promise.all([m$(),Q1(),C$()]);if(console.log(),console.log(v.default.bold("Authentication summary")),J.authenticated)console.log(v.default.green("✓ Railway: authenticated"));else if(J.error==="Railway CLI not installed")console.log(v.default.yellow("• Railway: unavailable (Railway CLI not installed)"));else console.log(v.default.yellow("• Railway: not authenticated"));if(Q&&X){let K=i5(X);console.log(v.default.green(`✓ LLM: ${K} (${X.model})`))}else console.log(v.default.yellow("• LLM: not configured"))}async function PH(){let[$,z,Z]=await Promise.all([m$(),Q1(),C$()]),Y=54,J=(G)=>v.default.dim(G),Q=(G)=>{let B=52-G.length;console.log(` ${J("┌─")} ${v.default.bold(v.default.white(G))} ${J("─".repeat(Math.max(0,B))+"┐")}`)},X=()=>console.log(` ${J("└"+"─".repeat(54))}`),K=(G,B,V,f=v.default.white)=>console.log(` ${J("│")} ${G} ${J(B.padEnd(12))} ${f(V)}`),W=(G)=>console.log(` ${J("│")} ${J(G)}`);if(console.log(""),Q("Railway"),$.authenticated)K("✓","status","authenticated",v.default.green);else if($.error==="Railway CLI not installed")K("✗","status","CLI not installed",v.default.yellow),W("Install: https://docs.railway.com/cli");else K("✗","status","not authenticated",v.default.yellow),W("Run /auth:railway to authenticate");if(X(),console.log(""),Q("LLM"),z&&Z){let G=i5(Z);if(K("✓","provider",G,v.default.green),K(" ","model",Z.model,v.default.cyan),Z.authType==="github-copilot")K(" ","auth","GitHub Copilot subscription",v.default.dim);else K(" ","auth","API key",v.default.dim);if(Z.validatedAt){let B=new Date(Z.validatedAt),V=QR(B);K(" ","configured",V,v.default.dim)}}else K("✗","status","not configured",v.default.yellow),W("Run /auth:llm to configure");X(),console.log("")}function QR($){let z=Date.now()-$.getTime(),Z=Math.floor(z/60000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;let Y=Math.floor(Z/60);if(Y<24)return`${Y}h ago`;return`${Math.floor(Y/24)}d ago`}async function KR($){if(!$.yes){let Z=await _0({message:"This will log out of Railway and remove your stored LLM credentials. Continue?",initialValue:!1});if(g(Z)){A1();return}if(!Z){console.log(v.default.yellow("Cancelled."));return}}let[z]=await Promise.all([nQ(),gz()]);if(z)console.log(v.default.green("✓ Railway logged out"));else console.log(v.default.yellow("• Railway logout skipped or not authenticated"));console.log(v.default.green("✓ LLM credentials removed"))}async function Y1($,z,Z="login"){if(Z==="logout"||Z==="auth:logout"){await KR($);return}if(Z==="auth:railway"){await RH();return}if(Z==="auth:llm"){await $X($);return}if(Z==="auth:model"){await CH();return}if(Z==="auth:status"){await PH();return}let Y=z[0]?.toLowerCase();if(!Y){await XR($);return}if(Y==="railway"){await RH();return}if(Y==="llm"){await $X($);return}if(Y==="model"){await CH();return}if(Y==="status"){await PH();return}console.log(v.default.red(`Unknown auth command: ${Y}`)),console.log(v.default.dim("Available: /auth:login, /auth:status, /auth:railway, /auth:llm, /auth:model, /auth:logout"))}j0();q0();var c$=w0(A0(),1);import{existsSync as WR,readFileSync as GR,writeFileSync as BR}from"node:fs";import{join as VR}from"node:path";W0();var n5="Integration",IH="Version",kH="Current",bH="Latest",DH="Status";function fR($){let z=Math.max(n5.length,...$.map((Q)=>Q.integration.length)),Z=Math.max(IH.length,...$.map((Q)=>Q.version.length)),Y=z+6+Z,J=[`${c$.default.bold(n5.padEnd(z))} ${c$.default.bold(IH)}`,c$.default.dim("─".repeat(Y))];for(let Q of $)J.push(`${Q.integration.padEnd(z)} ${Q.version.padEnd(Z)}`);return J}function HR($){let z=Math.max(n5.length,...$.map((K)=>K.integration.length)),Z=Math.max(kH.length,...$.map((K)=>K.currentVersion.length)),Y=Math.max(bH.length,...$.map((K)=>K.latestVersion.length)),J=Math.max(DH.length,10),Q=z+2+Z+2+Y+2+J,X=[`${c$.default.bold(n5.padEnd(z))} ${c$.default.bold(kH.padEnd(Z))} ${c$.default.bold(bH.padEnd(Y))} ${c$.default.bold(DH)}`,c$.default.dim("─".repeat(Q))];for(let K of $){let W=K.updateAvailable?c$.default.yellow("Update"):c$.default.green("Up to date");X.push(`${K.integration.padEnd(z)} ${K.currentVersion.padEnd(Z)} ${K.latestVersion.padEnd(Y)} ${W.padEnd(J)}`)}return X}async function zX($){let z=await Y0(process.cwd());if(!z||!p(z))return E("Not a KITT workspace. Run /kitt:init first."),$.cmd("/versions","FAILED","not a workspace"),null;let Z=VR(z,"versions.md");if(!WR(Z))return E("versions.md not found in workspace root."),$.cmd("/versions","FAILED","versions.md missing"),null;let Y=GR(Z,"utf-8"),J=S8(Y);for(let Q of J.errors)y(Q);return{workspaceDir:z,versionsPath:Z,entries:J.entries}}function hH($,z){BR($.versionsPath,x2(z),"utf-8");let Z=k1(z);b1($.workspaceDir,Z)}async function gH($,z){let Z=await zX($);if(Z===null)return null;R("Checking npm registry for updates...");let Y=await i9(Z.entries);if(Y.length===0)return y("Could not reach npm registry. Check your network connection."),$.cmd("/versions","FAILED",`${z} registry check failed`),null;let J=HR(Y);for(let X of J)console.log(X);let Q=Y.filter((X)=>X.updateAvailable).length;if(Q>0)R(`${Q} updates available. Run /versions:update to apply.`);else X0("All integrations are up to date.");return{...Z,results:Y}}async function UR($){let z=await zX($);if(z===null)return;let Z=fR(z.entries);for(let Y of Z)console.log(Y);R(`${z.entries.length} integrations pinned.`),$.cmd("/versions","SUCCESS")}function xR($,z){if($.startsWith("versions:"))return $.slice(9);return z[0]??null}function TR($,z){if($.startsWith("versions:"))return z;return z.slice(1)}async function qR($){if(await gH($,"/versions check")===null)return;$.cmd("/versions","SUCCESS","/versions check completed")}async function ER($){let z=await gH($,"/versions update");if(z===null)return;let Z=z.results.filter((K)=>K.updateAvailable);if(Z.length===0){$.cmd("/versions","SUCCESS","/versions update completed with no updates");return}let Y=await p2({message:"Select integrations to update:",options:Z.map((K)=>({value:K.integration,label:`${K.integration} ${K.currentVersion} → ${K.latestVersion}`}))});if(g(Y)){y("Version update cancelled."),$.cmd("/versions","FAILED","/versions update cancelled");return}let J=new Set(Y);if(J.size===0){R("No integrations selected for update."),$.cmd("/versions","SUCCESS","/versions update completed with empty selection");return}let Q=new Map(Z.map((K)=>[K.integration,K.latestVersion])),X=z.entries.map((K)=>{let W=Q.get(K.integration);if(!J.has(K.integration)||W===void 0)return K;return{integration:K.integration,version:W}});hH(z,X),X0("versions.md updated"),X0("versions.lock regenerated"),$.cmd("/versions","SUCCESS",`/versions update applied to ${J.size} integration(s)`)}function wR($,z){let Z=TR($,z);if(Z.length!==2)return null;return[Z[0],Z[1]]}async function NR($,z,Z){let Y=wR(z,Z);if(Y===null){E("Usage: /versions set <integration> <version>"),$.cmd("/versions","FAILED","/versions set missing args");return}let[J,Q]=Y;if(!new Set($7).has(J)){E(`Unknown integration: ${J}. Run /versions:list to see available integrations.`),$.cmd("/versions","FAILED",`/versions set unknown integration: ${J}`);return}if(!z7(Q)){E(`Invalid version: ${Q}. Expected format: major.minor.patch`),$.cmd("/versions","FAILED",`/versions set invalid semver: ${Q}`);return}let K=await zX($);if(K===null)return;let W=K.entries.findIndex((B)=>B.integration===J),G=[...K.entries];if(W>=0)G[W]={integration:J,version:Q};else G.push({integration:J,version:Q});hH(K,G),X0(`${J} pinned to ${Q} in versions.md`),X0("versions.lock regenerated"),$.cmd("/versions","SUCCESS",`/versions set pinned ${J} to ${Q}`)}async function c2($,z,Z){let Y=await Y0(process.cwd()),J=l(Y??"."),Q=xR(Z,z);if(!Q||Q==="list"){await UR(J);return}if(Q==="check"){await qR(J);return}if(Q==="update"){await ER(J);return}if(Q==="set"){await NR(J,Z,z);return}y("Unknown versions subcommand: "+Q+". Try: check, update, set")}W0();var t=w0(A0(),1);async function t5($,z,Z){let Y=await Y0(process.cwd());if(!Y){E("No KITT workspace found. Run /kitt:init to create one, or /kitt:switch to select an existing workspace.");return}if(!p(Y)){E("Not a KITT workspace. Run /kitt:init first.");return}let J=N0(Y);if(!J){E("Could not read workspace manifest.");return}console.log(""),SR(J.workspace.name,J.workspace.packageManager),console.log("");let Q=Object.entries(J.apps);if(Q.length===0)console.log(" "+t.default.dim("No apps yet. Run /app:create to add one."));else for(let[K,W]of Q)MR(K,W),console.log("");let X=Object.entries(J.packages);if(X.length>0)LR(X),console.log("")}function SR($,z){let Y=`╭${"─".repeat(56)}╮`,J=`╰${"─".repeat(56)}╯`,Q=54-$.length-z.length;console.log(` ${t.default.dim(Y)}`),console.log(` ${t.default.dim("│")} ${t.default.bold(t.default.white($))}${" ".repeat(Math.max(0,Q))}${t.default.dim(z)} ${t.default.dim("│")}`),console.log(` ${t.default.dim(J)}`)}var FR=[{label:"db",color:t.default.blue,members:["postgresql","mysql","sqlite","drizzle","prisma","database"]},{label:"auth",color:t.default.yellow,members:["better-auth","auth"]},{label:"payments",color:t.default.green,members:["stripe","polar","payments"]},{label:"email",color:t.default.magenta,members:["resend","email"]},{label:"jobs",color:t.default.red,members:["bullmq","trigger-dev","background-jobs","redis"]},{label:"ui",color:t.default.cyan,members:["tailwindcss","shadcn","storybook"]},{label:"testing",color:t.default.yellow,members:["vitest","playwright"]},{label:"observ.",color:t.default.red,members:["sentry","posthog"]}];function OR($){let z=[],Z=new Set;for(let J of FR){let Q=$.filter((X)=>J.members.includes(X)&&!Z.has(X));if(Q.length>0){for(let X of Q)Z.add(X);z.push({label:J.label,color:J.color,items:Q})}}let Y=$.filter((J)=>!Z.has(J));if(Y.length>0)z.push({label:"other",color:t.default.dim,items:Y});return z}function MR($,z){let Y=z.type==="frontend"?t.default.cyan("frontend"):t.default.magenta("backend"),J=`${$} ${z.type} ${z.framework}`,Q=Math.max(0,54-J.length),X=`${t.default.dim("┌")}─ ${t.default.bold(t.default.white($))} ${Y} ${t.default.dim(z.framework)}${" ".repeat(Q)}${t.default.dim("─")}`;if(console.log(` ${X}`),z.integrations.length>0){let G=OR(z.integrations);for(let B of G){let V=t.default.dim(B.label.padEnd(10)),f=B.items.map((H)=>B.color(`[${H}]`)).join(" ");console.log(` ${t.default.dim("│")} ${V} ${f}`)}}else console.log(` ${t.default.dim("│")} ${t.default.dim("no integrations")}`);let K=z.railway?.serviceId??null,W=z.railway?.domain??null;if(console.log(` ${t.default.dim("│")}`),K||W){let G=K?t.default.green("● ")+t.default.dim(K):"",B=W?t.default.cyan("⇢ ")+t.default.underline(t.default.dim(W)):"";console.log(` ${t.default.dim("│")} ${[G,B].filter(Boolean).join(" ")}`)}else console.log(` ${t.default.dim("│")} ${t.default.dim("no railway service")}`);console.log(` ${t.default.dim("└"+"─".repeat(56))}`)}function LR($){console.log(` ${t.default.dim("packages")}`);for(let[z,Z]of $){let Y=Z.consumers.length>0?Z.consumers.map((J)=>t.default.dim(J)).join(t.default.dim(", ")):t.default.dim("—");console.log(` ${t.default.dim("·")} ${t.default.white(z.padEnd(18))} ${Y}`)}}j0();var d2=w0(A0(),1);W0();async function s5($,z){let Z=process.cwd(),Y=u0(Z),J=I0(Z);if(Y){let{dirname:B}=await import("node:path"),V=B(Y),f=I0(V);for(let H of f)if(!J.some((U)=>U.path===H.path))J.push(H)}if(J.length===0&&!Y){E("No KITT workspaces found. Run /kitt:init to create one.");return}let Q=Y??null,X=J.map((B)=>{let V=B.manifest,f=Object.keys(V.apps).length,U=B.path===Q?`${V.workspace.name} ${d2.default.green("(active)")}`:V.workspace.name,x=`${f} app${f!==1?"s":""} · ${V.workspace.packageManager}`;return{value:B.path,label:U,hint:x}});if(X.length<=1){let B=J[0];if(B){let V=B.manifest,f=Object.keys(V.apps).length,H=B.path===Q;console.log(""),console.log(` ${d2.default.bold(V.workspace.name)}${H?d2.default.green(" (active)"):""}`),console.log(` ${d2.default.dim(B.path)}`),console.log(` ${f} app${f!==1?"s":""} · ${V.workspace.packageManager}`),console.log(""),R("Only one workspace found — nothing to switch to.")}else R("Only one workspace available — already active.");return}let K=null;if(z[0]){let B=z[0].toLowerCase(),V=J.find((f)=>f.manifest.workspace.name.toLowerCase()===B);if(V)K=V.path;else{E(`Workspace "${z[0]}" not found.`);return}}else{let B=await o({message:"Switch to workspace:",options:X});if(g(B)){y("Switch cancelled.");return}K=B}if(!K||!p(K)){E("Invalid workspace path.");return}process.chdir(K),H2(K);let G=H0(K)?.workspace.name??K;X0(`Switched to ${d2.default.cyan(G)}`)}var D=w0(A0(),1),X8=56;function AR($){console.log(` ${D.default.dim("╭"+"─".repeat(X8)+"╮")}`);for(let z of $)console.log(` ${D.default.dim("│")} ${z}`);console.log(` ${D.default.dim("╰"+"─".repeat(X8)+"╯")}`)}function y1($){let z=X8-2-$.length;console.log(` ${D.default.dim("┌─")} ${D.default.bold(D.default.white($))} ${D.default.dim("─".repeat(Math.max(0,z))+"┐")}`)}function $0($,z,Z){let Y=`${$} ${z}`,J=Math.max(0,30-Y.length),Q=z?` ${D.default.dim(D.default.italic(z))}`:"";console.log(` ${D.default.dim("│")} ${D.default.cyan($)}${Q}${" ".repeat(J)} ${D.default.dim(Z)}`)}function M$($,z){console.log(` ${D.default.dim("│")} ${D.default.dim($.padEnd(14))} ${D.default.white(z)}`)}function R1(){console.log(` ${D.default.dim("└"+"─".repeat(X8)+"┘")}`),console.log("")}function vH($,z){let Z=$.replace(/\x1b\[[0-9;]*m/g,""),Y=Math.max(0,z-Z.length);return $+" ".repeat(Y)}function yR(){console.log(""),AR([vH(`${D.default.bold(D.default.white("KITT"))} ${D.default.dim("— AI-powered monorepo CLI")}`,X8-1),vH(`${D.default.dim("scaffold · deploy · manage · iterate")}`,X8-1)]),console.log(""),y1("Auth"),$0("/auth:login","","Full auth setup (Railway + LLM)"),$0("/auth:railway","","Authenticate with Railway"),$0("/auth:llm","","Reconfigure LLM provider, model, or auth method"),$0("/auth:model","","Switch active model without re-entering key"),$0("/auth:status","","Show current auth status for Railway and LLM"),$0("/auth:logout","","Remove all stored credentials"),R1(),y1("Workspace Management"),$0("/kitt:init","","Scaffold a new KITT workspace"),$0("/kitt:delete","[name]","Delete a workspace and all its files"),$0("/kitt:switch","[name]","Switch active workspace context"),$0("/kitt:list","","List all reachable workspaces"),$0("/kitt:status","","Workspace overview, drift, and Railway links"),$0("/kitt:link","[projectId]","Link a Railway project to this workspace"),R1(),y1("Apps"),$0("/app:create","","Add a new app to the workspace"),$0("/app:delete","[appName]","Remove an app from the workspace"),$0("/app:list","","List all apps, packages, and Railway services"),$0("/app:run","[appName]","Start an app dev server"),$0("/app:settings","","View or update workspace settings"),R1(),y1("Deploy & Infrastructure"),$0("/deploy:app","[appName]","Deploy an app to Railway"),$0("/deploy:template","<query>","Search and provision a Railway template"),$0("/deploy:delete","[service]","Delete a Railway service"),$0("/deploy:destroy","","Delete entire Railway project (irreversible)"),$0("/deploy:domain","[appName]","Generate or show Railway domain"),$0("/deploy:logs","[appName]","Tail deployment logs"),$0("/deploy:status","","App status and Railway deployment health"),$0("/deploy:health","[appName]","Check if deployed services are up"),$0("/env:create","<name>","Create a new Railway environment"),$0("/env:delete","<name>","Delete a Railway environment"),$0("/env:vars","[service]","List environment variables"),$0("/env:vars set","[service] <k> <v>","Set an environment variable"),R1(),y1("Version Management"),$0("/versions:list","","View all pinned integration versions"),$0("/versions:check","","Check for newer available versions"),$0("/versions:update","","Interactive version update wizard"),$0("/versions:set","<integration> <version>","Pin a specific version"),R1(),y1("Other"),$0("/help","","Show this help message"),$0("/exit","","Exit KITT"),R1(),y1("Frameworks"),M$("full-stack","tanstack-start nextjs"),M$("backend","hono expressjs"),R1(),y1("Integrations"),console.log(` ${D.default.dim("│")} ${D.default.dim("databases")} ${[D.default.blue("[postgresql]"),D.default.blue("[mysql]"),D.default.blue("[sqlite]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("orm")} ${[D.default.cyan("[drizzle]"),D.default.cyan("[prisma]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("auth")} ${D.default.yellow("[better-auth]")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("payments")} ${[D.default.green("[stripe]"),D.default.green("[polar]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("email")} ${D.default.magenta("[resend]")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("queues")} ${[D.default.red("[bullmq]"),D.default.red("[trigger-dev]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("cache")} ${D.default.red("[redis]")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("ui")} ${[D.default.cyan("[tailwindcss]"),D.default.white("[shadcn]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("analytics")} ${[D.default.green("[posthog]"),D.default.red("[sentry]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("testing")} ${[D.default.yellow("[vitest]"),D.default.cyan("[playwright]"),D.default.magenta("[storybook]")].join(" ")}`),R1(),y1("CLI Flags"),M$("--verbose","Enable verbose logging"),M$("-q, --quiet","Suppress output"),M$("--run <cmd>","Run a command non-interactively"),M$("--dry-run","Preview changes without applying"),M$("-y, --yes","Auto-confirm all prompts"),M$("--config <json>","Pass inline JSON config"),M$("--env <name>","Target a specific Railway environment"),M$("--no-update-check","Skip version update check on startup"),M$("--debug","Enable debug output"),M$("-v, --version","Print CLI version"),R1()}async function ZX($,z){yR()}j0();var B2=w0(A0(),1);import{rmSync as RR}from"node:fs";import{resolve as YX}from"node:path";W0();async function JX($,z){let Z=process.cwd(),Y=u0(Z),J=I0(Z);if(Y){let{dirname:H}=await import("node:path"),U=H(Y),x=I0(U);for(let S of x)if(!J.some((O)=>O.path===S.path))J.push(S)}if(J.length===0&&!Y){E("No KITT workspaces found. Run /kitt:init to create one.");return}let Q=null;if(z[0]){let H=z[0].toLowerCase(),U=J.find((x)=>x.manifest.workspace.name.toLowerCase()===H);if(U)Q=U.path;else{E(`Workspace "${z[0]}" not found.`);return}}else if(J.length===1)Q=J[0].path;else{let H=J.map((x)=>{let S=x.manifest,O=Object.keys(S.apps).length,h=x.path===Y?`${S.workspace.name} ${B2.default.green("(active)")}`:S.workspace.name,P=`${O} app${O!==1?"s":""} · ${S.workspace.packageManager}`;return{value:x.path,label:h,hint:P}}),U=await o({message:"Select workspace to delete:",options:H});if(g(U)){y("Delete cancelled.");return}Q=U}if(!Q||!p(Q)){E("Invalid workspace path.");return}let X=YX(Q),K=H0(X);if(!K){E("Could not read workspace manifest.");return}let W=K.workspace.name,G=Object.keys(K.apps).length,B=K.workspace.railway?.projectId;if(console.log(""),console.log(` ${B2.default.bold(W)}`),console.log(` ${B2.default.dim(X)}`),console.log(` ${G} app${G!==1?"s":""} · ${K.workspace.packageManager}`),B)console.log(` ${B2.default.yellow("⚠")} Railway project: ${B2.default.cyan(B)}`);if(console.log(""),B)y("This workspace is linked to a Railway project. The Railway project will NOT be deleted — only local files.");let V=await _0({message:`Delete workspace "${W}" and all its files? This cannot be undone.`});if(g(V)||!V){y("Delete cancelled.");return}if(G>0){let H=await _0({message:`This workspace contains ${G} app${G!==1?"s":""}. Are you absolutely sure?`});if(g(H)||!H){y("Delete cancelled.");return}}let f=j1();if(f&&YX(f)===X){let H=h9();delete H.workspacePath,cz(H)}if(YX(Z).startsWith(X)){let{dirname:H}=await import("node:path");process.chdir(H(X))}if(RR(X,{recursive:!0,force:!0}),X0(`Workspace "${W}" deleted.`),B)R(`Railway project ${B2.default.cyan(B)} was not affected. Delete it manually via the Railway dashboard if needed.`)}var Z$=w0(A0(),1);W0();async function XX($,z){let Z=process.cwd(),Y=u0(Z),J=I0(Z);if(Y){let{dirname:Q}=await import("node:path"),X=Q(Y),K=I0(X);for(let W of K)if(!J.some((G)=>G.path===W.path))J.push(W)}if(J.length===0&&!Y){E("No KITT workspaces found. Run /kitt:init to create one.");return}console.log(""),R(`${Z$.default.bold("KITT Workspaces")} ${Z$.default.dim(`(${J.length} found)`)}`),console.log("");for(let Q of J){let X=Q.manifest,K=Object.keys(X.apps).length,W=Q.path===Y,G=X.workspace.railway?.projectId?Z$.default.green("● linked"):Z$.default.dim("○ unlinked"),B=W?Z$.default.green(" (active)"):"";if(console.log(` ${Z$.default.bold(Z$.default.white(X.workspace.name))}${B} ${Z$.default.dim(`${K} app${K!==1?"s":""}`)} ${G} ${Z$.default.dim(X.workspace.packageManager)}`),console.log(` ${Z$.default.dim(Q.path)}`),K>0)for(let[V,f]of Object.entries(X.apps)){let H=f.type==="frontend"?Z$.default.cyan("frontend"):Z$.default.magenta("backend");console.log(` ${Z$.default.dim("·")} ${V} ${H} ${Z$.default.dim(f.framework)}`)}console.log("")}}var z0=w0(A0(),1);W0();function CR(){let $=process.stdout.columns||80;return Math.max(48,Math.min($-4,100))}function PR($){return $.replace(/\x1b\[[0-9;]*m/g,"")}function KX($){return PR($).length}function WX($,z){if(KX($)<=z)return $;let Z=/\x1b\[[0-9;]*m/g,Y=0,J=0;while(J<$.length&&Y<z-1){Z.lastIndex=J;let Q=Z.exec($);if(Q&&Q.index===J){J+=Q[0].length;continue}Y++,J++}return $.slice(0,J)+z0.default.dim("…")}function uH($,z){let Z=KX($);if(Z>z)return WX($,z);return $+" ".repeat(z-Z)}function _R($,z,Z){let Y=Z?` ${Z}`:"",J=`${z0.default.bold(z0.default.white(z))}${Y}`,Q=$-2-KX(J);console.log(` ${z0.default.dim("┌─")} ${J} ${z0.default.dim("─".repeat(Math.max(0,Q))+"┐")}`)}function U9($,z,Z){let Y=z0.default.dim(z.padEnd(16)),J=$-18,Q=WX(Z,J),X=`${Y} ${Q}`;console.log(` ${z0.default.dim("│")} ${uH(X,$-1)}${z0.default.dim("│")}`)}function x9($,z){console.log(` ${z0.default.dim("│")} ${uH(WX(z,$-1),$-1)}${z0.default.dim("│")}`)}function QX($,z){if(z){let Z=$-2-z.length;console.log(` ${z0.default.dim("├─")} ${z0.default.dim(z)} ${z0.default.dim("─".repeat(Math.max(0,Z))+"┤")}`)}else console.log(` ${z0.default.dim("├"+"─".repeat($+2)+"┤")}`)}function jR($){console.log(` ${z0.default.dim("└"+"─".repeat($+2)+"┘")}`)}function IR($,z,Z){let Y=Z.workspace.name,J=Object.keys(Z.apps).length,Q=Object.keys(Z.packages).length,X=Z.workspace.railway?.projectId,K=z.isActive?z0.default.green("● active"):z0.default.dim("○");_R($,Y,K),U9($,"path",z0.default.dim(z.path)),U9($,"package manager",z0.default.cyan(Z.workspace.packageManager)),U9($,"railway",X?z0.default.green(`● ${X}`):z0.default.dim("○ unlinked"));let W=m5(z.path,Z),G=W.orphanedDirectories.length+W.missingDirectories.length;if(G===0)U9($,"drift",z0.default.green("✓ clean"));else{U9($,"drift",z0.default.yellow(`⚠ ${G} issue${G!==1?"s":""}`));for(let B of W.orphanedDirectories)x9($,` ${z0.default.yellow("+")} ${z0.default.dim(B)}`);for(let B of W.missingDirectories)x9($,` ${z0.default.red("−")} ${z0.default.dim(B)}`)}if(J>0){QX($,`Apps (${J})`);for(let[B,V]of Object.entries(Z.apps)){let H=(V.type==="frontend"?z0.default.cyan:z0.default.magenta)(V.type==="frontend"?"▲":"◆"),U=z0.default.dim(V.framework),x=V.integrations.length>0?z0.default.dim(` · ${V.integrations.join(", ")}`):"";x9($,`${H} ${z0.default.white(B)} ${U}${x}`)}}else QX($,"Apps"),x9($,z0.default.dim("No apps yet — run /app:create"));if(Q>0){QX($,`Packages (${Q})`);let B=Object.keys(Z.packages).join(" · ");x9($,z0.default.dim(B))}jR($)}async function GX($,z){let Z=process.cwd(),Y=u0(Z),J=CR(),Q=[];if(Y){Q.push({path:Y,isActive:!0});let{dirname:X}=await import("node:path"),K=X(Y),W=I0(K);for(let G of W)if(G.path!==Y)Q.push({path:G.path,isActive:!1})}else{let X=I0(Z);if(X.length===0){E("No KITT workspaces found. Run /kitt:init to create one.");return}for(let K of X)Q.push({path:K.path,isActive:!1})}console.log("");for(let X of Q){if(!p(X.path))continue;let K=N0(X.path);if(!K)continue;IR(J,X,K),console.log("")}}j0();var m2=w0(A0(),1);import{execSync as BX}from"node:child_process";import{existsSync as kR,readFileSync as bR}from"node:fs";import{homedir as DR}from"node:os";import{resolve as hR}from"node:path";W0();function cH(){try{let $=BX("railway list --json",{encoding:"utf-8",stdio:"pipe",timeout:15000}).trim();return JSON.parse($).filter((Z)=>!Z.deletedAt)}catch{return[]}}function r5($,z){try{return BX(`railway link -p ${$}`,{encoding:"utf-8",stdio:"pipe",cwd:z,timeout:15000}),!0}catch{return!1}}function gR($){let z=`${DR()}/.railway/config.json`;if(!kR(z))return null;try{let Z=bR(z,"utf-8"),Y=JSON.parse(Z),J=hR($);return Y.projects?.[J]?.project??null}catch{return null}}function vR($,z){try{R(`Creating Railway project "${$}"...`),BX(`railway init --name "${$}"`,{cwd:z,encoding:"utf-8",stdio:"pipe",timeout:30000});let Z=gR(z);if(!Z){let J=cH().find((Q)=>Q.name.toLowerCase()===$.toLowerCase());if(J)return r5(J.id,z),J.id;return E("Could not extract project ID after creation."),null}return r5(Z,z),Z}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);return E(`Failed to create Railway project: ${Y}`),null}}async function VX($,z){let Z=await Y0(process.cwd());if(!Z){E("No KITT workspace found. Run /kitt:init to create one.");return}let Y=H0(Z);if(!Y){E("Could not read workspace manifest.");return}if(Y.workspace.railway?.projectId){let H=Y.workspace.railway.projectId;R(`Workspace "${Y.workspace.name}" is already linked to Railway project ${m2.default.cyan(H)}.`);let U=await _0({message:"Do you want to link to a different project?"});if(g(U)||!U)return}if(!await E8()){E("Railway CLI is not installed. Install it: https://docs.railway.com/cli");return}if(!(await m$()).authenticated){E("Not authenticated with Railway. Run /auth:railway first.");return}if(z[0]){let H=z[0];if(R(`Linking to Railway project ${m2.default.cyan(H)}...`),!r5(H,Z)){E(`Failed to link Railway project. Verify the project ID is correct: ${H}`);return}let x={...Y,workspace:{...Y.workspace,railway:{projectId:H,linkedAt:new Date().toISOString()}}};y0(Z,x),X0(`Workspace "${Y.workspace.name}" linked to Railway project ${m2.default.cyan(H)}.`);return}R("Fetching Railway projects...");let X=cH(),K="__create_new__",W=[{value:K,label:"+ Create new project"},...X.map((H)=>({value:H.id,label:H.name,hint:m2.default.dim(H.id.slice(0,8))}))],G=await o({message:"Select a Railway project to link, or create a new one:",options:W});if(g(G)){y("Link cancelled.");return}let B,V;if(G===K){let H=vR(Y.workspace.name,Z);if(!H)return;B=H,V=Y.workspace.name}else if(B=G,V=X.find((x)=>x.id===G)?.name??B,R(`Linking to ${m2.default.cyan(V)}...`),!r5(B,Z)){E("Failed to link Railway project via Railway CLI.");return}let f={...Y,workspace:{...Y.workspace,railway:{projectId:B,linkedAt:new Date().toISOString()}}};y0(Z,f),X0(`Workspace "${Y.workspace.name}" linked to Railway project ${m2.default.cyan(V)}.`)}q0();var P0=w0(A0(),1);import{execSync as uR}from"node:child_process";y$();W0();var dH=1e4;async function cR($){let z=new AbortController,Z=setTimeout(()=>z.abort(),dH),Y=Date.now();try{let J=await fetch($,{method:"GET",signal:z.signal,redirect:"follow"}),Q=Date.now()-Y;return{status:J.status,ok:J.ok,latency:Q,error:null}}catch(J){let Q=Date.now()-Y,X=J instanceof Error?J.message:String(J);if(X.includes("abort"))return{status:null,ok:!1,latency:Q,error:`Timeout (${dH/1000}s)`};return{status:null,ok:!1,latency:Q,error:X}}finally{clearTimeout(Z)}}function dR($){let z=$.ok?P0.default.green("✓"):P0.default.red("✗"),Z=P0.default.white($.service),Y=$.status!==null?$.ok?P0.default.green(`${$.status}`):P0.default.red(`${$.status}`):P0.default.red("ERR"),J=$.latency!==null?P0.default.dim(`${$.latency}ms`):"",Q=$.url?P0.default.dim($.url):P0.default.dim("no domain"),X=$.error?P0.default.red($.error):"";if($.url)console.log(` ${z} ${Z} ${Y} ${J} ${Q}`);else console.log(` ${z} ${Z} ${P0.default.dim("No public domain")} ${X}`)}async function a5($,z,Z){let Y=await Y0(process.cwd());if(!Y){E("No KITT workspace found. Run /kitt:init to create one, or /kitt:switch to select an existing workspace.");return}let J=l(Y);if(J.cmd("/deploy:health","START"),!p(Y)){E("Not a KITT workspace."),J.cmd("/deploy:health","FAILED","not a workspace");return}let Q=N0(Y);if(!Q){E("Could not read manifest."),J.cmd("/deploy:health","FAILED","manifest read failed");return}let X=Q.workspace.railway?.projectId;if(!X){E("Workspace is not linked to a Railway project. Run /kitt:link first."),J.cmd("/deploy:health","FAILED","no railway project");return}let K=Object.keys(Q.apps);if(K.length===0){E("No apps found in manifest."),J.cmd("/deploy:health","FAILED","no apps");return}let W=z[0]?.trim().toLowerCase(),G=W?K.filter((V)=>V.toLowerCase()===W):K;if(W&&G.length===0){E(`App "${z[0]}" not found.`),J.cmd("/deploy:health","FAILED",`app not found: ${z[0]}`);return}let B=null;try{let V=await J$();B=await T$(V),await B.initialize();let f=u$(X);R("Checking service health..."),console.log(""),console.log(P0.default.bold(P0.default.cyan(" Service Health"))),console.log(P0.default.dim(" ─────────────────────────────────"));let H=[];for(let S of G){let O=null;try{await f.guardedCallTool(B,"link-service",{workspacePath:Y,serviceName:S});let h=uR(`railway domain --json -s ${S}`,{cwd:Y,encoding:"utf-8",stdio:"pipe",timeout:1e4}),P=JSON.parse(h);if(P.domains&&P.domains.length>0)O=P.domains[0]}catch{}if(!O){H.push({service:S,url:null,status:null,ok:!1,latency:null,error:"No domain configured"});continue}let L=await cR(O);H.push({service:S,url:O,status:L.status,ok:L.ok,latency:L.latency,error:L.error})}for(let S of H)dR(S);let U=H.every((S)=>S.ok),x=H.filter((S)=>S.ok).length;if(console.log(""),U)console.log(` ${P0.default.green("All services healthy")} ${P0.default.dim(`(${x}/${H.length})`)}`);else if(x>0)console.log(` ${P0.default.yellow(`${x}/${H.length} services healthy`)}`);else console.log(` ${P0.default.red("No services reachable")} ${P0.default.dim(`(${H.length} checked)`)}`);console.log(""),J.cmd("/deploy:health","SUCCESS")}catch(V){let f=V instanceof Error?V.message:String(V);console.log(""),y(`Health check failed: ${f}`),J.cmd("/deploy:health","FAILED",f)}finally{B?.close(),await X$()}}var mH={name:"openkitt",version:"0.4.2",description:"AI-powered monorepo CLI for Railway deployments",keywords:["cli","scaffolding","monorepo","ai","railway","nextjs","tanstack","hono","express"],homepage:"https://github.com/openkitt/kitt-cli",repository:{type:"git",url:"https://github.com/openkitt/kitt-cli.git"},license:"MIT",author:"KITT Contributors",type:"module",bin:{kitt:"./dist/cli.js",openkitt:"./dist/cli.js"},files:["dist/cli.js","scripts/"],scripts:{build:"bun build src/cli.ts --target=node --outfile=dist/cli.js --external='ts-morph' --external='@ts-morph/common' --minify","build:types":"tsc --noEmit",dev:"bun build src/cli.ts --target=node --outfile=dist/cli.js --external='ts-morph' --external='@ts-morph/common' --watch",kitt:"node dist/cli.js",test:"vitest run","test:watch":"vitest","test:e2e":"npm run build && vitest run --config vitest.config.e2e.ts","test:all":"npm run test && npm run test:e2e"},engines:{node:">=20.0.0"},dependencies:{"@anthropic-ai/sdk":"^0.66.0","@clack/prompts":"^0.11.0","@google/generative-ai":"^0.24.1",commander:"^14.0.1",openai:"^6.6.0",picocolors:"^1.1.1","ts-morph":"^27.0.0"},devDependencies:{"@types/node":"^24.3.0",typescript:"^5.9.2",vitest:"^3.2.4"}};var T9=mH.version,Q8="kitt",ZC=86400000,YC=5000,JC=new Set(["init","kitt:init","create","app:create","delete","app:delete","kitt:delete","deploy","deploy:app","deploy:template","deploy:delete","deploy:destroy","env:create","env:vars","env:delete","domain","deploy:domain","publish"]),nH=iH(eR(),".kitt"),fX=iH(nH,"update-check.json"),o5={"app:create":{handler:k5},"app:delete":{handler:D5},"app:list":{handler:t5},"app:run":{handler:I5},"app:settings":{handler:j5},"deploy:app":{handler:v5},"deploy:template":{handler:rJ},"deploy:delete":{handler:aJ},"deploy:destroy":{handler:u5},"deploy:domain":{handler:c5},"deploy:logs":{handler:d5},"deploy:status":{handler:l5},"deploy:health":{handler:a5},"auth:login":{handler:Y1},"auth:logout":{handler:Y1},"auth:railway":{handler:Y1},"auth:llm":{handler:Y1},"auth:model":{handler:Y1},"auth:status":{handler:Y1},"versions:list":{handler:c2},"versions:check":{handler:c2},"versions:update":{handler:c2},"versions:set":{handler:c2},"env:create":{handler:H9},"env:vars":{handler:H9},"env:delete":{handler:H9},"kitt:init":{handler:n9},"kitt:delete":{handler:JX},"kitt:switch":{handler:s5},"kitt:list":{handler:XX},"kitt:status":{handler:GX},"kitt:link":{handler:VX},create:{handler:k5},delete:{handler:D5},deploy:{handler:v5},domain:{handler:c5},logs:{handler:d5},list:{handler:t5},run:{handler:I5},settings:{handler:j5},init:{handler:n9},switch:{handler:s5},status:{handler:l5},health:{handler:a5},login:{handler:Y1},logout:{handler:Y1},versions:{handler:c2},help:{handler:ZX},destroy:{handler:u5}};function XC(){console.log(L0.default.cyan(" ______ _______________________")),console.log(L0.default.cyan(" ___ //_/___ /__ __/__ __/")),console.log(L0.default.cyan(" __ ,< __ / __ / __ / ")),console.log(L0.default.cyan(" _ /| | __/ / _ / _ / ")),console.log(L0.default.cyan(" /_/ |_| /___/ /_/ /_/ ")),console.log(""),console.log(` ${L0.default.bold(L0.default.white("KITT"))} ${L0.default.dim("v"+T9)} ${L0.default.dim("— AI-Powered App Scaffolding CLI")}`),console.log(` ${L0.default.dim("/auth:login → /kitt:init → /app:create → /deploy:app")}`),console.log(` ${L0.default.dim("Type /help for all commands")}`),console.log("")}function QC($){if(u0($))return;let z=I0($);if(z.length===0)return;let Z=j1(),Y=!!(Z&&p(Z));if(z.length===1)return;if(console.log(` ${L0.default.dim(`${z.length} kitt spaces`)}`),Y){let Q=H0(Z)?.workspace.name??Z;console.log(` ${L0.default.dim("Last active:")} ${L0.default.cyan(Q)}`)}console.log("")}function KC($){let z=/"([^"]*)"|'([^']*)'|`([^`]*)`|(\S+)/g,Z=[],Y=z.exec($);while(Y!==null)Z.push(Y[1]??Y[2]??Y[3]??Y[4]),Y=z.exec($);return Z}function tH($){let z=$.trim();if(z.length===0)return;let Z=KC(z);if(Z.length===0)return;let Y=Z[0],J=Y.startsWith("/")?Y:`/${Y}`;return{key:J.slice(1).toLowerCase(),displayName:J,args:Z.slice(1)}}function WC($,z){let Z=(X)=>{let K=X.trim().replace(/^v/i,""),[W,...G]=K.split("-");return{parts:W.split(".").map((B)=>Number.parseInt(B,10)).map((B)=>Number.isFinite(B)?B:0),prerelease:G.length>0}},Y=Z($),J=Z(z),Q=Math.max(Y.parts.length,J.parts.length);for(let X=0;X<Q;X+=1){let K=Y.parts[X]??0,W=J.parts[X]??0;if(K>W)return!0;if(K<W)return!1}if(!Y.prerelease&&J.prerelease)return!0;return!1}function GC($){if(!tR(fX))return!1;try{let z=rR(fX,"utf-8").trim();if(z.length===0)return!1;let Z=JSON.parse(z);if(typeof Z.checkedAt!=="string")return!1;let Y=Date.parse(Z.checkedAt);if(!Number.isFinite(Y))return!1;return $.getTime()-Y<ZC}catch{return!1}}function BC($,z){sR(nH,{recursive:!0});let Z={checkedAt:$.toISOString(),latestVersion:z};aR(fX,`${JSON.stringify(Z,null,2)}
1434
+ `)){let Y=Z.match(/^\s*oauth_token:\s*(.+)$/);if(Y?.[1])return Y[1].trim()}return null}catch{return null}}async function ZR(){try{let $=await fetch("https://github.com/login/device/code",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({client_id:AH,scope:"read:user"})});if(!$.ok)return console.log(v.default.red("Failed to start GitHub login. Check your internet connection.")),null;let z=await $.json();console.log(),console.log(v.default.bold("GitHub login")),console.log(`Open ${v.default.cyan(z.verification_uri)} and enter code: ${v.default.bold(v.default.yellow(z.user_code))}`),console.log();try{await(await import("open")).default(z.verification_uri)}catch{}let Z=(z.interval??5)*1000,Y=Date.now()+(z.expires_in??900)*1000;while(Date.now()<Y){await new Promise((X)=>setTimeout(X,Z));let J=await fetch("https://github.com/login/oauth/access_token",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({client_id:AH,device_code:z.device_code,grant_type:"urn:ietf:params:oauth:grant-type:device_code"})});if(!J.ok)continue;let Q=await J.json();if(Q.access_token)return Q.access_token;if(Q.error==="authorization_pending")continue;if(Q.error==="slow_down"){await new Promise((X)=>setTimeout(X,Z));continue}return console.log(v.default.red(Q.error_description??`GitHub login failed: ${Q.error}`)),null}return console.log(v.default.red("GitHub login timed out. Run /auth:llm again to retry.")),null}catch{return console.log(v.default.red("GitHub login failed. Check your internet connection.")),null}}async function YR(){let $=zR();if($)return console.log(v.default.dim("Using existing GitHub CLI session.")),$;return console.log(v.default.cyan("No GitHub CLI session found. Opening GitHub login in your browser...")),ZR()}async function JR($){let z=await C$();if(z&&z.authType==="github-copilot"){if(console.log(v.default.green(`✓ GitHub Copilot (${z.model}) already configured`)),!$.yes){let Q=await _0({message:"Change Copilot model or re-authenticate?",initialValue:!1});if(g(Q)){A1();return}if(!Q)return}}let Z=await o({message:"Select model (via GitHub Copilot):",options:_H});if(g(Z)){A1();return}let Y=await YR();if(!Y)return;console.log(v.default.dim("Authenticating with GitHub Copilot..."));let J;try{J=await hz(Y)}catch(Q){let X=Q instanceof Error?Q.message:"Unknown error";console.log(v.default.red(`✗ ${X}`)),console.log(v.default.dim("Make sure your GitHub account has an active Copilot Pro, Pro+, Business, or Enterprise subscription."));return}await Dz(Z,Y,J.token,J.expiresAt),console.log(v.default.green(`✓ GitHub Copilot authenticated (${Z})`))}async function $X($){let z=await C$();if(z&&!$.yes){let X=i5(z);console.log(v.default.green(`✓ LLM ${X} (${z.model}) already configured`));let K=await _0({message:"Change LLM provider/model/key?",initialValue:!1});if(g(K)){A1();return}if(!K)return}let Z=await ey();if(!Z)return;if(Z==="github-copilot"){await JR($);return}let Y=await $R();if(!Y)return;let J=await jH(Y);if(!J)return;let Q=await QQ({message:`Enter your ${p5[Y]} API key:`,validate:(X)=>{if(!X||X.trim().length===0)return"API key is required.";return}});if(g(Q)){A1();return}await bz(Y,J,Q.trim()),console.log(v.default.green(`✓ LLM ${p5[Y]} (${J}) - key stored`))}async function CH(){let $=await C$();if(!$){console.log(v.default.red("No LLM provider configured. Run /auth:llm first."));return}if($.authType==="github-copilot"){let Y=await o({message:"Select model (via GitHub Copilot):",options:_H});if(g(Y)){A1();return}await D9(Y),console.log(v.default.green(`✓ Copilot model changed to ${Y}`));return}let z=$.provider,Z=await jH(z);if(!Z)return;await D9(Z),console.log(v.default.green(`✓ LLM model changed to ${Z}`))}async function XR($){let z=await m$();if(z.authenticated)console.log(v.default.green("✓ Railway: authenticated"));else if(z.error==="Railway CLI not installed")console.log(v.default.red("Railway CLI is not installed. Install Railway CLI first to enable Railway authentication."));else{console.log(v.default.cyan("Railway authentication required. Opening browser login..."));let K=await nz();if(K.authenticated)console.log(v.default.green("✓ Railway: authenticated"));else console.log(v.default.red(K.error??"Failed to authenticate with Railway."))}let[Z,Y]=await Promise.all([Q1(),C$()]);if(Z&&Y){let K=i5(Y);console.log(v.default.green(`✓ LLM ${K} (${Y.model})`))}else await $X($);let[J,Q,X]=await Promise.all([m$(),Q1(),C$()]);if(console.log(),console.log(v.default.bold("Authentication summary")),J.authenticated)console.log(v.default.green("✓ Railway: authenticated"));else if(J.error==="Railway CLI not installed")console.log(v.default.yellow("• Railway: unavailable (Railway CLI not installed)"));else console.log(v.default.yellow("• Railway: not authenticated"));if(Q&&X){let K=i5(X);console.log(v.default.green(`✓ LLM: ${K} (${X.model})`))}else console.log(v.default.yellow("• LLM: not configured"))}async function PH(){let[$,z,Z]=await Promise.all([m$(),Q1(),C$()]),Y=54,J=(G)=>v.default.dim(G),Q=(G)=>{let B=52-G.length;console.log(` ${J("┌─")} ${v.default.bold(v.default.white(G))} ${J("─".repeat(Math.max(0,B))+"┐")}`)},X=()=>console.log(` ${J("└"+"─".repeat(54))}`),K=(G,B,V,f=v.default.white)=>console.log(` ${J("│")} ${G} ${J(B.padEnd(12))} ${f(V)}`),W=(G)=>console.log(` ${J("│")} ${J(G)}`);if(console.log(""),Q("Railway"),$.authenticated)K("✓","status","authenticated",v.default.green);else if($.error==="Railway CLI not installed")K("✗","status","CLI not installed",v.default.yellow),W("Install: https://docs.railway.com/cli");else K("✗","status","not authenticated",v.default.yellow),W("Run /auth:railway to authenticate");if(X(),console.log(""),Q("LLM"),z&&Z){let G=i5(Z);if(K("✓","provider",G,v.default.green),K(" ","model",Z.model,v.default.cyan),Z.authType==="github-copilot")K(" ","auth","GitHub Copilot subscription",v.default.dim);else K(" ","auth","API key",v.default.dim);if(Z.validatedAt){let B=new Date(Z.validatedAt),V=QR(B);K(" ","configured",V,v.default.dim)}}else K("✗","status","not configured",v.default.yellow),W("Run /auth:llm to configure");X(),console.log("")}function QR($){let z=Date.now()-$.getTime(),Z=Math.floor(z/60000);if(Z<1)return"just now";if(Z<60)return`${Z}m ago`;let Y=Math.floor(Z/60);if(Y<24)return`${Y}h ago`;return`${Math.floor(Y/24)}d ago`}async function KR($){if(!$.yes){let Z=await _0({message:"This will log out of Railway and remove your stored LLM credentials. Continue?",initialValue:!1});if(g(Z)){A1();return}if(!Z){console.log(v.default.yellow("Cancelled."));return}}let[z]=await Promise.all([nQ(),gz()]);if(z)console.log(v.default.green("✓ Railway logged out"));else console.log(v.default.yellow("• Railway logout skipped or not authenticated"));console.log(v.default.green("✓ LLM credentials removed"))}async function Y1($,z,Z="login"){if(Z==="logout"||Z==="auth:logout"){await KR($);return}if(Z==="auth:railway"){await RH();return}if(Z==="auth:llm"){await $X($);return}if(Z==="auth:model"){await CH();return}if(Z==="auth:status"){await PH();return}let Y=z[0]?.toLowerCase();if(!Y){await XR($);return}if(Y==="railway"){await RH();return}if(Y==="llm"){await $X($);return}if(Y==="model"){await CH();return}if(Y==="status"){await PH();return}console.log(v.default.red(`Unknown auth command: ${Y}`)),console.log(v.default.dim("Available: /auth:login, /auth:status, /auth:railway, /auth:llm, /auth:model, /auth:logout"))}j0();q0();var c$=w0(A0(),1);import{existsSync as WR,readFileSync as GR,writeFileSync as BR}from"node:fs";import{join as VR}from"node:path";W0();var n5="Integration",IH="Version",kH="Current",bH="Latest",DH="Status";function fR($){let z=Math.max(n5.length,...$.map((Q)=>Q.integration.length)),Z=Math.max(IH.length,...$.map((Q)=>Q.version.length)),Y=z+6+Z,J=[`${c$.default.bold(n5.padEnd(z))} ${c$.default.bold(IH)}`,c$.default.dim("─".repeat(Y))];for(let Q of $)J.push(`${Q.integration.padEnd(z)} ${Q.version.padEnd(Z)}`);return J}function HR($){let z=Math.max(n5.length,...$.map((K)=>K.integration.length)),Z=Math.max(kH.length,...$.map((K)=>K.currentVersion.length)),Y=Math.max(bH.length,...$.map((K)=>K.latestVersion.length)),J=Math.max(DH.length,10),Q=z+2+Z+2+Y+2+J,X=[`${c$.default.bold(n5.padEnd(z))} ${c$.default.bold(kH.padEnd(Z))} ${c$.default.bold(bH.padEnd(Y))} ${c$.default.bold(DH)}`,c$.default.dim("─".repeat(Q))];for(let K of $){let W=K.updateAvailable?c$.default.yellow("Update"):c$.default.green("Up to date");X.push(`${K.integration.padEnd(z)} ${K.currentVersion.padEnd(Z)} ${K.latestVersion.padEnd(Y)} ${W.padEnd(J)}`)}return X}async function zX($){let z=await Y0(process.cwd());if(!z||!p(z))return E("Not a KITT workspace. Run /kitt:init first."),$.cmd("/versions","FAILED","not a workspace"),null;let Z=VR(z,"versions.md");if(!WR(Z))return E("versions.md not found in workspace root."),$.cmd("/versions","FAILED","versions.md missing"),null;let Y=GR(Z,"utf-8"),J=S8(Y);for(let Q of J.errors)y(Q);return{workspaceDir:z,versionsPath:Z,entries:J.entries}}function hH($,z){BR($.versionsPath,x2(z),"utf-8");let Z=k1(z);b1($.workspaceDir,Z)}async function gH($,z){let Z=await zX($);if(Z===null)return null;R("Checking npm registry for updates...");let Y=await i9(Z.entries);if(Y.length===0)return y("Could not reach npm registry. Check your network connection."),$.cmd("/versions","FAILED",`${z} registry check failed`),null;let J=HR(Y);for(let X of J)console.log(X);let Q=Y.filter((X)=>X.updateAvailable).length;if(Q>0)R(`${Q} updates available. Run /versions:update to apply.`);else X0("All integrations are up to date.");return{...Z,results:Y}}async function UR($){let z=await zX($);if(z===null)return;let Z=fR(z.entries);for(let Y of Z)console.log(Y);R(`${z.entries.length} integrations pinned.`),$.cmd("/versions","SUCCESS")}function xR($,z){if($.startsWith("versions:"))return $.slice(9);return z[0]??null}function TR($,z){if($.startsWith("versions:"))return z;return z.slice(1)}async function qR($){if(await gH($,"/versions check")===null)return;$.cmd("/versions","SUCCESS","/versions check completed")}async function ER($){let z=await gH($,"/versions update");if(z===null)return;let Z=z.results.filter((K)=>K.updateAvailable);if(Z.length===0){$.cmd("/versions","SUCCESS","/versions update completed with no updates");return}let Y=await p2({message:"Select integrations to update:",options:Z.map((K)=>({value:K.integration,label:`${K.integration} ${K.currentVersion} → ${K.latestVersion}`}))});if(g(Y)){y("Version update cancelled."),$.cmd("/versions","FAILED","/versions update cancelled");return}let J=new Set(Y);if(J.size===0){R("No integrations selected for update."),$.cmd("/versions","SUCCESS","/versions update completed with empty selection");return}let Q=new Map(Z.map((K)=>[K.integration,K.latestVersion])),X=z.entries.map((K)=>{let W=Q.get(K.integration);if(!J.has(K.integration)||W===void 0)return K;return{integration:K.integration,version:W}});hH(z,X),X0("versions.md updated"),X0("versions.lock regenerated"),$.cmd("/versions","SUCCESS",`/versions update applied to ${J.size} integration(s)`)}function wR($,z){let Z=TR($,z);if(Z.length!==2)return null;return[Z[0],Z[1]]}async function NR($,z,Z){let Y=wR(z,Z);if(Y===null){E("Usage: /versions set <integration> <version>"),$.cmd("/versions","FAILED","/versions set missing args");return}let[J,Q]=Y;if(!new Set($7).has(J)){E(`Unknown integration: ${J}. Run /versions:list to see available integrations.`),$.cmd("/versions","FAILED",`/versions set unknown integration: ${J}`);return}if(!z7(Q)){E(`Invalid version: ${Q}. Expected format: major.minor.patch`),$.cmd("/versions","FAILED",`/versions set invalid semver: ${Q}`);return}let K=await zX($);if(K===null)return;let W=K.entries.findIndex((B)=>B.integration===J),G=[...K.entries];if(W>=0)G[W]={integration:J,version:Q};else G.push({integration:J,version:Q});hH(K,G),X0(`${J} pinned to ${Q} in versions.md`),X0("versions.lock regenerated"),$.cmd("/versions","SUCCESS",`/versions set pinned ${J} to ${Q}`)}async function c2($,z,Z){let Y=await Y0(process.cwd()),J=l(Y??"."),Q=xR(Z,z);if(!Q||Q==="list"){await UR(J);return}if(Q==="check"){await qR(J);return}if(Q==="update"){await ER(J);return}if(Q==="set"){await NR(J,Z,z);return}y("Unknown versions subcommand: "+Q+". Try: check, update, set")}W0();var t=w0(A0(),1);async function t5($,z,Z){let Y=await Y0(process.cwd());if(!Y){E("No KITT workspace found. Run /kitt:init to create one, or /kitt:switch to select an existing workspace.");return}if(!p(Y)){E("Not a KITT workspace. Run /kitt:init first.");return}let J=N0(Y);if(!J){E("Could not read workspace manifest.");return}console.log(""),SR(J.workspace.name,J.workspace.packageManager),console.log("");let Q=Object.entries(J.apps);if(Q.length===0)console.log(" "+t.default.dim("No apps yet. Run /app:create to add one."));else for(let[K,W]of Q)MR(K,W),console.log("");let X=Object.entries(J.packages);if(X.length>0)LR(X),console.log("")}function SR($,z){let Y=`╭${"─".repeat(56)}╮`,J=`╰${"─".repeat(56)}╯`,Q=54-$.length-z.length;console.log(` ${t.default.dim(Y)}`),console.log(` ${t.default.dim("│")} ${t.default.bold(t.default.white($))}${" ".repeat(Math.max(0,Q))}${t.default.dim(z)} ${t.default.dim("│")}`),console.log(` ${t.default.dim(J)}`)}var FR=[{label:"db",color:t.default.blue,members:["postgresql","mysql","sqlite","drizzle","prisma","database"]},{label:"auth",color:t.default.yellow,members:["better-auth","auth"]},{label:"payments",color:t.default.green,members:["stripe","polar","payments"]},{label:"email",color:t.default.magenta,members:["resend","email"]},{label:"jobs",color:t.default.red,members:["bullmq","trigger-dev","background-jobs","redis"]},{label:"ui",color:t.default.cyan,members:["tailwindcss","shadcn","storybook"]},{label:"testing",color:t.default.yellow,members:["vitest","playwright"]},{label:"observ.",color:t.default.red,members:["sentry","posthog"]}];function OR($){let z=[],Z=new Set;for(let J of FR){let Q=$.filter((X)=>J.members.includes(X)&&!Z.has(X));if(Q.length>0){for(let X of Q)Z.add(X);z.push({label:J.label,color:J.color,items:Q})}}let Y=$.filter((J)=>!Z.has(J));if(Y.length>0)z.push({label:"other",color:t.default.dim,items:Y});return z}function MR($,z){let Y=z.type==="frontend"?t.default.cyan("frontend"):t.default.magenta("backend"),J=`${$} ${z.type} ${z.framework}`,Q=Math.max(0,54-J.length),X=`${t.default.dim("┌")}─ ${t.default.bold(t.default.white($))} ${Y} ${t.default.dim(z.framework)}${" ".repeat(Q)}${t.default.dim("─")}`;if(console.log(` ${X}`),z.integrations.length>0){let G=OR(z.integrations);for(let B of G){let V=t.default.dim(B.label.padEnd(10)),f=B.items.map((H)=>B.color(`[${H}]`)).join(" ");console.log(` ${t.default.dim("│")} ${V} ${f}`)}}else console.log(` ${t.default.dim("│")} ${t.default.dim("no integrations")}`);let K=z.railway?.serviceId??null,W=z.railway?.domain??null;if(console.log(` ${t.default.dim("│")}`),K||W){let G=K?t.default.green("● ")+t.default.dim(K):"",B=W?t.default.cyan("⇢ ")+t.default.underline(t.default.dim(W)):"";console.log(` ${t.default.dim("│")} ${[G,B].filter(Boolean).join(" ")}`)}else console.log(` ${t.default.dim("│")} ${t.default.dim("no railway service")}`);console.log(` ${t.default.dim("└"+"─".repeat(56))}`)}function LR($){console.log(` ${t.default.dim("packages")}`);for(let[z,Z]of $){let Y=Z.consumers.length>0?Z.consumers.map((J)=>t.default.dim(J)).join(t.default.dim(", ")):t.default.dim("—");console.log(` ${t.default.dim("·")} ${t.default.white(z.padEnd(18))} ${Y}`)}}j0();var d2=w0(A0(),1);W0();async function s5($,z){let Z=process.cwd(),Y=u0(Z),J=I0(Z);if(Y){let{dirname:B}=await import("node:path"),V=B(Y),f=I0(V);for(let H of f)if(!J.some((U)=>U.path===H.path))J.push(H)}if(J.length===0&&!Y){E("No KITT workspaces found. Run /kitt:init to create one.");return}let Q=Y??null,X=J.map((B)=>{let V=B.manifest,f=Object.keys(V.apps).length,U=B.path===Q?`${V.workspace.name} ${d2.default.green("(active)")}`:V.workspace.name,x=`${f} app${f!==1?"s":""} · ${V.workspace.packageManager}`;return{value:B.path,label:U,hint:x}});if(X.length<=1){let B=J[0];if(B){let V=B.manifest,f=Object.keys(V.apps).length,H=B.path===Q;console.log(""),console.log(` ${d2.default.bold(V.workspace.name)}${H?d2.default.green(" (active)"):""}`),console.log(` ${d2.default.dim(B.path)}`),console.log(` ${f} app${f!==1?"s":""} · ${V.workspace.packageManager}`),console.log(""),R("Only one workspace found — nothing to switch to.")}else R("Only one workspace available — already active.");return}let K=null;if(z[0]){let B=z[0].toLowerCase(),V=J.find((f)=>f.manifest.workspace.name.toLowerCase()===B);if(V)K=V.path;else{E(`Workspace "${z[0]}" not found.`);return}}else{let B=await o({message:"Switch to workspace:",options:X});if(g(B)){y("Switch cancelled.");return}K=B}if(!K||!p(K)){E("Invalid workspace path.");return}process.chdir(K),H2(K);let G=H0(K)?.workspace.name??K;X0(`Switched to ${d2.default.cyan(G)}`)}var D=w0(A0(),1),X8=56;function AR($){console.log(` ${D.default.dim("╭"+"─".repeat(X8)+"╮")}`);for(let z of $)console.log(` ${D.default.dim("│")} ${z}`);console.log(` ${D.default.dim("╰"+"─".repeat(X8)+"╯")}`)}function y1($){let z=X8-2-$.length;console.log(` ${D.default.dim("┌─")} ${D.default.bold(D.default.white($))} ${D.default.dim("─".repeat(Math.max(0,z))+"┐")}`)}function $0($,z,Z){let Y=`${$} ${z}`,J=Math.max(0,30-Y.length),Q=z?` ${D.default.dim(D.default.italic(z))}`:"";console.log(` ${D.default.dim("│")} ${D.default.cyan($)}${Q}${" ".repeat(J)} ${D.default.dim(Z)}`)}function M$($,z){console.log(` ${D.default.dim("│")} ${D.default.dim($.padEnd(14))} ${D.default.white(z)}`)}function R1(){console.log(` ${D.default.dim("└"+"─".repeat(X8)+"┘")}`),console.log("")}function vH($,z){let Z=$.replace(/\x1b\[[0-9;]*m/g,""),Y=Math.max(0,z-Z.length);return $+" ".repeat(Y)}function yR(){console.log(""),AR([vH(`${D.default.bold(D.default.white("KITT"))} ${D.default.dim("— AI-powered monorepo CLI")}`,X8-1),vH(`${D.default.dim("scaffold · deploy · manage · iterate")}`,X8-1)]),console.log(""),y1("Auth"),$0("/auth:login","","Full auth setup (Railway + LLM)"),$0("/auth:railway","","Authenticate with Railway"),$0("/auth:llm","","Reconfigure LLM provider, model, or auth method"),$0("/auth:model","","Switch active model without re-entering key"),$0("/auth:status","","Show current auth status for Railway and LLM"),$0("/auth:logout","","Remove all stored credentials"),R1(),y1("Workspace Management"),$0("/kitt:init","","Scaffold a new KITT workspace"),$0("/kitt:delete","[name]","Delete a workspace and all its files"),$0("/kitt:switch","[name]","Switch active workspace context"),$0("/kitt:list","","List all reachable workspaces"),$0("/kitt:status","","Workspace overview, drift, and Railway links"),$0("/kitt:link","[projectId]","Link a Railway project to this workspace"),R1(),y1("Apps"),$0("/app:create","","Add a new app to the workspace"),$0("/app:delete","[appName]","Remove an app from the workspace"),$0("/app:list","","List all apps, packages, and Railway services"),$0("/app:run","[appName]","Start an app dev server"),$0("/app:settings","","View or update workspace settings"),R1(),y1("Deploy & Infrastructure"),$0("/deploy:app","[appName]","Deploy an app to Railway"),$0("/deploy:template","<query>","Search and provision a Railway template"),$0("/deploy:delete","[service]","Delete a Railway service"),$0("/deploy:destroy","","Delete entire Railway project (irreversible)"),$0("/deploy:domain","[appName]","Generate or show Railway domain"),$0("/deploy:logs","[appName]","Tail deployment logs"),$0("/deploy:status","","App status and Railway deployment health"),$0("/deploy:health","[appName]","Check if deployed services are up"),$0("/env:create","<name>","Create a new Railway environment"),$0("/env:delete","<name>","Delete a Railway environment"),$0("/env:vars","[service]","List environment variables"),$0("/env:vars set","[service] <k> <v>","Set an environment variable"),R1(),y1("Version Management"),$0("/versions:list","","View all pinned integration versions"),$0("/versions:check","","Check for newer available versions"),$0("/versions:update","","Interactive version update wizard"),$0("/versions:set","<integration> <version>","Pin a specific version"),R1(),y1("Other"),$0("/help","","Show this help message"),$0("/exit","","Exit KITT"),R1(),y1("Frameworks"),M$("full-stack","tanstack-start nextjs"),M$("backend","hono expressjs"),R1(),y1("Integrations"),console.log(` ${D.default.dim("│")} ${D.default.dim("databases")} ${[D.default.blue("[postgresql]"),D.default.blue("[mysql]"),D.default.blue("[sqlite]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("orm")} ${[D.default.cyan("[drizzle]"),D.default.cyan("[prisma]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("auth")} ${D.default.yellow("[better-auth]")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("payments")} ${[D.default.green("[stripe]"),D.default.green("[polar]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("email")} ${D.default.magenta("[resend]")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("queues")} ${[D.default.red("[bullmq]"),D.default.red("[trigger-dev]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("cache")} ${D.default.red("[redis]")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("ui")} ${[D.default.cyan("[tailwindcss]"),D.default.white("[shadcn]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("analytics")} ${[D.default.green("[posthog]"),D.default.red("[sentry]")].join(" ")}`),console.log(` ${D.default.dim("│")} ${D.default.dim("testing")} ${[D.default.yellow("[vitest]"),D.default.cyan("[playwright]"),D.default.magenta("[storybook]")].join(" ")}`),R1(),y1("CLI Flags"),M$("--verbose","Enable verbose logging"),M$("-q, --quiet","Suppress output"),M$("--run <cmd>","Run a command non-interactively"),M$("--dry-run","Preview changes without applying"),M$("-y, --yes","Auto-confirm all prompts"),M$("--config <json>","Pass inline JSON config"),M$("--env <name>","Target a specific Railway environment"),M$("--no-update-check","Skip version update check on startup"),M$("--debug","Enable debug output"),M$("-v, --version","Print CLI version"),R1()}async function ZX($,z){yR()}j0();var B2=w0(A0(),1);import{rmSync as RR}from"node:fs";import{resolve as YX}from"node:path";W0();async function JX($,z){let Z=process.cwd(),Y=u0(Z),J=I0(Z);if(Y){let{dirname:H}=await import("node:path"),U=H(Y),x=I0(U);for(let S of x)if(!J.some((O)=>O.path===S.path))J.push(S)}if(J.length===0&&!Y){E("No KITT workspaces found. Run /kitt:init to create one.");return}let Q=null;if(z[0]){let H=z[0].toLowerCase(),U=J.find((x)=>x.manifest.workspace.name.toLowerCase()===H);if(U)Q=U.path;else{E(`Workspace "${z[0]}" not found.`);return}}else if(J.length===1)Q=J[0].path;else{let H=J.map((x)=>{let S=x.manifest,O=Object.keys(S.apps).length,h=x.path===Y?`${S.workspace.name} ${B2.default.green("(active)")}`:S.workspace.name,P=`${O} app${O!==1?"s":""} · ${S.workspace.packageManager}`;return{value:x.path,label:h,hint:P}}),U=await o({message:"Select workspace to delete:",options:H});if(g(U)){y("Delete cancelled.");return}Q=U}if(!Q||!p(Q)){E("Invalid workspace path.");return}let X=YX(Q),K=H0(X);if(!K){E("Could not read workspace manifest.");return}let W=K.workspace.name,G=Object.keys(K.apps).length,B=K.workspace.railway?.projectId;if(console.log(""),console.log(` ${B2.default.bold(W)}`),console.log(` ${B2.default.dim(X)}`),console.log(` ${G} app${G!==1?"s":""} · ${K.workspace.packageManager}`),B)console.log(` ${B2.default.yellow("⚠")} Railway project: ${B2.default.cyan(B)}`);if(console.log(""),B)y("This workspace is linked to a Railway project. The Railway project will NOT be deleted — only local files.");let V=await _0({message:`Delete workspace "${W}" and all its files? This cannot be undone.`});if(g(V)||!V){y("Delete cancelled.");return}if(G>0){let H=await _0({message:`This workspace contains ${G} app${G!==1?"s":""}. Are you absolutely sure?`});if(g(H)||!H){y("Delete cancelled.");return}}let f=j1();if(f&&YX(f)===X){let H=h9();delete H.workspacePath,cz(H)}if(YX(Z).startsWith(X)){let{dirname:H}=await import("node:path");process.chdir(H(X))}if(RR(X,{recursive:!0,force:!0}),X0(`Workspace "${W}" deleted.`),B)R(`Railway project ${B2.default.cyan(B)} was not affected. Delete it manually via the Railway dashboard if needed.`)}var Z$=w0(A0(),1);W0();async function XX($,z){let Z=process.cwd(),Y=u0(Z),J=I0(Z);if(Y){let{dirname:Q}=await import("node:path"),X=Q(Y),K=I0(X);for(let W of K)if(!J.some((G)=>G.path===W.path))J.push(W)}if(J.length===0&&!Y){E("No KITT workspaces found. Run /kitt:init to create one.");return}console.log(""),R(`${Z$.default.bold("KITT Workspaces")} ${Z$.default.dim(`(${J.length} found)`)}`),console.log("");for(let Q of J){let X=Q.manifest,K=Object.keys(X.apps).length,W=Q.path===Y,G=X.workspace.railway?.projectId?Z$.default.green("● linked"):Z$.default.dim("○ unlinked"),B=W?Z$.default.green(" (active)"):"";if(console.log(` ${Z$.default.bold(Z$.default.white(X.workspace.name))}${B} ${Z$.default.dim(`${K} app${K!==1?"s":""}`)} ${G} ${Z$.default.dim(X.workspace.packageManager)}`),console.log(` ${Z$.default.dim(Q.path)}`),K>0)for(let[V,f]of Object.entries(X.apps)){let H=f.type==="frontend"?Z$.default.cyan("frontend"):Z$.default.magenta("backend");console.log(` ${Z$.default.dim("·")} ${V} ${H} ${Z$.default.dim(f.framework)}`)}console.log("")}}var z0=w0(A0(),1);W0();function CR(){let $=process.stdout.columns||80;return Math.max(48,Math.min($-4,100))}function PR($){return $.replace(/\x1b\[[0-9;]*m/g,"")}function KX($){return PR($).length}function WX($,z){if(KX($)<=z)return $;let Z=/\x1b\[[0-9;]*m/g,Y=0,J=0;while(J<$.length&&Y<z-1){Z.lastIndex=J;let Q=Z.exec($);if(Q&&Q.index===J){J+=Q[0].length;continue}Y++,J++}return $.slice(0,J)+z0.default.dim("…")}function uH($,z){let Z=KX($);if(Z>z)return WX($,z);return $+" ".repeat(z-Z)}function _R($,z,Z){let Y=Z?` ${Z}`:"",J=`${z0.default.bold(z0.default.white(z))}${Y}`,Q=$-2-KX(J);console.log(` ${z0.default.dim("┌─")} ${J} ${z0.default.dim("─".repeat(Math.max(0,Q))+"┐")}`)}function U9($,z,Z){let Y=z0.default.dim(z.padEnd(16)),J=$-18,Q=WX(Z,J),X=`${Y} ${Q}`;console.log(` ${z0.default.dim("│")} ${uH(X,$-1)}${z0.default.dim("│")}`)}function x9($,z){console.log(` ${z0.default.dim("│")} ${uH(WX(z,$-1),$-1)}${z0.default.dim("│")}`)}function QX($,z){if(z){let Z=$-2-z.length;console.log(` ${z0.default.dim("├─")} ${z0.default.dim(z)} ${z0.default.dim("─".repeat(Math.max(0,Z))+"┤")}`)}else console.log(` ${z0.default.dim("├"+"─".repeat($+2)+"┤")}`)}function jR($){console.log(` ${z0.default.dim("└"+"─".repeat($+2)+"┘")}`)}function IR($,z,Z){let Y=Z.workspace.name,J=Object.keys(Z.apps).length,Q=Object.keys(Z.packages).length,X=Z.workspace.railway?.projectId,K=z.isActive?z0.default.green("● active"):z0.default.dim("○");_R($,Y,K),U9($,"path",z0.default.dim(z.path)),U9($,"package manager",z0.default.cyan(Z.workspace.packageManager)),U9($,"railway",X?z0.default.green(`● ${X}`):z0.default.dim("○ unlinked"));let W=m5(z.path,Z),G=W.orphanedDirectories.length+W.missingDirectories.length;if(G===0)U9($,"drift",z0.default.green("✓ clean"));else{U9($,"drift",z0.default.yellow(`⚠ ${G} issue${G!==1?"s":""}`));for(let B of W.orphanedDirectories)x9($,` ${z0.default.yellow("+")} ${z0.default.dim(B)}`);for(let B of W.missingDirectories)x9($,` ${z0.default.red("−")} ${z0.default.dim(B)}`)}if(J>0){QX($,`Apps (${J})`);for(let[B,V]of Object.entries(Z.apps)){let H=(V.type==="frontend"?z0.default.cyan:z0.default.magenta)(V.type==="frontend"?"▲":"◆"),U=z0.default.dim(V.framework),x=V.integrations.length>0?z0.default.dim(` · ${V.integrations.join(", ")}`):"";x9($,`${H} ${z0.default.white(B)} ${U}${x}`)}}else QX($,"Apps"),x9($,z0.default.dim("No apps yet — run /app:create"));if(Q>0){QX($,`Packages (${Q})`);let B=Object.keys(Z.packages).join(" · ");x9($,z0.default.dim(B))}jR($)}async function GX($,z){let Z=process.cwd(),Y=u0(Z),J=CR(),Q=[];if(Y){Q.push({path:Y,isActive:!0});let{dirname:X}=await import("node:path"),K=X(Y),W=I0(K);for(let G of W)if(G.path!==Y)Q.push({path:G.path,isActive:!1})}else{let X=I0(Z);if(X.length===0){E("No KITT workspaces found. Run /kitt:init to create one.");return}for(let K of X)Q.push({path:K.path,isActive:!1})}console.log("");for(let X of Q){if(!p(X.path))continue;let K=N0(X.path);if(!K)continue;IR(J,X,K),console.log("")}}j0();var m2=w0(A0(),1);import{execSync as BX}from"node:child_process";import{existsSync as kR,readFileSync as bR}from"node:fs";import{homedir as DR}from"node:os";import{resolve as hR}from"node:path";W0();function cH(){try{let $=BX("railway list --json",{encoding:"utf-8",stdio:"pipe",timeout:15000}).trim();return JSON.parse($).filter((Z)=>!Z.deletedAt)}catch{return[]}}function r5($,z){try{return BX(`railway link -p ${$}`,{encoding:"utf-8",stdio:"pipe",cwd:z,timeout:15000}),!0}catch{return!1}}function gR($){let z=`${DR()}/.railway/config.json`;if(!kR(z))return null;try{let Z=bR(z,"utf-8"),Y=JSON.parse(Z),J=hR($);return Y.projects?.[J]?.project??null}catch{return null}}function vR($,z){try{R(`Creating Railway project "${$}"...`),BX(`railway init --name "${$}"`,{cwd:z,encoding:"utf-8",stdio:"pipe",timeout:30000});let Z=gR(z);if(!Z){let J=cH().find((Q)=>Q.name.toLowerCase()===$.toLowerCase());if(J)return r5(J.id,z),J.id;return E("Could not extract project ID after creation."),null}return r5(Z,z),Z}catch(Z){let Y=Z instanceof Error?Z.message:String(Z);return E(`Failed to create Railway project: ${Y}`),null}}async function VX($,z){let Z=await Y0(process.cwd());if(!Z){E("No KITT workspace found. Run /kitt:init to create one.");return}let Y=H0(Z);if(!Y){E("Could not read workspace manifest.");return}if(Y.workspace.railway?.projectId){let H=Y.workspace.railway.projectId;R(`Workspace "${Y.workspace.name}" is already linked to Railway project ${m2.default.cyan(H)}.`);let U=await _0({message:"Do you want to link to a different project?"});if(g(U)||!U)return}if(!await E8()){E("Railway CLI is not installed. Install it: https://docs.railway.com/cli");return}if(!(await m$()).authenticated){E("Not authenticated with Railway. Run /auth:railway first.");return}if(z[0]){let H=z[0];if(R(`Linking to Railway project ${m2.default.cyan(H)}...`),!r5(H,Z)){E(`Failed to link Railway project. Verify the project ID is correct: ${H}`);return}let x={...Y,workspace:{...Y.workspace,railway:{projectId:H,linkedAt:new Date().toISOString()}}};y0(Z,x),X0(`Workspace "${Y.workspace.name}" linked to Railway project ${m2.default.cyan(H)}.`);return}R("Fetching Railway projects...");let X=cH(),K="__create_new__",W=[{value:K,label:"+ Create new project"},...X.map((H)=>({value:H.id,label:H.name,hint:m2.default.dim(H.id.slice(0,8))}))],G=await o({message:"Select a Railway project to link, or create a new one:",options:W});if(g(G)){y("Link cancelled.");return}let B,V;if(G===K){let H=vR(Y.workspace.name,Z);if(!H)return;B=H,V=Y.workspace.name}else if(B=G,V=X.find((x)=>x.id===G)?.name??B,R(`Linking to ${m2.default.cyan(V)}...`),!r5(B,Z)){E("Failed to link Railway project via Railway CLI.");return}let f={...Y,workspace:{...Y.workspace,railway:{projectId:B,linkedAt:new Date().toISOString()}}};y0(Z,f),X0(`Workspace "${Y.workspace.name}" linked to Railway project ${m2.default.cyan(V)}.`)}q0();var P0=w0(A0(),1);import{execSync as uR}from"node:child_process";y$();W0();var dH=1e4;async function cR($){let z=new AbortController,Z=setTimeout(()=>z.abort(),dH),Y=Date.now();try{let J=await fetch($,{method:"GET",signal:z.signal,redirect:"follow"}),Q=Date.now()-Y;return{status:J.status,ok:J.ok,latency:Q,error:null}}catch(J){let Q=Date.now()-Y,X=J instanceof Error?J.message:String(J);if(X.includes("abort"))return{status:null,ok:!1,latency:Q,error:`Timeout (${dH/1000}s)`};return{status:null,ok:!1,latency:Q,error:X}}finally{clearTimeout(Z)}}function dR($){let z=$.ok?P0.default.green("✓"):P0.default.red("✗"),Z=P0.default.white($.service),Y=$.status!==null?$.ok?P0.default.green(`${$.status}`):P0.default.red(`${$.status}`):P0.default.red("ERR"),J=$.latency!==null?P0.default.dim(`${$.latency}ms`):"",Q=$.url?P0.default.dim($.url):P0.default.dim("no domain"),X=$.error?P0.default.red($.error):"";if($.url)console.log(` ${z} ${Z} ${Y} ${J} ${Q}`);else console.log(` ${z} ${Z} ${P0.default.dim("No public domain")} ${X}`)}async function a5($,z,Z){let Y=await Y0(process.cwd());if(!Y){E("No KITT workspace found. Run /kitt:init to create one, or /kitt:switch to select an existing workspace.");return}let J=l(Y);if(J.cmd("/deploy:health","START"),!p(Y)){E("Not a KITT workspace."),J.cmd("/deploy:health","FAILED","not a workspace");return}let Q=N0(Y);if(!Q){E("Could not read manifest."),J.cmd("/deploy:health","FAILED","manifest read failed");return}let X=Q.workspace.railway?.projectId;if(!X){E("Workspace is not linked to a Railway project. Run /kitt:link first."),J.cmd("/deploy:health","FAILED","no railway project");return}let K=Object.keys(Q.apps);if(K.length===0){E("No apps found in manifest."),J.cmd("/deploy:health","FAILED","no apps");return}let W=z[0]?.trim().toLowerCase(),G=W?K.filter((V)=>V.toLowerCase()===W):K;if(W&&G.length===0){E(`App "${z[0]}" not found.`),J.cmd("/deploy:health","FAILED",`app not found: ${z[0]}`);return}let B=null;try{let V=await J$();B=await T$(V),await B.initialize();let f=u$(X);R("Checking service health..."),console.log(""),console.log(P0.default.bold(P0.default.cyan(" Service Health"))),console.log(P0.default.dim(" ─────────────────────────────────"));let H=[];for(let S of G){let O=null;try{await f.guardedCallTool(B,"link-service",{workspacePath:Y,serviceName:S});let h=uR(`railway domain --json -s ${S}`,{cwd:Y,encoding:"utf-8",stdio:"pipe",timeout:1e4}),P=JSON.parse(h);if(P.domains&&P.domains.length>0)O=P.domains[0]}catch{}if(!O){H.push({service:S,url:null,status:null,ok:!1,latency:null,error:"No domain configured"});continue}let L=await cR(O);H.push({service:S,url:O,status:L.status,ok:L.ok,latency:L.latency,error:L.error})}for(let S of H)dR(S);let U=H.every((S)=>S.ok),x=H.filter((S)=>S.ok).length;if(console.log(""),U)console.log(` ${P0.default.green("All services healthy")} ${P0.default.dim(`(${x}/${H.length})`)}`);else if(x>0)console.log(` ${P0.default.yellow(`${x}/${H.length} services healthy`)}`);else console.log(` ${P0.default.red("No services reachable")} ${P0.default.dim(`(${H.length} checked)`)}`);console.log(""),J.cmd("/deploy:health","SUCCESS")}catch(V){let f=V instanceof Error?V.message:String(V);console.log(""),y(`Health check failed: ${f}`),J.cmd("/deploy:health","FAILED",f)}finally{B?.close(),await X$()}}var mH={name:"openkitt",version:"0.4.3",description:"AI-powered monorepo CLI for Railway deployments",keywords:["cli","scaffolding","monorepo","ai","railway","nextjs","tanstack","hono","express"],homepage:"https://github.com/openkitt/kitt-cli",repository:{type:"git",url:"https://github.com/openkitt/kitt-cli.git"},license:"MIT",author:"KITT Contributors",type:"module",bin:{kitt:"./dist/cli.js",openkitt:"./dist/cli.js"},files:["dist/cli.js","scripts/"],scripts:{build:"bun build src/cli.ts --target=node --outfile=dist/cli.js --external='ts-morph' --external='@ts-morph/common' --minify","build:types":"tsc --noEmit",dev:"bun build src/cli.ts --target=node --outfile=dist/cli.js --external='ts-morph' --external='@ts-morph/common' --watch",kitt:"node dist/cli.js",test:"vitest run","test:watch":"vitest","test:e2e":"npm run build && vitest run --config vitest.config.e2e.ts","test:all":"npm run test && npm run test:e2e"},engines:{node:">=20.0.0"},dependencies:{"@anthropic-ai/sdk":"^0.66.0","@clack/prompts":"^0.11.0","@google/generative-ai":"^0.24.1",commander:"^14.0.1",openai:"^6.6.0",picocolors:"^1.1.1","ts-morph":"^27.0.0"},devDependencies:{"@types/node":"^24.3.0",typescript:"^5.9.2",vitest:"^3.2.4"}};var T9=mH.version,Q8="kitt",ZC=86400000,YC=5000,JC=new Set(["init","kitt:init","create","app:create","delete","app:delete","kitt:delete","deploy","deploy:app","deploy:template","deploy:delete","deploy:destroy","env:create","env:vars","env:delete","domain","deploy:domain","publish"]),nH=iH(eR(),".kitt"),fX=iH(nH,"update-check.json"),o5={"app:create":{handler:k5},"app:delete":{handler:D5},"app:list":{handler:t5},"app:run":{handler:I5},"app:settings":{handler:j5},"deploy:app":{handler:v5},"deploy:template":{handler:rJ},"deploy:delete":{handler:aJ},"deploy:destroy":{handler:u5},"deploy:domain":{handler:c5},"deploy:logs":{handler:d5},"deploy:status":{handler:l5},"deploy:health":{handler:a5},"auth:login":{handler:Y1},"auth:logout":{handler:Y1},"auth:railway":{handler:Y1},"auth:llm":{handler:Y1},"auth:model":{handler:Y1},"auth:status":{handler:Y1},"versions:list":{handler:c2},"versions:check":{handler:c2},"versions:update":{handler:c2},"versions:set":{handler:c2},"env:create":{handler:H9},"env:vars":{handler:H9},"env:delete":{handler:H9},"kitt:init":{handler:n9},"kitt:delete":{handler:JX},"kitt:switch":{handler:s5},"kitt:list":{handler:XX},"kitt:status":{handler:GX},"kitt:link":{handler:VX},create:{handler:k5},delete:{handler:D5},deploy:{handler:v5},domain:{handler:c5},logs:{handler:d5},list:{handler:t5},run:{handler:I5},settings:{handler:j5},init:{handler:n9},switch:{handler:s5},status:{handler:l5},health:{handler:a5},login:{handler:Y1},logout:{handler:Y1},versions:{handler:c2},help:{handler:ZX},destroy:{handler:u5}};function XC(){console.log(L0.default.cyan(" ______ _______________________")),console.log(L0.default.cyan(" ___ //_/___ /__ __/__ __/")),console.log(L0.default.cyan(" __ ,< __ / __ / __ / ")),console.log(L0.default.cyan(" _ /| | __/ / _ / _ / ")),console.log(L0.default.cyan(" /_/ |_| /___/ /_/ /_/ ")),console.log(""),console.log(` ${L0.default.bold(L0.default.white("KITT"))} ${L0.default.dim("v"+T9)} ${L0.default.dim("— AI-Powered App Scaffolding CLI")}`),console.log(` ${L0.default.dim("/auth:login → /kitt:init → /app:create → /deploy:app")}`),console.log(` ${L0.default.dim("Type /help for all commands")}`),console.log("")}function QC($){if(u0($))return;let z=I0($);if(z.length===0)return;let Z=j1(),Y=!!(Z&&p(Z));if(z.length===1)return;if(console.log(` ${L0.default.dim(`${z.length} kitt spaces`)}`),Y){let Q=H0(Z)?.workspace.name??Z;console.log(` ${L0.default.dim("Last active:")} ${L0.default.cyan(Q)}`)}console.log("")}function KC($){let z=/"([^"]*)"|'([^']*)'|`([^`]*)`|(\S+)/g,Z=[],Y=z.exec($);while(Y!==null)Z.push(Y[1]??Y[2]??Y[3]??Y[4]),Y=z.exec($);return Z}function tH($){let z=$.trim();if(z.length===0)return;let Z=KC(z);if(Z.length===0)return;let Y=Z[0],J=Y.startsWith("/")?Y:`/${Y}`;return{key:J.slice(1).toLowerCase(),displayName:J,args:Z.slice(1)}}function WC($,z){let Z=(X)=>{let K=X.trim().replace(/^v/i,""),[W,...G]=K.split("-");return{parts:W.split(".").map((B)=>Number.parseInt(B,10)).map((B)=>Number.isFinite(B)?B:0),prerelease:G.length>0}},Y=Z($),J=Z(z),Q=Math.max(Y.parts.length,J.parts.length);for(let X=0;X<Q;X+=1){let K=Y.parts[X]??0,W=J.parts[X]??0;if(K>W)return!0;if(K<W)return!1}if(!Y.prerelease&&J.prerelease)return!0;return!1}function GC($){if(!tR(fX))return!1;try{let z=rR(fX,"utf-8").trim();if(z.length===0)return!1;let Z=JSON.parse(z);if(typeof Z.checkedAt!=="string")return!1;let Y=Date.parse(Z.checkedAt);if(!Number.isFinite(Y))return!1;return $.getTime()-Y<ZC}catch{return!1}}function BC($,z){sR(nH,{recursive:!0});let Z={checkedAt:$.toISOString(),latestVersion:z};aR(fX,`${JSON.stringify(Z,null,2)}
1435
1435
  `,"utf-8")}async function VC($){if($.noUpdateCheck)return;let z=new Date;if(GC(z))return;let Z=new AbortController,Y=setTimeout(()=>{Z.abort()},YC);try{let J=await fetch("https://registry.npmjs.org/openkitt/latest",{signal:Z.signal});if(!J.ok)return;let Q=await J.json();if(typeof Q!=="object"||Q===null)return;let X=Q.version;if(typeof X!=="string"||X.length===0)return;if(WC(X,T9))y(`KITT v${X} is available (current: v${T9}).
1436
1436
  Run "npm install -g openkitt@latest" to update,
1437
1437
  or use "npx openkitt@latest" on next launch.`);BC(z,X)}catch{return}finally{clearTimeout(Y)}}async function fC($,z,Z,Y){await $.handler(z,Z,Y)}async function sH($,z){let Z=tH($);if(!Z)return"continue";if(Z.key==="exit")return"exit";let Y=o5[Z.key];if(!Y)return console.log(`Unknown command: ${Z.displayName}. Type /help for available commands.`),"unknown";let J=await tQ(Z.key);if(!J.allowed)return console.log(L0.default.red(`✗ ${J.message}`)),"continue";return await fC(Y,z,Z.args,Z.key),"continue"}async function HC($,z){let Z=tH($);if(Z&&JC.has(Z.key)&&!z.yes)return console.log(L0.default.red(`✗ Non-interactive mode requires --yes for state-changing commands.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openkitt",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "AI-powered monorepo CLI for Railway deployments",
5
5
  "keywords": [
6
6
  "cli",