Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
6aa43fc
run: a native run delivers through codefly.dev/composition when the h…
AntoineToussaint Oct 23, 2026
13f7a3e
run: the delivery carries the authority's signed method policies
AntoineToussaint Oct 23, 2026
b24ed0d
fix(run): an excluded workspace configuration group is not rendered e…
AntoineToussaint Oct 24, 2026
ffdbddc
feat(run): deliver a module's scope ceilings in the authority's document
AntoineToussaint Oct 24, 2026
6faa4b7
gitops: a module serving HTTP delivers its routes' policies from its …
AntoineToussaint Oct 24, 2026
0eed329
generate contracts: a REST face's contract is its service's OpenAPI d…
AntoineToussaint Oct 24, 2026
12a0bdd
Merge origin/main into delivery/through-the-composition-interface
AntoineToussaint Oct 24, 2026
c8f68fe
run: a local run generates the secrets its environment declares
AntoineToussaint Oct 24, 2026
db32f87
gitops: a binding that names its calls carries what the callee declar…
AntoineToussaint Oct 24, 2026
c18e661
gitops: a module's foreign methods are delivered with its method poli…
AntoineToussaint Oct 24, 2026
c2bb934
chore(deps): core 6710b5ac, the kit's foreign-method fixtures as its …
AntoineToussaint Oct 24, 2026
a6d816f
generate client: a Python library declares what its bindings import
AntoineToussaint Oct 24, 2026
87ebf73
gitops: a proto method's HTTP routes are policy rows too
AntoineToussaint Oct 24, 2026
867a089
gitops: a route template is spelled one variable per segment
AntoineToussaint Oct 24, 2026
c1b8f96
generate client: a local endpoint's contract takes its package from t…
AntoineToussaint Oct 24, 2026
c263903
generate: a contract route's path is the route's own
AntoineToussaint Oct 24, 2026
392d72d
generate client: a connect endpoint is a contract source
AntoineToussaint Oct 24, 2026
b7c01a8
generate client: the connect-endpoint test builds endpoints the way t…
AntoineToussaint Oct 24, 2026
b0db235
generate client: a service vendoring foreign protos takes the descrip…
AntoineToussaint Oct 24, 2026
761ea31
delivery: a solution's roles travel in the authority's document
AntoineToussaint Oct 24, 2026
88c5174
deps: core with the managed import path for codefly's own protos
AntoineToussaint Oct 25, 2026
101e1e2
feat: generate typed permissions and preflight selected compositions
antoinetoussaint-byte Oct 25, 2026
ff909d7
generate runnable-bindings: the run's naming scope and a declared cal…
AntoineToussaint Oct 25, 2026
8df6849
generate permissions: the default lands in each service's code tree
AntoineToussaint Oct 25, 2026
a097b27
fix: preserve declared Buf inputs during proto generation
antoinetoussaint-byte Oct 25, 2026
2672ee3
run: a reference to a composed service outside the run is dropped wit…
AntoineToussaint Oct 25, 2026
51a28d9
deps: core where an unimplemented interface dependency stays unbound
AntoineToussaint Oct 25, 2026
3fd9335
generate permissions: a module with Python services generates its Go …
AntoineToussaint Oct 25, 2026
ea939d2
render: an optional binding the composition leaves unfilled is omitte…
AntoineToussaint Oct 25, 2026
d7dbfce
fix: detect stale permission source before delivery effects
antoinetoussaint-byte Oct 25, 2026
436478b
deps: core where Buf owns only its own output and a service's Go owns…
AntoineToussaint Oct 25, 2026
0dcbb75
fix: cancel native delivery through the run lifecycle
antoinetoussaint-byte Oct 25, 2026
d6858f1
fix: isolate detailed logs by CLI invocation
antoinetoussaint-byte Oct 25, 2026
fffafc0
fix: omit live authority policies from signed withdrawals
antoinetoussaint-byte Oct 25, 2026
cf1e3c5
fix: observe withdrawal through the composition interface
antoinetoussaint-byte Oct 25, 2026
2694c2c
render: a binding addressed to a list of audiences is delivered once …
AntoineToussaint Oct 25, 2026
6173ce5
fix: reserve native generations for complete policy deliveries
antoinetoussaint-byte Oct 25, 2026
ec9470d
fix: avoid copying binding declarations in delivery diagnostics
antoinetoussaint-byte Oct 25, 2026
9563d2b
gitops: a solution's roles are read from core's module contract
AntoineToussaint Oct 25, 2026
3883e97
deps: core where a proto is foreign to Go by its go_package; a Go lib…
AntoineToussaint Oct 25, 2026
85e856f
gitops: an unmarked method is refused only where method policies are …
AntoineToussaint Oct 25, 2026
a18c303
generate: an environment declares where its runnable calls go
AntoineToussaint Oct 25, 2026
4d150d3
gitops: a module's method policies are the methods its endpoints serve
AntoineToussaint Oct 25, 2026
0c15593
ci: read the authority's libraries with the CI reader app
AntoineToussaint Oct 25, 2026
3a72953
gitops: the host's own module is not held to the policies it receives
AntoineToussaint Oct 25, 2026
b138edd
gitops: the host's own module is the module of host.delivery
AntoineToussaint Oct 25, 2026
fd5b489
render: a binding addressed to the module itself is delivered at its …
AntoineToussaint Oct 25, 2026
1d1bab1
generate: a Python client owns only the root files a protoc plugin wrote
AntoineToussaint Oct 25, 2026
088c402
fix: gate local agent starts and observe test dependency readiness
antoinetoussaint-byte Oct 25, 2026
23ad484
feat: separate declared workload membership from ready native routes
antoinetoussaint-byte Oct 25, 2026
78e48dd
feat: deliver a service's declared egress as the generated egress group
AntoineToussaint Oct 25, 2026
327803c
generate contracts: an http endpoint publishes the OpenAPI document i…
AntoineToussaint Oct 25, 2026
5bcb601
generate contracts: a refused manifest names itself and the artifact …
antoinetoussaint-byte Oct 25, 2026
af71053
run: a producer several dependencies bind to is handed out once
antoinetoussaint-byte Oct 25, 2026
fc7118c
run: manifests go where host.delivery points, whatever else the host …
antoinetoussaint-byte Oct 25, 2026
e60bce3
run: a host route with no answer leaves the module's delivery standing
antoinetoussaint-byte Oct 25, 2026
608561e
run: an endpoint the producer does not declare is named as missing
antoinetoussaint-byte Oct 25, 2026
8de0f66
fix: publish implemented interface procedures and extend imported groups
antoinetoussaint-byte Oct 25, 2026
61824c6
fix(run): build declared frontend remotes before delivery
antoinetoussaint-byte Oct 25, 2026
9d782b1
fix(run): refresh workload credentials by wall-clock expiry
antoinetoussaint-byte Oct 25, 2026
c632692
fix(ci): use configured authority reader and pin Core 88f4434c
antoinetoussaint-byte Oct 25, 2026
625e66f
Merge main and resolve secret rotation generator ownership
antoinetoussaint-byte Oct 25, 2026
ba15066
fix: resolve native host federation before requiring authored configu…
antoinetoussaint-byte Oct 25, 2026
efb61fd
fix: admit selected workloads before native service startup
antoinetoussaint-byte Oct 25, 2026
a33bb4c
fix(run): address the #1128 review: one composition connection, front…
antoinetoussaint-byte Oct 25, 2026
b328905
fix(run): keep the legacy HTTP delivery for saas hosts; digest what t…
antoinetoussaint-byte Oct 25, 2026
eee37c1
fix: derive hop service routes through composition configuration
antoinetoussaint-byte Oct 25, 2026
348d3cf
fix(run): stage vendored tarball dependencies; recognize saas's held …
antoinetoussaint-byte Oct 25, 2026
1371a49
Merge delivery/through-the-composition-interface: Codex's follow-ups …
antoinetoussaint-byte Oct 25, 2026
e2ca83a
fix(run): hop routes are the delivered policy table; re-check the fro…
antoinetoussaint-byte Oct 25, 2026
e6b5696
deps: pin codefly-dev/authority to main's merge commit c9cef747 (auth…
antoinetoussaint-byte Oct 25, 2026
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
21 changes: 1 addition & 20 deletions .github/actions/install/action.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
name: Install Codefly
description: Install the Codefly CLI version pinned by this action reference

inputs:
authority-token:
description: >-
A token with contents read access to codefly-dev/authority, which is private and whose
interface client, hop and delivery libraries the CLI requires. The CLI
workflows use the existing organization GH_PAT secret. It reaches git
for the build step alone. Without it the build resolves from the module
cache only, so a workflow that has not downloaded the CLI's modules
already cannot install it.
required: false
default: ""

runs:
using: composite
steps:
Expand All @@ -26,20 +14,13 @@ runs:
shell: bash
env:
CODEFLY_REPOSITORY_ROOT: ${{ github.action_path }}/../../..
AUTHORITY_TOKEN: ${{ inputs.authority-token }}
GOPRIVATE: github.com/codefly-dev/authority
run: |
set -euo pipefail
install_root="${RUNNER_TEMP}/codefly-action/bin"
mkdir -p "${install_root}"
(
cd "${CODEFLY_REPOSITORY_ROOT}"
export GOWORK=off
if [ -n "${AUTHORITY_TOKEN}" ]; then
.github/scripts/download-go-modules.sh
fi
unset AUTHORITY_TOKEN
GOBIN="${install_root}" go install ./cmd/codefly
GOWORK=off GOBIN="${install_root}" go install ./cmd/codefly
)
test -x "${install_root}/codefly"
echo "${install_root}" >> "${GITHUB_PATH}"
39 changes: 0 additions & 39 deletions .github/actions/read-authority/action.yml

This file was deleted.

1 change: 0 additions & 1 deletion .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ updates:
directories:
- /
- /.github/actions/install
- /.github/actions/read-authority
schedule:
interval: weekly
open-pull-requests-limit: 1
Expand Down
36 changes: 0 additions & 36 deletions .github/scripts/download-go-modules.sh

This file was deleted.

24 changes: 2 additions & 22 deletions .github/workflows/companions.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,6 @@ concurrency:
group: companions-publish
cancel-in-progress: false

env:
# The CLI requires codefly-dev/authority's libraries, and that repository is
# private: fetched from GitHub with the existing organization GH_PAT, never via the
# module proxy or the checksum database (go.yml says how).
GOPRIVATE: github.com/codefly-dev/authority

jobs:
publish:
name: Publish and verify companion images
Expand Down Expand Up @@ -88,16 +82,9 @@ jobs:
go-version-file: cli/go.mod
cache: false

# The token reaches git in the download alone; the build reads the cache.
- name: Build the codefly CLI
working-directory: cli
env:
AUTHORITY_TOKEN: ${{ secrets.GH_PAT }}
GOWORK: "off"
run: |
.github/scripts/download-go-modules.sh
unset AUTHORITY_TOKEN
GOBIN="${{ github.workspace }}/bin" go install ./cmd/codefly
run: GOWORK=off GOBIN="${{ github.workspace }}/bin" go install ./cmd/codefly

# A multi-platform buildx push builds every image as one manifest, so the
# arm64 stages need an emulator (QEMU) and a builder that can emit a
Expand Down Expand Up @@ -241,16 +228,9 @@ jobs:
go-version-file: cli/go.mod
cache: false

# The token reaches git in the download alone; the build reads the cache.
- name: Build the codefly CLI
working-directory: cli
env:
AUTHORITY_TOKEN: ${{ secrets.GH_PAT }}
GOWORK: "off"
run: |
.github/scripts/download-go-modules.sh
unset AUTHORITY_TOKEN
GOBIN="${{ github.workspace }}/bin" go install ./cmd/codefly
run: GOWORK=off GOBIN="${{ github.workspace }}/bin" go install ./cmd/codefly

- name: Verify linux/arm64 assets for the qualification fixtures
# Test inputs only: these identities never select production agents or
Expand Down
14 changes: 0 additions & 14 deletions .github/workflows/container-recovery-native.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@ on:
permissions:
contents: read

env:
# The CLI requires codefly-dev/authority's libraries, and that repository is
# private: fetched from GitHub with the existing organization GH_PAT, never via the
# module proxy or the checksum database (go.yml says how).
GOPRIVATE: github.com/codefly-dev/authority

concurrency:
group: container-recovery-native-${{ github.ref }}
cancel-in-progress: true
Expand Down Expand Up @@ -59,14 +53,6 @@ jobs:
- uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version-file: go.mod
# Reading the CLI's Core pin and the qualification test below resolve
# the CLI's modules from the cache this fills; only this step has the
# token.
- name: Download the CLI's modules
env:
GOWORK: 'off'
AUTHORITY_TOKEN: ${{ secrets.GH_PAT }}
run: .github/scripts/download-go-modules.sh
- name: Check out the ${{ matrix.agent }} agent source
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand Down
27 changes: 1 addition & 26 deletions .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,6 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

env:
# The CLI requires codefly-dev/authority's interface client, hop and delivery
# libraries, and that repository is private: fetched from GitHub with the
# existing organization GH_PAT (handed to git by
# .github/scripts/download-go-modules.sh for the download step alone), never
# via the module proxy or the checksum database. GOPRIVATE is the default of
# both GONOPROXY and GONOSUMDB. Every other codefly-dev module is public and
# stays on the proxy and the checksum database.
GOPRIVATE: github.com/codefly-dev/authority

jobs:
quality:
name: ${{ matrix.gate }}
Expand Down Expand Up @@ -98,22 +88,15 @@ jobs:
restore-keys: |
cli-go-build-v3-${{ matrix.gate }}-${{ runner.os }}-

# Every gate resolves the CLI's modules, codefly-dev/authority's among
# them. The token is handed to the install action and the download step
# only; nothing writes it into git's configuration.
# This is both the canonical bootstrap and the cross-repository action
# contract consumed by Codefly products. Dogfood the local action so a
# release cannot publish an installer that CI never exercised.
- name: install Codefly
if: matrix.gate == 'bootstrap-audit' || matrix.gate == 'control-integration'
uses: ./.github/actions/install
with:
authority-token: ${{ secrets.GH_PAT }}

- name: Install Dependencies
env:
AUTHORITY_TOKEN: ${{ secrets.GH_PAT }}
run: .github/scripts/download-go-modules.sh
run: go mod download

# govulncheck gate via the CLI (replaces scripts/govulncheck.sh):
# suppressions + staleness from .govulncheck.yaml, fails only on
Expand Down Expand Up @@ -303,14 +286,6 @@ jobs:
go-version-file: go.mod
cache: false

# The linter loads every package, so the modules must be in the cache
# before it runs, codefly-dev/authority's among them; the linter itself
# never sees the token.
- name: Download the CLI's modules
env:
AUTHORITY_TOKEN: ${{ secrets.GH_PAT }}
run: .github/scripts/download-go-modules.sh

- name: golangci-lint
uses: golangci/golangci-lint-action@ba0d7d2ec06a0ea1cb5fa41b2e4a3ab91d21278a # v9.3.0
with:
Expand Down
27 changes: 0 additions & 27 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,6 @@ permissions:
attestations: write
artifact-metadata: write

env:
# The CLI requires codefly-dev/authority's interface client, hop and delivery
# libraries, and that repository is private: fetched from GitHub with the
# existing organization GH_PAT, never via the module proxy or the checksum database
# (GOPRIVATE is the default of GONOPROXY and GONOSUMDB). The release builds
# from a module cache the host fills before any build; the token never enters
# the release container. This is why releases are the install path: a
# `go install` from outside the organization cannot read the repository.
GOPRIVATE: github.com/codefly-dev/authority

jobs:
release:
name: Qualify and publish
Expand All @@ -42,17 +32,6 @@ jobs:
go-version-file: go.mod
cache: false

# The module cache lives under RUNNER_TEMP, which the release container
# mounts at the same path, so the container builds every target from what
# this step downloaded and needs no credential of its own.
- name: Download the CLI's modules
env:
AUTHORITY_TOKEN: ${{ secrets.GH_PAT }}
run: |
gomodcache="$RUNNER_TEMP/gomodcache"
echo "GOMODCACHE=$gomodcache" >> "$GITHUB_ENV"
GOMODCACHE="$gomodcache" .github/scripts/download-go-modules.sh

- name: Install Syft
id: syft
uses: anchore/sbom-action/download-syft@66cbf4bc1f1c0d2edc94016e65bc221b6bb0ad6c # v0.24.3
Expand Down Expand Up @@ -101,8 +80,6 @@ jobs:
# tag is qualified with CGO and real compilers for every target.
docker run --rm \
-e CODEFLY_RELEASE_SIGNING_KEY_PATH \
-e GOMODCACHE \
-e GOPRIVATE \
-e RELEASE_TAG \
-v "$GITHUB_WORKSPACE:/workspace" \
-v "$RUNNER_TEMP:$RUNNER_TEMP" \
Expand All @@ -112,8 +89,6 @@ jobs:
check
docker run --rm \
-e CODEFLY_RELEASE_SIGNING_KEY_PATH \
-e GOMODCACHE \
-e GOPRIVATE \
-e RELEASE_TAG \
-v "$GITHUB_WORKSPACE:/workspace" \
-v "$RUNNER_TEMP:$RUNNER_TEMP" \
Expand Down Expand Up @@ -160,8 +135,6 @@ jobs:
docker run --rm \
-e CODEFLY_RELEASE_SIGNING_KEY_PATH \
-e GITHUB_TOKEN \
-e GOMODCACHE \
-e GOPRIVATE \
-e GH_TOKEN \
-e HOMEBREW_TAP_GITHUB_TOKEN \
-e MACOS_SIGN_P12 \
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

- **Module:** `github.com/codefly-dev/cli`
- **Repository:** `https://github.com/codefly-dev/cli`
- **Language:** Go 1.27.2 (`go.mod` is the source of truth — see [Bump the Go version](docs/runbooks/bump-go-version.md))
- **Language:** Go 1.27.3 (`go.mod` is the source of truth — see [Bump the Go version](docs/runbooks/bump-go-version.md))

The CLI is the primary interface for codefly. It orchestrates agent lifecycles, manages the
daemon, runs services with their dependency graphs, and exposes an MCP server for AI tool
Expand Down
14 changes: 0 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,6 @@ GitHub release for each immutable version. See [CLI releases and
updates](docs/cli-updates.md) for direct installation, update commands,
verification, rollback, and package-manager ownership.

The release is the install path. The CLI requires libraries from
`codefly-dev/authority`, which is a private repository, so `go install
github.com/codefly-dev/cli/...` (the CLI or `codefly-help`) is not supported
from outside the codefly-dev organization while that repository stays private:
the module proxy cannot serve it and `go` cannot fetch it without read access.
Releases ship prebuilt, signed binaries and need no access to it.

Building from source needs read access to `codefly-dev/authority` and
`GOPRIVATE=github.com/codefly-dev/authority`, so `go` fetches it with git
(your own credentials) rather than asking the public proxy and checksum
database. CI reads it with the organization's CI reader app
(`.github/actions/read-authority`, handed to git for the download step alone by
`.github/scripts/download-go-modules.sh`).

# Development

## Repository layout
Expand Down
10 changes: 7 additions & 3 deletions cmd/ci/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@ import (
"context"
"fmt"

"github.com/codefly-dev/cli/pkg/gitops"

"github.com/codefly-dev/cli/cmd/common"
"github.com/codefly-dev/cli/pkg/cli"
"github.com/codefly-dev/cli/pkg/gitops"
"github.com/codefly-dev/cli/pkg/orchestration"
"github.com/codefly-dev/cli/pkg/platform"
"github.com/codefly-dev/core/resources"
Expand Down Expand Up @@ -72,7 +71,12 @@ func initDeployService(ctx context.Context, workspace *resources.Workspace, modu
return nil, nil, w.Wrap(err)
}

flow, err := orchestration.NewFlow(ctx, workspace, module, service, env, orchestration.DeployMode, orchestration.WithCompositionCheck(gitops.PermissionPreflight(true)), orchestration.WithRunModuleClosure(module.Name))
// The modules `deploy service` checks, the same way, before any effect; the
// deploy graph itself is the one a deployment has always taken.
if err = gitops.CheckCompositionPermissions(ctx, workspace, env, true, module.Name); err != nil {
return nil, nil, w.Wrap(err)
}
flow, err := orchestration.NewFlow(ctx, workspace, module, service, env, orchestration.DeployMode)
if err != nil {
return nil, nil, w.Wrap(err)
}
Expand Down
Loading
Loading