codex-1up 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Codex CLI 1UP
2
2
 
3
- ![codex-1up banner] (https://raw.githubusercontent.com/regenrek/codex-1up/main/public/banner.png)
3
+ ![codex-1up banner](https://raw.githubusercontent.com/regenrek/codex-1up/main/public/banner.png)
4
4
 
5
5
 
6
6
  **Codex 1UP** equips your Codex CLI coding agent with powerful tools.
@@ -11,7 +11,7 @@
11
11
  - ✅ Unified **Codex config** with multiple profiles: `balanced` / `safe` / `yolo`
12
12
  - ✅ 🔊 **Notification sounds** with customizable audio alerts for Codex events
13
13
 
14
- ![Screenshot of Codex 1UP terminal interface] (https://raw.githubusercontent.com/regenrek/codex-1up/main/public/example.png)
14
+ ![Screenshot of Codex 1UP terminal interface](https://raw.githubusercontent.com/regenrek/codex-1up/main/public/example.png)
15
15
 
16
16
  ## Quick start
17
17
 
@@ -53,9 +53,9 @@ codex-1up install
53
53
 
54
54
  | Profile | Model | Sandbox | Description |
55
55
  | --- | --- | --- | --- |
56
- | balanced (default) | gpt-5.1-codex | workspace-write | Approvals on-request; web search on. Standard for everyday use. |
57
- | safe | gpt-5.1-codex | read-only | Approvals on-failure; web search off. Maximum security for critical repos. |
58
- | yolo | gpt-5.1-codex-max | danger-full-access | Never ask for approvals; high reasoning; optimized for long autonomous sessions. ⚠️ **Warning:** Grants full system access. |
56
+ | balanced (default) | gpt-5.2 | workspace-write | Approvals on-request; web search on. Standard for everyday use. |
57
+ | safe | gpt-5.2 | read-only | Approvals on-failure; web search off. Maximum security for critical repos. |
58
+ | yolo | gpt-5.2 | danger-full-access | Never ask for approvals; high reasoning; optimized for long autonomous sessions. ⚠️ **Warning:** Grants full system access. |
59
59
 
60
60
  Switch profiles anytime: `codex --profile <name>` for a session, or `codex-1up config set-profile <name>` to persist.
61
61
 
package/dist/main.js CHANGED
@@ -1,35 +1,35 @@
1
- import{runMain as Co}from"citty";import{defineCommand as mo}from"citty";import{readFileSync as ho}from"fs";import{fileURLToPath as yo}from"url";import{dirname as wo,join as bo}from"path";import{defineCommand as xt}from"citty";import{fileURLToPath as Nt}from"url";import{dirname as Tt,resolve as A}from"path";import{promises as te}from"fs";import*as ee from"os";import{accessSync as At}from"fs";import*as Pe from"toml";import*as l from"@clack/prompts";import{which as V,$ as Z}from"zx";import It from"fs-extra";import*as Ce from"path";import*as He from"os";import{createWriteStream as dt}from"fs";function Ae(e){let t=null;try{t=dt(e,{flags:"a"})}catch{}let o=(r,n)=>{let i=r?`${r} ${n}
1
+ import{runMain as Co}from"citty";import{defineCommand as mo}from"citty";import{readFileSync as ho}from"fs";import{fileURLToPath as yo}from"url";import{dirname as wo,join as bo}from"path";import{defineCommand as Nt}from"citty";import{fileURLToPath as Tt}from"url";import{dirname as xt,resolve as A}from"path";import{promises as te}from"fs";import*as ee from"os";import{accessSync as At}from"fs";import*as Re from"toml";import*as l from"@clack/prompts";import{which as V,$ as Z}from"zx";import It from"fs-extra";import*as Ce from"path";import*as He from"os";import{createWriteStream as dt}from"fs";function Ae(e){let t=null;try{t=dt(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 ft,$ as ct}from"zx";import{spawn as ut}from"child_process";async function u(e){try{return await ft(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 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 o=(await ct`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 u("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=ut(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 N(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"),o=await u("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 gt(e);break;case"brew":await mt(e);break;case"skip":e.logger.warn("Skipping Node installation; please install Node 18+ manually");return}if(await u("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 gt(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 mt(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 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 ye}from"zx";import*as G from"@clack/prompts";var ht=["@openai/codex"],yt="@openai/codex";async function Le(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 ht)try{let n=(await ye`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 ye`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===yt&&a){let p=await G.confirm({message:`Codex CLI is installed globally (v${s}), latest is v${n}. Upgrade now?`,initialValue:!0});G.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 ye`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 G.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(G.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 u("codex")?e.logger.ok("Codex CLI installed"):e.logger.err("Codex CLI not found after install")}import{$ as wt}from"zx";import*as be from"path";import we from"fs-extra";var bt={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 Ge(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=bt[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 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}=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 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 kt(e,t),await u("fdfind")&&!await u("fd")){let n=be.join(e.homeDir,".local","bin");await we.ensureDir(n);let i=(await wt`command -v fdfind`).stdout.trim(),s=be.join(n,"fd");await we.pathExists(s)||(e.options.dryRun?e.logger.log(`[dry-run] ln -s ${i} ${s}`):await we.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 u(n)&&e.logger.ok(`${n} \u2713`)}async function kt(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 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 Y from"fs-extra";import*as pe from"path";var Oe={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"]]}},$t=`# ~/.codex/config.toml \u2014 managed by codex-1up (patch mode)
4
- `;async function Fe(e){let t=pe.join(e.homeDir,".codex","config.toml");await Y.ensureDir(pe.dirname(t));let o=await Y.pathExists(t),r=o?await Y.readFile(t,"utf8"):$t,n=new $e(r),i=!1;if(i=Ct(n,e.options.profileScope,e.options.profile,e.options.profileMode)||i,i=vt(n,e.options.profile,e.options.setDefaultProfile)||i,i=St(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=N(t);await Y.copy(t,a),e.logger.info(`Backed up current config to ${a}`)}await Y.writeFile(t,s,"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(Oe):[o],i=!1;for(let s of n){let a=Oe[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,f]of a.root)i=e.setKey(`profiles.${s}`,p,f,{mode:"if-missing"})||i;e.ensureTable(`profiles.${s}.features`);for(let[p,f]of a.features)i=e.setKey(`profiles.${s}.features`,p,f,{mode:"if-missing"})||i}}return i}function vt(e,t,o){return!o||t==="skip"?!1:e.setRootKey("profile",`"${t}"`,{mode:"force"})}function St(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 Rt(this.text)}ensureTable(t){if(this.hasTable(t))return!1;let o=this.text.length===0?"":qe(this.text);return this.text=o+`[${t}]
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 k=this.text,j=i.start+p.index,q=j+p[0].length;return this.text=k.slice(0,j)+`${o} = ${r}`+k.slice(q),this.text!==k}let f=this.text,w=i.end,h=f.slice(0,w),S=f.slice(w),d=h.length>0&&!h.endsWith(`
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 ft,$ as ct}from"zx";import{spawn as ut}from"child_process";async function u(e){try{return await ft(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{let o=(await ct`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 u("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=ut(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 je from"fs-extra";import*as K from"path";import*as J from"os";async function _e(e){let t=await u("node"),o=await u("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 gt(e);break;case"brew":await mt(e);break;case"skip":e.logger.warn("Skipping Node installation; please install Node 18+ manually");return}if(await u("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 gt(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 je.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 mt(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 je.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 ye}from"zx";import*as O from"@clack/prompts";var ht=["@openai/codex"],yt="@openai/codex";async function Le(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 ht)try{let n=(await ye`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 ye`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===yt&&a){let p=await O.confirm({message:`Codex CLI is installed globally (v${s}), latest is v${n}. Upgrade now?`,initialValue:!0});O.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 ye`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 O.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(O.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 u("codex")?e.logger.ok("Codex CLI installed"):e.logger.err("Codex CLI not found after install")}import{$ as wt}from"zx";import*as be from"path";import we from"fs-extra";var bt={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=bt[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}=N("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 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 kt(e,t),await u("fdfind")&&!await u("fd")){let n=be.join(e.homeDir,".local","bin");await we.ensureDir(n);let i=(await wt`command -v fdfind`).stdout.trim(),s=be.join(n,"fd");await we.pathExists(s)||(e.options.dryRun?e.logger.log(`[dry-run] ln -s ${i} ${s}`):await we.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 u(n)&&e.logger.ok(`${n} \u2713`)}async function kt(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}=N("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}=N("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}=N("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}=N("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 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 Y from"fs-extra";import*as pe from"path";var Ge={balanced:{root:[["approval_policy",'"on-request"'],["sandbox_mode",'"workspace-write"'],["model",'"gpt-5.2"'],["model_reasoning_effort",'"medium"'],["model_reasoning_summary",'"concise"']],features:[["web_search_request","true"]],tables:{sandbox_workspace_write:[["network_access","true"]]}},safe:{root:[["approval_policy",'"on-failure"'],["sandbox_mode",'"read-only"'],["model",'"gpt-5.2"'],["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.2"'],["model_reasoning_effort",'"high"'],["model_reasoning_summary",'"detailed"']],features:[["web_search_request","true"]]}},$t=`# ~/.codex/config.toml \u2014 managed by codex-1up (patch mode)
4
+ `;async function Fe(e){let t=pe.join(e.homeDir,".codex","config.toml");await Y.ensureDir(pe.dirname(t));let o=await Y.pathExists(t),r=o?await Y.readFile(t,"utf8"):$t,n=new $e(r),i=!1;if(i=Ct(n,e.options.profileScope,e.options.profile,e.options.profileMode)||i,i=vt(n,e.options.profile,e.options.setDefaultProfile)||i,i=St(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 Y.copy(t,a),e.logger.info(`Backed up current config to ${a}`)}await Y.writeFile(t,s,"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(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;for(let[p,d]of Object.entries(a.tables||{}))i=e.replaceTable(`profiles.${s}.${p}`,d)||i}else{e.ensureTable(`profiles.${s}`);for(let[p,d]of a.root)i=e.setKey(`profiles.${s}`,p,d,{mode:"if-missing"})||i;e.ensureTable(`profiles.${s}.features`);for(let[p,d]of a.features)i=e.setKey(`profiles.${s}.features`,p,d,{mode:"if-missing"})||i;for(let[p,d]of Object.entries(a.tables||{})){e.ensureTable(`profiles.${s}.${p}`);for(let[y,h]of d)i=e.setKey(`profiles.${s}.${p}`,y,h,{mode:"if-missing"})||i}}}return i}function vt(e,t,o){return!o||t==="skip"?!1:e.setRootKey("profile",`"${t}"`,{mode:"force"})}function St(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 Pt(this.text)}ensureTable(t){if(this.hasTable(t))return!1;let o=this.text.length===0?"":qe(this.text);return this.text=o+`[${t}]
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 k=this.text,_=i.start+p.index,q=_+p[0].length;return this.text=k.slice(0,_)+`${o} = ${r}`+k.slice(q),this.text!==k}let d=this.text,y=i.end,h=d.slice(0,y),S=d.slice(y),f=h.length>0&&!h.endsWith(`
6
6
  `),c=S.length>0&&!S.startsWith(`
7
- `),y=`${d?`
7
+ `),w=`${f?`
8
8
  `:""}${o} = ${r}
9
9
  ${c?`
10
- `:""}`;return this.text=h+y+S,this.text!==f}getValue(t,o){let r=le(this.text,t);if(!r)return;let n=this.text.slice(r.start,r.end),s=new RegExp(`^\\s*${ke(o)}\\s*=\\s*(.+)$`,"m").exec(n);return s?s[1]:void 0}replaceTable(t,o){let r=o.map(([a,p])=>`${a} = ${p}`).join(`
10
+ `:""}`;return this.text=h+w+S,this.text!==d}getValue(t,o){let r=le(this.text,t);if(!r)return;let n=this.text.slice(r.start,r.end),s=new RegExp(`^\\s*${ke(o)}\\s*=\\s*(.+)$`,"m").exec(n);return s?s[1]:void 0}replaceTable(t,o){let r=o.map(([a,p])=>`${a} = ${p}`).join(`
11
11
  `),n=`[${t}]
12
12
  ${r}
13
13
 
14
- `,i=this.text,s=le(this.text,t);if(!s){let a=i.length===0?"":qe(i);return this.text=a+n,this.text!==i}return this.text=i.slice(0,s.start)+n+i.slice(s.end),this.text!==i}setRootKey(t,o,r){let n=Pt(this.text),i=this.text.slice(n.start,n.end),a=new RegExp(`^\\s*${ke(t)}\\s*=.*$`,"m").exec(i);if(a){if(r.mode==="if-missing")return!1;let c=this.text,y=n.start+a.index,k=y+a[0].length;return this.text=c.slice(0,y)+`${t} = ${o}`+c.slice(k),this.text!==c}let p=this.text,f=n.end,w=f>0&&!p.slice(0,f).endsWith(`
15
- `),h=p.slice(f),S=h.length>0&&!h.startsWith(`
16
- `),d=`${w?`
14
+ `,i=this.text,s=le(this.text,t);if(!s){let a=i.length===0?"":qe(i);return this.text=a+n,this.text!==i}return this.text=i.slice(0,s.start)+n+i.slice(s.end),this.text!==i}setRootKey(t,o,r){let n=Rt(this.text),i=this.text.slice(n.start,n.end),a=new RegExp(`^\\s*${ke(t)}\\s*=.*$`,"m").exec(i);if(a){if(r.mode==="if-missing")return!1;let c=this.text,w=n.start+a.index,k=w+a[0].length;return this.text=c.slice(0,w)+`${t} = ${o}`+c.slice(k),this.text!==c}let p=this.text,d=n.end,y=d>0&&!p.slice(0,d).endsWith(`
15
+ `),h=p.slice(d),S=h.length>0&&!h.startsWith(`
16
+ `),f=`${y?`
17
17
  `:""}${t} = ${o}
18
18
  ${S?`
19
- `:""}`;return this.text=p.slice(0,f)+d+h,this.text!==p}hasTable(t){return le(this.text,t)!==null}};function le(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 s=r[i].index,a=r[i+1]?.index??e.length;return{start:s,end:a}}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 ke(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Rt(e){return e.endsWith(`
19
+ `:""}`;return this.text=p.slice(0,d)+f+h,this.text!==p}hasTable(t){return le(this.text,t)!==null}};function le(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 s=r[i].index,a=r[i+1]?.index??e.length;return{start:s,end:a}}return null}function Rt(e){let o=/^\s*\[([^\]]+)\]\s*$/gm.exec(e);return o?{start:0,end:o.index}:{start:0,end:e.length}}function ke(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Pt(e){return e.endsWith(`
20
20
  `)?e:e+`
21
21
  `}function qe(e){let t=e;return t.endsWith(`
22
22
  `)||(t+=`
23
23
  `),t.endsWith(`
24
24
 
25
25
  `)||(t+=`
26
- `),t}import E from"fs-extra";import*as M from"path";async function We(e){let t=M.join(e.homeDir,".codex","notify.sh"),o=M.join(e.rootDir,"templates","notification.sh");await E.ensureDir(M.dirname(t));let r=e.options.notify;if(r==="no"){e.logger.info("Skipping notify hook installation");return}if(!await E.pathExists(o)){e.logger.warn(`Notification template missing at ${o}; skipping notify hook install`);return}if(await E.pathExists(t))if(r==="yes"){let i=N(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await E.copy(t,i),e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${t}`):(await E.copy(o,t),await E.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 E.copy(o,t),await E.chmod(t,493)),e.logger.ok("Installed notify hook to ~/.codex/notify.sh");let n=M.join(e.homeDir,".codex","config.toml");await E.pathExists(n)?await Et(n,t,e):e.logger.warn(`Config not found at ${n}; run again after config is created`)}async function Et(e,t,o){if(o.options.dryRun){o.logger.log("[dry-run] update config notify and tui.notifications");return}let n=(await E.readFile(e,"utf8")).split(/\r?\n/),i="",s=null,a=null,p=!1,f=!1;for(let d=0;d<n.length;d++){let c=n[d],y=c.match(/^\s*\[([^\]]+)\]\s*$/);if(y){i=y[1],i==="tui"&&(a=d);continue}let k=/^\s*notify\s*=\s*\[/.test(c),j=/^\s*tui\.notifications\s*=/.test(c),q=/^\s*notifications\s*=/.test(c);k&&(i===""?s===null&&(s=d):/^profiles\.[^.]+\.features$/.test(i)&&(n.splice(d,1),d--,p=!0)),j&&/^profiles\.[^.]+\.features$/.test(i)&&(n.splice(d,1),d--,f=!0),q&&i===""&&(n.splice(d,1),d--,f=!0)}function w(d){let c=0;for(;c<n.length&&/^\s*(#.*)?$/.test(n[c]);)c++;n.splice(c,0,d)}if(s!==null){let d=n[s].match(/^(\s*notify\s*=\s*\[)([^\]]*)\]/);if(d){let c=d[2].trim();if(!c.includes(JSON.stringify(t))){let k=c&&!c.endsWith(",")?", ":"";n[s]=`${d[1]}${c}${k}${JSON.stringify(t)}]`,o.logger.ok("Added notify hook to config")}}}else w(`notify = [${JSON.stringify(t)}]`),o.logger.ok("Enabled notify hook in config");let h=!1;if(a!==null){let d=a+1,c=!1;for(;d<n.length;d++){let y=n[d];if(/^\s*\[/.test(y))break;if(/^\s*notifications\s*=/.test(y)){n[d]="notifications = true",c=!0,h=!0;break}}c||(n.splice(a+1,0,"notifications = true"),h=!0)}h||w(`[tui]
27
- notifications = true`);let S=[];i="";for(let d=0;d<n.length;d++){let c=n[d],y=c.match(/^\s*\[([^\]]+)\]\s*$/);if(y){i=y[1],S.push(c);continue}/^\s*tui\.notifications\s*=/.test(c)||/^\s*notifications\s*=/.test(c)&&i!=="tui"||S.push(c)}await E.writeFile(e,S.join(`
28
- `),"utf8")}import T from"fs-extra";import*as C from"path";async function Me(e){let t=C.join(e.rootDir,"sounds"),o=C.join(e.homeDir,".codex","sounds");await T.ensureDir(o);let r=e.options.notificationSound;if(r==="none"){let f=C.join(e.homeDir,".codex","notify.sh");if(await T.pathExists(f)){let w=await T.readFile(f,"utf8"),h=w.replace(/^DEFAULT_CODEX_SOUND=.*$/m,'DEFAULT_CODEX_SOUND=""');e.options.dryRun?e.logger.log(`[dry-run] patch ${f} DEFAULT_CODEX_SOUND -> empty`):h!==w&&await T.writeFile(f,h,"utf8")}e.logger.ok("Notification sound disabled");return}let n;if(r&&!C.isAbsolute(r)?n=C.join(t,r):r?n=r:e.options.mode==="recommended"&&(n=C.join(t,"noti_1.wav")),!n||!await T.pathExists(n)){e.logger.warn("No notification sound selected or file missing; skipping sound setup");return}let i=C.isAbsolute(n),s=n.startsWith(C.join(e.rootDir,"sounds")),a=!i||s?C.join(o,C.basename(n)):n;(!i||s)&&(e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${a}`):await T.copy(n,a));let p=C.join(e.homeDir,".codex","notify.sh");if(await T.pathExists(p)){let f=await T.readFile(p,"utf8"),w=`DEFAULT_CODEX_SOUND="${a}"`,h=f.replace(/^DEFAULT_CODEX_SOUND=.*$/m,w);h!==f&&(e.options.dryRun?e.logger.log(`[dry-run] patch ${p} DEFAULT_CODEX_SOUND -> ${a}`):await T.writeFile(p,h,"utf8"))}e.logger.ok("Notification sound configured")}import v from"fs-extra";import*as O from"path";async function Ve(e){let t=O.join(e.homeDir,".codex","AGENTS.md"),o=e.options.globalAgents;if(o==="skip"){e.logger.info("Skipping global AGENTS.md creation");return}let r=O.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(!await v.pathExists(r)){e.logger.warn(`Template not found at ${r}`);return}switch(o){case"create-default":if(await v.pathExists(t)){e.logger.info("Global AGENTS.md already exists; leaving unchanged");return}await v.ensureDir(O.dirname(t)),e.options.dryRun?e.logger.log(`[dry-run] cp ${r} ${t}`):await v.copy(r,t),e.logger.ok(`Wrote ${t}`);break;case"overwrite-default":if(await v.ensureDir(O.dirname(t)),await v.pathExists(t)){let i=N(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await v.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 v.copy(r,t),e.logger.ok(`Wrote ${t}`);break;case"append-default":if(await v.ensureDir(O.dirname(t)),await v.pathExists(t)){let i=N(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await v.copy(t,i),e.logger.info(`Backed up existing AGENTS.md to: ${i}`)}let n=await v.readFile(r,"utf8");e.options.dryRun?e.logger.log(`[dry-run] append template to ${t}`):await v.appendFile(t,`
26
+ `),t}import E from"fs-extra";import*as M from"path";async function We(e){let t=M.join(e.homeDir,".codex","notify.sh"),o=M.join(e.rootDir,"templates","notification.sh");await E.ensureDir(M.dirname(t));let r=e.options.notify;if(r==="no"){e.logger.info("Skipping notify hook installation");return}if(!await E.pathExists(o)){e.logger.warn(`Notification template missing at ${o}; skipping notify hook install`);return}if(await E.pathExists(t))if(r==="yes"){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await E.copy(t,i),e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${t}`):(await E.copy(o,t),await E.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 E.copy(o,t),await E.chmod(t,493)),e.logger.ok("Installed notify hook to ~/.codex/notify.sh");let n=M.join(e.homeDir,".codex","config.toml");await E.pathExists(n)?await Et(n,t,e):e.logger.warn(`Config not found at ${n}; run again after config is created`)}async function Et(e,t,o){if(o.options.dryRun){o.logger.log("[dry-run] update config notify and tui.notifications");return}let n=(await E.readFile(e,"utf8")).split(/\r?\n/),i="",s=null,a=null,p=!1,d=!1;for(let f=0;f<n.length;f++){let c=n[f],w=c.match(/^\s*\[([^\]]+)\]\s*$/);if(w){i=w[1],i==="tui"&&(a=f);continue}let k=/^\s*notify\s*=\s*\[/.test(c),_=/^\s*tui\.notifications\s*=/.test(c),q=/^\s*notifications\s*=/.test(c);k&&(i===""?s===null&&(s=f):/^profiles\.[^.]+\.features$/.test(i)&&(n.splice(f,1),f--,p=!0)),_&&/^profiles\.[^.]+\.features$/.test(i)&&(n.splice(f,1),f--,d=!0),q&&i===""&&(n.splice(f,1),f--,d=!0)}function y(f){let c=0;for(;c<n.length&&/^\s*(#.*)?$/.test(n[c]);)c++;n.splice(c,0,f)}if(s!==null){let f=n[s].match(/^(\s*notify\s*=\s*\[)([^\]]*)\]/);if(f){let c=f[2].trim();if(!c.includes(JSON.stringify(t))){let k=c&&!c.endsWith(",")?", ":"";n[s]=`${f[1]}${c}${k}${JSON.stringify(t)}]`,o.logger.ok("Added notify hook to config")}}}else y(`notify = [${JSON.stringify(t)}]`),o.logger.ok("Enabled notify hook in config");let h=!1;if(a!==null){let f=a+1,c=!1;for(;f<n.length;f++){let w=n[f];if(/^\s*\[/.test(w))break;if(/^\s*notifications\s*=/.test(w)){n[f]="notifications = true",c=!0,h=!0;break}}c||(n.splice(a+1,0,"notifications = true"),h=!0)}h||y(`[tui]
27
+ notifications = true`);let S=[];i="";for(let f=0;f<n.length;f++){let c=n[f],w=c.match(/^\s*\[([^\]]+)\]\s*$/);if(w){i=w[1],S.push(c);continue}/^\s*tui\.notifications\s*=/.test(c)||/^\s*notifications\s*=/.test(c)&&i!=="tui"||S.push(c)}await E.writeFile(e,S.join(`
28
+ `),"utf8")}import x from"fs-extra";import*as C from"path";async function Me(e){let t=C.join(e.rootDir,"sounds"),o=C.join(e.homeDir,".codex","sounds");await x.ensureDir(o);let r=e.options.notificationSound;if(r==="none"){let d=C.join(e.homeDir,".codex","notify.sh");if(await x.pathExists(d)){let y=await x.readFile(d,"utf8"),h=y.replace(/^DEFAULT_CODEX_SOUND=.*$/m,'DEFAULT_CODEX_SOUND=""');e.options.dryRun?e.logger.log(`[dry-run] patch ${d} DEFAULT_CODEX_SOUND -> empty`):h!==y&&await x.writeFile(d,h,"utf8")}e.logger.ok("Notification sound disabled");return}let n;if(r&&!C.isAbsolute(r)?n=C.join(t,r):r?n=r:e.options.mode==="recommended"&&(n=C.join(t,"noti_1.wav")),!n||!await x.pathExists(n)){e.logger.warn("No notification sound selected or file missing; skipping sound setup");return}let i=C.isAbsolute(n),s=n.startsWith(C.join(e.rootDir,"sounds")),a=!i||s?C.join(o,C.basename(n)):n;(!i||s)&&(e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${a}`):await x.copy(n,a));let p=C.join(e.homeDir,".codex","notify.sh");if(await x.pathExists(p)){let d=await x.readFile(p,"utf8"),y=`DEFAULT_CODEX_SOUND="${a}"`,h=d.replace(/^DEFAULT_CODEX_SOUND=.*$/m,y);h!==d&&(e.options.dryRun?e.logger.log(`[dry-run] patch ${p} DEFAULT_CODEX_SOUND -> ${a}`):await x.writeFile(p,h,"utf8"))}e.logger.ok("Notification sound configured")}import v from"fs-extra";import*as G from"path";async function Ve(e){let t=G.join(e.homeDir,".codex","AGENTS.md"),o=e.options.globalAgents;if(o==="skip"){e.logger.info("Skipping global AGENTS.md creation");return}let r=G.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(!await v.pathExists(r)){e.logger.warn(`Template not found at ${r}`);return}switch(o){case"create-default":if(await v.pathExists(t)){e.logger.info("Global AGENTS.md already exists; leaving unchanged");return}await v.ensureDir(G.dirname(t)),e.options.dryRun?e.logger.log(`[dry-run] cp ${r} ${t}`):await v.copy(r,t),e.logger.ok(`Wrote ${t}`);break;case"overwrite-default":if(await v.ensureDir(G.dirname(t)),await v.pathExists(t)){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await v.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 v.copy(r,t),e.logger.ok(`Wrote ${t}`);break;case"append-default":if(await v.ensureDir(G.dirname(t)),await v.pathExists(t)){let i=T(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await v.copy(t,i),e.logger.info(`Backed up existing AGENTS.md to: ${i}`)}let n=await v.readFile(r,"utf8");e.options.dryRun?e.logger.log(`[dry-run] append template to ${t}`):await v.appendFile(t,`
29
29
  ---
30
30
 
31
- ${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 ze(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 Q from"path";async function Ue(e){let t=e.options.agentsMd;if(!t)return;let o=t;(await X.stat(o).catch(()=>null))?.isDirectory()&&(o=Q.join(o,"AGENTS.md"));let r=Q.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(await X.pathExists(o)){e.logger.warn(`${o} already exists`);let n=N(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(Q.dirname(o)),await X.copy(r,o),e.logger.ok("Wrote AGENTS.md"))}var Be="codex-1up";async function ve(e,t){let o=He.homedir(),r=Ce.join(o,`.${Be}`);await It.ensureDir(r);let n=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),i=Ce.join(r,`install-${n}.log`),s=Ae(i);s.info(`==> ${Be} installer`),s.info(`Log: ${i}`);let a={cwd:process.cwd(),homeDir:o,rootDir:t,logDir:r,logFile:i,options:e,logger:s};try{await je(a),await Le(a),await Ge(a);let f=await u("codex")||a.options.installCodexCli==="yes";f||s.warn("Codex CLI not found and codex install was skipped; skipping config/notify setup until codex is installed."),f&&(await Fe(a),await We(a),await Me(a),await Ve(a)),await ze(a),await Ue(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 Ke=Tt(Nt(import.meta.url));function Dt(){let e=Ke;for(let t=0;t<6;t++){try{return At(A(e,"templates","codex-config.toml")),e}catch{}e=A(e,"..")}return A(Ke,"..")}var de=Dt(),Ye=xt({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|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=A(ee.homedir(),".codex","config.toml"),r=await Se(o),n=A(ee.homedir(),".codex","notify.sh"),i=await Se(n),s=A(ee.homedir(),".codex","AGENTS.md"),a=await Se(s),p=r?await Wt(o):void 0,f=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes,w=jt(e.profile),h=Lt(e["profile-mode"]),S=Gt(e["profiles-scope"]),d=Ot(e.tools),c=qt(e["codex-cli"]),y=process.platform==="darwin"||process.platform==="linux",k=typeof e.sound>"u"?void 0:String(e.sound).trim();if(k==="")throw new Error('Invalid --sound value (expected path, "none", or "skip")');let j=t.some(P=>P==="--no-vscode"||P.startsWith("--no-vscode=")),q=w||(Re(p)?p:void 0)||"balanced",I=q,U=h||"add",D=S||"single",re=!0,ge=d||(y?"yes":"no"),Ne=c||"yes",_,B,L;if(k&&(P=>{let g=P.trim().toLowerCase();if(g==="skip"){_="no",L=void 0;return}_="yes",L=g==="none"?"none":P})(k),f){if(l.intro("codex-1up \xB7 Install"),!c){let g=await l.confirm({message:"Install/update Codex CLI globally?",initialValue:!0});if(l.isCancel(g))return l.cancel("Install aborted");Ne=g?"yes":"no"}if(y&&!d){l.note("We can install/update developer tools (rg, fd, fzf, jq, yq, difftastic, ast-grep) using your package manager (macOS/Linux).");let g=await l.confirm({message:"Install/update these CLI tools?",initialValue:!0});if(l.isCancel(g))return l.cancel("Install aborted");ge=g?"yes":"no"}else!y&&!d&&(ge="no");if(!S){let g=await l.select({message:"Install all profiles (balanced, safe, 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(g))return l.cancel("Install aborted");D=g}if(w)D==="all"&&I==="skip"&&(I=q);else{l.note(["Profiles:"," \u2022 Balanced: on-request approvals, workspace-write sandbox, web search on."," \u2022 Safe: on-failure approvals, read-only sandbox, web search off."," \u2022 YOLO: never approvals, danger-full-access, gpt-5.1-codex-max, high reasoning."].join(`
32
- `));let g=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 read-only \xB7 web search off"},{label:"YOLO",value:"yolo",hint:"never approvals \xB7 danger-full-access \xB7 gpt-5.1-codex-max"},...D==="single"?[{label:"Skip (no profile changes)",value:"skip"}]:[]],initialValue:Ft(p)});if(l.isCancel(g))return l.cancel("Install aborted");I=g}if((D==="all"||I!=="skip")&&!h){let g=await l.select({message:D==="all"?"How should we write all profiles?":`How should we write profiles.${I}?`,options:[{label:"Overwrite (use codex-1up defaults)",value:"overwrite"},{label:"Add Merge (add missing, keep your default settings)",value:"add"}],initialValue:U});if(l.isCancel(g))return l.cancel("Install aborted");U=g}if(D==="single"&&I==="skip")re=!1;else{let g=await l.confirm({message:D==="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(g))return l.cancel("Install aborted");re=!!g}if(!k){let me=function(R){return[{label:"Skip (leave current setup)",value:"skip"},{label:"None (disable sounds)",value:"none"},...se.map(b=>({label:b,value:b})),{label:"Custom path\u2026",value:"custom"}]};var So=me;let g=A(de,"sounds"),se=[];try{se=(await te.readdir(g)).filter(R=>/\.(wav|mp3|ogg)$/i.test(R)).sort()}catch{}_="yes";let $=se.includes("noti_1.wav")?"noti_1.wav":se[0]||"none";async function he(R){let b=await l.text({message:"Enter absolute path to a .wav file",placeholder:R||"/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(b))return null;try{await te.access(String(b))}catch{return l.log.warn("File not found. Try again."),await he(String(b))}return String(b)}let H=await l.select({message:"Notification sound",options:me($),initialValue:$});if(l.isCancel(H))return l.cancel("Install aborted");if(H==="skip")_="no",L=void 0;else if(H==="custom"){let R=await he();if(R===null)return l.cancel("Install aborted");$=R}else $=H;if(H!=="skip"){for(;;){let R=await l.select({message:`Selected: ${$}. 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(R))return l.cancel("Install aborted");if(R==="use")break;if(R==="change"){let b=await l.select({message:"Notification sound",options:me($),initialValue:$});if(l.isCancel(b))return l.cancel("Install aborted");if(b==="custom"){let F=await he();if(F===null)return l.cancel("Install aborted");$=F}else if(b==="skip"){_="no",L=void 0;break}else $=b;continue}try{let b=$==="none"?"none":$.startsWith("/")?$:A(de,"sounds",$);await _t(b)}catch(b){l.log.warn(String(b))}}L===void 0&&(L=$)}}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).
31
+ ${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 ze(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 Q from"path";async function Ue(e){let t=e.options.agentsMd;if(!t)return;let o=t;(await X.stat(o).catch(()=>null))?.isDirectory()&&(o=Q.join(o,"AGENTS.md"));let r=Q.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(Q.dirname(o)),await X.copy(r,o),e.logger.ok("Wrote AGENTS.md"))}var Be="codex-1up";async function ve(e,t){let o=He.homedir(),r=Ce.join(o,`.${Be}`);await It.ensureDir(r);let n=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),i=Ce.join(r,`install-${n}.log`),s=Ae(i);s.info(`==> ${Be} installer`),s.info(`Log: ${i}`);let a={cwd:process.cwd(),homeDir:o,rootDir:t,logDir:r,logFile:i,options:e,logger:s};try{await _e(a),await Le(a),await Oe(a);let d=await u("codex")||a.options.installCodexCli==="yes";d||s.warn("Codex CLI not found and codex install was skipped; skipping config/notify setup until codex is installed."),d&&(await Fe(a),await We(a),await Me(a),await Ve(a)),await ze(a),await Ue(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 Ke=xt(Tt(import.meta.url));function Dt(){let e=Ke;for(let t=0;t<6;t++){try{return At(A(e,"templates","codex-config.toml")),e}catch{}e=A(e,"..")}return A(Ke,"..")}var de=Dt(),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|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=A(ee.homedir(),".codex","config.toml"),r=await Se(o),n=A(ee.homedir(),".codex","notify.sh"),i=await Se(n),s=A(ee.homedir(),".codex","AGENTS.md"),a=await Se(s),p=r?await Wt(o):void 0,d=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes,y=_t(e.profile),h=Lt(e["profile-mode"]),S=Ot(e["profiles-scope"]),f=Gt(e.tools),c=qt(e["codex-cli"]),w=process.platform==="darwin"||process.platform==="linux",k=typeof e.sound>"u"?void 0:String(e.sound).trim();if(k==="")throw new Error('Invalid --sound value (expected path, "none", or "skip")');let _=t.some(R=>R==="--no-vscode"||R.startsWith("--no-vscode=")),q=y||(Pe(p)?p:void 0)||"balanced",I=q,U=h||"add",D=S||"single",re=!0,ge=f||(w?"yes":"no"),Te=c||"yes",j,B,L;if(k&&(R=>{let g=R.trim().toLowerCase();if(g==="skip"){j="no",L=void 0;return}j="yes",L=g==="none"?"none":R})(k),d){if(l.intro("codex-1up \xB7 Install"),!c){let g=await l.confirm({message:"Install/update Codex CLI globally?",initialValue:!0});if(l.isCancel(g))return l.cancel("Install aborted");Te=g?"yes":"no"}if(w&&!f){l.note("We can install/update developer tools (rg, fd, fzf, jq, yq, difftastic, ast-grep) using your package manager (macOS/Linux).");let g=await l.confirm({message:"Install/update these CLI tools?",initialValue:!0});if(l.isCancel(g))return l.cancel("Install aborted");ge=g?"yes":"no"}else!w&&!f&&(ge="no");if(!S){let g=await l.select({message:"Install all profiles (balanced, safe, 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(g))return l.cancel("Install aborted");D=g}if(y)D==="all"&&I==="skip"&&(I=q);else{l.note(["Profiles:"," \u2022 Balanced: on-request approvals, workspace-write sandbox, web search on."," \u2022 Safe: on-failure approvals, read-only sandbox, web search off."," \u2022 YOLO: never approvals, danger-full-access, gpt-5.2, high reasoning."].join(`
32
+ `));let g=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 read-only \xB7 web search off"},{label:"YOLO",value:"yolo",hint:"never approvals \xB7 danger-full-access \xB7 gpt-5.2"},...D==="single"?[{label:"Skip (no profile changes)",value:"skip"}]:[]],initialValue:Ft(p)});if(l.isCancel(g))return l.cancel("Install aborted");I=g}if((D==="all"||I!=="skip")&&!h){let g=await l.select({message:D==="all"?"How should we write all profiles?":`How should we write profiles.${I}?`,options:[{label:"Overwrite (use codex-1up defaults)",value:"overwrite"},{label:"Add Merge (add missing, keep your default settings)",value:"add"}],initialValue:U});if(l.isCancel(g))return l.cancel("Install aborted");U=g}if(D==="single"&&I==="skip")re=!1;else{let g=await l.confirm({message:D==="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(g))return l.cancel("Install aborted");re=!!g}if(!k){let me=function(P){return[{label:"Skip (leave current setup)",value:"skip"},{label:"None (disable sounds)",value:"none"},...se.map(b=>({label:b,value:b})),{label:"Custom path\u2026",value:"custom"}]};var So=me;let g=A(de,"sounds"),se=[];try{se=(await te.readdir(g)).filter(P=>/\.(wav|mp3|ogg)$/i.test(P)).sort()}catch{}j="yes";let $=se.includes("noti_1.wav")?"noti_1.wav":se[0]||"none";async function he(P){let b=await l.text({message:"Enter absolute path to a .wav file",placeholder:P||"/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(b))return null;try{await te.access(String(b))}catch{return l.log.warn("File not found. Try again."),await he(String(b))}return String(b)}let H=await l.select({message:"Notification sound",options:me($),initialValue:$});if(l.isCancel(H))return l.cancel("Install aborted");if(H==="skip")j="no",L=void 0;else if(H==="custom"){let P=await he();if(P===null)return l.cancel("Install aborted");$=P}else $=H;if(H!=="skip"){for(;;){let P=await l.select({message:`Selected: ${$}. 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(P))return l.cancel("Install aborted");if(P==="use")break;if(P==="change"){let b=await l.select({message:"Notification sound",options:me($),initialValue:$});if(l.isCancel(b))return l.cancel("Install aborted");if(b==="custom"){let F=await he();if(F===null)return l.cancel("Install aborted");$=F}else if(b==="skip"){j="no",L=void 0;break}else $=b;continue}try{let b=$==="none"?"none":$.startsWith("/")?$:A(de,"sounds",$);await jt(b)}catch(b){l.log.warn(String(b))}}L===void 0&&(L=$)}}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).
33
33
 
34
34
  - Backups will be created
35
35
  - If you think codex works worse with this instructions, you can remove them from ~/.codex/AGENTS.md anytime.
@@ -37,17 +37,17 @@ ${n}`,"utf8"),e.logger.ok(`Appended template to ${t}`);break;default:e.options.s
37
37
 
38
38
  - Backups will be created
39
39
  - If you think codex works worse with this instructions, you can remove them from ~/.codex/AGENTS.md anytime.
40
- `);let g=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(g))return l.cancel("Install aborted");B=g}}f||(I==="skip"&&(re=!1),typeof _>"u"&&(_=i?"no":"yes"),typeof B>"u"&&(B="skip"));let Te={profile:I,profileScope:D,profileMode:U,setDefaultProfile:re,installCodexCli:Ne,installTools:ge,notify:_??(i?"no":"yes"),globalAgents:B??"skip",notificationSound:L,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(f){l.log.info("Installing prerequisites and writing config..."),l.log.warn("Some steps may require sudo password or confirmation prompts.");try{await ve(Te,de),l.log.success("Base install complete"),l.outro("Install finished")}catch(P){throw l.cancel(`Installation failed: ${P}`),P}await Je();return}try{await ve(Te,de),await Je()}catch(P){throw l.cancel(`Installation failed: ${P}`),P}}});async function Je(){let e=ee.homedir(),t=A(e,".codex","config.toml"),o,r=[];try{let p=await te.readFile(t,"utf8"),f=Pe.parse(p);o=f.profile;let w=f.profiles||{};r=Object.keys(w)}catch{}let n=["codex","ast-grep","fd","rg","fzf","jq","yq","difft","difftastic"],s=(await Promise.all(n.map(async p=>{try{return await V(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}${o?` (active profile: ${o})`:""}`),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(`
40
+ `);let g=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(g))return l.cancel("Install aborted");B=g}}d||(I==="skip"&&(re=!1),typeof j>"u"&&(j=i?"no":"yes"),typeof B>"u"&&(B="skip"));let xe={profile:I,profileScope:D,profileMode:U,setDefaultProfile:re,installCodexCli:Te,installTools:ge,notify:j??(i?"no":"yes"),globalAgents:B??"skip",notificationSound:L,mode:"manual",installNode:e["install-node"]||"nvm",shell:String(e.shell||"auto"),vscodeId:_?void 0:e.vscode?String(e.vscode):void 0,noVscode:_||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(d){l.log.info("Installing prerequisites and writing config..."),l.log.warn("Some steps may require sudo password or confirmation prompts.");try{await ve(xe,de),l.log.success("Base install complete"),l.outro("Install finished")}catch(R){throw l.cancel(`Installation failed: ${R}`),R}await Je();return}try{await ve(xe,de),await Je()}catch(R){throw l.cancel(`Installation failed: ${R}`),R}}});async function Je(){let e=ee.homedir(),t=A(e,".codex","config.toml"),o,r=[];try{let p=await te.readFile(t,"utf8"),d=Re.parse(p);o=d.profile;let y=d.profiles||{};r=Object.keys(y)}catch{}let n=["codex","ast-grep","fd","rg","fzf","jq","yq","difft","difftastic"],s=(await Promise.all(n.map(async p=>{try{return await V(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}${o?` (active profile: ${o})`:""}`),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(`
41
41
  `)+`
42
- `)}async function _t(e){if(e.endsWith("/none")||e==="none")return;let t=[async o=>{await V("afplay"),await Z`afplay ${o}`},async o=>{await V("paplay"),await Z`paplay ${o}`},async o=>{await V("aplay"),await Z`aplay ${o}`},async o=>{await V("mpg123"),await Z`mpg123 -q ${o}`},async o=>{await V("ffplay"),await Z`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 Se(e){try{return await te.access(e),!0}catch{return!1}}function jt(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|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 Ot(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==="yolo"}function Ft(e){return Re(e)?e:"balanced"}async function Wt(e){try{let t=await te.readFile(e,"utf8"),r=Pe.parse(t).profile;return typeof r=="string"?r:void 0}catch{return}}import{defineCommand as Mt}from"citty";import{promises as oe}from"fs";import{accessSync as Vt}from"fs";import{resolve as ne,dirname as Qe}from"path";import{fileURLToPath as zt}from"url";var Xe=Qe(zt(import.meta.url));function Ut(){let e=Xe;for(let t=0;t<6;t++){try{return Vt(ne(e,"templates","codex-config.toml")),e}catch{}e=ne(e,"..")}return ne(Xe,"..")}var Bt=Ut();async function Ee(e){try{return await oe.access(e),!0}catch{return!1}}async function Ht(e,t){if(await Ee(t)){let r=`${t}.backup.${new Date().toISOString().replace(/[:.]/g,"").replace("T","_").slice(0,15)}`;await oe.copyFile(t,r)}await oe.mkdir(Qe(t),{recursive:!0}),await oe.copyFile(e,t)}var Ze=Mt({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=ne(Bt,"templates/agent-templates","AGENTS-default.md"),n=await Ee(t).then(async i=>i&&(await oe.stat(t)).isDirectory()).catch(()=>!1)?ne(t,"AGENTS.md"):t;if(!await Ee(o))throw new Error(`Template not found: ${o}`);await Ht(o,n),process.stdout.write(`Wrote ${n}
43
- `)}});import{defineCommand as Kt}from"citty";import{$ as Jt}from"zx";import{fileURLToPath as Yt}from"url";import{accessSync as Xt}from"fs";import{dirname as Qt,resolve as fe}from"path";var et=Qt(Yt(import.meta.url));function Zt(){let e=et;for(let t=0;t<6;t++){try{return Xt(fe(e,"templates","codex-config.toml")),e}catch{}e=fe(e,"..")}return fe(et,"..")}var eo=Zt(),tt=Kt({meta:{name:"doctor",description:"Run environment checks"},async run(){await Jt`bash ${fe(eo,"scripts/doctor.sh")}`}});import{defineCommand as to}from"citty";import{$ as oo}from"zx";import{fileURLToPath as no}from"url";import{accessSync as io}from"fs";import{dirname as ro,resolve as ce}from"path";var ot=ro(no(import.meta.url));function so(){let e=ot;for(let t=0;t<6;t++){try{return io(ce(e,"templates","codex-config.toml")),e}catch{}e=ce(e,"..")}return ce(ot,"..")}var ao=so(),nt=to({meta:{name:"uninstall",description:"Clean up aliases and config created by this tool"},async run(){await oo`bash ${ce(ao,"scripts/uninstall.sh")}`}});import{defineCommand as ue}from"citty";import{promises as ie}from"fs";import{resolve as z,dirname as at}from"path";import{fileURLToPath as lo}from"url";import{accessSync as po}from"fs";import fo from"os";var it=at(lo(import.meta.url));function co(){let e=it;for(let t=0;t<6;t++){try{return po(z(e,"templates","codex-config.toml")),e}catch{}e=z(e,"..")}return z(it,"..")}var uo=co();function Ie(){let e=z(fo.homedir(),".codex"),t=z(e,"config.toml");return{CODEX_HOME:e,CFG:t}}async function xe(e){return ie.readFile(e,"utf8")}async function rt(e,t){await ie.mkdir(at(e),{recursive:!0}),await ie.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 go(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(`
42
+ `)}async function jt(e){if(e.endsWith("/none")||e==="none")return;let t=[async o=>{await V("afplay"),await Z`afplay ${o}`},async o=>{await V("paplay"),await Z`paplay ${o}`},async o=>{await V("aplay"),await Z`aplay ${o}`},async o=>{await V("mpg123"),await Z`mpg123 -q ${o}`},async o=>{await V("ffplay"),await Z`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 Se(e){try{return await te.access(e),!0}catch{return!1}}function _t(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|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 Ot(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 Gt(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 Pe(e){return e==="balanced"||e==="safe"||e==="yolo"}function Ft(e){return Pe(e)?e:"balanced"}async function Wt(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 Mt}from"citty";import{promises as oe}from"fs";import{accessSync as Vt}from"fs";import{resolve as ne,dirname as Qe}from"path";import{fileURLToPath as zt}from"url";var Xe=Qe(zt(import.meta.url));function Ut(){let e=Xe;for(let t=0;t<6;t++){try{return Vt(ne(e,"templates","codex-config.toml")),e}catch{}e=ne(e,"..")}return ne(Xe,"..")}var Bt=Ut();async function Ee(e){try{return await oe.access(e),!0}catch{return!1}}async function Ht(e,t){if(await Ee(t)){let r=`${t}.backup.${new Date().toISOString().replace(/[:.]/g,"").replace("T","_").slice(0,15)}`;await oe.copyFile(t,r)}await oe.mkdir(Qe(t),{recursive:!0}),await oe.copyFile(e,t)}var Ze=Mt({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=ne(Bt,"templates/agent-templates","AGENTS-default.md"),n=await Ee(t).then(async i=>i&&(await oe.stat(t)).isDirectory()).catch(()=>!1)?ne(t,"AGENTS.md"):t;if(!await Ee(o))throw new Error(`Template not found: ${o}`);await Ht(o,n),process.stdout.write(`Wrote ${n}
43
+ `)}});import{defineCommand as Kt}from"citty";import{$ as Jt}from"zx";import{fileURLToPath as Yt}from"url";import{accessSync as Xt}from"fs";import{dirname as Qt,resolve as fe}from"path";var et=Qt(Yt(import.meta.url));function Zt(){let e=et;for(let t=0;t<6;t++){try{return Xt(fe(e,"templates","codex-config.toml")),e}catch{}e=fe(e,"..")}return fe(et,"..")}var eo=Zt(),tt=Kt({meta:{name:"doctor",description:"Run environment checks"},async run(){await Jt`bash ${fe(eo,"scripts/doctor.sh")}`}});import{defineCommand as to}from"citty";import{$ as oo}from"zx";import{fileURLToPath as no}from"url";import{accessSync as io}from"fs";import{dirname as ro,resolve as ce}from"path";var ot=ro(no(import.meta.url));function so(){let e=ot;for(let t=0;t<6;t++){try{return io(ce(e,"templates","codex-config.toml")),e}catch{}e=ce(e,"..")}return ce(ot,"..")}var ao=so(),nt=to({meta:{name:"uninstall",description:"Clean up aliases and config created by this tool"},async run(){await oo`bash ${ce(ao,"scripts/uninstall.sh")}`}});import{defineCommand as ue}from"citty";import{promises as ie}from"fs";import{resolve as z,dirname as at}from"path";import{fileURLToPath as lo}from"url";import{accessSync as po}from"fs";import fo from"os";var it=at(lo(import.meta.url));function co(){let e=it;for(let t=0;t<6;t++){try{return po(z(e,"templates","codex-config.toml")),e}catch{}e=z(e,"..")}return z(it,"..")}var uo=co();function Ie(){let e=z(fo.homedir(),".codex"),t=z(e,"config.toml");return{CODEX_HOME:e,CFG:t}}async function Ne(e){return ie.readFile(e,"utf8")}async function rt(e,t){await ie.mkdir(at(e),{recursive:!0}),await ie.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 go(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(`
44
44
  `);return r===-1?o+`
45
45
  `+e:e.slice(0,r+1)+o+`
46
- `+e.slice(r+1)}var lt=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(uo,"templates/codex-config.toml"),o=await xe(t),{CFG:r}=Ie(),n=await ie.access(r).then(()=>!0).catch(()=>!1);if(n&&!e.force){process.stdout.write(`${r} exists. Use --force to overwrite.
46
+ `+e.slice(r+1)}var lt=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(uo,"templates/codex-config.toml"),o=await Ne(t),{CFG:r}=Ie(),n=await ie.access(r).then(()=>!0).catch(()=>!1);if(n&&!e.force){process.stdout.write(`${r} exists. Use --force to overwrite.
47
47
  `);return}if(n){let i=`${r}.backup.${Date.now()}`;await ie.copyFile(r,i),process.stdout.write(`Backed up to ${i}
48
48
  `)}await rt(r,o),process.stdout.write(`Wrote ${r}
49
- `)}}),profiles:ue({meta:{name:"profiles",description:"List profiles in the current config"},async run(){let{CFG:e}=Ie(),t=await xe(e),o=st(t);process.stdout.write(o.length?o.join(`
49
+ `)}}),profiles:ue({meta:{name:"profiles",description:"List profiles in the current config"},async run(){let{CFG:e}=Ie(),t=await Ne(e),o=st(t);process.stdout.write(o.length?o.join(`
50
50
  `)+`
51
51
  `:`No profiles found
52
- `)}}),"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(),o=await xe(t),r=st(o),n=String(e.name);if(!r.includes(n))throw new Error(`Unknown profile: ${n}`);let i=go(o,n);await rt(t,i),process.stdout.write(`profile set to ${n}
52
+ `)}}),"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(),o=await Ne(t),r=st(o),n=String(e.name);if(!r.includes(n))throw new Error(`Unknown profile: ${n}`);let i=go(o,n);await rt(t,i),process.stdout.write(`profile set to ${n}
53
53
  `)}})}});var ko=wo(yo(import.meta.url)),$o=JSON.parse(ho(bo(ko,"../package.json"),"utf-8")),pt=mo({meta:{name:"codex-1up",version:$o.version,description:"Power up Codex CLI with clean profiles config and helpers"},subCommands:{install:Ye,agents:Ze,doctor:tt,uninstall:nt,config:lt}});Co(pt);
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.3",
5
+ "version": "0.3.4",
6
6
  "description": "TypeScript CLI for codex-1up (citty-based)",
7
7
  "bin": {
8
8
  "codex-1up": "bin/codex-1up.mjs"
@@ -1,3 +1,4 @@
1
+ // @ts-nocheck
1
2
  import { execSync } from "node:child_process";
2
3
  import fs from "node:fs";
3
4
  import path from "node:path";
@@ -163,7 +164,7 @@ async function publishPackages(
163
164
  if (repoSlug) {
164
165
  readme = readme.replace(
165
166
  /\]\(\.\/public\//g,
166
- `] (https://raw.githubusercontent.com/${repoSlug}/main/public/`.replace(" ] ", "]"),
167
+ `](https://raw.githubusercontent.com/${repoSlug}/main/public/`,
167
168
  );
168
169
  }
169
170
  fs.writeFileSync(path.join(pkgPath, "README.md"), readme);
@@ -2,7 +2,7 @@
2
2
  # Adjust to your liking. See Codex CLI docs for full options.
3
3
 
4
4
  # Core (root defaults)
5
- model = "gpt-5.1-codex"
5
+ model = "gpt-5.2"
6
6
  approval_policy = "on-request" # untrusted|on-failure|on-request|never
7
7
  sandbox_mode = "workspace-write" # read-only|workspace-write|danger-full-access
8
8
  profile = "balanced" # active profile: balanced|safe|yolo
@@ -40,7 +40,7 @@ enable_experimental_windows_sandbox = false
40
40
  [profiles.balanced]
41
41
  approval_policy = "on-request"
42
42
  sandbox_mode = "workspace-write"
43
- model = "gpt-5.1-codex"
43
+ model = "gpt-5.2"
44
44
  model_reasoning_effort = "medium"
45
45
  model_reasoning_summary = "concise"
46
46
  [profiles.balanced.features]
@@ -49,7 +49,7 @@ web_search_request = true
49
49
  [profiles.safe]
50
50
  approval_policy = "on-failure"
51
51
  sandbox_mode = "read-only"
52
- model = "gpt-5.1-codex"
52
+ model = "gpt-5.2"
53
53
  model_reasoning_effort = "medium"
54
54
  model_reasoning_summary = "concise"
55
55
  [profiles.safe.features]
@@ -58,10 +58,8 @@ web_search_request = false
58
58
  [profiles.yolo]
59
59
  approval_policy = "never"
60
60
  sandbox_mode = "danger-full-access"
61
- model = "gpt-5.1-codex-max"
61
+ model = "gpt-5.2"
62
62
  model_reasoning_effort = "high"
63
63
  model_reasoning_summary = "detailed"
64
- tool_output_token_limit = 25000
65
- model_auto_compact_token_limit = 233000 # 273k - (25k tool_output + 15k buffer)
66
64
  [profiles.yolo.features]
67
65
  web_search_request = true