holycodex 0.11.2 → 0.11.3

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 +3 -1
  2. package/dist/cli.js +96 -24
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -11,6 +11,8 @@ Use `holycodex --help` for commands, autonomy options, routing plans, and servic
11
11
 
12
12
  On a fresh installation, omitting autonomy flags seeds Codex Approve for me semantics: `approval_policy = "on-request"`, `approvals_reviewer = "auto_review"`, and `sandbox_mode = "workspace-write"`. On an existing installation, omitting autonomy flags preserves the complete current permission selection. `--no-codex-autonomous`, `--codex-autonomous`, and `--dangerous-codex-autonomous` explicitly replace that selection with their documented modes. HolyCodex never generates `default_permissions` or selects a named permission profile.
13
13
 
14
- Install also attempts to add or enable the official `codex-security@openai-curated` plugin through structured Codex CLI commands. If no global Codex CLI is available, HolyCodex can use the active Bun executable or a supported npm/pnpm package runner. External availability failures are non-fatal and reported in human and JSON results. Cleanup leaves this independent official plugin installed. Build Web Apps remains separately managed by Codex.
14
+ Install also attempts to add or enable the official `codex-security@openai-curated` and `computer-use@openai-bundled` plugins through structured Codex CLI commands. If no global Codex CLI is available, HolyCodex can use the active Bun executable or a supported npm/pnpm package runner. External availability failures are non-fatal and reported in human and JSON results. Cleanup leaves these independent official plugins installed. Build Web Apps remains separately managed by Codex.
15
+
16
+ Human-readable installs show each step as it completes. Use `-v` or `--verbose` for launcher, backup, plan, and plugin-state details; `--json` remains progress-free and machine-readable.
15
17
 
16
18
  Repository, documentation, license, and security notices: https://github.com/davidbasilefilho/holycodex
package/dist/cli.js CHANGED
@@ -4080,7 +4080,7 @@ function superRefine(fn, params) {
4080
4080
  }
4081
4081
  //#endregion
4082
4082
  //#region packages/cli/src/catalog.ts
4083
- var VERSION = "0.11.2";
4083
+ var VERSION = "0.11.3";
4084
4084
  var SKILLS = [
4085
4085
  "ast-grep",
4086
4086
  "babysit-ci",
@@ -4588,7 +4588,8 @@ var INSTALL_FLAGS = /* @__PURE__ */ new Set([
4588
4588
  "--fast",
4589
4589
  "--fast-all",
4590
4590
  "--no-fast",
4591
- "--json"
4591
+ "--json",
4592
+ "--verbose"
4592
4593
  ]);
4593
4594
  var SHARED_FLAGS = /* @__PURE__ */ new Set(["--json"]);
4594
4595
  /** Strictly parses command-specific HolyCodex CLI arguments. */
@@ -4611,6 +4612,12 @@ function parseCliArguments(args) {
4611
4612
  const values = /* @__PURE__ */ new Map();
4612
4613
  for (let index = 1; index < args.length; index += 1) {
4613
4614
  const token = args[index];
4615
+ if (token === "-v") {
4616
+ if (!allowed.has("--verbose")) throw new Error(`Option -v is not valid for ${command}.`);
4617
+ if (values.has("--verbose")) throw new Error("Repeated option: --verbose");
4618
+ values.set("--verbose", true);
4619
+ continue;
4620
+ }
4614
4621
  if (token === void 0 || !token.startsWith("--")) throw new Error(`Unexpected positional argument: ${token ?? ""}`);
4615
4622
  const separator = token.indexOf("=");
4616
4623
  const name = separator < 0 ? token : token.slice(0, separator);
@@ -4660,7 +4667,8 @@ function parseCliArguments(args) {
4660
4667
  plan: plan.data,
4661
4668
  ...maxValue === void 0 ? {} : { maxSubagents: Number(maxValue) },
4662
4669
  autonomy,
4663
- fast
4670
+ fast,
4671
+ verbose: values.has("--verbose")
4664
4672
  };
4665
4673
  }
4666
4674
  function base(action) {
@@ -4669,7 +4677,8 @@ function base(action) {
4669
4677
  json: false,
4670
4678
  plan: DEFAULT_PLAN,
4671
4679
  autonomy: { requested: false },
4672
- fast: "standard"
4680
+ fast: "standard",
4681
+ verbose: false
4673
4682
  };
4674
4683
  }
4675
4684
  //#endregion
@@ -5743,8 +5752,14 @@ function deduplicate(candidates) {
5743
5752
  }
5744
5753
  //#endregion
5745
5754
  //#region packages/cli/src/codex-security.ts
5746
- var CODEX_SECURITY_PLUGIN = "codex-security@openai-curated";
5747
- var CODEX_SECURITY_MARKETPLACE = "openai-curated";
5755
+ var CODEX_SECURITY_PLUGIN = {
5756
+ id: "codex-security@openai-curated",
5757
+ marketplace: "openai-curated"
5758
+ };
5759
+ var COMPUTER_USE_PLUGIN = {
5760
+ id: "computer-use@openai-bundled",
5761
+ marketplace: "openai-bundled"
5762
+ };
5748
5763
  var CODEX_PLUGIN_OPERATIONAL_TIMEOUT_MS = 15e3;
5749
5764
  var CODEX_PACKAGE_BOOTSTRAP_TIMEOUT_MS = 12e4;
5750
5765
  var MAX_CODEX_CATALOG_DIAGNOSTIC_CHARS = 256 * 1024;
@@ -5785,6 +5800,14 @@ var FATAL_POLICY_CODES = /* @__PURE__ */ new Set([
5785
5800
  ]);
5786
5801
  /** Installs or enables the official Codex Security plugin without failing HolyCodex installation. */
5787
5802
  async function installCodexSecurity(runProcess = runManagedProcess, platform = process.platform, env = process.env, options = {}) {
5803
+ return installOfficialPlugin(CODEX_SECURITY_PLUGIN, runProcess, platform, env, options);
5804
+ }
5805
+ /** Installs or enables the official Computer Use plugin without failing HolyCodex installation. */
5806
+ async function installComputerUse(runProcess = runManagedProcess, platform = process.platform, env = process.env, options = {}) {
5807
+ return installOfficialPlugin(COMPUTER_USE_PLUGIN, runProcess, platform, env, options);
5808
+ }
5809
+ /** Installs or enables one official Codex plugin through a verified catalog entry. */
5810
+ async function installOfficialPlugin(plugin, runProcess = runManagedProcess, platform = process.platform, env = process.env, options = {}) {
5788
5811
  const runtimeFacts = options.runtimeFacts ?? (runProcess === runManagedProcess ? defaultCodexLauncherRuntimeFacts(platform) : void 0);
5789
5812
  const candidates = createCodexLauncherCandidates({
5790
5813
  ...options.injected === void 0 ? {} : { injected: options.injected },
@@ -5804,7 +5827,7 @@ async function installCodexSecurity(runProcess = runManagedProcess, platform = p
5804
5827
  continue;
5805
5828
  }
5806
5829
  if (installedOutcome.kind === "fatal") return skipped(installedOutcome.reason, attemptedLaunchers);
5807
- const installedPlugin = findPlugin(installedOutcome.catalog);
5830
+ const installedPlugin = findPlugin(installedOutcome.catalog, plugin.id);
5808
5831
  if (installedPlugin?.installed === true && installedPlugin.enabled === true) return {
5809
5832
  status: "already-installed",
5810
5833
  launcherSource: launcher.source
@@ -5822,7 +5845,7 @@ async function installCodexSecurity(runProcess = runManagedProcess, platform = p
5822
5845
  continue;
5823
5846
  }
5824
5847
  if (catalogOutcome.kind === "fatal") return skipped(catalogOutcome.reason, attemptedLaunchers);
5825
- if (findPlugin(catalogOutcome.catalog) === void 0) {
5848
+ if (findPlugin(catalogOutcome.catalog, plugin.id) === void 0) {
5826
5849
  const marketplaceOutcome = inspectMarketplaceResult(await runCodexPlugin(runProcess, launcher, [
5827
5850
  "plugin",
5828
5851
  "marketplace",
@@ -5834,14 +5857,14 @@ async function installCodexSecurity(runProcess = runManagedProcess, platform = p
5834
5857
  continue;
5835
5858
  }
5836
5859
  if (marketplaceOutcome.kind === "fatal") return skipped(marketplaceOutcome.reason, attemptedLaunchers);
5837
- fallbackReasons.push(marketplaceOutcome.marketplaces.includes(CODEX_SECURITY_MARKETPLACE) ? "plugin-not-offered" : "marketplace-unavailable");
5860
+ fallbackReasons.push(marketplaceOutcome.marketplaces.includes(plugin.marketplace) ? "plugin-not-offered" : "marketplace-unavailable");
5838
5861
  continue;
5839
5862
  }
5840
5863
  }
5841
5864
  const addOutcome = inspectAddResult(await runCodexPlugin(runProcess, launcher, [
5842
5865
  "plugin",
5843
5866
  "add",
5844
- CODEX_SECURITY_PLUGIN,
5867
+ plugin.id,
5845
5868
  "--json"
5846
5869
  ], platform, env, "add"), launcher);
5847
5870
  if (addOutcome.kind === "fallback") {
@@ -5859,7 +5882,7 @@ async function installCodexSecurity(runProcess = runManagedProcess, platform = p
5859
5882
  continue;
5860
5883
  }
5861
5884
  if (verification.kind === "fatal") return skipped(verification.reason, attemptedLaunchers);
5862
- const verifiedPlugin = findPlugin(verification.catalog);
5885
+ const verifiedPlugin = findPlugin(verification.catalog, plugin.id);
5863
5886
  if (verifiedPlugin?.installed !== true || verifiedPlugin.enabled !== true) {
5864
5887
  fallbackReasons.push("verification-failed");
5865
5888
  continue;
@@ -5946,8 +5969,8 @@ function inspectMarketplaceResult(result, launcher) {
5946
5969
  marketplaces
5947
5970
  };
5948
5971
  }
5949
- function findPlugin(catalog) {
5950
- return catalog.plugins.find(({ id }) => id === CODEX_SECURITY_PLUGIN);
5972
+ function findPlugin(catalog, pluginId) {
5973
+ return catalog.plugins.find(({ id }) => id === pluginId);
5951
5974
  }
5952
5975
  function classifyFailure(result, launcher) {
5953
5976
  if (result.error !== void 0) {
@@ -6313,10 +6336,13 @@ function assertGitBashReady(platform, resolution) {
6313
6336
  }
6314
6337
  /** Provides install. */
6315
6338
  async function install(options, runtime = defaultRuntime) {
6339
+ notify(options, "prerequisites", "Checking prerequisites", "running");
6316
6340
  assertGitBashReady(runtime.platform, runtime.gitBash());
6341
+ notify(options, "prerequisites", "Checking prerequisites", "complete");
6317
6342
  const plan = options.plan ?? "plus";
6318
6343
  const target = paths();
6319
6344
  const root = backupRoot();
6345
+ notify(options, "backup", "Backing up existing installation", "running");
6320
6346
  const configBackup = await backup(target.config, root);
6321
6347
  const cacheBackup = await backup(target.marketplaceCache, root);
6322
6348
  const agentsBackup = await backup(target.agents, root);
@@ -6326,10 +6352,14 @@ async function install(options, runtime = defaultRuntime) {
6326
6352
  agentsBackup,
6327
6353
  ...await Promise.all(target.legacy.map((path) => backup(path, root)))
6328
6354
  ].filter((path) => path !== void 0);
6355
+ notify(options, "backup", "Backing up existing installation", "complete", `${backups.length} saved`);
6356
+ notify(options, "configuration", "Preparing configuration", "running");
6329
6357
  const existingConfig = await readText(target.config);
6330
6358
  const previousPlan = readManagedPlan(existingConfig);
6331
6359
  const fastMode = options.fast ?? "standard";
6332
6360
  const config = installConfig(existingConfig, options.autonomy, runtime.platform, plan, options.maxSubagents, fastMode);
6361
+ notify(options, "configuration", "Preparing configuration", "complete", plan);
6362
+ notify(options, "staging", "Staging plugin and agent files", "running");
6333
6363
  const existingAgentPreferences = await readAgentPreferences(target.agents, previousPlan);
6334
6364
  const staging = await mkdtemp(join(tmpdir(), "holycodex-stage-"));
6335
6365
  const stagedCache = join(staging, "cache");
@@ -6339,10 +6369,15 @@ async function install(options, runtime = defaultRuntime) {
6339
6369
  await cp(join(pluginRoot, "agents"), stagedAgents, { recursive: true });
6340
6370
  await writeInstalledAgents(stagedAgents, runtime.platform, plan, fastMode);
6341
6371
  await preserveAgentPreferences(stagedAgents, existingAgentPreferences, plan, fastMode);
6372
+ notify(options, "staging", "Staging plugin and agent files", "complete");
6373
+ notify(options, "validation", "Validating staged installation", "running");
6342
6374
  await validateStaging(stagedCache, stagedAgents);
6375
+ notify(options, "validation", "Validating staged installation", "complete");
6343
6376
  const removedLegacy = [];
6344
6377
  let codexSecurity;
6378
+ let computerUse;
6345
6379
  try {
6380
+ notify(options, "managed-files", "Installing managed files", "running");
6346
6381
  await atomicWrite(target.config, config);
6347
6382
  await rm(target.cache, {
6348
6383
  recursive: true,
@@ -6360,8 +6395,16 @@ async function install(options, runtime = defaultRuntime) {
6360
6395
  await rm(path, { recursive: true });
6361
6396
  removedLegacy.push(path);
6362
6397
  }
6398
+ notify(options, "managed-files", "Installing managed files", "complete");
6399
+ notify(options, "codex-security", "Installing Codex Security", "running");
6363
6400
  codexSecurity = await installCodexSecurity(runtime.runProcess, runtime.platform, process.env);
6401
+ notify(options, "codex-security", "Installing Codex Security", "complete", pluginProgressDetail(codexSecurity));
6402
+ notify(options, "computer-use", "Installing Computer Use", "running");
6403
+ computerUse = await installComputerUse(runtime.runProcess, runtime.platform, process.env);
6404
+ notify(options, "computer-use", "Installing Computer Use", "complete", pluginProgressDetail(computerUse));
6405
+ notify(options, "cleanup", "Removing obsolete caches", "running");
6364
6406
  await removeObsoleteVersionCaches(target.cacheRoot);
6407
+ notify(options, "cleanup", "Removing obsolete caches", "complete");
6365
6408
  } catch (error) {
6366
6409
  await restoreTarget(target.config, configBackup);
6367
6410
  await restoreTarget(target.marketplaceCache, cacheBackup);
@@ -6385,9 +6428,22 @@ async function install(options, runtime = defaultRuntime) {
6385
6428
  backups,
6386
6429
  plan,
6387
6430
  codexSecurity,
6431
+ computerUse,
6388
6432
  ...options.maxSubagents === void 0 ? {} : { maxSubagents: options.maxSubagents }
6389
6433
  };
6390
6434
  }
6435
+ function notify(options, step, label, status, detail) {
6436
+ options.onProgress?.({
6437
+ step,
6438
+ label,
6439
+ status,
6440
+ ...detail === void 0 ? {} : { detail }
6441
+ });
6442
+ }
6443
+ function pluginProgressDetail(result) {
6444
+ if (result.status === "skipped") return `skipped: ${result.reason}`;
6445
+ return result.launcherSource === void 0 ? result.status : `${result.status} via ${result.launcherSource}`;
6446
+ }
6391
6447
  async function validateStaging(cache, agents) {
6392
6448
  const required = [
6393
6449
  join(cache, ".codex-plugin", "plugin.json"),
@@ -6408,7 +6464,7 @@ async function restoreTarget(target, source) {
6408
6464
  }
6409
6465
  async function removeObsoleteVersionCaches(cacheRoot) {
6410
6466
  if (!await exists(cacheRoot)) return;
6411
- for (const entry of await readdir(cacheRoot)) if (entry !== "0.11.2") await rm(join(cacheRoot, entry), {
6467
+ for (const entry of await readdir(cacheRoot)) if (entry !== "0.11.3") await rm(join(cacheRoot, entry), {
6412
6468
  recursive: true,
6413
6469
  force: true
6414
6470
  });
@@ -6577,17 +6633,21 @@ function renderHelp(version, color) {
6577
6633
  const title = paint(color, `${BOLD}${CYAN}`, `HolyCodex ${version}`);
6578
6634
  const section = (text) => paint(color, BOLD, text);
6579
6635
  const muted = (text) => paint(color, DIM, text);
6580
- 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 Fast for generated subagents only\n --fast-all Use Fast for Root and generated subagents\n --no-fast Use Standard for Root and generated subagents\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`;
6636
+ 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 Fast for generated subagents only\n --fast-all Use Fast for Root and generated subagents\n --no-fast Use Standard for Root and generated subagents\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 install --verbose Show detailed install steps
6637
+ --json Print machine-readable output\n`;
6581
6638
  }
6582
6639
  /** Renders install-specific model plan and option help. */
6583
6640
  function renderInstallHelp(version, color) {
6584
6641
  const title = paint(color, `${BOLD}${CYAN}`, `HolyCodex ${version}`);
6585
6642
  const section = (text) => paint(color, BOLD, text);
6586
- 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 Fast for generated subagents only\n --fast-all Use Fast for Root and generated subagents\n --no-fast Use Standard for Root and generated 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. Fast flags are mutually exclusive.\n\n${section("Examples:")}\n bunx holycodex install\n bunx holycodex install --plan go\n bunx holycodex install --plan plus-low --fast\n bunx holycodex install --plan plus-high\n bunx holycodex install --plan pro-5x --fast-all\n bunx holycodex install --plan pro-20x --no-fast\n`;
6643
+ 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 Fast for generated subagents only\n --fast-all Use Fast for Root and generated subagents\n --no-fast Use Standard for Root and generated subagents\n -v, --verbose Show detailed install steps
6644
+ --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. Fast flags are mutually exclusive.\n\n${section("Examples:")}\n bunx holycodex install\n bunx holycodex install --plan go\n bunx holycodex install --plan plus-low --fast\n bunx holycodex install --plan plus-high\n bunx holycodex install --plan pro-5x --fast-all\n bunx holycodex install --plan pro-20x --no-fast\n`;
6587
6645
  }
6588
6646
  /** Renders error. */
6589
6647
  function renderError(message, color) {
6590
- return `${paint(color, `${BOLD}${RED}`, "✗ ERROR")} ${message}\n ${paint(color, DIM, "Run holycodex --help for usage.")}\n`;
6648
+ const label = paint(color, `${BOLD}${RED}`, "✗ ERROR");
6649
+ const hint = paint(color, DIM, "Run holycodex --help for usage.");
6650
+ return `${color ? "\r\x1B[2K" : ""}${label} ${message}\n ${hint}\n`;
6591
6651
  }
6592
6652
  /** Renders doctor. */
6593
6653
  function renderDoctor(result, color) {
@@ -6603,14 +6663,17 @@ function renderRunResult(result, color) {
6603
6663
  const action = result.action === "install" ? "Updated" : "Removed";
6604
6664
  const empty = result.action === "install" ? "changes" : "removal";
6605
6665
  const backup = result.backups.length === 0 ? "" : `\n Existing HolyCodex files were backed up before ${result.action === "install" ? "replacement" : "cleanup"}.`;
6606
- return `${title}\n ${result.changed.length === 0 ? `No HolyCodex-managed files needed ${empty}.` : `${action} HolyCodex configuration, plugin files, and agent profiles.`}${backup}${renderCodexSecurity(result)}\n`;
6666
+ return `${title}\n ${result.changed.length === 0 ? `No HolyCodex-managed files needed ${empty}.` : `${action} HolyCodex configuration, plugin files, and agent profiles.`}${backup}${renderOfficialPlugins(result)}\n`;
6667
+ }
6668
+ function renderOfficialPlugins(result) {
6669
+ return [renderOfficialPlugin("Codex Security", result.codexSecurity), renderOfficialPlugin("Computer Use", result.computerUse)].join("");
6607
6670
  }
6608
- function renderCodexSecurity(result) {
6609
- if (result.codexSecurity === void 0) return "";
6610
- if (result.codexSecurity.status === "installed") return "\n Installed official Codex Security plugin.";
6611
- if (result.codexSecurity.status === "enabled") return "\n Enabled existing official Codex Security plugin.";
6612
- if (result.codexSecurity.status === "already-installed") return "\n Official Codex Security plugin is already installed and enabled.";
6613
- return `\n Skipped official Codex Security plugin: ${CODEX_SECURITY_SKIP_MESSAGES[result.codexSecurity.reason]}`;
6671
+ function renderOfficialPlugin(name, plugin) {
6672
+ if (plugin === void 0) return "";
6673
+ if (plugin.status === "installed") return `\n Installed official ${name} plugin.`;
6674
+ if (plugin.status === "enabled") return `\n Enabled existing official ${name} plugin.`;
6675
+ if (plugin.status === "already-installed") return `\n Official ${name} plugin is already installed and enabled.`;
6676
+ return `\n Skipped official ${name} plugin: ${CODEX_SECURITY_SKIP_MESSAGES[plugin.reason]}`;
6614
6677
  }
6615
6678
  var CODEX_SECURITY_SKIP_MESSAGES = {
6616
6679
  "codex-unavailable": "no usable Codex launcher was found.",
@@ -6626,6 +6689,13 @@ var CODEX_SECURITY_SKIP_MESSAGES = {
6626
6689
  unsupported: "the available Codex launchers do not support plugin installation.",
6627
6690
  "download-failed": "the latest Codex package could not be downloaded."
6628
6691
  };
6692
+ /** Renders one concise installation progress transition. */
6693
+ function renderInstallProgress(event, color, isTTY, verbose) {
6694
+ const detail = verbose && event.detail !== void 0 ? ` ${paint(color, DIM, event.detail)}` : "";
6695
+ if (event.status === "running") return isTTY ? `\r${paint(color, CYAN, "●")} ${event.label}` : "";
6696
+ const line = `${paint(color, GREEN, "✓")} ${event.label}${detail}`;
6697
+ return isTTY ? `\r\u001B[2K${line}\n` : ` ${line}\n`;
6698
+ }
6629
6699
  /** Renders notice. */
6630
6700
  function renderNotice(kind, message, color) {
6631
6701
  return `${paint(color, kind === "warning" ? RED : YELLOW, `! ${kind === "warning" ? "WARNING" : "NOTICE"}`)} ${message}\n`;
@@ -6649,6 +6719,8 @@ async function main() {
6649
6719
  fast: parsed.fast,
6650
6720
  json: parsed.json,
6651
6721
  plan: parsed.plan,
6722
+ verbose: parsed.verbose,
6723
+ ...parsed.command === "install" && !parsed.json ? { onProgress: (event) => process$1.stdout.write(renderInstallProgress(event, stdoutColor, process$1.stdout.isTTY === true, parsed.verbose)) } : {},
6652
6724
  ...parsed.maxSubagents === void 0 ? {} : { maxSubagents: parsed.maxSubagents }
6653
6725
  };
6654
6726
  if (parsed.command === "doctor") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "holycodex",
3
- "version": "0.11.2",
3
+ "version": "0.11.3",
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.11.2",
42
+ "@holycodex/plugin": "0.11.3",
43
43
  "zod": "^4.4.3"
44
44
  },
45
45
  "engines": {