@open-agent-toolkit/cli 0.1.43 → 0.1.46

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 (94) hide show
  1. package/assets/agents/oat-reviewer.md +2 -2
  2. package/assets/config/dispatch-matrix-recommendation.json +23 -0
  3. package/assets/docs/cli-utilities/config-and-local-state.md +7 -0
  4. package/assets/docs/cli-utilities/configuration.md +104 -25
  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/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 +6 -3
  11. package/assets/docs/provider-sync/scope-and-surface.md +2 -1
  12. package/assets/docs/reference/oat-directory-structure.md +2 -2
  13. package/assets/docs/workflows/projects/dispatch-ceiling.md +110 -27
  14. package/assets/docs/workflows/projects/implementation-execution.md +20 -13
  15. package/assets/public-package-versions.json +4 -4
  16. package/assets/skills/oat-project-implement/SKILL.md +155 -58
  17. package/assets/skills/oat-project-plan/SKILL.md +22 -3
  18. package/assets/skills/oat-project-quick-start/SKILL.md +54 -23
  19. package/assets/templates/state.md +5 -0
  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 +429 -20
  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 +209 -19
  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 +487 -17
  36. package/dist/commands/providers/codex/index.d.ts +4 -0
  37. package/dist/commands/providers/codex/index.d.ts.map +1 -0
  38. package/dist/commands/providers/codex/index.js +7 -0
  39. package/dist/commands/providers/codex/materialize.d.ts +5 -0
  40. package/dist/commands/providers/codex/materialize.d.ts.map +1 -0
  41. package/dist/commands/providers/codex/materialize.js +152 -0
  42. package/dist/commands/providers/index.d.ts +2 -2
  43. package/dist/commands/providers/index.d.ts.map +1 -1
  44. package/dist/commands/providers/index.js +4 -2
  45. package/dist/commands/providers/providers.types.d.ts +23 -0
  46. package/dist/commands/providers/providers.types.d.ts.map +1 -1
  47. package/dist/commands/shared/codex-strays.d.ts.map +1 -1
  48. package/dist/commands/shared/codex-strays.js +11 -1
  49. package/dist/commands/status/index.d.ts +4 -1
  50. package/dist/commands/status/index.d.ts.map +1 -1
  51. package/dist/commands/status/index.js +1 -1
  52. package/dist/commands/sync/index.d.ts.map +1 -1
  53. package/dist/commands/sync/index.js +1 -1
  54. package/dist/commands/sync/sync.types.d.ts +4 -1
  55. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  56. package/dist/config/dispatch-ceiling-preset.d.ts +4 -0
  57. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  58. package/dist/config/dispatch-ceiling-preset.js +3 -0
  59. package/dist/config/dispatch-policy-options.d.ts +20 -0
  60. package/dist/config/dispatch-policy-options.d.ts.map +1 -0
  61. package/dist/config/dispatch-policy-options.js +96 -0
  62. package/dist/config/oat-config.d.ts +21 -5
  63. package/dist/config/oat-config.d.ts.map +1 -1
  64. package/dist/config/oat-config.js +118 -10
  65. package/dist/config/resolve.js +12 -0
  66. package/dist/manifest/manifest.types.d.ts +12 -12
  67. package/dist/providers/ceiling/registry.d.ts +7 -5
  68. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  69. package/dist/providers/ceiling/registry.js +32 -5
  70. package/dist/providers/codex/codec/config-merge.d.ts +6 -0
  71. package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
  72. package/dist/providers/codex/codec/config-merge.js +7 -0
  73. package/dist/providers/codex/codec/materialize.d.ts +16 -0
  74. package/dist/providers/codex/codec/materialize.d.ts.map +1 -0
  75. package/dist/providers/codex/codec/materialize.js +57 -0
  76. package/dist/providers/codex/codec/shared.d.ts +1 -0
  77. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  78. package/dist/providers/codex/codec/shared.js +9 -1
  79. package/dist/providers/codex/codec/sync-extension.d.ts +7 -1
  80. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  81. package/dist/providers/codex/codec/sync-extension.js +183 -46
  82. package/dist/providers/identity/availability.d.ts +45 -0
  83. package/dist/providers/identity/availability.d.ts.map +1 -0
  84. package/dist/providers/identity/availability.js +353 -0
  85. package/dist/providers/identity/family.d.ts +13 -0
  86. package/dist/providers/identity/family.d.ts.map +1 -0
  87. package/dist/providers/identity/family.js +32 -0
  88. package/dist/providers/identity/provenance.d.ts +21 -0
  89. package/dist/providers/identity/provenance.d.ts.map +1 -0
  90. package/dist/providers/identity/provenance.js +65 -0
  91. package/dist/providers/identity/stamp.d.ts +35 -0
  92. package/dist/providers/identity/stamp.d.ts.map +1 -0
  93. package/dist/providers/identity/stamp.js +171 -0
  94. package/package.json +2 -2
@@ -0,0 +1,228 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { readFile as defaultReadFile } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { buildCommandContext, } from '../../app/command-context.js';
6
+ import { readGlobalOptions } from '../shared/shared.utils.js';
7
+ import { classifyModelFamily, } from '../../providers/identity/family.js';
8
+ import { Command } from 'commander';
9
+ const execFileAsync = promisify(execFile);
10
+ async function runCursorAgent(args, options) {
11
+ try {
12
+ const { stdout, stderr } = await execFileAsync('cursor-agent', args, {
13
+ cwd: options.cwd,
14
+ env: options.env,
15
+ maxBuffer: 1024 * 1024,
16
+ timeout: 10_000,
17
+ });
18
+ return {
19
+ ok: true,
20
+ stdout: String(stdout),
21
+ stderr: String(stderr),
22
+ };
23
+ }
24
+ catch (error) {
25
+ const failure = error;
26
+ return {
27
+ ok: false,
28
+ stdout: String(failure.stdout ?? ''),
29
+ stderr: String(failure.stderr ?? failure.message),
30
+ };
31
+ }
32
+ }
33
+ const DEFAULT_DEPENDENCIES = {
34
+ buildCommandContext,
35
+ runCursorAgent,
36
+ readFile: async (path, encoding) => defaultReadFile(path, encoding),
37
+ env: process.env,
38
+ };
39
+ function apiKeyArgs(env) {
40
+ const apiKey = env.CURSOR_API_KEY;
41
+ // p01 live verification showed the argv flag can bypass a locked login
42
+ // keychain for catalog probes; keep using it even though argv is visible to
43
+ // local process inspection for the short-lived helper process.
44
+ return typeof apiKey === 'string' && apiKey.length > 0
45
+ ? ['--api-key', apiKey]
46
+ : [];
47
+ }
48
+ function buildModelsArgs(env) {
49
+ return [...apiKeyArgs(env), 'models'];
50
+ }
51
+ function buildListModelsArgs(env) {
52
+ return [...apiKeyArgs(env), '--list-models'];
53
+ }
54
+ function buildInitEventArgs(env) {
55
+ return [
56
+ ...apiKeyArgs(env),
57
+ '-p',
58
+ '--mode',
59
+ 'ask',
60
+ '--trust',
61
+ '--output-format',
62
+ 'stream-json',
63
+ 'ok',
64
+ ];
65
+ }
66
+ function stripMarkers(displayName) {
67
+ return displayName.replace(/\s+\((current|default)\)/gi, '').trim();
68
+ }
69
+ function parseCatalog(stdout) {
70
+ const entries = [];
71
+ for (const line of stdout.split(/\r?\n/)) {
72
+ const match = line.match(/^(\S+)\s+-\s+(.+)$/);
73
+ if (!match) {
74
+ continue;
75
+ }
76
+ const [, slug, display] = match;
77
+ if (!slug || !display) {
78
+ continue;
79
+ }
80
+ entries.push({
81
+ slug,
82
+ displayName: stripMarkers(display),
83
+ current: /\(current\)/i.test(display),
84
+ });
85
+ }
86
+ return entries;
87
+ }
88
+ function mergeCatalogEntries(left, right) {
89
+ const bySlug = new Map();
90
+ for (const entry of [...left, ...right]) {
91
+ const existing = bySlug.get(entry.slug);
92
+ bySlug.set(entry.slug, {
93
+ ...entry,
94
+ current: entry.current || existing?.current === true,
95
+ });
96
+ }
97
+ return [...bySlug.values()];
98
+ }
99
+ function currentCatalogEntry(entries) {
100
+ return entries.find((entry) => entry.current);
101
+ }
102
+ function isSingleToken(value) {
103
+ return /^\S+$/.test(value);
104
+ }
105
+ function mapThroughCatalog(value, catalog) {
106
+ const normalized = value.trim();
107
+ const match = catalog.find((entry) => entry.slug === normalized || entry.displayName === normalized);
108
+ if (match) {
109
+ return match.slug;
110
+ }
111
+ if (catalog.length > 0) {
112
+ return undefined;
113
+ }
114
+ return isSingleToken(normalized) ? normalized : undefined;
115
+ }
116
+ function target(value, source, provenance, rawValue) {
117
+ return {
118
+ value,
119
+ source,
120
+ provenance,
121
+ family: classifyModelFamily({ value }),
122
+ ...(rawValue && rawValue !== value ? { rawValue } : {}),
123
+ };
124
+ }
125
+ function unknown(source = 'unknown', rawValue) {
126
+ return target('unknown', source, source === 'unknown' ? 'unknown' : 'inferred', rawValue);
127
+ }
128
+ function parseInitEventModel(stdout) {
129
+ for (const line of stdout.split(/\r?\n/)) {
130
+ const trimmed = line.trim();
131
+ if (trimmed.length === 0) {
132
+ continue;
133
+ }
134
+ try {
135
+ const parsed = JSON.parse(trimmed);
136
+ if (typeof parsed.model === 'string' && parsed.model.trim().length > 0) {
137
+ return parsed.model.trim();
138
+ }
139
+ }
140
+ catch {
141
+ continue;
142
+ }
143
+ }
144
+ return undefined;
145
+ }
146
+ function readConfigModel(raw) {
147
+ const parsed = JSON.parse(raw);
148
+ return typeof parsed.model === 'string' && parsed.model.trim().length > 0
149
+ ? parsed.model.trim()
150
+ : undefined;
151
+ }
152
+ export async function probeCursorCurrentTarget(options) {
153
+ const dependencies = {
154
+ runCursorAgent,
155
+ readFile: async (path, encoding) => defaultReadFile(path, encoding),
156
+ env: process.env,
157
+ ...options.dependencies,
158
+ };
159
+ const env = dependencies.env ?? process.env;
160
+ const runOptions = { cwd: options.cwd, env };
161
+ let catalog = [];
162
+ const modelsResult = await dependencies.runCursorAgent(buildModelsArgs(env), runOptions);
163
+ if (modelsResult.ok) {
164
+ catalog = mergeCatalogEntries(catalog, parseCatalog(modelsResult.stdout));
165
+ const current = currentCatalogEntry(catalog);
166
+ if (current) {
167
+ return target(current.slug, 'cursor-agent models', 'inferred');
168
+ }
169
+ }
170
+ const listResult = await dependencies.runCursorAgent(buildListModelsArgs(env), runOptions);
171
+ if (listResult.ok) {
172
+ const listEntries = parseCatalog(listResult.stdout);
173
+ catalog = mergeCatalogEntries(catalog, listEntries);
174
+ const current = currentCatalogEntry(listEntries);
175
+ if (current) {
176
+ return target(current.slug, '--list-models', 'inferred');
177
+ }
178
+ }
179
+ const initResult = await dependencies.runCursorAgent(buildInitEventArgs(env), runOptions);
180
+ if (initResult.ok) {
181
+ const rawModel = parseInitEventModel(initResult.stdout);
182
+ if (rawModel) {
183
+ const mapped = mapThroughCatalog(rawModel, catalog);
184
+ return mapped
185
+ ? target(mapped, 'init-event', 'inferred', rawModel)
186
+ : unknown('init-event', rawModel);
187
+ }
188
+ }
189
+ try {
190
+ const rawConfig = await dependencies.readFile(join(options.home, '.cursor', 'cli-config.json'), 'utf8');
191
+ const rawModel = readConfigModel(rawConfig);
192
+ if (rawModel) {
193
+ const mapped = mapThroughCatalog(rawModel, catalog);
194
+ return mapped
195
+ ? target(mapped, 'cli-config', 'inferred', rawModel)
196
+ : unknown('cli-config', rawModel);
197
+ }
198
+ }
199
+ catch {
200
+ return unknown();
201
+ }
202
+ return unknown();
203
+ }
204
+ function emitResult(context, result) {
205
+ if (context.json) {
206
+ context.logger.json(result);
207
+ return;
208
+ }
209
+ context.logger.info(`${result.value} source=${result.source} provenance=${result.provenance}`);
210
+ }
211
+ export function createCursorCurrentTargetCommand(overrides = {}) {
212
+ const dependencies = {
213
+ ...DEFAULT_DEPENDENCIES,
214
+ ...overrides,
215
+ };
216
+ return new Command('cursor-current-target')
217
+ .description('Probe the current Cursor model target')
218
+ .option('--json', 'Output JSON')
219
+ .action(async (_options, command) => {
220
+ const context = dependencies.buildCommandContext(readGlobalOptions(command));
221
+ const result = await probeCursorCurrentTarget({
222
+ cwd: context.cwd,
223
+ home: context.home,
224
+ dependencies,
225
+ });
226
+ emitResult(context, result);
227
+ });
228
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/internal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,IAAI,OAAO,CAK/C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/internal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,IAAI,OAAO,CAM/C"}
@@ -1,9 +1,11 @@
1
1
  import { Command } from 'commander';
2
+ import { createCursorCurrentTargetCommand } from './cursor-current-target.js';
2
3
  import { createValidateOatSkillsCommand } from './validate-oat-skills.js';
3
4
  import { createValidateSkillVersionBumpsCommand } from './validate-skill-version-bumps.js';
4
5
  export function createInternalCommand() {
5
6
  return new Command('internal')
6
7
  .description('Internal OAT maintenance commands')
8
+ .addCommand(createCursorCurrentTargetCommand())
7
9
  .addCommand(createValidateOatSkillsCommand())
8
10
  .addCommand(createValidateSkillVersionBumpsCommand());
9
11
  }
@@ -1 +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;AAO9B,OAAO,EAKL,KAAK,uBAAuB,EAK7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,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;AA2+BD,wBAAgB,mCAAmC,CACjD,SAAS,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACnD,OAAO,CAqDT"}
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;AAY9B,OAAO,EAOL,KAAK,uBAAuB,EAU7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAazB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC,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;AA4pDD,wBAAgB,mCAAmC,CACjD,SAAS,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACnD,OAAO,CAwET"}