@open-agent-toolkit/cli 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/assets/agents/oat-phase-implementer.md +14 -3
  2. package/assets/agents/oat-reviewer.md +9 -2
  3. package/assets/docs/cli-utilities/configuration.md +33 -1
  4. package/assets/docs/provider-sync/config.md +1 -0
  5. package/assets/docs/reference/oat-directory-structure.md +2 -0
  6. package/assets/docs/workflows/projects/implementation-execution.md +60 -12
  7. package/assets/docs/workflows/projects/lifecycle.md +4 -0
  8. package/assets/public-package-versions.json +4 -4
  9. package/assets/skills/oat-project-implement/SKILL.md +173 -94
  10. package/assets/skills/oat-project-plan/SKILL.md +57 -1
  11. package/assets/skills/oat-project-plan-writing/SKILL.md +6 -2
  12. package/assets/skills/oat-project-quick-start/SKILL.md +57 -1
  13. package/assets/templates/plan.md +1 -1
  14. package/assets/templates/state.md +4 -0
  15. package/dist/commands/config/index.d.ts.map +1 -1
  16. package/dist/commands/config/index.js +36 -0
  17. package/dist/commands/project/dispatch-ceiling/index.d.ts +16 -0
  18. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -0
  19. package/dist/commands/project/dispatch-ceiling/index.js +288 -0
  20. package/dist/commands/project/index.d.ts.map +1 -1
  21. package/dist/commands/project/index.js +2 -0
  22. package/dist/config/oat-config.d.ts +7 -0
  23. package/dist/config/oat-config.d.ts.map +1 -1
  24. package/dist/config/oat-config.js +23 -0
  25. package/dist/config/resolve.d.ts.map +1 -1
  26. package/dist/config/resolve.js +4 -0
  27. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  28. package/dist/providers/codex/codec/sync-extension.js +16 -8
  29. package/package.json +2 -2
@@ -40,6 +40,8 @@ const KEY_ORDER = [
40
40
  'workflow.autoReviewAtHillCheckpoints',
41
41
  'workflow.autoNarrowReReviewScope',
42
42
  'workflow.designMode',
43
+ 'workflow.dispatchCeiling.codex',
44
+ 'workflow.dispatchCeiling.claude',
43
45
  'worktrees.root',
44
46
  ];
45
47
  const CONFIG_CATALOG = [
@@ -417,6 +419,28 @@ const CONFIG_CATALOG = [
417
419
  owningCommand: 'oat config set workflow.designMode <value>',
418
420
  description: 'Persisted preference for oat-project-design: "collaborative" runs every section section-by-section, "selective" drafts routine sections silently and live-reviews high-risk sections, and "draft" drafts the full design up front for holistic review. Quick-start lightweight design supports collaborative/draft only and treats selective as collaborative when encountered. When unset, the skill prompts. Runtime signals (OAT_NON_INTERACTIVE=1, no TTY) always outrank this preference. Resolution: arg > env > non-interactive context > local > shared > user > default.',
419
421
  },
422
+ {
423
+ key: 'workflow.dispatchCeiling.codex',
424
+ group: 'Workflow Preferences (3-layer: local > shared > user)',
425
+ file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
426
+ scope: 'workflow',
427
+ type: 'low | medium | high | xhigh',
428
+ defaultValue: 'unset',
429
+ mutability: 'read/write',
430
+ owningCommand: 'oat config set workflow.dispatchCeiling.codex <value>',
431
+ description: 'Maximum Codex reasoning effort OAT may select for deterministic implementation and review subagent variants. Provider defaults remain informational for base/unpinned roles and are not treated as this ceiling. Resolution: local > shared > user > default.',
432
+ },
433
+ {
434
+ key: 'workflow.dispatchCeiling.claude',
435
+ group: 'Workflow Preferences (3-layer: local > shared > user)',
436
+ file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
437
+ scope: 'workflow',
438
+ type: 'haiku | sonnet | opus',
439
+ defaultValue: 'unset',
440
+ mutability: 'read/write',
441
+ owningCommand: 'oat config set workflow.dispatchCeiling.claude <value>',
442
+ description: 'Maximum Claude model tier OAT may select for provider-native subagent dispatch. Claude has no separate per-dispatch effort axis, so the effort axis remains not-applicable. Resolution: local > shared > user > default.',
443
+ },
420
444
  {
421
445
  key: 'sync.defaultStrategy',
422
446
  group: 'Sync/Provider (.oat/sync/config.json)',
@@ -479,6 +503,8 @@ const WORKFLOW_ENUM_VALUES = {
479
503
  'workflow.postImplementSequence': ['wait', 'summary', 'pr', 'docs-pr'],
480
504
  'workflow.reviewExecutionModel': ['subagent', 'inline', 'fresh-session'],
481
505
  'workflow.designMode': ['collaborative', 'selective', 'draft'],
506
+ 'workflow.dispatchCeiling.codex': ['low', 'medium', 'high', 'xhigh'],
507
+ 'workflow.dispatchCeiling.claude': ['haiku', 'sonnet', 'opus'],
482
508
  };
483
509
  const WORKFLOW_BOOLEAN_KEYS = new Set([
484
510
  'workflow.archiveOnComplete',
@@ -562,6 +588,16 @@ function parseWorkflowValue(key, rawValue) {
562
588
  }
563
589
  function applyWorkflowValue(workflow, key, value) {
564
590
  const subKey = key.slice('workflow.'.length);
591
+ if (subKey.startsWith('dispatchCeiling.')) {
592
+ const providerKey = subKey.slice('dispatchCeiling.'.length);
593
+ return {
594
+ ...workflow,
595
+ dispatchCeiling: {
596
+ ...workflow.dispatchCeiling,
597
+ [providerKey]: value,
598
+ },
599
+ };
600
+ }
565
601
  return {
566
602
  ...workflow,
567
603
  [subKey]: value,
@@ -0,0 +1,16 @@
1
+ import { type CommandContext, type GlobalOptions } from '../../../app/command-context.js';
2
+ import { type ActiveProjectResolution } from '../../../config/oat-config.js';
3
+ import { type ResolvedConfig } from '../../../config/resolve.js';
4
+ import { Command } from 'commander';
5
+ interface DispatchCeilingDependencies {
6
+ buildCommandContext: (options: GlobalOptions) => CommandContext;
7
+ resolveProjectRoot: (cwd: string) => Promise<string>;
8
+ resolveEffectiveConfig: (repoRoot: string, userConfigDir: string, env: NodeJS.ProcessEnv) => Promise<ResolvedConfig>;
9
+ resolveActiveProject: (repoRoot: string) => Promise<ActiveProjectResolution>;
10
+ readFile: (path: string) => Promise<string>;
11
+ pathExists: (path: string) => Promise<boolean>;
12
+ processEnv: NodeJS.ProcessEnv;
13
+ }
14
+ export declare function createProjectDispatchCeilingCommand(overrides?: Partial<DispatchCeilingDependencies>): Command;
15
+ export {};
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/dispatch-ceiling/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAEL,KAAK,uBAAuB,EAG7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,UAAU,2BAA2B;IACnC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAiXD,wBAAgB,mCAAmC,CACjD,SAAS,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACnD,OAAO,CAsCT"}
@@ -0,0 +1,288 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import { isAbsolute, join } from 'node:path';
3
+ import { buildCommandContext, } from '../../../app/command-context.js';
4
+ import { getFrontmatterBlock } from '../../shared/frontmatter.js';
5
+ import { readGlobalOptions } from '../../shared/shared.utils.js';
6
+ import { resolveActiveProject, } from '../../../config/oat-config.js';
7
+ import { resolveEffectiveConfig, } from '../../../config/resolve.js';
8
+ import { resolveProjectRoot } from '../../../fs/paths.js';
9
+ import TOML from '@iarna/toml';
10
+ import { Command } from 'commander';
11
+ import YAML from 'yaml';
12
+ const CODEX_VALUES = [
13
+ 'low',
14
+ 'medium',
15
+ 'high',
16
+ 'xhigh',
17
+ ];
18
+ const CLAUDE_VALUES = [
19
+ 'haiku',
20
+ 'sonnet',
21
+ 'opus',
22
+ ];
23
+ const DEFAULT_DEPENDENCIES = {
24
+ buildCommandContext,
25
+ resolveProjectRoot,
26
+ resolveEffectiveConfig,
27
+ resolveActiveProject,
28
+ readFile: async (path) => readFile(path, 'utf8'),
29
+ pathExists: async (path) => {
30
+ try {
31
+ await access(path);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ },
38
+ processEnv: process.env,
39
+ };
40
+ function normalizeProvider(value) {
41
+ if (value === 'codex' || value === 'claude') {
42
+ return value;
43
+ }
44
+ throw new Error('Invalid provider. Expected one of: codex, claude.');
45
+ }
46
+ function isValidProviderValue(provider, value) {
47
+ if (provider === 'codex') {
48
+ return (typeof value === 'string' &&
49
+ CODEX_VALUES.includes(value));
50
+ }
51
+ return (typeof value === 'string' &&
52
+ CLAUDE_VALUES.includes(value));
53
+ }
54
+ function configSourceToCeilingSource(source) {
55
+ if (source === 'local') {
56
+ return 'local-config';
57
+ }
58
+ if (source === 'shared') {
59
+ return 'repo-config';
60
+ }
61
+ if (source === 'user') {
62
+ return 'user-config';
63
+ }
64
+ if (source === 'env') {
65
+ return 'env';
66
+ }
67
+ return null;
68
+ }
69
+ function sourceLabel(source) {
70
+ switch (source) {
71
+ case 'local-config':
72
+ return 'local config';
73
+ case 'repo-config':
74
+ return 'repo config';
75
+ case 'user-config':
76
+ return 'user config';
77
+ case 'env':
78
+ return 'environment';
79
+ case 'project-state':
80
+ return 'project state';
81
+ default:
82
+ return 'none';
83
+ }
84
+ }
85
+ function providerLabel(provider) {
86
+ return provider === 'codex' ? 'Codex' : 'Claude';
87
+ }
88
+ function resolveTargetProjectPath(repoRoot, projectPath) {
89
+ return isAbsolute(projectPath) ? projectPath : join(repoRoot, projectPath);
90
+ }
91
+ function readProjectDispatchCeiling(provider, content) {
92
+ const frontmatter = getFrontmatterBlock(content);
93
+ if (!frontmatter) {
94
+ return null;
95
+ }
96
+ const parsed = YAML.parse(frontmatter);
97
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
98
+ return null;
99
+ }
100
+ const ceiling = parsed['oat_dispatch_ceiling'];
101
+ if (!ceiling || typeof ceiling !== 'object' || Array.isArray(ceiling)) {
102
+ return null;
103
+ }
104
+ const ceilingRecord = ceiling;
105
+ if (ceilingRecord['provider'] !== provider) {
106
+ return null;
107
+ }
108
+ const value = ceilingRecord['value'];
109
+ return isValidProviderValue(provider, value) ? value : null;
110
+ }
111
+ async function resolveProjectStateCeiling(provider, projectPath, dependencies) {
112
+ if (!projectPath) {
113
+ return null;
114
+ }
115
+ try {
116
+ const content = await dependencies.readFile(join(projectPath, 'state.md'));
117
+ return readProjectDispatchCeiling(provider, content);
118
+ }
119
+ catch {
120
+ return null;
121
+ }
122
+ }
123
+ async function resolveProjectPath(repoRoot, dependencies, options) {
124
+ if (options.projectPath) {
125
+ return resolveTargetProjectPath(repoRoot, options.projectPath);
126
+ }
127
+ const activeProject = await dependencies.resolveActiveProject(repoRoot);
128
+ if (activeProject.status !== 'active' || !activeProject.path) {
129
+ return null;
130
+ }
131
+ return join(repoRoot, activeProject.path);
132
+ }
133
+ function readResolvedConfigCeiling(provider, resolvedConfig) {
134
+ const entry = resolvedConfig.resolved[`workflow.dispatchCeiling.${provider}`];
135
+ const source = entry ? configSourceToCeilingSource(entry.source) : null;
136
+ if (!entry || !source || !isValidProviderValue(provider, entry.value)) {
137
+ return null;
138
+ }
139
+ return {
140
+ value: entry.value,
141
+ source,
142
+ };
143
+ }
144
+ function readCodexDefaultFromToml(content) {
145
+ let parsed;
146
+ try {
147
+ parsed = TOML.parse(content);
148
+ }
149
+ catch {
150
+ return null;
151
+ }
152
+ const value = parsed['model_reasoning_effort'];
153
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
154
+ }
155
+ async function resolveCodexProviderDefaultEffort(repoRoot, context, dependencies) {
156
+ const candidates = [
157
+ join(repoRoot, '.codex', 'config.toml'),
158
+ join(context.home, '.codex', 'config.toml'),
159
+ ];
160
+ for (const candidate of candidates) {
161
+ if (!(await dependencies.pathExists(candidate))) {
162
+ continue;
163
+ }
164
+ const value = readCodexDefaultFromToml(await dependencies.readFile(candidate));
165
+ if (value) {
166
+ return value;
167
+ }
168
+ }
169
+ return 'unknown';
170
+ }
171
+ function blockMessage(provider) {
172
+ const label = providerLabel(provider);
173
+ return `BLOCKED: ${label} dispatch ceiling is unresolved in non-interactive mode.\nSet workflow.dispatchCeiling.${provider} in .oat/config.json or oat_dispatch_ceiling in project state.`;
174
+ }
175
+ function isNonInteractiveEnv(env) {
176
+ return env['OAT_NON_INTERACTIVE'] === '1';
177
+ }
178
+ async function resolveDispatchCeiling(context, dependencies, options) {
179
+ const provider = normalizeProvider(options.provider);
180
+ const repoRoot = await dependencies.resolveProjectRoot(context.cwd);
181
+ const userConfigDir = join(context.home, '.oat');
182
+ const [resolvedConfig, projectPath] = await Promise.all([
183
+ dependencies.resolveEffectiveConfig(repoRoot, userConfigDir, dependencies.processEnv),
184
+ resolveProjectPath(repoRoot, dependencies, options),
185
+ ]);
186
+ const providerDefaultEffort = provider === 'codex'
187
+ ? await resolveCodexProviderDefaultEffort(repoRoot, context, dependencies)
188
+ : 'not-applicable';
189
+ const configCeiling = readResolvedConfigCeiling(provider, resolvedConfig);
190
+ if (configCeiling) {
191
+ return {
192
+ status: 'resolved',
193
+ provider,
194
+ value: configCeiling.value,
195
+ source: configCeiling.source,
196
+ unresolved: false,
197
+ projectPath,
198
+ providerDefaultEffort,
199
+ };
200
+ }
201
+ const projectCeiling = await resolveProjectStateCeiling(provider, projectPath, dependencies);
202
+ if (projectCeiling) {
203
+ return {
204
+ status: 'resolved',
205
+ provider,
206
+ value: projectCeiling,
207
+ source: 'project-state',
208
+ unresolved: false,
209
+ projectPath,
210
+ providerDefaultEffort,
211
+ };
212
+ }
213
+ const shouldBlock = options.nonInteractive === true ||
214
+ isNonInteractiveEnv(dependencies.processEnv) ||
215
+ (options.preflight === true && !context.interactive && !context.json);
216
+ const message = shouldBlock ? blockMessage(provider) : undefined;
217
+ return {
218
+ status: shouldBlock ? 'blocked' : 'unresolved',
219
+ provider,
220
+ value: null,
221
+ source: null,
222
+ unresolved: true,
223
+ projectPath,
224
+ providerDefaultEffort,
225
+ message,
226
+ };
227
+ }
228
+ function writeHumanResolution(context, resolution) {
229
+ const label = providerLabel(resolution.provider);
230
+ if (resolution.status === 'blocked' && resolution.message) {
231
+ context.logger.error(resolution.message);
232
+ return;
233
+ }
234
+ context.logger.info(`${label} dispatch ceiling: ${resolution.value ?? 'unresolved'}`);
235
+ context.logger.info(`Source: ${sourceLabel(resolution.source)}`);
236
+ if (resolution.provider === 'codex') {
237
+ context.logger.info(`Codex provider default effort: ${resolution.providerDefaultEffort}`);
238
+ context.logger.info(`Note: OAT will use pinned subagent variants up to ${resolution.value ?? 'the resolved ceiling'}. Base/unpinned roles resolve through the provider default.`);
239
+ }
240
+ else {
241
+ context.logger.info('Effort axis: not-applicable');
242
+ }
243
+ }
244
+ async function runDispatchCeilingResolve(context, dependencies, options) {
245
+ try {
246
+ const resolution = await resolveDispatchCeiling(context, dependencies, options);
247
+ if (context.json) {
248
+ context.logger.json(resolution);
249
+ }
250
+ else {
251
+ writeHumanResolution(context, resolution);
252
+ }
253
+ process.exitCode = resolution.status === 'blocked' ? 1 : 0;
254
+ }
255
+ catch (error) {
256
+ const message = error instanceof Error ? error.message : String(error);
257
+ if (context.json) {
258
+ context.logger.json({ status: 'error', message });
259
+ }
260
+ else {
261
+ context.logger.error(message);
262
+ }
263
+ process.exitCode = 1;
264
+ }
265
+ }
266
+ export function createProjectDispatchCeilingCommand(overrides = {}) {
267
+ const dependencies = {
268
+ ...DEFAULT_DEPENDENCIES,
269
+ ...overrides,
270
+ };
271
+ const command = new Command('dispatch-ceiling').description('Resolve OAT project dispatch ceiling metadata');
272
+ command.addCommand(new Command('resolve')
273
+ .description('Resolve dispatch ceiling for a provider')
274
+ .requiredOption('--provider <provider>', 'Provider: codex or claude')
275
+ .option('--project-path <path>', 'Read project-state ceiling from an explicit project path')
276
+ .option('--preflight', 'Treat unresolved non-interactive resolution as an implementation block')
277
+ .option('--non-interactive', 'Force non-interactive block behavior when the ceiling is unresolved')
278
+ .option('--json', 'Output machine-readable JSON')
279
+ .action(async (options, cmd) => {
280
+ const globalOptions = readGlobalOptions(cmd);
281
+ const context = dependencies.buildCommandContext({
282
+ ...globalOptions,
283
+ json: globalOptions.json === true || options.json === true,
284
+ });
285
+ await runDispatchCeilingResolve(context, dependencies, options);
286
+ }));
287
+ return command;
288
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,oBAAoB,IAAI,OAAO,CAc9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/project/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,oBAAoB,IAAI,OAAO,CAe9C"}
@@ -2,6 +2,7 @@ import { Command } from 'commander';
2
2
  import { createProjectArchiveCommand } from './archive/index.js';
3
3
  import { createProjectCompleteDiscoveryCommand } from './complete-discovery/index.js';
4
4
  import { createProjectCompleteStateCommand } from './complete-state/index.js';
5
+ import { createProjectDispatchCeilingCommand } from './dispatch-ceiling/index.js';
5
6
  import { createProjectListCommand } from './list.js';
6
7
  import { createProjectNewCommand } from './new/index.js';
7
8
  import { createProjectOpenCommand } from './open/index.js';
@@ -16,6 +17,7 @@ export function createProjectCommand() {
16
17
  .addCommand(createProjectArchiveCommand())
17
18
  .addCommand(createProjectCompleteDiscoveryCommand())
18
19
  .addCommand(createProjectCompleteStateCommand())
20
+ .addCommand(createProjectDispatchCeilingCommand())
19
21
  .addCommand(createProjectListCommand())
20
22
  .addCommand(createProjectNewCommand())
21
23
  .addCommand(createProjectOpenCommand())
@@ -20,6 +20,12 @@ export type WorkflowHillCheckpointDefault = 'every' | 'final';
20
20
  export type WorkflowPostImplementSequence = 'wait' | 'summary' | 'pr' | 'docs-pr';
21
21
  export type WorkflowReviewExecutionModel = 'subagent' | 'inline' | 'fresh-session';
22
22
  export type WorkflowDesignMode = 'collaborative' | 'selective' | 'draft';
23
+ export type WorkflowCodexDispatchCeiling = 'low' | 'medium' | 'high' | 'xhigh';
24
+ export type WorkflowClaudeDispatchCeiling = 'haiku' | 'sonnet' | 'opus';
25
+ export interface WorkflowDispatchCeiling {
26
+ codex?: WorkflowCodexDispatchCeiling;
27
+ claude?: WorkflowClaudeDispatchCeiling;
28
+ }
23
29
  export interface OatWorkflowConfig {
24
30
  hillCheckpointDefault?: WorkflowHillCheckpointDefault;
25
31
  archiveOnComplete?: boolean;
@@ -29,6 +35,7 @@ export interface OatWorkflowConfig {
29
35
  autoReviewAtHillCheckpoints?: boolean;
30
36
  autoNarrowReReviewScope?: boolean;
31
37
  designMode?: WorkflowDesignMode;
38
+ dispatchCeiling?: WorkflowDispatchCeiling;
32
39
  }
33
40
  export type OatToolsConfig = Partial<Record<'core' | 'ideas' | 'docs' | 'workflows' | 'utility' | 'project-management' | 'research' | 'brainstorm', boolean>>;
34
41
  export interface OatConfig {
@@ -1 +1 @@
1
- {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,6BAA6B,GAAG,OAAO,GAAG,OAAO,CAAC;AAC9D,MAAM,MAAM,6BAA6B,GACrC,MAAM,GACN,SAAS,GACT,IAAI,GACJ,SAAS,CAAC;AACd,MAAM,MAAM,4BAA4B,GACpC,UAAU,GACV,QAAQ,GACR,eAAe,CAAC;AACpB,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,WAAW,GAAG,OAAO,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,qBAAqB,CAAC,EAAE,6BAA6B,CAAC;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qBAAqB,CAAC,EAAE,6BAA6B,CAAC;IACtD,oBAAoB,CAAC,EAAE,4BAA4B,CAAC;IACpD,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAkFD,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,MAAM,CACF,MAAM,GACN,OAAO,GACP,MAAM,GACN,WAAW,GACX,SAAS,GACT,oBAAoB,GACpB,UAAU,GACV,YAAY,EACd,OAAO,CACR,CACF,CAAC;AAEF,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;CACxC;AAkRD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,EAAE,CAE7D;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAaxE;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAazB;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,uBAAuB,CAAC,CAkBlC;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,OAAO,CAAC,IAAI,CAAC,CAYf;AA2BD,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQxB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMrE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA6B5D"}
1
+ {"version":3,"file":"oat-config.d.ts","sourceRoot":"","sources":["../../src/config/oat-config.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,13 @@ const VALID_DESIGN_MODES = [
15
15
  'selective',
16
16
  'draft',
17
17
  ];
18
+ const VALID_CODEX_DISPATCH_CEILINGS = [
19
+ 'low',
20
+ 'medium',
21
+ 'high',
22
+ 'xhigh',
23
+ ];
24
+ const VALID_CLAUDE_DISPATCH_CEILINGS = ['haiku', 'sonnet', 'opus'];
18
25
  function normalizeWorkflowConfig(parsed) {
19
26
  if (!isRecord(parsed)) {
20
27
  return undefined;
@@ -51,6 +58,22 @@ function normalizeWorkflowConfig(parsed) {
51
58
  VALID_DESIGN_MODES.includes(parsed.designMode)) {
52
59
  next.designMode = parsed.designMode;
53
60
  }
61
+ if (isRecord(parsed.dispatchCeiling)) {
62
+ const dispatchCeiling = {};
63
+ if (typeof parsed.dispatchCeiling.codex === 'string' &&
64
+ VALID_CODEX_DISPATCH_CEILINGS.includes(parsed.dispatchCeiling.codex)) {
65
+ dispatchCeiling.codex = parsed.dispatchCeiling
66
+ .codex;
67
+ }
68
+ if (typeof parsed.dispatchCeiling.claude === 'string' &&
69
+ VALID_CLAUDE_DISPATCH_CEILINGS.includes(parsed.dispatchCeiling.claude)) {
70
+ dispatchCeiling.claude = parsed.dispatchCeiling
71
+ .claude;
72
+ }
73
+ if (Object.keys(dispatchCeiling).length > 0) {
74
+ next.dispatchCeiling = dispatchCeiling;
75
+ }
76
+ }
54
77
  return Object.keys(next).length > 0 ? next : undefined;
55
78
  }
56
79
  const DEFAULT_OAT_CONFIG = { version: 1 };
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAoED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAgFzB"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,OAAO,GACP,MAAM,GACN,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,kCAAkC;IACjD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAwED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,CAAC,kCAAkC,CAAM,GAC1D,OAAO,CAAC,cAAc,CAAC,CAgFzB"}
@@ -53,6 +53,10 @@ const DEFAULT_WORKFLOW_CONFIG = {
53
53
  autoReviewAtHillCheckpoints: null,
54
54
  autoNarrowReReviewScope: null,
55
55
  designMode: null,
56
+ dispatchCeiling: {
57
+ codex: null,
58
+ claude: null,
59
+ },
56
60
  },
57
61
  };
58
62
  const ENV_OVERRIDE_MAP = {
@@ -1 +1 @@
1
- {"version":3,"file":"sync-extension.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/codec/sync-extension.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQpD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC3E,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,4BAA4B,EAAE,CAAC;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AA6MD,wBAAsB,gCAAgC,CACpD,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,cAAc,EAAE,EAClC,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAqH7B;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,yBAAyB,CAAC,CA6BpC;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAE1E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,CAaA;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,kBAAkB,GACvB,uBAAuB,EAAE,CAQ3B"}
1
+ {"version":3,"file":"sync-extension.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/codec/sync-extension.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAQpD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC3E,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,4BAA4B,EAAE,CAAC;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAyND,wBAAsB,gCAAgC,CACpD,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,cAAc,EAAE,EAClC,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAqH7B;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,yBAAyB,CAAC,CA6BpC;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAE1E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,CAaA;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,kBAAkB,GACvB,uBAAuB,EAAE,CAQ3B"}
@@ -7,7 +7,11 @@ import TOML from '@iarna/toml';
7
7
  import { mergeCodexConfig } from './config-merge.js';
8
8
  import { exportCanonicalAgentToCodexRole } from './export-to-codex.js';
9
9
  import { isOatManagedCodexRoleFile } from './shared.js';
10
- const PHASE_IMPLEMENTER_EFFORT_VARIANTS = ['low', 'medium', 'high'];
10
+ const CODEX_EFFORT_VARIANTS = ['low', 'medium', 'high', 'xhigh'];
11
+ const CODEX_EFFORT_VARIANT_BASE_ROLES = new Set([
12
+ 'oat-phase-implementer',
13
+ 'oat-reviewer',
14
+ ]);
11
15
  function hashContent(content) {
12
16
  return createHash('sha256').update(content).digest('hex');
13
17
  }
@@ -43,25 +47,29 @@ function codexEffortVariantContent(baseContent, baseRoleName, variantRoleName, e
43
47
  .replace(`# oat-role: ${baseRoleName}`, `# oat-role: ${variantRoleName}`)
44
48
  .replace('developer_instructions =', `model_reasoning_effort = "${effort}"\ndeveloper_instructions =`);
45
49
  }
46
- function codexEffortVariantDescription(effort) {
50
+ function codexEffortVariantDescription(baseRoleName, effort) {
51
+ const roleLabel = baseRoleName === 'oat-reviewer' ? 'reviewer' : 'phase implementer';
47
52
  if (effort === 'low') {
48
- return 'OAT phase implementer pinned to low reasoning effort for narrow mechanical implementation or fix phases.';
53
+ return `OAT ${roleLabel} pinned to low reasoning effort for narrow mechanical implementation, fix, or review phases.`;
49
54
  }
50
55
  if (effort === 'medium') {
51
- return 'OAT phase implementer pinned to medium reasoning effort for normal multi-file implementation or fix phases.';
56
+ return `OAT ${roleLabel} pinned to medium reasoning effort for normal multi-file implementation, fix, or review phases.`;
52
57
  }
53
- return 'OAT phase implementer pinned to high reasoning effort for broad, subtle, or higher-risk implementation or fix phases.';
58
+ if (effort === 'high') {
59
+ return `OAT ${roleLabel} pinned to high reasoning effort for broad, subtle, or higher-risk implementation, fix, or review phases.`;
60
+ }
61
+ return `OAT ${roleLabel} pinned to xhigh reasoning effort for the highest configured Codex dispatch ceiling.`;
54
62
  }
55
63
  function codexEffortVariantsFromBase(exported) {
56
- if (exported.roleName !== 'oat-phase-implementer') {
64
+ if (!CODEX_EFFORT_VARIANT_BASE_ROLES.has(exported.roleName)) {
57
65
  return [];
58
66
  }
59
- return PHASE_IMPLEMENTER_EFFORT_VARIANTS.map((effort) => {
67
+ return CODEX_EFFORT_VARIANTS.map((effort) => {
60
68
  const variantRoleName = `${exported.roleName}-${effort}`;
61
69
  const configFile = `agents/${variantRoleName}.toml`;
62
70
  return {
63
71
  roleName: variantRoleName,
64
- description: codexEffortVariantDescription(effort),
72
+ description: codexEffortVariantDescription(exported.roleName, effort),
65
73
  configFile,
66
74
  rolePath: join(dirname(exported.rolePath), `${variantRoleName}.toml`),
67
75
  content: codexEffortVariantContent(exported.content, exported.roleName, variantRoleName, effort),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "private": false,
5
5
  "description": "Open Agent Toolkit CLI",
6
6
  "homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
@@ -33,7 +33,7 @@
33
33
  "ora": "^9.0.0",
34
34
  "yaml": "2.8.2",
35
35
  "zod": "^3.25.76",
36
- "@open-agent-toolkit/control-plane": "0.1.7"
36
+ "@open-agent-toolkit/control-plane": "0.1.8"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^22.10.0",