infra-kit 0.1.132 → 0.1.133

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/dist/cli.js CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import{A as Be,B as Je,C as We,D as He,E as ze,F as Xe,G as Qe,H as Ze,I as W,J as et,K as tt,L as ot,M as rt,N as nt,O as it,Q as E,a as we,b as k,c as w,d as Re,e as ke,f as Ee,g as K,h as Ce,i as xe,j as Y,k as Te,l as Ae,m as _e,n as De,o as Me,p as $e,q as je,r as Fe,s as M,t as m,u as Ue,v as Ve,w as Ge,x as qe,y as Ke,z as Ye}from"./chunk-GQHUWUJL.js";import{a as Oe}from"./chunk-RXEMP3VI.js";import{q as H}from"./chunk-RSF5XAQJ.js";import{P as q,Q as he,S as ye,m as ve,v as s}from"./chunk-V37MZDFR.js";import{e as J}from"./chunk-Z6KTUVIC.js";import{a as at,b as O,c as st,d as x,e as z,f as X,g as Q}from"./chunk-IGTHMZPR.js";import{a as Se}from"./chunk-LSEYIAWK.js";import{a as _}from"./chunk-6FU2TRU5.js";import{a as D,b as Pe,d as be,f as Le,g as Ie,j as B,k as Ne,n as S}from"./chunk-CHETBZ6M.js";import"./chunk-6EPRH34O.js";import"./chunk-LTKR3F4N.js";import Xo,{Separator as P}from"@inquirer/select";import{realpathSync as Qo}from"node:fs";import f from"node:process";import{fileURLToPath as oo}from"node:url";import{Command as Io}from"commander";import I from"node:process";import ct from"node:process";import{$ as io}from"zx";var Z=async()=>{let e=await q(),t=await Promise.all([{label:"project (committed)",path:e.main},{label:"user global",path:e.userGlobal},{label:"user project",path:e.userProject}].map(async r=>({...r,exists:await k(r.path)}))),o=t.at(-1)?.exists===!0,n=await Te(e.userProject,o),a=o?Ae(n):"";s.info(`Project name: ${e.projectName}
3
- `),s.info(`Config merge chain (later overrides earlier):
4
- `);for(let r of t){let c=r.exists?" [\u2713]":" [ ]",l=r.path===e.userProject&&a!==""?` ${a}`:"";s.info(`${c} ${r.label.padEnd(22)} ${w(r.path)}${l}`)}let i={projectName:e.projectName,layers:t.map(r=>({label:r.label,path:r.path,exists:r.exists})),hasOverrides:n.hasOverrides,overrideKeys:n.overrideKeys};return{content:[{type:"text",text:JSON.stringify(i,null,2)}],structuredContent:i}},ee=async()=>{let e=await q(),t=ct.env.EDITOR||ct.env.VISUAL||"vi",o=await Re(e);o.createdConfig&&s.info(ke(o)),s.info(`Opening ${w(e.userProject)} in ${t}`),await io({stdio:"inherit"})`${t} ${e.userProject}`,ye();let n={path:e.userProject,editor:t};return{content:[{type:"text",text:JSON.stringify(n,null,2)}],structuredContent:n}};import u from"node:fs";import R from"node:path";import b from"node:process";var ao="autoload-warn-misconfig.flag",so="autoload-warn-fail.flag",te="autoload-fail.flag",co=3e4,mt=async(e=!0)=>{let t;try{t=await he()}catch{return null}let o=t.envAutoLoad;return o?t.environments.includes(o.config)?{trigger:o.trigger,config:o.config,project:t.envManagement.config.name}:(e&&pt(`infra-kit: envAutoLoad.config "${o.config}" is not one of environments [${t.environments.join(", ")}] \u2014 env auto-load disabled.`,ao),null):null},dt=e=>{let{trigger:t,expectedTrigger:o,targetConfig:n,targetProject:a,env:i,force:r}=e;return t!==o||!i.session||i.cleared||i.currentConfig&&!i.autoLoadedMarker||!r&&i.autoLoadedMarker&&i.currentConfig===n&&i.currentProject===a?"skip":"load"},L=async({expectedTrigger:e,projectDir:t,force:o})=>{let n=e==="cli-invocation";try{let a=await mt(n);if(!a||dt({trigger:a.trigger,expectedTrigger:e,targetConfig:a.config,targetProject:a.project,env:lo(),force:o})==="skip"||lt()||uo())return null;let r=mo(),c=await $e({config:a.config,autoLoaded:!0,projectDir:t,beforeWrite:()=>!lt()&&!po(r)});return c?(go(),c.filePath):null}catch(a){let i=a.message;return fo(),n?pt(`infra-kit: env auto-load failed \u2014 ${i} (will retry later)`,so):s.debug(`env auto-load skipped: ${i}`),null}},lo=()=>({session:b.env[be],cleared:b.env[Ne],currentConfig:b.env[Le],currentProject:b.env[Ie],autoLoadedMarker:b.env[B]}),mo=()=>{try{return u.statSync(R.join(S(),D)).mtimeMs}catch{return null}},po=e=>{try{let t=R.join(S(),D);if(!u.existsSync(t))return!1;let o=u.statSync(t).mtimeMs;return e!==null&&o<=e?!1:new RegExp(`^unset ${B}$`,"m").test(u.readFileSync(t,"utf-8"))}catch{return!1}},lt=()=>{try{let e=S(),t=R.join(e,Pe);if(!u.existsSync(t))return!1;let o=R.join(e,D);return u.existsSync(o)?u.statSync(t).mtimeMs>=u.statSync(o).mtimeMs:!0}catch{return!1}},uo=()=>{try{let e=R.join(S(),te);return u.existsSync(e)?Date.now()-u.statSync(e).mtimeMs<co:!1}catch{return!1}},fo=()=>{try{let e=S();u.mkdirSync(e,{recursive:!0,mode:448}),u.writeFileSync(R.join(e,te),"",{mode:384})}catch{}},go=()=>{try{u.rmSync(R.join(S(),te),{force:!0})}catch{}},pt=(e,t)=>{try{let o=S(),n=R.join(o,t);if(u.existsSync(n))return;u.mkdirSync(o,{recursive:!0,mode:448}),u.writeFileSync(n,"",{mode:384})}catch{}s.warn(e)};var oe=async({projectDir:e}={})=>{await L({expectedTrigger:"shell-startup",projectDir:e,force:!0})};import{spawn as vo}from"node:child_process";import $ from"node:process";import{fileURLToPath as ho}from"node:url";var yo=["SIGINT","SIGTERM"],ut=()=>ho(new URL("./mcp.js",import.meta.url)),re=(e={})=>{let t=e.spawn??vo,o=e.exit??(r=>$.exit(r)),n=e.env??$.env,a=e.onError??(r=>s.error(r)),i=t($.execPath,[ut()],{stdio:"inherit",env:_(n)});i.on("error",r=>{a(`failed to launch the MCP server: ${r.message}`),o(1)}),yo.forEach(r=>{$.on(r,()=>{i.kill(r)})}),i.on("exit",(r,c)=>{o(c?1:r??1)})};import{spawnSync as wo}from"node:child_process";import{realpathSync as So}from"node:fs";import ne from"node:process";import{fileURLToPath as Ro}from"node:url";var ko=()=>So(Ro(import.meta.url)),Eo=(e,t,o,n)=>e.error?(o(`${t} not found on PATH: ${e.error.message}`),n(1)):e.signal?(o(`update terminated by signal ${e.signal}`),n(1)):n(e.status??1),ie=({dryRun:e},t={})=>{let o=t.spawnSync??wo,n=t.print??(C=>s.info(C)),a=t.exit??(C=>ne.exit(C)),i=t.env??ne.env,r=t.selfRealPath??ko(),c=t.lazyNpmRoot??st,{manager:l,updateCommand:d,canSelfSpawn:p}=at({selfRealPath:r,env:i,realpath:x,lazyNpmRoot:c}),y=d.join(" ");if(e){n(`Detected install manager: ${l}`),n(`Would run: ${y}`);return}if(!p){n(`Detected install manager: ${l}`),n(`Run this yourself: ${y}`),n(l==="homebrew"?"Not run for you: Homebrew manages this install; running a package manager would create a split-brain install.":"Not run for you: the install location is unrecognized, so the command above is a guess \u2014 a guessed global install is worse than a printed one.");return}let N=o(d[0],d.slice(1),{stdio:"inherit",shell:ne.platform==="win32",env:_(i)});Eo(N,l,n,a)};import ae from"node:fs/promises";import se from"node:path";import ft from"node:process";import{pathToFileURL as Co}from"node:url";var gt="~/projects",ce=async(e={})=>{if(e.init){await To(e.cwd);return}await xo()},xo=async()=>{let e=K(),t=await k(e);if(s.info(`Factory config: ${w(e)} ${t?"[\u2713]":"[ ]"}`),!t){s.info("\nNot found \u2014 run `infra-kit vendor-config --init` to scaffold it."),ft.exitCode=1;return}let{workspaceDir:o,targets:n}=await xe(),a=Ce(o),i=await k(a);s.info(`workspaceDir: ${o} (resolved: ${a}) ${i?"[\u2713 exists]":"[ ] not found"}`),s.info("Targets:");let r=i;for(let c of n){let l=se.join(a,c),d=await k(l);d||(r=!1);let p=d?"[\u2713]":"[ ]",y=d?"":" (not found \u2014 clone or remove)";s.info(` ${p} ${c} ${w(l)}${y}`)}r||(ft.exitCode=1)},To=async e=>{let t=K();if(await k(t)){s.info(`Factory config already exists at ${w(t)} \u2014 leaving it untouched.`);return}let o=e??await ve(),n=await Ao(o);await ae.mkdir(se.dirname(t),{recursive:!0}),await ae.writeFile(t,Po(n),"utf-8"),s.info(`\u2713 Created ${w(t)}`),n.length>0&&s.info(` Seeded ${n.length} target(s) from the source ${J}.`),s.info(` Edit \`workspaceDir\` (placeholder: ${gt}) to point at where your repos live.`),n.length===0&&s.info(" Add at least one repo name to `targets` before running vendor sync/manifest/diff.")},Ao=async e=>{try{let t=se.join(e,J),o=await ae.stat(t),i=(await import(`${Co(t).href}?mtime=${Number(o.mtimeMs)}`)).default,r=typeof i=="function"?await i():i;if(r&&typeof r=="object"&&"targets"in r){let c=r.targets;if(Array.isArray(c)&&c.every(l=>typeof l=="string"))return c}}catch{}return[]},Po=e=>`${JSON.stringify({workspaceDir:gt,targets:e},null,2)}
5
- `;var j=(e,t=!0)=>({line:e,reproducible:t});import F from"node:fs";import bo from"node:os";import Lo from"node:path";import wt from"node:process";var U="INFRA_KIT_SESSION_REPORT",le=null,vt=!1,ht=[],St=(e=wt.env)=>{vt||(le=e[U]??null,vt=!0,delete e[U])};var Rt=(e,t)=>{if(!le)return;let o=e.summary??(ht.length>0?[...ht]:void 0),n={...e,...o?{summary:o}:{}},a=t?.write??((i,r)=>{F.writeFileSync(i,r)});try{a(le,JSON.stringify(n))}catch{}},yt=0,kt=e=>{let t=e?.tmpdir?.()??bo.tmpdir(),o=e?.pid??wt.pid;return yt+=1,Lo.join(t,`infra-kit-session-${o}-${yt}.json`)},Et=(e,t)=>{if(!(t?.exists??(r=>F.existsSync(r)))(e))return null;let n=t?.read??(r=>F.readFileSync(r,"utf-8")),a=t?.unlink??(r=>F.unlinkSync(r)),i;try{i=n(e)}catch{return null}finally{try{a(e)}catch{}}try{return JSON.parse(i)}catch{return null}};var No=(e,t)=>[...t,e],me=e=>typeof e=="string"?e.split(",").filter(Boolean):void 0,Ct=(e,t)=>{if(!(typeof e>"u")){if(e===!0)return"workspace";if(e===!1)return"none";if(typeof e=="string"&&W.includes(e))return e;throw new Error(`Invalid ${t} value "${String(e)}". Expected one of: ${W.join(", ")}.`)}},V={value:!1},g=(e,t)=>e.hook("preAction",()=>{V.value||s.warn(`"${e.name()}" is a deprecated alias; use "${t}" instead.`)}),xt=e=>e.description("Merge dev branch into every release branch").option("-a, --all","Select all active release branches").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await Ve({all:t.all,confirmedCommand:t.yes}))}),Tt=e=>e.description("List all release branches").action(async()=>{m(await Ye())}),At=e=>e.description("Create one or more release branches (each entry can mix regular/hotfix and its own description)").option("-r, --release <spec>",'Release spec "<version|next|name>[:type[:description]]" (repeatable). The token is a semver ("1.2.5"), the literal "next", or a kebab-case name ("checkout-redesign"). Type is regular|hotfix (default regular). Examples: "1.2.5", "1.2.5:hotfix", "next:regular:Holiday backend", "checkout-redesign:regular:Q3 redesign".',No,[]).option("-y, --yes","Skip confirmation prompt").action(async t=>{let n=t.release.map(Be),a=n.length>0?n:void 0;m(await Je({releases:a,confirmedCommand:t.yes}))}),Pt=e=>e.description("Edit a release's description in Jira and in the matching GitHub PR body").option("-v, --version <version>","Release version (e.g. 1.2.5) or release name (e.g. checkout-redesign)").option("-d, --description <description>",'New description (use "" to clear)').option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await We({version:t.version,description:t.description,confirmedCommand:t.yes}))}),bt=e=>e.description("Deploy any release branch to any environment").option("-v, --version <version>",'Version (e.g. 1.2.5) or release name (e.g. checkout-redesign) to deploy; "dev" deploys from the dev branch').option("-e, --env <env>","Specify the environment to deploy to, e.g. dev").option("--skip-terraform","Skip terraform deployment step").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await qe({version:t.version,env:t.env,skipTerraform:t.skipTerraform,confirmedCommand:t.yes}))}),Lt=e=>e.description("Deploy selected services from release branch to any environment").option("-v, --version <version>",'Version (e.g. 1.2.5) or release name (e.g. checkout-redesign) to deploy; "dev" deploys from the dev branch').option("-e, --env <env>","Specify the environment to deploy to, e.g. dev").option("-s, --services <services...>","Specify services to deploy, e.g. client-be client-fe").option("--skip-terraform","Skip terraform deployment step").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await Ke({version:t.version,env:t.env,services:t.services,skipTerraform:t.skipTerraform,confirmedCommand:t.yes}))}),It=e=>e.description("Release a new version to production").option("-v, --version <version>","Version (e.g. 1.2.5) or release name (e.g. checkout-redesign) to deliver").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await Ge({version:t.version,confirmedCommand:t.yes}))}),Nt=e=>e.description("Remove release worktrees whose PRs are no longer open").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await nt({confirmedCommand:t.yes}))}),_t=e=>e.description("Add git worktrees for release branches").option("-y, --yes","Skip confirmation prompt").option("-a, --all","Select all active release branches").option("-v, --versions <versions>","Specify versions by comma, e.g. 1.2.5, 1.2.6").option("-i, --ide [mode]","Editor mode for created worktrees: workspace (default) | none").option("--no-ide","Skip the editor (alias for --ide none)").option("-c, --cursor [mode]","Deprecated alias for --ide").option("--no-cursor","Deprecated alias for --no-ide").option("-g, --github-desktop","Open created worktrees in GitHub Desktop").option("--no-github-desktop","Skip GitHub Desktop prompt").option("-m, --cmux","Open created worktrees in cmux (3-pane layout)").option("--no-cmux","Skip cmux prompt").action(async t=>{let o=Ct(t.ide,"--ide")??Ct(t.cursor,"--cursor");m(await et({confirmedCommand:t.yes,all:t.all,versions:t.versions,ide:o,githubDesktop:t.githubDesktop,cmux:t.cmux}))}),Dt=e=>e.description("List all git worktrees with detailed information").action(async()=>{m(await tt())}),Mt=e=>e.description("Remove git worktrees for release branches").option("-y, --yes","Skip confirmation prompt").option("-a, --all","Select all active release branches").option("-v, --versions <versions>","Specify versions by comma, e.g. 1.2.5, 1.2.6").action(async t=>{m(await rt({confirmedCommand:t.yes,all:t.all,versions:t.versions}))}),Ot=e=>e.description("Close all cmux/editor worktree windows, then reopen the current release worktrees (also cold-start restore)").action(async()=>{m(await ot())}),$t=e=>e.description("Show the machine-local factory config (~/.infra-kit/vendor.json) or scaffold it with --init").option("--init","Scaffold ~/.infra-kit/vendor.json (skips if it already exists)").action(async t=>{m(await ce({init:t.init}))}),jt=e=>e.description("Verify vendor/ matches vendor/.sync-manifest.json (self-contained; for any consumer repo)").action(async()=>{let t=await He();m(t),t.structuredContent.ok||(I.exitCode=1)}),Ft=e=>e.description("Source-aware drift check (rsync dry-run) of each target vendored subtree vs the source").option("-r, --repos <repos>","Restrict to comma-separated target repo names").action(async t=>{let o=await ze({repos:me(t.repos)});m(o),o.structuredContent.ok||(I.exitCode=1)}),Ut=e=>e.description("Show the resolved config merge chain and file paths").action(async()=>{m(await Z())}),Vt=e=>e.description("Open the user-scope per-project override file in $EDITOR").action(async()=>{m(await ee())}),_o=new Set(["init","doctor","version","dev","self-update","mcp"]),Do=e=>e.startsWith("env-")||_o.has(e),Mo=new Set(["env-autoload","mcp","version","self-update"]),Gt=e=>{let t=[];for(let o=e;o&&o.parent;o=o.parent)t.unshift(o.name());return t.join(" ")},de=()=>{let e=new Io,t=e.command("release").description("Release management commands");xt(t.command("merge-dev")),Tt(t.command("list")),At(t.command("create")),Pt(t.command("desc-edit")),bt(t.command("deploy-all")),Lt(t.command("deploy-selected")),It(t.command("deliver"));let o=e.command("worktrees").description("Git worktree management commands");_t(o.command("add")),Dt(o.command("list")),Mt(o.command("remove")),Nt(o.command("sync")),Ot(o.command("reload")),g(xt(e.command("merge-dev")),"release merge-dev"),g(Tt(e.command("release-list")),"release list"),g(At(e.command("release-create")),"release create"),g(Pt(e.command("release-desc-edit")),"release desc-edit"),g(bt(e.command("release-deploy-all")),"release deploy-all"),g(Lt(e.command("release-deploy-selected")),"release deploy-selected"),g(It(e.command("release-deliver")),"release deliver"),g(_t(e.command("worktrees-add")),"worktrees add"),g(Dt(e.command("worktrees-list")),"worktrees list"),g(Mt(e.command("worktrees-remove")),"worktrees remove"),g(Nt(e.command("worktrees-sync")),"worktrees sync"),g(Ot(e.command("worktrees-reload")),"worktrees reload");let n=e.command("config").description("Manage infra-kit configuration files");Ut(n.command("path")),Vt(n.command("edit")),Ut(e.command("config-path",{hidden:!0})),Vt(e.command("config-edit",{hidden:!0})),e.command("audit").description("Audit against infra-kit.config.ts rules (--all for every package, --root for the monorepo root)").option("-a, --all","Audit every non-vendor workspace package").option("-r, --root","Audit the monorepo root (turbo pipeline + root commands)").action(async i=>{let r=await we({all:i.all,root:i.root});m(r),r.structuredContent.allPassed||(I.exitCode=1)});let a=e.command("vendor").description("Verify and sync the mirrored vendor/ tree");return jt(a.command("check")),a.command("sync").description("Copy vendored files from the source repo into each target and regenerate manifests").option("-y, --yes","Skip confirmation prompt").option("-r, --repos <repos>","Restrict to comma-separated target repo names").action(async i=>{m(await Qe({confirmedCommand:i.yes,repos:me(i.repos)}))}),a.command("manifest").description("Regenerate each target vendor/.sync-manifest.json + README from current content (no copy)").option("-r, --repos <repos>","Restrict to comma-separated target repo names").action(async i=>{m(await Xe({confirmedCommand:!0,repos:me(i.repos)}))}),Ft(a.command("diff")),$t(a.command("config")),g($t(e.command("vendor-config")),"vendor config"),jt(e.command("vendor-check",{hidden:!0})),Ft(e.command("vendor-diff",{hidden:!0})),e.command("doctor").description("Check installation and authentication status of gh and doppler CLIs").action(async()=>{m(await _e())}),e.command("self-update").description("Update this CLI using the package manager that installed it").option("--dry-run","Print the detected manager and the command that would run; install nothing").action(i=>{ie({dryRun:!!i.dryRun})}),e.command("mcp").description("Run the infra-kit MCP server (stdio transport)").action(()=>{re()}),e.command("dev").description("Run local dev servers for a named devServersPresets preset (or all apps); api + ui").argument("[preset]","Named preset from devServersPresets (omit to run every app)").option("-w, --watch","Rebuild and restart on file save").option("--app <names>","Further narrow to these app folder names (comma-separated)").option("--target <keys>","Run exactly these <app>/api|<app>/ui packages (comma-separated); part-level, unlike --app").option("--cmux","Run each app in its own cmux pane (one workspace, N panes; falls back to single terminal if cmux is unavailable)").option("--self","Run only the app of the current directory (infer from cwd; use inside apps/<app>/\u2026)").option("-V, --verbose","Print full boot narration (default: quiet; full detail always in the session log)").option("--routes","Print each app\u2019s registered METHOD /path routes at startup (default: off)").action(async(i,r)=>{let{runDevServerCli:c}=await import("./dev-server.js"),l=!!(I.stdout.isTTY&&I.stdin.isTTY);await c({...r,preset:i},l,M.enabled)}),e.command("version").description("Print the installed infra-kit CLI version").action(async()=>{m(await Ze())}),e.command("env-status").description("Show which env is loaded in this session (local introspection; no Doppler call)").action(async()=>{m(await Fe())}),e.command("env-list").description("List available Doppler configs for the detected project").action(async()=>{m(await Me())}),e.command("init").description("Inject shell integration into .zshrc and sync repo agent-instruction files").action(async()=>{m(await Y())}),e.command("env-load").description("Load Doppler env vars for a config. Source the returned file path to apply.").option("-c, --config <config>","Environment config name to load (e.g. dev, arthur)").action(async i=>{m(await je({config:i.config}))}),e.command("env-clear").description("Clear loaded env vars. Source the returned file path to apply.").option("--purge","Also delete this project's warm cache outright (durable disable)").action(async i=>{m(await De({purge:!!i.purge}))}),e.command("env-autoload",{hidden:!0}).description("Internal: prime env for the shell-startup auto-load trigger").option("--project-dir <dir>","Canonical project dir for the warm-cache key (shell-startup only)").action(async i=>{await oe({projectDir:i.projectDir})}),e.commands.forEach(Ue),e.hook("preAction",async(i,r)=>{M.enabled=!!r.optsWithGlobals().json,M.enabled&&(s.level="warn"),Mo.has(Gt(r))||await Ee(),Do(r.name())||await L({expectedTrigger:"cli-invocation"})}),e.hook("postAction",(i,r)=>{let l=Oe.snapshot()?.formattedOptions??"",d=l?` ${l}`:"",p=`infra-kit ${Gt(r)}${d}`;Rt({equivalent:j(p,!0)})}),e};var pe=(e,t=" ")=>{let o=e.reduce((n,[a])=>Math.max(n,a.length),0);return e.map(([n,a])=>`${n.padEnd(o)}${t}${a}`)};import{spawn as jo}from"node:child_process";import h from"node:process";var v={ok:"ok",findingsPlain:"completed with findings",failed:"failed",cancelled:"cancelled",findingsSuffix:"findings",sep:" \xB7 ",reproPrefix:"$ ",nonReproPrefix:"\u2248 ",envNotice:"Applies to your shell after you exit this session."},qt={ok:{unicode:"\u2713",ascii:"[ok]"},findings:{unicode:"\u26A0",ascii:"[!]"},failed:{unicode:"\u2717",ascii:"[x]"},cancelled:{unicode:"\u2298",ascii:"[-]"}},Kt=e=>`${v.reproPrefix}${e}`,Oo=e=>e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(1)}s`,$o=(e,t)=>e==="findings"?t!=null?`${t} ${v.findingsSuffix}`:v.findingsPlain:{ok:v.ok,failed:v.failed,cancelled:v.cancelled}[e],Yt=e=>{let t=e.equivalent.reproducible?v.reproPrefix:v.nonReproPrefix,o=e.ascii===!0?qt[e.outcome].ascii:qt[e.outcome].unicode,a=[$o(e.outcome,e.findingsCount),Oo(e.durationMs)],i=e.summary?.[0];i!=null&&i.length>0&&a.push(i);let r=[`${o} ${a.join(v.sep)}`];return e.showEquivalent!==!1&&r.unshift(`${t}${e.equivalent.line}`),e.envNotice===!0&&r.push(v.envNotice),r.join(`
6
- `)};var Bt=(e,t,o)=>o?t!=null||e===0?"ok":"findings":t==="SIGINT"||e===0?"cancelled":"failed";import Jt from"node:process";var T={column:"\r",sgr:"\x1B[0m",cursor:"\x1B[?25h",wrap:"\x1B[?7h",scrollRegion:"\x1B[r",primaryBuffer:"\x1B[?1049l"},Wt=(e,t)=>{let o=t?.write??(i=>{Jt.stderr.write(i)}),n=t?.stdin??Jt.stdin,a=[T.column,T.sgr,T.cursor,T.wrap,T.scrollRegion];e.entersAltScreen===!0&&a.push(T.primaryBuffer),o(a.join("")),n.isTTY===!0&&n.isRaw===!0&&n.setRawMode?.(!1)};var Ht=e=>`infra-kit ${e.groupPath.join(" ")}`,Fo=e=>new Promise(t=>{e.on("exit",(o,n)=>{t({code:o,signal:n})}),e.on("error",()=>{t({code:1,signal:null})})}),Uo=async(e,t,o)=>{let n=kt(),a={...t.env,[U]:n,INFRA_KIT_NO_AUTO_UPDATE:"1"},i=t.now(),r={code:1,signal:null};o(!0);try{let y=t.spawn(h.execPath,[t.cliPath,...e.groupPath],{stdio:"inherit",env:a});r=await Fo(y)}catch{r={code:1,signal:null}}finally{o(!1),t.resetTerminal({entersAltScreen:e.entersAltScreen})}let c=Et(n),l=Bt(r.code,r.signal,c!=null),d=Ht(e),p=c?.equivalent??j(d,!0);return Yt({equivalent:p,outcome:l,durationMs:t.now()-i,summary:c?.summary,envNotice:e.sessionEnvNotice,ascii:t.ascii,showEquivalent:!(p.reproducible&&p.line===d)})},Vo=e=>{let t=()=>{e()||h.exit(0)},o=()=>{};return h.on("SIGINT",t),h.on("SIGTSTP",o),()=>{h.off("SIGINT",t),h.off("SIGTSTP",o)}},zt=(e,t)=>!!(t.stdoutIsTTY&&t.stdinIsTTY&&t.stderrIsTTY&&e.TERM!=="dumb"&&!e.INFRA_KIT_NO_SESSION&&!e.INFRA_KIT_SESSION_REPORT),Xt=async(e,t)=>{let o={spawn:t.spawn??jo,now:t.now??(()=>Date.now()),env:t.env??h.env,cliPath:t.cliPath,ascii:t.ascii??!(h.stdout.isTTY&&h.env.TERM!=="dumb"),resetTerminal:t.resetTerminal??(r=>{Wt(r)})},n=t.write??(r=>h.stderr.write(r)),a=!1,i=t.installSignals===!1?()=>{}:Vo(()=>a);try{for(;;){let r=await t.renderPalette(e);if(r==null)return;let c=t.resolveCommand(r);if(!c)continue;let l=Kt(Ht(c));n(`
7
- ${l}
8
- `);let d=await Uo(c,o,p=>{a=p});n(`
9
- ${d}
10
- `)}}finally{i()}};import{spawn as Ko}from"node:child_process";import Zt from"node:fs";import A from"node:process";import{fileURLToPath as eo}from"node:url";var Qt=["INFRA_KIT_NO_AUTO_UPDATE","NO_UPDATE_NOTIFIER","CI"],Go=new Set(["mcp","self-update"]),qo=e=>e[2]!=null&&Go.has(e[2]),ue=e=>{let{argv:t,env:o,isTty:n,selfRealPath:a,cwd:i,realpath:r}=e;return Qt.some(l=>{let d=o[l];return d!=null&&d!==""})?"opt-out":t.includes("--json")?"json":qo(t)?"own-command":n?O(a,i,r)?"local-install":null:"not-a-tty"};var Yo=e=>{Ko(A.execPath,[e,"--parent-pid",String(A.pid)],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()},Bo=()=>eo(new URL("./update-check.js",import.meta.url)),Jo=()=>Zt.realpathSync(eo(new URL("./cli.js",import.meta.url))),Wo=/^[\w@./+-]+$/i,Ho=e=>Wo.test(e),zo=(e,t,o)=>{!e?.latestVersion||!e.updateCommand||z(e.latestVersion,t)&&e.updateCommand.every(Ho)&&o(`infra-kit ${e.latestVersion} is available (you have ${t}). Run: ${e.updateCommand.join(" ")}`)},fe=(e,t={})=>{try{let o=t.argv??A.argv,n=t.env??A.env,a=t.isTty??!!A.stdout.isTTY,i=t.cwd??A.cwd(),r=t.nowMs??Date.now(),c=t.selfRealPath??Jo(),l=t.readCache??X,d=t.spawnChild??Yo,p=t.fileExists??(G=>Zt.existsSync(G)),y=t.notify??(G=>{s.info(G)});if(ue({argv:o,env:n,isTty:a,selfRealPath:c,cwd:i,realpath:x})!==null)return;let N=l();if(zo(N,e,y),!Q(N,r))return;let C=t.childPath??Bo();if(!p(C))return;d(C)}catch{}};St();var ge=de(),to=async e=>{try{e?await ge.parseAsync(e):await ge.parseAsync()}catch(t){H(t)&&(s.info("Operation cancelled."),f.exit(0));let o=t instanceof Error?t.message:String(t);s.error(o),f.exit(1)}},Zo=()=>{try{if(f.env.INFRA_KIT_NO_LOCATION_WARN||f.argv.includes("--json")||f.argv[2]==="mcp")return;O(Qo(oo(import.meta.url)),f.cwd(),x)&&s.info("Running from a project-local node_modules. Install globally for faster startup: npm i -g infra-kit")}catch{}};Zo();fe(Se.version);var ro=()=>new Map(ge.commands.map(e=>[e.name(),e])),no=()=>{let e=ro();return[{label:"Release Management",names:E("release")},{label:"Worktrees",names:E("worktrees")},{label:"Environment",names:E("environment")}].flatMap(({label:o,names:n})=>n.filter(a=>e.has(a)).map(a=>({name:a,description:e.get(a).description(),group:o})))},er=async()=>{let e=E("release"),t=E("worktrees"),o=E("environment"),n=ro(),a=no(),i=null;try{if(f.stdout.isTTY&&f.stdin.isTTY){let{runCommandPalette:r}=await import("./boot-SG7525LE.js");i=await r(a)}else{let r=pe(a.map(d=>[d.name,d.description])),c=new Map;a.forEach((d,p)=>{c.set(d.name,r[p]??d.name)});let l=d=>d.filter(p=>n.has(p)).map(p=>({name:c.get(p)??p,value:p}));i=await Xo({message:"Select a command to run",choices:[new P(" "),new P("\u2014 Release Management \u2014"),...l(e),new P(" "),new P("\u2014 Worktrees \u2014"),...l(t),new P(" "),new P("\u2014 Environment \u2014"),...l(o)]},{output:f.stderr})}}catch(r){if(!H(r))throw r}return i},tr=async()=>{let{runCommandPalette:e}=await import("./boot-SG7525LE.js"),t=oo(import.meta.url),o=new Map(it.map(n=>[n.cliName,n]));await Xt(no(),{renderPalette:e,resolveCommand:n=>{let a=o.get(n);return a?{groupPath:a.groupPath,entersAltScreen:a.entersAltScreen,sessionEnvNotice:a.sessionEnvNotice}:void 0},cliPath:t})};if(f.argv.length<=2){let e={stdoutIsTTY:!!f.stdout.isTTY,stdinIsTTY:!!f.stdin.isTTY,stderrIsTTY:!!f.stderr.isTTY};if(zt(f.env,e))await tr();else{let t=await er();t&&(V.value=!0,await to(["node","infra-kit",t]))}}else await to();
2
+ import{A as Ye,B as We,C as He,D as ze,E as Xe,F as Qe,G as Ze,H as et,I as H,J as tt,K as ot,L as rt,M as nt,N as it,O as D,P as at,R as M,S as st,a as we,b as x,c as S,d as Ee,e as xe,f as Ce,g as B,h as ke,i as Pe,j as J,k as Te,l as Ae,m as De,n as Me,o as Oe,p as je,q as Ue,r as Fe,s as _,t as m,u as Ge,v as Ve,w as qe,x as Ke,y as Be,z as Je}from"./chunk-WSO6DN6Q.js";import{a as $e}from"./chunk-RXEMP3VI.js";import{q as z}from"./chunk-RSF5XAQJ.js";import{P as K,Q as ye,S as Se,m as he,v as l}from"./chunk-V37MZDFR.js";import{e as W}from"./chunk-Z6KTUVIC.js";import{a as ct,b as O,c as lt,d as P,e as X,f as Q,g as Z}from"./chunk-3OMHS5RE.js";import{a as Re}from"./chunk-6FDGBQGX.js";import{a as L}from"./chunk-6FU2TRU5.js";import{a as N,b as be,d as Ie,f as Le,g as Ne,j as Y,k as _e,n as w}from"./chunk-CHETBZ6M.js";import"./chunk-6EPRH34O.js";import"./chunk-LTKR3F4N.js";import er,{Separator as ro}from"@inquirer/select";import{realpathSync as tr}from"node:fs";import u from"node:process";import{fileURLToPath as io}from"node:url";var mt=e=>{let t=new Map(e.map(o=>[o.name(),o]));return D.flatMap(({key:o,label:r})=>M(o).flatMap(a=>{let i=t.get(a);return i?[{name:a,description:i.description(),group:r}]:[]}))};import{Command as _o}from"commander";import I from"node:process";import dt from"node:process";import{$ as so}from"zx";var ee=async()=>{let e=await K(),t=await Promise.all([{label:"project (committed)",path:e.main},{label:"user global",path:e.userGlobal},{label:"user project",path:e.userProject}].map(async n=>({...n,exists:await x(n.path)}))),o=t.at(-1)?.exists===!0,r=await Te(e.userProject,o),a=o?Ae(r):"";l.info(`Project name: ${e.projectName}
3
+ `),l.info(`Config merge chain (later overrides earlier):
4
+ `);for(let n of t){let s=n.exists?" [\u2713]":" [ ]",c=n.path===e.userProject&&a!==""?` ${a}`:"";l.info(`${s} ${n.label.padEnd(22)} ${S(n.path)}${c}`)}let i={projectName:e.projectName,layers:t.map(n=>({label:n.label,path:n.path,exists:n.exists})),hasOverrides:r.hasOverrides,overrideKeys:r.overrideKeys};return{content:[{type:"text",text:JSON.stringify(i,null,2)}],structuredContent:i}},te=async()=>{let e=await K(),t=dt.env.EDITOR||dt.env.VISUAL||"vi",o=await Ee(e);o.createdConfig&&l.info(xe(o)),l.info(`Opening ${S(e.userProject)} in ${t}`),await so({stdio:"inherit"})`${t} ${e.userProject}`,Se();let r={path:e.userProject,editor:t};return{content:[{type:"text",text:JSON.stringify(r,null,2)}],structuredContent:r}};import p from"node:fs";import R from"node:path";import A from"node:process";var co="autoload-warn-misconfig.flag",lo="autoload-warn-fail.flag",oe="autoload-fail.flag",mo=3e4,ut=async(e=!0)=>{let t;try{t=await ye()}catch{return null}let o=t.envAutoLoad;return o?t.environments.includes(o.config)?{trigger:o.trigger,config:o.config,project:t.envManagement.config.name}:(e&&gt(`infra-kit: envAutoLoad.config "${o.config}" is not one of environments [${t.environments.join(", ")}] \u2014 env auto-load disabled.`,co),null):null},ft=e=>{let{trigger:t,expectedTrigger:o,targetConfig:r,targetProject:a,env:i,force:n}=e;return t!==o||!i.session||i.cleared||i.currentConfig&&!i.autoLoadedMarker||!n&&i.autoLoadedMarker&&i.currentConfig===r&&i.currentProject===a?"skip":"load"},b=async({expectedTrigger:e,projectDir:t,force:o})=>{let r=e==="cli-invocation";try{let a=await ut(r);if(!a||ft({trigger:a.trigger,expectedTrigger:e,targetConfig:a.config,targetProject:a.project,env:po(),force:o})==="skip"||pt()||go())return null;let n=uo(),s=await je({config:a.config,autoLoaded:!0,projectDir:t,beforeWrite:()=>!pt()&&!fo(n)});return s?(ho(),s.filePath):null}catch(a){let i=a.message;return vo(),r?gt(`infra-kit: env auto-load failed \u2014 ${i} (will retry later)`,lo):l.debug(`env auto-load skipped: ${i}`),null}},po=()=>({session:A.env[Ie],cleared:A.env[_e],currentConfig:A.env[Le],currentProject:A.env[Ne],autoLoadedMarker:A.env[Y]}),uo=()=>{try{return p.statSync(R.join(w(),N)).mtimeMs}catch{return null}},fo=e=>{try{let t=R.join(w(),N);if(!p.existsSync(t))return!1;let o=p.statSync(t).mtimeMs;return e!==null&&o<=e?!1:new RegExp(`^unset ${Y}$`,"m").test(p.readFileSync(t,"utf-8"))}catch{return!1}},pt=()=>{try{let e=w(),t=R.join(e,be);if(!p.existsSync(t))return!1;let o=R.join(e,N);return p.existsSync(o)?p.statSync(t).mtimeMs>=p.statSync(o).mtimeMs:!0}catch{return!1}},go=()=>{try{let e=R.join(w(),oe);return p.existsSync(e)?Date.now()-p.statSync(e).mtimeMs<mo:!1}catch{return!1}},vo=()=>{try{let e=w();p.mkdirSync(e,{recursive:!0,mode:448}),p.writeFileSync(R.join(e,oe),"",{mode:384})}catch{}},ho=()=>{try{p.rmSync(R.join(w(),oe),{force:!0})}catch{}},gt=(e,t)=>{try{let o=w(),r=R.join(o,t);if(p.existsSync(r))return;p.mkdirSync(o,{recursive:!0,mode:448}),p.writeFileSync(r,"",{mode:384})}catch{}l.warn(e)};var re=async({projectDir:e}={})=>{await b({expectedTrigger:"shell-startup",projectDir:e,force:!0})};import{spawn as yo}from"node:child_process";import $ from"node:process";import{fileURLToPath as So}from"node:url";var wo=["SIGINT","SIGTERM"],vt=()=>So(new URL("./mcp.js",import.meta.url)),ne=(e={})=>{let t=e.spawn??yo,o=e.exit??(n=>$.exit(n)),r=e.env??$.env,a=e.onError??(n=>l.error(n)),i=t($.execPath,[vt()],{stdio:"inherit",env:L(r)});i.on("error",n=>{a(`failed to launch the MCP server: ${n.message}`),o(1)}),wo.forEach(n=>{$.on(n,()=>{i.kill(n)})}),i.on("exit",(n,s)=>{o(s?1:n??1)})};import{spawnSync as Ro}from"node:child_process";import{realpathSync as Eo}from"node:fs";import ie from"node:process";import{fileURLToPath as xo}from"node:url";var Co=()=>Eo(xo(import.meta.url)),ko=(e,t,o,r)=>e.error?(o(`${t} not found on PATH: ${e.error.message}`),r(1)):e.signal?(o(`update terminated by signal ${e.signal}`),r(1)):r(e.status??1),ae=({dryRun:e},t={})=>{let o=t.spawnSync??Ro,r=t.print??(k=>l.info(k)),a=t.exit??(k=>ie.exit(k)),i=t.env??ie.env,n=t.selfRealPath??Co(),s=t.lazyNpmRoot??lt,{manager:c,updateCommand:d,canSelfSpawn:f}=ct({selfRealPath:n,env:i,realpath:P,lazyNpmRoot:s}),v=d.join(" ");if(e){r(`Detected install manager: ${c}`),r(`Would run: ${v}`);return}if(!f){r(`Detected install manager: ${c}`),r(`Run this yourself: ${v}`),r(c==="homebrew"?"Not run for you: Homebrew manages this install; running a package manager would create a split-brain install.":"Not run for you: the install location is unrecognized, so the command above is a guess \u2014 a guessed global install is worse than a printed one.");return}let C=o(d[0],d.slice(1),{stdio:"inherit",shell:ie.platform==="win32",env:L(i)});ko(C,c,r,a)};import se from"node:fs/promises";import ce from"node:path";import ht from"node:process";import{pathToFileURL as Po}from"node:url";var yt="~/projects",le=async(e={})=>{if(e.init){await Ao(e.cwd);return}await To()},To=async()=>{let e=B(),t=await x(e);if(l.info(`Factory config: ${S(e)} ${t?"[\u2713]":"[ ]"}`),!t){l.info("\nNot found \u2014 run `infra-kit vendor-config --init` to scaffold it."),ht.exitCode=1;return}let{workspaceDir:o,targets:r}=await Pe(),a=ke(o),i=await x(a);l.info(`workspaceDir: ${o} (resolved: ${a}) ${i?"[\u2713 exists]":"[ ] not found"}`),l.info("Targets:");let n=i;for(let s of r){let c=ce.join(a,s),d=await x(c);d||(n=!1);let f=d?"[\u2713]":"[ ]",v=d?"":" (not found \u2014 clone or remove)";l.info(` ${f} ${s} ${S(c)}${v}`)}n||(ht.exitCode=1)},Ao=async e=>{let t=B();if(await x(t)){l.info(`Factory config already exists at ${S(t)} \u2014 leaving it untouched.`);return}let o=e??await he(),r=await bo(o);await se.mkdir(ce.dirname(t),{recursive:!0}),await se.writeFile(t,Io(r),"utf-8"),l.info(`\u2713 Created ${S(t)}`),r.length>0&&l.info(` Seeded ${r.length} target(s) from the source ${W}.`),l.info(` Edit \`workspaceDir\` (placeholder: ${yt}) to point at where your repos live.`),r.length===0&&l.info(" Add at least one repo name to `targets` before running vendor sync/manifest/diff.")},bo=async e=>{try{let t=ce.join(e,W),o=await se.stat(t),i=(await import(`${Po(t).href}?mtime=${Number(o.mtimeMs)}`)).default,n=typeof i=="function"?await i():i;if(n&&typeof n=="object"&&"targets"in n){let s=n.targets;if(Array.isArray(s)&&s.every(c=>typeof c=="string"))return s}}catch{}return[]},Io=e=>`${JSON.stringify({workspaceDir:yt,targets:e},null,2)}
5
+ `;var j=(e,t=!0)=>({line:e,reproducible:t});import U from"node:fs";import Lo from"node:os";import No from"node:path";import Et from"node:process";var F="INFRA_KIT_SESSION_REPORT",me=null,St=!1,wt=[],xt=(e=Et.env)=>{St||(me=e[F]??null,St=!0,delete e[F])};var Ct=(e,t)=>{if(!me)return;let o=e.summary??(wt.length>0?[...wt]:void 0),r={...e,...o?{summary:o}:{}},a=t?.write??((i,n)=>{U.writeFileSync(i,n)});try{a(me,JSON.stringify(r))}catch{}},Rt=0,kt=e=>{let t=e?.tmpdir?.()??Lo.tmpdir(),o=e?.pid??Et.pid;return Rt+=1,No.join(t,`infra-kit-session-${o}-${Rt}.json`)},Pt=(e,t)=>{if(!(t?.exists??(n=>U.existsSync(n)))(e))return null;let r=t?.read??(n=>U.readFileSync(n,"utf-8")),a=t?.unlink??(n=>U.unlinkSync(n)),i;try{i=r(e)}catch{return null}finally{try{a(e)}catch{}}try{return JSON.parse(i)}catch{return null}};var Do=(e,t)=>[...t,e],de=e=>typeof e=="string"?e.split(",").filter(Boolean):void 0,Tt=(e,t)=>{if(!(typeof e>"u")){if(e===!0)return"workspace";if(e===!1)return"none";if(typeof e=="string"&&H.includes(e))return e;throw new Error(`Invalid ${t} value "${String(e)}". Expected one of: ${H.join(", ")}.`)}},G={value:!1},g=(e,t)=>e.hook("preAction",()=>{G.value||l.warn(`"${e.name()}" is a deprecated alias; use "${t}" instead.`)}),At=e=>e.description("Merge dev branch into every release branch").option("-a, --all","Select all active release branches").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await Ve({all:t.all,confirmedCommand:t.yes}))}),bt=e=>e.description("List all release branches").action(async()=>{m(await Je())}),It=e=>e.description("Create one or more release branches (each entry can mix regular/hotfix and its own description)").option("-r, --release <spec>",'Release spec "<version|next|name>[:type[:description]]" (repeatable). The token is a semver ("1.2.5"), the literal "next", or a kebab-case name ("checkout-redesign"). Type is regular|hotfix (default regular). Examples: "1.2.5", "1.2.5:hotfix", "next:regular:Holiday backend", "checkout-redesign:regular:Q3 redesign".',Do,[]).option("-y, --yes","Skip confirmation prompt").action(async t=>{let r=t.release.map(Ye),a=r.length>0?r:void 0;m(await We({releases:a,confirmedCommand:t.yes}))}),Lt=e=>e.description("Edit a release's description in Jira and in the matching GitHub PR body").option("-v, --version <version>","Release version (e.g. 1.2.5) or release name (e.g. checkout-redesign)").option("-d, --description <description>",'New description (use "" to clear)').option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await He({version:t.version,description:t.description,confirmedCommand:t.yes}))}),Nt=e=>e.description("Deploy any release branch to any environment").option("-v, --version <version>",'Version (e.g. 1.2.5) or release name (e.g. checkout-redesign) to deploy; "dev" deploys from the dev branch').option("-e, --env <env>","Specify the environment to deploy to, e.g. dev").option("--skip-terraform","Skip terraform deployment step").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await Ke({version:t.version,env:t.env,skipTerraform:t.skipTerraform,confirmedCommand:t.yes}))}),_t=e=>e.description("Deploy selected services from release branch to any environment").option("-v, --version <version>",'Version (e.g. 1.2.5) or release name (e.g. checkout-redesign) to deploy; "dev" deploys from the dev branch').option("-e, --env <env>","Specify the environment to deploy to, e.g. dev").option("-s, --services <services...>","Specify services to deploy, e.g. client-be client-fe").option("--skip-terraform","Skip terraform deployment step").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await Be({version:t.version,env:t.env,services:t.services,skipTerraform:t.skipTerraform,confirmedCommand:t.yes}))}),Dt=e=>e.description("Release a new version to production").option("-v, --version <version>","Version (e.g. 1.2.5) or release name (e.g. checkout-redesign) to deliver").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await qe({version:t.version,confirmedCommand:t.yes}))}),Mt=e=>e.description("Remove release worktrees whose PRs are no longer open").option("-y, --yes","Skip confirmation prompt").action(async t=>{m(await it({confirmedCommand:t.yes}))}),Ot=e=>e.description("Add git worktrees for release branches").option("-y, --yes","Skip confirmation prompt").option("-a, --all","Select all active release branches").option("-v, --versions <versions>","Specify versions by comma, e.g. 1.2.5, 1.2.6").option("-i, --ide [mode]","Editor mode for created worktrees: workspace (default) | none").option("--no-ide","Skip the editor (alias for --ide none)").option("-c, --cursor [mode]","Deprecated alias for --ide").option("--no-cursor","Deprecated alias for --no-ide").option("-g, --github-desktop","Open created worktrees in GitHub Desktop").option("--no-github-desktop","Skip GitHub Desktop prompt").option("-m, --cmux","Open created worktrees in cmux (3-pane layout)").option("--no-cmux","Skip cmux prompt").action(async t=>{let o=Tt(t.ide,"--ide")??Tt(t.cursor,"--cursor");m(await tt({confirmedCommand:t.yes,all:t.all,versions:t.versions,ide:o,githubDesktop:t.githubDesktop,cmux:t.cmux}))}),$t=e=>e.description("List all git worktrees with detailed information").action(async()=>{m(await ot())}),jt=e=>e.description("Remove git worktrees for release branches").option("-y, --yes","Skip confirmation prompt").option("-a, --all","Select all active release branches").option("-v, --versions <versions>","Specify versions by comma, e.g. 1.2.5, 1.2.6").action(async t=>{m(await nt({confirmedCommand:t.yes,all:t.all,versions:t.versions}))}),Ut=e=>e.description("Close all cmux/editor worktree windows, then reopen the current release worktrees (also cold-start restore)").action(async()=>{m(await rt())}),Ft=e=>e.description("Show the machine-local factory config (~/.infra-kit/vendor.json) or scaffold it with --init").option("--init","Scaffold ~/.infra-kit/vendor.json (skips if it already exists)").action(async t=>{m(await le({init:t.init}))}),Gt=e=>e.description("Verify vendor/ matches vendor/.sync-manifest.json (self-contained; for any consumer repo)").action(async()=>{let t=await ze();m(t),t.structuredContent.ok||(I.exitCode=1)}),Vt=e=>e.description("Source-aware drift check (rsync dry-run) of each target vendored subtree vs the source").option("-r, --repos <repos>","Restrict to comma-separated target repo names").action(async t=>{let o=await Xe({repos:de(t.repos)});m(o),o.structuredContent.ok||(I.exitCode=1)}),qt=e=>e.description("Show the resolved config merge chain and file paths").action(async()=>{m(await ee())}),Kt=e=>e.description("Open the user-scope per-project override file in $EDITOR").action(async()=>{m(await te())}),Mo=new Set(["init","doctor","version","dev","self-update","mcp"]),Oo=e=>e.startsWith("env-")||Mo.has(e),$o=new Set(["env-autoload","mcp","version","self-update"]),pe=e=>{let t=[];for(let o=e;o&&o.parent;o=o.parent)t.unshift(o.name());return t.join(" ")},ue=()=>{let e=new _o,t=e.command("release").description("Release management commands");At(t.command("merge-dev")),bt(t.command("list")),It(t.command("create")),Lt(t.command("desc-edit")),Nt(t.command("deploy-all")),_t(t.command("deploy-selected")),Dt(t.command("deliver"));let o=e.command("worktrees").description("Git worktree management commands");Ot(o.command("add")),$t(o.command("list")),jt(o.command("remove")),Mt(o.command("sync")),Ut(o.command("reload")),g(At(e.command("merge-dev")),"release merge-dev"),g(bt(e.command("release-list")),"release list"),g(It(e.command("release-create")),"release create"),g(Lt(e.command("release-desc-edit")),"release desc-edit"),g(Nt(e.command("release-deploy-all")),"release deploy-all"),g(_t(e.command("release-deploy-selected")),"release deploy-selected"),g(Dt(e.command("release-deliver")),"release deliver"),g(Ot(e.command("worktrees-add")),"worktrees add"),g($t(e.command("worktrees-list")),"worktrees list"),g(jt(e.command("worktrees-remove")),"worktrees remove"),g(Mt(e.command("worktrees-sync")),"worktrees sync"),g(Ut(e.command("worktrees-reload")),"worktrees reload");let r=e.command("config").description("Manage infra-kit configuration files");qt(r.command("path")),Kt(r.command("edit")),qt(e.command("config-path",{hidden:!0})),Kt(e.command("config-edit",{hidden:!0})),e.command("audit").description("Audit against infra-kit.config.ts rules (--all for every package, --root for the monorepo root)").option("-a, --all","Audit every non-vendor workspace package").option("-r, --root","Audit the monorepo root (turbo pipeline + root commands)").action(async i=>{let n=await we({all:i.all,root:i.root});m(n),n.structuredContent.allPassed||(I.exitCode=1)});let a=e.command("vendor").description("Verify and sync the mirrored vendor/ tree");return Gt(a.command("check")),a.command("sync").description("Copy vendored files from the source repo into each target and regenerate manifests").option("-y, --yes","Skip confirmation prompt").option("-r, --repos <repos>","Restrict to comma-separated target repo names").action(async i=>{m(await Ze({confirmedCommand:i.yes,repos:de(i.repos)}))}),a.command("manifest").description("Regenerate each target vendor/.sync-manifest.json + README from current content (no copy)").option("-r, --repos <repos>","Restrict to comma-separated target repo names").action(async i=>{m(await Qe({confirmedCommand:!0,repos:de(i.repos)}))}),Vt(a.command("diff")),Ft(a.command("config")),g(Ft(e.command("vendor-config")),"vendor config"),Gt(e.command("vendor-check",{hidden:!0})),Vt(e.command("vendor-diff",{hidden:!0})),e.command("doctor").description("Check installation and authentication status of gh and doppler CLIs").action(async()=>{m(await De())}),e.command("self-update").description("Update this CLI using the package manager that installed it").option("--dry-run","Print the detected manager and the command that would run; install nothing").action(i=>{ae({dryRun:!!i.dryRun})}),e.command("mcp").description("Run the infra-kit MCP server (stdio transport)").action(()=>{ne()}),e.command("dev").description("Run local dev servers for a named devServersPresets preset (or all apps); api + ui").argument("[preset]","Named preset from devServersPresets (omit to run every app)").option("-w, --watch","Rebuild and restart on file save").option("--app <names>","Further narrow to these app folder names (comma-separated)").option("--target <keys>","Run exactly these <app>/api|<app>/ui packages (comma-separated); part-level, unlike --app").option("--cmux","Run each app in its own cmux pane (one workspace, N panes; falls back to single terminal if cmux is unavailable)").option("--self","Run only the app of the current directory (infer from cwd; use inside apps/<app>/\u2026)").option("-V, --verbose","Print full boot narration (default: quiet; full detail always in the session log)").option("--routes","Print each app\u2019s registered METHOD /path routes at startup (default: off)").action(async(i,n)=>{let{runDevServerCli:s}=await import("./dev-server.js"),c=!!(I.stdout.isTTY&&I.stdin.isTTY);await s({...n,preset:i},c,_.enabled)}),e.command("version").description("Print the installed infra-kit CLI version").action(async()=>{m(await et())}),e.command("env-status").description("Show which env is loaded in this session (local introspection; no Doppler call)").action(async()=>{m(await Fe())}),e.command("env-list").description("List available Doppler configs for the detected project").action(async()=>{m(await Oe())}),e.command("init").description("Inject shell integration into .zshrc and sync repo agent-instruction files").action(async()=>{m(await J())}),e.command("env-load").description("Load Doppler env vars for a config. Source the returned file path to apply.").option("-c, --config <config>","Environment config name to load (e.g. dev, arthur)").action(async i=>{m(await Ue({config:i.config}))}),e.command("env-clear").description("Clear loaded env vars. Source the returned file path to apply.").option("--purge","Also delete this project's warm cache outright (durable disable)").action(async i=>{m(await Me({purge:!!i.purge}))}),e.command("env-autoload",{hidden:!0}).description("Internal: prime env for the shell-startup auto-load trigger").option("--project-dir <dir>","Canonical project dir for the warm-cache key (shell-startup only)").action(async i=>{await re({projectDir:i.projectDir})}),e.commands.forEach(Ge),e.hook("preAction",async(i,n)=>{_.enabled=!!n.optsWithGlobals().json,_.enabled&&(l.level="warn"),$o.has(pe(n))||await Ce(),Oo(n.name())||await b({expectedTrigger:"cli-invocation"})}),e.hook("postAction",(i,n)=>{let s=pe(n);if(st(s))return;let d=$e.snapshot()?.formattedOptions??"",f=d?` ${d}`:"",v=`infra-kit ${s}${f}`;Ct({equivalent:j(v,!0)})}),e};var fe=(e,t=" ")=>{let o=e.reduce((r,[a])=>Math.max(r,a.length),0);return e.map(([r,a])=>`${r.padEnd(o)}${t}${a}`)};import{spawn as Go}from"node:child_process";import y from"node:process";var h={ok:"ok",findingsPlain:"completed with findings",failed:"failed",cancelled:"cancelled",findingsSuffix:"findings",sep:" \xB7 ",reproPrefix:"$ ",nonReproPrefix:"\u2248 ",envNotice:"Applies to your shell after you exit this session."},Bt={ok:{unicode:"\u2713",ascii:"[ok]"},findings:{unicode:"\u26A0",ascii:"[!]"},failed:{unicode:"\u2717",ascii:"[x]"},cancelled:{unicode:"\u2298",ascii:"[-]"}},Jt=e=>`${h.reproPrefix}${e}`,jo=e=>e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(1)}s`,Uo=(e,t)=>e==="findings"?t!=null?`${t} ${h.findingsSuffix}`:h.findingsPlain:{ok:h.ok,failed:h.failed,cancelled:h.cancelled}[e],Yt=e=>{let t=e.equivalent.reproducible?h.reproPrefix:h.nonReproPrefix,o=e.ascii===!0?Bt[e.outcome].ascii:Bt[e.outcome].unicode,a=[Uo(e.outcome,e.findingsCount),jo(e.durationMs)],i=e.summary?.[0];i!=null&&i.length>0&&a.push(i);let n=[`${o} ${a.join(h.sep)}`];return e.showEquivalent!==!1&&n.unshift(`${t}${e.equivalent.line}`),e.envNotice===!0&&n.push(h.envNotice),n.join(`
6
+ `)};var Fo=new Set([130,143]),Wt=(e,t,o,r=!1)=>o?t!=null||e===0?"ok":"findings":r&&e!=null&&Fo.has(e)||t==="SIGINT"||e===0?"cancelled":"failed";import Ht from"node:process";var E={column:"\r",sgr:"\x1B[0m",cursor:"\x1B[?25h",wrap:"\x1B[?7h",saveCursor:"\x1B7",restoreCursor:"\x1B8",scrollRegion:"\x1B[r",primaryBuffer:"\x1B[?1049l"},zt=(e,t)=>{let o=t?.write??(i=>{Ht.stderr.write(i)}),r=t?.stdin??Ht.stdin,a=[E.saveCursor,E.scrollRegion,E.restoreCursor,E.column,E.sgr,E.cursor,E.wrap];e.entersAltScreen===!0&&a.push(E.primaryBuffer),o(a.join("")),r.isTTY===!0&&r.isRaw===!0&&r.setRawMode?.(!1)};var Xt=e=>`infra-kit ${e.groupPath.join(" ")}`,Vo=e=>new Promise(t=>{e.on("exit",(o,r)=>{t({code:o,signal:r})}),e.on("error",()=>{t({code:1,signal:null})})}),qo=async(e,t,o)=>{let r=kt(),a={...t.env,[F]:r,INFRA_KIT_NO_AUTO_UPDATE:"1"},i=t.now(),n={code:1,signal:null};o(!0);try{let v=t.spawn(y.execPath,[t.cliPath,...e.groupPath],{stdio:"inherit",env:a});n=await Vo(v)}catch{n={code:1,signal:null}}finally{o(!1),t.resetTerminal({entersAltScreen:e.entersAltScreen})}let s=Pt(r),c=Wt(n.code,n.signal,s!=null,e.longRunning),d=Xt(e),f=s?.equivalent??j(d,!0);return Yt({equivalent:f,outcome:c,durationMs:t.now()-i,summary:s?.summary,envNotice:e.sessionEnvNotice,ascii:t.ascii,showEquivalent:!(f.reproducible&&f.line===d)})},Ko=(e,t)=>{let o=!1,r=!1,a=()=>{if(e()){o=!0;return}t.exit(0)},i=()=>{if(!e()){t.exit(0);return}o||(r=!0)},n=()=>{t.exit(129)},s=()=>{e()&&t.raise("SIGSTOP")};return t.register("SIGINT",a),t.register("SIGTERM",i),t.register("SIGHUP",n),t.register("SIGTSTP",s),{dispose:()=>{t.unregister("SIGINT",a),t.unregister("SIGTERM",i),t.unregister("SIGHUP",n),t.unregister("SIGTSTP",s)},childStarted:()=>{o=!1},quitRequested:()=>r}},Qt=(e,t)=>!!(t.stdoutIsTTY&&t.stdinIsTTY&&t.stderrIsTTY&&e.TERM!=="dumb"&&!e.INFRA_KIT_NO_SESSION&&!e.INFRA_KIT_SESSION_REPORT),Zt=async(e,t)=>{let o={spawn:t.spawn??Go,now:t.now??(()=>Date.now()),env:t.env??y.env,cliPath:t.cliPath,ascii:t.ascii??!(y.stdout.isTTY&&y.env.TERM!=="dumb"),resetTerminal:t.resetTerminal??(c=>{zt(c)})},r=t.write??(c=>y.stderr.write(c)),a=t.signals??{register:(c,d)=>{y.on(c,d)},unregister:(c,d)=>{y.off(c,d)},exit:c=>{y.exit(c)},raise:c=>{y.kill(y.pid,c)}},i=!1,n={dispose:()=>{},childStarted:()=>{},quitRequested:()=>!1},s=t.installSignals===!1?n:Ko(()=>i,a);try{for(;;){let c=await t.renderPalette(e);if(c==null)return;let d=t.resolveCommand(c);if(!d)continue;let f=Jt(Xt(d));r(`
7
+ ${f}
8
+ `),s.childStarted();let v=await qo(d,o,C=>{i=C});if(r(`
9
+ ${v}
10
+ `),s.quitRequested())return}}finally{s.dispose()}};import{spawn as Yo}from"node:child_process";import to from"node:fs";import T from"node:process";import{fileURLToPath as oo}from"node:url";var eo=["INFRA_KIT_NO_AUTO_UPDATE","NO_UPDATE_NOTIFIER","CI"],Bo=new Set(["mcp","self-update"]),Jo=e=>e[2]!=null&&Bo.has(e[2]),ge=e=>{let{argv:t,env:o,isTty:r,selfRealPath:a,cwd:i,realpath:n}=e;return eo.some(c=>{let d=o[c];return d!=null&&d!==""})?"opt-out":t.includes("--json")?"json":Jo(t)?"own-command":r?O(a,i,n)?"local-install":null:"not-a-tty"};var Wo=e=>{Yo(T.execPath,[e,"--parent-pid",String(T.pid)],{detached:!0,stdio:"ignore",windowsHide:!0}).unref()},Ho=()=>oo(new URL("./update-check.js",import.meta.url)),zo=()=>to.realpathSync(oo(new URL("./cli.js",import.meta.url))),Xo=/^[\w@./+-]+$/i,Qo=e=>Xo.test(e),Zo=(e,t,o)=>{!e?.latestVersion||!e.updateCommand||X(e.latestVersion,t)&&e.updateCommand.every(Qo)&&o(`infra-kit ${e.latestVersion} is available (you have ${t}). Run: ${e.updateCommand.join(" ")}`)},ve=(e,t={})=>{try{let o=t.argv??T.argv,r=t.env??T.env,a=t.isTty??!!T.stdout.isTTY,i=t.cwd??T.cwd(),n=t.nowMs??Date.now(),s=t.selfRealPath??zo(),c=t.readCache??Q,d=t.spawnChild??Wo,f=t.fileExists??(q=>to.existsSync(q)),v=t.notify??(q=>{l.info(q)});if(ge({argv:o,env:r,isTty:a,selfRealPath:s,cwd:i,realpath:P})!==null)return;let C=c();if(Zo(C,e,v),!Z(C,n))return;let k=t.childPath??Ho();if(!f(k))return;d(k)}catch{}};xt();var V=ue(),no=async e=>{try{e?await V.parseAsync(e):await V.parseAsync()}catch(t){z(t)&&(l.info("Operation cancelled."),u.exit(0));let o=t instanceof Error?t.message:String(t);l.error(o),u.exit(1)}},or=()=>{try{if(u.env.INFRA_KIT_NO_LOCATION_WARN||u.argv.includes("--json")||u.argv[2]==="mcp")return;O(tr(io(import.meta.url)),u.cwd(),P)&&l.info("Running from a project-local node_modules. Install globally for faster startup: npm i -g infra-kit")}catch{}};or();ve(Re.version);var rr=()=>new Map(V.commands.map(e=>[e.name(),e])),ao=()=>mt(V.commands),nr=async()=>{let e=rr(),t=ao(),o=null;try{if(u.stdout.isTTY&&u.stdin.isTTY){let{runCommandPalette:r}=await import("./boot-YCABHUPP.js");o=await r(t)}else{let r=fe(t.map(n=>[n.name,n.description])),a=new Map;t.forEach((n,s)=>{a.set(n.name,r[s]??n.name)});let i=n=>n.filter(s=>e.has(s)).map(s=>({name:a.get(s)??s,value:s}));o=await er({message:"Select a command to run",choices:D.flatMap(({key:n,label:s})=>{let c=i(M(n));return c.length===0?[]:[new ro(" "),new ro(`\u2014 ${s} \u2014`),...c]})},{output:u.stderr})}}catch(r){if(!z(r))throw r}return o},ir=async()=>{let{runCommandPalette:e}=await import("./boot-YCABHUPP.js"),t=io(import.meta.url),o=new Map(at.map(r=>[r.cliName,r]));await Zt(ao(),{renderPalette:e,resolveCommand:r=>{let a=o.get(r);return a?{groupPath:a.groupPath,entersAltScreen:a.entersAltScreen,sessionEnvNotice:a.sessionEnvNotice,longRunning:a.longRunning}:void 0},cliPath:t})};if(u.argv.length<=2){let e={stdoutIsTTY:!!u.stdout.isTTY,stdinIsTTY:!!u.stdin.isTTY,stderrIsTTY:!!u.stderr.isTTY};if(Qt(u.env,e))await ir();else{let t=await nr();t&&(G.value=!0,await no(["node","infra-kit",t]))}}else await no();
11
11
  //# sourceMappingURL=cli.js.map