@open-agent-toolkit/cli 0.1.42 → 0.1.45

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 (60) hide show
  1. package/assets/agents/oat-phase-implementer.md +11 -7
  2. package/assets/agents/oat-reviewer.md +6 -4
  3. package/assets/config/dispatch-matrix-recommendation.json +23 -0
  4. package/assets/docs/cli-utilities/configuration.md +95 -40
  5. package/assets/docs/cli-utilities/workflow-gates.md +79 -16
  6. package/assets/docs/contributing/code.md +10 -4
  7. package/assets/docs/contributing/hooks-and-safety.md +23 -0
  8. package/assets/docs/reference/oat-directory-structure.md +26 -24
  9. package/assets/docs/workflows/projects/dispatch-ceiling.md +193 -80
  10. package/assets/docs/workflows/projects/implementation-execution.md +68 -45
  11. package/assets/docs/workflows/projects/index.md +2 -2
  12. package/assets/docs/workflows/projects/lifecycle.md +17 -2
  13. package/assets/public-package-versions.json +4 -4
  14. package/assets/skills/oat-project-implement/SKILL.md +232 -100
  15. package/assets/skills/oat-project-plan/SKILL.md +80 -30
  16. package/assets/skills/oat-project-plan-writing/SKILL.md +10 -10
  17. package/assets/skills/oat-project-quick-start/SKILL.md +80 -30
  18. package/assets/templates/plan.md +4 -4
  19. package/assets/templates/state.md +12 -3
  20. package/dist/commands/config/index.d.ts +6 -0
  21. package/dist/commands/config/index.d.ts.map +1 -1
  22. package/dist/commands/config/index.js +432 -11
  23. package/dist/commands/doctor/index.d.ts +6 -1
  24. package/dist/commands/doctor/index.d.ts.map +1 -1
  25. package/dist/commands/doctor/index.js +138 -4
  26. package/dist/commands/gate/index.d.ts +39 -2
  27. package/dist/commands/gate/index.d.ts.map +1 -1
  28. package/dist/commands/gate/index.js +343 -30
  29. package/dist/commands/internal/cursor-current-target.d.ts +37 -0
  30. package/dist/commands/internal/cursor-current-target.d.ts.map +1 -0
  31. package/dist/commands/internal/cursor-current-target.js +228 -0
  32. package/dist/commands/internal/index.d.ts.map +1 -1
  33. package/dist/commands/internal/index.js +2 -0
  34. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  35. package/dist/commands/project/dispatch-ceiling/index.js +646 -56
  36. package/dist/config/dispatch-ceiling-preset.d.ts +37 -1
  37. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  38. package/dist/config/dispatch-ceiling-preset.js +20 -0
  39. package/dist/config/oat-config.d.ts +25 -6
  40. package/dist/config/oat-config.d.ts.map +1 -1
  41. package/dist/config/oat-config.js +123 -11
  42. package/dist/config/resolve.d.ts.map +1 -1
  43. package/dist/config/resolve.js +16 -0
  44. package/dist/manifest/manifest.types.d.ts +12 -12
  45. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  46. package/dist/providers/ceiling/registry.js +22 -1
  47. package/dist/providers/codex/codec/sync-extension.js +1 -1
  48. package/dist/providers/identity/availability.d.ts +22 -0
  49. package/dist/providers/identity/availability.d.ts.map +1 -0
  50. package/dist/providers/identity/availability.js +119 -0
  51. package/dist/providers/identity/family.d.ts +13 -0
  52. package/dist/providers/identity/family.d.ts.map +1 -0
  53. package/dist/providers/identity/family.js +32 -0
  54. package/dist/providers/identity/provenance.d.ts +21 -0
  55. package/dist/providers/identity/provenance.d.ts.map +1 -0
  56. package/dist/providers/identity/provenance.js +65 -0
  57. package/dist/providers/identity/stamp.d.ts +35 -0
  58. package/dist/providers/identity/stamp.d.ts.map +1 -0
  59. package/dist/providers/identity/stamp.js +171 -0
  60. package/package.json +2 -2
@@ -7,7 +7,7 @@ import { createPjmDisabledCheck, runPjmDoctorChecks, } from '../pjm/doctor.js';
7
7
  import { getSkillVersion } from '../shared/frontmatter.js';
8
8
  import { withScopeOption } from '../shared/scope-option.js';
9
9
  import { readGlobalOptions, resolveConcreteScopes, } from '../shared/shared.utils.js';
10
- import { readOatConfig } from '../../config/oat-config.js';
10
+ import { readOatConfig, readOatLocalConfig, readUserConfig, } from '../../config/oat-config.js';
11
11
  import { resolveAssetsRoot } from '../../fs/assets.js';
12
12
  import { resolveProjectRoot, resolveScopeRoot } from '../../fs/paths.js';
13
13
  import TOML from '@iarna/toml';
@@ -17,6 +17,7 @@ import { codexAdapter } from '../../providers/codex/index.js';
17
17
  import { copilotAdapter } from '../../providers/copilot/index.js';
18
18
  import { cursorAdapter } from '../../providers/cursor/index.js';
19
19
  import { geminiAdapter } from '../../providers/gemini/index.js';
20
+ import { validateMatrixCell, } from '../../providers/identity/availability.js';
20
21
  import { formatDoctorResults } from '../../ui/output.js';
21
22
  import { Command } from 'commander';
22
23
  async function pathExistsDefault(path) {
@@ -129,13 +130,137 @@ function createDependencies() {
129
130
  readFile: async (path) => readFile(path, 'utf8'),
130
131
  resolveAssetsRoot,
131
132
  readOatConfig,
133
+ readOatLocalConfig,
134
+ readUserConfig,
135
+ validateMatrixCell,
136
+ processEnv: process.env,
132
137
  runPjmDoctorChecks,
133
138
  // Default binding remains self-contained, but still honors the caller-
134
139
  // provided pathExists dependency from runChecksForScope when available.
135
140
  checkSkillVersions: (scopeRoot, assetsRoot, pathExists = pathExistsDefault) => checkSkillVersionsDefault(scopeRoot, assetsRoot, pathExists),
136
141
  };
137
142
  }
138
- async function runChecksForScope(scope, scopeRoot, dependencies) {
143
+ function isRouteTarget(entry) {
144
+ return typeof entry === 'object' && entry !== null && !Array.isArray(entry);
145
+ }
146
+ function addDispatchMatrixCellRefs(refs, layer, provider, path, cell) {
147
+ if (typeof cell === 'string') {
148
+ refs.push({ layer, provider, value: cell, path });
149
+ return;
150
+ }
151
+ for (const [index, entry] of cell.entries()) {
152
+ const entryPath = `${path}[${index}]`;
153
+ if (typeof entry === 'string') {
154
+ refs.push({ layer, provider, value: entry, path: entryPath });
155
+ continue;
156
+ }
157
+ if (!isRouteTarget(entry)) {
158
+ continue;
159
+ }
160
+ if (entry.model) {
161
+ refs.push({
162
+ layer,
163
+ provider,
164
+ value: entry.model,
165
+ path: `${entryPath}.model`,
166
+ });
167
+ }
168
+ if (entry.effort) {
169
+ refs.push({
170
+ layer,
171
+ provider,
172
+ value: entry.effort,
173
+ path: `${entryPath}.effort`,
174
+ });
175
+ }
176
+ }
177
+ }
178
+ function collectDispatchMatrixCellRefs(layers) {
179
+ const refs = [];
180
+ for (const { layer, config } of layers) {
181
+ const providers = config.workflow?.dispatchCeiling?.providers ?? {};
182
+ for (const [provider, providerValue] of Object.entries(providers)) {
183
+ const providerPath = `workflow.dispatchCeiling.providers.${provider}`;
184
+ if (typeof providerValue === 'string') {
185
+ refs.push({
186
+ layer,
187
+ provider,
188
+ value: providerValue,
189
+ path: providerPath,
190
+ });
191
+ continue;
192
+ }
193
+ const tierMap = providerValue;
194
+ for (const [tier, cell] of Object.entries(tierMap)) {
195
+ if (cell === undefined) {
196
+ continue;
197
+ }
198
+ addDispatchMatrixCellRefs(refs, layer, provider, `${providerPath}.${tier}`, cell);
199
+ }
200
+ }
201
+ }
202
+ return refs;
203
+ }
204
+ function formatDispatchMatrixIssueList(issues) {
205
+ return issues
206
+ .map((issue) => `${issue.path}=${issue.value} (${issue.layer} config)`)
207
+ .join(', ');
208
+ }
209
+ async function createDispatchMatrixDoctorCheck(scopeRoot, layers, dependencies) {
210
+ const refs = collectDispatchMatrixCellRefs(layers);
211
+ if (refs.length === 0) {
212
+ return {
213
+ name: 'project:dispatch_matrix',
214
+ description: 'Dispatch matrix cell availability',
215
+ status: 'pass',
216
+ message: 'No configured dispatch matrix cells found in user, shared, or local config layers.',
217
+ };
218
+ }
219
+ const issues = [];
220
+ for (const ref of refs) {
221
+ let availability;
222
+ try {
223
+ availability = await dependencies.validateMatrixCell(ref.provider, ref.value, {
224
+ cwd: scopeRoot,
225
+ env: dependencies.processEnv,
226
+ });
227
+ }
228
+ catch {
229
+ availability = 'unvalidated';
230
+ }
231
+ if (availability !== 'valid') {
232
+ issues.push({ ...ref, availability });
233
+ }
234
+ }
235
+ if (issues.length === 0) {
236
+ return {
237
+ name: 'project:dispatch_matrix',
238
+ description: 'Dispatch matrix cell availability',
239
+ status: 'pass',
240
+ message: `All configured dispatch matrix cells are available: ${formatDispatchMatrixIssueList(refs)}.`,
241
+ };
242
+ }
243
+ const unknown = issues.filter((issue) => issue.availability === 'unknown-value');
244
+ const unvalidated = issues.filter((issue) => issue.availability === 'unvalidated');
245
+ const messageParts = [];
246
+ if (unknown.length > 0) {
247
+ messageParts.push(`Unknown dispatch matrix cells: ${formatDispatchMatrixIssueList(unknown)}`);
248
+ }
249
+ if (unvalidated.length > 0) {
250
+ messageParts.push(`Unvalidated dispatch matrix cells: ${formatDispatchMatrixIssueList(unvalidated)}`);
251
+ }
252
+ const hasUnknown = unknown.length > 0;
253
+ return {
254
+ name: 'project:dispatch_matrix',
255
+ description: 'Dispatch matrix cell availability',
256
+ status: hasUnknown ? 'warn' : 'pass',
257
+ message: messageParts.join('. '),
258
+ fix: hasUnknown
259
+ ? 'Run `oat config set workflow.dispatchCeiling.providers.<provider> <value>` with an available value, or refresh provider assets with `oat sync --scope project`.'
260
+ : undefined,
261
+ };
262
+ }
263
+ async function runChecksForScope(scope, scopeRoot, userConfigDir, dependencies) {
139
264
  const checks = [];
140
265
  const skillsPath = join(scopeRoot, '.agents', 'skills');
141
266
  const agentsPath = join(scopeRoot, '.agents', 'agents');
@@ -345,7 +470,16 @@ async function runChecksForScope(scope, scopeRoot, dependencies) {
345
470
  }
346
471
  }
347
472
  const repoReferenceRoot = join(scopeRoot, '.oat', 'repo');
348
- const config = await dependencies.readOatConfig(scopeRoot);
473
+ const [userConfig, config, localConfig] = await Promise.all([
474
+ dependencies.readUserConfig(userConfigDir),
475
+ dependencies.readOatConfig(scopeRoot),
476
+ dependencies.readOatLocalConfig(scopeRoot),
477
+ ]);
478
+ checks.push(await createDispatchMatrixDoctorCheck(scopeRoot, [
479
+ { layer: 'user', config: userConfig },
480
+ { layer: 'shared', config },
481
+ { layer: 'local', config: localConfig },
482
+ ], dependencies));
349
483
  const projectManagementEnabled = config.tools?.['project-management'] === true;
350
484
  if (projectManagementEnabled) {
351
485
  checks.push(...(await dependencies.runPjmDoctorChecks(repoReferenceRoot, {
@@ -362,7 +496,7 @@ async function runDoctorCommand(context, dependencies) {
362
496
  const checks = [];
363
497
  for (const scope of resolveConcreteScopes(context.scope)) {
364
498
  const scopeRoot = await dependencies.resolveScopeRoot(scope, context);
365
- const scopeChecks = await runChecksForScope(scope, scopeRoot, dependencies);
499
+ const scopeChecks = await runChecksForScope(scope, scopeRoot, join(context.home, '.oat'), dependencies);
366
500
  checks.push(...scopeChecks);
367
501
  }
368
502
  if (context.json) {
@@ -1,6 +1,8 @@
1
1
  import { type CommandContext, type GlobalOptions } from '../../app/command-context.js';
2
2
  import { type ExecTarget, type OatConfig, type OatLocalConfig, type UserConfig } from '../../config/oat-config.js';
3
3
  import { type ResolvedConfig } from '../../config/resolve.js';
4
+ import { type ModelFamily } from '../../providers/identity/family.js';
5
+ import { type IdentityConfidence, type IdentityProvenance } from '../../providers/identity/provenance.js';
4
6
  import { Command } from 'commander';
5
7
  interface GateCommandDependencies {
6
8
  buildCommandContext: (options: GlobalOptions) => CommandContext;
@@ -20,16 +22,51 @@ interface ProcessRunOptions {
20
22
  env: NodeJS.ProcessEnv;
21
23
  purpose: 'host-detection' | 'availability' | 'execute';
22
24
  stdio: 'ignore' | 'inherit';
25
+ timeoutMs: number;
23
26
  }
24
27
  interface ProcessRunResult {
25
28
  exitCode: number;
29
+ timedOut?: boolean;
26
30
  }
27
- type CrossProviderAvoid = 'same-runtime' | 'none';
31
+ type CrossProviderAvoid = 'same-family' | 'same-runtime' | 'none';
32
+ type GateDiversityAchieved = 'different-family' | 'degraded-to-different-slug' | 'same-family - no diverse target available' | 'unknown-producer';
28
33
  export interface SelectedExecTarget {
29
34
  id: string;
30
35
  target: ExecTarget;
36
+ model?: string;
37
+ family: ModelFamily;
38
+ diversity?: GateDiversityMetadata;
39
+ noDiverseFamilyFallback?: boolean;
31
40
  }
32
- export declare function selectExecTarget(registry: Readonly<Record<string, ExecTarget>>, currentRuntime: string, avoid: CrossProviderAvoid): SelectedExecTarget | null;
41
+ interface GateProducerIdentity {
42
+ value: string;
43
+ provenance: IdentityProvenance;
44
+ confidence: IdentityConfidence;
45
+ family: ModelFamily;
46
+ avoidFamilies: ModelFamily[];
47
+ diversityClaimable: boolean;
48
+ source: 'flag' | 'stamp' | 'unknown';
49
+ }
50
+ interface GateDiversityMetadata {
51
+ avoid: CrossProviderAvoid;
52
+ achieved: GateDiversityAchieved;
53
+ producer: {
54
+ value: string;
55
+ provenance: IdentityProvenance;
56
+ confidence: IdentityConfidence;
57
+ family: ModelFamily;
58
+ source: GateProducerIdentity['source'];
59
+ avoidFamilies: ModelFamily[];
60
+ };
61
+ reviewer: {
62
+ target: string;
63
+ runtime: string;
64
+ family: ModelFamily;
65
+ model?: string;
66
+ };
67
+ warning?: string;
68
+ }
69
+ export declare function selectExecTarget(registry: Readonly<Record<string, ExecTarget>>, currentRuntime: string, avoid: CrossProviderAvoid, producerIdentity?: GateProducerIdentity): SelectedExecTarget | null;
33
70
  export declare function createGateCommand(overrides?: Partial<GateCommandDependencies>): Command;
34
71
  export {};
35
72
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EAQL,KAAK,UAAU,EAIf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,UAAU,uBAAuB;IAC/B,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,UAAU,EAAE,CACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,iBAAiB,KACvB,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AA0CD,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,OAAO,EAAE,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAC;IACvD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC7B;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,kBAAkB,GAAG,cAAc,GAAG,MAAM,CAAC;AAMlD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;CACpB;AAyZD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAC9C,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,kBAAkB,GACxB,kBAAkB,GAAG,IAAI,CAE3B;AAu7BD,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC/C,OAAO,CAwKT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/index.ts"],"names":[],"mappings":"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"}