codex-1up 0.3.18 → 0.3.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +61 -60
- package/package.json +1 -1
- package/templates/codex-config.toml +15 -11
package/dist/main.js
CHANGED
|
@@ -1,66 +1,67 @@
|
|
|
1
|
-
import{runMain as
|
|
1
|
+
import{runMain as Si}from"citty";import{defineCommand as vi}from"citty";import{defineCommand as Bo}from"citty";import{resolve as Pt}from"path";import{promises as hn}from"fs";import*as rt from"os";import*as wn from"toml";import*as B from"@clack/prompts";import Co from"os";import{resolve as $o}from"path";import{promises as xo}from"fs";import*as rn from"toml";import Zt from"fs-extra";import*as wt from"path";import*as tn from"os";import{createWriteStream as Rn}from"fs";function Ge(e){let t=null;t=Rn(e,{flags:"a",mode:384}),t.on("error",()=>{t=null});let n=(o,i)=>{let s=o?`${o} ${i}
|
|
2
2
|
`:`${i}
|
|
3
|
-
`;process.stdout.write(s),t&&t.write(s)};return{log:o=>n("",o),info:o=>n("",o),ok:o=>n("\u2714",o),warn:o=>n("\u26A0",o),err:o=>n("\u2716",o)}}import{$ as de}from"zx";import{which as Tn,$ as Pn}from"zx";import{spawn as En}from"child_process";async function v(e){try{return await Tn(e),!0}catch{return!1}}function Et(){return process.platform==="darwin"}async function Rt(){return await v("brew")?"brew":await v("apt-get")?"apt":await v("dnf")?"dnf":await v("pacman")?"pacman":await v("zypper")?"zypper":"none"}function be(e){return process.platform==="win32"?{cmd:e,argsPrefix:[]}:typeof process.getuid=="function"&&process.getuid()===0?{cmd:e,argsPrefix:[]}:{cmd:"sudo",argsPrefix:[e]}}async function Nt(e){if(await v("pnpm"))try{let n=(await Pn`pnpm bin -g`.quiet()).stdout.trim();return n?{pm:"pnpm",binDir:n}:(e?.warn('Detected pnpm but global bin dir is not configured; skipping global Node installs to avoid duplicates. Run "pnpm setup" then re-run.'),{pm:"none",reason:"pnpm-misconfigured"})}catch{return e?.warn('Detected pnpm but global bin dir is not configured; skipping global Node installs to avoid duplicates. Run "pnpm setup" then re-run.'),{pm:"none",reason:"pnpm-error"}}return await v("npm")?{pm:"npm",reason:"npm-default"}:{pm:"none",reason:"not-found"}}async function A(e,t,n={dryRun:!1}){if(n.dryRun){let i=[e,...t].map(s=>s.includes(" ")?`"${s}"`:s).join(" ");n.logger?.log(`[dry-run] ${i}`);return}let o=En(e,t,{stdio:"inherit",cwd:n.cwd||process.cwd(),shell:!1});await new Promise((i,s)=>{o.on("error",s),o.on("exit",l=>{if(l===0)return i();s(new Error(`Command failed (${l}): ${e} ${t.join(" ")}`))})})}function M(e){let t=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);return`${e}.backup.${t}`}import _t from"fs-extra";import*as De from"path";import*as ke from"os";import*as ce from"@clack/prompts";async function Lt(e){let t=await v("node"),n=await v("npm");if(t&&n){let i=(await de`node -v`).stdout.trim();e.logger.ok(`Node.js present (${i})`);return}switch(e.options.installNode){case"nvm":await Rn(e);break;case"brew":await Nn(e);break;case"skip":e.logger.warn("Skipping Node installation; please install Node 18+ manually");return}if(await v("node")){let i=(await de`node -v`).stdout.trim();e.logger.ok(`Node.js installed (${i})`)}else throw e.logger.err("Node installation failed"),new Error("Node.js installation failed")}async function Rn(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=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes,n=De.join(e.homeDir,".nvm");if(!await _t.pathExists(n)){if(t){let i=await ce.confirm({message:"This will download and run the nvm installer script (from GitHub) and then install Node LTS. Continue?",initialValue:!0});if(ce.isCancel(i)||!i)throw new Error("Node installation aborted by user")}e.logger.info("Installing nvm..."),await de`bash -c "curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash"`}let o=`export NVM_DIR="${n}" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" && nvm install --lts`;await de`bash -c ${o}`}async function Nn(e){e.logger.info("Installing Node.js via Homebrew");let t=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes;if(!await v("brew"))if(ke.platform()==="darwin"){if(e.logger.info("Homebrew not found; installing Homebrew"),e.options.dryRun){e.logger.log("[dry-run] install Homebrew");return}if(t){let o=await ce.confirm({message:"This will download and run the official Homebrew installer script (from GitHub). Continue?",initialValue:!0});if(ce.isCancel(o)||!o)throw new Error("Homebrew installation aborted by user")}await de`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`;let n=ke.platform()==="darwin"&&ke.arch()==="arm64"?"/opt/homebrew/bin/brew":"/usr/local/bin/brew";if(await _t.pathExists(n)){let o=De.dirname(n);process.env.PATH=`${o}:${process.env.PATH||""}`;try{let s=(await de`${n} shellenv`).stdout.trim().match(/export PATH="([^"]+)"/);s&&(process.env.PATH=`${s[1]}:${process.env.PATH||""}`)}catch(i){}}}else throw new Error("Homebrew is only available on macOS");await A("brew",["install","node"],{dryRun:e.options.dryRun,logger:e.logger})}import*as fe from"@clack/prompts";import{$ as at}from"zx";var lt="@openai/codex";async function Fe(e){let t=await Ln(),n=await _n(e),o=!!(t.found&&t.version&&n&&t.version!==n);return{found:t.found,version:t.version,latest:n,updateAvailable:o}}async function _n(e){try{let n=(await at`npm view ${lt} version`.quiet()).stdout.trim();if(!n){e?.warn("Could not fetch latest Codex CLI version; skipping upgrade check");return}return n}catch(t){e?.warn(`Error checking latest Codex CLI version: ${t}`);return}}async function Ln(){if(!await v("codex"))return{found:!1};let t="";try{let n=await at`codex --version`.quiet().nothrow();t=jn(n.stdout||"")}catch(n){}if(!t)try{let n=await at`npm ls -g ${lt} --depth=0 --json`.quiet().nothrow();t=JSON.parse(n.stdout||"{}").dependencies?.[lt]?.version||""}catch(n){}return{found:!0,version:t||void 0}}function jn(e){let t=e.match(/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/);return t?t[1]:""}import*as Me from"@clack/prompts";async function We(e){let t=await Nt(e.logger);if(t.pm==="pnpm")return"pnpm";if(t.pm==="npm")return"npm";if(t.pm==="none"&&t.reason?.startsWith("pnpm-")){if(e.interactive){let n=await Me.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)'}]});return Me.isCancel(n)||n==="skip"?(e.logger?.warn('Skipping global Node installs; pnpm is misconfigured. Run "pnpm setup" then re-run.'),"none"):(e.logger?.info("pnpm misconfigured; falling back to npm for global installs."),"npm")}return 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.'),"npm"}return"none"}var jt="@openai/codex";async function Ot(e){if(e.options.installCodexCli==="no"){e.logger.info("Skipping Codex CLI install (user choice)");return}let t=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes,n=await Fe(e.logger);if(n.found){let a=n.version?`v${n.version}`:"unknown version";e.logger.info(`Found Codex CLI ${a}. Checking for newer version...`)}else e.logger.info("Codex CLI not found.");let o=!1,i=!1;if(n.found)if(n.updateAvailable){let a=n.latest?`v${n.latest}`:"a newer version";if(e.options.installCodexCli==="yes")i=!0;else if(t){let r=await fe.confirm({message:`Codex CLI ${n.version} found; latest is ${a}. Update now?`,initialValue:!0});fe.isCancel(r)?e.logger.info("Codex CLI update cancelled; keeping existing version."):r?i=!0:e.logger.info("Keeping existing Codex CLI version as requested.")}else i=!0}else n.found&&(n.latest&&n.version?e.logger.ok(`Codex CLI up-to-date (${n.version})`):e.logger.ok("Codex CLI found; unable to verify latest version."));else if(e.options.installCodexCli==="yes")o=!0;else if(t){let a=await fe.confirm({message:"Codex CLI not found. Install now?",initialValue:!0});fe.isCancel(a)?e.logger.info("Codex CLI install cancelled."):a?o=!0:e.logger.info("Skipping Codex CLI install.")}else o=!0;let s=[];if((o||i)&&(n.latest?s.push(`${jt}@${n.latest}`):s.push(jt)),s.length===0)return;let l=await We({logger:e.logger,interactive:process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes});l==="none"?e.logger.warn("Skipping global Node installs because no supported package manager was found."):l==="pnpm"?(e.logger.info("Installing/updating Codex CLI via pnpm"),await A("pnpm",["add","-g",...s],{dryRun:e.options.dryRun,logger:e.logger})):(e.logger.info("Installing/updating Codex CLI via npm"),await A("npm",["install","-g",...s],{dryRun:e.options.dryRun,logger:e.logger})),await v("codex")?e.logger.ok("Codex CLI installed"):e.logger.err("Codex CLI not found after install")}var Dt=[{id:"rg",label:"rg",bins:["rg"],packages:{brew:["ripgrep"],apt:["ripgrep"],dnf:["ripgrep"],pacman:["ripgrep"],zypper:["ripgrep"]}},{id:"fd",label:"fd",bins:["fd","fdfind"],packages:{brew:["fd"],apt:["fd-find"],dnf:["fd-find"],pacman:["fd"],zypper:["fd"]}},{id:"fzf",label:"fzf",bins:["fzf"],packages:{brew:["fzf"],apt:["fzf"],dnf:["fzf"],pacman:["fzf"],zypper:["fzf"]}},{id:"jq",label:"jq",bins:["jq"],packages:{brew:["jq"],apt:["jq"],dnf:["jq"],pacman:["jq"],zypper:["jq"]}},{id:"yq",label:"yq",bins:["yq"],packages:{brew:["yq"],apt:["yq"],dnf:["yq"],pacman:["yq"],zypper:["yq"]}},{id:"ast-grep",label:"ast-grep",bins:["ast-grep","sg"],packages:{brew:["ast-grep"],apt:["ast-grep"],dnf:["ast-grep"],pacman:["ast-grep"],zypper:["ast-grep"]}},{id:"bat",label:"bat",bins:["bat","batcat"],packages:{brew:["bat"],apt:["bat"],dnf:["bat"],pacman:["bat"],zypper:["bat"]}},{id:"git",label:"git",bins:["git"],packages:{brew:["git"],apt:["git"],dnf:["git"],pacman:["git"],zypper:["git"]}},{id:"git-delta",label:"git-delta",bins:["delta"],packages:{brew:["git-delta"],apt:["git-delta"],dnf:["git-delta"],pacman:["git-delta"],zypper:["git-delta"]}},{id:"gh",label:"gh",bins:["gh"],packages:{brew:["gh"],apt:["gh"],dnf:["gh"],pacman:["github-cli"],zypper:["gh"]}}],On=new Set(Dt.map(e=>e.id));function Ft(e){return On.has(e)}function ue(){return Dt}import*as dt from"path";import pt from"fs-extra";import{which as Dn}from"zx";async function Ge(e){if(e.options.installTools==="skip"){e.logger.info("Skipping developer tool installs (user choice)");return}let t=Fn(e.options.installTools,e.options.toolsSelected);if(t.length===0){e.logger.info("Skipping developer tool installs (no tools selected)");return}if(Et()&&!await v("brew")){e.logger.err(["Homebrew is required on macOS to install developer tools automatically, but `brew` was not found.","Please install Homebrew first, then re-run this command:","",'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"',"","More info: https://brew.sh/"].join(`
|
|
4
|
-
|
|
5
|
-
`))}
|
|
6
|
-
`);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
`),
|
|
3
|
+
`;process.stdout.write(s),t&&t.write(s)};return{log:o=>n("",o),info:o=>n("",o),ok:o=>n("\u2714",o),warn:o=>n("\u26A0",o),err:o=>n("\u2716",o)}}import{$ as fe}from"zx";import{which as Nn,$ as _n}from"zx";import{spawn as _t}from"child_process";async function b(e){try{return await Nn(e),!0}catch{return!1}}function Lt(){return process.platform==="darwin"}async function Ot(){return await b("brew")?"brew":await b("apt-get")?"apt":await b("dnf")?"dnf":await b("pacman")?"pacman":await b("zypper")?"zypper":"none"}function Se(e){return process.platform==="win32"?{cmd:e,argsPrefix:[]}:typeof process.getuid=="function"&&process.getuid()===0?{cmd:e,argsPrefix:[]}:{cmd:"sudo",argsPrefix:[e]}}async function jt(e){if(await b("pnpm"))try{let n=(await _n`pnpm bin -g`.quiet()).stdout.trim();return n?{pm:"pnpm",binDir:n}:(e?.warn('Detected pnpm but global bin dir is not configured; skipping global Node installs to avoid duplicates. Run "pnpm setup" then re-run.'),{pm:"none",reason:"pnpm-misconfigured"})}catch{return e?.warn('Detected pnpm but global bin dir is not configured; skipping global Node installs to avoid duplicates. Run "pnpm setup" then re-run.'),{pm:"none",reason:"pnpm-error"}}return await b("npm")?{pm:"npm",reason:"npm-default"}:{pm:"none",reason:"not-found"}}async function x(e,t,n={dryRun:!1}){if(n.dryRun){let i=[e,...t].map(s=>s.includes(" ")?`"${s}"`:s).join(" ");n.logger?.log(`[dry-run] ${i}`);return}let o=_t(e,t,{stdio:"inherit",cwd:n.cwd||process.cwd(),shell:!1});await new Promise((i,s)=>{o.on("error",s),o.on("exit",l=>{if(l===0)return i();s(new Error(`Command failed (${l}): ${e} ${t.join(" ")}`))})})}async function Ce(e,t,n={}){let o=_t(e,t,{stdio:["ignore","pipe","pipe"],cwd:n.cwd||process.cwd(),shell:!1}),i="",s="",l=!1;o.stdout?.setEncoding("utf8"),o.stderr?.setEncoding("utf8"),o.stdout?.on("data",r=>{i+=String(r)}),o.stderr?.on("data",r=>{s+=String(r)});let a;return n.timeoutMs&&n.timeoutMs>0&&(a=setTimeout(()=>{l=!0;try{o.kill(),setTimeout(()=>{try{o.kill("SIGKILL")}catch{}},250).unref?.()}catch{}},n.timeoutMs),a.unref?.()),await new Promise(r=>{o.on("error",c=>{a&&clearTimeout(a),r({code:null,stdout:i,stderr:`${s}${s?`
|
|
4
|
+
`:""}${String(c)}`,timedOut:l})}),o.on("close",c=>{a&&clearTimeout(a),r({code:c,stdout:i,stderr:s,timedOut:l})})})}function M(e){let t=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);return`${e}.backup.${t}`}import Dt from"fs-extra";import*as Ue from"path";import*as $e from"os";import*as me from"@clack/prompts";async function Ft(e){let t=await b("node"),n=await b("npm");if(t&&n){let i=(await fe`node -v`).stdout.trim();e.logger.ok(`Node.js present (${i})`);return}switch(e.options.installNode){case"nvm":await Ln(e);break;case"brew":await On(e);break;case"skip":e.logger.warn("Skipping Node installation; please install Node 18+ manually");return}if(await b("node")){let i=(await fe`node -v`).stdout.trim();e.logger.ok(`Node.js installed (${i})`)}else throw e.logger.err("Node installation failed"),new Error("Node.js installation failed")}async function Ln(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=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes,n=Ue.join(e.homeDir,".nvm");if(!await Dt.pathExists(n)){if(t){let i=await me.confirm({message:"This will download and run the nvm installer script (from GitHub) and then install Node LTS. Continue?",initialValue:!0});if(me.isCancel(i)||!i)throw new Error("Node installation aborted by user")}e.logger.info("Installing nvm..."),await fe`bash -c "curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash"`}let o=`export NVM_DIR="${n}" && [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" && nvm install --lts`;await fe`bash -c ${o}`}async function On(e){e.logger.info("Installing Node.js via Homebrew");let t=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes;if(!await b("brew"))if($e.platform()==="darwin"){if(e.logger.info("Homebrew not found; installing Homebrew"),e.options.dryRun){e.logger.log("[dry-run] install Homebrew");return}if(t){let o=await me.confirm({message:"This will download and run the official Homebrew installer script (from GitHub). Continue?",initialValue:!0});if(me.isCancel(o)||!o)throw new Error("Homebrew installation aborted by user")}await fe`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`;let n=$e.platform()==="darwin"&&$e.arch()==="arm64"?"/opt/homebrew/bin/brew":"/usr/local/bin/brew";if(await Dt.pathExists(n)){let o=Ue.dirname(n);process.env.PATH=`${o}:${process.env.PATH||""}`;try{let s=(await fe`${n} shellenv`).stdout.trim().match(/export PATH="([^"]+)"/);s&&(process.env.PATH=`${s[1]}:${process.env.PATH||""}`)}catch(i){}}}else throw new Error("Homebrew is only available on macOS");await x("brew",["install","node"],{dryRun:e.options.dryRun,logger:e.logger})}import*as ge from"@clack/prompts";var dt="@openai/codex",jn=2e3,Dn=1200,Fn=2e3;async function Ve(e){let t=await ut(),n=await Mn(e),o=!!(t.found&&t.version&&n&&t.version!==n);return{found:t.found,version:t.version,latest:n,updateAvailable:o}}async function Mn(e){try{let t=await Gn(`https://registry.npmjs.org/${encodeURIComponent(dt)}/latest`,jn),n=String(t?.version||"").trim();if(!n){e?.warn("Could not fetch latest Codex CLI version; skipping upgrade check");return}return n}catch(t){e?.warn(`Error checking latest Codex CLI version: ${t}`);return}}async function ut(){if(!await b("codex"))return{found:!1};let t="";try{let n=await Ce("codex",["--version"],{timeoutMs:Dn});n.timedOut||(t=Wn(n.stdout||""))}catch(n){}if(!t)try{if(!await b("npm"))return{found:!0,version:void 0};let n=await Ce("npm",["ls","-g",dt,"--depth=0","--json"],{timeoutMs:Fn});if(n.timedOut)return{found:!0,version:void 0};t=JSON.parse(n.stdout||"{}").dependencies?.[dt]?.version||""}catch(n){}return{found:!0,version:t||void 0}}function Wn(e){let t=e.match(/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/);return t?t[1]:""}async function Gn(e,t){let n=new AbortController,o=setTimeout(()=>n.abort(),t);o.unref?.();try{let i=await fetch(e,{signal:n.signal});return i.ok?await i.json():void 0}catch{return}finally{clearTimeout(o)}}import*as Be from"@clack/prompts";async function Ke(e){let t=await jt(e.logger);if(t.pm==="pnpm")return"pnpm";if(t.pm==="npm")return"npm";if(t.pm==="none"&&t.reason?.startsWith("pnpm-")){if(e.interactive){let n=await Be.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)'}]});return Be.isCancel(n)||n==="skip"?(e.logger?.warn('Skipping global Node installs; pnpm is misconfigured. Run "pnpm setup" then re-run.'),"none"):(e.logger?.info("pnpm misconfigured; falling back to npm for global installs."),"npm")}return 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.'),"npm"}return"none"}var Mt="@openai/codex";async function Wt(e){if(e.options.installCodexCli==="no"){e.logger.info("Skipping Codex CLI install (user choice)");return}let t=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes,n=await Ve(e.logger);if(n.found){let a=n.version?`v${n.version}`:"unknown version";e.logger.info(`Found Codex CLI ${a}. Checking for newer version...`)}else e.logger.info("Codex CLI not found.");let o=!1,i=!1;if(n.found)if(n.updateAvailable){let a=n.latest?`v${n.latest}`:"a newer version";if(e.options.installCodexCli==="yes")i=!0;else if(t){let r=await ge.confirm({message:`Codex CLI ${n.version} found; latest is ${a}. Update now?`,initialValue:!0});ge.isCancel(r)?e.logger.info("Codex CLI update cancelled; keeping existing version."):r?i=!0:e.logger.info("Keeping existing Codex CLI version as requested.")}else i=!0}else n.found&&(n.latest&&n.version?e.logger.ok(`Codex CLI up-to-date (${n.version})`):e.logger.ok("Codex CLI found; unable to verify latest version."));else if(e.options.installCodexCli==="yes")o=!0;else if(t){let a=await ge.confirm({message:"Codex CLI not found. Install now?",initialValue:!0});ge.isCancel(a)?e.logger.info("Codex CLI install cancelled."):a?o=!0:e.logger.info("Skipping Codex CLI install.")}else o=!0;let s=[];if((o||i)&&(n.latest?s.push(`${Mt}@${n.latest}`):s.push(Mt)),s.length===0)return;let l=await Ke({logger:e.logger,interactive:process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes});l==="none"?e.logger.warn("Skipping global Node installs because no supported package manager was found."):l==="pnpm"?(e.logger.info("Installing/updating Codex CLI via pnpm"),await x("pnpm",["add","-g",...s],{dryRun:e.options.dryRun,logger:e.logger})):(e.logger.info("Installing/updating Codex CLI via npm"),await x("npm",["install","-g",...s],{dryRun:e.options.dryRun,logger:e.logger})),await b("codex")?e.logger.ok("Codex CLI installed"):e.logger.err("Codex CLI not found after install")}var Gt=[{id:"rg",label:"rg",bins:["rg"],packages:{brew:["ripgrep"],apt:["ripgrep"],dnf:["ripgrep"],pacman:["ripgrep"],zypper:["ripgrep"]}},{id:"fd",label:"fd",bins:["fd","fdfind"],packages:{brew:["fd"],apt:["fd-find"],dnf:["fd-find"],pacman:["fd"],zypper:["fd"]}},{id:"fzf",label:"fzf",bins:["fzf"],packages:{brew:["fzf"],apt:["fzf"],dnf:["fzf"],pacman:["fzf"],zypper:["fzf"]}},{id:"jq",label:"jq",bins:["jq"],packages:{brew:["jq"],apt:["jq"],dnf:["jq"],pacman:["jq"],zypper:["jq"]}},{id:"yq",label:"yq",bins:["yq"],packages:{brew:["yq"],apt:["yq"],dnf:["yq"],pacman:["yq"],zypper:["yq"]}},{id:"ast-grep",label:"ast-grep",bins:["ast-grep","sg"],packages:{brew:["ast-grep"],apt:["ast-grep"],dnf:["ast-grep"],pacman:["ast-grep"],zypper:["ast-grep"]}},{id:"bat",label:"bat",bins:["bat","batcat"],packages:{brew:["bat"],apt:["bat"],dnf:["bat"],pacman:["bat"],zypper:["bat"]}},{id:"git",label:"git",bins:["git"],packages:{brew:["git"],apt:["git"],dnf:["git"],pacman:["git"],zypper:["git"]}},{id:"git-delta",label:"git-delta",bins:["delta"],packages:{brew:["git-delta"],apt:["git-delta"],dnf:["git-delta"],pacman:["git-delta"],zypper:["git-delta"]}},{id:"gh",label:"gh",bins:["gh"],packages:{brew:["gh"],apt:["gh"],dnf:["gh"],pacman:["github-cli"],zypper:["gh"]}}],Un=new Set(Gt.map(e=>e.id));function Ut(e){return Un.has(e)}function he(){return Gt}import*as mt from"path";import ft from"fs-extra";import{which as Vn}from"zx";async function ze(e){if(e.options.installTools==="skip"){e.logger.info("Skipping developer tool installs (user choice)");return}let t=Bn(e.options.installTools,e.options.toolsSelected);if(t.length===0){e.logger.info("Skipping developer tool installs (no tools selected)");return}if(Lt()&&!await b("brew")){e.logger.err(["Homebrew is required on macOS to install developer tools automatically, but `brew` was not found.","Please install Homebrew first, then re-run this command:","",'/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"',"","More info: https://brew.sh/"].join(`
|
|
5
|
+
`));return}let n=t.includes("gh")&&!await b("gh"),o=await Ot();if(e.logger.info(`Detected package manager: ${o}`),o==="none"){e.logger.warn("Could not detect a supported package manager; please install tools manually");return}let i=he().filter(l=>t.includes(l.id)),s=Kn(i,o);if(s.length>0)switch(o!=="brew"&&(typeof process.getuid=="function"&&process.getuid()===0||e.logger.warn("Package installation may require sudo password. Please enter it when prompted.")),o){case"brew":await x("brew",["update"],{dryRun:e.options.dryRun,logger:e.logger}),await x("brew",["install",...s],{dryRun:e.options.dryRun,logger:e.logger});break;case"apt":{t.includes("gh")&&!await b("gh")&&await Hn(e);let{cmd:l,argsPrefix:a}=Se("apt-get");e.logger.info("Running apt-get update...");try{await x(l,[...a,"update","-y"],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn(`apt-get update failed; install tools manually: ${s.join(", ")}`);break}for(let r of s)try{await x(l,[...a,"install","-y",r],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn(`apt-get install failed for ${r}; install manually if needed.`)}}break;case"dnf":{let{cmd:l,argsPrefix:a}=Se("dnf");await x(l,[...a,"install","-y",...s],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"pacman":{let{cmd:l,argsPrefix:a}=Se("pacman");await x(l,[...a,"-Sy","--noconfirm",...s],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"zypper":{let{cmd:l,argsPrefix:a}=Se("zypper");await x(l,[...a,"refresh"],{dryRun:e.options.dryRun,logger:e.logger}),await x(l,[...a,"install","-y",...s],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break}t.includes("fd")&&await Vt(e,"fdfind","fd"),t.includes("bat")&&await Vt(e,"batcat","bat"),await zn(e,i),n&&!e.options.dryRun&&e.logger.info(["GitHub CLI (gh) was not detected before installation.","You should likely do the following in a new terminal:","git --version && gh --version",'git config --global user.name "Your Name"','git config --global user.email "you@example.com"',"git config --global init.defaultBranch main","gh auth login"].join(`
|
|
6
|
+
`))}function Bn(e,t){return e==="all"?he().map(n=>n.id):e==="select"?t?[...t]:[]:[]}function Kn(e,t){let n=[];for(let o of e){let i=o.packages[t]||[];for(let s of i)n.includes(s)||n.push(s)}return n}async function Vt(e,t,n){if(!await b(t)||await b(n))return;let o=mt.join(e.homeDir,".local","bin");await ft.ensureDir(o);let i=mt.join(o,n);if(await ft.pathExists(i))return;let s=t;try{s=await Vn(t)}catch(l){}if(e.options.dryRun){e.logger.log(`[dry-run] ln -s ${s} ${i}`);return}await ft.symlink(s,i),e.logger.ok(`${n} alias created at ~/.local/bin/${n}`)}async function zn(e,t){for(let n of t)await qn(n)?e.logger.ok(`${n.id} \u2713`):e.logger.warn(`${n.id} not detected after install`)}async function qn(e){for(let t of e.bins)if(await b(t))return!0;return!1}async function Hn(e){let t=["set -euo pipefail","if [ -f /etc/apt/sources.list.d/github-cli.list ]; then exit 0; fi",'SUDO=""','if [ "$(id -u)" -ne 0 ]; then SUDO="sudo"; fi',"$SUDO mkdir -p -m 755 /etc/apt/keyrings","if command -v curl >/dev/null 2>&1; then"," curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | $SUDO tee /etc/apt/keyrings/githubcli-archive-keyring.gpg >/dev/null","elif command -v wget >/dev/null 2>&1; then"," wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | $SUDO tee /etc/apt/keyrings/githubcli-archive-keyring.gpg >/dev/null","else",' echo "Missing curl/wget; cannot set up GitHub CLI apt repo automatically." 1>&2'," exit 0","fi","$SUDO chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg",'ARCH="$(dpkg --print-architecture)"','echo "deb [arch=${ARCH} signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | $SUDO tee /etc/apt/sources.list.d/github-cli.list >/dev/null'].join(`
|
|
7
|
+
`);try{await x("bash",["-lc",t],{dryRun:e.options.dryRun,logger:e.logger})}catch{e.logger.warn("Failed to set up GitHub CLI apt repo; will still try apt-get install gh (may fail).")}}import xe from"fs-extra";import*as Je from"path";var He={balanced:{root:[["approval_policy",'"on-request"'],["sandbox_mode",'"workspace-write"'],["model",'"gpt-5.2-codex"'],["model_reasoning_effort",'"medium"'],["model_reasoning_summary",'"detailed"'],["web_search",'"cached"']],features:[]},safe:{root:[["approval_policy",'"on-failure"'],["sandbox_mode",'"read-only"'],["model",'"gpt-5.2-codex"'],["model_reasoning_effort",'"medium"'],["model_reasoning_summary",'"detailed"'],["web_search",'"disabled"']],features:[]},yolo:{root:[["approval_policy",'"never"'],["sandbox_mode",'"danger-full-access"'],["model",'"gpt-5.2-codex"'],["model_reasoning_effort",'"high"'],["model_reasoning_summary",'"detailed"'],["web_search",'"live"']],features:[]}},Yn=`# ~/.codex/config.toml \u2014 managed by codex-1up (patch mode)
|
|
8
|
+
`;async function zt(e){let t=Je.join(e.homeDir,".codex","config.toml");await xe.ensureDir(Je.dirname(t));let n=await xe.pathExists(t),o=n?await xe.readFile(t,"utf8"):Yn,i=co(o),s=po(i.toml),l=uo(s.toml),a=new gt(l.toml),r=i.changed||s.changed||l.changed;if(r=Jn(a,e.options.profileScope,e.options.profile,e.options.profileMode,e.options.profilesSelected)||r,r=Xn(a,e.options.profile,e.options.setDefaultProfile)||r,r=Qn(a,e.options.notificationSound)||r,r=Zn(a,e)||r,r=eo(a,e)||r,r=to(a,e)||r,r=no(a,e)||r,r=oo(a,e)||r,r=io(a,e)||r,r=ao(a)||r,!r){e.logger.info("Config already up to date; no changes needed.");return}let c=a.content();if(e.options.dryRun){e.logger.log(`[dry-run] write ${t}`),e.logger.log("[dry-run] config content omitted"),e.logger.log(`[dry-run] would write ${c.length} bytes`);return}if(n){let d=M(t);await xe.copy(t,d),e.logger.info(`Backed up current config to ${d}`)}await xe.writeFile(t,c,"utf8"),e.logger.ok("Updated ~/.codex/config.toml with requested settings.")}function Jn(e,t,n,o,i){let s=[];if(t==="all")s=Object.keys(He);else if(t==="selected")s=i||[];else{if(n==="skip")return!1;s=[n]}if(s.length===0)return!1;let l=!1;for(let a of s){let r=He[a];if(o==="overwrite"){l=e.replaceTable(`profiles.${a}`,r.root)||l,r.features.length>0&&(l=e.replaceTable(`profiles.${a}.features`,r.features)||l);for(let[c,d]of Object.entries(r.tables||{}))l=e.replaceTable(`profiles.${a}.${c}`,d)||l}else{e.ensureTable(`profiles.${a}`);for(let[c,d]of r.root)l=e.setKey(`profiles.${a}`,c,d,{mode:"if-missing"})||l;if(r.features.length>0){e.ensureTable(`profiles.${a}.features`);for(let[c,d]of r.features)l=e.setKey(`profiles.${a}.features`,c,d,{mode:"if-missing"})||l}for(let[c,d]of Object.entries(r.tables||{})){e.ensureTable(`profiles.${a}.${c}`);for(let[p,m]of d)l=e.setKey(`profiles.${a}.${c}`,p,m,{mode:"if-missing"})||l}}}return l}function Xn(e,t,n){return!n||t==="skip"?!1:e.setRootKey("profile",`"${t}"`,{mode:"force"})}function Qn(e,t){if(!t||t==="none")return!1;e.ensureTable("tui");let n=e.getValue("tui","notifications");if(n){let o=n.trim().toLowerCase();if(o.startsWith("true")||o.startsWith("["))return!1}return e.setKey("tui","notifications","true",{mode:"force"})}function Zn(e,t){let n=t.options.webSearch;if(!n||n==="skip")return!1;let o=qt(t.options.profileScope,t.options.profile,t.options.profilesSelected);if(o.length===0)return!1;let i=!1;for(let s of o)i=e.setKey(`profiles.${s}`,"web_search",`"${n}"`,{mode:"force"})||i,n==="live"&&(e.ensureTable(`profiles.${s}.sandbox_workspace_write`),i=e.setKey(`profiles.${s}.sandbox_workspace_write`,"network_access","true",{mode:"force"})||i);return i}function eo(e,t){let n=t.options.fileOpener;return!n||n==="skip"?!1:e.setRootKey("file_opener",`"${n}"`,{mode:"force"})}function to(e,t){let n=t.options.credentialsStore;if(n==="skip")return!1;let o=`"${n||"auto"}"`,i=n?"force":"if-missing",s=!1;return s=e.setRootKey("cli_auth_credentials_store",o,{mode:i})||s,s=e.setRootKey("mcp_oauth_credentials_store",o,{mode:i})||s,s}function no(e,t){let n=t.options.tuiAlternateScreen;return!n||n==="skip"?!1:(e.ensureTable("tui"),e.setKey("tui","alternate_screen",`"${n}"`,{mode:"force"}))}function oo(e,t){let n=qt(t.options.profileScope,t.options.profile,t.options.profilesSelected);if(n.length===0)return!1;let o={"background-terminal":"unified_exec","shell-snapshot":"shell_snapshot",steering:"steer"},i=(t.options.experimentalFeatures||[]).map(l=>o[l]).filter(Boolean);if(i.length===0)return!1;let s=!1;for(let l of n){e.ensureTable(`profiles.${l}.features`);for(let a of i)s=e.setKey(`profiles.${l}.features`,a,"true",{mode:"force"})||s}return s}function io(e,t){let n=t.options.suppressUnstableWarning;return!n||n==="skip"||!(!!e.getRootValue("suppress_unstable_features_warning")||(t.codexVersion?so(t.codexVersion,"0.92.0"):!1))?!1:e.setRootKey("suppress_unstable_features_warning",String(n),{mode:"force"})}function so(e,t){let n=c=>{let p=(c.split(/[+-]/)[0]||c).split(".").map(m=>Number(m));return[p[0]||0,p[1]||0,p[2]||0]},[o,i,s]=n(e),[l,a,r]=n(t);return o!==l?o>l:i!==a?i>a:s>=r}function qt(e,t,n){return e==="all"?Object.keys(He):e==="selected"?n||[]:t==="skip"?[]:[t]}var gt=class{text;constructor(t){this.text=t||""}content(){return lo(this.text)}ensureTable(t){if(this.hasTable(t))return!1;let n=this.text.length===0?"":Ye(this.text);return this.text=n+`[${t}]
|
|
9
|
+
`,!0}setKey(t,n,o,i){let s=we(this.text,t);if(!s)return this.ensureTable(t),this.setKey(t,n,o,i);let l=this.text.slice(s.start,s.end),r=new RegExp(`^\\s*${X(n)}\\s*=.*$`,"m").exec(l);if(r){if(i.mode==="if-missing")return!1;let S=this.text,R=s.start+r.index,j=R+r[0].length;return this.text=S.slice(0,R)+`${n} = ${o}`+S.slice(j),this.text!==S}let c=this.text,d=s.end,p=c.slice(0,d),m=c.slice(d),g=p.length>0&&!p.endsWith(`
|
|
10
|
+
`),v=m.length>0&&!m.startsWith(`
|
|
11
|
+
`),k=`${g?`
|
|
11
12
|
`:""}${n} = ${o}
|
|
12
|
-
${
|
|
13
|
-
`:""}`;return this.text=
|
|
13
|
+
${v?`
|
|
14
|
+
`:""}`;return this.text=p+k+m,this.text!==c}getValue(t,n){let o=we(this.text,t);if(!o)return;let i=this.text.slice(o.start,o.end),l=new RegExp(`^\\s*${X(n)}\\s*=\\s*(.+)$`,"m").exec(i);return l?l[1]:void 0}getRootValue(t){let n=Bt(this.text),o=this.text.slice(n.start,n.end),s=new RegExp(`^\\s*${X(t)}\\s*=\\s*(.+)$`,"m").exec(o);return s?s[1]:void 0}replaceTable(t,n){let o=n.map(([a,r])=>`${a} = ${r}`).join(`
|
|
14
15
|
`),i=`[${t}]
|
|
15
16
|
${o}
|
|
16
17
|
|
|
17
|
-
`,s=this.text,l=
|
|
18
|
-
`),
|
|
19
|
-
`),
|
|
18
|
+
`,s=this.text,l=we(this.text,t);if(!l){let a=s.length===0?"":Ye(s);return this.text=a+i,this.text!==s}return this.text=s.slice(0,l.start)+i+s.slice(l.end),this.text!==s}setRootKey(t,n,o){let i=Bt(this.text),s=this.text.slice(i.start,i.end),a=new RegExp(`^\\s*${X(t)}\\s*=.*$`,"m").exec(s);if(a){if(o.mode==="if-missing")return!1;let v=this.text,k=i.start+a.index,S=k+a[0].length;return this.text=v.slice(0,k)+`${t} = ${n}`+v.slice(S),this.text!==v}let r=this.text,c=i.end,d=c>0&&!r.slice(0,c).endsWith(`
|
|
19
|
+
`),p=r.slice(c),m=p.length>0&&!p.startsWith(`
|
|
20
|
+
`),g=`${d?`
|
|
20
21
|
`:""}${t} = ${n}
|
|
21
|
-
${
|
|
22
|
-
`:""}`;return this.text=r.slice(0,
|
|
22
|
+
${m?`
|
|
23
|
+
`:""}`;return this.text=r.slice(0,c)+g+p,this.text!==r}hasTable(t){return we(this.text,t)!==null}};function we(e,t){let n=/^\s*\[([^\]]+)\]\s*$/gm,o=[],i;for(;i=n.exec(e);)o.push({name:i[1].trim(),index:i.index});for(let s=0;s<o.length;s++)if(o[s].name===t){let l=o[s].index,a=o[s+1]?.index??e.length;return{start:l,end:a}}return null}function Bt(e){let n=/^\s*\[([^\]]+)\]\s*$/gm.exec(e);return n?{start:0,end:n.index}:{start:0,end:e.length}}function X(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ro(e){let t=/^\s*\[profiles\.([^. \]]+)\]\s*$/gm,n=new Set,o;for(;o=t.exec(e);){let i=o[1]?.trim();i&&n.add(i)}return[...n]}function qe(e){if(!e)return;let t=e.trim(),n=/^"([^"]*)"\s*(?:#.*)?$/.exec(t);return n?n[1]:void 0}function Kt(e){return e?e.endsWith("-codex"):!1}function ao(e){let t=!1,n=qe(e.getRootValue("model"));if(Kt(n)){let s=qe(e.getRootValue("model_reasoning_summary"));s&&s!=="detailed"&&(t=e.setRootKey("model_reasoning_summary",'"detailed"',{mode:"force"})||t)}let o=e.content(),i=new Set([...Object.keys(He),...ro(o)]);for(let s of i){let l=`profiles.${s}`,a=qe(e.getValue(l,"model"));if(!Kt(a))continue;let r=qe(e.getValue(l,"model_reasoning_summary"));r&&r!=="detailed"&&(t=e.setKey(l,"model_reasoning_summary",'"detailed"',{mode:"force"})||t)}return t}function lo(e){return e.endsWith(`
|
|
23
24
|
`)?e:e+`
|
|
24
|
-
`}function
|
|
25
|
+
`}function Ye(e){let t=e;return t.endsWith(`
|
|
25
26
|
`)||(t+=`
|
|
26
27
|
`),t.endsWith(`
|
|
27
28
|
|
|
28
29
|
`)||(t+=`
|
|
29
|
-
`),t}function
|
|
30
|
-
`);if(r!==void 0){let
|
|
31
|
-
`),
|
|
32
|
-
`);
|
|
33
|
-
`:""}${
|
|
34
|
-
${
|
|
35
|
-
`:""}`+
|
|
36
|
-
${
|
|
37
|
-
`;a=!0}}return{toml:
|
|
38
|
-
`);if(Object.keys(l).length===0)return{toml:
|
|
39
|
-
`),
|
|
40
|
-
`);
|
|
41
|
-
`:""}${
|
|
42
|
-
${
|
|
43
|
-
`:""}`+S}else
|
|
44
|
-
${
|
|
45
|
-
`;r=!0}return{toml:
|
|
46
|
-
`),changed:a}}import W from"fs-extra";import*as
|
|
47
|
-
notifications = true`);let
|
|
48
|
-
`),"utf8")}import
|
|
30
|
+
`),t}function co(e){let t="enable_experimental_windows_sandbox",n="experimental_windows_sandbox";if(!e.includes(t))return{toml:e,changed:!1};let o=e.split(/\r?\n/),i="",s=p=>p==="features"||/^profiles\.[^.]+\.features$/.test(p),l=new Set;for(let p of o){let m=p.match(/^\s*\[([^\]]+)\]\s*$/);if(m){i=m[1].trim();continue}/^\s*#/.test(p)||s(i)&&new RegExp(`^\\s*${n}\\s*=`).test(p)&&l.add(i)}i="";let a=!1,r,c=[];for(let p of o){let m=p.match(/^\s*\[([^\]]+)\]\s*$/);if(m){i=m[1].trim(),c.push(p);continue}if(!/^\s*#/.test(p)){if(i===""){let g=p.match(new RegExp(`^\\s*${t}\\s*=\\s*(.+?)\\s*$`));if(g){r=g[1],a=!0;continue}}if(s(i)&&new RegExp(`^\\s*${t}\\s*=`).test(p)){if(l.has(i)){a=!0;continue}c.push(p.replace(new RegExp(`^(\\s*)${t}(\\s*=\\s*)`),`$1${n}$2`)),a=!0;continue}}c.push(p)}let d=c.join(`
|
|
31
|
+
`);if(r!==void 0){let p=we(d,"features");if(!(()=>{if(!p)return!1;let g=d.slice(p.start,p.end);return new RegExp(`^\\s*${n}\\s*=`,"m").test(g)})()){let g=`${n} = ${r}`;if(p){let v=d.slice(0,p.end),k=d.slice(p.end),S=v.length>0&&!v.endsWith(`
|
|
32
|
+
`),R=k.length>0&&!k.startsWith(`
|
|
33
|
+
`);d=v+`${S?`
|
|
34
|
+
`:""}${g}
|
|
35
|
+
${R?`
|
|
36
|
+
`:""}`+k}else d=(d.length===0?"":Ye(d))+`[features]
|
|
37
|
+
${g}
|
|
38
|
+
`;a=!0}}return{toml:d,changed:a}}function po(e){let t=[{oldKey:"experimental_use_exec_command_tool",newKey:"shell_tool"},{oldKey:"experimental_use_unified_exec_tool",newKey:"unified_exec"},{oldKey:"experimental_use_freeform_apply_patch",newKey:"apply_patch_freeform"},{oldKey:"include_apply_patch_tool",newKey:"include_apply_patch_tool"},{oldKey:"experimental_use_rmcp_client"}];if(!t.some(d=>e.includes(d.oldKey)))return{toml:e,changed:!1};function o(d){let p=d.trim(),m=/^(true|false)\b/i.exec(p);return m?m[1].toLowerCase():p||void 0}let i=e.split(/\r?\n/),s="",l={},a=[],r=!1;for(let d of i){let p=d.match(/^\s*\[([^\]]+)\]\s*$/);if(p){s=p[1].trim(),a.push(d);continue}if(s===""&&!/^\s*#/.test(d)){let m=!1;for(let{oldKey:g,newKey:v}of t){let k=d.match(new RegExp(`^\\s*${X(g)}\\s*=\\s*(.+?)\\s*$`));if(k){let S=o(k[1]);v&&S!==void 0&&(l[v]=S),r=!0,m=!0;break}}if(m)continue}a.push(d)}let c=a.join(`
|
|
39
|
+
`);if(Object.keys(l).length===0)return{toml:c,changed:r};for(let{newKey:d}of t){if(!d)continue;let p=l[d];if(p===void 0)continue;let m=we(c,"features");if((()=>{if(!m)return!1;let k=c.slice(m.start,m.end);return new RegExp(`^\\s*${X(d)}\\s*=`,"m").test(k)})())continue;let v=`${d} = ${p}`;if(m){let k=c.slice(0,m.end),S=c.slice(m.end),R=k.length>0&&!k.endsWith(`
|
|
40
|
+
`),j=S.length>0&&!S.startsWith(`
|
|
41
|
+
`);c=k+`${R?`
|
|
42
|
+
`:""}${v}
|
|
43
|
+
${j?`
|
|
44
|
+
`:""}`+S}else c=(c.length===0?"":Ye(c))+`[features]
|
|
45
|
+
${v}
|
|
46
|
+
`;r=!0}return{toml:c,changed:r}}function uo(e){let t="collaboration_mode",n="collaboration_modes";if(!e.includes(t))return{toml:e,changed:!1};let o=e.split(/\r?\n/),i="",s=c=>c==="features"||/^profiles\.[^.]+\.features$/.test(c),l=new Set;for(let c of o){let d=c.match(/^\s*\[([^\]]+)\]\s*$/);if(d){i=d[1].trim();continue}/^\s*#/.test(c)||s(i)&&new RegExp(`^\\s*${X(n)}\\s*=`).test(c)&&l.add(i)}i="";let a=!1,r=[];for(let c of o){let d=c.match(/^\s*\[([^\]]+)\]\s*$/);if(d){i=d[1].trim(),r.push(c);continue}if(!/^\s*#/.test(c)&&s(i)&&new RegExp(`^\\s*${X(t)}\\s*=`).test(c)){if(l.has(i)){a=!0;continue}r.push(c.replace(new RegExp(`^(\\s*)${X(t)}(\\s*=\\s*)`),`$1${n}$2`)),a=!0;continue}r.push(c)}return{toml:r.join(`
|
|
47
|
+
`),changed:a}}import W from"fs-extra";import*as ye from"path";async function Ht(e){let t=ye.join(e.homeDir,".codex","notify.sh"),n=ye.join(e.rootDir,"templates","notification.sh");await W.ensureDir(ye.dirname(t));let o=e.options.notify;if(o==="no"){e.logger.info("Skipping notify hook installation");return}if(!await W.pathExists(n)){e.logger.warn(`Notification template missing at ${n}; skipping notify hook install`);return}if(await W.pathExists(t))if(o==="yes"){let s=M(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${s}`):await W.copy(t,s),e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${t}`):(await W.copy(n,t),await W.chmod(t,493)),e.logger.ok("Updated notify hook (backup created)")}else!e.options.assumeYes&&!e.options.skipConfirmation&&e.logger.info("Keeping existing notify hook");else e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${t}`):(await W.copy(n,t),await W.chmod(t,493)),e.logger.ok("Installed notify hook to ~/.codex/notify.sh");let i=ye.join(e.homeDir,".codex","config.toml");await W.pathExists(i)?await fo(i,t,e):e.logger.warn(`Config not found at ${i}; run again after config is created`)}async function fo(e,t,n){if(n.options.dryRun){n.logger.log("[dry-run] update config notify and tui.notifications");return}let i=(await W.readFile(e,"utf8")).split(/\r?\n/),s="",l=null,a=null;for(let p=0;p<i.length;p++){let m=i[p],g=m.match(/^\s*\[([^\]]+)\]\s*$/);if(g){s=g[1],s==="tui"&&(a=p);continue}let v=/^\s*notify\s*=\s*\[/.test(m),k=/^\s*tui\.notifications\s*=/.test(m),S=/^\s*notifications\s*=/.test(m);v&&(s===""?l===null&&(l=p):/^profiles\.[^.]+\.features$/.test(s)&&(i.splice(p,1),p--)),k&&/^profiles\.[^.]+\.features$/.test(s)&&(i.splice(p,1),p--),S&&s===""&&(i.splice(p,1),p--)}function r(p){let m=0;for(;m<i.length&&/^\s*(#.*)?$/.test(i[m]);)m++;i.splice(m,0,p)}if(l!==null){let p=i[l].match(/^(\s*notify\s*=\s*\[)([^\]]*)\]/);if(p){let m=p[2].trim();if(!m.includes(JSON.stringify(t))){let v=m&&!m.endsWith(",")?", ":"";i[l]=`${p[1]}${m}${v}${JSON.stringify(t)}]`,n.logger.ok("Added notify hook to config")}}}else r(`notify = [${JSON.stringify(t)}]`),n.logger.ok("Enabled notify hook in config");let c=!1;if(a!==null){let p=a+1,m=!1;for(;p<i.length;p++){let g=i[p];if(/^\s*\[/.test(g))break;if(/^\s*notifications\s*=/.test(g)){i[p]="notifications = true",m=!0,c=!0;break}}m||(i.splice(a+1,0,"notifications = true"),c=!0)}c||r(`[tui]
|
|
48
|
+
notifications = true`);let d=[];s="";for(let p=0;p<i.length;p++){let m=i[p],g=m.match(/^\s*\[([^\]]+)\]\s*$/);if(g){s=g[1],d.push(m);continue}/^\s*tui\.notifications\s*=/.test(m)||/^\s*notifications\s*=/.test(m)&&s!=="tui"||d.push(m)}await W.writeFile(e,d.join(`
|
|
49
|
+
`),"utf8")}import Q from"fs-extra";import*as _ from"path";async function Yt(e){let t=_.join(e.rootDir,"sounds"),n=_.join(e.homeDir,".codex","sounds");await Q.ensureDir(n);let o=e.options.notificationSound;if(o==="none"){let c=_.join(e.homeDir,".codex","notify.sh");if(await Q.pathExists(c)){let d=await Q.readFile(c,"utf8"),p=d.replace(/^DEFAULT_CODEX_SOUND=.*$/m,'DEFAULT_CODEX_SOUND=""');e.options.dryRun?e.logger.log(`[dry-run] patch ${c} DEFAULT_CODEX_SOUND -> empty`):p!==d&&await Q.writeFile(c,p,"utf8")}e.logger.ok("Notification sound disabled");return}let i;if(o&&!_.isAbsolute(o)?i=_.join(t,o):o?i=o:e.options.mode==="recommended"&&(i=_.join(t,"noti_1.wav")),!i||!await Q.pathExists(i)){e.logger.warn("No notification sound selected or file missing; skipping sound setup");return}let s=_.isAbsolute(i),l=i.startsWith(_.join(e.rootDir,"sounds")),a=!s||l?_.join(n,_.basename(i)):i;(!s||l)&&(e.options.dryRun?e.logger.log(`[dry-run] cp ${i} ${a}`):await Q.copy(i,a));let r=_.join(e.homeDir,".codex","notify.sh");if(await Q.pathExists(r)){let c=await Q.readFile(r,"utf8"),d=`DEFAULT_CODEX_SOUND="${a}"`,p=c.replace(/^DEFAULT_CODEX_SOUND=.*$/m,d);p!==c&&(e.options.dryRun?e.logger.log(`[dry-run] patch ${r} DEFAULT_CODEX_SOUND -> ${a}`):await Q.writeFile(r,p,"utf8"))}e.logger.ok("Notification sound configured")}import O from"fs-extra";import*as se from"path";async function Jt(e){let t=se.join(e.homeDir,".codex","AGENTS.md"),n=e.options.globalAgents;if(n==="skip"){e.logger.info("Skipping global AGENTS.md creation");return}let o=se.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(!await O.pathExists(o)){e.logger.warn(`Template not found at ${o}`);return}switch(n){case"create-default":{if(await O.pathExists(t)){e.logger.info("Global AGENTS.md already exists; leaving unchanged");return}await O.ensureDir(se.dirname(t)),e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${t}`):await O.copy(o,t),e.logger.ok(`Wrote ${t}`);break}case"overwrite-default":{if(await O.ensureDir(se.dirname(t)),await O.pathExists(t)){let i=M(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await O.copy(t,i),e.logger.info(`Backed up existing AGENTS.md to: ${i}`)}e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${t}`):await O.copy(o,t),e.logger.ok(`Wrote ${t}`);break}case"append-default":{if(await O.ensureDir(se.dirname(t)),await O.pathExists(t)){let s=M(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${s}`):await O.copy(t,s),e.logger.info(`Backed up existing AGENTS.md to: ${s}`)}let i=await O.readFile(o,"utf8");e.options.dryRun?e.logger.log(`[dry-run] append template to ${t}`):await O.appendFile(t,`
|
|
49
50
|
---
|
|
50
51
|
|
|
51
|
-
${i}`,"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
|
|
52
|
+
${i}`,"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 Xt(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 b("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 x("code",["--install-extension",t,"--force"],{dryRun:!1,logger:e.logger}),e.logger.ok(`VS Code extension '${t}' installed (or already present)`)}import Ie from"fs-extra";import*as Te from"path";async function Qt(e){let t=e.options.agentsMd;if(!t)return;let n=t;(await Ie.stat(n).catch(()=>null))?.isDirectory()&&(n=Te.join(n,"AGENTS.md"));let o=Te.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(await Ie.pathExists(n)){e.logger.warn(`${n} already exists`);let i=M(n);e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${i}`):await Ie.copy(n,i),e.logger.info(`Backed up existing AGENTS.md to: ${i}`)}e.logger.info(`Writing starter AGENTS.md to: ${n}`),e.options.dryRun?e.logger.log(`[dry-run] write AGENTS.md to ${n}`):(await Ie.ensureDir(Te.dirname(n)),await Ie.copy(o,n),e.logger.ok("Wrote AGENTS.md"))}import oe from"fs-extra";import*as Ae from"path";import*as Ze from"@clack/prompts";import ht from"fs-extra";import*as Xe from"path";async function Qe(e){let t=Xe.join(e,"templates","skills"),n=await ht.readdir(t,{withFileTypes:!0}).catch(()=>[]),o=[];for(let i of n){if(!i.isDirectory())continue;let s=i.name,l=Xe.join(t,s),a=Xe.join(l,"SKILL.md");if(!await ht.pathExists(a))continue;let r=await ht.readFile(a,"utf8").catch(()=>""),c=mo(r);!c?.name||!c?.description||o.push({id:s,name:c.name,description:c.description,srcDir:l})}return o.sort((i,s)=>i.id.localeCompare(s.id)),o}function mo(e){let t=e.split(/\r?\n/);if(t.length<3||t[0].trim()!=="---")return null;let n=[],o=-1;for(let s=1;s<t.length;s++){if(t[s].trim()==="---"){o=s;break}n.push(t[s])}if(o===-1)return null;let i={};for(let s of n){let l=s.trim();if(!l||l.startsWith("#"))continue;let a=l.indexOf(":");if(a===-1)continue;let r=l.slice(0,a).trim();if(!r)continue;let c=l.slice(a+1).trim();c&&(c=ho(go(c)),i[r]=c)}return{name:i.name,description:i.description}}function go(e){let t=e.trim();if(!t||t.startsWith('"')||t.startsWith("'"))return t;let n=t.indexOf(" #");return n===-1?t:t.slice(0,n).trim()}function ho(e){let t=e.trim();return t.length>=2&&(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))?t.slice(1,-1):t}async function et(e){let t=e.options.skills;if(t==="skip"){e.logger.info("Skipping bundled skills installation");return}let n=await Qe(e.rootDir);if(n.length===0){e.logger.info("No bundled skills found; skipping");return}let o=(()=>{if(t==="all")return n;let a=new Set((e.options.skillsSelected||[]).map(r=>r.trim()).filter(Boolean));return n.filter(r=>a.has(r.id)||a.has(r.name))})();if(o.length===0){e.logger.info("No skills selected; skipping");return}let i=Ae.join(e.homeDir,".codex","skills"),s=process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes;e.options.dryRun?e.logger.log(`[dry-run] mkdir -p ${i}`):await oe.ensureDir(i),e.logger.info(`Installing ${o.length} skill(s) into: ${i}`);let l=[];for(let a of o){let r=Ae.join(i,a.id);if(await oe.pathExists(r)){if(s){let p=await Ze.select({message:`Skill "${a.id}" already exists. Overwrite? (backup created)`,options:[{label:"Overwrite",value:"overwrite"},{label:"Skip",value:"skip"}],initialValue:"overwrite"});if(Ze.isCancel(p)||p==="skip"){e.logger.info(`Skipping existing skill: ${a.id}`);continue}}let d=M(r);e.options.dryRun?(e.logger.log(`[dry-run] cp -R ${r} ${d}`),e.logger.log(`[dry-run] rm -rf ${r}`)):(await oe.copy(r,d),await oe.remove(r)),e.logger.info(`Backed up existing skill ${a.id} to: ${d}`)}e.options.dryRun?e.logger.log(`[dry-run] cp -R ${a.srcDir} ${r}`):await oe.copy(a.srcDir,r),e.logger.ok(`Installed skill: ${a.id}`),l.push(a.id)}if(l.length>0){let a=Ae.join(e.homeDir,".codex","config.toml");await oe.pathExists(a)?await wo(a,l,e):e.logger.info(`Config not found at ${a}; skipping skills.config entries`)}}async function wo(e,t,n){let o=t.map(c=>Ae.join(n.homeDir,".codex","skills",c,"SKILL.md"));if(n.options.dryRun){n.logger.log(`[dry-run] update ${e} (add skills.config entries)`);return}let i=await oe.readFile(e,"utf8"),s=o.filter(c=>!i.includes(`path = "${c}"`));if(s.length===0)return;let l=/^\s*\[skills\]\s*$/m.test(i),a=[];l||a.push("[skills]");for(let c of s)a.push("[[skills.config]]"),a.push("enabled = true"),a.push(`path = "${c}"`),a.push("");let r=i.replace(/\s*$/,`
|
|
52
53
|
|
|
53
54
|
`)+a.join(`
|
|
54
55
|
`).trimEnd()+`
|
|
55
|
-
`;await
|
|
56
|
+
`;await oe.writeFile(e,r,"utf8"),n.logger.ok(`Registered ${s.length} skill(s) in config (skills.config)`)}var en="codex-1up";async function nn(e,t){let n=tn.homedir(),o=wt.join(n,`.${en}`);await Zt.ensureDir(o);try{await Zt.chmod(o,448)}catch{}let i=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),s=wt.join(o,`install-${i}.log`),l=Ge(s);l.info(`==> ${en} installer`),l.info(`Log: ${s}`);let a={cwd:process.cwd(),homeDir:n,rootDir:t,logDir:o,logFile:s,codexVersion:void 0,options:e,logger:l};try{await Ft(a),await Wt(a),await ze(a);let c=await b("codex")||a.options.installCodexCli==="yes";if(c||l.warn("Codex CLI not found and codex install was skipped; skipping config/notify setup until codex is installed."),c){if(a.options.suppressUnstableWarning===!0){let d=await ut();a.codexVersion=d.version}await zt(a),await Ht(a),await Yt(a),await Jt(a)}await et(a),await Xt(a),await Qt(a),l.ok("All done. Open a new shell or 'source' your rc file to load aliases."),l.info("Next steps:"),l.info(" 1) codex # sign in; then ask it to plan a refactor"),l.info(" 2) ./bin/codex-1up agents --path $PWD # write a starter AGENTS.md to your repo"),l.info(" 3) Review ~/.codex/config.toml (see: https://github.com/openai/codex/blob/main/docs/config.md)")}catch(r){throw l.err(`Installation failed: ${r}`),r}}import vo from"os";import*as bt from"path";import{promises as on}from"fs";import{accessSync as yo}from"fs";import{dirname as bo,resolve as yt}from"path";import{fileURLToPath as ko}from"url";function E(e=import.meta.url){let t=bo(ko(e)),n=t;for(let o=0;o<6;o++){try{return yo(yt(n,"templates","codex-config.toml")),n}catch{}n=yt(n,"..")}return yt(t,"..")}function So(){return{profile:"skip",profileScope:"selected",profileMode:"add",setDefaultProfile:!1,profilesSelected:void 0,installTools:"skip",toolsSelected:void 0,installCodexCli:"no",notify:"no",globalAgents:"skip",notificationSound:void 0,skills:"skip",skillsSelected:void 0,mode:"manual",installNode:"skip",shell:"auto",vscodeId:void 0,noVscode:!0,agentsMd:void 0,dryRun:!1,assumeYes:!1,skipConfirmation:!1}}async function be(e={}){let t=vo.homedir(),n=bt.join(t,".codex-1up");await on.mkdir(n,{recursive:!0});try{await on.chmod(n,448)}catch{}let o=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),i=bt.join(n,`command-${o}.log`),s=Ge(i),l=So();return{cwd:process.cwd(),homeDir:t,rootDir:E(),logDir:n,logFile:i,options:{...l,...e},logger:s}}function re(){return he()}function ae(e){return Ut(e)}function sn(){return re().map(e=>e.id)}async function Pe(){let e=he(),t=[];for(let n of e){let o=await vt(n.bins);t.push({id:n.id,installed:o})}return t}async function kt(e,t={}){let n=e==="all",o={installTools:n?"all":"select",toolsSelected:n?void 0:e,dryRun:!!t.dryRun},i=await be(o);await ze(i)}async function vt(e){for(let t of e)if(await b(t))return!0;return!1}async function St(e,t){let n=t||E();await nn(e,n)}async function Ct(){let e=Co.homedir(),t=$o(e,".codex","config.toml"),n,o=[];try{let c=await xo.readFile(t,"utf8"),d=rn.parse(c);n=typeof d.profile=="string"?d.profile:void 0;let p=d.profiles&&typeof d.profiles=="object"?d.profiles:{};o=Object.keys(p)}catch(c){}let i=re(),s=[{id:"codex",bins:["codex"]},...i],a=(await Promise.all(s.map(async c=>{let d=await vt(c.bins);return[c.id,d]}))).filter(([,c])=>c).map(([c])=>c),r=[];r.push(""),r.push("codex-1up: Installation summary"),r.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"),r.push(`Config: ${t}${n?` (active profile: ${n})`:""}`),o.length&&r.push(`Profiles: ${o.join(", ")}`),r.push(`Tools detected: ${a.join(", ")||"none"}`),r.push(""),r.push("Usage:"),r.push(" - Switch profile for a session: codex --profile <name>"),r.push(" - List available profiles: codex-1up config profiles"),r.push(" - Persist active profile: codex-1up config set-profile <name>"),r.push(" - Write AGENTS.md to a repo: codex-1up agents --path ."),r.push(""),process.stdout.write(r.join(`
|
|
56
57
|
`)+`
|
|
57
|
-
`)}import
|
|
58
|
-
`)),
|
|
59
|
-
`),
|
|
60
|
-
`));;){let f=await u.select({message:"Install bundled Agent Skills (optional)",options:[{label:"None (do not install skills)",value:"skip"},{label:"Select skills\u2026",value:"select"},{label:"All (install every bundled skill)",value:"all"}],initialValue:"skip"});if(u.isCancel(f))return
|
|
58
|
+
`)}import Io from"fs-extra";import To from"os";import an from"path";async function $t(e){return Qe(e)}var xt=$t;async function ln(){let e=an.join(To.homedir(),".codex","skills");return(await Io.readdir(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>({id:n.name,path:an.join(e,n.name)})).sort((n,o)=>n.id.localeCompare(o.id))}async function tt(e,t,n={}){let o=await be({skills:e,skillsSelected:t,dryRun:!!n.dryRun});await et(o)}import{existsSync as Ao,readFileSync as Po}from"fs";import{dirname as pn,join as cn}from"path";import{fileURLToPath as Eo}from"url";var Ro=pn(Eo(import.meta.url)),dn=(e,t=!1)=>{try{return JSON.parse(Po(e,"utf-8"))}catch(n){if(t)return{};throw n}},No=e=>!!(e.name==="codex-1up"||e.bin==="codex-1up"||e.bin&&typeof e.bin=="object"&&"codex-1up"in e.bin),_o=e=>{let t=e,n=null;for(;;){let o=cn(t,"package.json");if(Ao(o)){n||(n=o);let s=dn(o,!0);if(No(s))return o}let i=pn(t);if(i===t)break;t=i}return n??cn(e,"package.json")},Lo=_o(Ro),It=dn(Lo),nt=It.name||"codex-1up",ke=It.version||"0.0.0",un=It.description||"Codex CLI helper";import{promises as At}from"fs";import{resolve as Tt}from"path";import*as u from"@clack/prompts";import{$ as Ee,which as Re}from"zx";import*as ot from"@clack/prompts";async function it(e){let t=e.logger,n=await Oo(t);if(!n.latest)return t?.warn("Unable to check for codex-1up updates right now."),"error";if(!n.updateAvailable)return t?.ok(`codex-1up is up-to-date (v${n.current}).`),"up-to-date";let o=e.interactive&&!e.assumeYes&&!e.skipConfirmation,i=e.assumeYes||e.skipConfirmation;if(o){let r=await ot.confirm({message:`New codex-1up version available (v${n.latest}). Update now?`,initialValue:!0});if(ot.isCancel(r))return t?.info("Update canceled."),"skipped";i=!!r}if(!i)return t?.info("Skipping codex-1up update."),"skipped";let s=await Ke({logger:t,interactive:e.interactive&&!e.assumeYes&&!e.skipConfirmation});if(s==="none")return t?.warn("No supported Node package manager found; cannot update codex-1up."),"error";let l=n.latest?`${nt}@${n.latest}`:nt,a=!!e.dryRun;return s==="pnpm"?(t?.info("Updating codex-1up via pnpm"),await x("pnpm",["add","-g",l],{dryRun:a,logger:t})):(t?.info("Updating codex-1up via npm"),await x("npm",["install","-g",l],{dryRun:a,logger:t})),t?.ok(`codex-1up updated to v${n.latest}`),"updated"}async function Oo(e){let t=ke,n=await jo(nt,e),o=!!(n&&Fo(n,t));return{current:t,latest:n,updateAvailable:o}}async function jo(e,t){let n=await Do(e);if(n)return n;try{if(!await b("npm"))return;let o=await Ce("npm",["view",e,"version"],{timeoutMs:8e3});return o.timedOut||o.code!==0?void 0:(o.stdout||"").trim()||void 0}catch(o){t?.warn(`Error checking latest codex-1up version via npm: ${o}`);return}}async function Do(e){let t=new AbortController,n=setTimeout(()=>t.abort(),1500);n.unref?.();try{let o=await fetch(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,{signal:t.signal});return o.ok?(await o.json()).version:void 0}catch{return}finally{clearTimeout(n)}}function Fo(e,t){let n=fn(e),o=fn(t);if(!n||!o)return e!==t;for(let i=0;i<3;i++){if(n[i]>o[i])return!0;if(n[i]<o[i])return!1}return!1}function fn(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}async function mn(e){return Ve(e)}var Mo=["balanced","safe","yolo"];async function gn(e){let{repoRoot:t,isUnixLike:n,globalAgentsExists:o,currentProfile:i,seededProfile:s,bundledSkills:l,availableTools:a,cliArgs:r}=e,{profileChoice:c,profileMode:d,profileScope:p,setDefaultProfile:m,profilesSelected:g,installTools:v,toolsSelected:k,installCodexCli:S,notifyAction:R,globalAgentsAction:j,notificationSound:G,skillsMode:Z,skillsSelected:ee,webSearch:ce,fileOpener:D,credentialsStore:te,tuiAlternateScreen:K,experimentalFeatures:pe,suppressUnstableWarning:Fe}=e.selections,U={log:f=>u.log.info(f),info:f=>u.log.info(f),ok:f=>u.log.success(f),warn:f=>u.log.warn(f),err:f=>u.log.warn(f)},de=u.spinner();de.start("Checking for codex-1up updates\u2026"),await it({interactive:!0,assumeYes:!1,skipConfirmation:!1,dryRun:!1,logger:U}),de.stop("Update check complete");let z=u.spinner();z.start("Checking Codex CLI status\u2026");let T=await mn();if(z.stop("Codex CLI status checked"),T.found){let f=T.version?`v${T.version}`:"unknown version";T.latest?T.updateAvailable?u.log.info(`Codex CLI detected (${f}). Newer version available: v${T.latest}.`):u.log.info(`Codex CLI detected (${f}). Latest: v${T.latest}.`):u.log.info(`Codex CLI detected (${f}).`)}else u.log.info("Codex CLI not detected.");if(S==="no")T.found?T.updateAvailable&&u.log.info("Codex CLI update disabled by --codex-cli no."):u.log.info("Codex CLI install disabled by --codex-cli no.");else if(S==="auto")if(T.found){if(T.updateAvailable){let f=await u.confirm({message:`Codex CLI ${T.version} found; latest is ${T.latest}. Update now?`,initialValue:!0});if(u.isCancel(f))return I();S=f?"yes":"no"}}else{let f=await u.confirm({message:"Codex CLI not found. Install now?",initialValue:!0});if(u.isCancel(f))return I();S=f?"yes":"no"}if(n&&!r.toolsArg){let f=await Pe(),h=f.filter(w=>w.installed).map(w=>w.id),y=f.filter(w=>!w.installed).map(w=>w.id);for(u.log.info(`Tools detected: ${h.join(", ")||"none"}`),y.length&&u.log.info(`Missing tools: ${y.join(", ")}`);;){let w=await u.select({message:"Install/update developer tools",options:[{label:"Install/Update all",value:"all"},{label:"Select",value:"select"},{label:"Skip",value:"skip"}],initialValue:"all"});if(u.isCancel(w))return I();if(v=w,w!=="select"){k=void 0;break}u.log.info("Tip: press Esc to go back.");let P=await Ne({message:"Select tools to install",options:a.map(C=>{let N=h.includes(C.id);return{label:C.id,value:C.id,hint:N?"installed":"missing"}})});if(P==="back")continue;let L=Array.isArray(P)?P.map(C=>String(C).trim().toLowerCase()).filter(ae):[];L.length===0?(v="skip",k=void 0):k=Array.from(new Set(L));break}}else!n&&!r.toolsArg&&(v="skip",k=void 0);let F=[{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-codex"}];if(!r.profileScope)for(;;){let f=await u.select({message:"Install all profiles (balanced, safe, yolo)?",options:[{label:"Yes \u2014 install/update all profiles",value:"all"},{label:"Choose profiles\u2026",value:"selected"},{label:"No \u2014 don't install any profiles",value:"skip"}],initialValue:"all"});if(u.isCancel(f))return I();if(f==="skip"){p="selected",g=[],c="skip";break}if(f!=="selected"){p=f;break}u.log.info("Tip: press Esc to go back.");let h=await Ne({message:"Select profiles to install",options:F.map(P=>({label:P.label,value:P.value,hint:P.hint}))});if(h==="back")continue;let y=Array.isArray(h)?h.map(P=>String(P).trim().toLowerCase()).filter(_e):[],w=Array.from(new Set(y));p="selected",w.length===0?(g=[],c="skip"):g=w;break}if(p!=="all"&&!r.profileChoice&&u.log.info(["Profiles:"," - Balanced: on-request approvals, workspace-write sandbox, web search on."," - Safe: on-failure approvals, read-only sandbox, web search off."," - YOLO: never approvals, danger-full-access, gpt-5.2-codex, high reasoning."].join(`
|
|
59
|
+
`)),p==="single"){if(!r.profileChoice){let f=await u.select({message:"Choose a Codex profile to install",options:[...F,{label:"Skip (no profile changes)",value:"skip"}],initialValue:Uo(i)});if(u.isCancel(f))return I();c=f}}else if(p==="selected"){if(g===void 0){u.log.info("Tip: press Esc to go back.");let f=await Ne({message:"Select profiles to install",options:F.map(h=>({label:h.label,value:h.value,hint:h.hint}))});if(f==="back")g=[],c="skip";else{let h=Array.isArray(f)?f.map(w=>String(w).trim().toLowerCase()).filter(_e):[],y=Array.from(new Set(h));y.length===0?(g=[],c="skip"):g=y}}(g||[]).length>0&&_e(c)&&!g.includes(c)&&(c=g[0])}else p==="all"&&c==="skip"&&(c=s);let A=p==="all"?[...Mo]:p==="selected"?g||[]:c==="skip"?[]:[c];if(A.length>0&&!r.profileMode){let f=await u.select({message:p==="all"?"How should we write all profiles?":A.length>1?"How should we write selected profiles?":`How should we write profiles.${A[0]}?`,options:[{label:"Overwrite (use codex-1up defaults)",value:"overwrite"},{label:"Add Merge (add missing, keep your default settings)",value:"add"}],initialValue:d});if(u.isCancel(f))return I();d=f}if(A.length>0&&!r.webSearchArg){u.log.info("Note: this overrides profiles.<name>.web_search for the profiles you are writing. Root web_search is unchanged (fallback only).");let f=await u.select({message:"Web search override (installed profiles)",options:[{label:"Skip (leave unchanged)",value:"skip"},{label:"Disabled",value:"disabled",hint:"no web search tool calls"},{label:"Cached",value:"cached",hint:"no network; may use cached results"},{label:"Live",value:"live",hint:"requires sandbox network access"}],initialValue:ce||"skip"});if(u.isCancel(f))return I();ce=f}if(!r.fileOpenerArg){let f=await u.select({message:"Citation file opener (optional)",options:[{label:"Skip (leave unchanged)",value:"skip"},{label:"Cursor",value:"cursor"},{label:"VS Code",value:"vscode"},{label:"VS Code Insiders",value:"vscode-insiders"},{label:"Windsurf",value:"windsurf"},{label:"None (disable citation links)",value:"none"}],initialValue:D&&D!=="skip"?D:"skip"});if(u.isCancel(f))return I();D=f}if(!r.credentialsStoreArg){let f=await u.select({message:"Credential storage (recommended: auto)",options:[{label:"Skip (leave unchanged)",value:"skip"},{label:"Auto (prefer keyring, fallback to file)",value:"auto"},{label:"Keyring only",value:"keyring"},{label:"File only",value:"file"}],initialValue:te&&te!=="skip"?te:"auto"});if(u.isCancel(f))return I();te=f}if(!r.altScreenArg){let f=await u.select({message:"Alternate screen mode (scrollback-friendly terminals)",options:[{label:"Skip (leave unchanged)",value:"skip"},{label:"Auto (recommended)",value:"auto"},{label:"Always",value:"always"},{label:"Never (best scrollback)",value:"never"}],initialValue:K&&K!=="skip"?K:"auto"});if(u.isCancel(f))return I();K=f}if(!r.experimentalArg){let f=await u.select({message:"Experimental features (from Codex /experimental menu)",options:[{label:"Skip (leave unchanged)",value:"skip"},{label:"Choose features to enable",value:"choose"}],initialValue:"skip"});if(u.isCancel(f))return I();if(f==="choose"){u.log.info("Tip: press Esc to go back.");let h=await Ne({message:"Enable experimental features",options:[{label:"Background terminal",value:"background-terminal",hint:"run long-running commands in background"},{label:"Shell snapshot",value:"shell-snapshot",hint:"snapshot shell env to speed up commands"},{label:"Steer conversation",value:"steering",hint:"Enter submits, Tab queues messages"}]});h==="back"?pe=void 0:pe=(Array.isArray(h)?h.map(w=>String(w).trim()).filter(Boolean):[]).filter(Vo)}}if(A.length===0)m=!1;else if(A.length===1){let f=A[0],h=await u.confirm({message:`Wrote profiles.${f} to ~/.codex/config.toml (mode: ${d}). Set this as the default profile?`,initialValue:!0});if(u.isCancel(h))return I();m=!!h,m&&(c=f)}else{let f=[{label:"Keep current default (skip)",value:"skip"},...A.map(w=>({label:w==="balanced"?"Balanced":w==="safe"?"Safe":"YOLO",value:w}))],h=_e(c)&&A.includes(c)?c:A[0],y=await u.select({message:"Select a default profile (optional)",options:f,initialValue:h});if(u.isCancel(y))return I();y==="skip"?m=!1:(m=!0,c=y)}if(!r.soundArg){let w=function(){return[{label:"Skip (leave current setup)",value:"skip"},{label:"None (disable sounds)",value:"none"},...h.map(C=>({label:C,value:C})),{label:"Custom path\u2026",value:"custom"}]};var ve=w;let f=Tt(t,"sounds"),h=[];try{h=(await At.readdir(f)).filter(C=>/\.(wav|mp3|ogg)$/i.test(C)).sort()}catch(C){}R="yes";let y=h.includes("noti_1.wav")?"noti_1.wav":h[0]||"none";async function P(C){let N=await u.text({message:"Enter absolute path to a .wav file",placeholder:C||"/absolute/path/to/sound.wav",validate(Y){if(!Y)return"Path required";if(!Y.startsWith("/"))return"Use an absolute path";if(!/(\.wav|\.mp3|\.ogg)$/i.test(Y))return"Supported: .wav, .mp3, .ogg"}});if(u.isCancel(N))return null;try{await At.access(String(N))}catch{return u.log.warn("File not found. Try again."),await P(String(N))}return String(N)}let L=await u.select({message:"Notification sound",options:w(),initialValue:y});if(u.isCancel(L))return I();if(L==="skip")R="no",G=void 0;else if(L==="custom"){let C=await P();if(C===null)return I();y=C}else y=L;if(L!=="skip"){for(;;){let C=await u.select({message:`Selected: ${y}. 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(u.isCancel(C))return I();if(C==="use")break;if(C==="change"){let N=await u.select({message:"Notification sound",options:w(),initialValue:y});if(u.isCancel(N))return I();if(N==="custom"){let Y=await P();if(Y===null)return I();y=Y}else if(N==="skip"){R="no",G=void 0;break}else y=N;continue}try{let N=y==="none"?"none":y.startsWith("/")?y:Tt(t,"sounds",y);await Wo(N)}catch(N){u.log.warn(String(N))}}G===void 0&&(G=y)}}let q=["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).","Backups will be created.","You can remove it later from ~/.codex/AGENTS.md."].join(`
|
|
60
|
+
`),ie=Tt(t,"templates","agent-templates","AGENTS-default.md"),H=await(async f=>{for(;;){u.log.info(q);let h=await u.select({message:"Global ~/.codex/AGENTS.md (optional)",options:f?[{label:"Add to your existing AGENTS.md (keeps your content, adds ours; backup created)",value:"append-default"},{label:"Overwrite existing (replace with starter; backup created)",value:"overwrite-default"},{label:"Preview starter AGENTS.md",value:"preview"},{label:"Skip \u2014 leave as-is (you can run codex-1up agents later)",value:"skip"}]:[{label:"Create starter AGENTS.md (recommended; helps give Codex repo context everywhere)",value:"create-default"},{label:"Preview starter AGENTS.md",value:"preview"},{label:"Skip for now (you can add later with codex-1up agents --global)",value:"skip"}],initialValue:f?"append-default":"create-default"});if(u.isCancel(h))return null;if(h==="preview"){await Go(ie);continue}return h}})(o);if(!H)return I();if(j=H,!r.skillsArg&&l.length)for(u.log.info(["Agent Skills are optional, portable skill folders (SKILL.md + optional scripts/references).","codex-1up can install bundled skills into ~/.codex/skills so your agent can reference them.",`Bundled skills: ${l.map(f=>f.id).join(", ")}`].join(`
|
|
61
|
+
`));;){let f=await u.select({message:"Install bundled Agent Skills (optional)",options:[{label:"None (do not install skills)",value:"skip"},{label:"Select skills\u2026",value:"select"},{label:"All (install every bundled skill)",value:"all"}],initialValue:"skip"});if(u.isCancel(f))return I();if(Z=f,f!=="select")break;u.log.info("Tip: press Esc to go back.");let h=await Ne({message:"Select skills to install",options:l.map(w=>({label:w.id,value:w.id,hint:w.description.length>120?`${w.description.slice(0,117)}\u2026`:w.description}))});if(h==="back")continue;let y=Array.isArray(h)?h.map(w=>String(w).trim()).filter(Boolean):[];y.length===0?(Z="skip",ee=void 0):ee=y;break}return{selections:{profileChoice:c,profileMode:d,profileScope:p,setDefaultProfile:m,profilesSelected:g,installTools:v,toolsSelected:k,installCodexCli:S,notifyAction:R,globalAgentsAction:j,notificationSound:G,skillsMode:Z,skillsSelected:ee,webSearch:ce,fileOpener:D,credentialsStore:te,tuiAlternateScreen:K,experimentalFeatures:pe,suppressUnstableWarning:Fe}}}async function Wo(e){if(e.endsWith("/none")||e==="none")return;let t=[async n=>{await Re("afplay"),await Ee`afplay ${n}`},async n=>{await Re("paplay"),await Ee`paplay ${n}`},async n=>{await Re("aplay"),await Ee`aplay ${n}`},async n=>{await Re("mpg123"),await Ee`mpg123 -q ${n}`},async n=>{await Re("ffplay"),await Ee`ffplay -nodisp -autoexit -loglevel quiet ${n}`}];for(let n of t)try{await n(e);return}catch{}throw new Error("No audio player found (afplay/paplay/aplay/mpg123/ffplay)")}async function Ne(e){let n=await u.multiselect({message:e.message,options:e.options});return u.isCancel(n)?"back":Array.isArray(n)?n.map(i=>String(i)):[]}async function Go(e){let n="";try{n=await At.readFile(e,"utf8")}catch{u.log.warn(`Starter AGENTS template not found at ${e}`);return}let o=n.split(/\r?\n/);if(o.length===0||o.length===1&&o[0].trim()===""){u.log.warn("Starter AGENTS template is empty.");return}let i=o.filter(l=>/^#{1,3}\s+/.test(l)).map(l=>l.replace(/^#{1,3}\s+/,"").trim()).filter(Boolean).slice(0,12);u.log.info(`Preview: ${e}`),i.length&&u.log.info(`Sections: ${i.join(" | ")}`);let s=o.slice(0,40).join(`
|
|
61
62
|
`);process.stdout.write(s+`
|
|
62
|
-
`),o.length>40&&u.log.info(`... (${o.length-40} more lines)`)}function _o(e){return Pe(e)?e:"balanced"}function Pe(e){return e==="balanced"||e==="safe"||e==="yolo"}function Lo(e){return e==="background-terminal"||e==="shell-snapshot"||e==="multi-agents"||e==="steering"||e==="collaboration-modes"||e==="child-agent-project-docs"}function T(){return u.cancel("Install aborted"),null}var et=R(),Oo=["balanced","safe","yolo"],gn=jo({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"},"install-node":{type:"string",description:"nvm|brew|skip"},tools:{type:"string",description:"all|skip|<comma-separated tool ids> (rg, fd, fzf, jq, yq, ast-grep, bat, git, git-delta, gh)"},"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)"},"web-search":{type:"string",description:"disabled|cached|live|skip (override web search mode in selected profiles)"},"file-opener":{type:"string",description:"cursor|vscode|vscode-insiders|windsurf|none|skip (open citations in editor)"},"credentials-store":{type:"string",description:"auto|file|keyring|skip (set cli_auth_credentials_store + mcp_oauth_credentials_store)"},"alt-screen":{type:"string",description:"auto|always|never|skip (set tui.alternate_screen)"},experimental:{type:"string",description:"comma-separated experimental feature toggles: background-terminal, steering, multi-agents, collaboration-modes"},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},skills:{type:"string",description:"Install bundled Agent Skills to ~/.codex/skills: all|skip|<comma-separated names>"}},async run({args:e,rawArgs:t}){let n=xt(tt.homedir(),".codex","config.toml"),o=await It(n),i=xt(tt.homedir(),".codex","notify.sh"),s=await It(i),l=xt(tt.homedir(),".codex","AGENTS.md"),a=await It(l),r=o?await Uo(n):void 0,p=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes,c=Do(e.profile),d=Fo(e["profile-mode"]),g=Mo(e["profiles-scope"]),m=Wo(e["codex-cli"]),k=process.platform==="darwin"||process.platform==="linux",b=typeof e.sound>"u"?void 0:String(e.sound).trim(),S=typeof e.tools>"u"?void 0:String(e.tools).trim(),N=typeof e["web-search"]>"u"?void 0:String(e["web-search"]).trim(),O=typeof e["file-opener"]>"u"?void 0:String(e["file-opener"]).trim(),G=typeof e["credentials-store"]>"u"?void 0:String(e["credentials-store"]).trim(),X=typeof e["alt-screen"]>"u"?void 0:String(e["alt-screen"]).trim(),Q=typeof e.experimental>"u"?void 0:String(e.experimental).trim(),Z=e,D=typeof Z.skills>"u"?void 0:String(Z.skills).trim();if(b==="")throw new Error('Invalid --sound value (expected path, "none", or "skip")');if(S==="")throw new Error("Invalid --tools value (expected all|skip|<comma-separated tool ids>)");if(D==="")throw new Error("Invalid --skills value (expected all|skip|<comma-separated skill names>)");if(N==="")throw new Error("Invalid --web-search value (expected disabled|cached|live|skip)");if(O==="")throw new Error("Invalid --file-opener value (expected cursor|vscode|vscode-insiders|windsurf|none|skip)");if(G==="")throw new Error("Invalid --credentials-store value (expected auto|file|keyring|skip)");if(X==="")throw new Error("Invalid --alt-screen value (expected auto|always|never|skip)");if(Q==="")throw new Error("Invalid --experimental value (expected comma-separated list)");let ee=t.some($=>$==="--no-vscode"||$.startsWith("--no-vscode=")),z=await kt(et),le=se(),rt=(c&&c!=="skip"?c:At(r)?r:void 0)||"balanced",x=rt,oe=d||"add",E=g||"single",ye=!0,U,q=k?"all":"skip",Le=m||"auto",B,pe,f,h="skip",y,w,P,L,C,I,F;if(b&&($=>{let K=$.trim().toLowerCase();if(K==="skip"){B="no",f=void 0;return}B="yes",f=K==="none"?"none":$})(b),D){let $=D.trim().toLowerCase();if($==="all")h="all";else if($==="skip"||$==="none")h="skip";else{let K=D.split(",").map(H=>H.trim()).filter(Boolean);if(K.length===0)throw new Error("Invalid --skills value (expected all|skip|<comma-separated skill names>)");let je=new Set(z.map(H=>H.id)),te=K.filter(H=>!je.has(H));if(te.length){let H=z.map(In=>In.id).join(", ")||"(none)";throw new Error(`Unknown skill(s): ${te.join(", ")}. Available: ${H}`)}h="select",y=K}}if(N&&(P=Go(N)),O&&(L=Bo(O)),G&&(C=Ko(G)),X&&(I=Vo(X)),Q&&(F=zo(Q)),S){let $=S.trim().toLowerCase();if($==="all")q="all";else if($==="skip"||$==="none")q="skip";else{let K=S.split(",").map(te=>te.trim().toLowerCase()).filter(Boolean);if(K.length===0)throw new Error("Invalid --tools value (expected all|skip|<comma-separated tool ids>)");let je=K.filter(te=>!re(te));if(je.length){let te=le.map(H=>H.id).join(", ")||"(none)";throw new Error(`Unknown tool(s): ${je.join(", ")}. Available: ${te}`)}q="select",w=Array.from(new Set(K)).filter(re)}}else k||(q="skip");if(p){V.log.info(`Codex 1up v${we} - equips your coding agent with powerful tools`),V.log.info("Install wizard");let $=await cn({repoRoot:et,isUnixLike:k,globalAgentsExists:a,currentProfile:r,seededProfile:rt,bundledSkills:z,availableTools:le,cliArgs:{profileChoice:c,profileMode:d,profileScope:g,soundArg:b,toolsArg:S,skillsArg:D,webSearchArg:N,fileOpenerArg:O,credentialsStoreArg:G,altScreenArg:X,experimentalArg:Q},selections:{profileChoice:x,profileMode:oe,profileScope:E,setDefaultProfile:ye,profilesSelected:U,installTools:q,toolsSelected:w,installCodexCli:Le,notifyAction:B,globalAgentsAction:pe,notificationSound:f,skillsMode:h,skillsSelected:y,webSearch:P,fileOpener:L,credentialsStore:C,tuiAlternateScreen:I,experimentalFeatures:F}});if(!$)return;({profileChoice:x,profileMode:oe,profileScope:E,setDefaultProfile:ye,profilesSelected:U,installTools:q,toolsSelected:w,installCodexCli:Le,notifyAction:B,globalAgentsAction:pe,notificationSound:f,skillsMode:h,skillsSelected:y,webSearch:P,fileOpener:L,credentialsStore:C,tuiAlternateScreen:I,experimentalFeatures:F}=$.selections)}p||(E==="selected"&&U?.length&&At(x)&&!U.includes(x)&&(x=U[0]),(E==="all"?[...Oo]:E==="selected"?U||[]:x==="skip"?[]:[x]).length===0&&(ye=!1),typeof B>"u"&&(B=s?"no":"yes"),typeof pe>"u"&&(pe="skip"));let Pt={profile:x,profileScope:E,profileMode:oe,setDefaultProfile:ye,profilesSelected:U,installCodexCli:Le,installTools:q,toolsSelected:w,notify:B??(s?"no":"yes"),globalAgents:pe??"skip",notificationSound:f,skills:h,skillsSelected:y,webSearch:P,fileOpener:L,credentialsStore:C,tuiAlternateScreen:I,experimentalFeatures:F,mode:"manual",installNode:e["install-node"]||"skip",shell:String(e.shell||"auto"),vscodeId:ee?void 0:e.vscode?String(e.vscode):void 0,noVscode:ee||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(p){V.log.info("Installing prerequisites and writing config..."),V.log.warn("Some steps may require sudo password or confirmation prompts.");try{await yt(Pt,et),V.log.success("Base install complete"),V.log.success("Install finished")}catch($){throw V.cancel(`Installation failed: ${$}`),$}await bt();return}try{await yt(Pt,et),await bt()}catch($){throw V.cancel(`Installation failed: ${$}`),$}}});async function It(e){try{return await fn.access(e),!0}catch{return!1}}function Do(e){if(e==null)return;let t=String(e).toLowerCase();if(At(t))return t;if(t==="skip")return"skip";throw new Error("Invalid --profile value (use balanced|safe|yolo|skip).")}function Fo(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 Mo(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 Wo(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="yes"||t==="no")return t;throw new Error("Expected yes|no")}function Go(e){let t=String(e).trim().toLowerCase();if(t==="skip")return"skip";if(t==="disabled"||t==="cached"||t==="live")return t;throw new Error("Invalid --web-search value (use disabled|cached|live|skip).")}function Bo(e){let t=String(e).trim().toLowerCase();if(t==="skip")return"skip";if(t==="none")return"none";if(t==="cursor"||t==="vscode"||t==="vscode-insiders"||t==="windsurf")return t;throw new Error("Invalid --file-opener value (use cursor|vscode|vscode-insiders|windsurf|none|skip).")}function Ko(e){let t=String(e).trim().toLowerCase();if(t==="skip")return"skip";if(t==="auto"||t==="file"||t==="keyring")return t;throw new Error("Invalid --credentials-store value (use auto|file|keyring|skip).")}function Vo(e){let t=String(e).trim().toLowerCase();if(t==="skip")return"skip";if(t==="auto"||t==="always"||t==="never")return t;throw new Error("Invalid --alt-screen value (use auto|always|never|skip).")}function zo(e){let t=String(e).split(",").map(o=>o.trim().toLowerCase()).filter(Boolean),n=[];for(let o of t){if(o==="background-terminal"||o==="shell-snapshot"||o==="multi-agents"||o==="steering"||o==="collaboration-modes"||o==="child-agent-project-docs"){n.includes(o)||n.push(o);continue}throw new Error(`Unknown --experimental feature: ${o}`)}return n}function At(e){return e==="balanced"||e==="safe"||e==="yolo"}async function Uo(e){try{let t=await fn.readFile(e,"utf8"),o=un.parse(t).profile;return typeof o=="string"?o:void 0}catch(t){return}}import{defineCommand as qo}from"citty";import{promises as Ee}from"fs";import{resolve as mn,dirname as Ho}from"path";var Yo=R();async function Tt(e){try{return await Ee.access(e),!0}catch{return!1}}async function Jo(e,t){if(await Tt(t)){let o=`${t}.backup.${new Date().toISOString().replace(/[:.]/g,"").replace("T","_").slice(0,15)}`;await Ee.copyFile(t,o)}await Ee.mkdir(Ho(t),{recursive:!0}),await Ee.copyFile(e,t)}var hn=qo({meta:{name:"agents",description:"Write an AGENTS.md template"},args:{path:{type:"string",required:!0,description:"Target repo path or file"}},async run({args:e}){let t=String(e.path),n=mn(Yo,"templates/agent-templates","AGENTS-default.md"),i=await Tt(t).then(async s=>s&&(await Ee.stat(t)).isDirectory()).catch(()=>!1)?mn(t,"AGENTS.md"):t;if(!await Tt(n))throw new Error(`Template not found: ${n}`);await Jo(n,i),process.stdout.write(`Wrote ${i}
|
|
63
|
-
`)}});import{defineCommand as
|
|
63
|
+
`),o.length>40&&u.log.info(`... (${o.length-40} more lines)`)}function Uo(e){return _e(e)?e:"balanced"}function _e(e){return e==="balanced"||e==="safe"||e==="yolo"}function Vo(e){return e==="background-terminal"||e==="shell-snapshot"||e==="steering"}function I(){return u.cancel("Install aborted"),null}var st=E(),Ko=["balanced","safe","yolo"],yn=Bo({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"},"install-node":{type:"string",description:"nvm|brew|skip"},tools:{type:"string",description:"all|skip|<comma-separated tool ids> (rg, fd, fzf, jq, yq, ast-grep, bat, git, git-delta, gh)"},"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)"},"web-search":{type:"string",description:"disabled|cached|live|skip (override profiles.<name>.web_search for installed profiles; does not set root web_search)"},"file-opener":{type:"string",description:"cursor|vscode|vscode-insiders|windsurf|none|skip (open citations in editor)"},"credentials-store":{type:"string",description:"auto|file|keyring|skip (set cli_auth_credentials_store + mcp_oauth_credentials_store)"},"alt-screen":{type:"string",description:"auto|always|never|skip (set tui.alternate_screen)"},experimental:{type:"string",description:"comma-separated experimental feature toggles: background-terminal, shell-snapshot, steering (from Codex /experimental menu)"},"suppress-unstable-warning":{type:"boolean",description:'Suppress "Under-development features enabled \u2026" warning (hides reminder; features may still be unstable)'},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},skills:{type:"string",description:"Install bundled Agent Skills to ~/.codex/skills: all|skip|<comma-separated names>"}},async run({args:e,rawArgs:t}){let n=Pt(rt.homedir(),".codex","config.toml"),o=await Et(n),i=Pt(rt.homedir(),".codex","notify.sh"),s=await Et(i),l=Pt(rt.homedir(),".codex","AGENTS.md"),a=await Et(l),r=o?await ti(n):void 0,c=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes,d=zo(e.profile),p=qo(e["profile-mode"]),m=Ho(e["profiles-scope"]),g=Yo(e["codex-cli"]),v=process.platform==="darwin"||process.platform==="linux",k=typeof e.sound>"u"?void 0:String(e.sound).trim(),S=typeof e.tools>"u"?void 0:String(e.tools).trim(),R=typeof e["web-search"]>"u"?void 0:String(e["web-search"]).trim(),j=typeof e["file-opener"]>"u"?void 0:String(e["file-opener"]).trim(),G=typeof e["credentials-store"]>"u"?void 0:String(e["credentials-store"]).trim(),Z=typeof e["alt-screen"]>"u"?void 0:String(e["alt-screen"]).trim(),ee=typeof e.experimental>"u"?void 0:String(e.experimental).trim(),ce=e,D=typeof ce.skills>"u"?void 0:String(ce.skills).trim();if(k==="")throw new Error('Invalid --sound value (expected path, "none", or "skip")');if(S==="")throw new Error("Invalid --tools value (expected all|skip|<comma-separated tool ids>)");if(D==="")throw new Error("Invalid --skills value (expected all|skip|<comma-separated skill names>)");if(R==="")throw new Error("Invalid --web-search value (expected disabled|cached|live|skip)");if(j==="")throw new Error("Invalid --file-opener value (expected cursor|vscode|vscode-insiders|windsurf|none|skip)");if(G==="")throw new Error("Invalid --credentials-store value (expected auto|file|keyring|skip)");if(Z==="")throw new Error("Invalid --alt-screen value (expected auto|always|never|skip)");if(ee==="")throw new Error("Invalid --experimental value (expected comma-separated list)");let te=t.some($=>$==="--no-vscode"||$.startsWith("--no-vscode=")),K=await $t(st),pe=re(),Fe=(d&&d!=="skip"?d:Rt(r)?r:void 0)||"balanced",U=Fe,de=p||"add",z=m||"single",T=!0,F,A=v?"all":"skip",Me=g||"auto",q,ie,ue,H="skip",ve,f,h,y,w,P,L,C;if(k&&($=>{let V=$.trim().toLowerCase();if(V==="skip"){q="no",ue=void 0;return}q="yes",ue=V==="none"?"none":$})(k),D){let $=D.trim().toLowerCase();if($==="all")H="all";else if($==="skip"||$==="none")H="skip";else{let V=D.split(",").map(J=>J.trim()).filter(Boolean);if(V.length===0)throw new Error("Invalid --skills value (expected all|skip|<comma-separated skill names>)");let We=new Set(K.map(J=>J.id)),ne=V.filter(J=>!We.has(J));if(ne.length){let J=K.map(En=>En.id).join(", ")||"(none)";throw new Error(`Unknown skill(s): ${ne.join(", ")}. Available: ${J}`)}H="select",ve=V}}if(R&&(h=Jo(R)),j&&(y=Xo(j)),G&&(w=Qo(G)),Z&&(P=Zo(Z)),ee&&(L=ei(ee)),e["suppress-unstable-warning"]&&(C=!0),S){let $=S.trim().toLowerCase();if($==="all")A="all";else if($==="skip"||$==="none")A="skip";else{let V=S.split(",").map(ne=>ne.trim().toLowerCase()).filter(Boolean);if(V.length===0)throw new Error("Invalid --tools value (expected all|skip|<comma-separated tool ids>)");let We=V.filter(ne=>!ae(ne));if(We.length){let ne=pe.map(J=>J.id).join(", ")||"(none)";throw new Error(`Unknown tool(s): ${We.join(", ")}. Available: ${ne}`)}A="select",f=Array.from(new Set(V)).filter(ae)}}else v||(A="skip");if(c){B.log.info(`Codex 1up v${ke} - equips your coding agent with powerful tools`),B.log.info("Install wizard");let $=await gn({repoRoot:st,isUnixLike:v,globalAgentsExists:a,currentProfile:r,seededProfile:Fe,bundledSkills:K,availableTools:pe,cliArgs:{profileChoice:d,profileMode:p,profileScope:m,soundArg:k,toolsArg:S,skillsArg:D,webSearchArg:R,fileOpenerArg:j,credentialsStoreArg:G,altScreenArg:Z,experimentalArg:ee},selections:{profileChoice:U,profileMode:de,profileScope:z,setDefaultProfile:T,profilesSelected:F,installTools:A,toolsSelected:f,installCodexCli:Me,notifyAction:q,globalAgentsAction:ie,notificationSound:ue,skillsMode:H,skillsSelected:ve,webSearch:h,fileOpener:y,credentialsStore:w,tuiAlternateScreen:P,experimentalFeatures:L,suppressUnstableWarning:C}});if(!$)return;({profileChoice:U,profileMode:de,profileScope:z,setDefaultProfile:T,profilesSelected:F,installTools:A,toolsSelected:f,installCodexCli:Me,notifyAction:q,globalAgentsAction:ie,notificationSound:ue,skillsMode:H,skillsSelected:ve,webSearch:h,fileOpener:y,credentialsStore:w,tuiAlternateScreen:P,experimentalFeatures:L,suppressUnstableWarning:C}=$.selections)}c||(z==="selected"&&F?.length&&Rt(U)&&!F.includes(U)&&(U=F[0]),(z==="all"?[...Ko]:z==="selected"?F||[]:U==="skip"?[]:[U]).length===0&&(T=!1),typeof q>"u"&&(q=s?"no":"yes"),typeof ie>"u"&&(ie="skip"));let Y={profile:U,profileScope:z,profileMode:de,setDefaultProfile:T,profilesSelected:F,installCodexCli:Me,installTools:A,toolsSelected:f,notify:q??(s?"no":"yes"),globalAgents:ie??"skip",notificationSound:ue,skills:H,skillsSelected:ve,webSearch:h,fileOpener:y,credentialsStore:w,tuiAlternateScreen:P,experimentalFeatures:L,suppressUnstableWarning:C,mode:"manual",installNode:e["install-node"]||"skip",shell:String(e.shell||"auto"),vscodeId:te?void 0:e.vscode?String(e.vscode):void 0,noVscode:te||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(c){B.log.info("Installing prerequisites and writing config..."),B.log.warn("Some steps may require sudo password or confirmation prompts.");try{await St(Y,st),B.log.success("Base install complete"),B.log.success("Install finished")}catch($){throw B.cancel(`Installation failed: ${$}`),$}await Ct();return}try{await St(Y,st),await Ct()}catch($){throw B.cancel(`Installation failed: ${$}`),$}}});async function Et(e){try{return await hn.access(e),!0}catch{return!1}}function zo(e){if(e==null)return;let t=String(e).toLowerCase();if(Rt(t))return t;if(t==="skip")return"skip";throw new Error("Invalid --profile value (use balanced|safe|yolo|skip).")}function qo(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 Ho(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 Yo(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="yes"||t==="no")return t;throw new Error("Expected yes|no")}function Jo(e){let t=String(e).trim().toLowerCase();if(t==="skip")return"skip";if(t==="disabled"||t==="cached"||t==="live")return t;throw new Error("Invalid --web-search value (use disabled|cached|live|skip).")}function Xo(e){let t=String(e).trim().toLowerCase();if(t==="skip")return"skip";if(t==="none")return"none";if(t==="cursor"||t==="vscode"||t==="vscode-insiders"||t==="windsurf")return t;throw new Error("Invalid --file-opener value (use cursor|vscode|vscode-insiders|windsurf|none|skip).")}function Qo(e){let t=String(e).trim().toLowerCase();if(t==="skip")return"skip";if(t==="auto"||t==="file"||t==="keyring")return t;throw new Error("Invalid --credentials-store value (use auto|file|keyring|skip).")}function Zo(e){let t=String(e).trim().toLowerCase();if(t==="skip")return"skip";if(t==="auto"||t==="always"||t==="never")return t;throw new Error("Invalid --alt-screen value (use auto|always|never|skip).")}function ei(e){let t=String(e).split(",").map(o=>o.trim().toLowerCase()).filter(Boolean),n=[];for(let o of t){if(o==="background-terminal"||o==="shell-snapshot"||o==="steering"){n.includes(o)||n.push(o);continue}throw new Error(`Unknown --experimental feature: ${o}`)}return n}function Rt(e){return e==="balanced"||e==="safe"||e==="yolo"}async function ti(e){try{let t=await hn.readFile(e,"utf8"),o=wn.parse(t).profile;return typeof o=="string"?o:void 0}catch(t){return}}import{defineCommand as ni}from"citty";import{promises as Le}from"fs";import{resolve as bn,dirname as oi}from"path";var ii=E();async function Nt(e){try{return await Le.access(e),!0}catch{return!1}}async function si(e,t){if(await Nt(t)){let o=`${t}.backup.${new Date().toISOString().replace(/[:.]/g,"").replace("T","_").slice(0,15)}`;await Le.copyFile(t,o)}await Le.mkdir(oi(t),{recursive:!0}),await Le.copyFile(e,t)}var kn=ni({meta:{name:"agents",description:"Write an AGENTS.md template"},args:{path:{type:"string",required:!0,description:"Target repo path or file"}},async run({args:e}){let t=String(e.path),n=bn(ii,"templates/agent-templates","AGENTS-default.md"),i=await Nt(t).then(async s=>s&&(await Le.stat(t)).isDirectory()).catch(()=>!1)?bn(t,"AGENTS.md"):t;if(!await Nt(n))throw new Error(`Template not found: ${n}`);await si(n,i),process.stdout.write(`Wrote ${i}
|
|
64
|
+
`)}});import{defineCommand as ri}from"citty";import{$ as ai}from"zx";import{resolve as li}from"path";var ci=E(),vn=ri({meta:{name:"doctor",description:"Run environment checks"},async run(){await ai`bash ${li(ci,"scripts/doctor.sh")}`}});import{defineCommand as pi}from"citty";import{$ as di}from"zx";import{resolve as ui}from"path";var fi=E(),Sn=pi({meta:{name:"uninstall",description:"Clean up aliases and config created by this tool"},async run(){await di`bash ${ui(fi,"scripts/uninstall.sh")}`}});import{defineCommand as le}from"citty";import{promises as De}from"fs";import{resolve as lt,dirname as mi}from"path";import gi from"os";var hi=E();function Oe(){let e=lt(gi.homedir(),".codex"),t=lt(e,"config.toml");return{CODEX_HOME:e,CFG:t}}async function je(e){return De.readFile(e,"utf8")}async function at(e,t){await De.mkdir(mi(e),{recursive:!0}),await De.writeFile(e,t,"utf8")}function Cn(e){let t=/^\[profiles\.(.+?)\]/gm,n=[],o;for(;o=t.exec(e);)n.push(o[1]);return n}function $n(e){return JSON.stringify(e)}function wi(e,t,n){let o=`[projects.${$n(t)}]`,i=e.split(/\r?\n/),s=-1;for(let a=0;a<i.length;a++)if(i[a].trim()===o){s=a;break}if(s===-1)return e.replace(/\s*$/,`
|
|
64
65
|
`)+`
|
|
65
66
|
${o}
|
|
66
67
|
trust_level = "${n}"
|
|
@@ -68,32 +69,32 @@ trust_level = "${n}"
|
|
|
68
69
|
`).replace(/\s*$/,`
|
|
69
70
|
`)}return i.splice(l,0,`trust_level = "${n}"`),i.join(`
|
|
70
71
|
`).replace(/\s*$/,`
|
|
71
|
-
`)}function
|
|
72
|
+
`)}function yi(e,t,n){let i=`[mcp_servers.${/^[A-Za-z0-9_-]+$/.test(t)?t:$n(t)}]`,s=e.split(/\r?\n/),l=-1;for(let r=0;r<s.length;r++)if(s[r].trim()===i){l=r;break}if(l===-1){let r=["",i];return n.command&&r.push(`command = ${JSON.stringify(n.command)}`),n.args&&r.push(`args = ${JSON.stringify(n.args)}`),n.url&&r.push(`url = ${JSON.stringify(n.url)}`),typeof n.enabled=="boolean"&&r.push(`enabled = ${n.enabled?"true":"false"}`),e.replace(/\s*$/,`
|
|
72
73
|
`)+r.join(`
|
|
73
74
|
`)+`
|
|
74
|
-
`}let a=(r,
|
|
75
|
+
`}let a=(r,c)=>{for(let d=l+1;d<s.length;d++){let p=s[d];if(/^\s*\[/.test(p)){s.splice(d,0,`${r} = ${c}`);return}if(new RegExp(`^\\s*${r}\\s*=`).test(p)){s[d]=`${r} = ${c}`;return}}s.push(`${r} = ${c}`)};return n.command&&a("command",JSON.stringify(n.command)),n.args&&a("args",JSON.stringify(n.args)),n.url&&a("url",JSON.stringify(n.url)),typeof n.enabled=="boolean"&&a("enabled",n.enabled?"true":"false"),s.join(`
|
|
75
76
|
`).replace(/\s*$/,`
|
|
76
|
-
`)}function
|
|
77
|
+
`)}function bi(e,t){let n=`profile = "${t}"`;if(/^profile\s*=\s*".*"/m.test(e))return e.replace(/^profile\s*=\s*".*"/m,n);let o=e.indexOf(`
|
|
77
78
|
`);return o===-1?n+`
|
|
78
79
|
`+e:e.slice(0,o+1)+n+`
|
|
79
|
-
`+e.slice(o+1)}var
|
|
80
|
-
`);return}if(i){let s=`${o}.backup.${Date.now()}`;await
|
|
81
|
-
`)}await
|
|
82
|
-
`)}}),profiles:
|
|
80
|
+
`+e.slice(o+1)}var xn=le({meta:{name:"config",description:"Manage Codex config profiles"},subCommands:{init:le({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=lt(hi,"templates/codex-config.toml"),n=await je(t),{CFG:o}=Oe(),i=await De.access(o).then(()=>!0).catch(()=>!1);if(i&&!e.force){process.stdout.write(`${o} exists. Use --force to overwrite.
|
|
81
|
+
`);return}if(i){let s=`${o}.backup.${Date.now()}`;await De.copyFile(o,s),process.stdout.write(`Backed up to ${s}
|
|
82
|
+
`)}await at(o,n),process.stdout.write(`Wrote ${o}
|
|
83
|
+
`)}}),profiles:le({meta:{name:"profiles",description:"List profiles in the current config"},async run(){let{CFG:e}=Oe(),t=await je(e),n=Cn(t);process.stdout.write(n.length?n.join(`
|
|
83
84
|
`)+`
|
|
84
85
|
`:`No profiles found
|
|
85
|
-
`)}}),"set-profile":
|
|
86
|
-
`)}}),trust:
|
|
87
|
-
`)}}),mcp:
|
|
88
|
-
`)}})}})}});import{defineCommand as
|
|
89
|
-
`)}}),install:
|
|
90
|
-
`);return}let n=
|
|
86
|
+
`)}}),"set-profile":le({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}=Oe(),n=await je(t),o=Cn(n),i=String(e.name);if(!o.includes(i))throw new Error(`Unknown profile: ${i}`);let s=bi(n,i);await at(t,s),process.stdout.write(`profile set to ${i}
|
|
87
|
+
`)}}),trust:le({meta:{name:"trust",description:"Mark a repo path as trusted (projects.<path>.trust_level)"},args:{path:{type:"string",description:"Path to trust (default: PWD)"}},async run({args:e}){let{CFG:t}=Oe(),n=await je(t),o=lt(String(e.path||process.cwd())),i=wi(n,o,"trusted");await at(t,i),process.stdout.write(`trusted: ${o}
|
|
88
|
+
`)}}),mcp:le({meta:{name:"mcp",description:"Manage [mcp_servers] entries in config.toml"},subCommands:{set:le({meta:{name:"set",description:"Add/update an MCP server entry"},args:{name:{type:"positional",required:!0,description:"Server name (table key)"},command:{type:"string",description:'Command to run (e.g. "node")'},args:{type:"string",description:'Comma-separated args (e.g. "server.js,--flag")'},url:{type:"string",description:"HTTP URL (for remote MCP)"},enabled:{type:"string",description:"true|false (optional)"}},async run({args:e}){let{CFG:t}=Oe(),n=await je(t),o=String(e.name),i=typeof e.args>"u"?void 0:String(e.args).split(",").map(a=>a.trim()).filter(Boolean),s=typeof e.enabled>"u"?void 0:String(e.enabled).trim().toLowerCase()==="true",l=yi(n,o,{command:typeof e.command>"u"?void 0:String(e.command),args:i,url:typeof e.url>"u"?void 0:String(e.url),enabled:typeof e.enabled>"u"?void 0:s});await at(t,l),process.stdout.write(`mcp server updated: ${o}
|
|
89
|
+
`)}})}})}});import{defineCommand as ki}from"citty";var In=ki({meta:{name:"update",description:"Check for and apply codex-1up updates"},args:{yes:{type:"boolean",description:"Non-interactive; apply updates without prompting"},"dry-run":{type:"boolean",description:"Print actions without making changes"},"skip-confirmation":{type:"boolean",description:"Skip prompts"}},async run({args:e}){let t=await be(),n=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes;await it({interactive:n,assumeYes:!!e.yes,skipConfirmation:!!e["skip-confirmation"],dryRun:!!e["dry-run"],logger:t.logger})}});import{defineCommand as ct}from"citty";var Tn=ct({meta:{name:"tools",description:"Manage developer tools"},subCommands:{list:ct({meta:{name:"list",description:"List known tools and installation status"},async run(){let e=await Pe();for(let t of e)process.stdout.write(`${t.id} ${t.installed?"\u2713":"\u2716"}
|
|
90
|
+
`)}}),install:ct({meta:{name:"install",description:"Install tools by id or all"},args:{tool:{type:"positional",required:!0,description:'Tool id or "all"'},"dry-run":{type:"boolean",description:"Print actions without making changes"}},async run({args:e}){let t=String(e.tool||"").trim().toLowerCase();if(!t)throw new Error("Tool id required");if(t==="all"){await kt("all",{dryRun:!!e["dry-run"]});return}let n=t.split(",").map(s=>s.trim()).filter(Boolean),o=Array.from(new Set(n)),i=o.filter(s=>!ae(s));if(i.length){let s=sn().join(", ");throw new Error(`Unknown tool id(s): ${i.join(", ")}. Known: ${s}`)}await kt(o,{dryRun:!!e["dry-run"]})}}),doctor:ct({meta:{name:"doctor",description:"Show missing tools and hints"},async run(){let t=(await Pe()).filter(o=>!o.installed).map(o=>o.id);if(t.length===0){process.stdout.write(`All tools are installed.
|
|
91
|
+
`);return}let n=re().map(o=>o.id).join(", ");process.stdout.write(`Missing tools: ${t.join(", ")}
|
|
91
92
|
`),process.stdout.write(`Known tools: ${n}
|
|
92
|
-
`)}})}});import{defineCommand as
|
|
93
|
+
`)}})}});import{defineCommand as pt}from"citty";var An=pt({meta:{name:"skills",description:"Manage bundled Agent Skills"},subCommands:{list:pt({meta:{name:"list",description:"List bundled and installed skills"},async run(){let e=E(),t=await xt(e),n=await ln();if(process.stdout.write(`Bundled skills:
|
|
93
94
|
`),t.length===0)process.stdout.write(` (none)
|
|
94
95
|
`);else for(let o of t)process.stdout.write(` ${o.id} \u2014 ${o.description}
|
|
95
96
|
`);if(process.stdout.write(`
|
|
96
97
|
Installed skills:
|
|
97
98
|
`),n.length===0)process.stdout.write(` (none)
|
|
98
99
|
`);else for(let o of n)process.stdout.write(` ${o.id}
|
|
99
|
-
`)}}),install:
|
|
100
|
+
`)}}),install:pt({meta:{name:"install",description:"Install bundled skills by id or all"},args:{name:{type:"positional",required:!0,description:'Skill id or "all"'},"dry-run":{type:"boolean",description:"Print actions without making changes"}},async run({args:e}){let t=String(e.name||"").trim();if(!t)throw new Error("Skill id required");if(t==="all"){await tt("all",void 0,{dryRun:!!e["dry-run"]});return}let n=E(),o=await xt(n),i=t.split(",").map(r=>r.trim()).filter(Boolean),s=new Set(o.map(r=>r.id)),l=new Set(o.map(r=>r.name)),a=i.filter(r=>!s.has(r)&&!l.has(r));if(a.length){let r=o.map(c=>c.id).join(", ")||"(none)";throw new Error(`Unknown skill(s): ${a.join(", ")}. Available: ${r}`)}await tt("select",i,{dryRun:!!e["dry-run"]})}}),refresh:pt({meta:{name:"refresh",description:"Reinstall bundled skills into ~/.codex/skills"},args:{"dry-run":{type:"boolean",description:"Print actions without making changes"}},async run({args:e}){await tt("all",void 0,{dryRun:!!e["dry-run"]})}})}});var Pn=vi({meta:{name:"codex-1up",version:ke,description:un},subCommands:{install:yn,agents:kn,doctor:vn,uninstall:Sn,config:xn,update:In,tools:Tn,skills:An}});Si(Pn);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# ~/.codex/config.toml — created by codex-1up
|
|
2
2
|
# Adjust to your liking. See Codex CLI docs for full options.
|
|
3
3
|
#
|
|
4
|
-
# This template is aligned to Codex CLI (codex-rs) v0.
|
|
4
|
+
# This template is aligned to Codex CLI (codex-rs) v0.92 config keys.
|
|
5
5
|
|
|
6
6
|
# Core (root defaults)
|
|
7
7
|
model = "gpt-5.2-codex"
|
|
@@ -9,8 +9,9 @@ approval_policy = "on-request" # untrusted|on-failure|on-request|never
|
|
|
9
9
|
sandbox_mode = "workspace-write" # read-only|workspace-write|danger-full-access
|
|
10
10
|
profile = "balanced" # active profile: balanced|safe|yolo
|
|
11
11
|
|
|
12
|
-
# Web search mode: disabled|cached|live (v0.88+).
|
|
13
|
-
#
|
|
12
|
+
# Web search mode: disabled|cached|live (v0.88+).
|
|
13
|
+
# Root `web_search` is a fallback default; `profiles.<name>.web_search` overrides it.
|
|
14
|
+
# `live` requires network access when using the workspace-write sandbox.
|
|
14
15
|
web_search = "live"
|
|
15
16
|
|
|
16
17
|
# Credential storage (recommended: auto)
|
|
@@ -20,6 +21,12 @@ mcp_oauth_credentials_store = "auto" # auto|file|keyring
|
|
|
20
21
|
# Optional: make citations clickable in your editor.
|
|
21
22
|
# file_opener = "cursor" # cursor|vscode|vscode-insiders|windsurf|none
|
|
22
23
|
|
|
24
|
+
# Optional: model personality (only supported by some models, e.g. gpt-5.2-codex).
|
|
25
|
+
# model_personality = "friendly" # friendly|pragmatic
|
|
26
|
+
#
|
|
27
|
+
# If personalities ever look "stuck" or "not applying", try clearing the remote models cache:
|
|
28
|
+
# rm -f ~/.codex/models_cache.json
|
|
29
|
+
|
|
23
30
|
# Reasoning output controls (root keys; default false)
|
|
24
31
|
show_raw_agent_reasoning = true
|
|
25
32
|
hide_agent_reasoning = false
|
|
@@ -42,15 +49,12 @@ alternate_screen = "auto"
|
|
|
42
49
|
[tools]
|
|
43
50
|
view_image = true
|
|
44
51
|
|
|
45
|
-
#
|
|
46
|
-
#
|
|
52
|
+
# Feature flags. These are exposed in Codex TUI's /experimental menu.
|
|
53
|
+
# Prefer leaving unset (Codex will use sensible defaults).
|
|
47
54
|
[features]
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
shell_snapshot = false
|
|
52
|
-
collab = false
|
|
53
|
-
collaboration_modes = false
|
|
55
|
+
# unified_exec = false # Background terminal - run long-running commands in background
|
|
56
|
+
# shell_snapshot = false # Snapshot shell env to speed up commands
|
|
57
|
+
# steer = false # Enter submits, Tab queues messages
|
|
54
58
|
|
|
55
59
|
# ---- Profiles (override only what differs from root) -----------------------
|
|
56
60
|
|