@open-agent-toolkit/cli 0.1.45 → 0.1.48

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 (112) hide show
  1. package/assets/agents/oat-phase-implementer.md +202 -191
  2. package/assets/agents/oat-reviewer.md +12 -2
  3. package/assets/config/dispatch-matrix-recommendation.json +120 -13
  4. package/assets/docs/cli-utilities/config-and-local-state.md +7 -0
  5. package/assets/docs/cli-utilities/configuration.md +183 -84
  6. package/assets/docs/cli-utilities/workflow-gates.md +161 -27
  7. package/assets/docs/contributing/skills.md +14 -8
  8. package/assets/docs/provider-sync/config.md +5 -1
  9. package/assets/docs/provider-sync/manifest-and-drift.md +6 -1
  10. package/assets/docs/provider-sync/providers.md +42 -5
  11. package/assets/docs/provider-sync/scope-and-surface.md +3 -2
  12. package/assets/docs/reference/cli-reference.md +3 -1
  13. package/assets/docs/reference/oat-directory-structure.md +27 -26
  14. package/assets/docs/workflows/projects/artifacts.md +31 -1
  15. package/assets/docs/workflows/projects/dispatch-ceiling.md +235 -174
  16. package/assets/docs/workflows/projects/implementation-execution.md +283 -253
  17. package/assets/docs/workflows/projects/lifecycle.md +26 -5
  18. package/assets/docs/workflows/projects/reviews.md +27 -2
  19. package/assets/migration/pjm-restructure.md +1 -1
  20. package/assets/public-package-versions.json +4 -4
  21. package/assets/skills/oat-project-implement/SKILL.md +347 -178
  22. package/assets/skills/oat-project-import-plan/SKILL.md +173 -16
  23. package/assets/skills/oat-project-next/SKILL.md +2 -2
  24. package/assets/skills/oat-project-plan/SKILL.md +122 -92
  25. package/assets/skills/oat-project-plan-writing/SKILL.md +246 -15
  26. package/assets/skills/oat-project-quick-start/SKILL.md +156 -94
  27. package/assets/skills/oat-project-review-provide/SKILL.md +94 -22
  28. package/dist/commands/config/index.d.ts +2 -2
  29. package/dist/commands/config/index.d.ts.map +1 -1
  30. package/dist/commands/config/index.js +129 -53
  31. package/dist/commands/doctor/index.d.ts +2 -2
  32. package/dist/commands/doctor/index.d.ts.map +1 -1
  33. package/dist/commands/doctor/index.js +102 -31
  34. package/dist/commands/gate/index.d.ts +7 -1
  35. package/dist/commands/gate/index.d.ts.map +1 -1
  36. package/dist/commands/gate/index.js +544 -67
  37. package/dist/commands/gate/review-verdict.d.ts +16 -0
  38. package/dist/commands/gate/review-verdict.d.ts.map +1 -1
  39. package/dist/commands/gate/review-verdict.js +72 -9
  40. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  41. package/dist/commands/project/dispatch-ceiling/index.js +586 -23
  42. package/dist/commands/providers/codex/index.d.ts +4 -0
  43. package/dist/commands/providers/codex/index.d.ts.map +1 -0
  44. package/dist/commands/providers/codex/index.js +7 -0
  45. package/dist/commands/providers/codex/materialize.d.ts +5 -0
  46. package/dist/commands/providers/codex/materialize.d.ts.map +1 -0
  47. package/dist/commands/providers/codex/materialize.js +157 -0
  48. package/dist/commands/providers/index.d.ts +2 -2
  49. package/dist/commands/providers/index.d.ts.map +1 -1
  50. package/dist/commands/providers/index.js +4 -2
  51. package/dist/commands/providers/providers.types.d.ts +23 -0
  52. package/dist/commands/providers/providers.types.d.ts.map +1 -1
  53. package/dist/commands/shared/codex-strays.d.ts.map +1 -1
  54. package/dist/commands/shared/codex-strays.js +11 -1
  55. package/dist/commands/shared/frontmatter.d.ts +4 -0
  56. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  57. package/dist/commands/shared/frontmatter.js +23 -0
  58. package/dist/commands/status/index.d.ts +5 -1
  59. package/dist/commands/status/index.d.ts.map +1 -1
  60. package/dist/commands/status/index.js +10 -4
  61. package/dist/commands/sync/index.d.ts.map +1 -1
  62. package/dist/commands/sync/index.js +10 -3
  63. package/dist/commands/sync/sync.types.d.ts +5 -1
  64. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  65. package/dist/config/dispatch-ceiling-preset.d.ts +4 -0
  66. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  67. package/dist/config/dispatch-ceiling-preset.js +3 -0
  68. package/dist/config/dispatch-policy-options.d.ts +20 -0
  69. package/dist/config/dispatch-policy-options.d.ts.map +1 -0
  70. package/dist/config/dispatch-policy-options.js +96 -0
  71. package/dist/config/oat-config.d.ts +25 -2
  72. package/dist/config/oat-config.d.ts.map +1 -1
  73. package/dist/config/oat-config.js +154 -24
  74. package/dist/config/resolve.d.ts +8 -0
  75. package/dist/config/resolve.d.ts.map +1 -1
  76. package/dist/config/resolve.js +66 -2
  77. package/dist/engine/index.d.ts +1 -1
  78. package/dist/engine/index.d.ts.map +1 -1
  79. package/dist/engine/index.js +1 -1
  80. package/dist/engine/scanner.d.ts +1 -0
  81. package/dist/engine/scanner.d.ts.map +1 -1
  82. package/dist/engine/scanner.js +17 -1
  83. package/dist/fs/paths.d.ts +4 -0
  84. package/dist/fs/paths.d.ts.map +1 -1
  85. package/dist/fs/paths.js +18 -1
  86. package/dist/providers/ceiling/registry.d.ts +8 -5
  87. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  88. package/dist/providers/ceiling/registry.js +25 -7
  89. package/dist/providers/codex/codec/catalog.d.ts +14 -0
  90. package/dist/providers/codex/codec/catalog.d.ts.map +1 -0
  91. package/dist/providers/codex/codec/catalog.js +21 -0
  92. package/dist/providers/codex/codec/config-merge.d.ts +6 -0
  93. package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
  94. package/dist/providers/codex/codec/config-merge.js +7 -0
  95. package/dist/providers/codex/codec/materialize.d.ts +16 -0
  96. package/dist/providers/codex/codec/materialize.d.ts.map +1 -0
  97. package/dist/providers/codex/codec/materialize.js +58 -0
  98. package/dist/providers/codex/codec/shared.d.ts +20 -0
  99. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  100. package/dist/providers/codex/codec/shared.js +107 -6
  101. package/dist/providers/codex/codec/sync-extension.d.ts +7 -1
  102. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  103. package/dist/providers/codex/codec/sync-extension.js +299 -52
  104. package/dist/providers/identity/availability.d.ts +24 -1
  105. package/dist/providers/identity/availability.d.ts.map +1 -1
  106. package/dist/providers/identity/availability.js +253 -19
  107. package/dist/providers/identity/stamp.d.ts.map +1 -1
  108. package/dist/providers/identity/stamp.js +4 -0
  109. package/dist/shared/types.d.ts +1 -0
  110. package/dist/shared/types.d.ts.map +1 -1
  111. package/dist/shared/types.js +4 -0
  112. package/package.json +2 -2
@@ -1,9 +1,11 @@
1
1
  import { execFile } from 'node:child_process';
2
- import { join } from 'node:path';
3
2
  import { promisify } from 'node:util';
4
- import { VALID_CLAUDE_DISPATCH_CEILINGS, VALID_CODEX_DISPATCH_CEILINGS, } from '../../config/oat-config.js';
3
+ import { VALID_CLAUDE_DISPATCH_CEILINGS } from '../../config/oat-config.js';
5
4
  import { fileExists } from '../../fs/io.js';
6
5
  const execFileAsync = promisify(execFile);
6
+ export function normalizeMatrixCellAvailability(result) {
7
+ return typeof result === 'string' ? { availability: result } : result;
8
+ }
7
9
  async function runCursorAgent(args, options) {
8
10
  try {
9
11
  const { stdout, stderr } = await execFileAsync('cursor-agent', args, {
@@ -27,9 +29,33 @@ async function runCursorAgent(args, options) {
27
29
  };
28
30
  }
29
31
  }
32
+ async function runCodex(args, options) {
33
+ try {
34
+ const { stdout, stderr } = await execFileAsync('codex', args, {
35
+ cwd: options.cwd,
36
+ env: options.env,
37
+ maxBuffer: 16 * 1024 * 1024,
38
+ timeout: 10_000,
39
+ });
40
+ return {
41
+ ok: true,
42
+ stdout: String(stdout),
43
+ stderr: String(stderr),
44
+ };
45
+ }
46
+ catch (error) {
47
+ const failure = error;
48
+ return {
49
+ ok: false,
50
+ stdout: String(failure.stdout ?? ''),
51
+ stderr: String(failure.stderr ?? failure.message),
52
+ };
53
+ }
54
+ }
30
55
  const DEFAULT_DEPENDENCIES = {
31
56
  pathExists: fileExists,
32
57
  runCursorAgent,
58
+ runCodex,
33
59
  env: process.env,
34
60
  };
35
61
  function apiKeyArgs(env) {
@@ -61,43 +87,245 @@ function availabilityFromCursorCatalog(value, stdout) {
61
87
  ? 'valid'
62
88
  : 'unknown-value';
63
89
  }
64
- async function validateCodexCell(value, cwd, dependencies) {
65
- if (!VALID_CODEX_DISPATCH_CEILINGS.includes(value)) {
66
- return 'unknown-value';
90
+ const CURSOR_SUBAGENT_PROBE_SENTINEL = 'OAT_CURSOR_SUBAGENT_MODEL_VALID';
91
+ function hasCursorSubagentProbeSentinel(stdout) {
92
+ return stdout
93
+ .split(/\r?\n/)
94
+ .some((line) => line.trim() === CURSOR_SUBAGENT_PROBE_SENTINEL);
95
+ }
96
+ function cursorSubagentProbePrompt(model) {
97
+ return [
98
+ 'Validate whether a Cursor subagent Task can be launched with a specific model.',
99
+ `Use the Task tool once with model "${model}" and ask the subagent to reply exactly: ${CURSOR_SUBAGENT_PROBE_SENTINEL}.`,
100
+ 'After the subagent returns, print only its exact reply.',
101
+ ].join('\n');
102
+ }
103
+ function cursorSubagentProbeArgs(model, env) {
104
+ return [
105
+ ...apiKeyArgs(env),
106
+ '-p',
107
+ cursorSubagentProbePrompt(model),
108
+ '--output-format=text',
109
+ '--force',
110
+ ];
111
+ }
112
+ function unique(values) {
113
+ return [...new Set(values)];
114
+ }
115
+ function extractModelSlugs(value) {
116
+ const matches = value.match(/\b[a-z][a-z0-9]*(?:[-.][a-z0-9]+)+\b/gi) ?? [];
117
+ return unique(matches
118
+ .map((match) => match.replace(/[),.;:]+$/g, ''))
119
+ .filter((match) => /\d/.test(match)));
120
+ }
121
+ function parseCursorAllowedSubagentModels(output) {
122
+ const sections = [];
123
+ const patterns = [
124
+ /\ballowed\s+(?:subagent\s+)?models?\s*:?\s*([^\n]+)/gi,
125
+ /\bsupported\s+(?:subagent\s+)?models?\s*:?\s*([^\n]+)/gi,
126
+ /\bvalid\s+(?:subagent\s+)?models?\s*:?\s*([^\n]+)/gi,
127
+ /\bone\s+of\s*:?\s*([^\n]+)/gi,
128
+ ];
129
+ for (const pattern of patterns) {
130
+ for (const match of output.matchAll(pattern)) {
131
+ if (match[1]) {
132
+ sections.push(match[1]);
133
+ }
134
+ }
135
+ }
136
+ return unique(sections.flatMap(extractModelSlugs));
137
+ }
138
+ function cursorAllowedModelsMessage(allowedValues) {
139
+ return `Allowed subagent models: ${allowedValues.join(', ')}.`;
140
+ }
141
+ function cursorRejectedMessage(allowedValues) {
142
+ return `Cursor rejected this model for subagent Task dispatch. ${cursorAllowedModelsMessage(allowedValues)}`;
143
+ }
144
+ function cursorCatalogContextMessage(value, availability) {
145
+ if (availability === 'valid') {
146
+ return `Cursor's broad model catalog lists '${value}', but subagent Task dispatch could not be validated.`;
147
+ }
148
+ if (availability === 'unknown-value') {
149
+ return `Cursor's broad model catalog does not list '${value}'.`;
150
+ }
151
+ return undefined;
152
+ }
153
+ function isRecord(value) {
154
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
155
+ }
156
+ function stringFromUnknown(value) {
157
+ return typeof value === 'string' && value.trim().length > 0
158
+ ? value.trim()
159
+ : null;
160
+ }
161
+ function extractCodexEffort(value) {
162
+ if (typeof value === 'string') {
163
+ return stringFromUnknown(value);
164
+ }
165
+ if (!isRecord(value)) {
166
+ return null;
167
+ }
168
+ return (stringFromUnknown(value.effort) ??
169
+ stringFromUnknown(value.id) ??
170
+ stringFromUnknown(value.name));
171
+ }
172
+ function extractCodexEfforts(model) {
173
+ const efforts = [];
174
+ for (const key of [
175
+ 'supported_reasoning_levels',
176
+ 'supported_reasoning_efforts',
177
+ 'supported_efforts',
178
+ ]) {
179
+ const value = model[key];
180
+ if (!Array.isArray(value)) {
181
+ continue;
182
+ }
183
+ efforts.push(...value
184
+ .map(extractCodexEffort)
185
+ .filter((effort) => effort !== null));
67
186
  }
187
+ const defaultEffort = stringFromUnknown(model.default_reasoning_level);
188
+ if (defaultEffort) {
189
+ efforts.push(defaultEffort);
190
+ }
191
+ return unique(efforts);
192
+ }
193
+ function parseCodexCatalog(stdout) {
194
+ let parsed;
68
195
  try {
69
- const implementerExists = await dependencies.pathExists(join(cwd, '.codex', 'agents', `oat-phase-implementer-${value}.toml`));
70
- const reviewerExists = await dependencies.pathExists(join(cwd, '.codex', 'agents', `oat-reviewer-${value}.toml`));
71
- return implementerExists && reviewerExists ? 'valid' : 'unknown-value';
196
+ parsed = JSON.parse(stdout);
72
197
  }
73
198
  catch {
74
- return 'unvalidated';
199
+ return null;
200
+ }
201
+ if (!isRecord(parsed) || !Array.isArray(parsed.models)) {
202
+ return null;
203
+ }
204
+ const entries = [];
205
+ for (const model of parsed.models) {
206
+ if (!isRecord(model)) {
207
+ continue;
208
+ }
209
+ const slug = stringFromUnknown(model.slug);
210
+ if (!slug) {
211
+ continue;
212
+ }
213
+ const supportedEfforts = extractCodexEfforts(model);
214
+ entries.push({
215
+ slug,
216
+ supportedEfforts: supportedEfforts.length > 0 ? supportedEfforts : null,
217
+ });
218
+ }
219
+ return entries.length > 0 ? entries : null;
220
+ }
221
+ function codexTargetFromValue(value, target) {
222
+ const targetModel = stringFromUnknown(target?.model);
223
+ const targetEffort = stringFromUnknown(target?.effort);
224
+ if (targetModel && targetEffort) {
225
+ return { model: targetModel, effort: targetEffort };
226
+ }
227
+ const [model, effort] = value.split('/');
228
+ return {
229
+ model: stringFromUnknown(model),
230
+ effort: stringFromUnknown(effort),
231
+ };
232
+ }
233
+ function codexUnsupportedEffortMessage(model, effort, supportedEfforts) {
234
+ return `Codex debug models lists '${model}', but effort '${effort}' is not supported. Supported Codex efforts: ${supportedEfforts.join(', ')}.`;
235
+ }
236
+ async function validateCodexCell(value, cwd, dependencies, target) {
237
+ const { model, effort } = codexTargetFromValue(value, target);
238
+ if (!model || !effort || value.trim().length === 0) {
239
+ return { availability: 'unknown-value' };
240
+ }
241
+ const result = await dependencies.runCodex(['debug', 'models'], {
242
+ cwd,
243
+ env: dependencies.env ?? process.env,
244
+ });
245
+ if (!result.ok) {
246
+ return { availability: 'unvalidated' };
247
+ }
248
+ const catalog = parseCodexCatalog(result.stdout);
249
+ if (!catalog) {
250
+ return { availability: 'unvalidated' };
251
+ }
252
+ const entry = catalog.find((modelEntry) => modelEntry.slug === model);
253
+ if (!entry) {
254
+ return {
255
+ availability: 'unknown-value',
256
+ message: `Codex debug models does not list '${model}'.`,
257
+ };
258
+ }
259
+ if (!entry.supportedEfforts) {
260
+ return {
261
+ availability: 'unvalidated',
262
+ message: `Codex debug models lists '${model}', but supported reasoning efforts could not be parsed.`,
263
+ };
75
264
  }
265
+ if (!entry.supportedEfforts.includes(effort)) {
266
+ return {
267
+ availability: 'unknown-value',
268
+ allowedValues: entry.supportedEfforts,
269
+ message: codexUnsupportedEffortMessage(model, effort, entry.supportedEfforts),
270
+ };
271
+ }
272
+ return { availability: 'valid' };
76
273
  }
77
- async function validateCursorCell(value, cwd, dependencies) {
274
+ export async function validateCursorSubagentModel(value, options) {
275
+ const dependencies = {
276
+ ...DEFAULT_DEPENDENCIES,
277
+ env: options.env ?? DEFAULT_DEPENDENCIES.env,
278
+ ...options.dependencies,
279
+ };
78
280
  const env = dependencies.env ?? process.env;
79
- const runOptions = { cwd, env };
281
+ const runOptions = { cwd: options.cwd, env };
282
+ const probeResult = await dependencies.runCursorAgent(cursorSubagentProbeArgs(value, env), runOptions);
283
+ const probeOutput = `${probeResult.stdout}\n${probeResult.stderr}`;
284
+ if (probeResult.ok && hasCursorSubagentProbeSentinel(probeResult.stdout)) {
285
+ return { availability: 'valid' };
286
+ }
287
+ const allowedValues = parseCursorAllowedSubagentModels(probeOutput);
288
+ if (allowedValues.length > 0) {
289
+ const availability = allowedValues.includes(value)
290
+ ? 'valid'
291
+ : 'unknown-value';
292
+ return {
293
+ availability,
294
+ allowedValues,
295
+ message: availability === 'valid'
296
+ ? cursorAllowedModelsMessage(allowedValues)
297
+ : cursorRejectedMessage(allowedValues),
298
+ };
299
+ }
80
300
  const modelsResult = await dependencies.runCursorAgent([...apiKeyArgs(env), 'models'], runOptions);
81
301
  if (modelsResult.ok) {
82
302
  const availability = availabilityFromCursorCatalog(value, modelsResult.stdout);
83
303
  if (availability !== null) {
84
- return availability;
304
+ return {
305
+ availability: availability === 'valid' ? 'unvalidated' : 'unknown-value',
306
+ message: cursorCatalogContextMessage(value, availability),
307
+ };
85
308
  }
86
309
  }
87
310
  const listResult = await dependencies.runCursorAgent([...apiKeyArgs(env), '--list-models'], runOptions);
88
311
  if (listResult.ok) {
89
312
  const availability = availabilityFromCursorCatalog(value, listResult.stdout);
90
313
  if (availability !== null) {
91
- return availability;
314
+ return {
315
+ availability: availability === 'valid' ? 'unvalidated' : 'unknown-value',
316
+ message: cursorCatalogContextMessage(value, availability),
317
+ };
92
318
  }
93
319
  }
94
- return 'unvalidated';
320
+ return { availability: 'unvalidated' };
95
321
  }
96
322
  export async function validateMatrixCell(provider, value, options) {
97
323
  const normalizedProvider = provider.trim().toLowerCase();
98
324
  const normalizedValue = value.trim();
99
325
  if (!normalizedProvider || !normalizedValue) {
100
- return 'unknown-value';
326
+ return options.detailed
327
+ ? { availability: 'unknown-value' }
328
+ : 'unknown-value';
101
329
  }
102
330
  const dependencies = {
103
331
  ...DEFAULT_DEPENDENCIES,
@@ -105,15 +333,21 @@ export async function validateMatrixCell(provider, value, options) {
105
333
  ...options.dependencies,
106
334
  };
107
335
  if (normalizedProvider === 'claude') {
108
- return VALID_CLAUDE_DISPATCH_CEILINGS.includes(normalizedValue)
336
+ const availability = VALID_CLAUDE_DISPATCH_CEILINGS.includes(normalizedValue)
109
337
  ? 'valid'
110
338
  : 'unknown-value';
339
+ return options.detailed ? { availability } : availability;
111
340
  }
112
341
  if (normalizedProvider === 'codex') {
113
- return validateCodexCell(normalizedValue, options.cwd, dependencies);
342
+ const result = await validateCodexCell(normalizedValue, options.cwd, dependencies, options.target);
343
+ return options.detailed ? result : result.availability;
114
344
  }
115
345
  if (normalizedProvider === 'cursor') {
116
- return validateCursorCell(normalizedValue, options.cwd, dependencies);
346
+ const result = await validateCursorSubagentModel(normalizedValue, {
347
+ ...options,
348
+ dependencies,
349
+ });
350
+ return options.detailed ? result : result.availability;
117
351
  }
118
- return 'unvalidated';
352
+ return options.detailed ? { availability: 'unvalidated' } : 'unvalidated';
119
353
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stamp.d.ts","sourceRoot":"","sources":["../../../src/providers/identity/stamp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,KAAK,GAAG,QAAQ,CAAC;AACjE,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,KAAK,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAyDD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAiBvE;AAqGD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,0BAA+B,GACvC,aAAa,EAAE,CAqBjB;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAepC"}
1
+ {"version":3,"file":"stamp.d.ts","sourceRoot":"","sources":["../../../src/providers/identity/stamp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,KAAK,GAAG,QAAQ,CAAC;AACjE,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,KAAK,GAAG,UAAU,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAyDD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAiBvE;AA6GD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,0BAA+B,GACvC,aAAa,EAAE,CAqBjB;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAepC"}
@@ -90,6 +90,10 @@ function parseModernStamp(line, lineNumber, fields, options) {
90
90
  warn(options, lineNumber, 'missing or invalid role');
91
91
  return undefined;
92
92
  }
93
+ if (role !== inferRole(action)) {
94
+ warn(options, lineNumber, `incompatible action/role pair ${action}/${role}`);
95
+ return undefined;
96
+ }
93
97
  const scope = singleToken(fields.get('scope'), '');
94
98
  if (!scope) {
95
99
  warn(options, lineNumber, 'missing scope');
@@ -7,4 +7,5 @@ export declare const ScopeSchema: z.ZodEnum<["project", "user", "all"]>;
7
7
  export type Scope = z.infer<typeof ScopeSchema>;
8
8
  export type ConcreteScope = Exclude<Scope, 'all'>;
9
9
  export declare const SCOPE_CONTENT_TYPES: Record<Scope, ContentType[]>;
10
+ export declare const USER_SCOPE_MANAGED_AGENT_FILES: readonly ["oat-phase-implementer.md", "oat-reviewer.md"];
10
11
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB,uCAAqC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,kBAAkB,wCAAsC,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,WAAW,uCAAqC,CAAC;AAC9D,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAQlD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAI5D,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,iBAAiB,uCAAqC,CAAC;AACpE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,kBAAkB,wCAAsC,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,WAAW,uCAAqC,CAAC;AAC9D,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAQlD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,CAI5D,CAAC;AAEF,eAAO,MAAM,8BAA8B,0DAGjC,CAAC"}
@@ -12,3 +12,7 @@ export const SCOPE_CONTENT_TYPES = {
12
12
  user: USER_SCOPE_CONTENT_TYPES,
13
13
  all: ALL_SCOPE_CONTENT_TYPES,
14
14
  };
15
+ export const USER_SCOPE_MANAGED_AGENT_FILES = [
16
+ 'oat-phase-implementer.md',
17
+ 'oat-reviewer.md',
18
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.1.45",
3
+ "version": "0.1.48",
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",
@@ -34,7 +34,7 @@
34
34
  "ora": "^9.0.0",
35
35
  "yaml": "2.8.2",
36
36
  "zod": "^3.25.76",
37
- "@open-agent-toolkit/control-plane": "0.1.45"
37
+ "@open-agent-toolkit/control-plane": "0.1.48"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",