oh-my-opencode 5.0.0-beta.79 → 5.0.0-beta.80
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/.agents/command/remove-deadcode.md +1 -1
- package/.agents/skills/hyperplan/SKILL.md +5 -5
- package/.agents/skills/remove-deadcode/SKILL.md +1 -1
- package/.agents/skills/security-research/SKILL.md +4 -4
- package/dist/cli/index.js +499 -336
- package/dist/cli-node/index.js +499 -336
- package/dist/config-migration/category-deep-split.d.ts +3 -0
- package/dist/config-migration/migration-plans.d.ts +1 -0
- package/dist/features/builtin-commands/templates/hyperplan.d.ts +1 -1
- package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -1
- package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -1
- package/dist/index.js +282 -123
- package/dist/plugin-config/omo-config-chain.d.ts +1 -0
- package/dist/skills/debugging/references/methodology/02-investigate.md +5 -5
- package/dist/skills/refactor/SKILL.md +2 -2
- package/dist/skills/remove-ai-slops/SKILL.md +4 -4
- package/dist/skills/ulw-execute/SKILL.md +3 -2
- package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
- package/dist/skills/ulw-research/SKILL.md +2 -2
- package/dist/tools/delegate-task/openai-categories.d.ts +6 -4
- package/dist/tui.js +146 -71
- package/package.json +14 -14
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +77 -8
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +63 -17
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +63 -17
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +14 -6
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +9 -1
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +9 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +5 -5
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +167 -51
- package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +5 -5
- package/packages/shared-skills/skills/refactor/SKILL.md +2 -2
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +4 -4
- package/packages/shared-skills/skills/ulw-execute/SKILL.md +3 -2
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/shared-skills/skills/ulw-research/SKILL.md +2 -2
package/dist/index.js
CHANGED
|
@@ -19738,13 +19738,8 @@ var CATEGORY_MODEL_REQUIREMENTS = {
|
|
|
19738
19738
|
{ providers: ["openai", "openai-codex", "opencode"], model: "gpt-5.6-sol", variant: "max" }
|
|
19739
19739
|
]
|
|
19740
19740
|
},
|
|
19741
|
-
deep: {
|
|
19741
|
+
"deep-low": {
|
|
19742
19742
|
fallbackChain: [
|
|
19743
|
-
{
|
|
19744
|
-
providers: ["openai", "openai-codex", "github-copilot", "opencode"],
|
|
19745
|
-
model: "gpt-6-astra",
|
|
19746
|
-
variant: "high"
|
|
19747
|
-
},
|
|
19748
19743
|
{
|
|
19749
19744
|
providers: ["openai", "openai-codex", "github-copilot", "opencode"],
|
|
19750
19745
|
model: "gpt-5.6-sol",
|
|
@@ -19752,6 +19747,15 @@ var CATEGORY_MODEL_REQUIREMENTS = {
|
|
|
19752
19747
|
}
|
|
19753
19748
|
]
|
|
19754
19749
|
},
|
|
19750
|
+
"deep-high": {
|
|
19751
|
+
fallbackChain: [
|
|
19752
|
+
{
|
|
19753
|
+
providers: ["openai", "openai-codex", "github-copilot", "opencode"],
|
|
19754
|
+
model: "gpt-6-astra",
|
|
19755
|
+
variant: "high"
|
|
19756
|
+
}
|
|
19757
|
+
]
|
|
19758
|
+
},
|
|
19755
19759
|
artistry: {
|
|
19756
19760
|
fallbackChain: [
|
|
19757
19761
|
{
|
|
@@ -19838,12 +19842,17 @@ var CATEGORY_MODEL_REQUIREMENTS = {
|
|
|
19838
19842
|
{
|
|
19839
19843
|
providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
|
|
19840
19844
|
model: "claude-fable-5-1",
|
|
19841
|
-
variant: "
|
|
19845
|
+
variant: "low"
|
|
19842
19846
|
},
|
|
19843
19847
|
{
|
|
19844
19848
|
providers: ["kimi-for-coding", "moonshotai", "opencode-go", "opencode"],
|
|
19845
19849
|
model: "kimi-k3",
|
|
19846
|
-
variant: "
|
|
19850
|
+
variant: "low"
|
|
19851
|
+
},
|
|
19852
|
+
{
|
|
19853
|
+
providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
|
|
19854
|
+
model: "claude-opus-4-6",
|
|
19855
|
+
variant: "low"
|
|
19847
19856
|
}
|
|
19848
19857
|
]
|
|
19849
19858
|
}
|
|
@@ -23212,6 +23221,65 @@ var OmoConfigLayerSchema = z14.object({
|
|
|
23212
23221
|
legacy_migrations: z14.record(z14.string(), z14.unknown()).optional()
|
|
23213
23222
|
}).strict();
|
|
23214
23223
|
|
|
23224
|
+
// packages/omo-config-core/src/schema/legacy-category-names.ts
|
|
23225
|
+
var LEGACY_CATEGORY_NAME_ALIASES = { deep: "deep-low" };
|
|
23226
|
+
function canonicalCategoryName(name) {
|
|
23227
|
+
return Object.hasOwn(LEGACY_CATEGORY_NAME_ALIASES, name) ? LEGACY_CATEGORY_NAME_ALIASES[name] : name;
|
|
23228
|
+
}
|
|
23229
|
+
function isRecord10(value) {
|
|
23230
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23231
|
+
}
|
|
23232
|
+
function joinPath(path, segment) {
|
|
23233
|
+
return [...path, segment].join(".");
|
|
23234
|
+
}
|
|
23235
|
+
function canonicalizeCategoriesRecord(categories, path, renames) {
|
|
23236
|
+
const result = {};
|
|
23237
|
+
for (const [name, definition] of Object.entries(categories)) {
|
|
23238
|
+
const canonical = canonicalCategoryName(name);
|
|
23239
|
+
if (canonical === name) {
|
|
23240
|
+
result[name] = definition;
|
|
23241
|
+
continue;
|
|
23242
|
+
}
|
|
23243
|
+
const dropped = Object.hasOwn(categories, canonical);
|
|
23244
|
+
renames.push({ canonical, dropped, legacy: name, path: joinPath(path, name) });
|
|
23245
|
+
if (!dropped)
|
|
23246
|
+
result[canonical] = definition;
|
|
23247
|
+
}
|
|
23248
|
+
return result;
|
|
23249
|
+
}
|
|
23250
|
+
function canonicalizeValue(value, path, renames) {
|
|
23251
|
+
if (Array.isArray(value)) {
|
|
23252
|
+
return value.map((entry, index) => canonicalizeValue(entry, [...path, String(index)], renames));
|
|
23253
|
+
}
|
|
23254
|
+
if (!isRecord10(value))
|
|
23255
|
+
return value;
|
|
23256
|
+
const result = {};
|
|
23257
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
23258
|
+
if (key === "categories" && isRecord10(entry)) {
|
|
23259
|
+
result[key] = canonicalizeCategoriesRecord(entry, [...path, key], renames);
|
|
23260
|
+
continue;
|
|
23261
|
+
}
|
|
23262
|
+
if (key === "category" && typeof entry === "string") {
|
|
23263
|
+
const canonical = canonicalCategoryName(entry);
|
|
23264
|
+
if (canonical !== entry) {
|
|
23265
|
+
renames.push({ canonical, dropped: false, legacy: entry, path: joinPath(path, key) });
|
|
23266
|
+
}
|
|
23267
|
+
result[key] = canonical;
|
|
23268
|
+
continue;
|
|
23269
|
+
}
|
|
23270
|
+
result[key] = canonicalizeValue(entry, [...path, key], renames);
|
|
23271
|
+
}
|
|
23272
|
+
return result;
|
|
23273
|
+
}
|
|
23274
|
+
function canonicalizeLegacyCategoryNames(document) {
|
|
23275
|
+
const renames = [];
|
|
23276
|
+
const canonicalized = isRecord10(document) ? canonicalizeValue(document, [], renames) : {};
|
|
23277
|
+
return { document: canonicalized, renames };
|
|
23278
|
+
}
|
|
23279
|
+
function hasLegacyCategoryNames(document) {
|
|
23280
|
+
return canonicalizeLegacyCategoryNames(document).renames.length > 0;
|
|
23281
|
+
}
|
|
23282
|
+
|
|
23215
23283
|
// packages/omo-config-core/src/loader/loader.ts
|
|
23216
23284
|
init_main();
|
|
23217
23285
|
|
|
@@ -23457,21 +23525,21 @@ function hasUnsafeUnrecognizedKey(issues) {
|
|
|
23457
23525
|
function hasTamperedPrototype(value) {
|
|
23458
23526
|
if (Array.isArray(value))
|
|
23459
23527
|
return value.some((entry) => hasTamperedPrototype(entry));
|
|
23460
|
-
if (!
|
|
23528
|
+
if (!isRecord11(value))
|
|
23461
23529
|
return false;
|
|
23462
23530
|
const prototype = Object.getPrototypeOf(value);
|
|
23463
23531
|
if (prototype !== Object.prototype && prototype !== null)
|
|
23464
23532
|
return true;
|
|
23465
23533
|
return Object.values(value).some((entry) => hasTamperedPrototype(entry));
|
|
23466
23534
|
}
|
|
23467
|
-
function
|
|
23535
|
+
function isRecord11(value) {
|
|
23468
23536
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
23469
23537
|
}
|
|
23470
23538
|
function containerAt(record, path) {
|
|
23471
23539
|
let container = record;
|
|
23472
23540
|
for (const segment of path) {
|
|
23473
23541
|
const next = container[segment];
|
|
23474
|
-
if (!
|
|
23542
|
+
if (!isRecord11(next))
|
|
23475
23543
|
return null;
|
|
23476
23544
|
container = next;
|
|
23477
23545
|
}
|
|
@@ -23573,6 +23641,15 @@ function readConfigSource(path, scope, fileSystem) {
|
|
|
23573
23641
|
value: parsedRecord
|
|
23574
23642
|
};
|
|
23575
23643
|
}
|
|
23644
|
+
function legacyCategoryDiagnostic(path, renames) {
|
|
23645
|
+
const detail = renames.map((rename) => rename.dropped ? `${rename.path} ignored because ${rename.canonical} is also configured` : `${rename.path} renamed to ${rename.canonical}`).join(", ");
|
|
23646
|
+
return {
|
|
23647
|
+
kind: "deprecated-keys",
|
|
23648
|
+
message: `Deprecated category name in ${path}: ${detail}. Rename it; the alias is removed in a future release.`,
|
|
23649
|
+
path,
|
|
23650
|
+
issuePaths: renames.map((rename) => rename.path)
|
|
23651
|
+
};
|
|
23652
|
+
}
|
|
23576
23653
|
function loadOmoConfig(options = {}) {
|
|
23577
23654
|
const fileSystem = options.fileSystem ?? DEFAULT_READ_FILE_SYSTEM;
|
|
23578
23655
|
const cwd = options.cwd ?? process.cwd();
|
|
@@ -23591,8 +23668,12 @@ function loadOmoConfig(options = {}) {
|
|
|
23591
23668
|
if (loaded.diagnostic !== undefined)
|
|
23592
23669
|
diagnostics.push(loaded.diagnostic);
|
|
23593
23670
|
if (loaded.value !== undefined) {
|
|
23594
|
-
|
|
23595
|
-
|
|
23671
|
+
const canonicalized = canonicalizeLegacyCategoryNames(loaded.value);
|
|
23672
|
+
if (canonicalized.renames.length > 0) {
|
|
23673
|
+
diagnostics.push(legacyCategoryDiagnostic(candidate.path, canonicalized.renames));
|
|
23674
|
+
}
|
|
23675
|
+
layers.push({ config: canonicalized.document, source: loaded.source });
|
|
23676
|
+
merged = mergeOmoConfigRecords(merged, canonicalized.document);
|
|
23596
23677
|
}
|
|
23597
23678
|
}
|
|
23598
23679
|
const requestedProfile = resolveOmoProfileName({
|
|
@@ -24608,6 +24689,9 @@ function executePlan(input) {
|
|
|
24608
24689
|
const existingSources = plan.sources.filter((source) => fileSystem.existsSync(source.path));
|
|
24609
24690
|
const target = targetDocument(plan.targetPath, fileSystem);
|
|
24610
24691
|
const replaceTarget = plan.mode === "replace-target";
|
|
24692
|
+
if (plan.shouldRun !== undefined && !plan.shouldRun(target)) {
|
|
24693
|
+
return { diagnostics: [], journalResumed, status: "skipped" };
|
|
24694
|
+
}
|
|
24611
24695
|
if (!shouldRunMigration({
|
|
24612
24696
|
legacySourcesExist: replaceTarget ? fileSystem.existsSync(plan.targetPath) : existingSources.length > 0,
|
|
24613
24697
|
migrationId: plan.id,
|
|
@@ -25683,7 +25767,7 @@ function migrateRalphLoopConfig(config) {
|
|
|
25683
25767
|
function validatePluginConfig(directory, environment = process.env) {
|
|
25684
25768
|
const chain = loadOmoOpenCodeConfigChain(directory, environment);
|
|
25685
25769
|
const views = chain.views.map((view) => parseConfigView(view.path, view.config));
|
|
25686
|
-
const chainMessages = chain.diagnostics.map((diagnostic) => `${shortPath(diagnostic.path)}: ${diagnostic.message}`);
|
|
25770
|
+
const chainMessages = chain.diagnostics.filter((diagnostic) => diagnostic.kind !== "deprecated-keys").map((diagnostic) => `${shortPath(diagnostic.path)}: ${diagnostic.message}`);
|
|
25687
25771
|
const messages = [...chainMessages, ...views.flatMap((view) => view.messages)];
|
|
25688
25772
|
const firstFailingView = views.find((view) => view.messages.length > 0);
|
|
25689
25773
|
const firstView = views[0];
|
|
@@ -26362,7 +26446,7 @@ ANTI-AI-SLOP RULES (NON-NEGOTIABLE):
|
|
|
26362
26446
|
var KIMI_CATEGORIES = [
|
|
26363
26447
|
{
|
|
26364
26448
|
name: "writing",
|
|
26365
|
-
config: { model: "anthropic/claude-fable-5-1", variant: "
|
|
26449
|
+
config: { model: "anthropic/claude-fable-5-1", variant: "low" },
|
|
26366
26450
|
description: "Documentation, prose, technical writing",
|
|
26367
26451
|
promptAppend: WRITING_CATEGORY_PROMPT_APPEND
|
|
26368
26452
|
}
|
|
@@ -26410,14 +26494,24 @@ Success means:
|
|
|
26410
26494
|
|
|
26411
26495
|
Whatever that check leaves unsettled goes in the answer as an open question with what would settle it. When the goal bundles independent problems, solve the one the others depend on and return the rest as separately delegable items.
|
|
26412
26496
|
</Category_Context>`;
|
|
26413
|
-
var
|
|
26414
|
-
The orchestrator routed this task here
|
|
26415
|
-
|
|
26416
|
-
**MUST USE \`deep\` FOR 3D GRAPHICS, COMPUTER USE, BROWSER USE, BACKEND, LOGIC, ALGORITHMS, CAPTCHA SOLVING, AND MULTIMODAL WORK.**
|
|
26497
|
+
var DEEP_HIGH_CATEGORY_PROMPT_APPEND_GPT = `<Category_Context name="deep-high">
|
|
26498
|
+
The orchestrator routed this task here because a decision in it cannot be settled from evidence alone: a trade-off, a contract other code depends on, a mechanism with no pattern to copy, or correctness that has to be argued. One goal, one deliverable, and the time to earn it. The exploration budget is generous: read every file involved, trace callers and dependencies in both directions, and fan out explore and librarian subagents in parallel for the questions a single read wave cannot answer, until you can explain the full mechanism you are about to change; an edit made before that point is the failure this category exists to prevent.
|
|
26417
26499
|
|
|
26418
26500
|
The goal is the authorization. Choose how to reach it yourself, and when it lists numbered steps or phases, deliver all of them in this turn as one task; a proposal, a plan awaiting approval, a simplified version, or a proof of concept is unfinished work. When the steps turn out to be independent problems sharing no reasoning, do the one the goal centers on and return the others as separately delegable items with what you learned. A question ends your turn and hands the task back unfinished, so decide from context, record each assumption in the final message, and stop early only for a blocker you cannot route around: a missing secret, a decision only the user can make, or three materially different attempts that all failed.
|
|
26419
26501
|
|
|
26420
|
-
Fix the cause: trace at least two levels above the symptom before settling, and prefer the change that makes the failure impossible over the guard that hides it. Depth means understanding the mechanism, so the diff stays as small as the fix allows; on greenfield work choose strong defaults and finish something you would hand to a senior engineer. Close with the delivered change, the evidence that it works, and the assumptions you made.
|
|
26502
|
+
Fix the cause: trace at least two levels above the symptom before settling, and prefer the change that makes the failure impossible over the guard that hides it. Depth means understanding the mechanism, so the diff stays as small as the fix allows; on greenfield work choose strong defaults and finish something you would hand to a senior engineer. Close with the delivered change, the evidence that it works, the decision you settled with the alternative you rejected, and the assumptions you made.
|
|
26503
|
+
</Category_Context>`;
|
|
26504
|
+
var DEEP_LOW_CATEGORY_PROMPT_APPEND_GPT = `<Category_Context name="deep-low">
|
|
26505
|
+
The orchestrator routed this task here as the default deep lane: one goal, one deliverable, decisions that the code, tests, and history can settle. Read until you can explain the mechanism you are about to change, including its callers, then act; fan out explore and librarian subagents when one read wave cannot answer a question.
|
|
26506
|
+
|
|
26507
|
+
Success means:
|
|
26508
|
+
- every step or phase the goal lists is delivered in this turn as one task; a plan awaiting approval, a simplified version, or a proof of concept is unfinished work;
|
|
26509
|
+
- the change removes the cause you traced, at least two levels above the symptom, with the diff as small as that fix allows;
|
|
26510
|
+
- the final message reports the change, the evidence that it works, and each assumption you decided from context, because a question ends your turn and returns the task unfinished.
|
|
26511
|
+
|
|
26512
|
+
Escalation is a complete result. When the correct choice turns out to depend on a trade-off the brief does not settle, on a contract other packages rely on, or on an argument about invariants you cannot verify by running something, stop before editing and return \`ESCALATE: deep-high\` as the first line, followed by what you read, the decision you could not settle, and the options you saw. A confident guess through that decision costs more than the escalation.
|
|
26513
|
+
|
|
26514
|
+
Stop the moment the success criteria hold; work past them is a defect. Stop early only for a blocker you cannot route around: a missing secret, a decision only the user can make, or three materially different attempts that all failed.
|
|
26421
26515
|
</Category_Context>`;
|
|
26422
26516
|
var UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND_GPT_6_ASTRA = `<Category_Context name="unspecified-high">
|
|
26423
26517
|
The orchestrator routed this task here because it spans systems or modules and fits no specialist category, so breadth of consideration is what this category buys. Before committing to an approach, survey the whole surface the change touches: every caller and consumer of what you will modify, sibling modules that implement the same pattern, the tests, docs, schemas, config, scripts, and CI that encode the current behavior, and the history of the area (git log and blame) for the reasons it is shaped this way. Fan out explore and librarian subagents in parallel when that surface is wider than one read wave covers.
|
|
@@ -26445,65 +26539,40 @@ Response format:
|
|
|
26445
26539
|
- Action plan (numbered steps)
|
|
26446
26540
|
- Risks and mitigations (if relevant)
|
|
26447
26541
|
</Category_Context>`;
|
|
26448
|
-
var
|
|
26449
|
-
You are working on GOAL-ORIENTED AUTONOMOUS
|
|
26450
|
-
|
|
26451
|
-
You are NOT an interactive assistant. You are an autonomous problem-solver.
|
|
26452
|
-
|
|
26453
|
-
**MUST USE \`deep\` FOR 3D GRAPHICS, COMPUTER USE, BROWSER USE, BACKEND, LOGIC, ALGORITHMS, CAPTCHA SOLVING, AND MULTIMODAL WORK.**
|
|
26454
|
-
|
|
26455
|
-
BEFORE making ANY changes:
|
|
26456
|
-
1. Silently explore the codebase extensively (5-15 minutes of reading is normal)
|
|
26457
|
-
2. Read related files, trace dependencies, understand the full context
|
|
26458
|
-
3. Build a complete mental model of the problem space
|
|
26459
|
-
4. Do not ask clarifying questions - the goal is already defined
|
|
26542
|
+
var DEEP_LOW_CATEGORY_PROMPT_APPEND = `<Category_Context name="deep-low">
|
|
26543
|
+
You are working on a GOAL-ORIENTED AUTONOMOUS task: one goal, one deliverable, decisions the codebase can settle.
|
|
26460
26544
|
|
|
26461
|
-
|
|
26545
|
+
Before any change, read the files involved and trace their dependencies until you can explain the mechanism you are about to modify. The goal is already defined: do not ask clarifying questions; make reasonable assumptions, record them in the final message, and proceed.
|
|
26462
26546
|
|
|
26463
|
-
|
|
26464
|
-
Genuinely independent tasks = flag and refuse, require separate delegations.
|
|
26547
|
+
When the goal lists numbered steps or phases, execute all of them in this turn as one atomic task. Genuinely independent tasks bundled into one goal: flag them and do only the one the goal centers on.
|
|
26465
26548
|
|
|
26466
|
-
|
|
26549
|
+
Escalation is a complete result. When the correct choice depends on a trade-off the brief does not settle, a contract other packages rely on, or an argument about invariants you cannot verify by running something, stop before editing and return \`ESCALATE: deep-high\` as the first line, followed by what you read, the decision you could not settle, and the options you saw.
|
|
26467
26550
|
|
|
26468
|
-
|
|
26551
|
+
Prefer the fix that removes the cause over the patch that hides the symptom. Report completion with the changes made and the evidence they work.
|
|
26469
26552
|
</Category_Context>`;
|
|
26470
|
-
var
|
|
26471
|
-
You are
|
|
26472
|
-
|
|
26473
|
-
**MUST USE \`deep\` FOR 3D GRAPHICS, COMPUTER USE, BROWSER USE, BACKEND, LOGIC, ALGORITHMS, CAPTCHA SOLVING, AND MULTIMODAL WORK.**
|
|
26474
|
-
|
|
26475
|
-
The orchestrator chose this category because the task benefits from depth over speed. You should feel empowered to spend the time needed: five to fifteen minutes of silent exploration before the first edit is normal and correct. Rushing to implementation on a deep task is a failure mode, not a feature.
|
|
26476
|
-
|
|
26477
|
-
# How deep mode adjusts the base behavior
|
|
26478
|
-
|
|
26479
|
-
**Exploration budget: generous.** Read the files you need, trace dependencies both directions, fire 2-5 explore/librarian sub-agents in parallel for broader questions. Build a complete mental model before the first \`apply_patch\`. Exploration here is an investment, not overhead.
|
|
26553
|
+
var DEEP_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context name="deep-high">
|
|
26554
|
+
You are working on a GOAL-ORIENTED AUTONOMOUS task that was escalated here because a decision in it cannot be settled from evidence alone: a trade-off, a contract other code depends on, a mechanism with no pattern to copy, or correctness that has to be argued.
|
|
26480
26555
|
|
|
26481
|
-
|
|
26556
|
+
Before any change, read the files involved and trace their dependencies until you can explain the mechanism you are about to modify. The goal is already defined: do not ask clarifying questions; make reasonable assumptions, record them in the final message, and proceed.
|
|
26482
26557
|
|
|
26483
|
-
|
|
26558
|
+
When the goal lists numbered steps or phases, execute all of them in this turn as one atomic task. Genuinely independent tasks bundled into one goal: flag them and do only the one the goal centers on.
|
|
26484
26559
|
|
|
26485
|
-
|
|
26486
|
-
|
|
26487
|
-
**Ambition scaled to context.** For brand-new greenfield work, be ambitious. Choose strong defaults, avoid AI-slop aesthetics, produce something you would be proud to hand to another senior engineer. For changes in an existing codebase, be surgical and respect the existing patterns; depth does not mean invasiveness.
|
|
26488
|
-
|
|
26489
|
-
**Completion bar: full delivery.** "Simplified version", "proof of concept", and "you can extend this later" are not acceptable deliveries for a deep task. The orchestrator routed here specifically for a complete solution. If you hit a genuine blocker (missing secret, design decision only the user can make, three materially different attempts all failed), document it and return; otherwise, finish the task.
|
|
26490
|
-
|
|
26491
|
-
**Status cadence: sparse.** The user is not on the other side of this conversation; the orchestrator is, and they will synthesize your progress. Send commentary only at meaningful phase transitions (starting exploration, starting implementation, starting verification, hitting a genuine blocker). Do not narrate every tool call; silence during focused work is expected.
|
|
26560
|
+
Prefer the fix that removes the cause over the patch that hides the symptom. Report completion with the changes made, the evidence they work, and the decision you settled with the alternative you rejected.
|
|
26492
26561
|
</Category_Context>`;
|
|
26562
|
+
function isGptDeepLaneModel(model) {
|
|
26563
|
+
return model !== undefined && (isGpt6Model(model) || isGpt5_5Model(model) || isGpt5_6Model(model));
|
|
26564
|
+
}
|
|
26493
26565
|
function resolveUltrabrainCategoryPromptAppend(model) {
|
|
26494
26566
|
if (model && isGpt6Model(model)) {
|
|
26495
26567
|
return ULTRABRAIN_CATEGORY_PROMPT_APPEND_GPT_6_ASTRA;
|
|
26496
26568
|
}
|
|
26497
26569
|
return ULTRABRAIN_CATEGORY_PROMPT_APPEND;
|
|
26498
26570
|
}
|
|
26499
|
-
function
|
|
26500
|
-
|
|
26501
|
-
|
|
26502
|
-
|
|
26503
|
-
|
|
26504
|
-
return DEEP_CATEGORY_PROMPT_APPEND_GPT_5_5;
|
|
26505
|
-
}
|
|
26506
|
-
return DEEP_CATEGORY_PROMPT_APPEND;
|
|
26571
|
+
function resolveDeepLowCategoryPromptAppend(model) {
|
|
26572
|
+
return isGptDeepLaneModel(model) ? DEEP_LOW_CATEGORY_PROMPT_APPEND_GPT : DEEP_LOW_CATEGORY_PROMPT_APPEND;
|
|
26573
|
+
}
|
|
26574
|
+
function resolveDeepHighCategoryPromptAppend(model) {
|
|
26575
|
+
return isGptDeepLaneModel(model) ? DEEP_HIGH_CATEGORY_PROMPT_APPEND_GPT : DEEP_HIGH_CATEGORY_PROMPT_APPEND;
|
|
26507
26576
|
}
|
|
26508
26577
|
function resolveUnspecifiedHighCategoryPromptAppend(model) {
|
|
26509
26578
|
if (model && isGpt6Model(model)) {
|
|
@@ -26535,7 +26604,10 @@ var UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND = `<Category_Context>
|
|
|
26535
26604
|
You are working on tasks that don't fit specific categories but require substantial effort.
|
|
26536
26605
|
</Category_Context>`;
|
|
26537
26606
|
var UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Use only when no specialist category fits and substantial effort spans systems/modules with broad impact. Use unspecified-low for contained moderate work.</Selection_Gate>`;
|
|
26538
|
-
var
|
|
26607
|
+
var DEEP_LOW_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here when one subsystem plus its callers holds the mechanism and the evidence, once read, leaves one right answer. Wide but mechanical work belongs here or in a quick batch. When unsure, choose deep-low: a misrouted child returns \`ESCALATE: deep-high\` after one cheap attempt; re-spawn the same brief as deep-high with its findings.</Selection_Gate>`;
|
|
26608
|
+
var DEEP_HIGH_CATEGORY_CALLER_GUIDANCE = `<Selection_Gate>Route here only when you can name the decision evidence cannot settle: a trade-off with no single right answer, a contract change crossing a package or process boundary, a mechanism with no in-repo pattern to copy, or correctness argued from invariants rather than observed in a test. Wide scope with easy decisions is deep-low or unspecified-high; reasoning as the deliverable is ultrabrain.</Selection_Gate>`;
|
|
26609
|
+
var DEEP_LOW_GATE_MODEL = "gpt-5.6-sol";
|
|
26610
|
+
var DEEP_HIGH_GATE_MODEL = "gpt-6-astra";
|
|
26539
26611
|
var OPENAI_CATEGORIES = [
|
|
26540
26612
|
{
|
|
26541
26613
|
name: "ultrabrain",
|
|
@@ -26545,12 +26617,22 @@ var OPENAI_CATEGORIES = [
|
|
|
26545
26617
|
resolvePromptAppend: resolveUltrabrainCategoryPromptAppend
|
|
26546
26618
|
},
|
|
26547
26619
|
{
|
|
26548
|
-
name: "deep",
|
|
26620
|
+
name: "deep-low",
|
|
26621
|
+
config: { model: "openai/gpt-5.6-sol", variant: "medium" },
|
|
26622
|
+
description: "Default deep lane: one goal, one deliverable, decisions the child can settle from what it reads. **3D graphics, computer/browser use, CAPTCHA, multimodal, backend, logic, and algorithm work is routed here.** Multiple goals fan out as parallel calls.",
|
|
26623
|
+
callerGuidance: DEEP_LOW_CATEGORY_CALLER_GUIDANCE,
|
|
26624
|
+
promptAppend: DEEP_LOW_CATEGORY_PROMPT_APPEND,
|
|
26625
|
+
resolvePromptAppend: resolveDeepLowCategoryPromptAppend,
|
|
26626
|
+
requiresModel: DEEP_LOW_GATE_MODEL
|
|
26627
|
+
},
|
|
26628
|
+
{
|
|
26629
|
+
name: "deep-high",
|
|
26549
26630
|
config: { model: "openai/gpt-6-astra", variant: "high" },
|
|
26550
|
-
description: "
|
|
26551
|
-
|
|
26552
|
-
|
|
26553
|
-
|
|
26631
|
+
description: "Escalation deep lane: a goal whose central decision cannot be settled from evidence alone. Same one-goal, one-deliverable contract as deep-low.",
|
|
26632
|
+
callerGuidance: DEEP_HIGH_CATEGORY_CALLER_GUIDANCE,
|
|
26633
|
+
promptAppend: DEEP_HIGH_CATEGORY_PROMPT_APPEND,
|
|
26634
|
+
resolvePromptAppend: resolveDeepHighCategoryPromptAppend,
|
|
26635
|
+
requiresModel: DEEP_HIGH_GATE_MODEL
|
|
26554
26636
|
},
|
|
26555
26637
|
{
|
|
26556
26638
|
name: "quick",
|
|
@@ -96713,7 +96795,7 @@ function getCachedVersion(options = {}) {
|
|
|
96713
96795
|
// package.json
|
|
96714
96796
|
var package_default = {
|
|
96715
96797
|
name: "oh-my-opencode",
|
|
96716
|
-
version: "5.0.0-beta.
|
|
96798
|
+
version: "5.0.0-beta.80",
|
|
96717
96799
|
description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
|
|
96718
96800
|
main: "./dist/index.js",
|
|
96719
96801
|
types: "dist/index.d.ts",
|
|
@@ -96895,7 +96977,7 @@ var package_default = {
|
|
|
96895
96977
|
zod: "^4.4.3"
|
|
96896
96978
|
},
|
|
96897
96979
|
devDependencies: {
|
|
96898
|
-
"@code-yeongyu/senpi": "2026.9.
|
|
96980
|
+
"@code-yeongyu/senpi": "2026.9.20",
|
|
96899
96981
|
"@oh-my-opencode/agents-md-core": "workspace:*",
|
|
96900
96982
|
"@oh-my-opencode/ast-grep-mcp": "workspace:*",
|
|
96901
96983
|
"@oh-my-opencode/boulder-state": "workspace:*",
|
|
@@ -96934,18 +97016,18 @@ var package_default = {
|
|
|
96934
97016
|
typescript: "^7.0.2"
|
|
96935
97017
|
},
|
|
96936
97018
|
optionalDependencies: {
|
|
96937
|
-
"oh-my-opencode-darwin-arm64": "5.0.0-beta.
|
|
96938
|
-
"oh-my-opencode-darwin-x64": "5.0.0-beta.
|
|
96939
|
-
"oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.
|
|
96940
|
-
"oh-my-opencode-linux-arm64": "5.0.0-beta.
|
|
96941
|
-
"oh-my-opencode-linux-arm64-musl": "5.0.0-beta.
|
|
96942
|
-
"oh-my-opencode-linux-x64": "5.0.0-beta.
|
|
96943
|
-
"oh-my-opencode-linux-x64-baseline": "5.0.0-beta.
|
|
96944
|
-
"oh-my-opencode-linux-x64-musl": "5.0.0-beta.
|
|
96945
|
-
"oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.
|
|
96946
|
-
"oh-my-opencode-windows-arm64": "5.0.0-beta.
|
|
96947
|
-
"oh-my-opencode-windows-x64": "5.0.0-beta.
|
|
96948
|
-
"oh-my-opencode-windows-x64-baseline": "5.0.0-beta.
|
|
97019
|
+
"oh-my-opencode-darwin-arm64": "5.0.0-beta.80",
|
|
97020
|
+
"oh-my-opencode-darwin-x64": "5.0.0-beta.80",
|
|
97021
|
+
"oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.80",
|
|
97022
|
+
"oh-my-opencode-linux-arm64": "5.0.0-beta.80",
|
|
97023
|
+
"oh-my-opencode-linux-arm64-musl": "5.0.0-beta.80",
|
|
97024
|
+
"oh-my-opencode-linux-x64": "5.0.0-beta.80",
|
|
97025
|
+
"oh-my-opencode-linux-x64-baseline": "5.0.0-beta.80",
|
|
97026
|
+
"oh-my-opencode-linux-x64-musl": "5.0.0-beta.80",
|
|
97027
|
+
"oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.80",
|
|
97028
|
+
"oh-my-opencode-windows-arm64": "5.0.0-beta.80",
|
|
97029
|
+
"oh-my-opencode-windows-x64": "5.0.0-beta.80",
|
|
97030
|
+
"oh-my-opencode-windows-x64-baseline": "5.0.0-beta.80"
|
|
96949
97031
|
},
|
|
96950
97032
|
overrides: {
|
|
96951
97033
|
"@earendil-works/pi-agent-core": "0.84.2",
|
|
@@ -97762,6 +97844,16 @@ function transformReasoningUnification(document) {
|
|
|
97762
97844
|
};
|
|
97763
97845
|
}
|
|
97764
97846
|
|
|
97847
|
+
// packages/omo-opencode/src/config-migration/category-deep-split.ts
|
|
97848
|
+
var CATEGORY_DEEP_SPLIT_MIGRATION_ID = "2026-09-category-deep-split";
|
|
97849
|
+
function transformCategoryDeepSplit(document) {
|
|
97850
|
+
const { document: canonicalized, renames } = canonicalizeLegacyCategoryNames(document);
|
|
97851
|
+
return {
|
|
97852
|
+
diagnostics: renames.map((rename) => rename.dropped ? `${rename.path} removed: ${rename.canonical} is already configured` : `${rename.path} renamed to ${rename.canonical}`),
|
|
97853
|
+
document: canonicalized
|
|
97854
|
+
};
|
|
97855
|
+
}
|
|
97856
|
+
|
|
97765
97857
|
// packages/omo-opencode/src/config-migration/migration-plans.ts
|
|
97766
97858
|
function backupTimestamp(value) {
|
|
97767
97859
|
return value ?? new Date().toISOString().replace(/[:.]/g, "-");
|
|
@@ -97828,6 +97920,18 @@ function reasoningPlan(targetPath) {
|
|
|
97828
97920
|
transform: inspect
|
|
97829
97921
|
};
|
|
97830
97922
|
}
|
|
97923
|
+
function categoryDeepSplitPlan(targetPath) {
|
|
97924
|
+
const inspect = (sources) => transformCategoryDeepSplit(sources[0]?.value);
|
|
97925
|
+
return {
|
|
97926
|
+
id: CATEGORY_DEEP_SPLIT_MIGRATION_ID,
|
|
97927
|
+
inspect,
|
|
97928
|
+
mode: "replace-target",
|
|
97929
|
+
shouldRun: hasLegacyCategoryNames,
|
|
97930
|
+
sources: [],
|
|
97931
|
+
targetPath,
|
|
97932
|
+
transform: inspect
|
|
97933
|
+
};
|
|
97934
|
+
}
|
|
97831
97935
|
function existingOmoConfigPath(directory, options) {
|
|
97832
97936
|
const fileSystem = discoveryFileSystem(options);
|
|
97833
97937
|
for (const fileName of ["omo.jsonc", "omo.json"]) {
|
|
@@ -97887,7 +97991,12 @@ function createLegacyConfigMigrationPlans(options) {
|
|
|
97887
97991
|
}
|
|
97888
97992
|
for (const plan of legacyPlans)
|
|
97889
97993
|
addReasoningTarget(plan.targetPath);
|
|
97890
|
-
|
|
97994
|
+
const inPlaceTargets = [...reasoningTargets.values()];
|
|
97995
|
+
return [
|
|
97996
|
+
...legacyPlans,
|
|
97997
|
+
...inPlaceTargets.map(reasoningPlan),
|
|
97998
|
+
...inPlaceTargets.map(categoryDeepSplitPlan)
|
|
97999
|
+
];
|
|
97891
98000
|
}
|
|
97892
98001
|
// packages/omo-opencode/src/startup-migration.ts
|
|
97893
98002
|
function homeDirectory(options) {
|
|
@@ -100105,7 +100214,7 @@ Everything else is parallel. Fire one \`task()\` per independent checkbox in the
|
|
|
100105
100214
|
|
|
100106
100215
|
\`\`\`typescript
|
|
100107
100216
|
task(category="quick", load_skills=[], run_in_background=false, prompt="...task A...")
|
|
100108
|
-
task(category="deep", load_skills=["programming"], run_in_background=false, prompt="...task B...")
|
|
100217
|
+
task(category="deep-low", load_skills=["programming"], run_in_background=false, prompt="...task B...")
|
|
100109
100218
|
task(category="quick", load_skills=["git-master"], run_in_background=false, prompt="...task C...")
|
|
100110
100219
|
\`\`\`
|
|
100111
100220
|
|
|
@@ -105401,7 +105510,7 @@ REQUIRED NOW:
|
|
|
105401
105510
|
- Ask Oracle to verify whether the original task is actually complete
|
|
105402
105511
|
- Include the original task in the Oracle request
|
|
105403
105512
|
- Explicitly tell Oracle to review skeptically and critically, and to look for reasons the task may still be incomplete or wrong
|
|
105404
|
-
- If the Oracle spawn fails because its model/agent is unavailable, spawn a verifier with the identical verification instructions using task(category: "deep", load_skills=[], run_in_background=false, ...), then retry with category: "unspecified-high", then category: "unspecified-low" on the same failure; require its reply to end with the literal line \`Agent: gate-verifier\` immediately above the promise tag
|
|
105513
|
+
- If the Oracle spawn fails because its model/agent is unavailable, spawn a verifier with the identical verification instructions using task(category: "deep-high", load_skills=[], run_in_background=false, ...), then retry with category: "deep-low", then category: "unspecified-high", then category: "unspecified-low" on the same failure; require its reply to end with the literal line \`Agent: gate-verifier\` immediately above the promise tag
|
|
105405
105514
|
- The system will inspect the Oracle session directly for the verification result
|
|
105406
105515
|
- If Oracle does not verify, continue fixing the task and do not consider it complete
|
|
105407
105516
|
|
|
@@ -105417,7 +105526,7 @@ REQUIRED NOW:
|
|
|
105417
105526
|
- Do not claim completion early or argue with the failed verification
|
|
105418
105527
|
- After fixing the remaining issues, request Oracle review again using task(subagent_type="oracle", load_skills=[], run_in_background=false, ...)
|
|
105419
105528
|
- Include the original task in the Oracle request and tell Oracle to review skeptically and critically
|
|
105420
|
-
- If the Oracle spawn fails because its model/agent is unavailable, spawn a verifier with the identical verification instructions using task(category: "deep", load_skills=[], run_in_background=false, ...), then retry with category: "unspecified-high", then category: "unspecified-low" on the same failure; require its reply to end with the literal line \`Agent: gate-verifier\` immediately above the promise tag
|
|
105529
|
+
- If the Oracle spawn fails because its model/agent is unavailable, spawn a verifier with the identical verification instructions using task(category: "deep-high", load_skills=[], run_in_background=false, ...), then retry with category: "deep-low", then category: "unspecified-high", then category: "unspecified-low" on the same failure; require its reply to end with the literal line \`Agent: gate-verifier\` immediately above the promise tag
|
|
105421
105530
|
- Only when the work is ready for review again, output: <promise>{{PROMISE}}</promise>
|
|
105422
105531
|
|
|
105423
105532
|
Original task:
|
|
@@ -110385,7 +110494,7 @@ Read the Team Staffing Recommendation from Phase 4. If any required field is mis
|
|
|
110385
110494
|
|
|
110386
110495
|
Then choose the path:
|
|
110387
110496
|
|
|
110388
|
-
- **Team path (5.1-T)**: when the plan recommends \`team\` AND \`file_independent_steps >= 3\`. Members execute in parallel, Lead orchestrates, a \`deep\` verifier lives outside the team.
|
|
110497
|
+
- **Team path (5.1-T)**: when the plan recommends \`team\` AND \`file_independent_steps >= 3\`. Members execute in parallel, Lead orchestrates, a \`deep-high\` verifier lives outside the team.
|
|
110389
110498
|
- **Legacy path (5.1-L)**: otherwise. Use the original 5.1 / 5.2 / 5.3 flow from above.
|
|
110390
110499
|
|
|
110391
110500
|
Record the chosen path in the TodoWrite list.
|
|
@@ -110423,7 +110532,7 @@ Record the chosen path in the TodoWrite list.
|
|
|
110423
110532
|
|
|
110424
110533
|
Rationale for this composition:
|
|
110425
110534
|
- **4 workers = team mode's parallel cap.** 5+ just queues.
|
|
110426
|
-
- **No verifier team member.** Verification needs \`deep\` reasoning (or \`unspecified-high\` fallback). In-team category routing downcasts to sisyphus-junior, which is weaker than required \u2014 the verifier runs OUTSIDE the team as a \`task(category="deep")\`.
|
|
110535
|
+
- **No verifier team member.** Verification needs \`deep-high\` reasoning (or \`unspecified-high\` fallback). In-team category routing downcasts to sisyphus-junior, which is weaker than required \u2014 the verifier runs OUTSIDE the team as a \`task(category="deep-high")\`.
|
|
110427
110536
|
- **quick \xD7 2** for mechanical edits, **unspecified-low \xD7 2** for reasoning edits \u2014 mirrors the plan's split.
|
|
110428
110537
|
|
|
110429
110538
|
**Team lifecycle** (one team, reused until Phase 6 cleanup):
|
|
@@ -110455,14 +110564,14 @@ While any team task is \`pending | claimed | in_progress\`:
|
|
|
110455
110564
|
- On a worker completion report, immediately dispatch an **external verifier** \u2014 verification runs OUTSIDE the team because team-member category routing downcasts to sisyphus-junior:
|
|
110456
110565
|
\`\`\`
|
|
110457
110566
|
task(
|
|
110458
|
-
category="deep",
|
|
110567
|
+
category="deep-high",
|
|
110459
110568
|
load_skills=[],
|
|
110460
110569
|
run_in_background=true,
|
|
110461
110570
|
description="verify step <N>",
|
|
110462
110571
|
prompt=<files touched + verify-spec commands + instruction to return "PASS" or "FAIL:<failing test + specific error + suggested revert hunks>">
|
|
110463
110572
|
)
|
|
110464
110573
|
\`\`\`
|
|
110465
|
-
If \`deep\` is unavailable, fall back to \`category="unspecified-high"\`. Do not create a commit checkpoint until the verifier returns PASS.
|
|
110574
|
+
If \`deep-high\` is unavailable, fall back to \`category="unspecified-high"\`. Do not create a commit checkpoint until the verifier returns PASS.
|
|
110466
110575
|
- On a verifier PASS: make the commit checkpoint for that step (see original 5.3). Proceed.
|
|
110467
110576
|
- On a verifier FAIL: Lead decides:
|
|
110468
110577
|
- **Retry with fix hint**: \`team_task_update(status=pending)\` on the original step + \`team_send_message(teamRunId=<id>, to=<original member>, summary="retry", body=<specific failure from verifier>)\`. Runtime reassigns.
|
|
@@ -110489,7 +110598,7 @@ Append to the 6.6 summary a "Dispatch path" line and, when team path was used, t
|
|
|
110489
110598
|
- Do not inline the Intent Card or verify-spec into task descriptions \u2014 rely on the broadcasts.
|
|
110490
110599
|
- Do not recreate the team mid-session.
|
|
110491
110600
|
- Do not run tests from Lead \u2014 the external verifier owns that lane.
|
|
110492
|
-
- Do not put \`oracle\` / \`librarian\` /
|
|
110601
|
+
- Do not put \`oracle\` / \`librarian\` / a deep lane into the team spec \u2014 oracle/librarian are team-ineligible, and a deep lane under category routing downcasts to sisyphus-junior. Use them via \`task()\` outside the team when needed.
|
|
110493
110602
|
`;
|
|
110494
110603
|
|
|
110495
110604
|
// packages/omo-opencode/src/features/builtin-commands/templates/refactor.ts
|
|
@@ -110988,7 +111097,7 @@ Team mode is enabled for this session. The rules below **override Phase 2-4** of
|
|
|
110988
111097
|
|
|
110989
111098
|
Rationale for this composition:
|
|
110990
111099
|
- **4 workers = team mode's parallel cap.** A fifth member just queues.
|
|
110991
|
-
- **Reviewer is NOT a team member** \u2014 review demands stronger reasoning than category routing provides (team category members are downcast to sisyphus-junior). The reviewer runs OUTSIDE the team as a \`deep\` task; see Phase 3.
|
|
111100
|
+
- **Reviewer is NOT a team member** \u2014 review demands stronger reasoning than category routing provides (team category members are downcast to sisyphus-junior). The reviewer runs OUTSIDE the team as a \`deep-high\` task; see Phase 3.
|
|
110992
111101
|
- **quick \xD7 3** absorbs the mass of per-file slop removal. **unspecified-low \xD7 1** is the rework lane for fixes triggered by reviewer findings.
|
|
110993
111102
|
|
|
110994
111103
|
**Team lifecycle** (create once, reuse until Phase 5 cleanup):
|
|
@@ -111015,14 +111124,14 @@ While any team task is \`pending | claimed | in_progress\`:
|
|
|
111015
111124
|
- Immediately dispatch an **external reviewer** \u2014 review runs OUTSIDE the team because team-member category routing downcasts to sisyphus-junior:
|
|
111016
111125
|
\`\`\`
|
|
111017
111126
|
task(
|
|
111018
|
-
category="deep",
|
|
111127
|
+
category="deep-high",
|
|
111019
111128
|
load_skills=[],
|
|
111020
111129
|
run_in_background=true,
|
|
111021
111130
|
description="slop review: <file>",
|
|
111022
111131
|
prompt=<file path + full worker report + Safety/Behavior/Quality checklist + instruction to output "PASS" or "FAIL:<per-hunk rollback instructions>">
|
|
111023
111132
|
)
|
|
111024
111133
|
\`\`\`
|
|
111025
|
-
If \`deep\` is unavailable in this session, fall back to \`category="unspecified-high"\`.
|
|
111134
|
+
If \`deep-high\` is unavailable in this session, fall back to \`category="unspecified-high"\`.
|
|
111026
111135
|
- On a reviewer task returning FAIL:
|
|
111027
111136
|
- Create a rework team task: \`team_task_create(subject="rework: <file>", description=<reverse-patch hunks from reviewer + "then run $omo:remove-ai-slops on remaining non-rolled-back issues only">)\`. The \`unspecified-low\` fix member claims it.
|
|
111028
111137
|
- Create a new reviewer task paired to the rework completion (same incremental pattern).
|
|
@@ -111061,7 +111170,7 @@ skill(name="hyperplan")
|
|
|
111061
111170
|
|
|
111062
111171
|
After loading the skill, follow its 7-phase workflow EXACTLY using this user request.
|
|
111063
111172
|
|
|
111064
|
-
Roster contract: call \`team_create\` with category members \`unspecified-low\`, \`unspecified-high\`, \`ultrabrain\`, and \`artistry\`. Include \`deep\` only if the category is enabled; if \`deep\` is disabled or unavailable, retry without only that member and state the degraded roster.
|
|
111173
|
+
Roster contract: call \`team_create\` with category members \`unspecified-low\`, \`unspecified-high\`, \`ultrabrain\`, and \`artistry\`. Include \`deep-low\` only if the category is enabled; if \`deep-low\` is disabled or unavailable, retry without only that member and state the degraded roster.
|
|
111065
111174
|
|
|
111066
111175
|
<user-request>
|
|
111067
111176
|
$ARGUMENTS
|
|
@@ -131047,8 +131156,9 @@ function categoryResolutionError(error) {
|
|
|
131047
131156
|
}
|
|
131048
131157
|
async function resolveCategoryExecution(args, executorCtx, inheritedModel, systemDefaultModel) {
|
|
131049
131158
|
const { client, userCategories, sisyphusJuniorModel } = executorCtx;
|
|
131050
|
-
const categoryName = args.category;
|
|
131051
131159
|
const enabledCategories = mergeCategories(userCategories);
|
|
131160
|
+
const requestedCategoryName = args.category;
|
|
131161
|
+
const categoryName = enabledCategories[requestedCategoryName] !== undefined ? requestedCategoryName : canonicalCategoryName(requestedCategoryName);
|
|
131052
131162
|
const categoryExists = enabledCategories[categoryName] !== undefined;
|
|
131053
131163
|
if (!categoryExists) {
|
|
131054
131164
|
const allCategoryNames = Object.keys(enabledCategories).join(", ");
|
|
@@ -152711,7 +152821,7 @@ Plan Agent returns a structured work breakdown with parallel execution opportuni
|
|
|
152711
152821
|
}
|
|
152712
152822
|
function buildParallelDelegationSection(model, categories) {
|
|
152713
152823
|
const isNonClaude = !model.toLowerCase().includes("claude");
|
|
152714
|
-
const hasDelegationCategory = categories.some((category) => category.name === "deep" || category.name === "unspecified-high");
|
|
152824
|
+
const hasDelegationCategory = categories.some((category) => category.name === "deep-low" || category.name === "deep-high" || category.name === "unspecified-high");
|
|
152715
152825
|
if (!isNonClaude || !hasDelegationCategory) {
|
|
152716
152826
|
return "";
|
|
152717
152827
|
}
|
|
@@ -152722,7 +152832,7 @@ function buildParallelDelegationSection(model, categories) {
|
|
|
152722
152832
|
**MANDATORY - for ANY implementation task:**
|
|
152723
152833
|
|
|
152724
152834
|
1. **ALWAYS decompose** the task into independent work units. No exceptions. Even if the task "feels small", decompose it.
|
|
152725
|
-
2. **ALWAYS delegate** EACH unit to a \`deep\` or \`unspecified-high\` agent in parallel (\`run_in_background=true\`).
|
|
152835
|
+
2. **ALWAYS delegate** EACH unit to a \`deep-low\` or \`unspecified-high\` agent in parallel (\`run_in_background=true\`); reserve \`deep-high\` for a unit whose central decision cannot be settled from evidence.
|
|
152726
152836
|
3. **NEVER work sequentially.** If 4 independent units exist, spawn 4 agents simultaneously. Not 1 at a time. Not 2 then 2.
|
|
152727
152837
|
4. **NEVER implement directly** when delegation is possible. You write prompts, not code.
|
|
152728
152838
|
|
|
@@ -152858,7 +152968,8 @@ task(category="quick", load_skills=[], run_in_background=true, prompt="Redesign
|
|
|
152858
152968
|
|---|---|
|
|
152859
152969
|
| Visual design, UI, styling, animations, layout, design systems | \`visual-engineering\` |
|
|
152860
152970
|
| Hard logic and architecture decisions | \`ultrabrain\` |
|
|
152861
|
-
| 3D graphics, computer use, browser use, backend, logic, algorithms, CAPTCHA solving, multimodal, autonomous research + end-to-end implementation | \`deep\` |
|
|
152971
|
+
| 3D graphics, computer use, browser use, backend, logic, algorithms, CAPTCHA solving, multimodal, autonomous research + end-to-end implementation | \`deep-low\` |
|
|
152972
|
+
| Any of the above whose central decision cannot be settled from evidence: a trade-off, a contract crossing a package boundary, a mechanism with no in-repo pattern, correctness argued from invariants | \`deep-high\` |
|
|
152862
152973
|
| Single-file typo, trivial config change | \`quick\` |
|
|
152863
152974
|
|
|
152864
152975
|
**When in doubt about category, it is almost never \`quick\` or \`unspecified-*\`. Match the domain.**`;
|
|
@@ -156332,7 +156443,7 @@ Don't narrate every tool call, but don't go silent for long stretches on complex
|
|
|
156332
156443
|
|
|
156333
156444
|
## task (delegation)
|
|
156334
156445
|
|
|
156335
|
-
\`task()\` is your primary lever. Use it to invoke specialist agents (\`subagent_type="oracle"|"metis"|"momus"|"explore"|"librarian"\`) or to delegate implementation to categories (\`category="visual-engineering"|"deep"|"ultrabrain"|"quick"|...\`). Every invocation needs \`load_skills\` (empty array \`[]\` is valid when no skills apply).
|
|
156446
|
+
\`task()\` is your primary lever. Use it to invoke specialist agents (\`subagent_type="oracle"|"metis"|"momus"|"explore"|"librarian"\`) or to delegate implementation to categories (\`category="visual-engineering"|"deep-low"|"deep-high"|"ultrabrain"|"quick"|...\`). Every invocation needs \`load_skills\` (empty array \`[]\` is valid when no skills apply).
|
|
156336
156447
|
|
|
156337
156448
|
Parameters to always think about:
|
|
156338
156449
|
|
|
@@ -174068,7 +174179,7 @@ function parseWindowsProcessTable(output) {
|
|
|
174068
174179
|
const entries = Array.isArray(parsed) ? parsed : parsed === undefined ? [] : [parsed];
|
|
174069
174180
|
const processes = [];
|
|
174070
174181
|
for (const entry of entries) {
|
|
174071
|
-
if (!
|
|
174182
|
+
if (!isRecord12(entry))
|
|
174072
174183
|
continue;
|
|
174073
174184
|
const pid = numberField(entry, "ProcessId");
|
|
174074
174185
|
const ppid = numberField(entry, "ParentProcessId");
|
|
@@ -174102,7 +174213,7 @@ function stringField(record, key) {
|
|
|
174102
174213
|
const value = record[key];
|
|
174103
174214
|
return typeof value === "string" ? value : undefined;
|
|
174104
174215
|
}
|
|
174105
|
-
function
|
|
174216
|
+
function isRecord12(value) {
|
|
174106
174217
|
return typeof value === "object" && value !== null;
|
|
174107
174218
|
}
|
|
174108
174219
|
|
|
@@ -174206,7 +174317,7 @@ async function attestLspDaemonOwner(target, deps = {}) {
|
|
|
174206
174317
|
}
|
|
174207
174318
|
}
|
|
174208
174319
|
function parseLspDaemonOwner(value) {
|
|
174209
|
-
if (!
|
|
174320
|
+
if (!isRecord13(value))
|
|
174210
174321
|
return null;
|
|
174211
174322
|
const pid = value["pid"];
|
|
174212
174323
|
const nonce = value["nonce"];
|
|
@@ -174218,7 +174329,7 @@ function parseLspDaemonOwner(value) {
|
|
|
174218
174329
|
return null;
|
|
174219
174330
|
if (typeof startedAt !== "string" || startedAt.length === 0)
|
|
174220
174331
|
return null;
|
|
174221
|
-
if (!
|
|
174332
|
+
if (!isRecord13(endpoint))
|
|
174222
174333
|
return null;
|
|
174223
174334
|
const kind = endpoint["kind"];
|
|
174224
174335
|
const path = endpoint["path"];
|
|
@@ -174270,7 +174381,7 @@ async function pingLspDaemonOwner(endpoint, authToken) {
|
|
|
174270
174381
|
return finish(null);
|
|
174271
174382
|
try {
|
|
174272
174383
|
const response = JSON.parse(line);
|
|
174273
|
-
if (!
|
|
174384
|
+
if (!isRecord13(response) || response["id"] !== OWNER_PING_REQUEST_ID || "error" in response) {
|
|
174274
174385
|
return finish(null);
|
|
174275
174386
|
}
|
|
174276
174387
|
finish(parseLspDaemonOwner(response["result"]));
|
|
@@ -174283,7 +174394,7 @@ async function pingLspDaemonOwner(endpoint, authToken) {
|
|
|
174283
174394
|
function sameOwner(left, right) {
|
|
174284
174395
|
return left.pid === right.pid && left.nonce === right.nonce && left.startedAt === right.startedAt && left.endpoint.kind === right.endpoint.kind && left.endpoint.path === right.endpoint.path && left.endpoint.dev === right.endpoint.dev && left.endpoint.ino === right.endpoint.ino;
|
|
174285
174396
|
}
|
|
174286
|
-
function
|
|
174397
|
+
function isRecord13(value) {
|
|
174287
174398
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
174288
174399
|
}
|
|
174289
174400
|
|
|
@@ -174681,37 +174792,85 @@ function defaultPluginRoot() {
|
|
|
174681
174792
|
// packages/telemetry-core/src/activity-state.ts
|
|
174682
174793
|
init_atomic_write();
|
|
174683
174794
|
init_xdg_data_dir();
|
|
174684
|
-
import { existsSync as existsSync111, mkdirSync as
|
|
174685
|
-
import { basename as basename24, join as
|
|
174795
|
+
import { existsSync as existsSync111, mkdirSync as mkdirSync27, readFileSync as readFileSync76 } from "fs";
|
|
174796
|
+
import { basename as basename24, join as join139 } from "path";
|
|
174797
|
+
|
|
174798
|
+
// packages/telemetry-core/src/day-claim.ts
|
|
174799
|
+
import { closeSync as closeSync6, mkdirSync as mkdirSync26, openSync as openSync6, readdirSync as readdirSync33, rmSync as rmSync6 } from "fs";
|
|
174800
|
+
import { join as join138 } from "path";
|
|
174801
|
+
var CLAIM_PREFIX = "daily-active.";
|
|
174802
|
+
var CLAIM_SUFFIX = ".claim";
|
|
174803
|
+
function getTelemetryDayClaimFilePath(stateDir, dayUTC) {
|
|
174804
|
+
return join138(stateDir, `${CLAIM_PREFIX}${dayUTC}${CLAIM_SUFFIX}`);
|
|
174805
|
+
}
|
|
174806
|
+
function claimUtcDay(stateDir, dayUTC) {
|
|
174807
|
+
try {
|
|
174808
|
+
mkdirSync26(stateDir, { recursive: true });
|
|
174809
|
+
closeSync6(openSync6(getTelemetryDayClaimFilePath(stateDir, dayUTC), "wx"));
|
|
174810
|
+
} catch (error) {
|
|
174811
|
+
return error.code === "EEXIST" ? "already-claimed" : "unavailable";
|
|
174812
|
+
}
|
|
174813
|
+
pruneSupersededClaims(stateDir, dayUTC);
|
|
174814
|
+
return "claimed";
|
|
174815
|
+
}
|
|
174816
|
+
function pruneSupersededClaims(stateDir, dayUTC) {
|
|
174817
|
+
const currentClaim = `${CLAIM_PREFIX}${dayUTC}${CLAIM_SUFFIX}`;
|
|
174818
|
+
let entries;
|
|
174819
|
+
try {
|
|
174820
|
+
entries = readdirSync33(stateDir);
|
|
174821
|
+
} catch {
|
|
174822
|
+
return;
|
|
174823
|
+
}
|
|
174824
|
+
for (const entry of entries) {
|
|
174825
|
+
if (entry === currentClaim)
|
|
174826
|
+
continue;
|
|
174827
|
+
if (!entry.startsWith(CLAIM_PREFIX) || !entry.endsWith(CLAIM_SUFFIX))
|
|
174828
|
+
continue;
|
|
174829
|
+
try {
|
|
174830
|
+
rmSync6(join138(stateDir, entry), { force: true });
|
|
174831
|
+
} catch {}
|
|
174832
|
+
}
|
|
174833
|
+
}
|
|
174834
|
+
|
|
174835
|
+
// packages/telemetry-core/src/activity-state.ts
|
|
174686
174836
|
var POSTHOG_ACTIVITY_STATE_FILE = "posthog-activity.json";
|
|
174837
|
+
var capturedDaysByStateDir = new Map;
|
|
174687
174838
|
function resolveTelemetryStateDir(product, options = {}) {
|
|
174688
174839
|
const dataDir = resolveXdgDataDir(product.cacheDirName, {
|
|
174689
174840
|
env: options.env,
|
|
174690
174841
|
osProvider: options.osProvider
|
|
174691
174842
|
});
|
|
174692
|
-
const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined :
|
|
174843
|
+
const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join139(options.env.XDG_DATA_HOME, product.cacheDirName);
|
|
174693
174844
|
if (dataDir === xdgStateDir || xdgStateDir === undefined && basename24(dataDir) === product.cacheDirName) {
|
|
174694
174845
|
return dataDir;
|
|
174695
174846
|
}
|
|
174696
|
-
return
|
|
174847
|
+
return join139(dataDir, product.cacheDirName);
|
|
174697
174848
|
}
|
|
174698
174849
|
function getTelemetryActivityStateFilePath(stateDir) {
|
|
174699
|
-
return
|
|
174850
|
+
return join139(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
|
|
174700
174851
|
}
|
|
174701
174852
|
function getDailyActiveCaptureState(input) {
|
|
174702
|
-
const state = readPostHogActivityState(input.stateDir, input.diagnostics);
|
|
174703
174853
|
const dayUTC = getUtcDayString(input.now ?? new Date);
|
|
174704
|
-
|
|
174705
|
-
|
|
174854
|
+
if (capturedDaysByStateDir.get(input.stateDir) === dayUTC) {
|
|
174855
|
+
return { dayUTC, captureDaily: false };
|
|
174856
|
+
}
|
|
174857
|
+
const state = readPostHogActivityState(input.stateDir, input.diagnostics);
|
|
174858
|
+
if (state.lastActiveDayUTC === dayUTC) {
|
|
174859
|
+
capturedDaysByStateDir.set(input.stateDir, dayUTC);
|
|
174860
|
+
return { dayUTC, captureDaily: false };
|
|
174861
|
+
}
|
|
174862
|
+
const claim = claimUtcDay(input.stateDir, dayUTC);
|
|
174863
|
+
capturedDaysByStateDir.set(input.stateDir, dayUTC);
|
|
174864
|
+
if (claim === "already-claimed") {
|
|
174865
|
+
return { dayUTC, captureDaily: false };
|
|
174866
|
+
}
|
|
174867
|
+
if (claim === "claimed") {
|
|
174706
174868
|
writePostHogActivityState(input.stateDir, {
|
|
174707
174869
|
...state,
|
|
174708
174870
|
lastActiveDayUTC: dayUTC
|
|
174709
174871
|
}, input.diagnostics);
|
|
174710
174872
|
}
|
|
174711
|
-
return {
|
|
174712
|
-
dayUTC,
|
|
174713
|
-
captureDaily
|
|
174714
|
-
};
|
|
174873
|
+
return { dayUTC, captureDaily: true };
|
|
174715
174874
|
}
|
|
174716
174875
|
function getUtcDayString(date) {
|
|
174717
174876
|
return date.toISOString().slice(0, 10);
|
|
@@ -174744,7 +174903,7 @@ function readPostHogActivityState(stateDir, diagnostics) {
|
|
|
174744
174903
|
function writePostHogActivityState(stateDir, nextState, diagnostics) {
|
|
174745
174904
|
const stateFilePath = getTelemetryActivityStateFilePath(stateDir);
|
|
174746
174905
|
try {
|
|
174747
|
-
|
|
174906
|
+
mkdirSync27(stateDir, { recursive: true });
|
|
174748
174907
|
writeFileAtomically(stateFilePath, `${JSON.stringify(nextState, null, 2)}
|
|
174749
174908
|
`);
|
|
174750
174909
|
} catch (error) {
|
|
@@ -179944,7 +180103,7 @@ var TOPLEVEL_SENTINELS = [
|
|
|
179944
180103
|
field: "window_id"
|
|
179945
180104
|
}
|
|
179946
180105
|
];
|
|
179947
|
-
function
|
|
180106
|
+
function isRecord14(value) {
|
|
179948
180107
|
return typeof value == "object" && value !== null && !Array.isArray(value);
|
|
179949
180108
|
}
|
|
179950
180109
|
function toRfc3339(timestamp) {
|
|
@@ -179966,7 +180125,7 @@ function relocateInto(properties, key, value) {
|
|
|
179966
180125
|
properties[key] = value;
|
|
179967
180126
|
}
|
|
179968
180127
|
function buildV1Event(message) {
|
|
179969
|
-
const sourceProperties =
|
|
180128
|
+
const sourceProperties = isRecord14(message.properties) ? message.properties : {};
|
|
179970
180129
|
const properties = {
|
|
179971
180130
|
...sourceProperties
|
|
179972
180131
|
};
|