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.
- package/README.md +1 -1
- package/dist/cli.js +74 -36
- 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
|
|
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.
|
|
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
|
|
4995
|
-
return
|
|
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
|
|
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
|
|
5017
|
-
|
|
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 =
|
|
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(
|
|
5064
|
-
const reasoningEffort = rootTomlString(
|
|
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
|
|
5121
|
-
|
|
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 =
|
|
5133
|
-
const
|
|
5134
|
-
let configured = `${
|
|
5135
|
-
configured =
|
|
5136
|
-
configured =
|
|
5137
|
-
configured =
|
|
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 =
|
|
5140
|
-
configured =
|
|
5141
|
-
|
|
5142
|
-
|
|
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}`, `
|
|
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}`, `
|
|
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.
|
|
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.
|
|
42
|
+
"@holycodex/plugin": "0.10.0-dev.30462100678.1",
|
|
43
43
|
"zod": "^4.4.3"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|