codex-1up 0.3.1 → 0.3.2

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 +1 -1
  2. package/package.json +1 -1
package/dist/main.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import{runMain as So}from"citty";import{defineCommand as wo}from"citty";import{readFileSync as yo}from"fs";import{fileURLToPath as bo}from"url";import{dirname as ko,join as $o}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 o=(r,n)=>{let i=r?`${r} ${n}
2
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 W}from"zx";import{which as ut,$ as gt}from"zx";import{spawn as mt}from"child_process";async function c(e){try{return await ut(e),!0}catch{return!1}}async function Ae(){return await c("brew")?"brew":await c("apt-get")?"apt":await c("dnf")?"dnf":await c("pacman")?"pacman":await c("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 c("pnpm"))try{let o=(await gt`pnpm bin -g`.quiet()).stdout.trim();return o?{pm:"pnpm",binDir:o}:(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 c("npm")?{pm:"npm",reason:"npm-default"}:{pm:"none",reason:"not-found"}}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=mt(e,t,{stdio:"inherit",cwd:o.cwd||process.cwd(),shell:!1});await new Promise((n,i)=>{r.on("error",i),r.on("exit",s=>{if(s===0)return n();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 c("node"),o=await c("npm");if(t&&o){let n=(await W`node -v`).stdout.trim();e.logger.ok(`Node.js present (${n})`);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 c("node")){let n=(await W`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 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"),o=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 c("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 o=K.dirname(t);process.env.PATH=`${o}:${process.env.PATH||""}`;try{let n=(await W`${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 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 o of yt)try{let n=(await we`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 we`npm ls -g ${o} --depth=0 --json`.quiet().nothrow(),s="";try{s=JSON.parse(i.stdout||"{}").dependencies?.[o]?.version||""}catch{s=""}if(!s)e.logger.info(`${o} not installed; will install @${n}`),t.push(`${o}@${n}`);else if(s!==n){let a=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes;if(o===bt&&a){let p=await L.confirm({message:`Codex CLI is installed globally (v${s}), latest is v${n}. 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} -> ${n}`),t.push(`${o}@${n}`)):e.logger.info("Keeping existing Codex CLI version as requested.")}else e.logger.info(`${o} ${s} -> ${n}`),t.push(`${o}@${n}`)}else e.logger.ok(`${o} up-to-date (${s})`)}catch(r){e.logger.warn(`Error checking ${o}: ${r}`);let n=await we`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),r=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes,n=o.pm;if(o.pm==="none"&&o.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."),n="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.'),n="npm";n==="none"?e.logger.warn("Skipping global Node installs because no supported package manager was found."):n==="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 c("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 o=$t[t]||[];if(o.length>0)switch(t!=="brew"&&t!=="none"&&(typeof process.getuid=="function"&&process.getuid()===0||e.logger.warn("Package installation may require sudo password. Please enter it when prompted.")),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}=x("apt-get");e.logger.info("Running apt-get update...");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 s of o)try{await m(n,[...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 c("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}=x("dnf");await m(n,[...i,"install","-y",...o],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"pacman":{let{cmd:n,argsPrefix:i}=x("pacman");await m(n,[...i,"-Sy","--noconfirm",...o],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"zypper":{let{cmd:n,argsPrefix:i}=x("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 c("difft")&&!await c("difftastic")&&(await c("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 c("fdfind")&&!await c("fd")){let n=be.join(e.homeDir,".local","bin");await ye.ensureDir(n);let i=(await kt`command -v fdfind`).stdout.trim(),s=be.join(n,"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 n of r)await c(n)&&e.logger.ok(`${n} \u2713`)}async function Ct(e,t){if(await c("sg")||await c("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 c("sg")||await c("ast-grep"))return;let n=await ae(e.logger),i=n.pm==="none"&&n.reason?.startsWith("pnpm-")?"npm":n.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"?(n.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"'],["model_reasoning_summary",'"concise"']],features:[["web_search_request","true"]]},safe:{root:[["approval_policy",'"on-failure"'],["sandbox_mode",'"read-only"'],["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"'],["model_reasoning_summary",'"concise"']],features:[["web_search_request","false"]]},yolo:{root:[["approval_policy",'"never"'],["sandbox_mode",'"danger-full-access"'],["model",'"gpt-5.1-codex-max"'],["model_reasoning_effort",'"high"'],["model_reasoning_summary",'"detailed"'],["tool_output_token_limit","25000"],["model_auto_compact_token_limit","233000"]],features:[["web_search_request","true"]]}},vt=`# ~/.codex/config.toml \u2014 managed by codex-1up (patch mode)
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 W}from"zx";import{which as ut,$ as gt}from"zx";import{spawn as mt}from"child_process";async function c(e){try{return await ut(e),!0}catch{return!1}}async function Ae(){return await c("brew")?"brew":await c("apt-get")?"apt":await c("dnf")?"dnf":await c("pacman")?"pacman":await c("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 c("pnpm"))try{let o=(await gt`pnpm bin -g`.quiet()).stdout.trim();return o?{pm:"pnpm",binDir:o}:(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 c("npm")?{pm:"npm",reason:"npm-default"}:{pm:"none",reason:"not-found"}}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=mt(e,t,{stdio:"inherit",cwd:o.cwd||process.cwd(),shell:!1});await new Promise((n,i)=>{r.on("error",i),r.on("exit",s=>{if(s===0)return n();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 c("node"),o=await c("npm");if(t&&o){let n=(await W`node -v`).stdout.trim();e.logger.ok(`Node.js present (${n})`);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 c("node")){let n=(await W`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 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"),o=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 c("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 o=K.dirname(t);process.env.PATH=`${o}:${process.env.PATH||""}`;try{let n=(await W`${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 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 o of yt)try{let n=(await we`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 we`npm ls -g ${o} --depth=0 --json`.quiet().nothrow(),s="";try{s=JSON.parse(i.stdout||"{}").dependencies?.[o]?.version||""}catch{s=""}if(!s)e.logger.info(`${o} not installed; will install @${n}`),t.push(`${o}@${n}`);else if(s!==n){let a=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes;if(o===bt&&a){let p=await L.confirm({message:`Codex CLI is installed globally (v${s}), latest is v${n}. 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} -> ${n}`),t.push(`${o}@${n}`)):e.logger.info("Keeping existing Codex CLI version as requested.")}else e.logger.info(`${o} ${s} -> ${n}`),t.push(`${o}@${n}`)}else e.logger.ok(`${o} up-to-date (${s})`)}catch(r){e.logger.warn(`Error checking ${o}: ${r}`);let n=await we`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),r=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes,n=o.pm;if(o.pm==="none"&&o.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."),n="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.'),n="npm";n==="none"?e.logger.warn("Skipping global Node installs because no supported package manager was found."):n==="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 c("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 o=$t[t]||[];if(o.length>0)switch(t!=="brew"&&(typeof process.getuid=="function"&&process.getuid()===0||e.logger.warn("Package installation may require sudo password. Please enter it when prompted.")),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}=x("apt-get");e.logger.info("Running apt-get update...");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 s of o)try{await m(n,[...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 c("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}=x("dnf");await m(n,[...i,"install","-y",...o],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"pacman":{let{cmd:n,argsPrefix:i}=x("pacman");await m(n,[...i,"-Sy","--noconfirm",...o],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"zypper":{let{cmd:n,argsPrefix:i}=x("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 c("difft")&&!await c("difftastic")&&(await c("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 c("fdfind")&&!await c("fd")){let n=be.join(e.homeDir,".local","bin");await ye.ensureDir(n);let i=(await kt`command -v fdfind`).stdout.trim(),s=be.join(n,"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 n of r)await c(n)&&e.logger.ok(`${n} \u2713`)}async function Ct(e,t){if(await c("sg")||await c("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 c("sg")||await c("ast-grep"))return;let n=await ae(e.logger),i=n.pm==="none"&&n.reason?.startsWith("pnpm-")?"npm":n.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"?(n.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"'],["model_reasoning_summary",'"concise"']],features:[["web_search_request","true"]]},safe:{root:[["approval_policy",'"on-failure"'],["sandbox_mode",'"read-only"'],["model",'"gpt-5.1-codex"'],["model_reasoning_effort",'"medium"'],["model_reasoning_summary",'"concise"']],features:[["web_search_request","false"]]},yolo:{root:[["approval_policy",'"never"'],["sandbox_mode",'"danger-full-access"'],["model",'"gpt-5.1-codex-max"'],["model_reasoning_effort",'"high"'],["model_reasoning_summary",'"detailed"'],["tool_output_token_limit","25000"],["model_auto_compact_token_limit","233000"]],features:[["web_search_request","true"]]}},vt=`# ~/.codex/config.toml \u2014 managed by codex-1up (patch mode)
4
4
  `;async function qe(e){let t=pe.join(e.homeDir,".codex","config.toml");await X.ensureDir(pe.dirname(t));let o=await X.pathExists(t),r=o?await X.readFile(t,"utf8"):vt,n=new $e(r),i=!1;if(i=St(n,e.options.profileScope,e.options.profile,e.options.profileMode)||i,i=Rt(n,e.options.profile,e.options.setDefaultProfile)||i,i=Pt(n,e.options.notificationSound)||i,!i){e.logger.info("Config already up to date; no changes needed.");return}let s=n.content();if(e.options.dryRun){e.logger.log(`[dry-run] write ${t}`),e.logger.log(s);return}if(o){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,o,r){if(t==="single"&&o==="skip")return!1;let n=t==="all"?Object.keys(Ge):[o],i=!1;for(let s of n){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,o){return!o||t==="skip"?!1:e.setRootKey("profile",`"${t}"`,{mode:"force"})}function Pt(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 $e=class{text;constructor(t){this.text=t||""}content(){return It(this.text)}ensureTable(t){if(this.hasTable(t))return!1;let o=this.text.length===0?"":Fe(this.text);return this.text=o+`[${t}]
5
5
  `,!0}setKey(t,o,r,n){let i=le(this.text,t);if(!i)return this.ensureTable(t),this.setKey(t,o,r,n);let s=this.text.slice(i.start,i.end),p=new RegExp(`^\\s*${ke(o)}\\s*=.*$`,"m").exec(s);if(p){if(n.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)+`${o} = ${r}`+C.slice(F),this.text!==C}let g=this.text,b=i.end,w=g.slice(0,b),$=g.slice(b),d=w.length>0&&!w.endsWith(`
6
6
  `),f=$.length>0&&!$.startsWith(`
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "codex-1up",
3
3
  "private": false,
4
4
  "type": "module",
5
- "version": "0.3.1",
5
+ "version": "0.3.2",
6
6
  "description": "TypeScript CLI for codex-1up (citty-based)",
7
7
  "bin": {
8
8
  "codex-1up": "bin/codex-1up.mjs"