Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
29fa832
feat(cli): add Goose to AGENT_CONFIG
furkankoykiran Mar 28, 2026
79bdc39
feat(agents): add Goose to CommandRegistrar.AGENT_CONFIGS
furkankoykiran Mar 28, 2026
b8fc3d9
feat(scripts): add Goose to bash release package generation
furkankoykiran Mar 28, 2026
57da3d4
feat(scripts): add Goose to PowerShell release package generation
furkankoykiran Mar 28, 2026
5b4d283
feat(scripts): add Goose to bash agent context update script
furkankoykiran Mar 28, 2026
2c7c3ba
feat(scripts): add Goose to PowerShell agent context update script
furkankoykiran Mar 28, 2026
0edef9d
docs(readme): add Goose to supported AI agents table
furkankoykiran Mar 28, 2026
fdf9e15
docs(agents): add Goose to AGENTS.md documentation
furkankoykiran Mar 28, 2026
7ff5780
test(agents): add Goose consistency tests
furkankoykiran Mar 28, 2026
5148bc4
fix(scripts): improve YAML output formatting for Goose recipes
furkankoykiran Mar 30, 2026
9430815
feat(scripts): enhance Goose recipe YAML generation with structured m…
furkankoykiran Mar 30, 2026
3d13436
fix(agents): add YAML format support and update test assertion
furkankoykiran Mar 30, 2026
969aa84
fix(scripts): replace broken sed title case with portable awk
furkankoykiran Mar 31, 2026
90d1ebd
fix(scripts): add goose to usage header AGENTS list
furkankoykiran Mar 31, 2026
63247d7
merge: sync with upstream/main
furkankoykiran Apr 1, 2026
cdc1017
fix(agents): add title fallback chain to render_yaml_command
furkankoykiran Apr 1, 2026
7354c95
fix(scripts): scope indented_body as local and replace $ARGUMENTS in …
furkankoykiran Apr 1, 2026
31fc244
fix(scripts): replace $ARGUMENTS placeholder in PowerShell YAML output
furkankoykiran Apr 1, 2026
0a7c43c
Update README.md
mnriem Apr 1, 2026
9c69bf5
fix(scripts): move GOOSE_FILE outside .goose/recipes in bash script
furkankoykiran Apr 1, 2026
55bfb63
fix(scripts): move GOOSE_FILE outside .goose/recipes in PowerShell sc…
furkankoykiran Apr 1, 2026
99a66ea
fix(agents): handle speckit. prefix and dot separators in title deriv…
furkankoykiran Apr 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions .github/workflows/scripts/create-release-packages.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

.PARAMETER Agents
Comma or space separated subset of agents to build (default: all)
Valid agents: claude, gemini, copilot, cursor-agent, qwen, opencode, windsurf, junie, codex, kilocode, auggie, roo, codebuddy, amp, kiro-cli, bob, qodercli, shai, tabnine, agy, vibe, kimi, trae, pi, iflow, generic
Valid agents: claude, gemini, copilot, cursor-agent, qwen, opencode, windsurf, junie, codex, kilocode, auggie, roo, codebuddy, amp, kiro-cli, bob, qodercli, shai, tabnine, agy, vibe, kimi, trae, pi, iflow, goose, generic

.PARAMETER Scripts
Comma or space separated subset of script types to build (default: both)
Expand Down Expand Up @@ -174,6 +174,29 @@ function Generate-Commands {
'agent.md' {
Set-Content -Path $outputFile -Value $body -NoNewline
}
'yaml' {
# Generate Goose recipe format YAML
$title = (Get-Culture).TextInfo.ToTitleCase($name)
$output = @"
version: 1.0.0
title: "$title"
description: "$description"
author:
contact: "spec-kit"
extensions:
- type: builtin
name: developer
activities:
- "Spec-Driven Development"
prompt: |
"@
# Replace $ARGUMENTS placeholder with configured ArgFormat for Goose YAML recipes
$bodyWithArgs = $body.Replace('$ARGUMENTS', $ArgFormat)
# Indent each line of body for proper YAML block scalar formatting
$indentedBody = $bodyWithArgs -split "`n" | ForEach-Object { " $_" } | Join-String -Separator "`n"
$output += "`n$indentedBody"
Set-Content -Path $outputFile -Value $output -NoNewline
}
}
}
}
Expand Down Expand Up @@ -477,6 +500,10 @@ function Build-Variant {
$cmdDir = Join-Path $baseDir ".iflow/commands"
Generate-Commands -Agent 'iflow' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $cmdDir -ScriptVariant $Script
}
'goose' {
$cmdDir = Join-Path $baseDir ".goose/recipes"
Generate-Commands -Agent 'goose' -Extension 'yaml' -ArgFormat '{{args}}' -OutputDir $cmdDir -ScriptVariant $Script
}
'generic' {
$cmdDir = Join-Path $baseDir ".speckit/commands"
Generate-Commands -Agent 'generic' -Extension 'md' -ArgFormat '$ARGUMENTS' -OutputDir $cmdDir -ScriptVariant $Script
Expand All @@ -493,7 +520,7 @@ function Build-Variant {
}

# Define all agents and scripts
$AllAgents = @('claude', 'gemini', 'copilot', 'cursor-agent', 'qwen', 'opencode', 'windsurf', 'junie', 'codex', 'kilocode', 'auggie', 'roo', 'codebuddy', 'amp', 'kiro-cli', 'bob', 'qodercli', 'shai', 'tabnine', 'agy', 'vibe', 'kimi', 'trae', 'pi', 'iflow', 'generic')
$AllAgents = @('claude', 'gemini', 'copilot', 'cursor-agent', 'qwen', 'opencode', 'windsurf', 'junie', 'codex', 'kilocode', 'auggie', 'roo', 'codebuddy', 'amp', 'kiro-cli', 'bob', 'qodercli', 'shai', 'tabnine', 'agy', 'vibe', 'kimi', 'trae', 'pi', 'iflow', 'goose', 'generic')
$AllScripts = @('sh', 'ps')

function Normalize-List {
Expand Down
32 changes: 30 additions & 2 deletions .github/workflows/scripts/create-release-packages.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ set -euo pipefail
# Usage: .github/workflows/scripts/create-release-packages.sh <version>
# Version argument should include leading 'v'.
# Optionally set AGENTS and/or SCRIPTS env vars to limit what gets built.
# AGENTS : space or comma separated subset of: claude gemini copilot cursor-agent qwen opencode windsurf junie codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae pi iflow generic (default: all)
# AGENTS : space or comma separated subset of: claude gemini copilot cursor-agent qwen opencode windsurf junie codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae pi iflow goose generic (default: all)
# SCRIPTS : space or comma separated subset of: sh ps (default: both)
# Examples:
# AGENTS=claude SCRIPTS=sh $0 v0.2.0
Expand Down Expand Up @@ -116,6 +116,31 @@ generate_commands() {
echo "$body" > "$output_dir/speckit.$name.$ext" ;;
agent.md)
echo "$body" > "$output_dir/speckit.$name.$ext" ;;
yaml)
# Generate Goose recipe format YAML
local title
# Use awk for reliable title casing (sed \b is not portable)
title=$(echo "$name" | tr '_-' ' ' | awk '{for (i=1; i<=NF; i++) $i=toupper(substr($i,1,1)) substr($i,2)}1')
# Replace $ARGUMENTS placeholder with configured arg_format for Goose recipes
body=$(printf '%s\n' "$body" | sed "s/\\\$ARGUMENTS/$arg_format/g")
# Indent every line of body for valid YAML block scalar syntax
local indented_body
indented_body=$(printf '%s\n' "$body" | sed 's/^/ /')
cat > "$output_dir/speckit.$name.$ext" <<YAML_EOF
version: 1.0.0
title: "$title"
description: "$description"
author:
contact: "spec-kit"
extensions:
- type: builtin
name: developer
activities:
- "Spec-Driven Development"
prompt: |
${indented_body}
YAML_EOF
;;
esac
done
}
Expand Down Expand Up @@ -330,6 +355,9 @@ build_variant() {
iflow)
mkdir -p "$base_dir/.iflow/commands"
generate_commands iflow md "\$ARGUMENTS" "$base_dir/.iflow/commands" "$script" ;;
goose)
mkdir -p "$base_dir/.goose/recipes"
generate_commands goose yaml "{{args}}" "$base_dir/.goose/recipes" "$script" ;;
generic)
mkdir -p "$base_dir/.speckit/commands"
generate_commands generic md "\$ARGUMENTS" "$base_dir/.speckit/commands" "$script" ;;
Expand All @@ -339,7 +367,7 @@ build_variant() {
}

# Determine agent list
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf junie codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae pi iflow generic)
ALL_AGENTS=(claude gemini copilot cursor-agent qwen opencode windsurf junie codex kilocode auggie roo codebuddy amp shai tabnine kiro-cli agy bob vibe qodercli kimi trae pi iflow goose generic)
ALL_SCRIPTS=(sh ps)

validate_subset() {
Expand Down
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ Specify supports multiple AI agents by generating agent-specific command files a
| **Kimi Code** | `.kimi/skills/` | Markdown | `kimi` | Kimi Code CLI (Moonshot AI) |
| **Pi Coding Agent** | `.pi/prompts/` | Markdown | `pi` | Pi terminal coding agent |
| **iFlow CLI** | `.iflow/commands/` | Markdown | `iflow` | iFlow CLI (iflow-ai) |
| **Goose** | `.goose/recipes/` | YAML | `goose` | Block's open source AI agent with slash command support |
| **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE |
| **Trae** | `.trae/rules/` | Markdown | N/A (IDE-based) | Trae IDE |
| **Antigravity** | `.agent/commands/` | Markdown | N/A (IDE-based) | Antigravity IDE (`--ai agy --ai-skills`) |
Expand Down Expand Up @@ -333,6 +334,7 @@ Require a command-line tool to be installed:
- **Mistral Vibe**: `vibe` CLI
- **Pi Coding Agent**: `pi` CLI
- **iFlow CLI**: `iflow` CLI
- **Goose**: `goose` CLI

### IDE-Based Agents

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ Community projects that extend, visualize, or build on Spec Kit:
| [Junie](https://junie.jetbrains.com/) | ✅ | |
| [Antigravity (agy)](https://antigravity.google/) | ✅ | Requires `--ai-skills` |
| [Trae](https://www.trae.ai/) | ✅ | |
| [Goose](https://block.github.io/goose/) | ✅ | Uses YAML recipe format in `.goose/recipes/` with slash command support |
| Generic | ✅ | Bring your own agent — use `--ai generic --ai-commands-dir <path>` for unsupported agents |

## 🔧 Specify CLI Reference
Expand Down
11 changes: 8 additions & 3 deletions scripts/bash/update-agent-context.sh
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
# - Creates default Claude file if no agent files exist
#
# Usage: ./update-agent-context.sh [agent_type]
# Agent types: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|generic
# Agent types: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|goose|generic
# Leave empty to update all existing agent files

set -e
Expand Down Expand Up @@ -86,6 +86,7 @@ VIBE_FILE="$REPO_ROOT/.vibe/agents/specify-agents.md"
KIMI_FILE="$REPO_ROOT/KIMI.md"
TRAE_FILE="$REPO_ROOT/.trae/rules/AGENTS.md"
IFLOW_FILE="$REPO_ROOT/IFLOW.md"
GOOSE_FILE="$REPO_ROOT/.goose/AGENTS.md"

# Template file
TEMPLATE_FILE="$REPO_ROOT/.specify/templates/agent-file-template.md"
Expand Down Expand Up @@ -690,12 +691,15 @@ update_specific_agent() {
iflow)
update_agent_file "$IFLOW_FILE" "iFlow CLI" || return 1
;;
goose)
update_agent_file "$GOOSE_FILE" "Goose" || return 1
;;
generic)
log_info "Generic agent: no predefined context file. Use the agent-specific update script for your agent."
;;
*)
log_error "Unknown agent type '$agent_type'"
log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|generic"
log_error "Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|goose|generic"
exit 1
;;
esac
Expand Down Expand Up @@ -757,6 +761,7 @@ update_all_existing_agents() {
_update_if_new "$KIMI_FILE" "Kimi Code" || _all_ok=false
_update_if_new "$TRAE_FILE" "Trae" || _all_ok=false
_update_if_new "$IFLOW_FILE" "iFlow CLI" || _all_ok=false
_update_if_new "$GOOSE_FILE" "Goose" || _all_ok=false

# If no agent files exist, create a default Claude file
if [[ "$_found_agent" == false ]]; then
Expand All @@ -783,7 +788,7 @@ print_summary() {
fi

echo
log_info "Usage: $0 [claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|generic]"
log_info "Usage: $0 [claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|goose|generic]"
}

#==============================================================================
Expand Down
11 changes: 7 additions & 4 deletions scripts/powershell/update-agent-context.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Mirrors the behavior of scripts/bash/update-agent-context.sh:
2. Plan Data Extraction
3. Agent File Management (create from template or update existing)
4. Content Generation (technology stack, recent changes, timestamp)
5. Multi-Agent Support (claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, junie, kilocode, auggie, roo, codebuddy, amp, shai, tabnine, kiro-cli, agy, bob, vibe, qodercli, kimi, trae, pi, iflow, generic)
5. Multi-Agent Support (claude, gemini, copilot, cursor-agent, qwen, opencode, codex, windsurf, junie, kilocode, auggie, roo, codebuddy, amp, shai, tabnine, kiro-cli, agy, bob, vibe, qodercli, kimi, trae, pi, iflow, goose, generic)

.PARAMETER AgentType
Optional agent key to update a single agent. If omitted, updates all existing agent files (creating a default Claude file if none exist).
Expand All @@ -25,7 +25,7 @@ Relies on common helper functions in common.ps1
#>
param(
[Parameter(Position=0)]
[ValidateSet('claude','gemini','copilot','cursor-agent','qwen','opencode','codex','windsurf','junie','kilocode','auggie','roo','codebuddy','amp','shai','tabnine','kiro-cli','agy','bob','qodercli','vibe','kimi','trae','pi','iflow','generic')]
[ValidateSet('claude','gemini','copilot','cursor-agent','qwen','opencode','codex','windsurf','junie','kilocode','auggie','roo','codebuddy','amp','shai','tabnine','kiro-cli','agy','bob','qodercli','vibe','kimi','trae','pi','iflow','goose','generic')]
[string]$AgentType
)

Expand Down Expand Up @@ -67,6 +67,7 @@ $VIBE_FILE = Join-Path $REPO_ROOT '.vibe/agents/specify-agents.md'
$KIMI_FILE = Join-Path $REPO_ROOT 'KIMI.md'
$TRAE_FILE = Join-Path $REPO_ROOT '.trae/rules/AGENTS.md'
$IFLOW_FILE = Join-Path $REPO_ROOT 'IFLOW.md'
$GOOSE_FILE = Join-Path $REPO_ROOT '.goose/AGENTS.md'

$TEMPLATE_FILE = Join-Path $REPO_ROOT '.specify/templates/agent-file-template.md'

Expand Down Expand Up @@ -415,8 +416,9 @@ function Update-SpecificAgent {
'trae' { Update-AgentFile -TargetFile $TRAE_FILE -AgentName 'Trae' }
'pi' { Update-AgentFile -TargetFile $AGENTS_FILE -AgentName 'Pi Coding Agent' }
'iflow' { Update-AgentFile -TargetFile $IFLOW_FILE -AgentName 'iFlow CLI' }
'goose' { Update-AgentFile -TargetFile $GOOSE_FILE -AgentName 'Goose' }
'generic' { Write-Info 'Generic agent: no predefined context file. Use the agent-specific update script for your agent.' }
default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|generic'; return $false }
default { Write-Err "Unknown agent type '$Type'"; Write-Err 'Expected: claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|goose|generic'; return $false }
}
}

Expand Down Expand Up @@ -445,6 +447,7 @@ function Update-AllExistingAgents {
if (Test-Path $KIMI_FILE) { if (-not (Update-AgentFile -TargetFile $KIMI_FILE -AgentName 'Kimi Code')) { $ok = $false }; $found = $true }
if (Test-Path $TRAE_FILE) { if (-not (Update-AgentFile -TargetFile $TRAE_FILE -AgentName 'Trae')) { $ok = $false }; $found = $true }
if (Test-Path $IFLOW_FILE) { if (-not (Update-AgentFile -TargetFile $IFLOW_FILE -AgentName 'iFlow CLI')) { $ok = $false }; $found = $true }
if (Test-Path $GOOSE_FILE) { if (-not (Update-AgentFile -TargetFile $GOOSE_FILE -AgentName 'Goose')) { $ok = $false }; $found = $true }
if (-not $found) {
Write-Info 'No existing agent files found, creating default Claude file...'
if (-not (Update-AgentFile -TargetFile $CLAUDE_FILE -AgentName 'Claude Code')) { $ok = $false }
Expand All @@ -459,7 +462,7 @@ function Print-Summary {
if ($NEW_FRAMEWORK) { Write-Host " - Added framework: $NEW_FRAMEWORK" }
if ($NEW_DB -and $NEW_DB -ne 'N/A') { Write-Host " - Added database: $NEW_DB" }
Write-Host ''
Write-Info 'Usage: ./update-agent-context.ps1 [-AgentType claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|generic]'
Write-Info 'Usage: ./update-agent-context.ps1 [-AgentType claude|gemini|copilot|cursor-agent|qwen|opencode|codex|windsurf|junie|kilocode|auggie|roo|codebuddy|amp|shai|tabnine|kiro-cli|agy|bob|vibe|qodercli|kimi|trae|pi|iflow|goose|generic]'
}

function Main {
Expand Down
7 changes: 7 additions & 0 deletions src/specify_cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,13 @@ def _format_rate_limit_error(status_code: int, headers: httpx.Headers, url: str)
"install_url": "https://docs.iflow.cn/en/cli/quickstart",
"requires_cli": True,
},
"goose": {
"name": "Goose",
"folder": ".goose/",
"commands_subdir": "recipes",
"install_url": "https://block.github.io/goose/docs/getting-started/installation",
"requires_cli": True,
},
"generic": {
"name": "Generic (bring your own agent)",
"folder": None, # Set dynamically via --ai-commands-dir
Expand Down
89 changes: 89 additions & 0 deletions src/specify_cli/agents.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,12 @@ class CommandRegistrar:
"format": "markdown",
"args": "$ARGUMENTS",
"extension": ".md"
},
"goose": {
"dir": ".goose/recipes",
"format": "yaml",
"args": "{{args}}",
"extension": ".yaml"
}
}

Expand Down Expand Up @@ -329,6 +335,87 @@ def render_toml_command(

return "\n".join(toml_lines)

def render_yaml_command(
self,
frontmatter: dict,
body: str,
source_id: str,
cmd_name: str = ""
) -> str:
"""Render command in YAML format for Goose recipes.

Args:
frontmatter: Command frontmatter
body: Command body content
source_id: Source identifier (extension or preset ID)
cmd_name: Command name used as title fallback

Returns:
Formatted YAML recipe file content
"""
def _human_title_from_identifier(identifier: Any) -> str:
text = str(identifier)
if text.startswith("speckit."):
text = text[len("speckit."):]
return text.replace(".", " ").replace("-", " ").replace("_", " ").title()

# Get title from frontmatter or generate from available identifiers
title = frontmatter.get("title", "")

# Prefer explicit name if title is missing
if not title and "name" in frontmatter and frontmatter["name"]:
title = _human_title_from_identifier(frontmatter["name"])

# Fallback to cmd_name passed from register_commands()
if not title and cmd_name:
title = _human_title_from_identifier(cmd_name)

# Final fallback: derive a title from source_id
if not title and source_id:
source_stem = Path(str(source_id)).stem
title = (
_human_title_from_identifier(source_stem)
if source_stem
else _human_title_from_identifier(source_id)
)

if not title:
title = "Command"

description = frontmatter.get("description", "")

# Build YAML structure following Goose recipe schema
# Use yaml.safe_dump() for proper escaping of title and description
header_dict = {
"version": "1.0.0",
"title": title,
"description": description,
"author": {"contact": "spec-kit"},
"extensions": [{"type": "builtin", "name": "developer"}],
"activities": ["Spec-Driven Development"],
}

# Dump header with proper escaping and consistent formatting
header_yaml = yaml.safe_dump(
header_dict,
sort_keys=False,
allow_unicode=True,
default_flow_style=False,
).strip()

# Build the final YAML with literal block scalar for prompt
lines = [header_yaml, "prompt: |"]

# Indent each line of body for proper YAML block scalar formatting
for line in body.split("\n"):
lines.append(f" {line}")

# Add source comment at the end
lines.append("")
lines.append(f"# Source: {source_id}")

return "\n".join(lines)

def render_skill_command(
self,
agent_name: str,
Expand Down Expand Up @@ -511,6 +598,8 @@ def register_commands(
output = self.render_markdown_command(frontmatter, body, source_id, context_note)
elif agent_config["format"] == "toml":
output = self.render_toml_command(frontmatter, body, source_id)
elif agent_config["format"] == "yaml":
output = self.render_yaml_command(frontmatter, body, source_id, cmd_name)
else:
raise ValueError(f"Unsupported format: {agent_config['format']}")

Expand Down
Loading
Loading