Skip to content

Run the Claude engine in GitHub Actions #104

Description

@charlesgreen

The local half of #95 shipped in #102: engine: claude no longer demands Azure credentials it never uses, and codex.WriteConfig is gated on the same condition. A local CLI run can use Claude today.

The hosted path still cannot, and that half could not ship in the same pull request. It needs a change under .github/workflows/, and the App holds no workflows permission by design, so the agent cannot push it. This is human work, or a local CLI run merged the usual way.

What is missing

The reusable workflow installs the Codex CLI unconditionally, in both jobs, and declares azure-openai-endpoint and azure-openai-api-key as required. A caller selecting Claude still has to supply Azure credentials to satisfy the workflow contract, and the CLI it needs is never installed.

Work

  1. Add an engine input to the reusable workflow, defaulting to codex so no existing caller changes.
  2. Install the CLI the selected engine needs, rather than always the Codex one.
  3. Make the Azure input and secret conditional on the engine, and add an anthropic-api-key secret for the Claude path. This is the part worth thinking about rather than typing: workflow_call secrets cannot be conditionally required, so either both become optional and the CLI enforces the pairing, or the engines get separate jobs.
  4. Decide what the Claude path authenticates with. The adapter deliberately inherits whatever the claude CLI is already configured with, which suits a developer machine and means nothing on a fresh runner.
  5. Say in docs/setup.md which engines the hosted path supports, replacing the note added in Closes #95: engine: claude is selectable but cannot actually be used #102 that it is Codex-only.

Acceptance

  • A caller passing engine: claude and an Anthropic credential gets a pull request from GitHub Actions, with no Azure variables set anywhere.
  • A caller passing nothing still runs Codex on Azure exactly as it does today.
  • The sandbox question is settled either way: the Claude adapter does not use bubblewrap, so The issue-to-PR loop has never completed a run in GitHub Actions #99 does not apply to it, and that is worth confirming rather than assuming.

Activity

  1. charlesgreen commented on Aug 2, 2026

    @charlesgreen
    ContributorAuthor

    Open questions before this can be implemented

    I worked through the adopter-correctness set while you were away and stopped here deliberately. This issue names two decisions in its own body, and both are product calls rather than implementation details, so guessing would mean shipping a shape you did not choose.

    1. What does the Claude path authenticate with?

    Item 4 says the adapter "deliberately inherits whatever the claude CLI is already configured with, which suits a developer machine and means nothing on a fresh runner." So the hosted path needs a credential the local path does not have, and the choice is not obvious:

    • an Anthropic API key as a repository secret, symmetric with the Azure path, or
    • something else you have in mind for how a customer pays for Claude usage

    The second is the reason I did not pick: it is a commercial decision, not a technical one.

    2. Both secrets optional, or separate jobs?

    Item 3 already frames it: workflow_call secrets cannot be conditionally required. Either both engines' secrets become optional and the CLI enforces the pairing, or the engines get separate jobs.

    Optional-plus-CLI-enforcement is simpler and keeps one job, at the cost of a misconfiguration surfacing later than it could. Separate jobs make the contract explicit in the workflow and duplicate a lot of it. I lean to the first, now that #115 makes preflight fail early and name what is missing, which removes most of the cost. But it is your call.

    Also worth knowing

    This cannot be finished by the agent. It edits .github/workflows/, and the App holds no workflows permission. Whoever takes it should expect a green gate followed by an escalation, or run the CLI locally under their own auth.

    Naming has moved. The Azure values are now SIMPLYCUBED_AZURE_OPENAI_ENDPOINT and SIMPLYCUBED_AZURE_OPENAI_API_KEY, and the scheme is SIMPLYCUBED_<PROVIDER>_<THING>. An Anthropic key would be SIMPLYCUBED_ANTHROPIC_API_KEY under it.

    Item 5 is partly done. docs/setup.md still says the hosted path is Codex-only, which remains true, but the surrounding text was rewritten in #125.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions