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.
- package/README.md +3 -1
- package/dist/cli.js +96 -24
- 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`
|
|
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.
|
|
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 =
|
|
5747
|
-
|
|
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(
|
|
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
|
-
|
|
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 ===
|
|
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.
|
|
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 --
|
|
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
|
|
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
|
-
|
|
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}${
|
|
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
|
|
6609
|
-
if (
|
|
6610
|
-
if (
|
|
6611
|
-
if (
|
|
6612
|
-
if (
|
|
6613
|
-
return `\n Skipped official
|
|
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.
|
|
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.
|
|
42
|
+
"@holycodex/plugin": "0.11.3",
|
|
43
43
|
"zod": "^4.4.3"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|