Skip to content
Merged
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
8 changes: 4 additions & 4 deletions .github/workflows/daily-cli-tools-tester.lock.yml

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

8 changes: 4 additions & 4 deletions .github/workflows/dependabot-project-manager.lock.yml

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

1 change: 1 addition & 0 deletions docs/src/content/docs/agent-factory-status.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ These are experimental agentic workflows used by the GitHub Next team to learn,
| [DeepReport - Intelligence Gathering Agent](https://github.com/github/gh-aw/blob/main/.github/workflows/deep-report.md) | codex | [![DeepReport - Intelligence Gathering Agent](https://github.com/github/gh-aw/actions/workflows/deep-report.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/deep-report.lock.yml) | `0 15 * * 1-5` | - |
| [Delight](https://github.com/github/gh-aw/blob/main/.github/workflows/delight.md) | copilot | [![Delight](https://github.com/github/gh-aw/actions/workflows/delight.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/delight.lock.yml) | - | - |
| [Dependabot Dependency Checker](https://github.com/github/gh-aw/blob/main/.github/workflows/dependabot-go-checker.md) | copilot | [![Dependabot Dependency Checker](https://github.com/github/gh-aw/actions/workflows/dependabot-go-checker.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/dependabot-go-checker.lock.yml) | `0 9 * * 1,3,5` | - |
| [Dependabot Project Manager](https://github.com/github/gh-aw/blob/main/.github/workflows/dependabot-project-manager.md) | copilot | [![Dependabot Project Manager](https://github.com/github/gh-aw/actions/workflows/dependabot-project-manager.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/dependabot-project-manager.lock.yml) | - | - |
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docs page gains a new workflow entry (Dependabot Project Manager), but the PR description doesn’t mention this documentation update. Consider adding it to the PR’s change list (or splitting it) so reviewers understand why this page is being modified alongside the plugin command fix.

Copilot uses AI. Check for mistakes.
| [Dev](https://github.com/github/gh-aw/blob/main/.github/workflows/dev.md) | copilot | [![Dev](https://github.com/github/gh-aw/actions/workflows/dev.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/dev.lock.yml) | - | - |
| [Dev Hawk](https://github.com/github/gh-aw/blob/main/.github/workflows/dev-hawk.md) | copilot | [![Dev Hawk](https://github.com/github/gh-aw/actions/workflows/dev-hawk.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/dev-hawk.lock.yml) | - | - |
| [Developer Documentation Consolidator](https://github.com/github/gh-aw/blob/main/.github/workflows/developer-docs-consolidator.md) | claude | [![Developer Documentation Consolidator](https://github.com/github/gh-aw/actions/workflows/developer-docs-consolidator.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/developer-docs-consolidator.lock.yml) | - | - |
Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/reference/frontmatter.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ See [GitHub Tokens](/gh-aw/reference/tokens/) for complete documentation.

### Plugins (`plugins:`)

Specifies plugins to install before workflow execution. Plugins are installed using engine-specific CLI commands (`copilot install plugin`, `claude install plugin`, `codex install plugin`).
Specifies plugins to install before workflow execution. Plugins are installed using engine-specific CLI commands (`copilot plugin install`, `claude plugin install`, `codex plugin install`).
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The docs state that plugins are installed using claude plugin install and codex plugin install, but the implementation currently includes TODOs indicating those syntaxes haven’t been validated. Either validate and remove the TODOs, or update this documentation to clearly caveat that only the Copilot syntax is confirmed (so users don’t treat Claude/Codex syntax as guaranteed).

Suggested change
Specifies plugins to install before workflow execution. Plugins are installed using engine-specific CLI commands (`copilot plugin install`, `claude plugin install`, `codex plugin install`).
Specifies plugins to install before workflow execution. Plugins are typically installed using engine-specific CLI commands. Currently, only the Copilot syntax (`copilot plugin install`) is validated; Claude (`claude plugin install`) and Codex (`codex plugin install`) syntaxes are experimental and may change—consult the engine’s documentation for the latest supported commands.

Copilot uses AI. Check for mistakes.

**Array format** (simple):
```yaml wrap
Expand Down
26 changes: 13 additions & 13 deletions pkg/workflow/plugin_compilation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ plugins:

Test single plugin installation
`,
expectedPlugins: []string{"copilot install plugin github/test-plugin"},
expectedPlugins: []string{"copilot plugin install github/test-plugin"},
expectedTokenString: "secrets.GH_AW_PLUGINS_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN",
},
{
Expand All @@ -57,9 +57,9 @@ plugins:
Test multiple plugins
`,
expectedPlugins: []string{
"claude install plugin github/plugin1",
"claude install plugin acme/plugin2",
"claude install plugin org/plugin3",
"claude plugin install github/plugin1",
"claude plugin install acme/plugin2",
"claude plugin install org/plugin3",
},
expectedTokenString: "secrets.GH_AW_PLUGINS_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN",
},
Expand All @@ -77,7 +77,7 @@ plugins:

Test Codex plugin
`,
expectedPlugins: []string{"codex install plugin openai/codex-plugin"},
expectedPlugins: []string{"codex plugin install openai/codex-plugin"},
expectedTokenString: "secrets.GH_AW_PLUGINS_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN",
},
}
Expand Down Expand Up @@ -146,8 +146,8 @@ plugins:
Test object format with custom token
`,
expectedPlugins: []string{
"copilot install plugin github/test-plugin",
"copilot install plugin acme/custom-plugin",
"copilot plugin install github/test-plugin",
"copilot plugin install acme/custom-plugin",
},
expectedToken: "GITHUB_TOKEN: ${{ secrets.CUSTOM_PLUGIN_TOKEN }}",
shouldNotContain: "GH_AW_PLUGINS_TOKEN",
Expand All @@ -168,7 +168,7 @@ plugins:
Test object format without custom token
`,
expectedPlugins: []string{
"claude install plugin github/plugin1",
"claude plugin install github/plugin1",
},
expectedToken: "secrets.GH_AW_PLUGINS_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN",
shouldNotContain: "",
Expand Down Expand Up @@ -247,7 +247,7 @@ Test with top-level github-token
lockContent := string(content)

// Verify plugin install command is present
assert.Contains(t, lockContent, "copilot install plugin github/test-plugin",
assert.Contains(t, lockContent, "copilot plugin install github/test-plugin",
"Lock file should contain plugin install command")

// Verify top-level github-token is used (not cascading)
Expand Down Expand Up @@ -358,9 +358,9 @@ func TestPluginCompilationAllEngines(t *testing.T) {
engineID string
expectedCmd string
}{
{"copilot", "copilot install plugin github/test-plugin"},
{"claude", "claude install plugin github/test-plugin"},
{"codex", "codex install plugin github/test-plugin"},
{"copilot", "copilot plugin install github/test-plugin"},
{"claude", "claude plugin install github/test-plugin"},
{"codex", "codex plugin install github/test-plugin"},
}

for _, engine := range engines {
Expand Down Expand Up @@ -440,7 +440,7 @@ Test without plugins
lockContent := string(content)

// Verify no plugin installation steps are present
assert.NotContains(t, lockContent, "install plugin",
assert.NotContains(t, lockContent, "plugin install",
"Lock file should not contain plugin installation when no plugins specified")
}

Expand Down
10 changes: 6 additions & 4 deletions pkg/workflow/plugin_installation.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,16 @@ func generatePluginInstallStep(plugin, engineID, githubToken string) GitHubActio
var command string
switch engineID {
case "copilot":
command = fmt.Sprintf("copilot install plugin %s", plugin)
command = fmt.Sprintf("copilot plugin install %s", plugin)
case "claude":
command = fmt.Sprintf("claude install plugin %s", plugin)
// TODO: validate the correct claude CLI plugin install command syntax
command = fmt.Sprintf("claude plugin install %s", plugin)
case "codex":
command = fmt.Sprintf("codex install plugin %s", plugin)
// TODO: validate the correct codex CLI plugin install command syntax
command = fmt.Sprintf("codex plugin install %s", plugin)
default:
// For unknown engines, use a generic format
command = fmt.Sprintf("%s install plugin %s", engineID, plugin)
command = fmt.Sprintf("%s plugin install %s", engineID, plugin)
}

// Quote the step name to avoid YAML syntax issues with special characters
Expand Down
12 changes: 6 additions & 6 deletions pkg/workflow/plugin_installation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func TestGeneratePluginInstallationSteps(t *testing.T) {
engineID: "copilot",
githubToken: "${{ secrets.CUSTOM_TOKEN }}",
expectSteps: 1,
expectCmds: []string{"copilot install plugin github/test-plugin"},
expectCmds: []string{"copilot plugin install github/test-plugin"},
expectTokens: []string{"${{ secrets.CUSTOM_TOKEN }}"},
},
{
Expand All @@ -45,8 +45,8 @@ func TestGeneratePluginInstallationSteps(t *testing.T) {
githubToken: "${{ secrets.CUSTOM_TOKEN }}",
expectSteps: 2,
expectCmds: []string{
"claude install plugin github/plugin1",
"claude install plugin acme/plugin2",
"claude plugin install github/plugin1",
"claude plugin install acme/plugin2",
},
expectTokens: []string{
"${{ secrets.CUSTOM_TOKEN }}",
Expand All @@ -59,7 +59,7 @@ func TestGeneratePluginInstallationSteps(t *testing.T) {
engineID: "codex",
githubToken: "",
expectSteps: 1,
expectCmds: []string{"codex install plugin org/codex-plugin"},
expectCmds: []string{"codex plugin install org/codex-plugin"},
expectTokens: []string{"${{ secrets.GH_AW_PLUGINS_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}"}, // Cascading fallback
},
}
Expand Down Expand Up @@ -203,7 +203,7 @@ func TestPluginInstallationIntegration(t *testing.T) {
}

// Verify plugin installation step is present
assert.Contains(t, allStepsText, fmt.Sprintf("%s install plugin github/test-plugin", e.engineID),
assert.Contains(t, allStepsText, fmt.Sprintf("%s plugin install github/test-plugin", e.engineID),
"Installation steps should include plugin installation command")

// Verify GITHUB_TOKEN is set
Expand Down Expand Up @@ -278,7 +278,7 @@ func TestPluginObjectFormatWithCustomToken(t *testing.T) {
}

// Verify plugin installation step is present
assert.Contains(t, allStepsText, fmt.Sprintf("%s install plugin github/test-plugin", e.engineID),
assert.Contains(t, allStepsText, fmt.Sprintf("%s plugin install github/test-plugin", e.engineID),
"Installation steps should include plugin installation command")

// Verify custom token is used (not the cascading fallback)
Expand Down
Loading