@open-agent-toolkit/cli 0.1.62 → 0.1.64

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 (61) hide show
  1. package/assets/agents/oat-phase-implementer.md +9 -1
  2. package/assets/agents/oat-reviewer.md +8 -1
  3. package/assets/docs/cli-utilities/configuration.md +29 -0
  4. package/assets/docs/cli-utilities/tool-packs.md +29 -1
  5. package/assets/docs/contributing/skills.md +22 -0
  6. package/assets/docs/workflows/projects/artifacts.md +30 -0
  7. package/assets/docs/workflows/projects/autonomy.md +154 -0
  8. package/assets/docs/workflows/projects/cursor-cloud.md +151 -0
  9. package/assets/docs/workflows/projects/dispatch-ceiling.md +13 -0
  10. package/assets/docs/workflows/projects/index.md +6 -0
  11. package/assets/public-package-versions.json +4 -4
  12. package/assets/skills/oat-cursor-cloud-projects/SKILL.md +318 -0
  13. package/assets/skills/oat-cursor-cloud-projects/references/cursor-cloud-mechanics.md +173 -0
  14. package/assets/skills/oat-project-autonomous/SKILL.md +439 -0
  15. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +294 -0
  16. package/assets/skills/oat-project-design/SKILL.md +79 -1
  17. package/assets/skills/oat-project-discover/SKILL.md +76 -1
  18. package/assets/skills/oat-project-document/SKILL.md +24 -1
  19. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +294 -0
  20. package/assets/skills/oat-project-implement/SKILL.md +18 -1
  21. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +72 -7
  22. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +17 -9
  23. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +294 -0
  24. package/assets/skills/oat-project-implement/references/plan-and-resume.md +56 -0
  25. package/assets/skills/oat-project-plan-writing/SKILL.md +48 -12
  26. package/assets/skills/oat-project-pr-final/SKILL.md +31 -4
  27. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +294 -0
  28. package/assets/skills/oat-project-quick-start/SKILL.md +50 -2
  29. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +294 -0
  30. package/assets/skills/oat-project-review-provide/SKILL.md +9 -1
  31. package/assets/skills/oat-project-review-receive/SKILL.md +9 -1
  32. package/assets/skills/oat-project-summary/SKILL.md +76 -14
  33. package/assets/templates/summary.md +24 -0
  34. package/dist/commands/gate/index.d.ts.map +1 -1
  35. package/dist/commands/gate/index.js +4 -1
  36. package/dist/commands/init/tools/index.d.ts.map +1 -1
  37. package/dist/commands/init/tools/index.js +67 -45
  38. package/dist/commands/init/tools/shared/skill-manifest.d.ts +1 -1
  39. package/dist/commands/init/tools/shared/skill-manifest.d.ts.map +1 -1
  40. package/dist/commands/init/tools/shared/skill-manifest.js +2 -0
  41. package/dist/commands/init/tools/workflows/index.d.ts +2 -1
  42. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  43. package/dist/commands/init/tools/workflows/index.js +13 -11
  44. package/dist/commands/init/tools/workflows/install-workflows.d.ts +2 -0
  45. package/dist/commands/init/tools/workflows/install-workflows.d.ts.map +1 -1
  46. package/dist/commands/init/tools/workflows/install-workflows.js +4 -0
  47. package/dist/commands/project/new/scaffold.d.ts +1 -0
  48. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  49. package/dist/commands/project/new/scaffold.js +23 -4
  50. package/dist/commands/tools/remove/index.js +2 -2
  51. package/dist/commands/tools/remove/remove-tools.d.ts.map +1 -1
  52. package/dist/commands/tools/remove/remove-tools.js +23 -0
  53. package/dist/commands/tools/update/index.d.ts.map +1 -1
  54. package/dist/commands/tools/update/index.js +7 -1
  55. package/dist/commands/tools/update/update-tools.d.ts +9 -0
  56. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  57. package/dist/commands/tools/update/update-tools.js +25 -5
  58. package/dist/providers/identity/family.d.ts +1 -1
  59. package/dist/providers/identity/family.d.ts.map +1 -1
  60. package/dist/providers/identity/family.js +2 -0
  61. package/package.json +2 -2
@@ -1,9 +1,11 @@
1
1
  import { execFileSync } from 'node:child_process';
2
2
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
3
4
  import { join } from 'node:path';
4
5
  import { resolveProjectsRoot } from '../../shared/oat-paths.js';
5
6
  import { generateStateDashboard } from '../../state/generate.js';
6
7
  import { setActiveProject } from '../../../config/oat-config.js';
8
+ import { resolveAssetsRoot } from '../../../fs/assets.js';
7
9
  import { fileExists } from '../../../fs/io.js';
8
10
  import { assertValidProjectStateContent } from '../../../validation/project-state.js';
9
11
  const TEMPLATES_BY_MODE = {
@@ -162,12 +164,11 @@ function commitScaffold(cwd, projectPath, projectName, createdFiles) {
162
164
  return { status: 'failed', committed: false, error: message };
163
165
  }
164
166
  }
165
- async function scaffoldModeTemplates(repoRoot, projectPath, projectName, mode, today, nowUtc) {
166
- const templatesDir = join(repoRoot, '.oat', 'templates');
167
+ async function scaffoldModeTemplates(userOatRoot, repoRoot, projectPath, projectName, mode, today, nowUtc) {
167
168
  const createdFiles = [];
168
169
  const skippedFiles = [];
169
170
  for (const templateFile of TEMPLATES_BY_MODE[mode]) {
170
- const src = join(templatesDir, templateFile);
171
+ const src = await resolveTemplateSource(userOatRoot, repoRoot, templateFile);
171
172
  const dest = join(repoRoot, projectPath, templateFile);
172
173
  if (await fileExists(dest)) {
173
174
  skippedFiles.push(templateFile);
@@ -183,6 +184,18 @@ async function scaffoldModeTemplates(repoRoot, projectPath, projectName, mode, t
183
184
  }
184
185
  return { createdFiles, skippedFiles };
185
186
  }
187
+ async function resolveTemplateSource(userOatRoot, repoRoot, templateFile) {
188
+ const userSource = join(userOatRoot, 'templates', templateFile);
189
+ if (await fileExists(userSource)) {
190
+ return userSource;
191
+ }
192
+ const repoSource = join(repoRoot, '.oat', 'templates', templateFile);
193
+ if (await fileExists(repoSource)) {
194
+ return repoSource;
195
+ }
196
+ const assetsRoot = await resolveAssetsRoot();
197
+ return join(assetsRoot, 'templates', templateFile);
198
+ }
186
199
  async function ensureStructure(repoRoot, projectPath, mode) {
187
200
  const projectRoot = join(repoRoot, projectPath);
188
201
  await mkdir(projectRoot, { recursive: true });
@@ -202,6 +215,12 @@ export async function scaffoldProject(options) {
202
215
  const setActive = options.setActive ?? true;
203
216
  const refreshDashboard = options.refreshDashboard ?? true;
204
217
  const env = options.env ?? process.env;
218
+ const home = options.home ??
219
+ env.HOME ??
220
+ env.USERPROFILE ??
221
+ process.env.HOME ??
222
+ homedir();
223
+ const userOatRoot = join(home, '.oat');
205
224
  const now = new Date();
206
225
  const today = options.today ?? now.toISOString().slice(0, 10);
207
226
  const nowUtc = options.nowUtc ?? now.toISOString();
@@ -212,7 +231,7 @@ export async function scaffoldProject(options) {
212
231
  // Scaffold behavior is always non-destructive (create missing files only).
213
232
  void options.force;
214
233
  await ensureStructure(options.repoRoot, projectPath, mode);
215
- const { createdFiles, skippedFiles } = await scaffoldModeTemplates(options.repoRoot, projectPath, options.projectName, mode, today, nowUtc);
234
+ const { createdFiles, skippedFiles } = await scaffoldModeTemplates(userOatRoot, options.repoRoot, projectPath, options.projectName, mode, today, nowUtc);
216
235
  if (setActive) {
217
236
  await setActiveProject(options.repoRoot, projectPath);
218
237
  }
@@ -1,5 +1,5 @@
1
1
  import { execFile } from 'node:child_process';
2
- import { rm, unlink } from 'node:fs/promises';
2
+ import { rm } from 'node:fs/promises';
3
3
  import { buildCommandContext } from '../../../app/command-context.js';
4
4
  import { withScopeOption } from '../../shared/scope-option.js';
5
5
  import { readGlobalOptions, resolveConcreteScopes, } from '../../shared/shared.utils.js';
@@ -22,7 +22,7 @@ const defaultDependencies = {
22
22
  await rm(path, { recursive: true, force: true });
23
23
  },
24
24
  removeFile: async (path) => {
25
- await unlink(path);
25
+ await rm(path, { force: true });
26
26
  },
27
27
  };
28
28
  const defaultSyncDependencies = {
@@ -1 +1 @@
1
- {"version":3,"file":"remove-tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/remove/remove-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA8BD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAqBvB"}
1
+ {"version":3,"file":"remove-tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/remove/remove-tools.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAqDD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAgCvB"}
@@ -1,4 +1,5 @@
1
1
  import { join } from 'node:path';
2
+ import { WORKFLOW_AGENTS, WORKFLOW_SCRIPTS, WORKFLOW_TEMPLATES, } from '../../init/tools/shared/skill-manifest.js';
2
3
  function matchesTarget(tool, target) {
3
4
  switch (target.kind) {
4
5
  case 'name':
@@ -21,6 +22,20 @@ async function removeTool(tool, scopeRoot, dryRun, deps) {
21
22
  await deps.removeDirectory(skillPath);
22
23
  }
23
24
  }
25
+ async function removePackCompanionAssets(pack, scope, scopeRoot, dryRun, deps) {
26
+ if (dryRun || pack !== 'workflows' || scope !== 'user') {
27
+ return;
28
+ }
29
+ for (const agent of WORKFLOW_AGENTS) {
30
+ await deps.removeFile(join(scopeRoot, '.agents', 'agents', agent));
31
+ }
32
+ for (const template of WORKFLOW_TEMPLATES) {
33
+ await deps.removeFile(join(scopeRoot, '.oat', 'templates', template));
34
+ }
35
+ for (const script of WORKFLOW_SCRIPTS) {
36
+ await deps.removeFile(join(scopeRoot, '.oat', 'scripts', script));
37
+ }
38
+ }
24
39
  export async function removeTools(target, scopes, cwd, home, dryRun, deps) {
25
40
  const removed = [];
26
41
  const assetsRoot = await deps.resolveAssetsRoot();
@@ -32,6 +47,14 @@ export async function removeTools(target, scopes, cwd, home, dryRun, deps) {
32
47
  await removeTool(tool, scopeRoot, dryRun, deps);
33
48
  removed.push({ name: tool.name, type: tool.type, scope: tool.scope });
34
49
  }
50
+ if (target.kind !== 'name') {
51
+ const matchedPacks = new Set(matched
52
+ .map((tool) => tool.pack)
53
+ .filter((pack) => pack !== 'custom'));
54
+ for (const pack of matchedPacks) {
55
+ await removePackCompanionAssets(pack, scope, scopeRoot, dryRun, deps);
56
+ }
57
+ }
35
58
  }
36
59
  const notInstalled = [];
37
60
  if (target.kind === 'name' && removed.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAKvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAexB,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,EAAE,CAaV;AAgCD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CA4JT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAI7E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAOT;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAMR"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/index.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,KAAK,oBAAoB,EAE1B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAY,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAKvE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAE7B,MAAM,gBAAgB,CAAC;AAgBxB,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,EAAE,CAaV;AAgCD,wBAAgB,wBAAwB,CACtC,YAAY,GAAE,uBAA6C,EAC3D,gBAAgB,GAAE,oBAA8C,GAC/D,OAAO,CAoKT;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAI7E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,GACnB,OAAO,CAOT;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,MAAM,CAMR"}
@@ -1,4 +1,5 @@
1
1
  import { execFile } from 'node:child_process';
2
+ import { chmod } from 'node:fs/promises';
2
3
  import { join } from 'node:path';
3
4
  import { buildCommandContext } from '../../../app/command-context.js';
4
5
  import { applyOatCoreGitignore } from '../../init/gitignore.js';
@@ -24,6 +25,7 @@ const defaultDependencies = {
24
25
  copyDirWithStatus,
25
26
  copyFileWithStatus,
26
27
  fileExists,
28
+ chmod,
27
29
  applyOatCoreGitignore,
28
30
  };
29
31
  export function buildSyncSubprocessArgs(entrypoint, execArgv, options) {
@@ -166,7 +168,11 @@ export function createToolsUpdateCommand(dependencies = defaultDependencies, syn
166
168
  for (const tool of result.notBundled) {
167
169
  logger.info(`Not bundled (custom): ${tool.name}`);
168
170
  }
169
- if (result.updated.length === 0) {
171
+ for (const asset of result.assetRefreshes) {
172
+ const action = asset.status === 'planned' ? 'Would refresh' : 'Refreshed';
173
+ logger.info(`${action} ${asset.type}: ${asset.name} (${asset.scope} ${asset.pack} pack)`);
174
+ }
175
+ if (result.updated.length === 0 && result.assetRefreshes.length === 0) {
170
176
  logger.info('No tools to update.');
171
177
  }
172
178
  });
@@ -12,12 +12,20 @@ export type UpdateTarget = {
12
12
  } | {
13
13
  kind: 'all';
14
14
  };
15
+ export interface PackAssetRefresh {
16
+ name: string;
17
+ type: 'template' | 'script';
18
+ pack: PackName;
19
+ scope: ConcreteScope;
20
+ status: 'planned' | 'refreshed';
21
+ }
15
22
  export interface UpdateResult {
16
23
  updated: ToolInfo[];
17
24
  current: ToolInfo[];
18
25
  newer: ToolInfo[];
19
26
  notInstalled: string[];
20
27
  notBundled: ToolInfo[];
28
+ assetRefreshes: PackAssetRefresh[];
21
29
  }
22
30
  export interface UpdateToolsDependencies {
23
31
  scanTools: (options: ScanToolsOptions) => Promise<ToolInfo[]>;
@@ -26,6 +34,7 @@ export interface UpdateToolsDependencies {
26
34
  copyDirWithStatus: (source: string, destination: string, force: boolean) => Promise<CopyStatus>;
27
35
  copyFileWithStatus: (source: string, destination: string, force: boolean) => Promise<CopyStatus>;
28
36
  fileExists: (path: string) => Promise<boolean>;
37
+ chmod: (path: string, mode: number) => Promise<void>;
29
38
  applyOatCoreGitignore?: (repoRoot: string) => Promise<ApplyOatCoreResult>;
30
39
  }
31
40
  export declare function updateTools(target: UpdateTarget, scopes: ConcreteScope[], cwd: string, home: string, dryRun: boolean, dependencies: UpdateToolsDependencies): Promise<UpdateResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"update-tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/update-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAkB3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,iBAAiB,EAAE,CACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,kBAAkB,EAAE,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC3E;AAmFD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,uBAAuB,GACpC,OAAO,CAAC,YAAY,CAAC,CA0GvB"}
1
+ {"version":3,"file":"update-tools.d.ts","sourceRoot":"","sources":["../../../../src/commands/tools/update/update-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AAkB3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,cAAc,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,gBAAgB,EAAE,CAChB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,iBAAiB,EAAE,CACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,kBAAkB,EAAE,CAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,OAAO,KACX,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC3E;AAoFD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,aAAa,EAAE,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,uBAAuB,GACpC,OAAO,CAAC,YAAY,CAAC,CA8HvB"}
@@ -67,6 +67,7 @@ export async function updateTools(target, scopes, cwd, home, dryRun, dependencie
67
67
  newer: [],
68
68
  notInstalled: [],
69
69
  notBundled: [],
70
+ assetRefreshes: [],
70
71
  };
71
72
  const allTools = [];
72
73
  for (const scope of scopes) {
@@ -126,7 +127,16 @@ export async function updateTools(target, scopes, cwd, home, dryRun, dependencie
126
127
  for (const template of assets.templates) {
127
128
  const source = join(assetsRoot, 'templates', template);
128
129
  const destination = join(assetTarget.scopeRoot, '.oat', 'templates', template);
129
- await dependencies.copyFileWithStatus(source, destination, true);
130
+ if (!dryRun) {
131
+ await dependencies.copyFileWithStatus(source, destination, true);
132
+ }
133
+ result.assetRefreshes.push({
134
+ name: template,
135
+ type: 'template',
136
+ pack: assetTarget.pack,
137
+ scope: assetTarget.scope,
138
+ status: dryRun ? 'planned' : 'refreshed',
139
+ });
130
140
  }
131
141
  for (const script of assets.scripts) {
132
142
  const source = join(assetsRoot, 'scripts', script);
@@ -134,7 +144,17 @@ export async function updateTools(target, scopes, cwd, home, dryRun, dependencie
134
144
  continue;
135
145
  }
136
146
  const destination = join(assetTarget.scopeRoot, '.oat', 'scripts', script);
137
- await dependencies.copyFileWithStatus(source, destination, true);
147
+ if (!dryRun) {
148
+ await dependencies.copyFileWithStatus(source, destination, true);
149
+ await dependencies.chmod(destination, 0o755);
150
+ }
151
+ result.assetRefreshes.push({
152
+ name: script,
153
+ type: 'script',
154
+ pack: assetTarget.pack,
155
+ scope: assetTarget.scope,
156
+ status: dryRun ? 'planned' : 'refreshed',
157
+ });
138
158
  }
139
159
  }
140
160
  return result;
@@ -182,7 +202,7 @@ function expandInstalledPackEntries(target, installedEntries) {
182
202
  return entries;
183
203
  }
184
204
  function getBundledPackMembers(pack, scope) {
185
- return BUNDLED_PACK_MEMBERS[pack].filter((member) => scope === 'project' || member.type === 'skill');
205
+ return BUNDLED_PACK_MEMBERS[pack].filter((member) => scope === 'project' || member.type === 'skill' || pack === 'workflows');
186
206
  }
187
207
  function resolvePackAssetTargets(target, installedEntries) {
188
208
  if (target.kind === 'name') {
@@ -195,7 +215,7 @@ function resolvePackAssetTargets(target, installedEntries) {
195
215
  entriesByScope.set(entry.tool.scope, scopeEntries);
196
216
  }
197
217
  const targets = [];
198
- for (const scopeEntries of entriesByScope.values()) {
218
+ for (const [scope, scopeEntries] of entriesByScope) {
199
219
  const scopeRoot = scopeEntries[0]?.scopeRoot;
200
220
  if (!scopeRoot)
201
221
  continue;
@@ -212,7 +232,7 @@ function resolvePackAssetTargets(target, installedEntries) {
212
232
  if (assets.templates.length === 0 && assets.scripts.length === 0) {
213
233
  continue;
214
234
  }
215
- targets.push({ pack, scopeRoot });
235
+ targets.push({ pack, scope, scopeRoot });
216
236
  }
217
237
  }
218
238
  return targets;
@@ -1,4 +1,4 @@
1
- export type ModelFamily = 'claude' | 'openai' | 'composer' | 'glm' | 'unknown';
1
+ export type ModelFamily = 'claude' | 'openai' | 'xai' | 'composer' | 'glm' | 'unknown';
2
2
  interface ClassifyModelFamilyInput {
3
3
  value: string;
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"family.d.ts","sourceRoot":"","sources":["../../../src/providers/identity/family.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,SAAS,CAAC;AAE/E,UAAU,wBAAwB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgCD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,WAAW,CASb"}
1
+ {"version":3,"file":"family.d.ts","sourceRoot":"","sources":["../../../src/providers/identity/family.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,KAAK,GACL,UAAU,GACV,KAAK,GACL,SAAS,CAAC;AAEd,UAAU,wBAAwB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAkCD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,WAAW,CASb"}
@@ -1,12 +1,14 @@
1
1
  const PROVIDER_ID_FAMILIES = [
2
2
  [/^(anthropic|claude)$/i, 'claude'],
3
3
  [/^(openai|codex)$/i, 'openai'],
4
+ [/^(xai|x-ai|grok)$/i, 'xai'],
4
5
  [/^composer$/i, 'composer'],
5
6
  [/^(glm|zai|zhipu)$/i, 'glm'],
6
7
  ];
7
8
  const VALUE_FAMILIES = [
8
9
  [/\b(claude|sonnet|opus|haiku|fable)\b/i, 'claude'],
9
10
  [/\b(gpt|openai|codex|o[1-9])[-\w.]*\b/i, 'openai'],
11
+ [/\b(grok|xai|x-ai)\b/i, 'xai'],
10
12
  [/\bcomposer\b/i, 'composer'],
11
13
  [/\bglm\b/i, 'glm'],
12
14
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.1.62",
3
+ "version": "0.1.64",
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.62"
37
+ "@open-agent-toolkit/control-plane": "0.1.64"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",