Context
The control plane stores per-tenant fleet config and serves it over an API. The
OSS CLI must be able to pull its config from a remote control plane (e.g.
api.agentic-fleet.ai) or read a local file — without the engine depending on
the control plane. This is the key binding point (open client, swappable
control plane).
Problem
Config loading is currently hard-wired to local file probing in
internal/fleet/load.go (LoadConfig/probeConfigPath). There is no seam to
load config from anywhere else, and no way for a hosted control plane to be the
source of truth.
Proposed approach
Introduce a pluggable source in the public pkg/ (depends on the pkg/fleet
extraction):
ConfigSource interface { Load(ctx) (*Config, error) }
├─ FileSource // wraps today's local probe/load — the DEFAULT
└─ RemoteSource // GET <url> (+ bearer token) → fleet.SchemaVersion JSON
FileSource is the default; the CLI stays fully standalone with no
network, token, or SaaS required.
RemoteSource: HTTP GET a configurable URL returning the fleet-config
JSON contract; bearer token from env/config; optional ?version=N for
reproducible pins; local cache with offline fallback (keep working when
the control plane is unreachable — offline-tolerant cached-config behavior).
- CLI wiring:
--config-source <url> flag + env var + config stanza.
Default remains local file. Do not hardcode any domain — vendor-neutral;
any conformant URL (incl. self-hosted) works.
Affected files
internal/fleet/load.go (refactor loading behind the interface)
cmd/root.go (persistent flag), relevant subcommands
- New
pkg/…/configsource.go
Acceptance criteria
Dependencies
- Depends on the public
pkg/fleet extraction (foundational issue).
- Implements the client side of the wire contract (separate contract issue).
References
agentic-fleet/control-plane/docs/architecture.md — "The binding point".
Context
The control plane stores per-tenant fleet config and serves it over an API. The
OSS CLI must be able to pull its config from a remote control plane (e.g.
api.agentic-fleet.ai) or read a local file — without the engine depending onthe control plane. This is the key binding point (open client, swappable
control plane).
Problem
Config loading is currently hard-wired to local file probing in
internal/fleet/load.go(LoadConfig/probeConfigPath). There is no seam toload config from anywhere else, and no way for a hosted control plane to be the
source of truth.
Proposed approach
Introduce a pluggable source in the public
pkg/(depends on thepkg/fleetextraction):
FileSourceis the default; the CLI stays fully standalone with nonetwork, token, or SaaS required.
RemoteSource: HTTPGETa configurable URL returning the fleet-configJSON contract; bearer token from env/config; optional
?version=Nforreproducible pins; local cache with offline fallback (keep working when
the control plane is unreachable — offline-tolerant cached-config behavior).
--config-source <url>flag + env var + config stanza.Default remains local file. Do not hardcode any domain — vendor-neutral;
any conformant URL (incl. self-hosted) works.
Affected files
internal/fleet/load.go(refactor loading behind the interface)cmd/root.go(persistent flag), relevant subcommandspkg/…/configsource.goAcceptance criteria
ConfigSourceinterface +FileSource(default) +RemoteSourceinpkg/.gh-aw-fleet list --config-source https://…loads config from a remoteendpoint using a bearer token from env/config.
no source is specified.
RemoteSourcecaches the last good response and falls back to it offline.?version=Nhonored for reproducible pulls.make cigreen.Dependencies
pkg/fleetextraction (foundational issue).References
agentic-fleet/control-plane/docs/architecture.md— "The binding point".