Skip to content

[wrangler] Add Flagship auto-provisioning#14640

Open
ericclemmons wants to merge 10 commits into
mainfrom
codex/flagship-autoprovision
Open

[wrangler] Add Flagship auto-provisioning#14640
ericclemmons wants to merge 10 commits into
mainfrom
codex/flagship-autoprovision

Conversation

@ericclemmons

@ericclemmons ericclemmons commented Jul 10, 2026

Copy link
Copy Markdown
Member

Enables https://developers.cloudflare.com/flagship/ bindings for automatic provisioning: https://developers.cloudflare.com/workers/wrangler/configuration/#automatic-provisioning


A picture of a cute animal (not mandatory, but encouraged)
🐯

Manual validation

Prerequisites: use an account with Workers and Flagship access, and authenticate with wrangler login if needed.

  1. Build this branch's Wrangler and create an isolated project:
cd /path/to/workers-sdk
pnpm install
pnpm --filter wrangler build

export WORKERS_SDK_ROOT="$PWD"
wrangler() {
  node "$WORKERS_SDK_ROOT/packages/wrangler/bin/wrangler.js" "$@"
}

export WORKER_NAME="flagship-autoprovision-$(date +%s)"
export TEST_DIR="$(mktemp -d)"
cd "$TEST_DIR"

cat > index.js <<'EOF'
export default {
  async fetch(_request, env) {
    return Response.json({
      flagshipBindingAvailable: typeof env.FLAGS === "object",
    });
  },
};
EOF

cat > wrangler.jsonc <<EOF
{
  "name": "$WORKER_NAME",
  "main": "index.js",
  "compatibility_date": "2026-07-15",
  "flagship": [
    {
      "binding": "FLAGS"
    }
  ]
}
EOF
  1. Verify that local development rejects an unprovisioned remote-only binding:
wrangler dev

Expected: Wrangler exits before starting the dev server with:

Flagship binding "FLAGS" has no app_id. Run `wrangler deploy` to provision it, or add `app_id` to your config.

Actual:

 ⛅️ wrangler 4.111.0
────────────────────
Your Worker has access to the following bindings:
Binding           Resource      Mode
env.FLAGS         Flagship      remote

╭───────────────────────────╮
│  [b] open a browser       │
│  [d] open devtools        │
│  [e] open local explorer  │
│  [t] start tunnel         │
│  [c] clear console        │
│  [x] to exit              │
╰───────────────────────────╯

✘ [ERROR] Flagship binding "FLAGS" has no app_id. Run `wrangler deploy` to provision it, or add `app_id` to your config.
  1. Deploy the draft binding:
wrangler deploy

Expected: Wrangler automatically creates a Flagship app named $WORKER_NAME-flags, reports output similar to the following, and deploys successfully:

Creating new Flagship App "<worker-name>-flags"...
FLAGS provisioned

Actual:

⛅️ wrangler 4.111.0
────────────────────
Total Upload: 0.24 KiB / gzip: 0.19 KiB

Experimental: The following bindings need to be provisioned:
Binding           Resource      
env.FLAGS         Flagship      


Provisioning FLAGS (Flagship App)...
🌀 Creating new Flagship App "flagship-autoprovision-1784129957-flags"...
✨ FLAGS provisioned 🎉

Your Worker was deployed with provisioned resources. We've written the IDs of these resources to your config file, which you can choose to save or discard. Either way future deploys will continue to work.
🎉 All resources provisioned, continuing with deployment...

Your Worker has access to the following bindings:
Binding                                               Resource      
env.FLAGS (74ebaf8f-5d53-416a-be42-a4bae43f1908)      Flagship      

Uploaded flagship-autoprovision-1784129957 (4.02 sec)
Deployed flagship-autoprovision-1784129957 triggers (1.54 sec)
  https://flagship-autoprovision-1784129957.cloudflare-workers-ci-staging.workers.dev
Current Version ID: 81ae49e1-53b5-4199-bdf1-9af310a5e025
  1. Verify that Wrangler wrote the provisioned app ID back to the config:
grep -A3 '"flagship"' wrangler.jsonc
export APP_ID="$(node -e 'const fs = require("node:fs"); const config = JSON.parse(fs.readFileSync("wrangler.jsonc", "utf8")); process.stdout.write(config.flagship[0].app_id)')"
test -n "$APP_ID"
wrangler flagship apps get "$APP_ID"

Expected: wrangler.jsonc now contains a non-empty app_id, and flagship apps get returns the app named $WORKER_NAME-flags.

Actual:

{
        "name": "flagship-autoprovision-1784129957",
        "main": "index.js",
        "compatibility_date": "2026-07-15",
        "flagship": [
                {
                        "binding": "FLAGS",
                        "app_id": "74ebaf8f-5d53-416a-be42-a4bae43f1908"
                }
        ]
}%   
  1. Verify local development now starts with the remote Flagship binding. In one terminal:
cd "$TEST_DIR"
wrangler dev --port 8787

Expected: Wrangler establishes a remote connection, lists env.FLAGS as a remote Flagship binding, and reports that the server is ready. In another terminal:

curl --fail http://localhost:8787

Expected:

{"flagshipBindingAvailable":true}

Actual:

{"flagshipBindingAvailable":true}
  1. Stop wrangler dev, then remove the Worker and the provisioned Flagship app:
cd "$TEST_DIR"
wrangler delete --name "$WORKER_NAME"
wrangler flagship apps delete "$APP_ID" --force
rm -rf "$TEST_DIR"

Actual:

❯ wrangler delete --name "$WORKER_NAME"                       

 ⛅️ wrangler 4.111.0
────────────────────
✔ Are you sure you want to delete flagship-autoprovision-1784129957? This action cannot be undone. … yes
Successfully deleted flagship-autoprovision-1784129957

msdfmy193hg5yc5xl8zcb9fm0000gn/T/tmp.aaEepGqG3A via  v24.18.0 took 5s 
❯ wrangler flagship apps delete "74ebaf8f-5d53-416a-be42-a4bae43f1908" --force

 ⛅️ wrangler 4.111.0
────────────────────
▲ [WARNING] 🚧 `wrangler flagship apps delete` is an open beta command. Please report any issues to https://github.com/cloudflare/workers-sdk/issues/new/choose

@changeset-bot

changeset-bot Bot commented Jul 10, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 766b54b

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
Name Type
wrangler Minor
miniflare Minor
@cloudflare/workers-utils Minor
@cloudflare/deploy-helpers Minor
@cloudflare/vite-plugin Patch
@cloudflare/vitest-pool-workers Patch
@cloudflare/pages-shared Patch
@cloudflare/runtime-types Patch
@cloudflare/autoconfig Patch
@cloudflare/cli-shared-helpers Patch
@cloudflare/workers-auth Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

✅ All changesets look good

@ask-bonk

ask-bonk Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

UnknownError: "Overloaded"

github run

@ask-bonk

ask-bonk Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

@ericclemmons Bonk workflow failed. Check the logs for details.

View workflow run · To retry, trigger Bonk again.

@pkg-pr-new

pkg-pr-new Bot commented Jul 10, 2026

Copy link
Copy Markdown
@cloudflare/autoconfig

npm i https://pkg.pr.new/@cloudflare/autoconfig@14640

@cloudflare/config

npm i https://pkg.pr.new/@cloudflare/config@14640

create-cloudflare

npm i https://pkg.pr.new/create-cloudflare@14640

@cloudflare/deploy-helpers

npm i https://pkg.pr.new/@cloudflare/deploy-helpers@14640

@cloudflare/kv-asset-handler

npm i https://pkg.pr.new/@cloudflare/kv-asset-handler@14640

miniflare

npm i https://pkg.pr.new/miniflare@14640

@cloudflare/pages-shared

npm i https://pkg.pr.new/@cloudflare/pages-shared@14640

@cloudflare/unenv-preset

npm i https://pkg.pr.new/@cloudflare/unenv-preset@14640

@cloudflare/vite-plugin

npm i https://pkg.pr.new/@cloudflare/vite-plugin@14640

@cloudflare/vitest-pool-workers

npm i https://pkg.pr.new/@cloudflare/vitest-pool-workers@14640

@cloudflare/workers-auth

npm i https://pkg.pr.new/@cloudflare/workers-auth@14640

@cloudflare/workers-editor-shared

npm i https://pkg.pr.new/@cloudflare/workers-editor-shared@14640

@cloudflare/workers-utils

npm i https://pkg.pr.new/@cloudflare/workers-utils@14640

wrangler

npm i https://pkg.pr.new/wrangler@14640

commit: 766b54b

ask-bonk[bot]

This comment was marked as resolved.

@ask-bonk

ask-bonk Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Review posted successfully to PR #14640.

Summary of the actionable issue found:

Dry-run / inherit handling missing for draft flagship bindings (create-worker-upload-form.ts:436) — The new flagship branch omits the dryRun guard (app_id ??= INHERIT_SYMBOL) and the INHERIT_SYMBOL{ type: "inherit" } handling that every other provisionable binding (KV/R2/D1/AI Search/Agent Memory) implements. This breaks wrangler deploy --dry-run for exactly the draft-binding case the PR adds (throws "must have an app_id field"), and can serialize a Symbol into metadata via the FlagshipAppHandler.inherit()super.inherit() fallback path. Posted with a suggestion to mirror the existing pattern.

github run

@ericclemmons
ericclemmons force-pushed the codex/flagship-autoprovision branch 2 times, most recently from 1ac9b1b to fa0b8f6 Compare July 10, 2026 20:26
@ericclemmons
ericclemmons marked this pull request as ready for review July 10, 2026 21:35
@workers-devprod
workers-devprod requested review from a team and edmundhung and removed request for a team July 10, 2026 21:36
@workers-devprod

workers-devprod commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Codeowners approval required for this PR:

  • @cloudflare/wrangler
Show detailed file reviewers
  • .changeset/blue-pandas-care.md: [@cloudflare/wrangler]
  • packages/deploy-helpers/src/deploy/helpers/create-worker-upload-form.ts: [@cloudflare/wrangler]
  • packages/deploy-helpers/src/deploy/helpers/provision-bindings.ts: [@cloudflare/wrangler]
  • packages/miniflare/test/plugins/flagship/index.spec.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/environment.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/validation.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/worker.ts: [@cloudflare/wrangler]
  • packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/create-worker-upload-form/bindings.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/dev/remote-bindings-errors.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/provision.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/api/remoteBindings/start-remote-proxy-session.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/dev/miniflare/index.ts: [@cloudflare/wrangler]

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@edmundhung edmundhung left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I'm a bit concerned about making app_id optional here. Flagship has no local implementation and is always routed through the remote binding proxy, which requires an app_id.

With a draft binding such as { binding: "FLAGS" }, wrangler dev would fail to start with FLAGS bindings must have an "app_id" field.

Most draft bindings have a local implementation as a fallback during development, so Flagship is an unusual case here. 🤔

Comment thread .changeset/blue-pandas-care.md
@ericclemmons
ericclemmons marked this pull request as draft July 13, 2026 18:45
@ericclemmons
ericclemmons force-pushed the codex/flagship-autoprovision branch from 3174672 to 00e4df1 Compare July 15, 2026 14:49
@ericclemmons
ericclemmons requested a review from edmundhung July 15, 2026 15:43
@ericclemmons
ericclemmons marked this pull request as ready for review July 15, 2026 15:43
@ericclemmons

Copy link
Copy Markdown
Member Author

I'm a bit concerned about making app_id optional here. Flagship has no local implementation and is always routed through the remote binding proxy, which requires an app_id.

With a draft binding such as { binding: "FLAGS" }, wrangler dev would fail to start with FLAGS bindings must have an "app_id" field.

Most draft bindings have a local implementation as a fallback during development, so Flagship is an unusual case here. 🤔

Opted to model this after Agent Memory, where local development relies on remote-only resources. wrangler deploy is required before wrangler dev.

(Updated PR description with manual validation)

@ericclemmons
ericclemmons requested a review from roerohan July 15, 2026 15:58
@workers-devprod

Copy link
Copy Markdown
Contributor

Codeowners approval required for this PR:

  • @cloudflare/wrangler
Show detailed file reviewers
  • .changeset/blue-pandas-care.md: [@cloudflare/wrangler]
  • packages/deploy-helpers/src/deploy/helpers/create-worker-upload-form.ts: [@cloudflare/wrangler]
  • packages/deploy-helpers/src/deploy/helpers/provision-bindings.ts: [@cloudflare/wrangler]
  • packages/miniflare/test/plugins/flagship/index.spec.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/environment.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/config/validation.ts: [@cloudflare/wrangler]
  • packages/workers-utils/src/worker.ts: [@cloudflare/wrangler]
  • packages/workers-utils/tests/config/validation/normalize-and-validate-config.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/create-worker-upload-form/bindings.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/dev/remote-bindings-errors.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/tests/provision.test.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/api/remoteBindings/start-remote-proxy-session.ts: [@cloudflare/wrangler]
  • packages/wrangler/src/dev/miniflare/index.ts: [@cloudflare/wrangler]

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

Labels

None yet

Projects

Status: Untriaged

Development

Successfully merging this pull request may close these issues.

5 participants