diff --git a/.github/workflows/agentic-auto-upgrade.yml b/.github/workflows/agentic-auto-upgrade.yml index 092498db4fc..fe5b068f2f3 100644 --- a/.github/workflows/agentic-auto-upgrade.yml +++ b/.github/workflows/agentic-auto-upgrade.yml @@ -34,7 +34,7 @@ name: Agentic Auto-Upgrade on: schedule: - - cron: "21 3 * * 5" # Weekly (auto-upgrade) + - cron: "11 4 * * 6" # Weekly (auto-upgrade) workflow_dispatch: permissions: diff --git a/actions/setup/js/parse_pi_log.test.cjs b/actions/setup/js/parse_pi_log.test.cjs index 4011ea78bee..54a32419f79 100644 --- a/actions/setup/js/parse_pi_log.test.cjs +++ b/actions/setup/js/parse_pi_log.test.cjs @@ -245,7 +245,12 @@ describe("parse_pi_log.cjs", () => { it("detects the v3 schema and rejects the legacy schema", () => { expect(isPiV3Schema(v3Lines)).toBe(true); - expect(isPiV3Schema([{ type: "init", model: "pi-3" }, { type: "assistant", content: "hi" }])).toBe(false); + expect( + isPiV3Schema([ + { type: "init", model: "pi-3" }, + { type: "assistant", content: "hi" }, + ]) + ).toBe(false); }); it("renders assistant text, tool calls, and tool results from a v3 stream", () => { diff --git a/docs/src/content/docs/reference/auth.mdx b/docs/src/content/docs/reference/auth.mdx index 6802ac111d1..e7981ec3c21 100644 --- a/docs/src/content/docs/reference/auth.mdx +++ b/docs/src/content/docs/reference/auth.mdx @@ -37,6 +37,12 @@ Configure the authentication method your engine needs before running your first - **Alternative:** None - **Notes:** API key from Google AI Studio +### Antigravity + +- **Required secret:** [`ANTIGRAVITY_API_KEY`](#antigravity_api_key) +- **Alternative:** None +- **Notes:** API key for the Google Antigravity CLI + Most workflows will run without any additional secrets or additional authentication beyond this one engine secret. ## Additional Authentication @@ -339,6 +345,24 @@ See also [AI Engines](/gh-aw/reference/engines/#available-coding-agents) for add --- +### `ANTIGRAVITY_API_KEY` + +If using the Antigravity by Google engine, you need to set a GitHub Actions secret `ANTIGRAVITY_API_KEY` with an API key for the Antigravity CLI. + +**Setup**: + +1. Create an API key at https://aistudio.google.com/api-keys + +2. Add it to your repository secrets, either by CLI or GitHub UI: + + ```bash wrap + gh aw secrets set ANTIGRAVITY_API_KEY --value "YOUR_ANTIGRAVITY_API_KEY" + ``` + +See also [AI Engines](/gh-aw/reference/engines/#available-coding-agents) for additional configuration needed when using Antigravity with GitHub MCP. + +--- + ## Troubleshooting auth errors Common authentication errors and how to resolve them: diff --git a/docs/src/content/docs/reference/engines.md b/docs/src/content/docs/reference/engines.md index 348f36911d1..d716345e8bb 100644 --- a/docs/src/content/docs/reference/engines.md +++ b/docs/src/content/docs/reference/engines.md @@ -1,6 +1,6 @@ --- title: AI Engines (aka Coding Agents) -description: Complete guide to AI engines (coding agents) usable with GitHub Agentic Workflows, including Copilot, Claude, Codex, Gemini, Crush, OpenCode, and Pi with their specific configuration options. +description: Complete guide to AI engines (coding agents) usable with GitHub Agentic Workflows, including Copilot, Claude, Codex, Gemini, Antigravity, Crush, OpenCode, and Pi with their specific configuration options. sidebar: order: 600 --- @@ -17,6 +17,7 @@ Set `engine:` in your workflow frontmatter and configure the corresponding secre | [Claude by Anthropic (Claude Code)](https://www.anthropic.com/index/claude) | `claude` | [`ANTHROPIC_API_KEY`](/gh-aw/reference/auth/#anthropic_api_key) (standard) or [`engine.auth` Anthropic WIF](/gh-aw/reference/auth/#anthropic-workload-identity-federation-wif) (keyless) | | [OpenAI Codex](https://openai.com/blog/openai-codex) | `codex` | [OPENAI_API_KEY](/gh-aw/reference/auth/#openai_api_key) | | [Google Gemini CLI](https://github.com/google-gemini/gemini-cli) | `gemini` | [GEMINI_API_KEY](/gh-aw/reference/auth/#gemini_api_key) | +| [Google Antigravity CLI](https://antigravity.google/docs/cli-overview) (experimental) | `antigravity` | [ANTIGRAVITY_API_KEY](/gh-aw/reference/auth/#antigravity_api_key) | | [Crush](https://github.com/charmbracelet/crush) (experimental) | `crush` | [COPILOT_GITHUB_TOKEN](/gh-aw/reference/auth/#copilot_github_token) | | [OpenCode](https://opencode.ai) (experimental) | `opencode` | [COPILOT_GITHUB_TOKEN](/gh-aw/reference/auth/#copilot_github_token) | | [Pi](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) (experimental) | `pi` | [COPILOT_GITHUB_TOKEN](/gh-aw/reference/auth/#copilot_github_token) (default); switches to provider-specific secret when `model:` uses `provider/model` format | @@ -71,6 +72,7 @@ By default, workflows install the latest available version of each engine CLI. T | Claude Code | `claude` | `"2.1.70"` | | Codex | `codex` | `"0.111.0"` | | Gemini CLI | `gemini` | `"0.31.0"` | +| Antigravity CLI | `antigravity` | `"1.0.2-6113393518706688"` | | Crush | `crush` | `"1.2.14"` | | OpenCode | `opencode` | `"0.1.0"` | | Pi | `pi` | `"0.72.1"` | diff --git a/eslint-factory/src/rules/require-return-after-core-setfailed.ts b/eslint-factory/src/rules/require-return-after-core-setfailed.ts index cf861f4242c..09a8006c946 100644 --- a/eslint-factory/src/rules/require-return-after-core-setfailed.ts +++ b/eslint-factory/src/rules/require-return-after-core-setfailed.ts @@ -353,21 +353,21 @@ export const requireReturnAfterCoreSetFailedRule = createRule({ const ancestors = sourceCode.getAncestors(stmt); const continuation = findContinuationOutsideBlock(stmt, ancestors); if (continuation !== null && !isControlTransfer(continuation)) { - reportNested(stmt); + reportNested(stmt); } } function checkDirectControlBody(stmt: TSESTree.Statement | null): void { if (stmt !== null && stmt.type !== AST_NODE_TYPES.BlockStatement && isCoreSetFailedStatement(stmt)) { - checkNestedContinuation(stmt); + checkNestedContinuation(stmt); } } return { IfStatement(node: TSESTree.IfStatement) { - for (const branch of [node.consequent, node.alternate]) { - checkDirectControlBody(branch); - } + for (const branch of [node.consequent, node.alternate]) { + checkDirectControlBody(branch); + } }, // Check statement blocks: if body, else body, while body, function body, etc. BlockStatement(node: TSESTree.BlockStatement) { diff --git a/pkg/parser/schema_test.go b/pkg/parser/schema_test.go index f9c0680a5fc..a84b6d29949 100644 --- a/pkg/parser/schema_test.go +++ b/pkg/parser/schema_test.go @@ -2096,6 +2096,7 @@ func TestMainWorkflowSchema_GitHubAllowedSupportsToolCallLimits(t *testing.T) { break } } + if githubObjectSchema == nil { t.Fatal("tools.github object schema not found") } @@ -2135,6 +2136,51 @@ func TestMainWorkflowSchema_GitHubAllowedSupportsToolCallLimits(t *testing.T) { } } +func TestMainWorkflowSchema_DocumentsAntigravityEngine(t *testing.T) { + t.Parallel() + + schemaContent, err := os.ReadFile("schemas/main_workflow_schema.json") + if err != nil { + t.Fatalf("failed to read schema: %v", err) + } + + var schema map[string]any + if err := json.Unmarshal(schemaContent, &schema); err != nil { + t.Fatalf("failed to parse schema json: %v", err) + } + + defs := schema["$defs"].(map[string]any) + engineConfig := defs["engine_config"].(map[string]any) + engineConfigOneOf := engineConfig["oneOf"].([]any) + + stringEngineDesc := engineConfigOneOf[0].(map[string]any)["description"].(string) + if !strings.Contains(stringEngineDesc, "antigravity") { + t.Fatalf("expected engine string description to mention antigravity, got: %q", stringEngineDesc) + } + + objectEngineDesc := engineConfigOneOf[1].(map[string]any)["properties"].(map[string]any)["id"].(map[string]any)["description"].(string) + if !strings.Contains(objectEngineDesc, "antigravity") { + t.Fatalf("expected engine.id description to mention antigravity, got: %q", objectEngineDesc) + } + + inlineRuntime := engineConfigOneOf[2].(map[string]any)["properties"].(map[string]any)["runtime"].(map[string]any) + inlineRuntimeID := inlineRuntime["properties"].(map[string]any)["id"].(map[string]any) + inlineRuntimeDesc := inlineRuntimeID["description"].(string) + if !strings.Contains(inlineRuntimeDesc, "antigravity") { + t.Fatalf("expected runtime.id description to mention antigravity, got: %q", inlineRuntimeDesc) + } + + inlineRuntimeExamples := inlineRuntimeID["examples"].([]any) + if inlineRuntimeExamples[0] != "antigravity" { + t.Fatalf("expected runtime.id examples to start with antigravity, got: %v", inlineRuntimeExamples) + } + + engineDefinitionDesc := engineConfigOneOf[3].(map[string]any)["properties"].(map[string]any)["id"].(map[string]any)["description"].(string) + if !strings.Contains(engineDefinitionDesc, "antigravity") { + t.Fatalf("expected engine definition id description to mention antigravity, got: %q", engineDefinitionDesc) + } +} + // TestValidateMainWorkflowFrontmatterWithSchemaAndLocation_AwfApiProxyTargets verifies that // the sandbox.agent.targets frontmatter section is validated by the schema, accepting // valid authHeader strings and rejecting non-string values. diff --git a/pkg/parser/schemas/main_workflow_schema.json b/pkg/parser/schemas/main_workflow_schema.json index 55714a89d1e..9bb13c6cff7 100644 --- a/pkg/parser/schemas/main_workflow_schema.json +++ b/pkg/parser/schemas/main_workflow_schema.json @@ -12146,7 +12146,7 @@ "oneOf": [ { "type": "string", - "description": "Engine name: built-in ('claude', 'codex', 'copilot', 'gemini', 'opencode', 'crush', 'pi') or a named catalog entry" + "description": "Engine name: built-in ('antigravity', 'claude', 'codex', 'copilot', 'crush', 'gemini', 'opencode', 'pi') or a named catalog entry" }, { "type": "object", @@ -12154,7 +12154,7 @@ "properties": { "id": { "type": "string", - "description": "AI engine identifier: built-in ('claude', 'codex', 'copilot', 'gemini', 'opencode', 'crush', 'pi') or a named catalog entry" + "description": "AI engine identifier: built-in ('antigravity', 'claude', 'codex', 'copilot', 'crush', 'gemini', 'opencode', 'pi') or a named catalog entry" }, "version": { "type": ["string", "number"], @@ -12431,8 +12431,8 @@ "properties": { "id": { "type": "string", - "description": "Runtime adapter identifier (e.g. 'codex', 'claude', 'copilot', 'gemini', 'opencode', 'crush', 'pi')", - "examples": ["codex", "claude", "copilot", "gemini", "opencode", "crush", "pi"] + "description": "Runtime adapter identifier (e.g. 'antigravity', 'claude', 'codex', 'copilot', 'crush', 'gemini', 'opencode', 'pi')", + "examples": ["antigravity", "codex", "claude", "copilot", "gemini", "opencode", "crush", "pi"] }, "version": { "type": ["string", "number"], @@ -12553,7 +12553,7 @@ "properties": { "id": { "type": "string", - "description": "Unique engine identifier (e.g. 'copilot', 'claude', 'codex', 'gemini', 'opencode', 'crush', 'pi')" + "description": "Unique engine identifier (e.g. 'antigravity', 'claude', 'codex', 'copilot', 'crush', 'gemini', 'opencode', 'pi')" }, "display-name": { "type": "string",