codex-1up 0.3.15 → 0.3.16
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 +47 -46
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -1,92 +1,93 @@
|
|
|
1
|
-
import{runMain as
|
|
1
|
+
import{runMain as mi}from"citty";import{defineCommand as gi}from"citty";import{defineCommand as Do}from"citty";import{resolve as Tt}from"path";import{promises as gn}from"fs";import*as ot from"os";import*as mn from"toml";import*as V from"@clack/prompts";import wo from"os";import{resolve as yo}from"path";import{promises as bo}from"fs";import*as on from"toml";import Xt from"fs-extra";import*as mt from"path";import*as Zt from"os";import{createWriteStream as Pn}from"fs";function Fe(e){let t=null;t=Pn(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 En,$ as Rn}from"zx";import{spawn as Nn}from"child_process";async function v(e){try{return await En(e),!0}catch{return!1}}function Nt(){return process.platform==="darwin"}async function Lt(){return await v("brew")?"brew":await v("apt-get")?"apt":await v("dnf")?"dnf":await v("pacman")?"pacman":await v("zypper")?"zypper":"none"}function ke(e){return process.platform==="win32"?{cmd:e,argsPrefix:[]}:typeof process.getuid=="function"&&process.getuid()===0?{cmd:e,argsPrefix:[]}:{cmd:"sudo",argsPrefix:[e]}}async function _t(e){if(await v("pnpm"))try{let n=(await Rn`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=Nn(e,t,{stdio:"inherit",cwd:n.cwd||process.cwd(),shell:!1});await new Promise((i,s)=>{o.on("error",s),o.on("exit",a=>{if(a===0)return i();s(new Error(`Command failed (${a}): ${e} ${t.join(" ")}`))})})}function M(e){let t=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5);return`${e}.backup.${t}`}import jt from"fs-extra";import*as Me from"path";import*as ve from"os";import*as ce from"@clack/prompts";async function Ot(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 Ln(e);break;case"brew":await _n(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 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=Me.join(e.homeDir,".nvm");if(!await jt.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 _n(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(ve.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=ve.platform()==="darwin"&&ve.arch()==="arm64"?"/opt/homebrew/bin/brew":"/usr/local/bin/brew";if(await jt.pathExists(n)){let o=Me.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 pt}from"zx";var dt="@openai/codex";async function Ge(e){let t=await On(),n=await jn(e),o=!!(t.found&&t.version&&n&&t.version!==n);return{found:t.found,version:t.version,latest:n,updateAvailable:o}}async function jn(e){try{let n=(await pt`npm view ${dt} 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 On(){if(!await v("codex"))return{found:!1};let t="";try{let n=await pt`codex --version`.quiet().nothrow();t=Dn(n.stdout||"")}catch(n){}if(!t)try{let n=await pt`npm ls -g ${dt} --depth=0 --json`.quiet().nothrow();t=JSON.parse(n.stdout||"{}").dependencies?.[dt]?.version||""}catch(n){}return{found:!0,version:t||void 0}}function Dn(e){let t=e.match(/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/);return t?t[1]:""}import*as We from"@clack/prompts";async function Be(e){let t=await _t(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 We.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 We.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 Dt="@openai/codex";async function Ft(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 Ge(e.logger);if(n.found){let r=n.version?`v${n.version}`:"unknown version";e.logger.info(`Found Codex CLI ${r}. Checking for newer version...`)}else e.logger.info("Codex CLI not found.");let o=!1,i=!1;if(n.found)if(n.updateAvailable){let r=n.latest?`v${n.latest}`:"a newer version";if(e.options.installCodexCli==="yes")i=!0;else if(t){let l=await fe.confirm({message:`Codex CLI ${n.version} found; latest is ${r}. Update now?`,initialValue:!0});fe.isCancel(l)?e.logger.info("Codex CLI update cancelled; keeping existing version."):l?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 r=await fe.confirm({message:"Codex CLI not found. Install now?",initialValue:!0});fe.isCancel(r)?e.logger.info("Codex CLI install cancelled."):r?o=!0:e.logger.info("Skipping Codex CLI install.")}else o=!0;let s=[];if((o||i)&&(n.latest?s.push(`${Dt}@${n.latest}`):s.push(Dt)),s.length===0)return;let a=await Be({logger:e.logger,interactive:process.stdout.isTTY&&!e.options.dryRun&&!e.options.skipConfirmation&&!e.options.assumeYes});a==="none"?e.logger.warn("Skipping global Node installs because no supported package manager was found."):a==="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 Mt=[{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"]}}],Fn=new Set(Mt.map(e=>e.id));function Gt(e){return Fn.has(e)}function ue(){return Mt}import*as ft from"path";import ct from"fs-extra";import{which as Mn}from"zx";async function Ue(e){if(e.options.installTools==="skip"){e.logger.info("Skipping developer tool installs (user choice)");return}let t=Gn(e.options.installTools,e.options.toolsSelected);if(t.length===0){e.logger.info("Skipping developer tool installs (no tools selected)");return}if(Nt()&&!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
|
-
`));return}let n=t.includes("gh")&&!await v("gh"),o=await
|
|
5
|
-
`))}function
|
|
6
|
-
`);try{await
|
|
7
|
-
`;async function
|
|
8
|
-
`,!0}setKey(t,n,o,i){let s=
|
|
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 ce}from"zx";import{which as En,$ as Rn}from"zx";import{spawn as Nn}from"child_process";async function v(e){try{return await En(e),!0}catch{return!1}}function Nt(){return process.platform==="darwin"}async function _t(){return await v("brew")?"brew":await v("apt-get")?"apt":await v("dnf")?"dnf":await v("pacman")?"pacman":await v("zypper")?"zypper":"none"}function ke(e){return process.platform==="win32"?{cmd:e,argsPrefix:[]}:typeof process.getuid=="function"&&process.getuid()===0?{cmd:e,argsPrefix:[]}:{cmd:"sudo",argsPrefix:[e]}}async function Lt(e){if(await v("pnpm"))try{let n=(await Rn`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 T(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=Nn(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 jt from"fs-extra";import*as Me from"path";import*as ve from"os";import*as fe from"@clack/prompts";async function Ot(e){let t=await v("node"),n=await v("npm");if(t&&n){let i=(await ce`node -v`).stdout.trim();e.logger.ok(`Node.js present (${i})`);return}switch(e.options.installNode){case"nvm":await _n(e);break;case"brew":await Ln(e);break;case"skip":e.logger.warn("Skipping Node installation; please install Node 18+ manually");return}if(await v("node")){let i=(await ce`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 _n(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=Me.join(e.homeDir,".nvm");if(!await jt.pathExists(n)){if(t){let i=await fe.confirm({message:"This will download and run the nvm installer script (from GitHub) and then install Node LTS. Continue?",initialValue:!0});if(fe.isCancel(i)||!i)throw new Error("Node installation aborted by user")}e.logger.info("Installing nvm..."),await ce`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 ce`bash -c ${o}`}async function Ln(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(ve.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 fe.confirm({message:"This will download and run the official Homebrew installer script (from GitHub). Continue?",initialValue:!0});if(fe.isCancel(o)||!o)throw new Error("Homebrew installation aborted by user")}await ce`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`;let n=ve.platform()==="darwin"&&ve.arch()==="arm64"?"/opt/homebrew/bin/brew":"/usr/local/bin/brew";if(await jt.pathExists(n)){let o=Me.dirname(n);process.env.PATH=`${o}:${process.env.PATH||""}`;try{let s=(await ce`${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 T("brew",["install","node"],{dryRun:e.options.dryRun,logger:e.logger})}import*as ue from"@clack/prompts";import{$ as pt}from"zx";var dt="@openai/codex";async function We(e){let t=await On(),n=await jn(e),o=!!(t.found&&t.version&&n&&t.version!==n);return{found:t.found,version:t.version,latest:n,updateAvailable:o}}async function jn(e){try{let n=(await pt`npm view ${dt} 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 On(){if(!await v("codex"))return{found:!1};let t="";try{let n=await pt`codex --version`.quiet().nothrow();t=Dn(n.stdout||"")}catch(n){}if(!t)try{let n=await pt`npm ls -g ${dt} --depth=0 --json`.quiet().nothrow();t=JSON.parse(n.stdout||"{}").dependencies?.[dt]?.version||""}catch(n){}return{found:!0,version:t||void 0}}function Dn(e){let t=e.match(/(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/);return t?t[1]:""}import*as Ge from"@clack/prompts";async function Be(e){let t=await Lt(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 Ge.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 Ge.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 Dt="@openai/codex";async function Ft(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 We(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 ue.confirm({message:`Codex CLI ${n.version} found; latest is ${a}. Update now?`,initialValue:!0});ue.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 ue.confirm({message:"Codex CLI not found. Install now?",initialValue:!0});ue.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(`${Dt}@${n.latest}`):s.push(Dt)),s.length===0)return;let l=await Be({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 T("pnpm",["add","-g",...s],{dryRun:e.options.dryRun,logger:e.logger})):(e.logger.info("Installing/updating Codex CLI via npm"),await T("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 Mt=[{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"]}}],Fn=new Set(Mt.map(e=>e.id));function Wt(e){return Fn.has(e)}function ge(){return Mt}import*as ft from"path";import ct from"fs-extra";import{which as Mn}from"zx";async function Ke(e){if(e.options.installTools==="skip"){e.logger.info("Skipping developer tool installs (user choice)");return}let t=Wn(e.options.installTools,e.options.toolsSelected);if(t.length===0){e.logger.info("Skipping developer tool installs (no tools selected)");return}if(Nt()&&!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
|
+
`));return}let n=t.includes("gh")&&!await v("gh"),o=await _t();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=ge().filter(l=>t.includes(l.id)),s=Gn(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 T("brew",["update"],{dryRun:e.options.dryRun,logger:e.logger}),await T("brew",["install",...s],{dryRun:e.options.dryRun,logger:e.logger});break;case"apt":{t.includes("gh")&&!await v("gh")&&await Un(e);let{cmd:l,argsPrefix:a}=ke("apt-get");e.logger.info("Running apt-get update...");try{await T(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 T(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}=ke("dnf");await T(l,[...a,"install","-y",...s],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"pacman":{let{cmd:l,argsPrefix:a}=ke("pacman");await T(l,[...a,"-Sy","--noconfirm",...s],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break;case"zypper":{let{cmd:l,argsPrefix:a}=ke("zypper");await T(l,[...a,"refresh"],{dryRun:e.options.dryRun,logger:e.logger}),await T(l,[...a,"install","-y",...s],{dryRun:e.options.dryRun,logger:e.logger}).catch(()=>{})}break}t.includes("fd")&&await Gt(e,"fdfind","fd"),t.includes("bat")&&await Gt(e,"batcat","bat"),await Bn(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(`
|
|
5
|
+
`))}function Wn(e,t){return e==="all"?ge().map(n=>n.id):e==="select"?t?[...t]:[]:[]}function Gn(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 Gt(e,t,n){if(!await v(t)||await v(n))return;let o=ft.join(e.homeDir,".local","bin");await ct.ensureDir(o);let i=ft.join(o,n);if(await ct.pathExists(i))return;let s=t;try{s=await Mn(t)}catch(l){}if(e.options.dryRun){e.logger.log(`[dry-run] ln -s ${s} ${i}`);return}await ct.symlink(s,i),e.logger.ok(`${n} alias created at ~/.local/bin/${n}`)}async function Bn(e,t){for(let n of t)await Kn(n)?e.logger.ok(`${n.id} \u2713`):e.logger.warn(`${n.id} not detected after install`)}async function Kn(e){for(let t of e.bins)if(await v(t))return!0;return!1}async function Un(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(`
|
|
6
|
+
`);try{await T("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 Se from"fs-extra";import*as qe from"path";var Ve={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:[]}},Vn=`# ~/.codex/config.toml \u2014 managed by codex-1up (patch mode)
|
|
7
|
+
`;async function Ut(e){let t=qe.join(e.homeDir,".codex","config.toml");await Se.ensureDir(qe.dirname(t));let n=await Se.pathExists(t),o=n?await Se.readFile(t,"utf8"):Vn,i=oo(o),s=io(i.toml),l=so(s.toml),a=new ut(l.toml),r=i.changed||s.changed||l.changed;if(r=zn(a,e.options.profileScope,e.options.profile,e.options.profileMode,e.options.profilesSelected)||r,r=qn(a,e.options.profile,e.options.setDefaultProfile)||r,r=Hn(a,e.options.notificationSound)||r,r=Yn(a,e)||r,r=Jn(a,e)||r,r=Xn(a,e)||r,r=Qn(a,e)||r,r=Zn(a,e)||r,r=to(a)||r,!r){e.logger.info("Config already up to date; no changes needed.");return}let p=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 ${p.length} bytes`);return}if(n){let c=M(t);await Se.copy(t,c),e.logger.info(`Backed up current config to ${c}`)}await Se.writeFile(t,p,"utf8"),e.logger.ok("Updated ~/.codex/config.toml with requested settings.")}function zn(e,t,n,o,i){let s=[];if(t==="all")s=Object.keys(Ve);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=Ve[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[p,c]of Object.entries(r.tables||{}))l=e.replaceTable(`profiles.${a}.${p}`,c)||l}else{e.ensureTable(`profiles.${a}`);for(let[p,c]of r.root)l=e.setKey(`profiles.${a}`,p,c,{mode:"if-missing"})||l;if(r.features.length>0){e.ensureTable(`profiles.${a}.features`);for(let[p,c]of r.features)l=e.setKey(`profiles.${a}.features`,p,c,{mode:"if-missing"})||l}for(let[p,c]of Object.entries(r.tables||{})){e.ensureTable(`profiles.${a}.${p}`);for(let[d,g]of c)l=e.setKey(`profiles.${a}.${p}`,d,g,{mode:"if-missing"})||l}}}return l}function qn(e,t,n){return!n||t==="skip"?!1:e.setRootKey("profile",`"${t}"`,{mode:"force"})}function Hn(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 Yn(e,t){let n=t.options.webSearch;if(!n||n==="skip")return!1;let o=Vt(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 Jn(e,t){let n=t.options.fileOpener;return!n||n==="skip"?!1:e.setRootKey("file_opener",`"${n}"`,{mode:"force"})}function Xn(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 Qn(e,t){let n=t.options.tuiAlternateScreen;return!n||n==="skip"?!1:(e.ensureTable("tui"),e.setKey("tui","alternate_screen",`"${n}"`,{mode:"force"}))}function Zn(e,t){let n=Vt(t.options.profileScope,t.options.profile,t.options.profilesSelected);if(n.length===0)return!1;let o=[{key:"tui2",enabled:!!t.options.enableTui2}];for(let l of t.options.experimentalFeatures||[])l==="background-terminal"?o.push({key:"shell_tool",enabled:!0}):l==="shell-snapshot"?o.push({key:"shell_snapshot",enabled:!0}):l==="multi-agents"?o.push({key:"collab",enabled:!0}):l==="steering"?o.push({key:"steer",enabled:!0}):l==="collaboration-modes"?o.push({key:"collaboration_modes",enabled:!0}):l==="child-agent-project-docs"&&o.push({key:"child_agents_md",enabled:!0});let i=o.filter(l=>l.enabled);if(i.length===0)return!1;let s=!1;for(let l of n){e.ensureTable(`profiles.${l}.features`);for(let{key:a}of i)s=e.setKey(`profiles.${l}.features`,a,"true",{mode:"force"})||s}return s}function Vt(e,t,n){return e==="all"?Object.keys(Ve):e==="selected"?n||[]:t==="skip"?[]:[t]}var ut=class{text;constructor(t){this.text=t||""}content(){return no(this.text)}ensureTable(t){if(this.hasTable(t))return!1;let n=this.text.length===0?"":ze(this.text);return this.text=n+`[${t}]
|
|
8
|
+
`,!0}setKey(t,n,o,i){let s=me(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*${J(n)}\\s*=.*$`,"m").exec(l);if(r){if(i.mode==="if-missing")return!1;let S=this.text,N=s.start+r.index,O=N+r[0].length;return this.text=S.slice(0,N)+`${n} = ${o}`+S.slice(O),this.text!==S}let p=this.text,c=s.end,d=p.slice(0,c),g=p.slice(c),m=d.length>0&&!d.endsWith(`
|
|
9
9
|
`),k=g.length>0&&!g.startsWith(`
|
|
10
10
|
`),b=`${m?`
|
|
11
11
|
`:""}${n} = ${o}
|
|
12
12
|
${k?`
|
|
13
|
-
`:""}`;return this.text=d+b+g,this.text!==p}getValue(t,n){let o=
|
|
13
|
+
`:""}`;return this.text=d+b+g,this.text!==p}getValue(t,n){let o=me(this.text,t);if(!o)return;let i=this.text.slice(o.start,o.end),l=new RegExp(`^\\s*${J(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*${J(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
14
|
`),i=`[${t}]
|
|
15
15
|
${o}
|
|
16
16
|
|
|
17
|
-
`,s=this.text,
|
|
18
|
-
`),d=
|
|
19
|
-
`),m=`${
|
|
17
|
+
`,s=this.text,l=me(this.text,t);if(!l){let a=s.length===0?"":ze(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*${J(t)}\\s*=.*$`,"m").exec(s);if(a){if(o.mode==="if-missing")return!1;let k=this.text,b=i.start+a.index,S=b+a[0].length;return this.text=k.slice(0,b)+`${t} = ${n}`+k.slice(S),this.text!==k}let r=this.text,p=i.end,c=p>0&&!r.slice(0,p).endsWith(`
|
|
18
|
+
`),d=r.slice(p),g=d.length>0&&!d.startsWith(`
|
|
19
|
+
`),m=`${c?`
|
|
20
20
|
`:""}${t} = ${n}
|
|
21
21
|
${g?`
|
|
22
|
-
`:""}`;return this.text=
|
|
22
|
+
`:""}`;return this.text=r.slice(0,p)+m+d,this.text!==r}hasTable(t){return me(this.text,t)!==null}};function me(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 J(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function eo(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 Ue(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 to(e){let t=!1,n=Ue(e.getRootValue("model"));if(Kt(n)){let s=Ue(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(Ve),...eo(o)]);for(let s of i){let l=`profiles.${s}`,a=Ue(e.getValue(l,"model"));if(!Kt(a))continue;let r=Ue(e.getValue(l,"model_reasoning_summary"));r&&r!=="detailed"&&(t=e.setKey(l,"model_reasoning_summary",'"detailed"',{mode:"force"})||t)}return t}function no(e){return e.endsWith(`
|
|
23
23
|
`)?e:e+`
|
|
24
24
|
`}function ze(e){let t=e;return t.endsWith(`
|
|
25
25
|
`)||(t+=`
|
|
26
26
|
`),t.endsWith(`
|
|
27
27
|
|
|
28
28
|
`)||(t+=`
|
|
29
|
-
`),t}function oo(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=d=>d==="features"||/^profiles\.[^.]+\.features$/.test(d),
|
|
30
|
-
`);if(
|
|
29
|
+
`),t}function oo(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=d=>d==="features"||/^profiles\.[^.]+\.features$/.test(d),l=new Set;for(let d of o){let g=d.match(/^\s*\[([^\]]+)\]\s*$/);if(g){i=g[1].trim();continue}/^\s*#/.test(d)||s(i)&&new RegExp(`^\\s*${n}\\s*=`).test(d)&&l.add(i)}i="";let a=!1,r,p=[];for(let d of o){let g=d.match(/^\s*\[([^\]]+)\]\s*$/);if(g){i=g[1].trim(),p.push(d);continue}if(!/^\s*#/.test(d)){if(i===""){let m=d.match(new RegExp(`^\\s*${t}\\s*=\\s*(.+?)\\s*$`));if(m){r=m[1],a=!0;continue}}if(s(i)&&new RegExp(`^\\s*${t}\\s*=`).test(d)){if(l.has(i)){a=!0;continue}p.push(d.replace(new RegExp(`^(\\s*)${t}(\\s*=\\s*)`),`$1${n}$2`)),a=!0;continue}}p.push(d)}let c=p.join(`
|
|
30
|
+
`);if(r!==void 0){let d=me(c,"features");if(!(()=>{if(!d)return!1;let m=c.slice(d.start,d.end);return new RegExp(`^\\s*${n}\\s*=`,"m").test(m)})()){let m=`${n} = ${r}`;if(d){let k=c.slice(0,d.end),b=c.slice(d.end),S=k.length>0&&!k.endsWith(`
|
|
31
31
|
`),N=b.length>0&&!b.startsWith(`
|
|
32
|
-
`);
|
|
32
|
+
`);c=k+`${S?`
|
|
33
33
|
`:""}${m}
|
|
34
34
|
${N?`
|
|
35
|
-
`:""}`+b}else
|
|
35
|
+
`:""}`+b}else c=(c.length===0?"":ze(c))+`[features]
|
|
36
36
|
${m}
|
|
37
|
-
`;
|
|
38
|
-
`);if(Object.keys(
|
|
37
|
+
`;a=!0}}return{toml:c,changed:a}}function io(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(c=>e.includes(c.oldKey)))return{toml:e,changed:!1};function o(c){let d=c.trim(),g=/^(true|false)\b/i.exec(d);return g?g[1].toLowerCase():d||void 0}let i=e.split(/\r?\n/),s="",l={},a=[],r=!1;for(let c of i){let d=c.match(/^\s*\[([^\]]+)\]\s*$/);if(d){s=d[1].trim(),a.push(c);continue}if(s===""&&!/^\s*#/.test(c)){let g=!1;for(let{oldKey:m,newKey:k}of t){let b=c.match(new RegExp(`^\\s*${J(m)}\\s*=\\s*(.+?)\\s*$`));if(b){let S=o(b[1]);k&&S!==void 0&&(l[k]=S),r=!0,g=!0;break}}if(g)continue}a.push(c)}let p=a.join(`
|
|
38
|
+
`);if(Object.keys(l).length===0)return{toml:p,changed:r};for(let{newKey:c}of t){if(!c)continue;let d=l[c];if(d===void 0)continue;let g=me(p,"features");if((()=>{if(!g)return!1;let b=p.slice(g.start,g.end);return new RegExp(`^\\s*${J(c)}\\s*=`,"m").test(b)})())continue;let k=`${c} = ${d}`;if(g){let b=p.slice(0,g.end),S=p.slice(g.end),N=b.length>0&&!b.endsWith(`
|
|
39
39
|
`),O=S.length>0&&!S.startsWith(`
|
|
40
40
|
`);p=b+`${N?`
|
|
41
41
|
`:""}${k}
|
|
42
42
|
${O?`
|
|
43
43
|
`:""}`+S}else p=(p.length===0?"":ze(p))+`[features]
|
|
44
44
|
${k}
|
|
45
|
-
`;
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
`;r=!0}return{toml:p,changed:r}}function so(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=p=>p==="features"||/^profiles\.[^.]+\.features$/.test(p),l=new Set;for(let p of o){let c=p.match(/^\s*\[([^\]]+)\]\s*$/);if(c){i=c[1].trim();continue}/^\s*#/.test(p)||s(i)&&new RegExp(`^\\s*${J(n)}\\s*=`).test(p)&&l.add(i)}i="";let a=!1,r=[];for(let p of o){let c=p.match(/^\s*\[([^\]]+)\]\s*$/);if(c){i=c[1].trim(),r.push(p);continue}if(!/^\s*#/.test(p)&&s(i)&&new RegExp(`^\\s*${J(t)}\\s*=`).test(p)){if(l.has(i)){a=!0;continue}r.push(p.replace(new RegExp(`^(\\s*)${J(t)}(\\s*=\\s*)`),`$1${n}$2`)),a=!0;continue}r.push(p)}return{toml:r.join(`
|
|
46
|
+
`),changed:a}}import W from"fs-extra";import*as he from"path";async function zt(e){let t=he.join(e.homeDir,".codex","notify.sh"),n=he.join(e.rootDir,"templates","notification.sh");await W.ensureDir(he.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=he.join(e.homeDir,".codex","config.toml");await W.pathExists(i)?await ro(i,t,e):e.logger.warn(`Config not found at ${i}; run again after config is created`)}async function ro(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 d=0;d<i.length;d++){let g=i[d],m=g.match(/^\s*\[([^\]]+)\]\s*$/);if(m){s=m[1],s==="tui"&&(a=d);continue}let k=/^\s*notify\s*=\s*\[/.test(g),b=/^\s*tui\.notifications\s*=/.test(g),S=/^\s*notifications\s*=/.test(g);k&&(s===""?l===null&&(l=d):/^profiles\.[^.]+\.features$/.test(s)&&(i.splice(d,1),d--)),b&&/^profiles\.[^.]+\.features$/.test(s)&&(i.splice(d,1),d--),S&&s===""&&(i.splice(d,1),d--)}function r(d){let g=0;for(;g<i.length&&/^\s*(#.*)?$/.test(i[g]);)g++;i.splice(g,0,d)}if(l!==null){let d=i[l].match(/^(\s*notify\s*=\s*\[)([^\]]*)\]/);if(d){let g=d[2].trim();if(!g.includes(JSON.stringify(t))){let k=g&&!g.endsWith(",")?", ":"";i[l]=`${d[1]}${g}${k}${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 p=!1;if(a!==null){let d=a+1,g=!1;for(;d<i.length;d++){let m=i[d];if(/^\s*\[/.test(m))break;if(/^\s*notifications\s*=/.test(m)){i[d]="notifications = true",g=!0,p=!0;break}}g||(i.splice(a+1,0,"notifications = true"),p=!0)}p||r(`[tui]
|
|
47
|
+
notifications = true`);let c=[];s="";for(let d=0;d<i.length;d++){let g=i[d],m=g.match(/^\s*\[([^\]]+)\]\s*$/);if(m){s=m[1],c.push(g);continue}/^\s*tui\.notifications\s*=/.test(g)||/^\s*notifications\s*=/.test(g)&&s!=="tui"||c.push(g)}await W.writeFile(e,c.join(`
|
|
48
|
+
`),"utf8")}import X from"fs-extra";import*as _ from"path";async function qt(e){let t=_.join(e.rootDir,"sounds"),n=_.join(e.homeDir,".codex","sounds");await X.ensureDir(n);let o=e.options.notificationSound;if(o==="none"){let p=_.join(e.homeDir,".codex","notify.sh");if(await X.pathExists(p)){let c=await X.readFile(p,"utf8"),d=c.replace(/^DEFAULT_CODEX_SOUND=.*$/m,'DEFAULT_CODEX_SOUND=""');e.options.dryRun?e.logger.log(`[dry-run] patch ${p} DEFAULT_CODEX_SOUND -> empty`):d!==c&&await X.writeFile(p,d,"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 X.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 X.copy(i,a));let r=_.join(e.homeDir,".codex","notify.sh");if(await X.pathExists(r)){let p=await X.readFile(r,"utf8"),c=`DEFAULT_CODEX_SOUND="${a}"`,d=p.replace(/^DEFAULT_CODEX_SOUND=.*$/m,c);d!==p&&(e.options.dryRun?e.logger.log(`[dry-run] patch ${r} DEFAULT_CODEX_SOUND -> ${a}`):await X.writeFile(r,d,"utf8"))}e.logger.ok("Notification sound configured")}import j from"fs-extra";import*as oe from"path";async function Ht(e){let t=oe.join(e.homeDir,".codex","AGENTS.md"),n=e.options.globalAgents;if(n==="skip"){e.logger.info("Skipping global AGENTS.md creation");return}let o=oe.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(!await j.pathExists(o)){e.logger.warn(`Template not found at ${o}`);return}switch(n){case"create-default":{if(await j.pathExists(t)){e.logger.info("Global AGENTS.md already exists; leaving unchanged");return}await j.ensureDir(oe.dirname(t)),e.options.dryRun?e.logger.log(`[dry-run] cp ${o} ${t}`):await j.copy(o,t),e.logger.ok(`Wrote ${t}`);break}case"overwrite-default":{if(await j.ensureDir(oe.dirname(t)),await j.pathExists(t)){let i=M(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${i}`):await j.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 j.copy(o,t),e.logger.ok(`Wrote ${t}`);break}case"append-default":{if(await j.ensureDir(oe.dirname(t)),await j.pathExists(t)){let s=M(t);e.options.dryRun?e.logger.log(`[dry-run] cp ${t} ${s}`):await j.copy(t,s),e.logger.info(`Backed up existing AGENTS.md to: ${s}`)}let i=await j.readFile(o,"utf8");e.options.dryRun?e.logger.log(`[dry-run] append template to ${t}`):await j.appendFile(t,`
|
|
48
49
|
---
|
|
49
50
|
|
|
50
|
-
${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 Yt(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 v("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
|
|
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 Yt(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 v("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 T("code",["--install-extension",t,"--force"],{dryRun:!1,logger:e.logger}),e.logger.ok(`VS Code extension '${t}' installed (or already present)`)}import Ce from"fs-extra";import*as $e from"path";async function Jt(e){let t=e.options.agentsMd;if(!t)return;let n=t;(await Ce.stat(n).catch(()=>null))?.isDirectory()&&(n=$e.join(n,"AGENTS.md"));let o=$e.join(e.rootDir,"templates","agent-templates","AGENTS-default.md");if(await Ce.pathExists(n)){e.logger.warn(`${n} already exists`);let i=M(n);e.options.dryRun?e.logger.log(`[dry-run] cp ${n} ${i}`):await Ce.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 Ce.ensureDir($e.dirname(n)),await Ce.copy(o,n),e.logger.ok("Wrote AGENTS.md"))}import te from"fs-extra";import*as xe from"path";import*as Je from"@clack/prompts";import gt from"fs-extra";import*as He from"path";async function Ye(e){let t=He.join(e,"templates","skills"),n=await gt.readdir(t,{withFileTypes:!0}).catch(()=>[]),o=[];for(let i of n){if(!i.isDirectory())continue;let s=i.name,l=He.join(t,s),a=He.join(l,"SKILL.md");if(!await gt.pathExists(a))continue;let r=await gt.readFile(a,"utf8").catch(()=>""),p=ao(r);!p?.name||!p?.description||o.push({id:s,name:p.name,description:p.description,srcDir:l})}return o.sort((i,s)=>i.id.localeCompare(s.id)),o}function ao(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 p=l.slice(a+1).trim();p&&(p=po(lo(p)),i[r]=p)}return{name:i.name,description:i.description}}function lo(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 po(e){let t=e.trim();return t.length>=2&&(t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))?t.slice(1,-1):t}async function Xe(e){let t=e.options.skills;if(t==="skip"){e.logger.info("Skipping bundled skills installation");return}let n=await Ye(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=xe.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 te.ensureDir(i),e.logger.info(`Installing ${o.length} skill(s) into: ${i}`);let l=[];for(let a of o){let r=xe.join(i,a.id);if(await te.pathExists(r)){if(s){let d=await Je.select({message:`Skill "${a.id}" already exists. Overwrite? (backup created)`,options:[{label:"Overwrite",value:"overwrite"},{label:"Skip",value:"skip"}],initialValue:"overwrite"});if(Je.isCancel(d)||d==="skip"){e.logger.info(`Skipping existing skill: ${a.id}`);continue}}let c=M(r);e.options.dryRun?(e.logger.log(`[dry-run] cp -R ${r} ${c}`),e.logger.log(`[dry-run] rm -rf ${r}`)):(await te.copy(r,c),await te.remove(r)),e.logger.info(`Backed up existing skill ${a.id} to: ${c}`)}e.options.dryRun?e.logger.log(`[dry-run] cp -R ${a.srcDir} ${r}`):await te.copy(a.srcDir,r),e.logger.ok(`Installed skill: ${a.id}`),l.push(a.id)}if(l.length>0){let a=xe.join(e.homeDir,".codex","config.toml");await te.pathExists(a)?await co(a,l,e):e.logger.info(`Config not found at ${a}; skipping skills.config entries`)}}async function co(e,t,n){let o=t.map(p=>xe.join(n.homeDir,".codex","skills",p,"SKILL.md"));if(n.options.dryRun){n.logger.log(`[dry-run] update ${e} (add skills.config entries)`);return}let i=await te.readFile(e,"utf8"),s=o.filter(p=>!i.includes(`path = "${p}"`));if(s.length===0)return;let l=/^\s*\[skills\]\s*$/m.test(i),a=[];l||a.push("[skills]");for(let p of s)a.push("[[skills.config]]"),a.push("enabled = true"),a.push(`path = "${p}"`),a.push("");let r=i.replace(/\s*$/,`
|
|
51
52
|
|
|
52
|
-
`)+
|
|
53
|
+
`)+a.join(`
|
|
53
54
|
`).trimEnd()+`
|
|
54
|
-
`;await
|
|
55
|
+
`;await te.writeFile(e,r,"utf8"),n.logger.ok(`Registered ${s.length} skill(s) in config (skills.config)`)}var Qt="codex-1up";async function en(e,t){let n=Zt.homedir(),o=mt.join(n,`.${Qt}`);await Xt.ensureDir(o);try{await Xt.chmod(o,448)}catch{}let i=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),s=mt.join(o,`install-${i}.log`),l=Fe(s);l.info(`==> ${Qt} installer`),l.info(`Log: ${s}`);let a={cwd:process.cwd(),homeDir:n,rootDir:t,logDir:o,logFile:s,options:e,logger:l};try{await Ot(a),await Ft(a),await Ke(a);let p=await v("codex")||a.options.installCodexCli==="yes";p||l.warn("Codex CLI not found and codex install was skipped; skipping config/notify setup until codex is installed."),p&&(await Ut(a),await zt(a),await qt(a),await Ht(a)),await Xe(a),await Yt(a),await Jt(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 mo from"os";import*as wt from"path";import{promises as tn}from"fs";import{accessSync as fo}from"fs";import{dirname as uo,resolve as ht}from"path";import{fileURLToPath as go}from"url";function R(e=import.meta.url){let t=uo(go(e)),n=t;for(let o=0;o<6;o++){try{return fo(ht(n,"templates","codex-config.toml")),n}catch{}n=ht(n,"..")}return ht(t,"..")}function ho(){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 we(e={}){let t=mo.homedir(),n=wt.join(t,".codex-1up");await tn.mkdir(n,{recursive:!0});try{await tn.chmod(n,448)}catch{}let o=new Date().toISOString().replace(/[:.]/g,"-").slice(0,-5),i=wt.join(n,`command-${o}.log`),s=Fe(i),l=ho();return{cwd:process.cwd(),homeDir:t,rootDir:R(),logDir:n,logFile:i,options:{...l,...e},logger:s}}function ie(){return ge()}function se(e){return Wt(e)}function nn(){return ie().map(e=>e.id)}async function Ie(){let e=ge(),t=[];for(let n of e){let o=await bt(n.bins);t.push({id:n.id,installed:o})}return t}async function yt(e,t={}){let n=e==="all",o={installTools:n?"all":"select",toolsSelected:n?void 0:e,dryRun:!!t.dryRun},i=await we(o);await Ke(i)}async function bt(e){for(let t of e)if(await v(t))return!0;return!1}async function kt(e,t){let n=t||R();await en(e,n)}async function vt(){let e=wo.homedir(),t=yo(e,".codex","config.toml"),n,o=[];try{let p=await bo.readFile(t,"utf8"),c=on.parse(p);n=typeof c.profile=="string"?c.profile:void 0;let d=c.profiles&&typeof c.profiles=="object"?c.profiles:{};o=Object.keys(d)}catch(p){}let i=ie(),s=[{id:"codex",bins:["codex"]},...i],a=(await Promise.all(s.map(async p=>{let c=await bt(p.bins);return[p.id,c]}))).filter(([,p])=>p).map(([p])=>p),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(`
|
|
55
56
|
`)+`
|
|
56
|
-
`)}import
|
|
57
|
-
`)),d==="single"){if(!
|
|
58
|
-
`),H=xt(t,"templates","agent-templates","AGENTS-default.md"),
|
|
59
|
-
`));;){let
|
|
57
|
+
`)}import ko from"fs-extra";import vo from"os";import sn from"path";async function St(e){return Ye(e)}var Ct=St;async function rn(){let e=sn.join(vo.homedir(),".codex","skills");return(await ko.readdir(e,{withFileTypes:!0}).catch(()=>[])).filter(n=>n.isDirectory()).map(n=>({id:n.name,path:sn.join(e,n.name)})).sort((n,o)=>n.id.localeCompare(o.id))}async function Qe(e,t,n={}){let o=await we({skills:e,skillsSelected:t,dryRun:!!n.dryRun});await Xe(o)}import{existsSync as So,readFileSync as Co}from"fs";import{dirname as ln,join as an}from"path";import{fileURLToPath as $o}from"url";var xo=ln($o(import.meta.url)),pn=(e,t=!1)=>{try{return JSON.parse(Co(e,"utf-8"))}catch(n){if(t)return{};throw n}},Io=e=>!!(e.name==="codex-1up"||e.bin==="codex-1up"||e.bin&&typeof e.bin=="object"&&"codex-1up"in e.bin),To=e=>{let t=e,n=null;for(;;){let o=an(t,"package.json");if(So(o)){n||(n=o);let s=pn(o,!0);if(Io(s))return o}let i=ln(t);if(i===t)break;t=i}return n??an(e,"package.json")},Ao=To(xo),$t=pn(Ao),Ze=$t.name||"codex-1up",ye=$t.version||"0.0.0",dn=$t.description||"Codex CLI helper";import{promises as It}from"fs";import{resolve as xt}from"path";import*as u from"@clack/prompts";import{$ as Te,which as Ae}from"zx";import*as et from"@clack/prompts";async function Po(){let e=ye,t=await Eo(Ze),n=!!(t&&Ro(t,e));return{current:e,latest:t,updateAvailable:n}}async function tt(e){let t=e.logger,n=await Po();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 et.confirm({message:`New codex-1up version available (v${n.latest}). Update now?`,initialValue:!0});if(et.isCancel(r))return t?.info("Update canceled."),"skipped";i=!!r}if(!i)return t?.info("Skipping codex-1up update."),"skipped";let s=await Be({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?`${Ze}@${n.latest}`:Ze,a=!!e.dryRun;return s==="pnpm"?(t?.info("Updating codex-1up via pnpm"),await T("pnpm",["add","-g",l],{dryRun:a,logger:t})):(t?.info("Updating codex-1up via npm"),await T("npm",["install","-g",l],{dryRun:a,logger:t})),t?.ok(`codex-1up updated to v${n.latest}`),"updated"}async function Eo(e){try{let t=await fetch(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`);return t.ok?(await t.json()).version:void 0}catch{return}}function Ro(e,t){let n=cn(e),o=cn(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 cn(e){let t=e.match(/(\d+)\.(\d+)\.(\d+)/);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}async function fn(e){return We(e)}var No=["balanced","safe","yolo"];async function un(e){let{repoRoot:t,isUnixLike:n,globalAgentsExists:o,currentProfile:i,seededProfile:s,bundledSkills:l,availableTools:a,cliArgs:r}=e,{profileChoice:p,profileMode:c,profileScope:d,setDefaultProfile:g,profilesSelected:m,installTools:k,toolsSelected:b,installCodexCli:S,notifyAction:N,globalAgentsAction:O,notificationSound:G,skillsMode:ae,skillsSelected:Q,webSearch:B,fileOpener:Z,credentialsStore:D,enableTui2:le,tuiAlternateScreen:z,experimentalFeatures:pe}=e.selections;await tt({interactive:!0,assumeYes:!1,skipConfirmation:!1,dryRun:!1,logger:{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)}});let x=await fn();if(x.found){let f=x.version?`v${x.version}`:"unknown version";x.latest?x.updateAvailable?u.log.info(`Codex CLI detected (${f}). Newer version available: v${x.latest}.`):u.log.info(`Codex CLI detected (${f}). Latest: v${x.latest}.`):u.log.info(`Codex CLI detected (${f}).`)}else u.log.info("Codex CLI not detected.");if(S==="no")x.found?x.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(x.found){if(x.updateAvailable){let f=await u.confirm({message:`Codex CLI ${x.version} found; latest is ${x.latest}. Update now?`,initialValue:!0});if(u.isCancel(f))return A();S=f?"yes":"no"}}else{let f=await u.confirm({message:"Codex CLI not found. Install now?",initialValue:!0});if(u.isCancel(f))return A();S=f?"yes":"no"}if(n&&!r.toolsArg){let f=await Ie(),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 A();if(k=w,w!=="select"){b=void 0;break}u.log.info("Tip: press Esc to go back.");let P=await Pe({message:"Select tools to install",options:a.map(C=>{let I=h.includes(C.id);return{label:C.id,value:C.id,hint:I?"installed":"missing"}})});if(P==="back")continue;let L=Array.isArray(P)?P.map(C=>String(C).trim().toLowerCase()).filter(se):[];L.length===0?(k="skip",b=void 0):b=Array.from(new Set(L));break}}else!n&&!r.toolsArg&&(k="skip",b=void 0);let ne=[{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 A();if(f==="skip"){d="selected",m=[],p="skip";break}if(f!=="selected"){d=f;break}u.log.info("Tip: press Esc to go back.");let h=await Pe({message:"Select profiles to install",options:ne.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(Ee):[],w=Array.from(new Set(y));d="selected",w.length===0?(m=[],p="skip"):m=w;break}if(d!=="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(`
|
|
58
|
+
`)),d==="single"){if(!r.profileChoice){let f=await u.select({message:"Choose a Codex profile to install",options:[...ne,{label:"Skip (no profile changes)",value:"skip"}],initialValue:jo(i)});if(u.isCancel(f))return A();p=f}}else if(d==="selected"){if(m===void 0){u.log.info("Tip: press Esc to go back.");let f=await Pe({message:"Select profiles to install",options:ne.map(h=>({label:h.label,value:h.value,hint:h.hint}))});if(f==="back")m=[],p="skip";else{let h=Array.isArray(f)?f.map(w=>String(w).trim().toLowerCase()).filter(Ee):[],y=Array.from(new Set(h));y.length===0?(m=[],p="skip"):m=y}}(m||[]).length>0&&Ee(p)&&!m.includes(p)&&(p=m[0])}else d==="all"&&p==="skip"&&(p=s);let E=d==="all"?[...No]:d==="selected"?m||[]:p==="skip"?[]:[p];if(E.length>0&&!r.profileMode){let f=await u.select({message:d==="all"?"How should we write all profiles?":E.length>1?"How should we write selected profiles?":`How should we write profiles.${E[0]}?`,options:[{label:"Overwrite (use codex-1up defaults)",value:"overwrite"},{label:"Add Merge (add missing, keep your default settings)",value:"add"}],initialValue:c});if(u.isCancel(f))return A();c=f}if(E.length>0&&!r.webSearchArg){let f=await u.select({message:"Web search mode (for selected 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:B&&B!=="skip"?B:"live"});if(u.isCancel(f))return A();B=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:Z&&Z!=="skip"?Z:"skip"});if(u.isCancel(f))return A();Z=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:D&&D!=="skip"?D:"auto"});if(u.isCancel(f))return A();D=f}if(typeof r.tui2Arg>"u"){let f=await u.confirm({message:"Enable TUI2 (experimental UI path in Codex)?",initialValue:le});if(u.isCancel(f))return A();le=!!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:z&&z!=="skip"?z:"auto"});if(u.isCancel(f))return A();z=f}if(!r.experimentalArg){u.log.info("Optional experimental feature toggles (Codex v0.88+)"),u.log.info("Tip: press Esc to go back.");let f=await Pe({message:"Enable experimental features (optional)",options:[{label:"Background terminal",value:"background-terminal"},{label:"Shell snapshot",value:"shell-snapshot"},{label:"Multi-agents (spawn other agents)",value:"multi-agents"},{label:"Steer conversation",value:"steering"},{label:"Collaboration modes (Plan/Pair/Execute)",value:"collaboration-modes"},{label:"Child-agent project docs (extra AGENTS.md guidance)",value:"child-agent-project-docs"}]});f==="back"?pe=void 0:pe=(Array.isArray(f)?f.map(y=>String(y).trim()).filter(Boolean):[]).filter(Oo)}if(E.length===0)g=!1;else if(E.length===1){let f=E[0],h=await u.confirm({message:`Wrote profiles.${f} to ~/.codex/config.toml (mode: ${c}). Set this as the default profile?`,initialValue:!0});if(u.isCancel(h))return A();g=!!h,g&&(p=f)}else{let f=[{label:"Keep current default (skip)",value:"skip"},...E.map(w=>({label:w==="balanced"?"Balanced":w==="safe"?"Safe":"YOLO",value:w}))],h=Ee(p)&&E.includes(p)?p:E[0],y=await u.select({message:"Select a default profile (optional)",options:f,initialValue:h});if(u.isCancel(y))return A();y==="skip"?g=!1:(g=!0,p=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 de=w;let f=xt(t,"sounds"),h=[];try{h=(await It.readdir(f)).filter(C=>/\.(wav|mp3|ogg)$/i.test(C)).sort()}catch(C){}N="yes";let y=h.includes("noti_1.wav")?"noti_1.wav":h[0]||"none";async function P(C){let I=await u.text({message:"Enter absolute path to a .wav file",placeholder:C||"/absolute/path/to/sound.wav",validate(F){if(!F)return"Path required";if(!F.startsWith("/"))return"Use an absolute path";if(!/(\.wav|\.mp3|\.ogg)$/i.test(F))return"Supported: .wav, .mp3, .ogg"}});if(u.isCancel(I))return null;try{await It.access(String(I))}catch{return u.log.warn("File not found. Try again."),await P(String(I))}return String(I)}let L=await u.select({message:"Notification sound",options:w(),initialValue:y});if(u.isCancel(L))return A();if(L==="skip")N="no",G=void 0;else if(L==="custom"){let C=await P();if(C===null)return A();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 A();if(C==="use")break;if(C==="change"){let I=await u.select({message:"Notification sound",options:w(),initialValue:y});if(u.isCancel(I))return A();if(I==="custom"){let F=await P();if(F===null)return A();y=F}else if(I==="skip"){N="no",G=void 0;break}else y=I;continue}try{let I=y==="none"?"none":y.startsWith("/")?y:xt(t,"sounds",y);await _o(I)}catch(I){u.log.warn(String(I))}}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(`
|
|
59
|
+
`),H=xt(t,"templates","agent-templates","AGENTS-default.md"),K=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 Lo(H);continue}return h}})(o);if(!K)return A();if(O=K,!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(`
|
|
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 A();if(ae=f,f!=="select")break;u.log.info("Tip: press Esc to go back.");let h=await Pe({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?(ae="skip",Q=void 0):Q=y;break}return{selections:{profileChoice:p,profileMode:c,profileScope:d,setDefaultProfile:g,profilesSelected:m,installTools:k,toolsSelected:b,installCodexCli:S,notifyAction:N,globalAgentsAction:O,notificationSound:G,skillsMode:ae,skillsSelected:Q,webSearch:B,fileOpener:Z,credentialsStore:D,enableTui2:le,tuiAlternateScreen:z,experimentalFeatures:pe}}}async function _o(e){if(e.endsWith("/none")||e==="none")return;let t=[async n=>{await Ae("afplay"),await Te`afplay ${n}`},async n=>{await Ae("paplay"),await Te`paplay ${n}`},async n=>{await Ae("aplay"),await Te`aplay ${n}`},async n=>{await Ae("mpg123"),await Te`mpg123 -q ${n}`},async n=>{await Ae("ffplay"),await Te`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 Pe(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 Lo(e){let n="";try{n=await It.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(`
|
|
60
61
|
`);process.stdout.write(s+`
|
|
61
|
-
`),o.length>40&&f.log.info(`... (${o.length-40} more lines)`)}function _o(e){return Ee(e)?e:"balanced"}function Ee(e){return e==="balanced"||e==="safe"||e==="yolo"}function jo(e){return e==="background-terminal"||e==="shell-snapshot"||e==="multi-agents"||e==="steering"||e==="collaboration-modes"||e==="child-agent-project-docs"}function T(){return f.cancel("Install aborted"),null}var nt=R(),Do=["balanced","safe","yolo"],hn=Oo({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)"},tui2:{type:"boolean",description:"Enable Codex TUI2 (experimental)"},"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-agent, 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=At(ot.homedir(),".codex","config.toml"),o=await Tt(n),i=At(ot.homedir(),".codex","notify.sh"),s=await Tt(i),a=At(ot.homedir(),".codex","AGENTS.md"),r=await Tt(a),l=o?await qo(n):void 0,p=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes,u=Fo(e.profile),d=Mo(e["profile-mode"]),g=Go(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(),W=typeof e["credentials-store"]>"u"?void 0:String(e["credentials-store"]).trim(),re=typeof e.tui2>"u"?void 0:!!e.tui2,X=typeof e["alt-screen"]>"u"?void 0:String(e["alt-screen"]).trim(),B=typeof e.experimental>"u"?void 0:String(e.experimental).trim(),Q=e,D=typeof Q.skills>"u"?void 0:String(Q.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(W==="")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(B==="")throw new Error("Invalid --experimental value (expected comma-separated list)");let ae=t.some($=>$==="--no-vscode"||$.startsWith("--no-vscode=")),z=await St(nt),le=oe(),lt=(u&&u!=="skip"?u:Pt(l)?l:void 0)||"balanced",x=lt,te=d||"add",E=g||"single",be=!0,q,H=k?"all":"skip",je=m||"auto",U,pe,c,h="skip",y,w,P,_,C,I=!1,F,Oe;if(b&&($=>{let K=$.trim().toLowerCase();if(K==="skip"){U="no",c=void 0;return}U="yes",c=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(Y=>Y.trim()).filter(Boolean);if(K.length===0)throw new Error("Invalid --skills value (expected all|skip|<comma-separated skill names>)");let De=new Set(z.map(Y=>Y.id)),Z=K.filter(Y=>!De.has(Y));if(Z.length){let Y=z.map(Tn=>Tn.id).join(", ")||"(none)";throw new Error(`Unknown skill(s): ${Z.join(", ")}. Available: ${Y}`)}h="select",y=K}}if(N&&(P=Bo(N)),O&&(_=Uo(O)),W&&(C=Ko(W)),I=!!re,X&&(F=Vo(X)),B&&(Oe=zo(B)),S){let $=S.trim().toLowerCase();if($==="all")H="all";else if($==="skip"||$==="none")H="skip";else{let K=S.split(",").map(Z=>Z.trim().toLowerCase()).filter(Boolean);if(K.length===0)throw new Error("Invalid --tools value (expected all|skip|<comma-separated tool ids>)");let De=K.filter(Z=>!ie(Z));if(De.length){let Z=le.map(Y=>Y.id).join(", ")||"(none)";throw new Error(`Unknown tool(s): ${De.join(", ")}. Available: ${Z}`)}H="select",w=Array.from(new Set(K)).filter(ie)}}else k||(H="skip");if(p){V.log.info(`Codex 1up v${ye} - equips your coding agent with powerful tools`),V.log.info("Install wizard");let $=await un({repoRoot:nt,isUnixLike:k,globalAgentsExists:r,currentProfile:l,seededProfile:lt,bundledSkills:z,availableTools:le,cliArgs:{profileChoice:u,profileMode:d,profileScope:g,soundArg:b,toolsArg:S,skillsArg:D,webSearchArg:N,fileOpenerArg:O,credentialsStoreArg:W,tui2Arg:re,altScreenArg:X,experimentalArg:B},selections:{profileChoice:x,profileMode:te,profileScope:E,setDefaultProfile:be,profilesSelected:q,installTools:H,toolsSelected:w,installCodexCli:je,notifyAction:U,globalAgentsAction:pe,notificationSound:c,skillsMode:h,skillsSelected:y,webSearch:P,fileOpener:_,credentialsStore:C,enableTui2:I,tuiAlternateScreen:F,experimentalFeatures:Oe}});if(!$)return;({profileChoice:x,profileMode:te,profileScope:E,setDefaultProfile:be,profilesSelected:q,installTools:H,toolsSelected:w,installCodexCli:je,notifyAction:U,globalAgentsAction:pe,notificationSound:c,skillsMode:h,skillsSelected:y,webSearch:P,fileOpener:_,credentialsStore:C,enableTui2:I,tuiAlternateScreen:F,experimentalFeatures:Oe}=$.selections)}p||(E==="selected"&&q?.length&&Pt(x)&&!q.includes(x)&&(x=q[0]),(E==="all"?[...Do]:E==="selected"?q||[]:x==="skip"?[]:[x]).length===0&&(be=!1),typeof U>"u"&&(U=s?"no":"yes"),typeof pe>"u"&&(pe="skip"));let Rt={profile:x,profileScope:E,profileMode:te,setDefaultProfile:be,profilesSelected:q,installCodexCli:je,installTools:H,toolsSelected:w,notify:U??(s?"no":"yes"),globalAgents:pe??"skip",notificationSound:c,skills:h,skillsSelected:y,webSearch:P,fileOpener:_,credentialsStore:C,enableTui2:I,tuiAlternateScreen:F,experimentalFeatures:Oe,mode:"manual",installNode:e["install-node"]||"skip",shell:String(e.shell||"auto"),vscodeId:ae?void 0:e.vscode?String(e.vscode):void 0,noVscode:ae||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 kt(Rt,nt),V.log.success("Base install complete"),V.log.success("Install finished")}catch($){throw V.cancel(`Installation failed: ${$}`),$}await vt();return}try{await kt(Rt,nt),await vt()}catch($){throw V.cancel(`Installation failed: ${$}`),$}}});async function Tt(e){try{return await gn.access(e),!0}catch{return!1}}function Fo(e){if(e==null)return;let t=String(e).toLowerCase();if(Pt(t))return t;if(t==="skip")return"skip";throw new Error("Invalid --profile value (use balanced|safe|yolo|skip).")}function Mo(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 Go(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 Bo(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 Uo(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 Pt(e){return e==="balanced"||e==="safe"||e==="yolo"}async function qo(e){try{let t=await gn.readFile(e,"utf8"),o=mn.parse(t).profile;return typeof o=="string"?o:void 0}catch(t){return}}import{defineCommand as Ho}from"citty";import{promises as Re}from"fs";import{resolve as wn,dirname as Yo}from"path";var Jo=R();async function Et(e){try{return await Re.access(e),!0}catch{return!1}}async function Xo(e,t){if(await Et(t)){let o=`${t}.backup.${new Date().toISOString().replace(/[:.]/g,"").replace("T","_").slice(0,15)}`;await Re.copyFile(t,o)}await Re.mkdir(Yo(t),{recursive:!0}),await Re.copyFile(e,t)}var yn=Ho({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=wn(Jo,"templates/agent-templates","AGENTS-default.md"),i=await Et(t).then(async s=>s&&(await Re.stat(t)).isDirectory()).catch(()=>!1)?wn(t,"AGENTS.md"):t;if(!await Et(n))throw new Error(`Template not found: ${n}`);await Xo(n,i),process.stdout.write(`Wrote ${i}
|
|
62
|
-
`)}});import{defineCommand as
|
|
62
|
+
`),o.length>40&&u.log.info(`... (${o.length-40} more lines)`)}function jo(e){return Ee(e)?e:"balanced"}function Ee(e){return e==="balanced"||e==="safe"||e==="yolo"}function Oo(e){return e==="background-terminal"||e==="shell-snapshot"||e==="multi-agents"||e==="steering"||e==="collaboration-modes"||e==="child-agent-project-docs"}function A(){return u.cancel("Install aborted"),null}var nt=R(),Fo=["balanced","safe","yolo"],hn=Do({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)"},tui2:{type:"boolean",description:"Enable Codex TUI2 (experimental)"},"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=Tt(ot.homedir(),".codex","config.toml"),o=await At(n),i=Tt(ot.homedir(),".codex","notify.sh"),s=await At(i),l=Tt(ot.homedir(),".codex","AGENTS.md"),a=await At(l),r=o?await Ho(n):void 0,p=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes,c=Mo(e.profile),d=Wo(e["profile-mode"]),g=Go(e["profiles-scope"]),m=Bo(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(),ae=typeof e.tui2>"u"?void 0:!!e.tui2,Q=typeof e["alt-screen"]>"u"?void 0:String(e["alt-screen"]).trim(),B=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(Q==="")throw new Error("Invalid --alt-screen value (expected auto|always|never|skip)");if(B==="")throw new Error("Invalid --experimental value (expected comma-separated list)");let le=t.some($=>$==="--no-vscode"||$.startsWith("--no-vscode=")),z=await St(nt),pe=ie(),lt=(c&&c!=="skip"?c:Pt(r)?r:void 0)||"balanced",x=lt,ne=d||"add",E=g||"single",be=!0,q,H=k?"all":"skip",je=m||"auto",K,de,f,h="skip",y,w,P,L,C,I=!1,F,Oe;if(b&&($=>{let U=$.trim().toLowerCase();if(U==="skip"){K="no",f=void 0;return}K="yes",f=U==="none"?"none":$})(b),D){let $=D.trim().toLowerCase();if($==="all")h="all";else if($==="skip"||$==="none")h="skip";else{let U=D.split(",").map(Y=>Y.trim()).filter(Boolean);if(U.length===0)throw new Error("Invalid --skills value (expected all|skip|<comma-separated skill names>)");let De=new Set(z.map(Y=>Y.id)),ee=U.filter(Y=>!De.has(Y));if(ee.length){let Y=z.map(An=>An.id).join(", ")||"(none)";throw new Error(`Unknown skill(s): ${ee.join(", ")}. Available: ${Y}`)}h="select",y=U}}if(N&&(P=Ko(N)),O&&(L=Uo(O)),G&&(C=Vo(G)),I=!!ae,Q&&(F=zo(Q)),B&&(Oe=qo(B)),S){let $=S.trim().toLowerCase();if($==="all")H="all";else if($==="skip"||$==="none")H="skip";else{let U=S.split(",").map(ee=>ee.trim().toLowerCase()).filter(Boolean);if(U.length===0)throw new Error("Invalid --tools value (expected all|skip|<comma-separated tool ids>)");let De=U.filter(ee=>!se(ee));if(De.length){let ee=pe.map(Y=>Y.id).join(", ")||"(none)";throw new Error(`Unknown tool(s): ${De.join(", ")}. Available: ${ee}`)}H="select",w=Array.from(new Set(U)).filter(se)}}else k||(H="skip");if(p){V.log.info(`Codex 1up v${ye} - equips your coding agent with powerful tools`),V.log.info("Install wizard");let $=await un({repoRoot:nt,isUnixLike:k,globalAgentsExists:a,currentProfile:r,seededProfile:lt,bundledSkills:z,availableTools:pe,cliArgs:{profileChoice:c,profileMode:d,profileScope:g,soundArg:b,toolsArg:S,skillsArg:D,webSearchArg:N,fileOpenerArg:O,credentialsStoreArg:G,tui2Arg:ae,altScreenArg:Q,experimentalArg:B},selections:{profileChoice:x,profileMode:ne,profileScope:E,setDefaultProfile:be,profilesSelected:q,installTools:H,toolsSelected:w,installCodexCli:je,notifyAction:K,globalAgentsAction:de,notificationSound:f,skillsMode:h,skillsSelected:y,webSearch:P,fileOpener:L,credentialsStore:C,enableTui2:I,tuiAlternateScreen:F,experimentalFeatures:Oe}});if(!$)return;({profileChoice:x,profileMode:ne,profileScope:E,setDefaultProfile:be,profilesSelected:q,installTools:H,toolsSelected:w,installCodexCli:je,notifyAction:K,globalAgentsAction:de,notificationSound:f,skillsMode:h,skillsSelected:y,webSearch:P,fileOpener:L,credentialsStore:C,enableTui2:I,tuiAlternateScreen:F,experimentalFeatures:Oe}=$.selections)}p||(E==="selected"&&q?.length&&Pt(x)&&!q.includes(x)&&(x=q[0]),(E==="all"?[...Fo]:E==="selected"?q||[]:x==="skip"?[]:[x]).length===0&&(be=!1),typeof K>"u"&&(K=s?"no":"yes"),typeof de>"u"&&(de="skip"));let Rt={profile:x,profileScope:E,profileMode:ne,setDefaultProfile:be,profilesSelected:q,installCodexCli:je,installTools:H,toolsSelected:w,notify:K??(s?"no":"yes"),globalAgents:de??"skip",notificationSound:f,skills:h,skillsSelected:y,webSearch:P,fileOpener:L,credentialsStore:C,enableTui2:I,tuiAlternateScreen:F,experimentalFeatures:Oe,mode:"manual",installNode:e["install-node"]||"skip",shell:String(e.shell||"auto"),vscodeId:le?void 0:e.vscode?String(e.vscode):void 0,noVscode:le||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 kt(Rt,nt),V.log.success("Base install complete"),V.log.success("Install finished")}catch($){throw V.cancel(`Installation failed: ${$}`),$}await vt();return}try{await kt(Rt,nt),await vt()}catch($){throw V.cancel(`Installation failed: ${$}`),$}}});async function At(e){try{return await gn.access(e),!0}catch{return!1}}function Mo(e){if(e==null)return;let t=String(e).toLowerCase();if(Pt(t))return t;if(t==="skip")return"skip";throw new Error("Invalid --profile value (use balanced|safe|yolo|skip).")}function Wo(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 Go(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 Bo(e){if(e==null)return;let t=String(e).toLowerCase();if(t==="yes"||t==="no")return t;throw new Error("Expected yes|no")}function Ko(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 Uo(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 Vo(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 qo(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 Pt(e){return e==="balanced"||e==="safe"||e==="yolo"}async function Ho(e){try{let t=await gn.readFile(e,"utf8"),o=mn.parse(t).profile;return typeof o=="string"?o:void 0}catch(t){return}}import{defineCommand as Yo}from"citty";import{promises as Re}from"fs";import{resolve as wn,dirname as Jo}from"path";var Xo=R();async function Et(e){try{return await Re.access(e),!0}catch{return!1}}async function Qo(e,t){if(await Et(t)){let o=`${t}.backup.${new Date().toISOString().replace(/[:.]/g,"").replace("T","_").slice(0,15)}`;await Re.copyFile(t,o)}await Re.mkdir(Jo(t),{recursive:!0}),await Re.copyFile(e,t)}var yn=Yo({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=wn(Xo,"templates/agent-templates","AGENTS-default.md"),i=await Et(t).then(async s=>s&&(await Re.stat(t)).isDirectory()).catch(()=>!1)?wn(t,"AGENTS.md"):t;if(!await Et(n))throw new Error(`Template not found: ${n}`);await Qo(n,i),process.stdout.write(`Wrote ${i}
|
|
63
|
+
`)}});import{defineCommand as Zo}from"citty";import{$ as ei}from"zx";import{resolve as ti}from"path";var ni=R(),bn=Zo({meta:{name:"doctor",description:"Run environment checks"},async run(){await ei`bash ${ti(ni,"scripts/doctor.sh")}`}});import{defineCommand as oi}from"citty";import{$ as ii}from"zx";import{resolve as si}from"path";var ri=R(),kn=oi({meta:{name:"uninstall",description:"Clean up aliases and config created by this tool"},async run(){await ii`bash ${si(ri,"scripts/uninstall.sh")}`}});import{defineCommand as re}from"citty";import{promises as Le}from"fs";import{resolve as st,dirname as ai}from"path";import li from"os";var pi=R();function Ne(){let e=st(li.homedir(),".codex"),t=st(e,"config.toml");return{CODEX_HOME:e,CFG:t}}async function _e(e){return Le.readFile(e,"utf8")}async function it(e,t){await Le.mkdir(ai(e),{recursive:!0}),await Le.writeFile(e,t,"utf8")}function vn(e){let t=/^\[profiles\.(.+?)\]/gm,n=[],o;for(;o=t.exec(e);)n.push(o[1]);return n}function Sn(e){return JSON.stringify(e)}function di(e,t,n){let o=`[projects.${Sn(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*$/,`
|
|
63
64
|
`)+`
|
|
64
65
|
${o}
|
|
65
66
|
trust_level = "${n}"
|
|
66
|
-
`;let
|
|
67
|
+
`;let l=s+1;for(;l<i.length;l++){let a=i[l];if(/^\s*\[/.test(a))break;if(/^\s*trust_level\s*=/.test(a))return i[l]=`trust_level = "${n}"`,i.join(`
|
|
67
68
|
`).replace(/\s*$/,`
|
|
68
|
-
`)}return i.splice(
|
|
69
|
+
`)}return i.splice(l,0,`trust_level = "${n}"`),i.join(`
|
|
69
70
|
`).replace(/\s*$/,`
|
|
70
|
-
`)}function
|
|
71
|
-
`)+
|
|
71
|
+
`)}function ci(e,t,n){let i=`[mcp_servers.${/^[A-Za-z0-9_-]+$/.test(t)?t:Sn(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
|
+
`)+r.join(`
|
|
72
73
|
`)+`
|
|
73
|
-
`}let
|
|
74
|
+
`}let a=(r,p)=>{for(let c=l+1;c<s.length;c++){let d=s[c];if(/^\s*\[/.test(d)){s.splice(c,0,`${r} = ${p}`);return}if(new RegExp(`^\\s*${r}\\s*=`).test(d)){s[c]=`${r} = ${p}`;return}}s.push(`${r} = ${p}`)};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(`
|
|
74
75
|
`).replace(/\s*$/,`
|
|
75
|
-
`)}function
|
|
76
|
+
`)}function fi(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(`
|
|
76
77
|
`);return o===-1?n+`
|
|
77
78
|
`+e:e.slice(0,o+1)+n+`
|
|
78
|
-
`+e.slice(o+1)}var Cn=
|
|
79
|
-
`);return}if(i){let s=`${o}.backup.${Date.now()}`;await
|
|
79
|
+
`+e.slice(o+1)}var Cn=re({meta:{name:"config",description:"Manage Codex config profiles"},subCommands:{init:re({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=st(pi,"templates/codex-config.toml"),n=await _e(t),{CFG:o}=Ne(),i=await Le.access(o).then(()=>!0).catch(()=>!1);if(i&&!e.force){process.stdout.write(`${o} exists. Use --force to overwrite.
|
|
80
|
+
`);return}if(i){let s=`${o}.backup.${Date.now()}`;await Le.copyFile(o,s),process.stdout.write(`Backed up to ${s}
|
|
80
81
|
`)}await it(o,n),process.stdout.write(`Wrote ${o}
|
|
81
|
-
`)}}),profiles:
|
|
82
|
+
`)}}),profiles:re({meta:{name:"profiles",description:"List profiles in the current config"},async run(){let{CFG:e}=Ne(),t=await _e(e),n=vn(t);process.stdout.write(n.length?n.join(`
|
|
82
83
|
`)+`
|
|
83
84
|
`:`No profiles found
|
|
84
|
-
`)}}),"set-profile":
|
|
85
|
-
`)}}),trust:
|
|
86
|
-
`)}}),mcp:
|
|
87
|
-
`)}})}})}});import{defineCommand as
|
|
88
|
-
`)}}),install:rt({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 yt("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=>!
|
|
89
|
-
`);return}let n=
|
|
85
|
+
`)}}),"set-profile":re({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}=Ne(),n=await _e(t),o=vn(n),i=String(e.name);if(!o.includes(i))throw new Error(`Unknown profile: ${i}`);let s=fi(n,i);await it(t,s),process.stdout.write(`profile set to ${i}
|
|
86
|
+
`)}}),trust:re({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}=Ne(),n=await _e(t),o=st(String(e.path||process.cwd())),i=di(n,o,"trusted");await it(t,i),process.stdout.write(`trusted: ${o}
|
|
87
|
+
`)}}),mcp:re({meta:{name:"mcp",description:"Manage [mcp_servers] entries in config.toml"},subCommands:{set:re({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}=Ne(),n=await _e(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=ci(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 it(t,l),process.stdout.write(`mcp server updated: ${o}
|
|
88
|
+
`)}})}})}});import{defineCommand as ui}from"citty";var $n=ui({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 we(),n=process.stdout.isTTY&&!e["dry-run"]&&!e["skip-confirmation"]&&!e.yes;await tt({interactive:n,assumeYes:!!e.yes,skipConfirmation:!!e["skip-confirmation"],dryRun:!!e["dry-run"],logger:t.logger})}});import{defineCommand as rt}from"citty";var xn=rt({meta:{name:"tools",description:"Manage developer tools"},subCommands:{list:rt({meta:{name:"list",description:"List known tools and installation status"},async run(){let e=await Ie();for(let t of e)process.stdout.write(`${t.id} ${t.installed?"\u2713":"\u2716"}
|
|
89
|
+
`)}}),install:rt({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 yt("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=>!se(s));if(i.length){let s=nn().join(", ");throw new Error(`Unknown tool id(s): ${i.join(", ")}. Known: ${s}`)}await yt(o,{dryRun:!!e["dry-run"]})}}),doctor:rt({meta:{name:"doctor",description:"Show missing tools and hints"},async run(){let t=(await Ie()).filter(o=>!o.installed).map(o=>o.id);if(t.length===0){process.stdout.write(`All tools are installed.
|
|
90
|
+
`);return}let n=ie().map(o=>o.id).join(", ");process.stdout.write(`Missing tools: ${t.join(", ")}
|
|
90
91
|
`),process.stdout.write(`Known tools: ${n}
|
|
91
92
|
`)}})}});import{defineCommand as at}from"citty";var In=at({meta:{name:"skills",description:"Manage bundled Agent Skills"},subCommands:{list:at({meta:{name:"list",description:"List bundled and installed skills"},async run(){let e=R(),t=await Ct(e),n=await rn();if(process.stdout.write(`Bundled skills:
|
|
92
93
|
`),t.length===0)process.stdout.write(` (none)
|
|
@@ -95,4 +96,4 @@ trust_level = "${n}"
|
|
|
95
96
|
Installed skills:
|
|
96
97
|
`),n.length===0)process.stdout.write(` (none)
|
|
97
98
|
`);else for(let o of n)process.stdout.write(` ${o.id}
|
|
98
|
-
`)}}),install:at({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 Qe("all",void 0,{dryRun:!!e["dry-run"]});return}let n=R(),o=await Ct(n),i=t.split(",").map(
|
|
99
|
+
`)}}),install:at({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 Qe("all",void 0,{dryRun:!!e["dry-run"]});return}let n=R(),o=await Ct(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(p=>p.id).join(", ")||"(none)";throw new Error(`Unknown skill(s): ${a.join(", ")}. Available: ${r}`)}await Qe("select",i,{dryRun:!!e["dry-run"]})}}),refresh:at({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 Qe("all",void 0,{dryRun:!!e["dry-run"]})}})}});var Tn=gi({meta:{name:"codex-1up",version:ye,description:dn},subCommands:{install:hn,agents:yn,doctor:bn,uninstall:kn,config:Cn,update:$n,tools:xn,skills:In}});mi(Tn);
|