holycodex 0.9.4 → 0.10.0-dev.30462100678.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +74 -36
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -7,6 +7,6 @@ bunx holycodex@dev install
7
7
  bunx holycodex@dev doctor
8
8
  ```
9
9
 
10
- Use `holycodex --help` for commands and autonomy options. Stable releases use `bunx holycodex`; development releases use npm's `dev` dist-tag.
10
+ Use `holycodex --help` for commands, autonomy options, and service tiers. `--fast` selects the fast tier; `--no-fast` or omitting both tier flags selects the default. Stable releases use `bunx holycodex`; development releases use npm's `dev` dist-tag.
11
11
 
12
12
  Repository, documentation, license, and security notices: https://github.com/davidbasilefilho/holycodex
package/dist/cli.js CHANGED
@@ -4252,7 +4252,7 @@ function superRefine(fn, params) {
4252
4252
  }
4253
4253
  //#endregion
4254
4254
  //#region packages/cli/src/catalog.ts
4255
- var VERSION = "0.9.4";
4255
+ var VERSION = "0.10.0-dev.30462100678.1";
4256
4256
  var SKILLS = [
4257
4257
  "ast-grep",
4258
4258
  "caveman",
@@ -4965,6 +4965,7 @@ var ORIGINAL_ROOT = "# holycodex original root: ";
4965
4965
  var ORIGINAL_TABLE_KEY = "# holycodex original table key: ";
4966
4966
  var PLAN_PREFIX = "# holycodex plan: ";
4967
4967
  var MAX_SUBAGENTS_PREFIX = "# holycodex max-subagents: ";
4968
+ var MANAGED_PERMISSION_PROFILE = "holycodex-config";
4968
4969
  var OLD_NAMESPACES = [
4969
4970
  "marketplaces.sisyphuslabs",
4970
4971
  "plugins.\"omo@sisyphuslabs\"",
@@ -4991,8 +4992,8 @@ function removeManaged(input) {
4991
4992
  return input.replace(new RegExp(`${escapedStart}([\\s\\S]*?)${escapedEnd}(?:\\r?\\n){0,2}`, "g"), (_match, body) => {
4992
4993
  const encoded = body.match(/^# holycodex original root: ([A-Za-z0-9+/=]+)$/m)?.[1];
4993
4994
  if (encoded !== void 0) return `${Buffer.from(encoded, "base64").toString("utf8")}\n`;
4994
- const tableKey = body.match(/^# holycodex original table key: ([A-Za-z0-9+/=]+)$/m)?.[1];
4995
- return tableKey === void 0 ? "" : `${Buffer.from(tableKey, "base64").toString("utf8")}\n`;
4995
+ const tableKeys = [...body.matchAll(/^# holycodex original table key: ([A-Za-z0-9+/=]+)$/gm)].flatMap((match) => match[1] === void 0 ? [] : [match[1]]);
4996
+ return tableKeys.length === 0 ? "" : `${tableKeys.map((key) => Buffer.from(key, "base64").toString("utf8")).join("\n")}\n`;
4996
4997
  }).trim();
4997
4998
  }
4998
4999
  /** Removes legacy omo. */
@@ -5008,18 +5009,17 @@ function removeLegacyOmo(input) {
5008
5009
  ].some((name) => header === name || header.startsWith(`${name}.`)) || !/(?:sisyphuslabs|omo@|oh-my|code-yeongyu)/i.test(section);
5009
5010
  }).join("").trimEnd();
5010
5011
  }
5011
- function injectTableKey(input, table, key, value) {
5012
+ function injectTableKeys(input, table, entries) {
5012
5013
  const match = new RegExp(`^\\s*\\[${table.replaceAll(".", "\\.")}]\\s*(?:#.*)?$`, "m").exec(input);
5013
5014
  const tail = match === null ? "" : input.slice(match.index + match[0].length);
5014
5015
  const tableEnd = nextTableBoundary(tail);
5015
5016
  const tableBody = tableEnd < 0 ? tail : tail.slice(0, tableEnd);
5016
- const originalKey = new RegExp(`^[ \\t]*${key}[ \\t]*=.*$`, "m").exec(tableBody)?.[0];
5017
- const managed = `${START}\n${originalKey === void 0 ? "" : `${ORIGINAL_TABLE_KEY}${Buffer.from(originalKey).toString("base64")}\n`}${key} = ${value}\n${END}`;
5018
- if (match === null) return `${input.trimEnd()}\n\n${START}\n[${table}]\n${key} = ${value}\n${END}`.trim();
5017
+ const managed = `${START}\n${entries.map(([key]) => new RegExp(`^[ \\t]*${key}[ \\t]*=.*$`, "m").exec(tableBody)?.[0]).filter((value) => value !== void 0).map((value) => `${ORIGINAL_TABLE_KEY}${Buffer.from(value).toString("base64")}\n`).join("")}${entries.map(([key, value]) => `${key} = ${value}`).join("\n")}\n${END}`;
5018
+ if (match === null) return `${input.trimEnd()}\n\n${START}\n[${table}]\n${entries.map(([key, value]) => `${key} = ${value}`).join("\n")}\n${END}`.trim();
5019
5019
  const bodyStart = match.index + match[0].length;
5020
5020
  const next = nextTableBoundary(input.slice(bodyStart));
5021
5021
  const bodyEnd = next < 0 ? input.length : bodyStart + next;
5022
- const cleanedBody = input.slice(bodyStart, bodyEnd).replace(new RegExp(`^\\s*${key}\\s*=.*\\r?\\n?`, "gm"), "").trim();
5022
+ const cleanedBody = entries.reduce((body, [key]) => body.replace(new RegExp(`^\\s*${key}\\s*=.*\\r?\\n?`, "gm"), ""), input.slice(bodyStart, bodyEnd)).trim();
5023
5023
  const suffix = input.slice(bodyEnd).trimStart();
5024
5024
  return `${input.slice(0, bodyStart)}\n${cleanedBody ? `${cleanedBody}\n` : ""}${managed}${suffix ? `\n${suffix}` : ""}`.trim();
5025
5025
  }
@@ -5037,6 +5037,14 @@ function rootValue(input, key) {
5037
5037
  function removeRootValue(input, value) {
5038
5038
  return value === void 0 ? input : input.replace(value, "");
5039
5039
  }
5040
+ function removeRootKey(input, key) {
5041
+ let updated = input;
5042
+ for (;;) {
5043
+ const value = rootValue(updated, key);
5044
+ if (value === void 0) return updated;
5045
+ updated = removeRootValue(updated, value);
5046
+ }
5047
+ }
5040
5048
  /** Reads the explicitly recorded model routing plan from managed configuration. */
5041
5049
  function readManagedPlan(input) {
5042
5050
  const value = new RegExp(`^${PLAN_PREFIX}(.+)$`, "m").exec(input)?.[1]?.trim();
@@ -5060,8 +5068,8 @@ function readPreservedRootOverrides(input) {
5060
5068
  reasoningEffort: false
5061
5069
  };
5062
5070
  const plan = readManagedPlan(managedRoot);
5063
- const model = rootTomlString(managedRoot, "model");
5064
- const reasoningEffort = rootTomlString(managedRoot, "model_reasoning_effort");
5071
+ const model = rootTomlString(input, "model");
5072
+ const reasoningEffort = rootTomlString(input, "model_reasoning_effort");
5065
5073
  if (plan === void 0 || model === void 0 || reasoningEffort === void 0) return {
5066
5074
  model: false,
5067
5075
  reasoningEffort: false
@@ -5091,11 +5099,6 @@ function preserveManagedRootPreferences(input, base) {
5091
5099
  updatedRoot = removeRootValue(updatedRoot, rootValue(updatedRoot, key)).trim();
5092
5100
  updatedRoot = `${updatedRoot}${updatedRoot ? "\n" : ""}${live}`;
5093
5101
  }
5094
- const verbosity = rootValue(managedRoot, "model_verbosity")?.trim();
5095
- if (verbosity !== void 0 && verbosity !== (rootValue(root, "model_verbosity")?.trim() ?? "model_verbosity = \"low\"")) {
5096
- updatedRoot = removeRootValue(updatedRoot, rootValue(updatedRoot, "model_verbosity")).trim();
5097
- updatedRoot = `${updatedRoot}${updatedRoot ? "\n" : ""}${verbosity}`;
5098
- }
5099
5102
  if (updatedRoot === root.trim()) return base;
5100
5103
  return `${updatedRoot}${tables ? `\n${tables.trimStart()}` : ""}`;
5101
5104
  }
@@ -5106,7 +5109,7 @@ function mergedStatusLine(original) {
5106
5109
  return `[${items.map((item) => JSON.stringify(item)).join(", ")}]`;
5107
5110
  }
5108
5111
  /** Installs config. */
5109
- function installConfig(input, mode, _platform, plan = DEFAULT_PLAN, maxSubagents) {
5112
+ function installConfig(input, mode, _platform, plan = DEFAULT_PLAN, maxSubagents, fast = false) {
5110
5113
  const base = preserveManagedRootPreferences(input, removeLegacyOmo(removeManaged(input)));
5111
5114
  const firstTable = base.search(/^\s*\[/m);
5112
5115
  const root = firstTable < 0 ? base : base.slice(0, firstTable);
@@ -5114,32 +5117,46 @@ function installConfig(input, mode, _platform, plan = DEFAULT_PLAN, maxSubagents
5114
5117
  const controlled = [
5115
5118
  "approval_policy",
5116
5119
  "sandbox_mode",
5120
+ "default_permissions",
5117
5121
  "max_concurrent_threads_per_session",
5118
- "status_line"
5122
+ "status_line",
5123
+ "model_verbosity",
5124
+ "service_tier"
5119
5125
  ].map((key) => rootValue(root, key));
5120
- const originalRoot = root.trim();
5121
- const preservedRoot = controlled.reduce(removeRootValue, root).trim();
5126
+ const preservedRoot = [
5127
+ "approval_policy",
5128
+ "sandbox_mode",
5129
+ "default_permissions",
5130
+ "max_concurrent_threads_per_session",
5131
+ "status_line",
5132
+ "model_verbosity",
5133
+ "service_tier"
5134
+ ].reduce(removeRootKey, root).trim();
5135
+ const originalControlled = controlled.filter((value) => value !== void 0).sort((left, right) => root.indexOf(left) - root.indexOf(right)).join("\n");
5122
5136
  const hasModel = /^\s*model\s*=/m.test(preservedRoot);
5123
5137
  const hasEffort = /^\s*model_reasoning_effort\s*=/m.test(preservedRoot);
5124
- const hasVerbosity = /^\s*model_verbosity\s*=/m.test(preservedRoot);
5125
5138
  const rootRoute = MODEL_ROUTING_PLANS[plan].root;
5126
5139
  const effectiveMaxSubagents = maxSubagents ?? MODEL_ROUTING_PLANS[plan].usage.maxSubagents;
5127
5140
  const model = hasModel ? "" : `model = "${rootRoute.model}"\n`;
5128
5141
  const effort = hasEffort ? "" : `model_reasoning_effort = "${rootRoute.reasoningEffort}"\n`;
5129
- const verbosity = hasVerbosity ? "" : "model_verbosity = \"low\"\n";
5130
5142
  const approval = mode === "default" ? "on-request" : "never";
5131
5143
  const sandbox = mode === "dangerous" ? "danger-full-access" : "workspace-write";
5132
- const original = originalRoot ? `${ORIGINAL_ROOT}${Buffer.from(originalRoot).toString("base64")}\n` : "";
5133
- const preserved = preservedRoot ? `${preservedRoot}\n` : "";
5134
- let configured = `${`${START}\n${PLAN_PREFIX}${plan}\n${maxSubagents === void 0 ? "" : `${MAX_SUBAGENTS_PREFIX}${maxSubagents}\n`}${original}${model}${effort}${verbosity}${preserved}approval_policy = "${approval}"\nsandbox_mode = "${sandbox}"\nstatus_line = ${mergedStatusLine(controlled[3])}\n${END}`}${tables ? `\n\n${tables}` : ""}`;
5135
- configured = injectTableKey(configured, "features", "default_mode_request_user_input", "true");
5136
- configured = injectTableKey(configured, "features", "multi_agent", "true");
5137
- configured = injectTableKey(configured, "features", "multi_agent_v2", "true");
5144
+ const original = originalControlled ? `${ORIGINAL_ROOT}${Buffer.from(originalControlled).toString("base64")}\n` : "";
5145
+ const rootBlock = `${START}\n${PLAN_PREFIX}${plan}\n${maxSubagents === void 0 ? "" : `${MAX_SUBAGENTS_PREFIX}${maxSubagents}\n`}${original}${model}${effort}model_verbosity = "low"\nservice_tier = "${fast ? "fast" : "default"}"\napproval_policy = "${approval}"\nsandbox_mode = "${sandbox}"\ndefault_permissions = "${MANAGED_PERMISSION_PROFILE}"\nstatus_line = ${mergedStatusLine(rootValue(root, "status_line"))}\n${END}`;
5146
+ let configured = `${preservedRoot ? `${preservedRoot}\n` : ""}${rootBlock}${tables ? `\n\n${tables}` : ""}`;
5147
+ configured = injectTableKeys(configured, `permissions.${MANAGED_PERMISSION_PROFILE}`, [["description", "\"HolyCodex config.toml permissions.\""], ["extends", "\":workspace\""]]);
5148
+ configured = injectTableKeys(configured, `permissions.${MANAGED_PERMISSION_PROFILE}.network`, [["enabled", "true"]]);
5149
+ configured = injectTableKeys(configured, "features", [
5150
+ ["default_mode_request_user_input", "true"],
5151
+ ["multi_agent", "true"],
5152
+ ["multi_agent_v2", "true"]
5153
+ ]);
5138
5154
  const usage = MODEL_ROUTING_PLANS[plan].usage;
5139
- configured = injectTableKey(configured, "agents", "max_threads", String(effectiveMaxSubagents + 1));
5140
- configured = injectTableKey(configured, "agents", "max_depth", String(usage.maxDepth));
5141
- if (mode !== "dangerous") configured = injectTableKey(configured, "sandbox_workspace_write", "network_access", "true");
5142
- for (const agent of AGENTS) configured = injectTableKey(configured, `agents.${agent}`, "config_file", `"holycodex/agents/${agent}.toml"`);
5155
+ configured = injectTableKeys(configured, "agents", [["max_threads", String(effectiveMaxSubagents + 1)], ["max_depth", String(usage.maxDepth)]]);
5156
+ if (mode !== "dangerous") configured = injectTableKeys(configured, "sandbox_workspace_write", [["network_access", "true"]]);
5157
+ configured = injectTableKeys(configured, "desktop", [["enabled-reasoning-efforts", "[\"low\", \"medium\", \"high\"]"], ["show-context-window-usage", "true"]]);
5158
+ if (_platform === "win32") configured = injectTableKeys(configured, "windows", [["sandbox", "\"unelevated\""]]);
5159
+ for (const agent of AGENTS) configured = injectTableKeys(configured, `agents.${agent}`, [["config_file", `"holycodex/agents/${agent}.toml"`]]);
5143
5160
  const plugin = `${START}\n[plugins."holycodex@holycodex"]\nenabled = true\n${END}`;
5144
5161
  return `${configured.trim()}\n\n${plugin}\n`;
5145
5162
  }
@@ -5226,6 +5243,14 @@ function tableBoolean(config, table, key) {
5226
5243
  const value = body === void 0 ? void 0 : new RegExp(`^\\s*${key}\\s*=\\s*(true|false)`, "m").exec(body)?.[1];
5227
5244
  return value === void 0 ? void 0 : value === "true";
5228
5245
  }
5246
+ function tableString(config, table, key) {
5247
+ const body = new RegExp(`^\\s*\\[${table.replaceAll(".", "\\.")}]\\s*$([\\s\\S]*?)(?=^\\s*\\[|(?![\\s\\S]))`, "m").exec(config)?.[1];
5248
+ return body === void 0 ? void 0 : rootTomlString(body, key);
5249
+ }
5250
+ function tableStringArray(config, table, key) {
5251
+ const body = new RegExp(`^\\s*\\[${table.replaceAll(".", "\\.")}]\\s*$([\\s\\S]*?)(?=^\\s*\\[|(?![\\s\\S]))`, "m").exec(config)?.[1];
5252
+ return body === void 0 ? void 0 : rootTomlStringArray(body, key);
5253
+ }
5229
5254
  function tableInteger(config, table, key) {
5230
5255
  const body = new RegExp(`^\\s*\\[${table.replaceAll(".", "\\.")}]\\s*$([\\s\\S]*?)(?=^\\s*\\[|(?![\\s\\S]))`, "m").exec(config)?.[1];
5231
5256
  const value = body === void 0 ? void 0 : new RegExp(`^\\s*${key}\\s*=\\s*(\\d+)`, "m").exec(body)?.[1];
@@ -5316,12 +5341,17 @@ async function doctor(home = process.env.CODEX_HOME ?? join(homedir(), ".codex")
5316
5341
  const expectedMaxSubagents = managedMaxSubagents.configured ? managedMaxSubagents.value : preset?.usage.maxSubagents;
5317
5342
  const rootOverrides = readPreservedRootOverrides(config);
5318
5343
  checks.push(preset !== void 0 && rootTomlString(config, "model") === preset.root.model && rootTomlString(config, "model_reasoning_effort") === preset.root.reasoningEffort ? check("root-model", "ok", "root-model-ready", "Root model matches the selected routing plan.") : rootOverrides.model || rootOverrides.reasoningEffort ? check("root-model", "ok", "root-model-override", "Root model uses an intentionally preserved explicit override.") : check("root-model", "error", "root-model-stale", "Root model configuration does not match the selected routing plan.", "Reinstall HolyCodex."));
5344
+ checks.push(["default", "fast"].includes(rootTomlString(config, "service_tier") ?? "") ? check("service-tier", "ok", "service-tier-ready", "Codex service tier is explicitly managed.") : check("service-tier", "error", "service-tier-stale", "service_tier must be either default or fast.", "Reinstall HolyCodex with --fast or --no-fast."));
5345
+ checks.push(rootTomlString(config, "model_verbosity") === "low" ? check("root-verbosity", "ok", "root-verbosity-ready", "Root model verbosity is forced to low.") : check("root-verbosity", "error", "root-verbosity-stale", "Root model verbosity must be low.", "Reinstall HolyCodex."));
5319
5346
  checks.push(preset === void 0 || expectedMaxSubagents === void 0 || tableInteger(config, "agents", "max_threads") !== expectedMaxSubagents + 1 || tableInteger(config, "agents", "max_depth") !== preset.usage.maxDepth ? check("agent-usage", "error", "agent-usage-stale", "Agent concurrency configuration does not match the selected routing plan or explicit override.", "Reinstall HolyCodex.") : check("agent-usage", "ok", "agent-usage-ready", `Agent concurrency allows ${expectedMaxSubagents} direct subagent${expectedMaxSubagents === 1 ? "" : "s"}.`));
5320
5347
  checks.push(mode === "unknown" ? check("autonomy", "error", "invalid-autonomy-config", "Approval, sandbox, and network settings do not match a supported mode.", "Rerun install with the intended autonomy flag.") : mode === "dangerous" ? check("autonomy", "warning", "dangerous-autonomy", "Explicit dangerous autonomy is active; workspace containment is removed.") : check("autonomy", "ok", `${mode}-ready`, mode === "safe-workspace" ? "Safe workspace autonomy is active." : "Approval-free workspace autonomy is active."));
5321
5348
  checks.push(tableBoolean(config, "features", "default_mode_request_user_input") === true ? check("user-input", "ok", "user-input-ready", "default_mode_request_user_input is enabled.") : check("user-input", "error", "user-input-disabled", "default_mode_request_user_input is not enabled.", "Rerun holycodex install."));
5349
+ checks.push(tableStringArray(config, "desktop", "enabled-reasoning-efforts")?.join(",") === "low,medium,high" ? check("desktop-reasoning", "ok", "desktop-reasoning-ready", "Desktop exposes low, medium, and high reasoning efforts.") : check("desktop-reasoning", "error", "desktop-reasoning-stale", "Desktop reasoning choices must be low, medium, and high.", "Reinstall HolyCodex."));
5350
+ checks.push(tableBoolean(config, "desktop", "show-context-window-usage") === true ? check("desktop-context-usage", "ok", "desktop-context-usage-ready", "Desktop context-window usage is visible.") : check("desktop-context-usage", "error", "desktop-context-usage-hidden", "Desktop context-window usage is not enabled.", "Reinstall HolyCodex."));
5322
5351
  checks.push(rootTomlStringArray(config, "status_line")?.includes("context-remaining") === true ? check("context-visibility", "warning", "context-visible-support-unverified", "status_line includes context-remaining. Current official Codex config documents this item, but publishes no minimum compatible Codex version.") : check("context-visibility", "error", "context-hidden", "status_line does not include context-remaining.", "Rerun holycodex install."));
5323
5352
  const codex = await runtime.command("codex", ["--version"]);
5324
5353
  checks.push(codex.ok ? check("codex", "ok", "codex-version", codex.output || "Codex is available.") : check("codex", "warning", "codex-version-unavailable", "Codex version could not be read; status-line compatibility cannot be independently confirmed."));
5354
+ if (runtime.platform === "win32") checks.push(tableString(config, "windows", "sandbox") === "unelevated" ? check("windows-sandbox", "ok", "windows-sandbox-ready", "Windows sandbox runs unelevated.") : check("windows-sandbox", "error", "windows-sandbox-stale", "Windows sandbox must run unelevated.", "Reinstall HolyCodex on Windows."));
5325
5355
  const agentModelFailures = [];
5326
5356
  for (const agent of AGENTS) try {
5327
5357
  const text = await readFile(join(agentRoot, `${agent}.toml`), "utf8");
@@ -5426,7 +5456,7 @@ async function install(options, runtime = defaultRuntime) {
5426
5456
  ].filter((path) => path !== void 0);
5427
5457
  const existingConfig = await readText(target.config);
5428
5458
  const previousPlan = readManagedPlan(existingConfig);
5429
- const config = installConfig(existingConfig, options.autonomy, runtime.platform, plan, options.maxSubagents);
5459
+ const config = installConfig(existingConfig, options.autonomy, runtime.platform, plan, options.maxSubagents, options.fast ?? false);
5430
5460
  await atomicWrite(target.config, config);
5431
5461
  await rm(target.cache, {
5432
5462
  recursive: true,
@@ -5501,6 +5531,7 @@ async function writeInstalledAgents(root, platform, plan) {
5501
5531
  let source = await readText(path);
5502
5532
  source = replaceTomlString(source, "model", route.model);
5503
5533
  source = replaceTomlString(source, "model_reasoning_effort", route.reasoningEffort);
5534
+ source = replaceTomlString(source, "model_verbosity", "low");
5504
5535
  if (platform === "win32") {
5505
5536
  await atomicWrite(path, source);
5506
5537
  return;
@@ -5568,16 +5599,16 @@ function supportsColor(isTTY, noColor) {
5568
5599
  }
5569
5600
  /** Renders help. */
5570
5601
  function renderHelp(version, color) {
5571
- const title = paint(color, `${BOLD}${CYAN}`, `HOLYCODEX ${version}`);
5602
+ const title = paint(color, `${BOLD}${CYAN}`, `HolyCodex ${version}`);
5572
5603
  const section = (text) => paint(color, BOLD, text);
5573
5604
  const muted = (text) => paint(color, DIM, text);
5574
- return `${title}\n${muted("Lean Codex toolkit installer and doctor")}\n\n${section("USAGE")}\n holycodex <command> [options]\n\n${section("COMMANDS")}\n install Install or update HolyCodex\n cleanup Remove HolyCodex-owned state\n doctor Diagnose installation and runtime\n\n${section("OPTIONS")}\n --plan <plan> Model routing plan for install: ${PLAN_HELP}\n Default: ${DEFAULT_PLAN}\n --max-subagents <count> Override concurrent direct subagents for install\n -h, --help Show help\n -v, --version Show version\n --no-tui Accepted; commands remain noninteractive\n --codex-autonomous Never ask; keep workspace sandbox\n --no-codex-autonomous Safe interactive defaults\n --dangerous-codex-autonomous Never ask; disable filesystem sandbox\n --json Print machine-readable output\n`;
5605
+ return `${title}\n${muted("Lean Codex toolkit installer and doctor")}\n\n${section("USAGE")}\n holycodex <command> [options]\n\n${section("COMMANDS")}\n install Install or update HolyCodex\n cleanup Remove HolyCodex-owned state\n doctor Diagnose installation and runtime\n\n${section("OPTIONS")}\n --plan <plan> Model routing plan for install: ${PLAN_HELP}\n Default: ${DEFAULT_PLAN}\n --max-subagents <count> Override concurrent direct subagents for install\n --fast Use Codex fast service tier\n --no-fast Use Codex default service tier\n -h, --help Show help\n -v, --version Show version\n --no-tui Accepted; commands remain noninteractive\n --codex-autonomous Never ask; keep workspace sandbox\n --no-codex-autonomous Safe interactive defaults\n --dangerous-codex-autonomous Never ask; disable filesystem sandbox\n --json Print machine-readable output\n`;
5575
5606
  }
5576
5607
  /** Renders install-specific model plan and option help. */
5577
5608
  function renderInstallHelp(version, color) {
5578
- const title = paint(color, `${BOLD}${CYAN}`, `HOLYCODEX ${version}`);
5609
+ const title = paint(color, `${BOLD}${CYAN}`, `HolyCodex ${version}`);
5579
5610
  const section = (text) => paint(color, BOLD, text);
5580
- return `${title}\n\n${section("Usage:")}\n holycodex install [options]\n\n${section("Options:")}\n --plan <plan> Model routing plan: ${PLAN_HELP}\n Default: ${DEFAULT_PLAN}\n --max-subagents <count> Override concurrent direct subagents\n --json Print machine-readable output\n --no-tui Accepted; install remains noninteractive\n --codex-autonomous Never ask; keep workspace sandbox\n --no-codex-autonomous Safe interactive defaults\n --dangerous-codex-autonomous Never ask; disable filesystem sandbox\n -h, --help Show help\n\nPlans provide increasing expected model usage and capability.\n\n${section("Examples:")}\n bunx holycodex install\n bunx holycodex install --plan go\n bunx holycodex install --plan plus-low\n bunx holycodex install --plan plus-high\n bunx holycodex install --plan pro-5x\n bunx holycodex install --plan pro-20x\n`;
5611
+ return `${title}\n\n${section("Usage:")}\n holycodex install [options]\n\n${section("Options:")}\n --plan <plan> Model routing plan: ${PLAN_HELP}\n Default: ${DEFAULT_PLAN}\n --max-subagents <count> Override concurrent direct subagents\n --fast Use Codex fast service tier\n --no-fast Use Codex default service tier\n --json Print machine-readable output\n --no-tui Accepted; install remains noninteractive\n --codex-autonomous Never ask; keep workspace sandbox\n --no-codex-autonomous Safe interactive defaults\n --dangerous-codex-autonomous Never ask; disable filesystem sandbox\n -h, --help Show help\n\nPlans provide increasing expected model usage and capability.\n\n${section("Examples:")}\n bunx holycodex install\n bunx holycodex install --plan go\n bunx holycodex install --plan plus-low\n bunx holycodex install --plan plus-high\n bunx holycodex install --plan pro-5x\n bunx holycodex install --plan pro-20x\n`;
5581
5612
  }
5582
5613
  /** Renders error. */
5583
5614
  function renderError(message, color) {
@@ -5641,9 +5672,16 @@ async function main() {
5641
5672
  process$1.exitCode = 1;
5642
5673
  return;
5643
5674
  }
5675
+ const fastFlags = args.filter((arg) => ["--fast", "--no-fast"].includes(arg));
5676
+ if (fastFlags.length > 1) {
5677
+ process$1.stderr.write(renderError(`Conflicting fast flags: ${fastFlags.join(", ")}`, stderrColor));
5678
+ process$1.exitCode = 1;
5679
+ return;
5680
+ }
5644
5681
  const options = {
5645
5682
  autonomy: args.includes("--dangerous-codex-autonomous") ? "dangerous" : args.includes("--codex-autonomous") ? "autonomous" : "default",
5646
5683
  json: args.includes("--json"),
5684
+ fast: args.includes("--fast"),
5647
5685
  plan,
5648
5686
  ...maxSubagents === void 0 ? {} : { maxSubagents }
5649
5687
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "holycodex",
3
- "version": "0.9.4",
3
+ "version": "0.10.0-dev.30462100678.1",
4
4
  "description": "Lean Codex-only agent toolkit installer and doctor",
5
5
  "keywords": [
6
6
  "agents",
@@ -39,7 +39,7 @@
39
39
  "prepack": "vp run --workspace-root build"
40
40
  },
41
41
  "dependencies": {
42
- "@holycodex/plugin": "0.9.4",
42
+ "@holycodex/plugin": "0.10.0-dev.30462100678.1",
43
43
  "zod": "^4.4.3"
44
44
  },
45
45
  "engines": {