From d5f7aca74814f96d2043ab475cf770a27619fee7 Mon Sep 17 00:00:00 2001 From: Steve Hetzel Date: Tue, 4 Feb 2025 18:38:47 -0700 Subject: [PATCH] feat: add agent generate template command --- command-snapshot.json | 8 ++++ messages/agent.generate.template.md | 21 +++++++++ schemas/agent-generate-template.json | 16 +++++++ src/commands/agent/generate/template.ts | 62 +++++++++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 messages/agent.generate.template.md create mode 100644 schemas/agent-generate-template.json create mode 100644 src/commands/agent/generate/template.ts diff --git a/command-snapshot.json b/command-snapshot.json index abbf6f3..84f5b7d 100644 --- a/command-snapshot.json +++ b/command-snapshot.json @@ -45,6 +45,14 @@ ], "plugin": "@salesforce/plugin-agent" }, + { + "alias": [], + "command": "agent:generate:template", + "flagAliases": [], + "flagChars": ["d", "o"], + "flags": ["agent-api-name", "api-version", "flags-dir", "json", "output-dir", "target-org"], + "plugin": "@salesforce/plugin-agent" + }, { "alias": [], "command": "agent:generate:test-spec", diff --git a/messages/agent.generate.template.md b/messages/agent.generate.template.md new file mode 100644 index 0000000..db47441 --- /dev/null +++ b/messages/agent.generate.template.md @@ -0,0 +1,21 @@ +# summary + +Generate an agent template for packaging. + +# description + +Generate agent template metadata to for packaging your agent. + +# flags.agent-api-name.summary + +API name of an existing Bot. + +# flags.output-dir.summary + +Directory to write the agent template. + +# examples + +- Generate an agent template from a Bot API name in your default package dir: + + <%= config.bin %> <%= command.id %> --agent-api-name My_Packaged_Agent diff --git a/schemas/agent-generate-template.json b/schemas/agent-generate-template.json new file mode 100644 index 0000000..1c2f00b --- /dev/null +++ b/schemas/agent-generate-template.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$ref": "#/definitions/AgentGenerateTemplateResult", + "definitions": { + "AgentGenerateTemplateResult": { + "type": "object", + "properties": { + "path": { + "type": "string" + } + }, + "required": ["path"], + "additionalProperties": false + } + } +} diff --git a/src/commands/agent/generate/template.ts b/src/commands/agent/generate/template.ts new file mode 100644 index 0000000..e4674c3 --- /dev/null +++ b/src/commands/agent/generate/template.ts @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause + */ + +import { dirname, join, resolve } from 'node:path'; +import { mkdirSync, writeFileSync } from 'node:fs'; +import { SfCommand, Flags } from '@salesforce/sf-plugins-core'; +import { Messages } from '@salesforce/core'; + +Messages.importMessagesDirectoryFromMetaUrl(import.meta.url); +const messages = Messages.loadMessages('@salesforce/plugin-agent', 'agent.generate.template'); + +export type AgentGenerateTemplateResult = { + path: string; +}; + +export default class AgentGenerateTemplate extends SfCommand { + public static readonly summary = messages.getMessage('summary'); + public static readonly description = messages.getMessage('description'); + public static readonly examples = messages.getMessages('examples'); + public static state = 'beta'; + public static readonly requiresProject = true; + + public static readonly flags = { + 'target-org': Flags.requiredOrg(), + 'api-version': Flags.orgApiVersion(), + 'agent-api-name': Flags.string({ + summary: messages.getMessage('flags.agent-api-name.summary'), + required: true, + }), + 'output-dir': Flags.directory({ + char: 'd', + exists: true, + summary: messages.getMessage('flags.output-dir.summary'), + }), + }; + + public async run(): Promise { + const { flags } = await this.parse(AgentGenerateTemplate); + + // TODO: look for a Bot with the agent API name + const botName = flags['agent-api-name']; + const outputDir = flags['output-dir'] ? resolve(flags['output-dir']) : this.project?.getDefaultPackage().fullPath; + + const agentTemplateFilePath = join(outputDir as string, 'agentTemplates', `${botName}.agentTemplate-meta.xml`); + mkdirSync(dirname(agentTemplateFilePath), { recursive: true }); + + writeFileSync(agentTemplateFilePath, xmlContent); + + this.log(`\nSaved agent template: ${agentTemplateFilePath}`); + + return { path: agentTemplateFilePath }; + } +} + +const xmlContent = ` + + +`;