Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions .changeset/patch-add-explanatory-output-style-plugin.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions .changeset/patch-explanatory-output-style-plugin.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 7 additions & 2 deletions .github/workflows/smoke-claude.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions .github/workflows/smoke-claude.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ name: Smoke Claude
engine:
id: claude
max-turns: 15
plugins:
- anthropics/claude-code/plugins/explanatory-output-style
strict: true
imports:
- shared/mood.md
Expand Down
11 changes: 8 additions & 3 deletions .github/workflows/smoke-copilot.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions .github/workflows/smoke-copilot.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ permissions:
actions: read
name: Smoke Copilot
engine: copilot
plugins:
- anthropics/claude-code/plugins/explanatory-output-style
imports:
- shared/mood.md
- shared/gh.md
Expand Down
11 changes: 8 additions & 3 deletions .github/workflows/smoke-test-tools.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions .github/workflows/smoke-test-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ permissions:
pull-requests: read
name: Agent Container Smoke Test
engine: copilot
plugins:
- anthropics/claude-code/plugins/explanatory-output-style
strict: true
runtimes:
node:
Expand Down
9 changes: 8 additions & 1 deletion docs/src/content/docs/reference/frontmatter.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ Specifies plugins to install before workflow execution. Plugins are installed us
plugins:
- github/test-plugin
- acme/custom-tools
- anthropics/claude-code/plugins/explanatory-output-style
```

**Object format** (with custom token):
Expand All @@ -118,14 +119,20 @@ plugins:
github-token: ${{ secrets.CUSTOM_PLUGIN_TOKEN }}
```

**Plugin identifier formats:**
- **GitHub repository**: `org/repo` (e.g., `github/test-plugin`)
- **Sub-plugin path**: `org/repo/path/to/plugin` (e.g., `anthropics/claude-code/plugins/explanatory-output-style`)

**Note**: The plugin format must be compatible with the engine's CLI `plugin install` command. Currently, GitHub repository paths (with optional sub-paths) are the standard format supported across engines.

**Token precedence** for plugin installation (highest to lowest):
1. Custom `plugins.github-token` from object format
2. Custom top-level `github-token`
3. `${{ secrets.GH_AW_PLUGINS_TOKEN }}`
4. `${{ secrets.GH_AW_GITHUB_TOKEN }}`
5. `${{ secrets.GITHUB_TOKEN }}` (default)

Each plugin repository must be specified in `org/repo` format. The compiler generates installation steps that run after the engine CLI is installed but before workflow execution begins.
The compiler generates installation steps that run after the engine CLI is installed but before workflow execution begins.

### Runtimes (`runtimes:`)

Expand Down
19 changes: 10 additions & 9 deletions pkg/parser/schemas/main_workflow_schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -2483,9 +2483,10 @@
]
},
"plugins": {
"description": "Plugin configuration for installing plugins before workflow execution. Supports array format (list of repos/plugin configs) and object format (repos + custom token).",
"description": "Plugin configuration for installing plugins before workflow execution. Supports array format (list of repos/plugin configs) and object format (repos + custom token). Plugin paths can include sub-paths to specific plugins within a repository (e.g., 'anthropics/claude-code/plugins/explanatory-output-style').",
"examples": [
["github/copilot-plugin", "acme/custom-tools"],
["anthropics/claude-code/plugins/explanatory-output-style"],
[
"github/simple-plugin",
{
Expand All @@ -2510,8 +2511,8 @@
"oneOf": [
{
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Plugin repository slug in the format 'org/repo' (e.g., 'github/example-plugin')"
"pattern": "^([a-zA-Z0-9_-]+(/[a-zA-Z0-9_-]+)+|[a-zA-Z0-9_-]+)(@[a-zA-Z0-9_-]+)?$",
"description": "Plugin identifier in GitHub repository format: 'org/repo' or 'org/repo/path/to/plugin' (e.g., 'github/example-plugin', 'anthropics/claude-code/plugins/explanatory-output-style'). The pattern allows @marketplace syntax for potential future support, but current engines only support GitHub repository paths."
},
{
"type": "object",
Expand All @@ -2520,8 +2521,8 @@
"properties": {
"id": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Plugin repository slug in the format 'org/repo' (e.g., 'github/example-plugin')"
"pattern": "^([a-zA-Z0-9_-]+(/[a-zA-Z0-9_-]+)+|[a-zA-Z0-9_-]+)(@[a-zA-Z0-9_-]+)?$",
"description": "Plugin repository slug in GitHub repository format: 'org/repo' or 'org/repo/path/to/plugin' (e.g., 'github/example-plugin', 'anthropics/claude-code/plugins/explanatory-output-style')"
},
"mcp": {
"type": "object",
Expand Down Expand Up @@ -2561,8 +2562,8 @@
"oneOf": [
{
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Plugin repository slug in the format 'org/repo' (e.g., 'github/example-plugin')"
"pattern": "^([a-zA-Z0-9_-]+(/[a-zA-Z0-9_-]+)+|[a-zA-Z0-9_-]+)(@[a-zA-Z0-9_-]+)?$",
"description": "Plugin identifier in GitHub repository format: 'org/repo' or 'org/repo/path/to/plugin' (e.g., 'github/example-plugin', 'anthropics/claude-code/plugins/explanatory-output-style'). The pattern allows @marketplace syntax for potential future support, but current engines only support GitHub repository paths."
},
{
"type": "object",
Expand All @@ -2571,8 +2572,8 @@
"properties": {
"id": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+$",
"description": "Plugin repository slug in the format 'org/repo' (e.g., 'github/example-plugin')"
"pattern": "^([a-zA-Z0-9_-]+(/[a-zA-Z0-9_-]+)+|[a-zA-Z0-9_-]+)(@[a-zA-Z0-9_-]+)?$",
"description": "Plugin repository slug in the format 'org/repo', 'org/repo/path/to/plugin', 'plugin-name@marketplace', or 'org/repo@marketplace' (e.g., 'github/example-plugin', 'anthropics/claude-code/plugins/explanatory-output-style')"
},
"mcp": {
"type": "object",
Expand Down
9 changes: 9 additions & 0 deletions pkg/workflow/agentic_engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ type CapabilityProvider interface {
// SupportsFirewall returns true if this engine supports network firewalling/sandboxing
// When true, the engine can enforce network restrictions defined in the workflow
SupportsFirewall() bool

// SupportsPlugins returns true if this engine supports plugin installation
// When true, plugins can be installed using the engine's plugin install command
SupportsPlugins() bool
}

// WorkflowExecutor handles workflow compilation and execution
Expand Down Expand Up @@ -199,6 +203,7 @@ type BaseEngine struct {
supportsWebFetch bool
supportsWebSearch bool
supportsFirewall bool
supportsPlugins bool
}

func (e *BaseEngine) GetID() string {
Expand Down Expand Up @@ -241,6 +246,10 @@ func (e *BaseEngine) SupportsFirewall() bool {
return e.supportsFirewall
}

func (e *BaseEngine) SupportsPlugins() bool {
return e.supportsPlugins
}

// GetDeclaredOutputFiles returns an empty list by default (engines can override)
func (e *BaseEngine) GetDeclaredOutputFiles() []string {
return []string{}
Expand Down
11 changes: 6 additions & 5 deletions pkg/workflow/claude_engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@ func NewClaudeEngine() *ClaudeEngine {
description: "Uses Claude Code with full MCP tool support and allow-listing",
experimental: false,
supportsToolsAllowlist: true,
supportsHTTPTransport: true, // Claude supports both stdio and HTTP transport
supportsMaxTurns: true, // Claude supports max-turns feature
supportsWebFetch: true, // Claude has built-in WebFetch support
supportsWebSearch: true, // Claude has built-in WebSearch support
supportsFirewall: true, // Claude supports network firewalling via AWF
supportsHTTPTransport: true, // Claude supports both stdio and HTTP transport
supportsMaxTurns: true, // Claude supports max-turns feature
supportsWebFetch: true, // Claude has built-in WebFetch support
supportsWebSearch: true, // Claude has built-in WebSearch support
supportsFirewall: true, // Claude supports network firewalling via AWF
supportsPlugins: true, // Claude supports plugin installation
},
}
}
Expand Down
Loading