codex-1up 0.2.7 → 0.2.8

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/main.js +36 -36
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -1,61 +1,61 @@
1
- import{runMain as Co}from"citty";import{defineCommand as ho}from"citty";import{readFileSync as wo}from"fs";import{fileURLToPath as yo}from"url";import{dirname as bo,join as ko}from"path";import{defineCommand as Nt}from"citty";import{fileURLToPath as Tt}from"url";import{dirname as Dt,resolve as D}from"path";import{promises as ee}from"fs";import*as Z from"os";import{accessSync as At}from"fs";import*as Se from"toml";import*as l from"@clack/prompts";import{which as W,$ as Q}from"zx";import It from"fs-extra";import*as $e from"path";import*as Ke from"os";import{createWriteStream as dt}from"fs";function Te(e){let t=null;try{t=dt(e,{flags:"a"})}catch{}let o=(r,n)=>{let i=r?`${r} ${n}
2
- `:`${n}
3
- `;process.stdout.write(i),t&&t.write(i)};return{log:r=>o("",r),info:r=>o("",r),ok:r=>o("\u2714",r),warn:r=>o("\u26A0",r),err:r=>o("\u2716",r)}}import{$ as q}from"zx";import{which as ct,$ as ut}from"zx";import{spawn as gt}from"child_process";async function u(e){try{return await ct(e),!0}catch{return!1}}async function De(){return await u("brew")?"brew":await u("apt-get")?"apt":await u("dnf")?"dnf":await u("pacman")?"pacman":await u("zypper")?"zypper":"none"}function N(e){return typeof process.getuid=="function"&&process.getuid()===0?{cmd:e,argsPrefix:[]}:{cmd:"sudo",argsPrefix:[e]}}async function ae(e){if(await u("pnpm"))try{if((await ut`pnpm bin -g`.quiet()).stdout.trim())return"pnpm";e?.warn('Detected pnpm but global bin dir is not configured; skipping global Node installs to avoid duplicates. Run "pnpm setup" then re-run.')}catch{e?.warn('Detected pnpm but global bin dir is not configured; skipping global Node installs to avoid duplicates. Run "pnpm setup" then re-run.')}return await u("pnpm")?"none":"npm"}async function m(e,t,o={dryRun:!1}){if(o.dryRun){let n=[e,...t].map(i=>i.includes(" ")?`"${i}"`:i).join(" ");o.logger?.log(`[dry-run] ${n}`);return}let r=gt(e,t,{stdio:"inherit",cwd:o.cwd||process.cwd(),shell:!1});await new Promise((n,i)=>{r.on("error",i),r.on("exit",a=>{if(a===0)return n();i(new Error(`Command failed (${a}): ${e} ${t.join(" ")}`))})})}function T(e){let t=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);return`${e}.backup.${t}`}import Ae from"fs-extra";import*as H from"path";import*as K from"os";async function _e(e){let t=await u("node"),o=await u("npm");if(t&&o){let n=(await q`node -v`).stdout.trim();e.logger.ok(`Node.js present (${n})`);return}switch(e.options.installNode){case"nvm":await mt(e);break;case"brew":await ht(e);break;case"skip":e.logger.warn("Skipping Node installation; please install Node 18+ manually");return}if(await u("node")){let n=(await q`node -v`).stdout.trim();e.logger.ok(`Node.js installed (${n})`)}else throw e.logger.err("Node installation failed"),new Error("Node.js installation failed")}async function mt(e){if(e.logger.info("Installing Node.js via nvm"),e.options.dryRun){e.logger.log("[dry-run] install nvm + Node LTS");return}let t=H.join(e.homeDir,".nvm"),o=H.join(t,"nvm.sh");await Ae.pathExists(t)||(e.logger.info("Installing nvm..."),await q`bash -c "curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash"`);let r=`export NVM_DIR="${t}" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" && nvm install --lts`;await q`bash -c ${r}`}async function ht(e){if(e.logger.info("Installing Node.js via Homebrew"),!await u("brew"))if(K.platform()==="darwin"){if(e.logger.info("Homebrew not found; installing Homebrew"),e.options.dryRun){e.logger.log("[dry-run] install Homebrew");return}await q`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`;let t=K.platform()==="darwin"&&K.arch()==="arm64"?"/opt/homebrew/bin/brew":"/usr/local/bin/brew";if(await Ae.pathExists(t)){let o=H.dirname(t);process.env.PATH=`${o}:${process.env.PATH||""}`;try{let n=(await q`${t} shellenv`).stdout.trim().match(/export PATH="([^"]+)"/);n&&(process.env.PATH=`${n[1]}:${process.env.PATH||""}`)}catch{}}}else throw new Error("Homebrew is only available on macOS");await m("brew",["install","node"],{dryRun:e.options.dryRun,logger:e.logger})}import{$ as he}from"zx";var wt=["@openai/codex"],yt="@openai/codex";async function je(e){if(e.options.installCodexCli==="no"){e.logger.info("Skipping Codex CLI install (user choice)");return}e.logger.info("Checking global packages (@openai/codex)");let t=[];for(let o of wt)try{if(o===yt&&await u("codex")){e.logger.ok("codex found on PATH; skipping global install/upgrade");continue}let n=(await he`npm view ${o} version`.quiet()).stdout.trim();if(!n){e.logger.warn(`Could not fetch latest version for ${o}; skipping upgrade check`);continue}let i=await he`npm ls -g ${o} --depth=0 --json`.quiet().nothrow(),a="";try{a=JSON.parse(i.stdout||"{}").dependencies?.[o]?.version||""}catch{a=""}a?a!==n?(e.logger.info(`${o} ${a} -> ${n}`),t.push(`${o}@${n}`)):e.logger.ok(`${o} up-to-date (${a})`):(e.logger.info(`${o} not installed; will install @${n}`),t.push(`${o}@${n}`))}catch(r){e.logger.warn(`Error checking ${o}: ${r}`);let n=await he`npm ls -g ${o} --depth=0 --json`.quiet().nothrow(),i="";try{i=JSON.parse(n.stdout||"{}").dependencies?.[o]?.version||""}catch{i=""}i||t.push(o)}if(t.length>0){let o=await ae(e.logger);o==="none"?e.logger.warn('Skipping global Node installs because pnpm is detected but not configured. Run "pnpm setup" and re-run the installer.'):o==="pnpm"?(e.logger.info("Installing/updating global packages via pnpm"),await m("pnpm",["add","-g",...t],{dryRun:e.options.dryRun,logger:e.logger})):(e.logger.info("Installing/updating global packages via npm"),await m("npm",["install","-g",...t],{dryRun:e.options.dryRun,logger:e.logger}))}else e.logger.ok("Global packages are up-to-date");await u("codex")?e.logger.ok("Codex CLI installed"):e.logger.err("Codex CLI not found after install")}import{$ as bt}from"zx";import*as ye from"path";import we from"fs-extra";var kt={brew:["fd","ripgrep","fzf","jq","yq","difftastic","ast-grep"],apt:["ripgrep","fzf","jq","yq","git-delta"],dnf:["ripgrep","fd-find","fzf","jq","yq","git-delta"],pacman:["ripgrep","fd","fzf","jq","yq","git-delta"],zypper:["ripgrep","fd","fzf","jq","yq","git-delta"],none:[]};async function Oe(e){if(e.options.installTools==="no"){e.logger.info("Skipping developer tool installs (user choice)");return}let t=await De();if(e.logger.info(`Detected package manager: ${t}`),t==="none"){e.logger.warn("Could not detect a supported package manager; please install tools manually");return}let o=kt[t]||[];if(o.length>0)switch(t){case"brew":await m("brew",["update"],{dryRun:e.options.dryRun,logger:e.logger}),await m("brew",["install",...o],{dryRun:e.options.dryRun,logger:e.logger});break;case"apt":{let{cmd:n,argsPrefix:i}=N("apt-get");try{await m(n,[...i,"update","-y"],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn('apt-get update failed; install developer tools manually with "sudo apt-get update" followed by installs for ripgrep, fzf, jq, yq, git-delta, then re-run codex-1up if needed.');break}for(let a of o)try{await m(n,[...i,"install","-y",a],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn(`apt-get install failed for ${a}; you can install it manually with "sudo apt-get install ${a}".`)}if(!await u("fd"))try{await m(n,[...i,"install","-y","fd-find"],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn("apt-get install failed for fd-find; fd may not be available. Install manually if you prefer fd over fdfind.")}}break;case"dnf":{let{cmd:n,argsPrefix:i}=N("dnf");await m(n,[...i,"install","-y",...o],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"pacman":{let{cmd:n,argsPrefix:i}=N("pacman");await m(n,[...i,"-Sy","--noconfirm",...o],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"zypper":{let{cmd:n,argsPrefix:i}=N("zypper");await m(n,[...i,"refresh"],{dryRun:e.options.dryRun,logger:e.logger}),await m(n,[...i,"install","-y",...o],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break}if(!await u("difft")&&!await u("difftastic")&&(await u("cargo")?(e.logger.info("Installing difftastic via cargo"),await m("cargo",["install","difftastic"],{dryRun:e.options.dryRun,logger:e.logger})):e.logger.warn("difftastic not found and Rust/cargo missing; falling back to git-delta")),await $t(e,t),await u("fdfind")&&!await u("fd")){let n=ye.join(e.homeDir,".local","bin");await we.ensureDir(n);let i=(await bt`command -v fdfind`).stdout.trim(),a=ye.join(n,"fd");await we.pathExists(a)||(e.options.dryRun?e.logger.log(`[dry-run] ln -s ${i} ${a}`):await we.symlink(i,a),e.logger.ok("fd alias created at ~/.local/bin/fd"))}let r=["fd","fdfind","rg","fzf","jq","yq","difft","difftastic","delta","ast-grep"];for(let n of r)await u(n)&&e.logger.ok(`${n} \u2713`)}async function $t(e,t){if(await u("sg")||await u("ast-grep"))return;let r=await(async()=>{switch(t){case"brew":return await m("brew",["install","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}),!0;case"apt":{let{cmd:i,argsPrefix:a}=N("apt-get");await m(i,[...a,"install","-y","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}return!0;case"dnf":{let{cmd:i,argsPrefix:a}=N("dnf");await m(i,[...a,"install","-y","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}return!0;case"pacman":{let{cmd:i,argsPrefix:a}=N("pacman");await m(i,[...a,"-Sy","--noconfirm","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}return!0;case"zypper":{let{cmd:i,argsPrefix:a}=N("zypper");await m(i,[...a,"install","-y","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}return!0;default:return!1}})();if(await u("sg")||await u("ast-grep"))return;let n=await ae(e.logger);n==="pnpm"?(e.logger.info("Installing ast-grep via pnpm -g"),await m("pnpm",["add","-g","@ast-grep/cli"],{dryRun:e.options.dryRun,logger:e.logger})):n==="npm"?(e.logger.info("Installing ast-grep via npm -g"),await m("npm",["install","-g","@ast-grep/cli"],{dryRun:e.options.dryRun,logger:e.logger})):r||e.logger.warn("ast-grep not installed (no supported package manager or global npm). Install manually from https://ast-grep.github.io/")}import J from"fs-extra";import*as le from"path";var Le={balanced:{root:[["approval_policy",'"on-request"'],["sandbox_mode",'"workspace-write"'],["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"']],features:[["web_search_request","true"]]},safe:{root:[["approval_policy",'"on-failure"'],["sandbox_mode",'"workspace-write"'],["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"']],features:[["web_search_request","false"]]},minimal:{root:[["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"']],features:[["web_search_request","false"]]},yolo:{root:[["approval_policy",'"never"'],["sandbox_mode",'"danger-full-access"'],["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"'],["model_reasoning_summary",'"detailed"'],["model_verbosity",'"high"'],["tool_output_token_limit","25000"]],features:[["web_search_request","true"]]}},vt=`# ~/.codex/config.toml \u2014 managed by codex-1up (patch mode)
4
- `;async function Fe(e){let t=le.join(e.homeDir,".codex","config.toml");await J.ensureDir(le.dirname(t));let o=await J.pathExists(t),r=o?await J.readFile(t,"utf8"):vt,n=new ke(r),i=!1;if(i=Ct(n,e.options.profileScope,e.options.profile,e.options.profileMode)||i,i=St(n,e.options.profile,e.options.setDefaultProfile)||i,i=Rt(n,e.options.notificationSound)||i,!i){e.logger.info("Config already up to date; no changes needed.");return}let a=n.content();if(e.options.dryRun){e.logger.log(`[dry-run] write ${t}`),e.logger.log(a);return}if(o){let s=T(t);await J.copy(t,s),e.logger.info(`Backed up current config to ${s}`)}await J.writeFile(t,a,"utf8"),e.logger.ok("Updated ~/.codex/config.toml with requested settings.")}function Ct(e,t,o,r){if(t==="single"&&o==="skip")return!1;let n=t==="all"?Object.keys(Le):[o],i=!1;for(let a of n){let s=Le[a];if(r==="overwrite")i=e.replaceTable(`profiles.${a}`,s.root)||i,i=e.replaceTable(`profiles.${a}.features`,s.features)||i;else{e.ensureTable(`profiles.${a}`);for(let[f,g]of s.root)i=e.setKey(`profiles.${a}`,f,g,{mode:"if-missing"})||i;e.ensureTable(`profiles.${a}.features`);for(let[f,g]of s.features)i=e.setKey(`profiles.${a}.features`,f,g,{mode:"if-missing"})||i}}return i}function St(e,t,o){return!o||t==="skip"?!1:e.setRootKey("profile",`"${t}"`,{mode:"force"})}function Rt(e,t){if(!t||t==="none")return!1;e.ensureTable("tui");let o=e.getValue("tui","notifications");if(o){let r=o.trim().toLowerCase();if(r.startsWith("true")||r.startsWith("["))return!1}return e.setKey("tui","notifications","true",{mode:"force"})}var ke=class{text;constructor(t){this.text=t||""}content(){return Et(this.text)}ensureTable(t){if(this.hasTable(t))return!1;let o=this.text.length===0?"":Ge(this.text);return this.text=o+`[${t}]
5
- `,!0}setKey(t,o,r,n){let i=se(this.text,t);if(!i)return this.ensureTable(t),this.setKey(t,o,r,n);let a=this.text.slice(i.start,i.end),f=new RegExp(`^\\s*${be(o)}\\s*=.*$`,"m").exec(a);if(f){if(n.mode==="if-missing")return!1;let v=this.text,j=i.start+f.index,G=j+f[0].length;return this.text=v.slice(0,j)+`${o} = ${r}`+v.slice(G),this.text!==v}let g=this.text,b=i.end,w=g.slice(0,b),$=g.slice(b),p=w.length>0&&!w.endsWith(`
1
+ import{runMain as Sn}from"citty";import{defineCommand as wn}from"citty";import{readFileSync as yn}from"fs";import{fileURLToPath as bn}from"url";import{dirname as kn,join as $n}from"path";import{defineCommand as Tt}from"citty";import{fileURLToPath as Dt}from"url";import{dirname as At,resolve as D}from"path";import{promises as te}from"fs";import*as ee from"os";import{accessSync as _t}from"fs";import*as Re from"toml";import*as l from"@clack/prompts";import{which as U,$ as Z}from"zx";import xt from"fs-extra";import*as Ce from"path";import*as Je from"os";import{createWriteStream as ct}from"fs";function De(e){let t=null;try{t=ct(e,{flags:"a"})}catch{}let n=(r,o)=>{let i=r?`${r} ${o}
2
+ `:`${o}
3
+ `;process.stdout.write(i),t&&t.write(i)};return{log:r=>n("",r),info:r=>n("",r),ok:r=>n("\u2714",r),warn:r=>n("\u26A0",r),err:r=>n("\u2716",r)}}import{$ as W}from"zx";import{which as ut,$ as gt}from"zx";import{spawn as mt}from"child_process";async function u(e){try{return await ut(e),!0}catch{return!1}}async function Ae(){return await u("brew")?"brew":await u("apt-get")?"apt":await u("dnf")?"dnf":await u("pacman")?"pacman":await u("zypper")?"zypper":"none"}function x(e){return typeof process.getuid=="function"&&process.getuid()===0?{cmd:e,argsPrefix:[]}:{cmd:"sudo",argsPrefix:[e]}}async function ae(e){if(await u("pnpm"))try{let n=(await gt`pnpm bin -g`.quiet()).stdout.trim();return n?{pm:"pnpm",binDir:n}:(e?.warn('Detected pnpm but global bin dir is not configured; skipping global Node installs to avoid duplicates. Run "pnpm setup" then re-run.'),{pm:"none",reason:"pnpm-misconfigured"})}catch{return e?.warn('Detected pnpm but global bin dir is not configured; skipping global Node installs to avoid duplicates. Run "pnpm setup" then re-run.'),{pm:"none",reason:"pnpm-error"}}return await u("npm")?{pm:"npm",reason:"npm-default"}:{pm:"none",reason:"not-found"}}async function m(e,t,n={dryRun:!1}){if(n.dryRun){let o=[e,...t].map(i=>i.includes(" ")?`"${i}"`:i).join(" ");n.logger?.log(`[dry-run] ${o}`);return}let r=mt(e,t,{stdio:"inherit",cwd:n.cwd||process.cwd(),shell:!1});await new Promise((o,i)=>{r.on("error",i),r.on("exit",s=>{if(s===0)return o();i(new Error(`Command failed (${s}): ${e} ${t.join(" ")}`))})})}function T(e){let t=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);return`${e}.backup.${t}`}import _e from"fs-extra";import*as K from"path";import*as J from"os";async function je(e){let t=await u("node"),n=await u("npm");if(t&&n){let o=(await W`node -v`).stdout.trim();e.logger.ok(`Node.js present (${o})`);return}switch(e.options.installNode){case"nvm":await ht(e);break;case"brew":await wt(e);break;case"skip":e.logger.warn("Skipping Node installation; please install Node 18+ manually");return}if(await u("node")){let o=(await W`node -v`).stdout.trim();e.logger.ok(`Node.js installed (${o})`)}else throw e.logger.err("Node installation failed"),new Error("Node.js installation failed")}async function ht(e){if(e.logger.info("Installing Node.js via nvm"),e.options.dryRun){e.logger.log("[dry-run] install nvm + Node LTS");return}let t=K.join(e.homeDir,".nvm"),n=K.join(t,"nvm.sh");await _e.pathExists(t)||(e.logger.info("Installing nvm..."),await W`bash -c "curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash"`);let r=`export NVM_DIR="${t}" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" && nvm install --lts`;await W`bash -c ${r}`}async function wt(e){if(e.logger.info("Installing Node.js via Homebrew"),!await u("brew"))if(J.platform()==="darwin"){if(e.logger.info("Homebrew not found; installing Homebrew"),e.options.dryRun){e.logger.log("[dry-run] install Homebrew");return}await W`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`;let t=J.platform()==="darwin"&&J.arch()==="arm64"?"/opt/homebrew/bin/brew":"/usr/local/bin/brew";if(await _e.pathExists(t)){let n=K.dirname(t);process.env.PATH=`${n}:${process.env.PATH||""}`;try{let o=(await W`${t} shellenv`).stdout.trim().match(/export PATH="([^"]+)"/);o&&(process.env.PATH=`${o[1]}:${process.env.PATH||""}`)}catch{}}}else throw new Error("Homebrew is only available on macOS");await m("brew",["install","node"],{dryRun:e.options.dryRun,logger:e.logger})}import{$ as we}from"zx";import*as L from"@clack/prompts";var yt=["@openai/codex"],bt="@openai/codex";async function Oe(e){if(e.options.installCodexCli==="no"){e.logger.info("Skipping Codex CLI install (user choice)");return}e.logger.info("Checking global packages (@openai/codex)");let t=[];for(let n of yt)try{let o=(await we`npm view ${n} version`.quiet()).stdout.trim();if(!o){e.logger.warn(`Could not fetch latest version for ${n}; skipping upgrade check`);continue}let i=await we`npm ls -g ${n} --depth=0 --json`.quiet().nothrow(),s="";try{s=JSON.parse(i.stdout||"{}").dependencies?.[n]?.version||""}catch{s=""}if(!s)e.logger.info(`${n} not installed; will install @${o}`),t.push(`${n}@${o}`);else if(s!==o){let a=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes;if(n===bt&&a){let p=await L.confirm({message:`Codex CLI is installed globally (v${s}), latest is v${o}. Upgrade now?`,initialValue:!0});L.isCancel(p)?e.logger.info("Codex CLI upgrade cancelled; keeping existing version."):p?(e.logger.info(`Scheduling Codex CLI upgrade: ${s} -> ${o}`),t.push(`${n}@${o}`)):e.logger.info("Keeping existing Codex CLI version as requested.")}else e.logger.info(`${n} ${s} -> ${o}`),t.push(`${n}@${o}`)}else e.logger.ok(`${n} up-to-date (${s})`)}catch(r){e.logger.warn(`Error checking ${n}: ${r}`);let o=await we`npm ls -g ${n} --depth=0 --json`.quiet().nothrow(),i="";try{i=JSON.parse(o.stdout||"{}").dependencies?.[n]?.version||""}catch{i=""}i||t.push(n)}if(t.length>0){let n=await ae(e.logger),r=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes,o=n.pm;if(n.pm==="none"&&n.reason?.startsWith("pnpm-"))if(r){let i=await L.select({message:"pnpm is installed but its global bin is not configured. How should we proceed?",initialValue:"npm",options:[{value:"npm",label:"Use npm for global installs this run"},{value:"skip",label:'Skip global installs (run "pnpm setup" then re-run)'}]});if(L.isCancel(i)||i==="skip"){e.logger.warn('Skipping global Node installs; pnpm is misconfigured. Run "pnpm setup" then re-run the installer.');return}e.logger.info("pnpm misconfigured; falling back to npm for global installs."),o="npm"}else e.logger.warn('pnpm detected but global bin dir is not configured; falling back to npm for this run. Run "pnpm setup" to use pnpm.'),o="npm";o==="none"?e.logger.warn("Skipping global Node installs because no supported package manager was found."):o==="pnpm"?(e.logger.info("Installing/updating global packages via pnpm"),await m("pnpm",["add","-g",...t],{dryRun:e.options.dryRun,logger:e.logger})):(e.logger.info("Installing/updating global packages via npm"),await m("npm",["install","-g",...t],{dryRun:e.options.dryRun,logger:e.logger}))}else e.logger.ok("Global packages are up-to-date");await u("codex")?e.logger.ok("Codex CLI installed"):e.logger.err("Codex CLI not found after install")}import{$ as kt}from"zx";import*as be from"path";import ye from"fs-extra";var $t={brew:["fd","ripgrep","fzf","jq","yq","difftastic","ast-grep"],apt:["ripgrep","fzf","jq","yq","git-delta"],dnf:["ripgrep","fd-find","fzf","jq","yq","git-delta"],pacman:["ripgrep","fd","fzf","jq","yq","git-delta"],zypper:["ripgrep","fd","fzf","jq","yq","git-delta"],none:[]};async function Le(e){if(e.options.installTools==="no"){e.logger.info("Skipping developer tool installs (user choice)");return}let t=await Ae();if(e.logger.info(`Detected package manager: ${t}`),t==="none"){e.logger.warn("Could not detect a supported package manager; please install tools manually");return}let n=$t[t]||[];if(n.length>0)switch(t){case"brew":await m("brew",["update"],{dryRun:e.options.dryRun,logger:e.logger}),await m("brew",["install",...n],{dryRun:e.options.dryRun,logger:e.logger});break;case"apt":{let{cmd:o,argsPrefix:i}=x("apt-get");try{await m(o,[...i,"update","-y"],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn('apt-get update failed; install developer tools manually with "sudo apt-get update" followed by installs for ripgrep, fzf, jq, yq, git-delta, then re-run codex-1up if needed.');break}for(let s of n)try{await m(o,[...i,"install","-y",s],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn(`apt-get install failed for ${s}; you can install it manually with "sudo apt-get install ${s}".`)}if(!await u("fd"))try{await m(o,[...i,"install","-y","fd-find"],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn("apt-get install failed for fd-find; fd may not be available. Install manually if you prefer fd over fdfind.")}}break;case"dnf":{let{cmd:o,argsPrefix:i}=x("dnf");await m(o,[...i,"install","-y",...n],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"pacman":{let{cmd:o,argsPrefix:i}=x("pacman");await m(o,[...i,"-Sy","--noconfirm",...n],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"zypper":{let{cmd:o,argsPrefix:i}=x("zypper");await m(o,[...i,"refresh"],{dryRun:e.options.dryRun,logger:e.logger}),await m(o,[...i,"install","-y",...n],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break}if(!await u("difft")&&!await u("difftastic")&&(await u("cargo")?(e.logger.info("Installing difftastic via cargo"),await m("cargo",["install","difftastic"],{dryRun:e.options.dryRun,logger:e.logger})):e.logger.warn("difftastic not found and Rust/cargo missing; falling back to git-delta")),await Ct(e,t),await u("fdfind")&&!await u("fd")){let o=be.join(e.homeDir,".local","bin");await ye.ensureDir(o);let i=(await kt`command -v fdfind`).stdout.trim(),s=be.join(o,"fd");await ye.pathExists(s)||(e.options.dryRun?e.logger.log(`[dry-run] ln -s ${i} ${s}`):await ye.symlink(i,s),e.logger.ok("fd alias created at ~/.local/bin/fd"))}let r=["fd","fdfind","rg","fzf","jq","yq","difft","difftastic","delta","ast-grep"];for(let o of r)await u(o)&&e.logger.ok(`${o} \u2713`)}async function Ct(e,t){if(await u("sg")||await u("ast-grep"))return;let r=await(async()=>{switch(t){case"brew":return await m("brew",["install","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}),!0;case"apt":{let{cmd:s,argsPrefix:a}=x("apt-get");await m(s,[...a,"install","-y","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}return!0;case"dnf":{let{cmd:s,argsPrefix:a}=x("dnf");await m(s,[...a,"install","-y","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}return!0;case"pacman":{let{cmd:s,argsPrefix:a}=x("pacman");await m(s,[...a,"-Sy","--noconfirm","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}return!0;case"zypper":{let{cmd:s,argsPrefix:a}=x("zypper");await m(s,[...a,"install","-y","ast-grep"],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}return!0;default:return!1}})();if(await u("sg")||await u("ast-grep"))return;let o=await ae(e.logger),i=o.pm==="none"&&o.reason?.startsWith("pnpm-")?"npm":o.pm;i==="pnpm"?(e.logger.info("Installing ast-grep via pnpm -g"),await m("pnpm",["add","-g","@ast-grep/cli"],{dryRun:e.options.dryRun,logger:e.logger})):i==="npm"?(o.pm==="none"&&e.logger.warn("pnpm is misconfigured; falling back to npm for ast-grep install."),e.logger.info("Installing ast-grep via npm -g"),await m("npm",["install","-g","@ast-grep/cli"],{dryRun:e.options.dryRun,logger:e.logger})):r||e.logger.warn("ast-grep not installed (no supported package manager or global npm). Install manually from https://ast-grep.github.io/")}import X from"fs-extra";import*as pe from"path";var Ge={balanced:{root:[["approval_policy",'"on-request"'],["sandbox_mode",'"workspace-write"'],["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"']],features:[["web_search_request","true"]]},safe:{root:[["approval_policy",'"on-failure"'],["sandbox_mode",'"workspace-write"'],["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"']],features:[["web_search_request","false"]]},minimal:{root:[["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"']],features:[["web_search_request","false"]]},yolo:{root:[["approval_policy",'"never"'],["sandbox_mode",'"danger-full-access"'],["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"'],["model_reasoning_summary",'"detailed"'],["model_verbosity",'"high"'],["tool_output_token_limit","25000"]],features:[["web_search_request","true"]]}},vt=`# ~/.codex/config.toml \u2014 managed by codex-1up (patch mode)
4
+ `;async function qe(e){let t=pe.join(e.homeDir,".codex","config.toml");await X.ensureDir(pe.dirname(t));let n=await X.pathExists(t),r=n?await X.readFile(t,"utf8"):vt,o=new $e(r),i=!1;if(i=St(o,e.options.profileScope,e.options.profile,e.options.profileMode)||i,i=Rt(o,e.options.profile,e.options.setDefaultProfile)||i,i=Pt(o,e.options.notificationSound)||i,!i){e.logger.info("Config already up to date; no changes needed.");return}let s=o.content();if(e.options.dryRun){e.logger.log(`[dry-run] write ${t}`),e.logger.log(s);return}if(n){let a=T(t);await X.copy(t,a),e.logger.info(`Backed up current config to ${a}`)}await X.writeFile(t,s,"utf8"),e.logger.ok("Updated ~/.codex/config.toml with requested settings.")}function St(e,t,n,r){if(t==="single"&&n==="skip")return!1;let o=t==="all"?Object.keys(Ge):[n],i=!1;for(let s of o){let a=Ge[s];if(r==="overwrite")i=e.replaceTable(`profiles.${s}`,a.root)||i,i=e.replaceTable(`profiles.${s}.features`,a.features)||i;else{e.ensureTable(`profiles.${s}`);for(let[p,g]of a.root)i=e.setKey(`profiles.${s}`,p,g,{mode:"if-missing"})||i;e.ensureTable(`profiles.${s}.features`);for(let[p,g]of a.features)i=e.setKey(`profiles.${s}.features`,p,g,{mode:"if-missing"})||i}}return i}function Rt(e,t,n){return!n||t==="skip"?!1:e.setRootKey("profile",`"${t}"`,{mode:"force"})}function Pt(e,t){if(!t||t==="none")return!1;e.ensureTable("tui");let n=e.getValue("tui","notifications");if(n){let r=n.trim().toLowerCase();if(r.startsWith("true")||r.startsWith("["))return!1}return e.setKey("tui","notifications","true",{mode:"force"})}var $e=class{text;constructor(t){this.text=t||""}content(){return It(this.text)}ensureTable(t){if(this.hasTable(t))return!1;let n=this.text.length===0?"":Fe(this.text);return this.text=n+`[${t}]
5
+ `,!0}setKey(t,n,r,o){let i=le(this.text,t);if(!i)return this.ensureTable(t),this.setKey(t,n,r,o);let s=this.text.slice(i.start,i.end),p=new RegExp(`^\\s*${ke(n)}\\s*=.*$`,"m").exec(s);if(p){if(o.mode==="if-missing")return!1;let C=this.text,j=i.start+p.index,F=j+p[0].length;return this.text=C.slice(0,j)+`${n} = ${r}`+C.slice(F),this.text!==C}let g=this.text,b=i.end,w=g.slice(0,b),$=g.slice(b),f=w.length>0&&!w.endsWith(`
6
6
  `),d=$.length>0&&!$.startsWith(`
7
- `),h=`${p?`
8
- `:""}${o} = ${r}
7
+ `),h=`${f?`
8
+ `:""}${n} = ${r}
9
9
  ${d?`
10
- `:""}`;return this.text=w+h+$,this.text!==g}getValue(t,o){let r=se(this.text,t);if(!r)return;let n=this.text.slice(r.start,r.end),a=new RegExp(`^\\s*${be(o)}\\s*=\\s*(.+)$`,"m").exec(n);return a?a[1]:void 0}replaceTable(t,o){let r=o.map(([s,f])=>`${s} = ${f}`).join(`
11
- `),n=`[${t}]
10
+ `:""}`;return this.text=w+h+$,this.text!==g}getValue(t,n){let r=le(this.text,t);if(!r)return;let o=this.text.slice(r.start,r.end),s=new RegExp(`^\\s*${ke(n)}\\s*=\\s*(.+)$`,"m").exec(o);return s?s[1]:void 0}replaceTable(t,n){let r=n.map(([a,p])=>`${a} = ${p}`).join(`
11
+ `),o=`[${t}]
12
12
  ${r}
13
13
 
14
- `,i=this.text,a=se(this.text,t);if(!a){let s=i.length===0?"":Ge(i);return this.text=s+n,this.text!==i}return this.text=i.slice(0,a.start)+n+i.slice(a.end),this.text!==i}setRootKey(t,o,r){let n=Pt(this.text),i=this.text.slice(n.start,n.end),s=new RegExp(`^\\s*${be(t)}\\s*=.*$`,"m").exec(i);if(s){if(r.mode==="if-missing")return!1;let d=this.text,h=n.start+s.index,v=h+s[0].length;return this.text=d.slice(0,h)+`${t} = ${o}`+d.slice(v),this.text!==d}let f=this.text,g=n.end,b=g>0&&!f.slice(0,g).endsWith(`
15
- `),w=f.slice(g),$=w.length>0&&!w.startsWith(`
16
- `),p=`${b?`
17
- `:""}${t} = ${o}
14
+ `,i=this.text,s=le(this.text,t);if(!s){let a=i.length===0?"":Fe(i);return this.text=a+o,this.text!==i}return this.text=i.slice(0,s.start)+o+i.slice(s.end),this.text!==i}setRootKey(t,n,r){let o=Et(this.text),i=this.text.slice(o.start,o.end),a=new RegExp(`^\\s*${ke(t)}\\s*=.*$`,"m").exec(i);if(a){if(r.mode==="if-missing")return!1;let d=this.text,h=o.start+a.index,C=h+a[0].length;return this.text=d.slice(0,h)+`${t} = ${n}`+d.slice(C),this.text!==d}let p=this.text,g=o.end,b=g>0&&!p.slice(0,g).endsWith(`
15
+ `),w=p.slice(g),$=w.length>0&&!w.startsWith(`
16
+ `),f=`${b?`
17
+ `:""}${t} = ${n}
18
18
  ${$?`
19
- `:""}`;return this.text=f.slice(0,g)+p+w,this.text!==f}hasTable(t){return se(this.text,t)!==null}};function se(e,t){let o=/^\s*\[([^\]]+)\]\s*$/gm,r=[],n;for(;n=o.exec(e);)r.push({name:n[1].trim(),index:n.index});for(let i=0;i<r.length;i++)if(r[i].name===t){let a=r[i].index,s=r[i+1]?.index??e.length;return{start:a,end:s}}return null}function Pt(e){let o=/^\s*\[([^\]]+)\]\s*$/gm.exec(e);return o?{start:0,end:o.index}:{start:0,end:e.length}}function be(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Et(e){return e.endsWith(`
19
+ `:""}`;return this.text=p.slice(0,g)+f+w,this.text!==p}hasTable(t){return le(this.text,t)!==null}};function le(e,t){let n=/^\s*\[([^\]]+)\]\s*$/gm,r=[],o;for(;o=n.exec(e);)r.push({name:o[1].trim(),index:o.index});for(let i=0;i<r.length;i++)if(r[i].name===t){let s=r[i].index,a=r[i+1]?.index??e.length;return{start:s,end:a}}return null}function Et(e){let n=/^\s*\[([^\]]+)\]\s*$/gm.exec(e);return n?{start:0,end:n.index}:{start:0,end:e.length}}function ke(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function It(e){return e.endsWith(`
20
20
  `)?e:e+`
21
- `}function Ge(e){let t=e;return t.endsWith(`
21
+ `}function Fe(e){let t=e;return t.endsWith(`
22
22
  `)||(t+=`
23
23
  `),t.endsWith(`
24
24
 
25
25
  `)||(t+=`
26
- `),t}import x from"fs-extra";import*as M from"path";async function qe(e){let t=M.join(e.homeDir,".codex","notify.sh"),o=M.join(e.rootDir,"templates","notification.sh");await x.ensureDir(M.dirname(t));let r=e.options.notify;if(r==="no"){e.logger.info("Skipping notify hook installation");return}if(!await x.pathExists(o)){e.logger.warn(`Notification template missing at ${o}; skipping notify hook install`);return}if(await x.pathExists(t))if(r==="yes"){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await x.copy(t,i),e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${t}`):(await x.copy(o,t),await x.chmod(t,493)),e.logger.ok("Updated notify hook (backup created)")}else!e.options.assumeYes&&!e.options.skipConfirmation&&e.logger.info("Keeping existing notify hook");else e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${t}`):(await x.copy(o,t),await x.chmod(t,493)),e.logger.ok("Installed notify hook to ~/.codex/notify.sh");let n=M.join(e.homeDir,".codex","config.toml");await x.pathExists(n)?await xt(n,t,e):e.logger.warn(`Config not found at ${n}; run again after config is created`)}async function xt(e,t,o){if(o.options.dryRun){o.logger.log("[dry-run] update config notify and tui.notifications");return}let n=(await x.readFile(e,"utf8")).split(/\r?\n/),i="",a=null,s=null,f=!1,g=!1;for(let p=0;p<n.length;p++){let d=n[p],h=d.match(/^\s*\[([^\]]+)\]\s*$/);if(h){i=h[1],i==="tui"&&(s=p);continue}let v=/^\s*notify\s*=\s*\[/.test(d),j=/^\s*tui\.notifications\s*=/.test(d),G=/^\s*notifications\s*=/.test(d);v&&(i===""?a===null&&(a=p):/^profiles\.[^.]+\.features$/.test(i)&&(n.splice(p,1),p--,f=!0)),j&&/^profiles\.[^.]+\.features$/.test(i)&&(n.splice(p,1),p--,g=!0),G&&i===""&&(n.splice(p,1),p--,g=!0)}function b(p){let d=0;for(;d<n.length&&/^\s*(#.*)?$/.test(n[d]);)d++;n.splice(d,0,p)}if(a!==null){let p=n[a].match(/^(\s*notify\s*=\s*\[)([^\]]*)\]/);if(p){let d=p[2].trim();if(!d.includes(JSON.stringify(t))){let v=d&&!d.endsWith(",")?", ":"";n[a]=`${p[1]}${d}${v}${JSON.stringify(t)}]`,o.logger.ok("Added notify hook to config")}}}else b(`notify = [${JSON.stringify(t)}]`),o.logger.ok("Enabled notify hook in config");let w=!1;if(s!==null){let p=s+1,d=!1;for(;p<n.length;p++){let h=n[p];if(/^\s*\[/.test(h))break;if(/^\s*notifications\s*=/.test(h)){n[p]="notifications = true",d=!0,w=!0;break}}d||(n.splice(s+1,0,"notifications = true"),w=!0)}w||b(`[tui]
27
- notifications = true`);let $=[];i="";for(let p=0;p<n.length;p++){let d=n[p],h=d.match(/^\s*\[([^\]]+)\]\s*$/);if(h){i=h[1],$.push(d);continue}/^\s*tui\.notifications\s*=/.test(d)||/^\s*notifications\s*=/.test(d)&&i!=="tui"||$.push(d)}await x.writeFile(e,$.join(`
28
- `),"utf8")}import R from"fs-extra";import*as y from"path";async function ze(e){let t=y.join(e.rootDir,"sounds"),o=y.join(e.homeDir,".codex","sounds");await R.ensureDir(o);let r=e.options.notificationSound;if(r==="none"){let w=await Me(e);e.options.dryRun?e.logger.log(`[dry-run] update ${w}`):await We(w,`# Notification sound (disabled)
26
+ `),t}import I from"fs-extra";import*as M from"path";async function We(e){let t=M.join(e.homeDir,".codex","notify.sh"),n=M.join(e.rootDir,"templates","notification.sh");await I.ensureDir(M.dirname(t));let r=e.options.notify;if(r==="no"){e.logger.info("Skipping notify hook installation");return}if(!await I.pathExists(n)){e.logger.warn(`Notification template missing at ${n}; skipping notify hook install`);return}if(await I.pathExists(t))if(r==="yes"){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await I.copy(t,i),e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${t}`):(await I.copy(n,t),await I.chmod(t,493)),e.logger.ok("Updated notify hook (backup created)")}else!e.options.assumeYes&&!e.options.skipConfirmation&&e.logger.info("Keeping existing notify hook");else e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${t}`):(await I.copy(n,t),await I.chmod(t,493)),e.logger.ok("Installed notify hook to ~/.codex/notify.sh");let o=M.join(e.homeDir,".codex","config.toml");await I.pathExists(o)?await Nt(o,t,e):e.logger.warn(`Config not found at ${o}; run again after config is created`)}async function Nt(e,t,n){if(n.options.dryRun){n.logger.log("[dry-run] update config notify and tui.notifications");return}let o=(await I.readFile(e,"utf8")).split(/\r?\n/),i="",s=null,a=null,p=!1,g=!1;for(let f=0;f<o.length;f++){let d=o[f],h=d.match(/^\s*\[([^\]]+)\]\s*$/);if(h){i=h[1],i==="tui"&&(a=f);continue}let C=/^\s*notify\s*=\s*\[/.test(d),j=/^\s*tui\.notifications\s*=/.test(d),F=/^\s*notifications\s*=/.test(d);C&&(i===""?s===null&&(s=f):/^profiles\.[^.]+\.features$/.test(i)&&(o.splice(f,1),f--,p=!0)),j&&/^profiles\.[^.]+\.features$/.test(i)&&(o.splice(f,1),f--,g=!0),F&&i===""&&(o.splice(f,1),f--,g=!0)}function b(f){let d=0;for(;d<o.length&&/^\s*(#.*)?$/.test(o[d]);)d++;o.splice(d,0,f)}if(s!==null){let f=o[s].match(/^(\s*notify\s*=\s*\[)([^\]]*)\]/);if(f){let d=f[2].trim();if(!d.includes(JSON.stringify(t))){let C=d&&!d.endsWith(",")?", ":"";o[s]=`${f[1]}${d}${C}${JSON.stringify(t)}]`,n.logger.ok("Added notify hook to config")}}}else b(`notify = [${JSON.stringify(t)}]`),n.logger.ok("Enabled notify hook in config");let w=!1;if(a!==null){let f=a+1,d=!1;for(;f<o.length;f++){let h=o[f];if(/^\s*\[/.test(h))break;if(/^\s*notifications\s*=/.test(h)){o[f]="notifications = true",d=!0,w=!0;break}}d||(o.splice(a+1,0,"notifications = true"),w=!0)}w||b(`[tui]
27
+ notifications = true`);let $=[];i="";for(let f=0;f<o.length;f++){let d=o[f],h=d.match(/^\s*\[([^\]]+)\]\s*$/);if(h){i=h[1],$.push(d);continue}/^\s*tui\.notifications\s*=/.test(d)||/^\s*notifications\s*=/.test(d)&&i!=="tui"||$.push(d)}await I.writeFile(e,$.join(`
28
+ `),"utf8")}import R from"fs-extra";import*as y from"path";async function ze(e){let t=y.join(e.rootDir,"sounds"),n=y.join(e.homeDir,".codex","sounds");await R.ensureDir(n);let r=e.options.notificationSound;if(r==="none"){let w=await Me(e);e.options.dryRun?e.logger.log(`[dry-run] update ${w}`):await Ue(w,`# Notification sound (disabled)
29
29
  export CODEX_DISABLE_SOUND=1
30
30
  export CODEX_CUSTOM_SOUND=""
31
- `,e);let p=y.join(e.homeDir,".codex","notify.sh");if(await R.pathExists(p)){let d=await R.readFile(p,"utf8"),h=d.replace(/^DEFAULT_CODEX_SOUND=.*$/m,'DEFAULT_CODEX_SOUND=""');e.options.dryRun?e.logger.log(`[dry-run] patch ${p} DEFAULT_CODEX_SOUND -> empty`):h!==d&&await R.writeFile(p,h,"utf8")}e.logger.ok("Notification sound disabled");return}let n;if(r&&!y.isAbsolute(r)?n=y.join(t,r):r?n=r:e.options.mode==="recommended"&&(n=y.join(t,"noti_1.wav")),!n||!await R.pathExists(n)){e.logger.warn("No notification sound selected or file missing; skipping sound setup");return}let i=y.isAbsolute(n),a=n.startsWith(y.join(e.rootDir,"sounds")),s=!i||a?y.join(o,y.basename(n)):n;(!i||a)&&(e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${s}`):await R.copy(n,s));let f=await Me(e),g=`# Notification sound
31
+ `,e);let f=y.join(e.homeDir,".codex","notify.sh");if(await R.pathExists(f)){let d=await R.readFile(f,"utf8"),h=d.replace(/^DEFAULT_CODEX_SOUND=.*$/m,'DEFAULT_CODEX_SOUND=""');e.options.dryRun?e.logger.log(`[dry-run] patch ${f} DEFAULT_CODEX_SOUND -> empty`):h!==d&&await R.writeFile(f,h,"utf8")}e.logger.ok("Notification sound disabled");return}let o;if(r&&!y.isAbsolute(r)?o=y.join(t,r):r?o=r:e.options.mode==="recommended"&&(o=y.join(t,"noti_1.wav")),!o||!await R.pathExists(o)){e.logger.warn("No notification sound selected or file missing; skipping sound setup");return}let i=y.isAbsolute(o),s=o.startsWith(y.join(e.rootDir,"sounds")),a=!i||s?y.join(n,y.basename(o)):o;(!i||s)&&(e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${a}`):await R.copy(o,a));let p=await Me(e),g=`# Notification sound
32
32
  export CODEX_DISABLE_SOUND=0
33
- export CODEX_CUSTOM_SOUND="${s}"
34
- `;e.options.dryRun?e.logger.log(`[dry-run] update ${f}`):await We(f,g,e),e.logger.ok("Notification sound configured. Open a new shell or source your rc to apply.");let b=y.join(e.homeDir,".codex","notify.sh");if(await R.pathExists(b)){let w=await R.readFile(b,"utf8"),$=`DEFAULT_CODEX_SOUND="${s}"`,p=w.replace(/^DEFAULT_CODEX_SOUND=.*$/m,$);p!==w&&(e.options.dryRun?e.logger.log(`[dry-run] patch ${b} DEFAULT_CODEX_SOUND -> ${s}`):await R.writeFile(b,p,"utf8"))}}async function Me(e){let t=e.options.shell||process.env.SHELL||"",o="auto";switch(o==="auto"&&(t.includes("zsh")?o="zsh":t.includes("fish")?o="fish":o="bash"),o){case"zsh":return y.join(e.homeDir,".zshrc");case"fish":return y.join(e.homeDir,".config","fish","config.fish");default:return y.join(e.homeDir,".bashrc")}}async function We(e,t,o){let r="codex-1up";await R.ensureDir(y.dirname(e));let n="";if(await R.pathExists(e)){n=await R.readFile(e,"utf8");let a=`>>> ${r} >>>`,s=`<<< ${r} <<<`,f=new RegExp(`${a}[\\s\\S]*?${s}\\n?`,"g");n=n.replace(f,"")}let i=`>>> ${r} >>>
33
+ export CODEX_CUSTOM_SOUND="${a}"
34
+ `;e.options.dryRun?e.logger.log(`[dry-run] update ${p}`):await Ue(p,g,e),e.logger.ok("Notification sound configured. Open a new shell or source your rc to apply.");let b=y.join(e.homeDir,".codex","notify.sh");if(await R.pathExists(b)){let w=await R.readFile(b,"utf8"),$=`DEFAULT_CODEX_SOUND="${a}"`,f=w.replace(/^DEFAULT_CODEX_SOUND=.*$/m,$);f!==w&&(e.options.dryRun?e.logger.log(`[dry-run] patch ${b} DEFAULT_CODEX_SOUND -> ${a}`):await R.writeFile(b,f,"utf8"))}}async function Me(e){let t=e.options.shell||process.env.SHELL||"",n="auto";switch(n==="auto"&&(t.includes("zsh")?n="zsh":t.includes("fish")?n="fish":n="bash"),n){case"zsh":return y.join(e.homeDir,".zshrc");case"fish":return y.join(e.homeDir,".config","fish","config.fish");default:return y.join(e.homeDir,".bashrc")}}async function Ue(e,t,n){let r="codex-1up";await R.ensureDir(y.dirname(e));let o="";if(await R.pathExists(e)){o=await R.readFile(e,"utf8");let s=`>>> ${r} >>>`,a=`<<< ${r} <<<`,p=new RegExp(`${s}[\\s\\S]*?${a}\\n?`,"g");o=o.replace(p,"")}let i=`>>> ${r} >>>
35
35
  ${t}<<< ${r} <<<
36
- `;await R.writeFile(e,n+i,"utf8")}import P from"fs-extra";import*as L from"path";async function Ue(e){let t=L.join(e.homeDir,".codex","AGENTS.md"),o=e.options.globalAgents;if(o==="skip"){e.logger.info("Skipping global AGENTS.md creation");return}let r=L.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(!await P.pathExists(r)){e.logger.warn(`Template not found at ${r}`);return}switch(o){case"create-default":if(await P.pathExists(t)){e.logger.info("Global AGENTS.md already exists; leaving unchanged");return}await P.ensureDir(L.dirname(t)),e.options.dryRun?e.logger.log(`[dry-run] cp ${r} ${t}`):await P.copy(r,t),e.logger.ok(`Wrote ${t}`);break;case"overwrite-default":if(await P.ensureDir(L.dirname(t)),await P.pathExists(t)){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await P.copy(t,i),e.logger.info(`Backed up existing AGENTS.md to: ${i}`)}e.options.dryRun?e.logger.log(`[dry-run] cp ${r} ${t}`):await P.copy(r,t),e.logger.ok(`Wrote ${t}`);break;case"append-default":if(await P.ensureDir(L.dirname(t)),await P.pathExists(t)){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await P.copy(t,i),e.logger.info(`Backed up existing AGENTS.md to: ${i}`)}let n=await P.readFile(r,"utf8");e.options.dryRun?e.logger.log(`[dry-run] append template to ${t}`):await P.appendFile(t,`
36
+ `;await R.writeFile(e,o+i,"utf8")}import P from"fs-extra";import*as G from"path";async function Ve(e){let t=G.join(e.homeDir,".codex","AGENTS.md"),n=e.options.globalAgents;if(n==="skip"){e.logger.info("Skipping global AGENTS.md creation");return}let r=G.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(!await P.pathExists(r)){e.logger.warn(`Template not found at ${r}`);return}switch(n){case"create-default":if(await P.pathExists(t)){e.logger.info("Global AGENTS.md already exists; leaving unchanged");return}await P.ensureDir(G.dirname(t)),e.options.dryRun?e.logger.log(`[dry-run] cp ${r} ${t}`):await P.copy(r,t),e.logger.ok(`Wrote ${t}`);break;case"overwrite-default":if(await P.ensureDir(G.dirname(t)),await P.pathExists(t)){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await P.copy(t,i),e.logger.info(`Backed up existing AGENTS.md to: ${i}`)}e.options.dryRun?e.logger.log(`[dry-run] cp ${r} ${t}`):await P.copy(r,t),e.logger.ok(`Wrote ${t}`);break;case"append-default":if(await P.ensureDir(G.dirname(t)),await P.pathExists(t)){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await P.copy(t,i),e.logger.info(`Backed up existing AGENTS.md to: ${i}`)}let o=await P.readFile(r,"utf8");e.options.dryRun?e.logger.log(`[dry-run] append template to ${t}`):await P.appendFile(t,`
37
37
  ---
38
38
 
39
- ${n}`,"utf8"),e.logger.ok(`Appended template to ${t}`);break;default:e.options.skipConfirmation&&e.logger.info("Skipping global AGENTS.md creation (non-interactive mode)");break}}async function Ve(e){if(e.options.noVscode)return;let t=e.options.vscodeId;if(!t){e.logger.info("VS Code extension id not provided. Use: --vscode <publisher.extension>");return}if(!await u("code")){e.logger.warn("'code' (VS Code) not in PATH; skipping extension install");return}if(e.options.dryRun){e.logger.log(`[dry-run] code --install-extension ${t}`);return}e.logger.info(`Installing VS Code extension: ${t}`),await m("code",["--install-extension",t,"--force"],{dryRun:!1,logger:e.logger}),e.logger.ok(`VS Code extension '${t}' installed (or already present)`)}import X from"fs-extra";import*as Y from"path";async function Be(e){let t=e.options.agentsMd;if(!t)return;let o=t;(await X.stat(o).catch(()=>null))?.isDirectory()&&(o=Y.join(o,"AGENTS.md"));let r=Y.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(await X.pathExists(o)){e.logger.warn(`${o} already exists`);let n=T(o);e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${n}`):await X.copy(o,n),e.logger.info(`Backed up existing AGENTS.md to: ${n}`)}e.logger.info(`Writing starter AGENTS.md to: ${o}`),e.options.dryRun?e.logger.log(`[dry-run] write AGENTS.md to ${o}`):(await X.ensureDir(Y.dirname(o)),await X.copy(r,o),e.logger.ok("Wrote AGENTS.md"))}var He="codex-1up";async function ve(e,t){let o=Ke.homedir(),r=$e.join(o,`.${He}`);await It.ensureDir(r);let n=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),i=$e.join(r,`install-${n}.log`),a=Te(i);a.info(`==> ${He} installer`),a.info(`Log: ${i}`);let s={cwd:process.cwd(),homeDir:o,rootDir:t,logDir:r,logFile:i,options:e,logger:a};try{await _e(s),await je(s),await Oe(s);let g=await u("codex")||s.options.installCodexCli==="yes";g||a.warn("Codex CLI not found and codex install was skipped; skipping config/notify setup until codex is installed."),g&&(await Fe(s),await qe(s),await ze(s),await Ue(s)),await Ve(s),await Be(s),a.ok("All done. Open a new shell or 'source' your rc file to load aliases."),a.info("Next steps:"),a.info(" 1) codex # sign in; then ask it to plan a refactor"),a.info(" 2) ./bin/codex-1up agents --path $PWD # write a starter AGENTS.md to your repo"),a.info(" 3) Review ~/.codex/config.toml (see: https://github.com/openai/codex/blob/main/docs/config.md)")}catch(f){throw a.err(`Installation failed: ${f}`),f}}var Je=Dt(Tt(import.meta.url));function _t(){let e=Je;for(let t=0;t<6;t++){try{return At(D(e,"templates","codex-config.toml")),e}catch{}e=D(e,"..")}return D(Je,"..")}var pe=_t(),Ye=Nt({meta:{name:"install",description:"Run the codex-1up installer with validated flags"},args:{yes:{type:"boolean",description:"Non-interactive; accept safe defaults"},"dry-run":{type:"boolean",description:"Print actions without making changes"},"skip-confirmation":{type:"boolean",description:"Skip prompts"},shell:{type:"string",description:"auto|zsh|bash|fish"},vscode:{type:"string",description:"Install VS Code extension id"},"no-vscode":{type:"boolean",description:"Skip VS Code extension checks"},"git-external-diff":{type:"boolean",description:"Set difftastic as git external diff"},"install-node":{type:"string",description:"nvm|brew|skip"},tools:{type:"string",description:"yes|no install/upgrade core CLI tools (rg, fd, fzf, jq, yq, difftastic)"},"codex-cli":{type:"string",description:"yes|no install/upgrade Codex CLI + ast-grep globally"},"profiles-scope":{type:"string",description:"single|all (write one profile or all profiles)"},profile:{type:"string",description:"balanced|safe|minimal|yolo|skip (choose profile to write)"},"profile-mode":{type:"string",description:"add|overwrite (profile table merge strategy)"},sound:{type:"string",description:'Sound file, "none", or "skip" to leave unchanged'},"agents-md":{type:"string",description:"Write starter AGENTS.md to PATH (default PWD/AGENTS.md)",required:!1}},async run({args:e,rawArgs:t}){let o=D(Z.homedir(),".codex","config.toml"),r=await Ce(o),n=D(Z.homedir(),".codex","notify.sh"),i=await Ce(n),a=D(Z.homedir(),".codex","AGENTS.md"),s=await Ce(a),f=r?await Wt(o):void 0,g=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes,b=Ot(e.profile),w=Lt(e["profile-mode"]),$=Gt(e["profiles-scope"]),p=Ft(e.tools),d=qt(e["codex-cli"]),h=process.platform==="darwin"||process.platform==="linux",v=typeof e.sound>"u"?void 0:String(e.sound).trim();if(v==="")throw new Error('Invalid --sound value (expected path, "none", or "skip")');let j=t.some(S=>S==="--no-vscode"||S.startsWith("--no-vscode=")),G=b||(Re(f)?f:void 0)||"balanced",I=G,U=w||"add",A=$||"single",ie=!0,ue=p||(h?"yes":"no"),Ie=d||"yes",_,V,O;if(v&&(S=>{let c=S.trim().toLowerCase();if(c==="skip"){_="no",O=void 0;return}_="yes",O=c==="none"?"none":S})(v),g){if(l.intro("codex-1up \xB7 Install"),!d){let c=await l.confirm({message:"Install/update Codex CLI globally?",initialValue:!0});if(l.isCancel(c))return l.cancel("Install aborted");Ie=c?"yes":"no"}if(h&&!p){l.note("We can install/update developer tools (rg, fd, fzf, jq, yq, difftastic, ast-grep) using your package manager (macOS/Linux).");let c=await l.confirm({message:"Install/update these CLI tools?",initialValue:!0});if(l.isCancel(c))return l.cancel("Install aborted");ue=c?"yes":"no"}else!h&&!p&&(ue="no");if(!$){let c=await l.select({message:"Install all profiles (balanced, safe, minimal, yolo)?",options:[{label:"Yes \u2014 install/update all profiles",value:"all"},{label:"No \u2014 choose a single profile",value:"single"}],initialValue:"all"});if(l.isCancel(c))return l.cancel("Install aborted");A=c}if(b)A==="all"&&I==="skip"&&(I=G);else{l.note(["Profiles:"," \u2022 Balanced: on-request approvals, workspace-write sandbox, web search on."," \u2022 Safe: on-failure approvals, workspace-write, web search off."," \u2022 Minimal: lean settings, minimal reasoning effort, web search off."," \u2022 YOLO: never approvals, danger-full-access, web search on, verbose."].join(`
40
- `));let c=await l.select({message:"Choose a Codex profile to install",options:[{label:"Balanced (recommended)",value:"balanced",hint:"on-request approvals \xB7 workspace-write \xB7 web search on"},{label:"Safe",value:"safe",hint:"on-failure approvals \xB7 workspace-write \xB7 web search off"},{label:"Minimal",value:"minimal",hint:"lean defaults \xB7 minimal reasoning effort \xB7 web search off"},{label:"YOLO",value:"yolo",hint:"never approvals \xB7 danger-full-access \xB7 web search on"},...A==="single"?[{label:"Skip (no profile changes)",value:"skip"}]:[]],initialValue:Mt(f)});if(l.isCancel(c))return l.cancel("Install aborted");I=c}if((A==="all"||I!=="skip")&&!w){let c=await l.select({message:A==="all"?"How should we write all profiles?":`How should we write profiles.${I}?`,options:[{label:"Add / merge (preserve custom keys)",value:"add"},{label:"Overwrite codex profile (replace table)",value:"overwrite"}],initialValue:U});if(l.isCancel(c))return l.cancel("Install aborted");U=c}if(A==="single"&&I==="skip")ie=!1;else{let c=await l.confirm({message:A==="all"?`Wrote all profiles to ~/.codex/config.toml (mode: ${U}). Set ${I} as the default profile?`:`Wrote profiles.${I} to ~/.codex/config.toml (mode: ${U}). Set this as the default profile?`,initialValue:!0});if(l.isCancel(c))return l.cancel("Install aborted");ie=!!c}if(!v){let ge=function(E){return[{label:"Skip (leave current setup)",value:"skip"},{label:"None (disable sounds)",value:"none"},...re.map(k=>({label:k,value:k})),{label:"Custom path\u2026",value:"custom"}]};var Ro=ge;let c=D(pe,"sounds"),re=[];try{re=(await ee.readdir(c)).filter(E=>/\.(wav|mp3|ogg)$/i.test(E)).sort()}catch{}_="yes";let C=re.includes("noti_1.wav")?"noti_1.wav":re[0]||"none";async function me(E){let k=await l.text({message:"Enter absolute path to a .wav file",placeholder:E||"/absolute/path/to/sound.wav",validate(F){if(!F)return"Path required";if(!F.startsWith("/"))return"Use an absolute path";if(!/(\.wav|\.mp3|\.ogg)$/i.test(F))return"Supported: .wav, .mp3, .ogg"}});if(l.isCancel(k))return null;try{await ee.access(String(k))}catch{return l.log.warn("File not found. Try again."),await me(String(k))}return String(k)}let B=await l.select({message:"Notification sound",options:ge(C),initialValue:C});if(l.isCancel(B))return l.cancel("Install aborted");if(B==="skip")_="no",O=void 0;else if(B==="custom"){let E=await me();if(E===null)return l.cancel("Install aborted");C=E}else C=B;if(B!=="skip"){for(;;){let E=await l.select({message:`Selected: ${C}. What next?`,options:[{label:"Preview \u25B6 (press p then Enter)",value:"preview"},{label:"Use this",value:"use"},{label:"Choose another\u2026",value:"change"}],initialValue:"use"});if(l.isCancel(E))return l.cancel("Install aborted");if(E==="use")break;if(E==="change"){let k=await l.select({message:"Notification sound",options:ge(C),initialValue:C});if(l.isCancel(k))return l.cancel("Install aborted");if(k==="custom"){let F=await me();if(F===null)return l.cancel("Install aborted");C=F}else if(k==="skip"){_="no",O=void 0;break}else C=k;continue}try{let k=C==="none"?"none":C.startsWith("/")?C:D(pe,"sounds",C);await jt(k)}catch(k){l.log.warn(String(k))}}O===void 0&&(O=C)}}if(s){l.note(`Global AGENTS.md is shared instructions Codex can reference in any repo. We add a short starter guide (fd/ast-grep/jq/yq patterns, deterministic selects).
39
+ ${o}`,"utf8"),e.logger.ok(`Appended template to ${t}`);break;default:e.options.skipConfirmation&&e.logger.info("Skipping global AGENTS.md creation (non-interactive mode)");break}}async function Be(e){if(e.options.noVscode)return;let t=e.options.vscodeId;if(!t){e.logger.info("VS Code extension id not provided. Use: --vscode <publisher.extension>");return}if(!await u("code")){e.logger.warn("'code' (VS Code) not in PATH; skipping extension install");return}if(e.options.dryRun){e.logger.log(`[dry-run] code --install-extension ${t}`);return}e.logger.info(`Installing VS Code extension: ${t}`),await m("code",["--install-extension",t,"--force"],{dryRun:!1,logger:e.logger}),e.logger.ok(`VS Code extension '${t}' installed (or already present)`)}import Y from"fs-extra";import*as Q from"path";async function He(e){let t=e.options.agentsMd;if(!t)return;let n=t;(await Y.stat(n).catch(()=>null))?.isDirectory()&&(n=Q.join(n,"AGENTS.md"));let r=Q.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(await Y.pathExists(n)){e.logger.warn(`${n} already exists`);let o=T(n);e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${o}`):await Y.copy(n,o),e.logger.info(`Backed up existing AGENTS.md to: ${o}`)}e.logger.info(`Writing starter AGENTS.md to: ${n}`),e.options.dryRun?e.logger.log(`[dry-run] write AGENTS.md to ${n}`):(await Y.ensureDir(Q.dirname(n)),await Y.copy(r,n),e.logger.ok("Wrote AGENTS.md"))}var Ke="codex-1up";async function ve(e,t){let n=Je.homedir(),r=Ce.join(n,`.${Ke}`);await xt.ensureDir(r);let o=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),i=Ce.join(r,`install-${o}.log`),s=De(i);s.info(`==> ${Ke} installer`),s.info(`Log: ${i}`);let a={cwd:process.cwd(),homeDir:n,rootDir:t,logDir:r,logFile:i,options:e,logger:s};try{await je(a),await Oe(a),await Le(a);let g=await u("codex")||a.options.installCodexCli==="yes";g||s.warn("Codex CLI not found and codex install was skipped; skipping config/notify setup until codex is installed."),g&&(await qe(a),await We(a),await ze(a),await Ve(a)),await Be(a),await He(a),s.ok("All done. Open a new shell or 'source' your rc file to load aliases."),s.info("Next steps:"),s.info(" 1) codex # sign in; then ask it to plan a refactor"),s.info(" 2) ./bin/codex-1up agents --path $PWD # write a starter AGENTS.md to your repo"),s.info(" 3) Review ~/.codex/config.toml (see: https://github.com/openai/codex/blob/main/docs/config.md)")}catch(p){throw s.err(`Installation failed: ${p}`),p}}var Xe=At(Dt(import.meta.url));function jt(){let e=Xe;for(let t=0;t<6;t++){try{return _t(D(e,"templates","codex-config.toml")),e}catch{}e=D(e,"..")}return D(Xe,"..")}var fe=jt(),Qe=Tt({meta:{name:"install",description:"Run the codex-1up installer with validated flags"},args:{yes:{type:"boolean",description:"Non-interactive; accept safe defaults"},"dry-run":{type:"boolean",description:"Print actions without making changes"},"skip-confirmation":{type:"boolean",description:"Skip prompts"},shell:{type:"string",description:"auto|zsh|bash|fish"},vscode:{type:"string",description:"Install VS Code extension id"},"no-vscode":{type:"boolean",description:"Skip VS Code extension checks"},"git-external-diff":{type:"boolean",description:"Set difftastic as git external diff"},"install-node":{type:"string",description:"nvm|brew|skip"},tools:{type:"string",description:"yes|no install/upgrade core CLI tools (rg, fd, fzf, jq, yq, difftastic)"},"codex-cli":{type:"string",description:"yes|no install/upgrade Codex CLI + ast-grep globally"},"profiles-scope":{type:"string",description:"single|all (write one profile or all profiles)"},profile:{type:"string",description:"balanced|safe|minimal|yolo|skip (choose profile to write)"},"profile-mode":{type:"string",description:"add|overwrite (profile table merge strategy)"},sound:{type:"string",description:'Sound file, "none", or "skip" to leave unchanged'},"agents-md":{type:"string",description:"Write starter AGENTS.md to PATH (default PWD/AGENTS.md)",required:!1}},async run({args:e,rawArgs:t}){let n=D(ee.homedir(),".codex","config.toml"),r=await Se(n),o=D(ee.homedir(),".codex","notify.sh"),i=await Se(o),s=D(ee.homedir(),".codex","AGENTS.md"),a=await Se(s),p=r?await Ut(n):void 0,g=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes,b=Lt(e.profile),w=Gt(e["profile-mode"]),$=Ft(e["profiles-scope"]),f=qt(e.tools),d=Wt(e["codex-cli"]),h=process.platform==="darwin"||process.platform==="linux",C=typeof e.sound>"u"?void 0:String(e.sound).trim();if(C==="")throw new Error('Invalid --sound value (expected path, "none", or "skip")');let j=t.some(S=>S==="--no-vscode"||S.startsWith("--no-vscode=")),F=b||(Pe(p)?p:void 0)||"balanced",N=F,V=w||"add",A=$||"single",re=!0,ge=f||(h?"yes":"no"),xe=d||"yes",_,B,O;if(C&&(S=>{let c=S.trim().toLowerCase();if(c==="skip"){_="no",O=void 0;return}_="yes",O=c==="none"?"none":S})(C),g){if(l.intro("codex-1up \xB7 Install"),!d){let c=await l.confirm({message:"Install/update Codex CLI globally?",initialValue:!0});if(l.isCancel(c))return l.cancel("Install aborted");xe=c?"yes":"no"}if(h&&!f){l.note("We can install/update developer tools (rg, fd, fzf, jq, yq, difftastic, ast-grep) using your package manager (macOS/Linux).");let c=await l.confirm({message:"Install/update these CLI tools?",initialValue:!0});if(l.isCancel(c))return l.cancel("Install aborted");ge=c?"yes":"no"}else!h&&!f&&(ge="no");if(!$){let c=await l.select({message:"Install all profiles (balanced, safe, minimal, yolo)?",options:[{label:"Yes \u2014 install/update all profiles",value:"all"},{label:"No \u2014 choose a single profile",value:"single"}],initialValue:"all"});if(l.isCancel(c))return l.cancel("Install aborted");A=c}if(b)A==="all"&&N==="skip"&&(N=F);else{l.note(["Profiles:"," \u2022 Balanced: on-request approvals, workspace-write sandbox, web search on."," \u2022 Safe: on-failure approvals, workspace-write, web search off."," \u2022 Minimal: lean settings, minimal reasoning effort, web search off."," \u2022 YOLO: never approvals, danger-full-access, web search on, verbose."].join(`
40
+ `));let c=await l.select({message:"Choose a Codex profile to install",options:[{label:"Balanced (recommended)",value:"balanced",hint:"on-request approvals \xB7 workspace-write \xB7 web search on"},{label:"Safe",value:"safe",hint:"on-failure approvals \xB7 workspace-write \xB7 web search off"},{label:"Minimal",value:"minimal",hint:"lean defaults \xB7 minimal reasoning effort \xB7 web search off"},{label:"YOLO",value:"yolo",hint:"never approvals \xB7 danger-full-access \xB7 web search on"},...A==="single"?[{label:"Skip (no profile changes)",value:"skip"}]:[]],initialValue:Mt(p)});if(l.isCancel(c))return l.cancel("Install aborted");N=c}if((A==="all"||N!=="skip")&&!w){let c=await l.select({message:A==="all"?"How should we write all profiles?":`How should we write profiles.${N}?`,options:[{label:"Add / merge (preserve custom keys)",value:"add"},{label:"Overwrite codex profile (replace table)",value:"overwrite"}],initialValue:V});if(l.isCancel(c))return l.cancel("Install aborted");V=c}if(A==="single"&&N==="skip")re=!1;else{let c=await l.confirm({message:A==="all"?`Wrote all profiles to ~/.codex/config.toml (mode: ${V}). Set ${N} as the default profile?`:`Wrote profiles.${N} to ~/.codex/config.toml (mode: ${V}). Set this as the default profile?`,initialValue:!0});if(l.isCancel(c))return l.cancel("Install aborted");re=!!c}if(!C){let me=function(E){return[{label:"Skip (leave current setup)",value:"skip"},{label:"None (disable sounds)",value:"none"},...se.map(k=>({label:k,value:k})),{label:"Custom path\u2026",value:"custom"}]};var Pn=me;let c=D(fe,"sounds"),se=[];try{se=(await te.readdir(c)).filter(E=>/\.(wav|mp3|ogg)$/i.test(E)).sort()}catch{}_="yes";let v=se.includes("noti_1.wav")?"noti_1.wav":se[0]||"none";async function he(E){let k=await l.text({message:"Enter absolute path to a .wav file",placeholder:E||"/absolute/path/to/sound.wav",validate(q){if(!q)return"Path required";if(!q.startsWith("/"))return"Use an absolute path";if(!/(\.wav|\.mp3|\.ogg)$/i.test(q))return"Supported: .wav, .mp3, .ogg"}});if(l.isCancel(k))return null;try{await te.access(String(k))}catch{return l.log.warn("File not found. Try again."),await he(String(k))}return String(k)}let H=await l.select({message:"Notification sound",options:me(v),initialValue:v});if(l.isCancel(H))return l.cancel("Install aborted");if(H==="skip")_="no",O=void 0;else if(H==="custom"){let E=await he();if(E===null)return l.cancel("Install aborted");v=E}else v=H;if(H!=="skip"){for(;;){let E=await l.select({message:`Selected: ${v}. What next?`,options:[{label:"Preview \u25B6 (press p then Enter)",value:"preview"},{label:"Use this",value:"use"},{label:"Choose another\u2026",value:"change"}],initialValue:"use"});if(l.isCancel(E))return l.cancel("Install aborted");if(E==="use")break;if(E==="change"){let k=await l.select({message:"Notification sound",options:me(v),initialValue:v});if(l.isCancel(k))return l.cancel("Install aborted");if(k==="custom"){let q=await he();if(q===null)return l.cancel("Install aborted");v=q}else if(k==="skip"){_="no",O=void 0;break}else v=k;continue}try{let k=v==="none"?"none":v.startsWith("/")?v:D(fe,"sounds",v);await Ot(k)}catch(k){l.log.warn(String(k))}}O===void 0&&(O=v)}}if(a){l.note(`Global AGENTS.md is shared instructions Codex can reference in any repo. We add a short starter guide (fd/ast-grep/jq/yq patterns, deterministic selects).
41
41
 
42
42
  - Backups will be created
43
43
  - If you think codex works worse with this instructions, you can remove them from ~/.codex/AGENTS.md anytime.
44
- `);let c=await l.select({message:"Global ~/.codex/AGENTS.md (optional)",options:[{label:"Add to your existing AGENTS.md (keeps your content, adds ours; backup created)",value:"append-default"},{label:"Overwrite existing (replace with starter; backup created)",value:"overwrite-default"},{label:"Skip \u2014 leave as-is (you can run codex-1up agents later)",value:"skip"}],initialValue:"append-default"});if(l.isCancel(c))return l.cancel("Install aborted");V=c}else{l.note(`Global AGENTS.md is shared instructions Codex can reference in any repo. We add a short starter guide (fd/ast-grep/jq/yq patterns, deterministic selects).
44
+ `);let c=await l.select({message:"Global ~/.codex/AGENTS.md (optional)",options:[{label:"Add to your existing AGENTS.md (keeps your content, adds ours; backup created)",value:"append-default"},{label:"Overwrite existing (replace with starter; backup created)",value:"overwrite-default"},{label:"Skip \u2014 leave as-is (you can run codex-1up agents later)",value:"skip"}],initialValue:"append-default"});if(l.isCancel(c))return l.cancel("Install aborted");B=c}else{l.note(`Global AGENTS.md is shared instructions Codex can reference in any repo. We add a short starter guide (fd/ast-grep/jq/yq patterns, deterministic selects).
45
45
 
46
46
  - Backups will be created
47
47
  - If you think codex works worse with this instructions, you can remove them from ~/.codex/AGENTS.md anytime.
48
- `);let c=await l.select({message:"Global ~/.codex/AGENTS.md (optional)",options:[{label:"Create starter AGENTS.md (recommended; helps give Codex repo context everywhere)",value:"create-default"},{label:"Skip for now (you can add later with codex-1up agents --global)",value:"skip"}],initialValue:"create-default"});if(l.isCancel(c))return l.cancel("Install aborted");V=c}}g||(I==="skip"&&(ie=!1),typeof _>"u"&&(_=i?"no":"yes"),typeof V>"u"&&(V="skip"));let Ne={profile:I,profileScope:A,profileMode:U,setDefaultProfile:ie,installCodexCli:Ie,installTools:ue,notify:_??(i?"no":"yes"),globalAgents:V??"skip",notificationSound:O,mode:"manual",installNode:e["install-node"]||"nvm",shell:String(e.shell||"auto"),vscodeId:j?void 0:e.vscode?String(e.vscode):void 0,noVscode:j||e["no-vscode"]||!1,agentsMd:typeof e["agents-md"]<"u"?String(e["agents-md"]||process.cwd()):void 0,dryRun:e["dry-run"]||!1,assumeYes:e.yes||!1,skipConfirmation:e["skip-confirmation"]||!1};if(g){let S=l.spinner();S.start("Installing prerequisites and writing config");try{await ve(Ne,pe),S.stop("Base install complete"),l.outro("Install finished")}catch(c){throw S.stop("Installation failed"),l.cancel(`Installation failed: ${c}`),c}await Xe();return}try{await ve(Ne,pe),await Xe()}catch(S){throw l.cancel(`Installation failed: ${S}`),S}}});async function Xe(){let e=Z.homedir(),t=D(e,".codex","config.toml"),o,r=[];try{let f=await ee.readFile(t,"utf8"),g=Se.parse(f);o=g.profile;let b=g.profiles||{};r=Object.keys(b)}catch{}let n=["codex","ast-grep","fd","rg","fzf","jq","yq","difft","difftastic"],a=(await Promise.all(n.map(async f=>{try{return await W(f),[f,!0]}catch{return[f,!1]}}))).filter(([,f])=>f).map(([f])=>f),s=[];s.push(""),s.push("codex-1up: Installation summary"),s.push("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),s.push(`Config: ${t}${o?` (active profile: ${o})`:""}`),r.length&&s.push(`Profiles: ${r.join(", ")}`),s.push(`Tools detected: ${a.join(", ")||"none"}`),s.push(""),s.push("Usage:"),s.push(" - Switch profile for a session: codex --profile <name>"),s.push(" - List available profiles: codex-1up config profiles"),s.push(" - Persist active profile: codex-1up config set-profile <name>"),s.push(" - Write AGENTS.md to a repo: codex-1up agents --path . --template default"),s.push(""),process.stdout.write(s.join(`
48
+ `);let c=await l.select({message:"Global ~/.codex/AGENTS.md (optional)",options:[{label:"Create starter AGENTS.md (recommended; helps give Codex repo context everywhere)",value:"create-default"},{label:"Skip for now (you can add later with codex-1up agents --global)",value:"skip"}],initialValue:"create-default"});if(l.isCancel(c))return l.cancel("Install aborted");B=c}}g||(N==="skip"&&(re=!1),typeof _>"u"&&(_=i?"no":"yes"),typeof B>"u"&&(B="skip"));let Te={profile:N,profileScope:A,profileMode:V,setDefaultProfile:re,installCodexCli:xe,installTools:ge,notify:_??(i?"no":"yes"),globalAgents:B??"skip",notificationSound:O,mode:"manual",installNode:e["install-node"]||"nvm",shell:String(e.shell||"auto"),vscodeId:j?void 0:e.vscode?String(e.vscode):void 0,noVscode:j||e["no-vscode"]||!1,agentsMd:typeof e["agents-md"]<"u"?String(e["agents-md"]||process.cwd()):void 0,dryRun:e["dry-run"]||!1,assumeYes:e.yes||!1,skipConfirmation:e["skip-confirmation"]||!1};if(g){let S=l.spinner();S.start("Installing prerequisites and writing config");try{await ve(Te,fe),S.stop("Base install complete"),l.outro("Install finished")}catch(c){throw S.stop("Installation failed"),l.cancel(`Installation failed: ${c}`),c}await Ye();return}try{await ve(Te,fe),await Ye()}catch(S){throw l.cancel(`Installation failed: ${S}`),S}}});async function Ye(){let e=ee.homedir(),t=D(e,".codex","config.toml"),n,r=[];try{let p=await te.readFile(t,"utf8"),g=Re.parse(p);n=g.profile;let b=g.profiles||{};r=Object.keys(b)}catch{}let o=["codex","ast-grep","fd","rg","fzf","jq","yq","difft","difftastic"],s=(await Promise.all(o.map(async p=>{try{return await U(p),[p,!0]}catch{return[p,!1]}}))).filter(([,p])=>p).map(([p])=>p),a=[];a.push(""),a.push("codex-1up: Installation summary"),a.push("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),a.push(`Config: ${t}${n?` (active profile: ${n})`:""}`),r.length&&a.push(`Profiles: ${r.join(", ")}`),a.push(`Tools detected: ${s.join(", ")||"none"}`),a.push(""),a.push("Usage:"),a.push(" - Switch profile for a session: codex --profile <name>"),a.push(" - List available profiles: codex-1up config profiles"),a.push(" - Persist active profile: codex-1up config set-profile <name>"),a.push(" - Write AGENTS.md to a repo: codex-1up agents --path . --template default"),a.push(""),process.stdout.write(a.join(`
49
49
  `)+`
50
- `)}async function jt(e){if(e.endsWith("/none")||e==="none")return;let t=[async o=>{await W("afplay"),await Q`afplay ${o}`},async o=>{await W("paplay"),await Q`paplay ${o}`},async o=>{await W("aplay"),await Q`aplay ${o}`},async o=>{await W("mpg123"),await Q`mpg123 -q ${o}`},async o=>{await W("ffplay"),await Q`ffplay -nodisp -autoexit -loglevel quiet ${o}`}];for(let o of t)try{await o(e);return}catch{}throw new Error("No audio player found (afplay/paplay/aplay/mpg123/ffplay)")}async function Ce(e){try{return await ee.access(e),!0}catch{return!1}}function Ot(e){if(e==null)return;let t=String(e).toLowerCase();if(Re(t))return t;if(t==="skip")return"skip";throw new Error("Invalid --profile value (use balanced|safe|minimal|yolo|skip).")}function Lt(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="add"||t==="overwrite")return t;throw new Error("Invalid --profile-mode value (use add|overwrite).")}function Gt(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="single"||t==="all")return t;throw new Error("Invalid --profiles-scope value (use single|all).")}function Ft(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="yes"||t==="no")return t;throw new Error("Invalid --tools value (use yes|no).")}function qt(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="yes"||t==="no")return t;throw new Error("Expected yes|no")}function Re(e){return e==="balanced"||e==="safe"||e==="minimal"||e==="yolo"}function Mt(e){return Re(e)?e:"balanced"}async function Wt(e){try{let t=await ee.readFile(e,"utf8"),r=Se.parse(t).profile;return typeof r=="string"?r:void 0}catch{return}}import{defineCommand as zt}from"citty";import{promises as te}from"fs";import{accessSync as Ut}from"fs";import{resolve as oe,dirname as Ze}from"path";import{fileURLToPath as Vt}from"url";var Qe=Ze(Vt(import.meta.url));function Bt(){let e=Qe;for(let t=0;t<6;t++){try{return Ut(oe(e,"templates","codex-config.toml")),e}catch{}e=oe(e,"..")}return oe(Qe,"..")}var Ht=Bt();async function Pe(e){try{return await te.access(e),!0}catch{return!1}}async function Kt(e,t){if(await Pe(t)){let r=`${t}.backup.${new Date().toISOString().replace(/[:.]/g,"").replace("T","_").slice(0,15)}`;await te.copyFile(t,r)}await te.mkdir(Ze(t),{recursive:!0}),await te.copyFile(e,t)}var et=zt({meta:{name:"agents",description:"Write an AGENTS.md template"},args:{path:{type:"string",required:!0,description:"Target repo path or file"}},async run({args:e}){let t=String(e.path),o=oe(Ht,"templates/agent-templates","AGENTS-default.md"),n=await Pe(t).then(async i=>i&&(await te.stat(t)).isDirectory()).catch(()=>!1)?oe(t,"AGENTS.md"):t;if(!await Pe(o))throw new Error(`Template not found: ${o}`);await Kt(o,n),process.stdout.write(`Wrote ${n}
51
- `)}});import{defineCommand as Jt}from"citty";import{$ as Xt}from"zx";import{fileURLToPath as Yt}from"url";import{accessSync as Qt}from"fs";import{dirname as Zt,resolve as fe}from"path";var tt=Zt(Yt(import.meta.url));function eo(){let e=tt;for(let t=0;t<6;t++){try{return Qt(fe(e,"templates","codex-config.toml")),e}catch{}e=fe(e,"..")}return fe(tt,"..")}var to=eo(),ot=Jt({meta:{name:"doctor",description:"Run environment checks"},async run(){await Xt`bash ${fe(to,"scripts/doctor.sh")}`}});import{defineCommand as oo}from"citty";import{$ as no}from"zx";import{fileURLToPath as io}from"url";import{accessSync as ro}from"fs";import{dirname as ao,resolve as de}from"path";var nt=ao(io(import.meta.url));function so(){let e=nt;for(let t=0;t<6;t++){try{return ro(de(e,"templates","codex-config.toml")),e}catch{}e=de(e,"..")}return de(nt,"..")}var lo=so(),it=oo({meta:{name:"uninstall",description:"Clean up aliases and config created by this tool"},async run(){await no`bash ${de(lo,"scripts/uninstall.sh")}`}});import{defineCommand as ce}from"citty";import{promises as ne}from"fs";import{resolve as z,dirname as lt}from"path";import{fileURLToPath as po}from"url";import{accessSync as fo}from"fs";import co from"os";var rt=lt(po(import.meta.url));function uo(){let e=rt;for(let t=0;t<6;t++){try{return fo(z(e,"templates","codex-config.toml")),e}catch{}e=z(e,"..")}return z(rt,"..")}var go=uo();function Ee(){let e=z(co.homedir(),".codex"),t=z(e,"config.toml");return{CODEX_HOME:e,CFG:t}}async function xe(e){return ne.readFile(e,"utf8")}async function at(e,t){await ne.mkdir(lt(e),{recursive:!0}),await ne.writeFile(e,t,"utf8")}function st(e){let t=/^\[profiles\.(.+?)\]/gm,o=[],r;for(;r=t.exec(e);)o.push(r[1]);return o}function mo(e,t){let o=`profile = "${t}"`;if(/^profile\s*=\s*".*"/m.test(e))return e.replace(/^profile\s*=\s*".*"/m,o);let r=e.indexOf(`
52
- `);return r===-1?o+`
53
- `+e:e.slice(0,r+1)+o+`
54
- `+e.slice(r+1)}var pt=ce({meta:{name:"config",description:"Manage Codex config profiles"},subCommands:{init:ce({meta:{name:"init",description:"Install unified config with multiple profiles"},args:{force:{type:"boolean",description:"Backup and overwrite if exists"}},async run({args:e}){let t=z(go,"templates/codex-config.toml"),o=await xe(t),{CFG:r}=Ee(),n=await ne.access(r).then(()=>!0).catch(()=>!1);if(n&&!e.force){process.stdout.write(`${r} exists. Use --force to overwrite.
55
- `);return}if(n){let i=`${r}.backup.${Date.now()}`;await ne.copyFile(r,i),process.stdout.write(`Backed up to ${i}
56
- `)}await at(r,o),process.stdout.write(`Wrote ${r}
57
- `)}}),profiles:ce({meta:{name:"profiles",description:"List profiles in the current config"},async run(){let{CFG:e}=Ee(),t=await xe(e),o=st(t);process.stdout.write(o.length?o.join(`
50
+ `)}async function Ot(e){if(e.endsWith("/none")||e==="none")return;let t=[async n=>{await U("afplay"),await Z`afplay ${n}`},async n=>{await U("paplay"),await Z`paplay ${n}`},async n=>{await U("aplay"),await Z`aplay ${n}`},async n=>{await U("mpg123"),await Z`mpg123 -q ${n}`},async n=>{await U("ffplay"),await Z`ffplay -nodisp -autoexit -loglevel quiet ${n}`}];for(let n of t)try{await n(e);return}catch{}throw new Error("No audio player found (afplay/paplay/aplay/mpg123/ffplay)")}async function Se(e){try{return await te.access(e),!0}catch{return!1}}function Lt(e){if(e==null)return;let t=String(e).toLowerCase();if(Pe(t))return t;if(t==="skip")return"skip";throw new Error("Invalid --profile value (use balanced|safe|minimal|yolo|skip).")}function Gt(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="add"||t==="overwrite")return t;throw new Error("Invalid --profile-mode value (use add|overwrite).")}function Ft(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="single"||t==="all")return t;throw new Error("Invalid --profiles-scope value (use single|all).")}function qt(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="yes"||t==="no")return t;throw new Error("Invalid --tools value (use yes|no).")}function Wt(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="yes"||t==="no")return t;throw new Error("Expected yes|no")}function Pe(e){return e==="balanced"||e==="safe"||e==="minimal"||e==="yolo"}function Mt(e){return Pe(e)?e:"balanced"}async function Ut(e){try{let t=await te.readFile(e,"utf8"),r=Re.parse(t).profile;return typeof r=="string"?r:void 0}catch{return}}import{defineCommand as zt}from"citty";import{promises as ne}from"fs";import{accessSync as Vt}from"fs";import{resolve as oe,dirname as et}from"path";import{fileURLToPath as Bt}from"url";var Ze=et(Bt(import.meta.url));function Ht(){let e=Ze;for(let t=0;t<6;t++){try{return Vt(oe(e,"templates","codex-config.toml")),e}catch{}e=oe(e,"..")}return oe(Ze,"..")}var Kt=Ht();async function Ee(e){try{return await ne.access(e),!0}catch{return!1}}async function Jt(e,t){if(await Ee(t)){let r=`${t}.backup.${new Date().toISOString().replace(/[:.]/g,"").replace("T","_").slice(0,15)}`;await ne.copyFile(t,r)}await ne.mkdir(et(t),{recursive:!0}),await ne.copyFile(e,t)}var tt=zt({meta:{name:"agents",description:"Write an AGENTS.md template"},args:{path:{type:"string",required:!0,description:"Target repo path or file"}},async run({args:e}){let t=String(e.path),n=oe(Kt,"templates/agent-templates","AGENTS-default.md"),o=await Ee(t).then(async i=>i&&(await ne.stat(t)).isDirectory()).catch(()=>!1)?oe(t,"AGENTS.md"):t;if(!await Ee(n))throw new Error(`Template not found: ${n}`);await Jt(n,o),process.stdout.write(`Wrote ${o}
51
+ `)}});import{defineCommand as Xt}from"citty";import{$ as Yt}from"zx";import{fileURLToPath as Qt}from"url";import{accessSync as Zt}from"fs";import{dirname as en,resolve as de}from"path";var nt=en(Qt(import.meta.url));function tn(){let e=nt;for(let t=0;t<6;t++){try{return Zt(de(e,"templates","codex-config.toml")),e}catch{}e=de(e,"..")}return de(nt,"..")}var nn=tn(),ot=Xt({meta:{name:"doctor",description:"Run environment checks"},async run(){await Yt`bash ${de(nn,"scripts/doctor.sh")}`}});import{defineCommand as on}from"citty";import{$ as rn}from"zx";import{fileURLToPath as sn}from"url";import{accessSync as an}from"fs";import{dirname as ln,resolve as ce}from"path";var it=ln(sn(import.meta.url));function pn(){let e=it;for(let t=0;t<6;t++){try{return an(ce(e,"templates","codex-config.toml")),e}catch{}e=ce(e,"..")}return ce(it,"..")}var fn=pn(),rt=on({meta:{name:"uninstall",description:"Clean up aliases and config created by this tool"},async run(){await rn`bash ${ce(fn,"scripts/uninstall.sh")}`}});import{defineCommand as ue}from"citty";import{promises as ie}from"fs";import{resolve as z,dirname as pt}from"path";import{fileURLToPath as dn}from"url";import{accessSync as cn}from"fs";import un from"os";var st=pt(dn(import.meta.url));function gn(){let e=st;for(let t=0;t<6;t++){try{return cn(z(e,"templates","codex-config.toml")),e}catch{}e=z(e,"..")}return z(st,"..")}var mn=gn();function Ie(){let e=z(un.homedir(),".codex"),t=z(e,"config.toml");return{CODEX_HOME:e,CFG:t}}async function Ne(e){return ie.readFile(e,"utf8")}async function at(e,t){await ie.mkdir(pt(e),{recursive:!0}),await ie.writeFile(e,t,"utf8")}function lt(e){let t=/^\[profiles\.(.+?)\]/gm,n=[],r;for(;r=t.exec(e);)n.push(r[1]);return n}function hn(e,t){let n=`profile = "${t}"`;if(/^profile\s*=\s*".*"/m.test(e))return e.replace(/^profile\s*=\s*".*"/m,n);let r=e.indexOf(`
52
+ `);return r===-1?n+`
53
+ `+e:e.slice(0,r+1)+n+`
54
+ `+e.slice(r+1)}var ft=ue({meta:{name:"config",description:"Manage Codex config profiles"},subCommands:{init:ue({meta:{name:"init",description:"Install unified config with multiple profiles"},args:{force:{type:"boolean",description:"Backup and overwrite if exists"}},async run({args:e}){let t=z(mn,"templates/codex-config.toml"),n=await Ne(t),{CFG:r}=Ie(),o=await ie.access(r).then(()=>!0).catch(()=>!1);if(o&&!e.force){process.stdout.write(`${r} exists. Use --force to overwrite.
55
+ `);return}if(o){let i=`${r}.backup.${Date.now()}`;await ie.copyFile(r,i),process.stdout.write(`Backed up to ${i}
56
+ `)}await at(r,n),process.stdout.write(`Wrote ${r}
57
+ `)}}),profiles:ue({meta:{name:"profiles",description:"List profiles in the current config"},async run(){let{CFG:e}=Ie(),t=await Ne(e),n=lt(t);process.stdout.write(n.length?n.join(`
58
58
  `)+`
59
59
  `:`No profiles found
60
- `)}}),"set-profile":ce({meta:{name:"set-profile",description:"Set the active profile in config.toml"},args:{name:{type:"positional",required:!0,description:"Profile name"}},async run({args:e}){let{CFG:t}=Ee(),o=await xe(t),r=st(o),n=String(e.name);if(!r.includes(n))throw new Error(`Unknown profile: ${n}`);let i=mo(o,n);await at(t,i),process.stdout.write(`profile set to ${n}
61
- `)}})}});var $o=bo(yo(import.meta.url)),vo=JSON.parse(wo(ko($o,"../package.json"),"utf-8")),ft=ho({meta:{name:"codex-1up",version:vo.version,description:"Power up Codex CLI with clean profiles config and helpers"},subCommands:{install:Ye,agents:et,doctor:ot,uninstall:it,config:pt}});Co(ft);
60
+ `)}}),"set-profile":ue({meta:{name:"set-profile",description:"Set the active profile in config.toml"},args:{name:{type:"positional",required:!0,description:"Profile name"}},async run({args:e}){let{CFG:t}=Ie(),n=await Ne(t),r=lt(n),o=String(e.name);if(!r.includes(o))throw new Error(`Unknown profile: ${o}`);let i=hn(n,o);await at(t,i),process.stdout.write(`profile set to ${o}
61
+ `)}})}});var Cn=kn(bn(import.meta.url)),vn=JSON.parse(yn($n(Cn,"../package.json"),"utf-8")),dt=wn({meta:{name:"codex-1up",version:vn.version,description:"Power up Codex CLI with clean profiles config and helpers"},subCommands:{install:Qe,agents:tt,doctor:ot,uninstall:rt,config:ft}});Sn(dt);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "codex-1up",
3
3
  "private": false,
4
4
  "type": "module",
5
- "version": "0.2.7",
5
+ "version": "0.2.8",
6
6
  "description": "TypeScript CLI for codex-1up (citty-based)",
7
7
  "bin": {
8
8
  "codex-1up": "bin/codex-1up.mjs"