holycodex 0.9.3 → 0.9.5
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 +99 -50
- 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.9.
|
|
4255
|
+
var VERSION = "0.9.5";
|
|
4256
4256
|
var SKILLS = [
|
|
4257
4257
|
"ast-grep",
|
|
4258
4258
|
"caveman",
|
|
@@ -4385,7 +4385,7 @@ var MODEL_ROUTING_PLANS = ModelRoutingPlansSchema.parse({
|
|
|
4385
4385
|
},
|
|
4386
4386
|
librarian: {
|
|
4387
4387
|
model: "gpt-5.6-terra",
|
|
4388
|
-
reasoningEffort: "
|
|
4388
|
+
reasoningEffort: "medium"
|
|
4389
4389
|
},
|
|
4390
4390
|
worker: {
|
|
4391
4391
|
model: "gpt-5.6-terra",
|
|
@@ -4412,8 +4412,8 @@ var MODEL_ROUTING_PLANS = ModelRoutingPlansSchema.parse({
|
|
|
4412
4412
|
reasoningEffort: "high"
|
|
4413
4413
|
},
|
|
4414
4414
|
worker: {
|
|
4415
|
-
model: "gpt-5.6-
|
|
4416
|
-
reasoningEffort: "
|
|
4415
|
+
model: "gpt-5.6-terra",
|
|
4416
|
+
reasoningEffort: "high"
|
|
4417
4417
|
}
|
|
4418
4418
|
},
|
|
4419
4419
|
usage: {
|
|
@@ -4432,8 +4432,8 @@ var MODEL_ROUTING_PLANS = ModelRoutingPlansSchema.parse({
|
|
|
4432
4432
|
reasoningEffort: "high"
|
|
4433
4433
|
},
|
|
4434
4434
|
librarian: {
|
|
4435
|
-
model: "gpt-5.6-
|
|
4436
|
-
reasoningEffort: "
|
|
4435
|
+
model: "gpt-5.6-terra",
|
|
4436
|
+
reasoningEffort: "high"
|
|
4437
4437
|
},
|
|
4438
4438
|
worker: {
|
|
4439
4439
|
model: "gpt-5.6-sol",
|
|
@@ -4456,8 +4456,8 @@ var MODEL_ROUTING_PLANS = ModelRoutingPlansSchema.parse({
|
|
|
4456
4456
|
reasoningEffort: "xhigh"
|
|
4457
4457
|
},
|
|
4458
4458
|
librarian: {
|
|
4459
|
-
model: "gpt-5.6-
|
|
4460
|
-
reasoningEffort: "
|
|
4459
|
+
model: "gpt-5.6-sol",
|
|
4460
|
+
reasoningEffort: "medium"
|
|
4461
4461
|
},
|
|
4462
4462
|
worker: {
|
|
4463
4463
|
model: "gpt-5.6-sol",
|
|
@@ -4500,6 +4500,9 @@ var LEGACY_MANAGED_AGENT_MODEL_HISTORY = {
|
|
|
4500
4500
|
librarian: [{
|
|
4501
4501
|
model: "gpt-5.6-luna",
|
|
4502
4502
|
reasoningEffort: "low"
|
|
4503
|
+
}, {
|
|
4504
|
+
model: "gpt-5.6-terra",
|
|
4505
|
+
reasoningEffort: "low"
|
|
4503
4506
|
}],
|
|
4504
4507
|
worker: [{
|
|
4505
4508
|
model: "gpt-5.6-terra",
|
|
@@ -4518,6 +4521,9 @@ var LEGACY_MANAGED_AGENT_MODEL_HISTORY = {
|
|
|
4518
4521
|
worker: [{
|
|
4519
4522
|
model: "gpt-5.6-terra",
|
|
4520
4523
|
reasoningEffort: "high"
|
|
4524
|
+
}, {
|
|
4525
|
+
model: "gpt-5.6-sol",
|
|
4526
|
+
reasoningEffort: "low"
|
|
4521
4527
|
}]
|
|
4522
4528
|
},
|
|
4523
4529
|
"pro-5x": {
|
|
@@ -4531,6 +4537,9 @@ var LEGACY_MANAGED_AGENT_MODEL_HISTORY = {
|
|
|
4531
4537
|
librarian: [{
|
|
4532
4538
|
model: "gpt-5.6-terra",
|
|
4533
4539
|
reasoningEffort: "high"
|
|
4540
|
+
}, {
|
|
4541
|
+
model: "gpt-5.6-luna",
|
|
4542
|
+
reasoningEffort: "xhigh"
|
|
4534
4543
|
}],
|
|
4535
4544
|
worker: [{
|
|
4536
4545
|
model: "gpt-5.6-terra",
|
|
@@ -4545,13 +4554,20 @@ var LEGACY_MANAGED_AGENT_MODEL_HISTORY = {
|
|
|
4545
4554
|
model: "gpt-5.6-sol",
|
|
4546
4555
|
reasoningEffort: "medium"
|
|
4547
4556
|
}],
|
|
4548
|
-
librarian: [
|
|
4549
|
-
|
|
4550
|
-
|
|
4551
|
-
|
|
4552
|
-
|
|
4553
|
-
|
|
4554
|
-
|
|
4557
|
+
librarian: [
|
|
4558
|
+
{
|
|
4559
|
+
model: "gpt-5.6-terra",
|
|
4560
|
+
reasoningEffort: "high"
|
|
4561
|
+
},
|
|
4562
|
+
{
|
|
4563
|
+
model: "gpt-5.6-sol",
|
|
4564
|
+
reasoningEffort: "medium"
|
|
4565
|
+
},
|
|
4566
|
+
{
|
|
4567
|
+
model: "gpt-5.6-luna",
|
|
4568
|
+
reasoningEffort: "xhigh"
|
|
4569
|
+
}
|
|
4570
|
+
],
|
|
4555
4571
|
worker: [{
|
|
4556
4572
|
model: "gpt-5.6-terra",
|
|
4557
4573
|
reasoningEffort: "high"
|
|
@@ -4975,8 +4991,8 @@ function removeManaged(input) {
|
|
|
4975
4991
|
return input.replace(new RegExp(`${escapedStart}([\\s\\S]*?)${escapedEnd}(?:\\r?\\n){0,2}`, "g"), (_match, body) => {
|
|
4976
4992
|
const encoded = body.match(/^# holycodex original root: ([A-Za-z0-9+/=]+)$/m)?.[1];
|
|
4977
4993
|
if (encoded !== void 0) return `${Buffer.from(encoded, "base64").toString("utf8")}\n`;
|
|
4978
|
-
const
|
|
4979
|
-
return
|
|
4994
|
+
const tableKeys = [...body.matchAll(/^# holycodex original table key: ([A-Za-z0-9+/=]+)$/gm)].flatMap((match) => match[1] === void 0 ? [] : [match[1]]);
|
|
4995
|
+
return tableKeys.length === 0 ? "" : `${tableKeys.map((key) => Buffer.from(key, "base64").toString("utf8")).join("\n")}\n`;
|
|
4980
4996
|
}).trim();
|
|
4981
4997
|
}
|
|
4982
4998
|
/** Removes legacy omo. */
|
|
@@ -4992,18 +5008,17 @@ function removeLegacyOmo(input) {
|
|
|
4992
5008
|
].some((name) => header === name || header.startsWith(`${name}.`)) || !/(?:sisyphuslabs|omo@|oh-my|code-yeongyu)/i.test(section);
|
|
4993
5009
|
}).join("").trimEnd();
|
|
4994
5010
|
}
|
|
4995
|
-
function
|
|
5011
|
+
function injectTableKeys(input, table, entries) {
|
|
4996
5012
|
const match = new RegExp(`^\\s*\\[${table.replaceAll(".", "\\.")}]\\s*(?:#.*)?$`, "m").exec(input);
|
|
4997
5013
|
const tail = match === null ? "" : input.slice(match.index + match[0].length);
|
|
4998
5014
|
const tableEnd = nextTableBoundary(tail);
|
|
4999
5015
|
const tableBody = tableEnd < 0 ? tail : tail.slice(0, tableEnd);
|
|
5000
|
-
const
|
|
5001
|
-
|
|
5002
|
-
if (match === null) return `${input.trimEnd()}\n\n${START}\n[${table}]\n${key} = ${value}\n${END}`.trim();
|
|
5016
|
+
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}`;
|
|
5017
|
+
if (match === null) return `${input.trimEnd()}\n\n${START}\n[${table}]\n${entries.map(([key, value]) => `${key} = ${value}`).join("\n")}\n${END}`.trim();
|
|
5003
5018
|
const bodyStart = match.index + match[0].length;
|
|
5004
5019
|
const next = nextTableBoundary(input.slice(bodyStart));
|
|
5005
5020
|
const bodyEnd = next < 0 ? input.length : bodyStart + next;
|
|
5006
|
-
const cleanedBody =
|
|
5021
|
+
const cleanedBody = entries.reduce((body, [key]) => body.replace(new RegExp(`^\\s*${key}\\s*=.*\\r?\\n?`, "gm"), ""), input.slice(bodyStart, bodyEnd)).trim();
|
|
5007
5022
|
const suffix = input.slice(bodyEnd).trimStart();
|
|
5008
5023
|
return `${input.slice(0, bodyStart)}\n${cleanedBody ? `${cleanedBody}\n` : ""}${managed}${suffix ? `\n${suffix}` : ""}`.trim();
|
|
5009
5024
|
}
|
|
@@ -5021,6 +5036,14 @@ function rootValue(input, key) {
|
|
|
5021
5036
|
function removeRootValue(input, value) {
|
|
5022
5037
|
return value === void 0 ? input : input.replace(value, "");
|
|
5023
5038
|
}
|
|
5039
|
+
function removeRootKey(input, key) {
|
|
5040
|
+
let updated = input;
|
|
5041
|
+
for (;;) {
|
|
5042
|
+
const value = rootValue(updated, key);
|
|
5043
|
+
if (value === void 0) return updated;
|
|
5044
|
+
updated = removeRootValue(updated, value);
|
|
5045
|
+
}
|
|
5046
|
+
}
|
|
5024
5047
|
/** Reads the explicitly recorded model routing plan from managed configuration. */
|
|
5025
5048
|
function readManagedPlan(input) {
|
|
5026
5049
|
const value = new RegExp(`^${PLAN_PREFIX}(.+)$`, "m").exec(input)?.[1]?.trim();
|
|
@@ -5044,8 +5067,8 @@ function readPreservedRootOverrides(input) {
|
|
|
5044
5067
|
reasoningEffort: false
|
|
5045
5068
|
};
|
|
5046
5069
|
const plan = readManagedPlan(managedRoot);
|
|
5047
|
-
const model = rootTomlString(
|
|
5048
|
-
const reasoningEffort = rootTomlString(
|
|
5070
|
+
const model = rootTomlString(input, "model");
|
|
5071
|
+
const reasoningEffort = rootTomlString(input, "model_reasoning_effort");
|
|
5049
5072
|
if (plan === void 0 || model === void 0 || reasoningEffort === void 0) return {
|
|
5050
5073
|
model: false,
|
|
5051
5074
|
reasoningEffort: false
|
|
@@ -5075,11 +5098,6 @@ function preserveManagedRootPreferences(input, base) {
|
|
|
5075
5098
|
updatedRoot = removeRootValue(updatedRoot, rootValue(updatedRoot, key)).trim();
|
|
5076
5099
|
updatedRoot = `${updatedRoot}${updatedRoot ? "\n" : ""}${live}`;
|
|
5077
5100
|
}
|
|
5078
|
-
const verbosity = rootValue(managedRoot, "model_verbosity")?.trim();
|
|
5079
|
-
if (verbosity !== void 0 && verbosity !== (rootValue(root, "model_verbosity")?.trim() ?? "model_verbosity = \"low\"")) {
|
|
5080
|
-
updatedRoot = removeRootValue(updatedRoot, rootValue(updatedRoot, "model_verbosity")).trim();
|
|
5081
|
-
updatedRoot = `${updatedRoot}${updatedRoot ? "\n" : ""}${verbosity}`;
|
|
5082
|
-
}
|
|
5083
5101
|
if (updatedRoot === root.trim()) return base;
|
|
5084
5102
|
return `${updatedRoot}${tables ? `\n${tables.trimStart()}` : ""}`;
|
|
5085
5103
|
}
|
|
@@ -5090,7 +5108,7 @@ function mergedStatusLine(original) {
|
|
|
5090
5108
|
return `[${items.map((item) => JSON.stringify(item)).join(", ")}]`;
|
|
5091
5109
|
}
|
|
5092
5110
|
/** Installs config. */
|
|
5093
|
-
function installConfig(input, mode, _platform, plan = DEFAULT_PLAN, maxSubagents) {
|
|
5111
|
+
function installConfig(input, mode, _platform, plan = DEFAULT_PLAN, maxSubagents, fast = false) {
|
|
5094
5112
|
const base = preserveManagedRootPreferences(input, removeLegacyOmo(removeManaged(input)));
|
|
5095
5113
|
const firstTable = base.search(/^\s*\[/m);
|
|
5096
5114
|
const root = firstTable < 0 ? base : base.slice(0, firstTable);
|
|
@@ -5099,31 +5117,41 @@ function installConfig(input, mode, _platform, plan = DEFAULT_PLAN, maxSubagents
|
|
|
5099
5117
|
"approval_policy",
|
|
5100
5118
|
"sandbox_mode",
|
|
5101
5119
|
"max_concurrent_threads_per_session",
|
|
5102
|
-
"status_line"
|
|
5120
|
+
"status_line",
|
|
5121
|
+
"model_verbosity",
|
|
5122
|
+
"service_tier"
|
|
5103
5123
|
].map((key) => rootValue(root, key));
|
|
5104
|
-
const
|
|
5105
|
-
|
|
5124
|
+
const preservedRoot = [
|
|
5125
|
+
"approval_policy",
|
|
5126
|
+
"sandbox_mode",
|
|
5127
|
+
"max_concurrent_threads_per_session",
|
|
5128
|
+
"status_line",
|
|
5129
|
+
"model_verbosity",
|
|
5130
|
+
"service_tier"
|
|
5131
|
+
].reduce(removeRootKey, root).trim();
|
|
5132
|
+
const originalControlled = controlled.filter((value) => value !== void 0).sort((left, right) => root.indexOf(left) - root.indexOf(right)).join("\n");
|
|
5106
5133
|
const hasModel = /^\s*model\s*=/m.test(preservedRoot);
|
|
5107
5134
|
const hasEffort = /^\s*model_reasoning_effort\s*=/m.test(preservedRoot);
|
|
5108
|
-
const hasVerbosity = /^\s*model_verbosity\s*=/m.test(preservedRoot);
|
|
5109
5135
|
const rootRoute = MODEL_ROUTING_PLANS[plan].root;
|
|
5110
5136
|
const effectiveMaxSubagents = maxSubagents ?? MODEL_ROUTING_PLANS[plan].usage.maxSubagents;
|
|
5111
5137
|
const model = hasModel ? "" : `model = "${rootRoute.model}"\n`;
|
|
5112
5138
|
const effort = hasEffort ? "" : `model_reasoning_effort = "${rootRoute.reasoningEffort}"\n`;
|
|
5113
|
-
const verbosity = hasVerbosity ? "" : "model_verbosity = \"low\"\n";
|
|
5114
5139
|
const approval = mode === "default" ? "on-request" : "never";
|
|
5115
5140
|
const sandbox = mode === "dangerous" ? "danger-full-access" : "workspace-write";
|
|
5116
|
-
const original =
|
|
5117
|
-
const
|
|
5118
|
-
let configured = `${
|
|
5119
|
-
configured =
|
|
5120
|
-
|
|
5121
|
-
|
|
5141
|
+
const original = originalControlled ? `${ORIGINAL_ROOT}${Buffer.from(originalControlled).toString("base64")}\n` : "";
|
|
5142
|
+
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}"\nstatus_line = ${mergedStatusLine(controlled[3])}\n${END}`;
|
|
5143
|
+
let configured = `${preservedRoot ? `${preservedRoot}\n` : ""}${rootBlock}${tables ? `\n\n${tables}` : ""}`;
|
|
5144
|
+
configured = injectTableKeys(configured, "features", [
|
|
5145
|
+
["default_mode_request_user_input", "true"],
|
|
5146
|
+
["multi_agent", "true"],
|
|
5147
|
+
["multi_agent_v2", "true"]
|
|
5148
|
+
]);
|
|
5122
5149
|
const usage = MODEL_ROUTING_PLANS[plan].usage;
|
|
5123
|
-
configured =
|
|
5124
|
-
configured =
|
|
5125
|
-
|
|
5126
|
-
|
|
5150
|
+
configured = injectTableKeys(configured, "agents", [["max_threads", String(effectiveMaxSubagents + 1)], ["max_depth", String(usage.maxDepth)]]);
|
|
5151
|
+
if (mode !== "dangerous") configured = injectTableKeys(configured, "sandbox_workspace_write", [["network_access", "true"]]);
|
|
5152
|
+
configured = injectTableKeys(configured, "desktop", [["enabled-reasoning-efforts", "[\"low\", \"medium\", \"high\"]"], ["show-context-window-usage", "true"]]);
|
|
5153
|
+
if (_platform === "win32") configured = injectTableKeys(configured, "windows", [["sandbox", "\"unelevated\""]]);
|
|
5154
|
+
for (const agent of AGENTS) configured = injectTableKeys(configured, `agents.${agent}`, [["config_file", `"holycodex/agents/${agent}.toml"`]]);
|
|
5127
5155
|
const plugin = `${START}\n[plugins."holycodex@holycodex"]\nenabled = true\n${END}`;
|
|
5128
5156
|
return `${configured.trim()}\n\n${plugin}\n`;
|
|
5129
5157
|
}
|
|
@@ -5210,6 +5238,14 @@ function tableBoolean(config, table, key) {
|
|
|
5210
5238
|
const value = body === void 0 ? void 0 : new RegExp(`^\\s*${key}\\s*=\\s*(true|false)`, "m").exec(body)?.[1];
|
|
5211
5239
|
return value === void 0 ? void 0 : value === "true";
|
|
5212
5240
|
}
|
|
5241
|
+
function tableString(config, table, key) {
|
|
5242
|
+
const body = new RegExp(`^\\s*\\[${table.replaceAll(".", "\\.")}]\\s*$([\\s\\S]*?)(?=^\\s*\\[|(?![\\s\\S]))`, "m").exec(config)?.[1];
|
|
5243
|
+
return body === void 0 ? void 0 : rootTomlString(body, key);
|
|
5244
|
+
}
|
|
5245
|
+
function tableStringArray(config, table, key) {
|
|
5246
|
+
const body = new RegExp(`^\\s*\\[${table.replaceAll(".", "\\.")}]\\s*$([\\s\\S]*?)(?=^\\s*\\[|(?![\\s\\S]))`, "m").exec(config)?.[1];
|
|
5247
|
+
return body === void 0 ? void 0 : rootTomlStringArray(body, key);
|
|
5248
|
+
}
|
|
5213
5249
|
function tableInteger(config, table, key) {
|
|
5214
5250
|
const body = new RegExp(`^\\s*\\[${table.replaceAll(".", "\\.")}]\\s*$([\\s\\S]*?)(?=^\\s*\\[|(?![\\s\\S]))`, "m").exec(config)?.[1];
|
|
5215
5251
|
const value = body === void 0 ? void 0 : new RegExp(`^\\s*${key}\\s*=\\s*(\\d+)`, "m").exec(body)?.[1];
|
|
@@ -5300,12 +5336,17 @@ async function doctor(home = process.env.CODEX_HOME ?? join(homedir(), ".codex")
|
|
|
5300
5336
|
const expectedMaxSubagents = managedMaxSubagents.configured ? managedMaxSubagents.value : preset?.usage.maxSubagents;
|
|
5301
5337
|
const rootOverrides = readPreservedRootOverrides(config);
|
|
5302
5338
|
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."));
|
|
5339
|
+
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."));
|
|
5340
|
+
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."));
|
|
5303
5341
|
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"}.`));
|
|
5304
5342
|
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."));
|
|
5305
5343
|
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."));
|
|
5344
|
+
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."));
|
|
5345
|
+
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."));
|
|
5306
5346
|
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."));
|
|
5307
5347
|
const codex = await runtime.command("codex", ["--version"]);
|
|
5308
5348
|
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."));
|
|
5349
|
+
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."));
|
|
5309
5350
|
const agentModelFailures = [];
|
|
5310
5351
|
for (const agent of AGENTS) try {
|
|
5311
5352
|
const text = await readFile(join(agentRoot, `${agent}.toml`), "utf8");
|
|
@@ -5410,7 +5451,7 @@ async function install(options, runtime = defaultRuntime) {
|
|
|
5410
5451
|
].filter((path) => path !== void 0);
|
|
5411
5452
|
const existingConfig = await readText(target.config);
|
|
5412
5453
|
const previousPlan = readManagedPlan(existingConfig);
|
|
5413
|
-
const config = installConfig(existingConfig, options.autonomy, runtime.platform, plan, options.maxSubagents);
|
|
5454
|
+
const config = installConfig(existingConfig, options.autonomy, runtime.platform, plan, options.maxSubagents, options.fast ?? false);
|
|
5414
5455
|
await atomicWrite(target.config, config);
|
|
5415
5456
|
await rm(target.cache, {
|
|
5416
5457
|
recursive: true,
|
|
@@ -5485,6 +5526,7 @@ async function writeInstalledAgents(root, platform, plan) {
|
|
|
5485
5526
|
let source = await readText(path);
|
|
5486
5527
|
source = replaceTomlString(source, "model", route.model);
|
|
5487
5528
|
source = replaceTomlString(source, "model_reasoning_effort", route.reasoningEffort);
|
|
5529
|
+
source = replaceTomlString(source, "model_verbosity", "low");
|
|
5488
5530
|
if (platform === "win32") {
|
|
5489
5531
|
await atomicWrite(path, source);
|
|
5490
5532
|
return;
|
|
@@ -5552,16 +5594,16 @@ function supportsColor(isTTY, noColor) {
|
|
|
5552
5594
|
}
|
|
5553
5595
|
/** Renders help. */
|
|
5554
5596
|
function renderHelp(version, color) {
|
|
5555
|
-
const title = paint(color, `${BOLD}${CYAN}`, `
|
|
5597
|
+
const title = paint(color, `${BOLD}${CYAN}`, `HolyCodex ${version}`);
|
|
5556
5598
|
const section = (text) => paint(color, BOLD, text);
|
|
5557
5599
|
const muted = (text) => paint(color, DIM, text);
|
|
5558
|
-
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`;
|
|
5600
|
+
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`;
|
|
5559
5601
|
}
|
|
5560
5602
|
/** Renders install-specific model plan and option help. */
|
|
5561
5603
|
function renderInstallHelp(version, color) {
|
|
5562
|
-
const title = paint(color, `${BOLD}${CYAN}`, `
|
|
5604
|
+
const title = paint(color, `${BOLD}${CYAN}`, `HolyCodex ${version}`);
|
|
5563
5605
|
const section = (text) => paint(color, BOLD, text);
|
|
5564
|
-
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`;
|
|
5606
|
+
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`;
|
|
5565
5607
|
}
|
|
5566
5608
|
/** Renders error. */
|
|
5567
5609
|
function renderError(message, color) {
|
|
@@ -5625,9 +5667,16 @@ async function main() {
|
|
|
5625
5667
|
process$1.exitCode = 1;
|
|
5626
5668
|
return;
|
|
5627
5669
|
}
|
|
5670
|
+
const fastFlags = args.filter((arg) => ["--fast", "--no-fast"].includes(arg));
|
|
5671
|
+
if (fastFlags.length > 1) {
|
|
5672
|
+
process$1.stderr.write(renderError(`Conflicting fast flags: ${fastFlags.join(", ")}`, stderrColor));
|
|
5673
|
+
process$1.exitCode = 1;
|
|
5674
|
+
return;
|
|
5675
|
+
}
|
|
5628
5676
|
const options = {
|
|
5629
5677
|
autonomy: args.includes("--dangerous-codex-autonomous") ? "dangerous" : args.includes("--codex-autonomous") ? "autonomous" : "default",
|
|
5630
5678
|
json: args.includes("--json"),
|
|
5679
|
+
fast: args.includes("--fast"),
|
|
5631
5680
|
plan,
|
|
5632
5681
|
...maxSubagents === void 0 ? {} : { maxSubagents }
|
|
5633
5682
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "holycodex",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.5",
|
|
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.
|
|
42
|
+
"@holycodex/plugin": "0.9.5",
|
|
43
43
|
"zod": "^4.4.3"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|