@open-agent-toolkit/cli 0.1.73 → 0.1.74

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 (90) hide show
  1. package/assets/config/dispatch-matrix-recommendation.json +13 -17
  2. package/assets/docs/cli-utilities/configuration.md +35 -60
  3. package/assets/docs/cli-utilities/workflow-gates.md +38 -2
  4. package/assets/docs/provider-sync/providers.md +15 -17
  5. package/assets/docs/workflows/projects/artifacts.md +1 -1
  6. package/assets/docs/workflows/projects/dispatch-ceiling.md +29 -33
  7. package/assets/docs/workflows/projects/implementation-execution.md +7 -4
  8. package/assets/docs/workflows/projects/lifecycle.md +4 -3
  9. package/assets/public-package-versions.json +4 -4
  10. package/assets/skills/oat-dispatch-subagents/SKILL.md +1 -1
  11. package/assets/skills/oat-dispatch-subagents/references/provider-cursor.md +27 -15
  12. package/assets/skills/oat-project-autonomous/SKILL.md +1 -1
  13. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +1 -1
  14. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +1 -1
  15. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +17 -15
  16. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +15 -9
  17. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +1 -1
  18. package/assets/skills/oat-project-implement/references/phase-execution.md +11 -5
  19. package/assets/skills/oat-project-import-plan/SKILL.md +30 -8
  20. package/assets/skills/oat-project-plan/SKILL.md +30 -8
  21. package/assets/skills/oat-project-plan-writing/SKILL.md +12 -9
  22. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +1 -1
  23. package/assets/skills/oat-project-quick-start/SKILL.md +30 -8
  24. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +1 -1
  25. package/assets/skills/oat-project-review-provide/SKILL.md +19 -11
  26. package/assets/skills/oat-project-review-provide-remote/SKILL.md +27 -4
  27. package/dist/commands/doctor/index.d.ts +2 -1
  28. package/dist/commands/doctor/index.d.ts.map +1 -1
  29. package/dist/commands/doctor/index.js +37 -1
  30. package/dist/commands/gate/index.d.ts +1 -1
  31. package/dist/commands/gate/index.d.ts.map +1 -1
  32. package/dist/commands/gate/index.js +35 -3
  33. package/dist/commands/init/index.d.ts +1 -1
  34. package/dist/commands/init/index.d.ts.map +1 -1
  35. package/dist/commands/init/index.js +40 -8
  36. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  37. package/dist/commands/project/dispatch-ceiling/index.js +17 -9
  38. package/dist/commands/shared/codex-strays.d.ts +9 -0
  39. package/dist/commands/shared/codex-strays.d.ts.map +1 -1
  40. package/dist/commands/shared/codex-strays.js +4 -0
  41. package/dist/commands/status/index.d.ts +7 -1
  42. package/dist/commands/status/index.d.ts.map +1 -1
  43. package/dist/commands/status/index.js +53 -17
  44. package/dist/commands/sync/apply.d.ts.map +1 -1
  45. package/dist/commands/sync/apply.js +50 -24
  46. package/dist/commands/sync/dry-run.d.ts.map +1 -1
  47. package/dist/commands/sync/dry-run.js +31 -18
  48. package/dist/commands/sync/index.d.ts.map +1 -1
  49. package/dist/commands/sync/index.js +34 -25
  50. package/dist/commands/sync/sync.types.d.ts +26 -11
  51. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  52. package/dist/commands/sync/sync.utils.d.ts.map +1 -1
  53. package/dist/commands/sync/sync.utils.js +3 -2
  54. package/dist/engine/index.d.ts +1 -1
  55. package/dist/engine/index.d.ts.map +1 -1
  56. package/dist/engine/index.js +1 -1
  57. package/dist/engine/scanner.d.ts +3 -1
  58. package/dist/engine/scanner.d.ts.map +1 -1
  59. package/dist/engine/scanner.js +4 -2
  60. package/dist/providers/ceiling/registry.d.ts +2 -0
  61. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  62. package/dist/providers/ceiling/registry.js +20 -4
  63. package/dist/providers/codex/codec/sync-extension.d.ts +11 -10
  64. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  65. package/dist/providers/codex/codec/sync-extension.js +42 -14
  66. package/dist/providers/cursor/codec/catalog.d.ts +18 -0
  67. package/dist/providers/cursor/codec/catalog.d.ts.map +1 -0
  68. package/dist/providers/cursor/codec/catalog.js +39 -0
  69. package/dist/providers/cursor/codec/materialize.d.ts +24 -0
  70. package/dist/providers/cursor/codec/materialize.d.ts.map +1 -0
  71. package/dist/providers/cursor/codec/materialize.js +166 -0
  72. package/dist/providers/cursor/codec/shared.d.ts +14 -0
  73. package/dist/providers/cursor/codec/shared.d.ts.map +1 -0
  74. package/dist/providers/cursor/codec/shared.js +76 -0
  75. package/dist/providers/cursor/codec/sync-extension.d.ts +37 -0
  76. package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -0
  77. package/dist/providers/cursor/codec/sync-extension.js +393 -0
  78. package/dist/providers/cursor/index.d.ts +3 -0
  79. package/dist/providers/cursor/index.d.ts.map +1 -1
  80. package/dist/providers/cursor/index.js +3 -0
  81. package/dist/providers/identity/availability.d.ts +7 -0
  82. package/dist/providers/identity/availability.d.ts.map +1 -1
  83. package/dist/providers/identity/availability.js +23 -0
  84. package/dist/providers/shared/index.d.ts +2 -0
  85. package/dist/providers/shared/index.d.ts.map +1 -1
  86. package/dist/providers/shared/index.js +1 -0
  87. package/dist/providers/shared/materialization-extension.d.ts +44 -0
  88. package/dist/providers/shared/materialization-extension.d.ts.map +1 -0
  89. package/dist/providers/shared/materialization-extension.js +26 -0
  90. package/package.json +2 -2
@@ -5,17 +5,18 @@ import { withScopeOption } from '../shared/scope-option.js';
5
5
  import { selectManyWithAbort, } from '../shared/shared.prompts.js';
6
6
  import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.utils.js';
7
7
  import { DEFAULT_SYNC_CONFIG, loadSyncConfig, saveSyncConfig, } from '../../config/index.js';
8
- import { computeSyncPlan, executeSyncPlan, scanBundledManagedCodexAgents, scanCanonical, } from '../../engine/index.js';
8
+ import { computeSyncPlan, executeSyncPlan, scanBundledManagedAgents, scanCanonical, } from '../../engine/index.js';
9
9
  import { CliError } from '../../errors/index.js';
10
10
  import { resolveProjectRoot, resolveScopeRoot } from '../../fs/paths.js';
11
11
  import { loadManifest } from '../../manifest/index.js';
12
12
  import { claudeAdapter } from '../../providers/claude/index.js';
13
13
  import { codexAdapter } from '../../providers/codex/index.js';
14
- import { applyCodexProjectExtensionPlan, computeCodexProjectExtensionPlan, toCodexExtensionOperations, } from '../../providers/codex/codec/sync-extension.js';
14
+ import { codexMaterializationExtension } from '../../providers/codex/codec/sync-extension.js';
15
15
  import { copilotAdapter } from '../../providers/copilot/index.js';
16
16
  import { cursorAdapter } from '../../providers/cursor/index.js';
17
+ import { cursorMaterializationExtension } from '../../providers/cursor/codec/sync-extension.js';
17
18
  import { geminiAdapter } from '../../providers/gemini/index.js';
18
- import { getConfigAwareAdapters, } from '../../providers/shared/index.js';
19
+ import { getConfigAwareAdapters, toMaterializationOperations, } from '../../providers/shared/index.js';
19
20
  import { formatSyncPlan } from '../../ui/output.js';
20
21
  import { Command, Option } from 'commander';
21
22
  import { runSyncApply } from './apply.js';
@@ -36,7 +37,7 @@ function defaultDependencies() {
36
37
  },
37
38
  saveSyncConfig,
38
39
  scanCanonical,
39
- scanBundledManagedCodexAgents,
40
+ scanBundledManagedAgents,
40
41
  getAdapters() {
41
42
  return [
42
43
  claudeAdapter,
@@ -50,9 +51,15 @@ function defaultDependencies() {
50
51
  selectProvidersWithAbort: selectManyWithAbort,
51
52
  computeSyncPlan,
52
53
  executeSyncPlan,
53
- computeCodexProjectExtensionPlan,
54
- toCodexExtensionOperations,
55
- applyCodexProjectExtensionPlan,
54
+ getMaterializationExtensions() {
55
+ return [
56
+ codexMaterializationExtension,
57
+ cursorMaterializationExtension,
58
+ ];
59
+ },
60
+ applyMaterializationExtensionPlan(extension, scopeRoot, plan) {
61
+ return extension.applyPlan(scopeRoot, plan);
62
+ },
56
63
  formatSyncPlan,
57
64
  };
58
65
  }
@@ -166,23 +173,25 @@ async function computePlans(context, dependencies, allowedCanonicalPaths) {
166
173
  scopeRoot,
167
174
  allowedCanonicalPaths,
168
175
  });
169
- let codexExtensionPlan;
170
- let codexExtension;
171
176
  const activeAdapterNames = resolved.activeAdapters.map((adapter) => adapter.name);
172
- if (activeAdapterNames.includes('codex')) {
173
- const codexCanonical = scope === 'user'
174
- ? [
175
- ...canonical,
176
- ...(await dependencies.scanBundledManagedCodexAgents()),
177
- ]
178
- : canonical;
179
- codexExtensionPlan = await dependencies.computeCodexProjectExtensionPlan(scopeRoot, codexCanonical, allowedCanonicalPaths, { userConfigDir: join(context.home, '.oat') });
180
- codexExtension = {
181
- operations: dependencies.toCodexExtensionOperations(codexExtensionPlan),
182
- managedRoles: codexExtensionPlan.managedRoles,
183
- aggregateConfigHash: codexExtensionPlan.aggregateConfigHash,
184
- };
185
- }
177
+ const enabledExtensions = dependencies
178
+ .getMaterializationExtensions()
179
+ .filter((extension) => activeAdapterNames.includes(extension.provider));
180
+ const extensionCanonical = scope === 'user' && enabledExtensions.length > 0
181
+ ? [...canonical, ...(await dependencies.scanBundledManagedAgents())]
182
+ : canonical;
183
+ const materializationExtensionPlans = await Promise.all(enabledExtensions.map((extension) => extension.computePlan({
184
+ scopeRoot,
185
+ canonicalEntries: extensionCanonical,
186
+ allowedCanonicalPaths,
187
+ options: { userConfigDir: join(context.home, '.oat') },
188
+ })));
189
+ const materializationExtensions = materializationExtensionPlans.map((extensionPlan) => ({
190
+ provider: extensionPlan.provider,
191
+ operations: toMaterializationOperations(extensionPlan),
192
+ managedEntries: extensionPlan.managedEntries,
193
+ aggregateHash: extensionPlan.aggregateHash,
194
+ }));
186
195
  scopePlans.push({
187
196
  scope,
188
197
  scopeRoot,
@@ -192,8 +201,8 @@ async function computePlans(context, dependencies, allowedCanonicalPaths) {
192
201
  activeAdapterNames,
193
202
  plan,
194
203
  providerMismatches: resolved.mismatches,
195
- codexExtensionPlan,
196
- codexExtension,
204
+ materializationExtensionPlans,
205
+ materializationExtensions,
197
206
  });
198
207
  }
199
208
  return scopePlans;
@@ -3,8 +3,7 @@ import type { MultiSelectChoice, PromptContext } from '../shared/shared.prompts.
3
3
  import type { SyncConfig } from '../../config/index.js';
4
4
  import type { CanonicalEntry, SyncPlan, SyncResult } from '../../engine/index.js';
5
5
  import type { Manifest } from '../../manifest/index.js';
6
- import type { CodexExtensionApplyResult, CodexExtensionPlan } from '../../providers/codex/codec/sync-extension.js';
7
- import type { ConfigAwareAdaptersResult, ProviderAdapter } from '../../providers/shared/index.js';
6
+ import type { ConfigAwareAdaptersResult, MaterializationApplyResult, MaterializationExtension, MaterializationOperation, MaterializationPlan, ProviderAdapter } from '../../providers/shared/index.js';
8
7
  import type { ConcreteScope, Scope } from '../../shared/types.js';
9
8
  export interface SyncProviderMismatches {
10
9
  detectedUnset: string[];
@@ -19,8 +18,8 @@ export interface ScopeSyncPlan {
19
18
  canonical?: CanonicalEntry[];
20
19
  activeAdapterNames?: string[];
21
20
  providerMismatches?: SyncProviderMismatches;
22
- codexExtensionPlan?: CodexExtensionPlan;
23
- codexExtension?: CodexExtensionSummary;
21
+ materializationExtensionPlans: MaterializationPlan[];
22
+ materializationExtensions: MaterializationExtensionSummary[];
24
23
  }
25
24
  export interface SyncSummary {
26
25
  plannedOperations: number;
@@ -34,6 +33,8 @@ export interface SyncJsonPayload {
34
33
  plans: SyncPlan[];
35
34
  summary: SyncSummary;
36
35
  providerMismatches?: SyncProviderMismatches[];
36
+ materializationExtensions?: MaterializationExtensionSummary[];
37
+ /** Retained for compatibility with existing Codex JSON consumers. */
37
38
  codexExtensions?: CodexExtensionSummary[];
38
39
  }
39
40
  export type CodexExtensionAction = 'create' | 'update' | 'remove' | 'skip';
@@ -53,6 +54,24 @@ export interface CodexExtensionSummary {
53
54
  failed?: number;
54
55
  skipped?: number;
55
56
  }
57
+ export interface MaterializationExtensionSummary {
58
+ provider: string;
59
+ operations: MaterializationOperation[];
60
+ managedEntries: string[];
61
+ aggregateHash: string;
62
+ applied?: number;
63
+ failed?: number;
64
+ skipped?: number;
65
+ }
66
+ export type SyncMaterializationExtension = MaterializationExtension<MaterializationPlan, {
67
+ scopeRoot: string;
68
+ canonicalEntries: CanonicalEntry[];
69
+ allowedCanonicalPaths?: string[];
70
+ options: {
71
+ userConfigDir?: string;
72
+ env?: NodeJS.ProcessEnv;
73
+ };
74
+ }>;
56
75
  export interface SyncCommandDependencies {
57
76
  buildCommandContext: (options: GlobalOptions) => CommandContext;
58
77
  resolveScopeRoot: (scope: ConcreteScope, context: CommandContext) => Promise<string>;
@@ -60,7 +79,7 @@ export interface SyncCommandDependencies {
60
79
  loadSyncConfig: (configPath: string) => Promise<SyncConfig>;
61
80
  saveSyncConfig: (configPath: string, config: SyncConfig) => Promise<SyncConfig>;
62
81
  scanCanonical: (scopeRoot: string, scope: ConcreteScope) => Promise<CanonicalEntry[]>;
63
- scanBundledManagedCodexAgents: () => Promise<CanonicalEntry[]>;
82
+ scanBundledManagedAgents: () => Promise<CanonicalEntry[]>;
64
83
  getAdapters: () => ProviderAdapter[];
65
84
  getConfigAwareAdapters: (adapters: ProviderAdapter[], scopeRoot: string, config: SyncConfig) => Promise<ConfigAwareAdaptersResult>;
66
85
  selectProvidersWithAbort: <T extends string>(message: string, choices: MultiSelectChoice<T>[], ctx: PromptContext) => Promise<T[] | null>;
@@ -74,12 +93,8 @@ export interface SyncCommandDependencies {
74
93
  allowedCanonicalPaths?: string[];
75
94
  }) => Promise<SyncPlan>;
76
95
  executeSyncPlan: (plan: SyncPlan, manifest: Manifest, manifestPath: string) => Promise<SyncResult>;
77
- computeCodexProjectExtensionPlan: (scopeRoot: string, canonicalEntries: CanonicalEntry[], allowedCanonicalPaths?: string[], options?: {
78
- userConfigDir?: string;
79
- env?: NodeJS.ProcessEnv;
80
- }) => Promise<CodexExtensionPlan>;
81
- toCodexExtensionOperations: (plan: CodexExtensionPlan) => CodexExtensionOperation[];
82
- applyCodexProjectExtensionPlan: (scopeRoot: string, plan: CodexExtensionPlan) => Promise<CodexExtensionApplyResult>;
96
+ getMaterializationExtensions: () => SyncMaterializationExtension[];
97
+ applyMaterializationExtensionPlan: (extension: SyncMaterializationExtension, scopeRoot: string, plan: MaterializationPlan) => Promise<MaterializationApplyResult>;
83
98
  formatSyncPlan: (plan: SyncPlan, applied: boolean) => string;
84
99
  }
85
100
  //# sourceMappingURL=sync.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.types.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.types.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.utils.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAc1E"}
1
+ {"version":3,"file":"sync.utils.d.ts","sourceRoot":"","sources":["../../../src/commands/sync/sync.utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAgB1E"}
@@ -1,8 +1,9 @@
1
1
  export function countPlannedOperations(scopePlans) {
2
2
  return scopePlans.reduce((total, scopePlan) => {
3
- const codexOperations = scopePlan.codexExtension?.operations.filter((entry) => entry.action !== 'skip').length ?? 0;
3
+ const extensionOperations = scopePlan.materializationExtensions.reduce((count, extension) => count +
4
+ extension.operations.filter((entry) => entry.action !== 'skip').length, 0);
4
5
  return (total +
5
6
  [...scopePlan.plan.entries, ...scopePlan.plan.removals].filter((entry) => entry.operation !== 'skip').length +
6
- codexOperations);
7
+ extensionOperations);
7
8
  }, 0);
8
9
  }
@@ -5,5 +5,5 @@ export { configureLocalHooksPath, getHookInstallInfo, HOOK_DRIFT_WARNING, HOOK_M
5
5
  export type { HookInstallInfo, HookStatus } from './hook.js';
6
6
  export { hasMarker, insertMarker, OAT_DIRECTORY_SENTINEL, OAT_MARKER_PREFIX, writeDirectorySentinel, } from './markers.js';
7
7
  export type { CanonicalEntry } from './scanner.js';
8
- export { scanBundledManagedCodexAgents, scanCanonical } from './scanner.js';
8
+ export { scanBundledManagedAgents, scanBundledManagedCodexAgents, scanCanonical, } from './scanner.js';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EACL,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,6BAA6B,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,EACL,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,aAAa,GACd,MAAM,WAAW,CAAC"}
@@ -3,4 +3,4 @@ export { SYNC_OPERATION_TYPES, } from './engine.types.js';
3
3
  export { executeSyncPlan } from './execute-plan.js';
4
4
  export { configureLocalHooksPath, getHookInstallInfo, HOOK_DRIFT_WARNING, HOOK_MARKER_END, HOOK_MARKER_START, HOOK_STRAY_INFO, installHook, isHookInstalled, REPO_GITHOOKS_PATH, runHookCheck, uninstallHook, } from './hook.js';
5
5
  export { hasMarker, insertMarker, OAT_DIRECTORY_SENTINEL, OAT_MARKER_PREFIX, writeDirectorySentinel, } from './markers.js';
6
- export { scanBundledManagedCodexAgents, scanCanonical } from './scanner.js';
6
+ export { scanBundledManagedAgents, scanBundledManagedCodexAgents, scanCanonical, } from './scanner.js';
@@ -6,7 +6,9 @@ export interface CanonicalEntry {
6
6
  canonicalPath: string;
7
7
  isFile: boolean;
8
8
  }
9
- export declare function scanBundledManagedCodexAgents(): Promise<CanonicalEntry[]>;
9
+ export declare function scanBundledManagedAgents(): Promise<CanonicalEntry[]>;
10
+ /** @deprecated Use scanBundledManagedAgents for provider-neutral materialization. */
11
+ export declare const scanBundledManagedCodexAgents: typeof scanBundledManagedAgents;
10
12
  export declare function scanCanonical(basePath: string, scope: ConcreteScope): Promise<CanonicalEntry[]>;
11
13
  export {};
12
14
  //# sourceMappingURL=scanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/engine/scanner.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,KAAK,EACX,MAAM,eAAe,CAAC;AAEvB,KAAK,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AA0DD,wBAAsB,6BAA6B,IAAI,OAAO,CAC5D,cAAc,EAAE,CACjB,CAsBA;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC,CA2B3B"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/engine/scanner.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,KAAK,EACX,MAAM,eAAe,CAAC;AAEvB,KAAK,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AA0DD,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAsB1E;AAED,qFAAqF;AACrF,eAAO,MAAM,6BAA6B,iCAA2B,CAAC;AAEtE,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC,CA2B3B"}
@@ -43,13 +43,13 @@ async function readEntries(dirPath) {
43
43
  throw error;
44
44
  }
45
45
  }
46
- export async function scanBundledManagedCodexAgents() {
46
+ export async function scanBundledManagedAgents() {
47
47
  const agentsDir = join(await resolveAssetsRoot(), 'agents');
48
48
  const entries = await readEntries(agentsDir);
49
49
  const available = new Set(entries.filter((entry) => entry.isFile).map((entry) => entry.name));
50
50
  const missing = USER_SCOPE_MANAGED_AGENT_FILES.filter((name) => !available.has(name));
51
51
  if (missing.length > 0) {
52
- throw new CliError(`Bundled managed Codex role definitions are unavailable: ${missing.join(', ')}. Reinstall or rebuild OAT before running user sync.`);
52
+ throw new CliError(`Bundled managed role definitions are unavailable: ${missing.join(', ')}. Reinstall or rebuild OAT before running user sync.`);
53
53
  }
54
54
  return USER_SCOPE_MANAGED_AGENT_FILES.map((name) => ({
55
55
  name,
@@ -58,6 +58,8 @@ export async function scanBundledManagedCodexAgents() {
58
58
  isFile: true,
59
59
  }));
60
60
  }
61
+ /** @deprecated Use scanBundledManagedAgents for provider-neutral materialization. */
62
+ export const scanBundledManagedCodexAgents = scanBundledManagedAgents;
61
63
  export async function scanCanonical(basePath, scope) {
62
64
  const scopeRoot = resolve(basePath);
63
65
  const entries = [];
@@ -13,6 +13,7 @@
13
13
  * (no variant files). Every other provider is advisory by default.
14
14
  */
15
15
  export type EnforcementMechanism = 'pinned-variant' | 'model-arg' | 'none';
16
+ export type ProviderSelectionAxis = 'model' | 'model-effort' | 'tier' | 'none';
16
17
  export type CeilingRole = 'implementer' | 'reviewer';
17
18
  export interface CeilingCompileContext {
18
19
  /** The orchestrator's own tier, used to detect above-orchestrator upgrades. */
@@ -33,6 +34,7 @@ export interface ProviderCeilingAdapter {
33
34
  supportsCeiling: boolean;
34
35
  validValues: string[];
35
36
  mechanism: EnforcementMechanism;
37
+ selectionAxis: ProviderSelectionAxis;
36
38
  /**
37
39
  * Compile a ceiling value into dispatch args for the given role, or `null`
38
40
  * when the value is invalid or the provider is advisory/unsupported.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/providers/ceiling/registry.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,WAAW,GAAG,MAAM,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC;CACV;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GACnB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB,IAAI,CAAC;AAKT,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,oBAAoB,CAAC;IAChC;;;OAGG;IACH,qBAAqB,CACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,qBAAqB,GACzB,mBAAmB,CAAC;IACvB;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC;CACtE;AAMD,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAK9C,CAAC;AA4GF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAE1E"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/providers/ceiling/registry.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,WAAW,GAAG,MAAM,CAAC;AAC3E,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC;AAE/E,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC;CACV;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GACnB;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACjB,IAAI,CAAC;AAKT,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,oBAAoB,CAAC;IAChC,aAAa,EAAE,qBAAqB,CAAC;IACrC;;;OAGG;IACH,qBAAqB,CACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,qBAAqB,GACzB,mBAAmB,CAAC;IACvB;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC;CACtE;AAMD,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAK9C,CAAC;AA6HF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAE1E"}
@@ -1,5 +1,7 @@
1
1
  import { VALID_CLAUDE_DISPATCH_CEILINGS, VALID_CODEX_DISPATCH_CEILINGS, } from '../../config/oat-config.js';
2
2
  import { buildCodexMaterializedTargetRoleName } from '../codex/codec/shared.js';
3
+ import { findCursorModelPinMapping } from '../cursor/codec/catalog.js';
4
+ import { buildCursorMaterializedRoleName } from '../cursor/codec/shared.js';
3
5
  const DIRECT_DISPATCH_ROLE_PATTERN = /^oat-(?:phase-implementer|reviewer)(?:-|$)/;
4
6
  export function isDirectDispatchRoleName(value) {
5
7
  return DIRECT_DISPATCH_ROLE_PATTERN.test(value.trim());
@@ -19,6 +21,7 @@ const codexAdapter = {
19
21
  supportsCeiling: true,
20
22
  validValues: [...VALID_CODEX_DISPATCH_CEILINGS],
21
23
  mechanism: 'pinned-variant',
24
+ selectionAxis: 'model-effort',
22
25
  compileToDispatchArgs(value, role, ctx) {
23
26
  if (!VALID_CODEX_DISPATCH_CEILINGS.includes(value)) {
24
27
  return null;
@@ -60,6 +63,7 @@ const claudeAdapter = {
60
63
  supportsCeiling: true,
61
64
  validValues: [...VALID_CLAUDE_DISPATCH_CEILINGS],
62
65
  mechanism: 'model-arg',
66
+ selectionAxis: 'tier',
63
67
  compileToDispatchArgs(value) {
64
68
  if (isDirectDispatchRoleName(value) ||
65
69
  !VALID_CLAUDE_DISPATCH_CEILINGS.includes(value)) {
@@ -76,10 +80,21 @@ const cursorAdapter = {
76
80
  provider: 'cursor',
77
81
  supportsCeiling: true,
78
82
  validValues: [],
79
- mechanism: 'model-arg',
80
- compileToDispatchArgs(value) {
81
- const model = value.trim();
82
- return model && !isDirectDispatchRoleName(model) ? { model } : null;
83
+ mechanism: 'pinned-variant',
84
+ selectionAxis: 'model',
85
+ compileToDispatchArgs(value, role, ctx) {
86
+ const model = ctx.target?.model ?? value.trim();
87
+ if (!model ||
88
+ isDirectDispatchRoleName(model) ||
89
+ !findCursorModelPinMapping(model)) {
90
+ return null;
91
+ }
92
+ return {
93
+ variant: buildCursorMaterializedRoleName({
94
+ agentName: role === 'reviewer' ? CODEX_REVIEWER_ROLE : CODEX_IMPLEMENTER_ROLE,
95
+ ladderModelId: model,
96
+ }),
97
+ };
83
98
  },
84
99
  // Cursor model slugs do not share a total order, so upgrade verification is
85
100
  // not meaningful here; availability is checked by the identity oracle layer.
@@ -93,6 +108,7 @@ function advisoryAdapter(provider) {
93
108
  supportsCeiling: false,
94
109
  validValues: [],
95
110
  mechanism: 'none',
111
+ selectionAxis: 'none',
96
112
  compileToDispatchArgs() {
97
113
  return null;
98
114
  },
@@ -1,5 +1,6 @@
1
1
  import type { CanonicalEntry } from '../../../engine/index.js';
2
- export type CodexExtensionAction = 'create' | 'update' | 'remove' | 'skip';
2
+ import { type MaterializationAction, type MaterializationApplyResult, type MaterializationContext, type MaterializationExtension, type MaterializationPlan, type MaterializationWriteOperation } from '../../shared/index.js';
3
+ export type CodexExtensionAction = MaterializationAction;
3
4
  export type CodexExtensionTarget = 'role' | 'config';
4
5
  export interface CodexExtensionOperation {
5
6
  action: CodexExtensionAction;
@@ -8,20 +9,20 @@ export interface CodexExtensionOperation {
8
9
  reason: string;
9
10
  roleName?: string;
10
11
  }
11
- export interface CodexExtensionWriteOperation extends CodexExtensionOperation {
12
- content?: string;
12
+ export interface CodexExtensionWriteOperation extends MaterializationWriteOperation<'codex', CodexExtensionTarget> {
13
+ roleName?: string;
13
14
  }
14
- export interface CodexExtensionPlan {
15
+ export interface CodexExtensionPlan extends MaterializationPlan<'codex', CodexExtensionTarget, CodexExtensionPlanMetadata> {
15
16
  operations: CodexExtensionWriteOperation[];
16
17
  managedRoles: string[];
17
18
  aggregateConfigHash: string;
18
19
  }
19
- export interface CodexExtensionApplyResult {
20
- applied: number;
21
- failed: number;
22
- skipped: number;
20
+ export interface CodexExtensionPlanMetadata {
21
+ managedRoles: string[];
22
+ aggregateConfigHash: string;
23
23
  }
24
- interface CodexMaterializationTargetOptions {
24
+ export type CodexExtensionApplyResult = MaterializationApplyResult;
25
+ export interface CodexMaterializationTargetOptions {
25
26
  userConfigDir?: string;
26
27
  projectPath?: string | null;
27
28
  env?: NodeJS.ProcessEnv;
@@ -34,5 +35,5 @@ export declare function summarizeCodexExtension(plan: CodexExtensionPlan): {
34
35
  skipped: number;
35
36
  };
36
37
  export declare function toCodexExtensionOperations(plan: CodexExtensionPlan): CodexExtensionOperation[];
37
- export {};
38
+ export declare const codexMaterializationExtension: MaterializationExtension<CodexExtensionPlan, MaterializationContext<CodexMaterializationTargetOptions>>;
38
39
  //# sourceMappingURL=sync-extension.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-extension.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/codec/sync-extension.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAyBpD,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;AAgBD,UAAU,iCAAiC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAqiBD,wBAAsB,gCAAgC,CACpD,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,cAAc,EAAE,EAClC,qBAAqB,CAAC,EAAE,MAAM,EAAE,EAChC,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,kBAAkB,CAAC,CAqJ7B;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":"AAkBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EACnC,MAAM,mBAAmB,CAAC;AAqB3B,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AACzD,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,6BAA6B,CACjF,OAAO,EACP,oBAAoB,CACrB;IACC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB,CAC7D,OAAO,EACP,oBAAoB,EACpB,0BAA0B,CAC3B;IACC,UAAU,EAAE,4BAA4B,EAAE,CAAC;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,yBAAyB,GAAG,0BAA0B,CAAC;AAgBnE,MAAM,WAAW,iCAAiC;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAqiBD,wBAAsB,gCAAgC,CACpD,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,cAAc,EAAE,EAClC,qBAAqB,CAAC,EAAE,MAAM,EAAE,EAChC,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,kBAAkB,CAAC,CAkL7B;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,CAEA;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,kBAAkB,GACvB,uBAAuB,EAAE,CAQ3B;AAED,eAAO,MAAM,6BAA6B,EAAE,wBAAwB,CAClE,kBAAkB,EAClB,sBAAsB,CAAC,iCAAiC,CAAC,CAY1D,CAAC"}
@@ -8,6 +8,7 @@ import { CliError } from '../../../errors/index.js';
8
8
  import { ensureDir, fileExists } from '../../../fs/io.js';
9
9
  import { validateRealPathWithinScope } from '../../../fs/paths.js';
10
10
  import TOML from '@iarna/toml';
11
+ import { hasMaterializationChanges, summarizeMaterializationPlan, } from '../../shared/index.js';
11
12
  import YAML from 'yaml';
12
13
  import { SUPPORTED_CODEX_BASE_ROLES, SUPPORTED_CODEX_ROLE_TARGETS, } from './catalog.js';
13
14
  import { mergeCodexConfig, readCodexMaxDepth, } from './config-merge.js';
@@ -404,10 +405,18 @@ export async function computeCodexProjectExtensionPlan(scopeRoot, canonicalEntri
404
405
  const existingConfigPath = configPath(scopeRoot);
405
406
  const existingConfigContent = await readOptionalFile(existingConfigPath);
406
407
  if (isPartialSync && desiredRoles.length === 0) {
408
+ const aggregateConfigHash = hashContent(existingConfigContent ?? '');
407
409
  return {
410
+ provider: 'codex',
408
411
  operations: [],
412
+ managedEntries: [],
413
+ aggregateHash: aggregateConfigHash,
414
+ metadata: {
415
+ managedRoles: [],
416
+ aggregateConfigHash,
417
+ },
409
418
  managedRoles: [],
410
- aggregateConfigHash: hashContent(existingConfigContent ?? ''),
419
+ aggregateConfigHash,
411
420
  };
412
421
  }
413
422
  const inheritedMaxDepth = await readInheritedCodexMaxDepth(scopeRoot, options);
@@ -419,10 +428,12 @@ export async function computeCodexProjectExtensionPlan(scopeRoot, canonicalEntri
419
428
  const existingRoleContent = await readOptionalFile(role.rolePath);
420
429
  if (existingRoleContent === null) {
421
430
  operations.push({
431
+ provider: 'codex',
422
432
  action: 'create',
423
433
  target: 'role',
424
434
  path: toRelativePath(scopeRoot, role.rolePath),
425
435
  reason: 'managed role file missing',
436
+ entryName: role.roleName,
426
437
  roleName: role.roleName,
427
438
  content: role.content,
428
439
  });
@@ -430,20 +441,24 @@ export async function computeCodexProjectExtensionPlan(scopeRoot, canonicalEntri
430
441
  }
431
442
  if (existingRoleContent.trimEnd() !== role.content.trimEnd()) {
432
443
  operations.push({
444
+ provider: 'codex',
433
445
  action: 'update',
434
446
  target: 'role',
435
447
  path: toRelativePath(scopeRoot, role.rolePath),
436
448
  reason: 'managed role file differs from canonical export',
449
+ entryName: role.roleName,
437
450
  roleName: role.roleName,
438
451
  content: role.content,
439
452
  });
440
453
  continue;
441
454
  }
442
455
  operations.push({
456
+ provider: 'codex',
443
457
  action: 'skip',
444
458
  target: 'role',
445
459
  path: toRelativePath(scopeRoot, role.rolePath),
446
460
  reason: 'managed role file already in sync',
461
+ entryName: role.roleName,
447
462
  roleName: role.roleName,
448
463
  });
449
464
  }
@@ -453,10 +468,12 @@ export async function computeCodexProjectExtensionPlan(scopeRoot, canonicalEntri
453
468
  if (staleRoleContent &&
454
469
  isOatManagedCodexRoleFile(staleRoleContent, staleRole)) {
455
470
  operations.push({
471
+ provider: 'codex',
456
472
  action: 'remove',
457
473
  target: 'role',
458
474
  path: toRelativePath(scopeRoot, staleRolePath),
459
475
  reason: 'stale managed role removed',
476
+ entryName: staleRole,
460
477
  roleName: staleRole,
461
478
  });
462
479
  }
@@ -468,6 +485,7 @@ export async function computeCodexProjectExtensionPlan(scopeRoot, canonicalEntri
468
485
  inheritedMaxDepth,
469
486
  });
470
487
  operations.push({
488
+ provider: 'codex',
471
489
  action: existingConfigContent === null
472
490
  ? 'create'
473
491
  : configMerge.changed
@@ -482,10 +500,22 @@ export async function computeCodexProjectExtensionPlan(scopeRoot, canonicalEntri
482
500
  : 'codex config already in sync',
483
501
  content: configMerge.mergedContent,
484
502
  });
503
+ const managedRoles = [
504
+ ...desiredRoles.map((role) => role.roleName),
505
+ ...staleRoles,
506
+ ];
507
+ const aggregateConfigHash = hashContent(configMerge.mergedContent);
485
508
  return {
509
+ provider: 'codex',
486
510
  operations,
487
- managedRoles: [...desiredRoles.map((role) => role.roleName), ...staleRoles],
488
- aggregateConfigHash: hashContent(configMerge.mergedContent),
511
+ managedEntries: managedRoles,
512
+ aggregateHash: aggregateConfigHash,
513
+ metadata: {
514
+ managedRoles,
515
+ aggregateConfigHash,
516
+ },
517
+ managedRoles,
518
+ aggregateConfigHash,
489
519
  };
490
520
  }
491
521
  export async function applyCodexProjectExtensionPlan(scopeRoot, plan) {
@@ -517,19 +547,10 @@ export async function applyCodexProjectExtensionPlan(scopeRoot, plan) {
517
547
  return result;
518
548
  }
519
549
  export function hasCodexExtensionChanges(plan) {
520
- return plan.operations.some((operation) => operation.action !== 'skip');
550
+ return hasMaterializationChanges(plan);
521
551
  }
522
552
  export function summarizeCodexExtension(plan) {
523
- let plannedOperations = 0;
524
- let skipped = 0;
525
- for (const operation of plan.operations) {
526
- if (operation.action === 'skip') {
527
- skipped += 1;
528
- continue;
529
- }
530
- plannedOperations += 1;
531
- }
532
- return { plannedOperations, skipped };
553
+ return summarizeMaterializationPlan(plan);
533
554
  }
534
555
  export function toCodexExtensionOperations(plan) {
535
556
  return plan.operations.map((operation) => ({
@@ -540,3 +561,10 @@ export function toCodexExtensionOperations(plan) {
540
561
  roleName: operation.roleName,
541
562
  }));
542
563
  }
564
+ export const codexMaterializationExtension = {
565
+ provider: 'codex',
566
+ computePlan(context) {
567
+ return computeCodexProjectExtensionPlan(context.scopeRoot, context.canonicalEntries, context.allowedCanonicalPaths, context.options);
568
+ },
569
+ applyPlan: applyCodexProjectExtensionPlan,
570
+ };
@@ -0,0 +1,18 @@
1
+ export type CursorPinSyntaxFamily = 'gpt-reasoning' | 'claude-effort' | 'composer-fast' | 'grok-effort-fast';
2
+ export interface CursorPinGateEvidence {
3
+ gate: 'g01';
4
+ probeName: string;
5
+ disposition: 'approved';
6
+ }
7
+ export interface CursorModelPinMapping {
8
+ ladderModelId: string;
9
+ frontmatterModel: string;
10
+ syntaxFamily: CursorPinSyntaxFamily;
11
+ gateEvidence: CursorPinGateEvidence;
12
+ catalogue: boolean;
13
+ }
14
+ export declare const CURSOR_MODEL_PIN_MAPPINGS: readonly [CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping];
15
+ export declare const SUPPORTED_CURSOR_ROLE_TARGETS: CursorModelPinMapping[];
16
+ export declare const SUPPORTED_CURSOR_BASE_ROLES: readonly ["oat-phase-implementer", "oat-reviewer"];
17
+ export declare function findCursorModelPinMapping(ladderModelId: string): CursorModelPinMapping | undefined;
18
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../../src/providers/cursor/codec/catalog.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,eAAe,GACf,eAAe,GACf,eAAe,GACf,kBAAkB,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,qBAAqB,CAAC;IACpC,YAAY,EAAE,qBAAqB,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;CACpB;AA0BD,eAAO,MAAM,yBAAyB,oWA2Ee,CAAC;AAEtD,eAAO,MAAM,6BAA6B,yBAEzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,oDAG9B,CAAC;AAEX,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,GACpB,qBAAqB,GAAG,SAAS,CAInC"}
@@ -0,0 +1,39 @@
1
+ function approvedMapping(ladderModelId, frontmatterModel, syntaxFamily, options = {}) {
2
+ return {
3
+ ladderModelId,
4
+ frontmatterModel,
5
+ syntaxFamily,
6
+ gateEvidence: {
7
+ gate: 'g01',
8
+ probeName: options.probeName ??
9
+ `oat-pin-probe-${ladderModelId.replaceAll('.', '-')}`,
10
+ disposition: 'approved',
11
+ },
12
+ catalogue: options.catalogue ?? true,
13
+ };
14
+ }
15
+ export const CURSOR_MODEL_PIN_MAPPINGS = [
16
+ approvedMapping('composer-2.5', 'composer-2.5[fast=true]', 'composer-fast'),
17
+ approvedMapping('composer-2.5-fast', 'composer-2.5[fast=true]', 'composer-fast', { catalogue: false }),
18
+ approvedMapping('claude-sonnet-5-high', 'claude-sonnet-5[effort=high]', 'claude-effort'),
19
+ approvedMapping('gpt-5.6-luna-high', 'gpt-5.6-luna[reasoning=high]', 'gpt-reasoning'),
20
+ approvedMapping('gpt-5.6-luna-xhigh', 'gpt-5.6-luna[reasoning=xhigh]', 'gpt-reasoning'),
21
+ approvedMapping('cursor-grok-4.5-high', 'grok-4.5[effort=high,fast=false]', 'grok-effort-fast'),
22
+ approvedMapping('cursor-grok-4.5-high-fast', 'grok-4.5[effort=high,fast=true]', 'grok-effort-fast', { catalogue: false }),
23
+ approvedMapping('gpt-5.6-terra-high', 'gpt-5.6-terra[reasoning=high]', 'gpt-reasoning'),
24
+ approvedMapping('gpt-5.6-sol-medium', 'gpt-5.6-sol[reasoning=medium]', 'gpt-reasoning'),
25
+ approvedMapping('gpt-5.6-sol-high', 'gpt-5.6-sol[reasoning=high]', 'gpt-reasoning'),
26
+ approvedMapping('claude-fable-5-thinking-high', 'claude-fable-5[effort=high]', 'claude-effort'),
27
+ approvedMapping('claude-fable-5-thinking-xhigh', 'claude-fable-5[effort=xhigh]', 'claude-effort'),
28
+ approvedMapping('claude-fable-5-xhigh', 'claude-fable-5[effort=xhigh]', 'claude-effort', { catalogue: false }),
29
+ approvedMapping('gpt-5.6-sol-xhigh', 'gpt-5.6-sol[reasoning=xhigh]', 'gpt-reasoning'),
30
+ approvedMapping('gpt-5.6-sol-max', 'gpt-5.6-sol[reasoning=max]', 'gpt-reasoning'),
31
+ ];
32
+ export const SUPPORTED_CURSOR_ROLE_TARGETS = CURSOR_MODEL_PIN_MAPPINGS.filter((mapping) => mapping.catalogue);
33
+ export const SUPPORTED_CURSOR_BASE_ROLES = [
34
+ 'oat-phase-implementer',
35
+ 'oat-reviewer',
36
+ ];
37
+ export function findCursorModelPinMapping(ladderModelId) {
38
+ return CURSOR_MODEL_PIN_MAPPINGS.find((mapping) => mapping.ladderModelId === ladderModelId);
39
+ }