Repository navigation
feat(install)!: add --vendor for self-contained workflow and agent assets #1954
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
ifireball
merged 34 commits into
fullsend-ai:main
from
ifireball:feat/distribution-mode-layered-standalone
Jun 16, 2026
Merged
Changes from 24 commits
Commits
Show all changes
34 commits
Select commit
Hold shift + click to select a range
436a7f8
feat(install): add --vendor for self-contained workflow and agent assets
ifireball 0a0561b
feat(vendor): add manifest-driven cleanup and split analyze reporting
ifireball f19f1e3
fix: address remaining PR review nits for vendor work
ifireball 32aaf9d
fix(binary): restore download tests dropped in prior commit
ifireball b5baa69
fix(vendor): batch stale cleanup and address review nits
ifireball 8a9681e
docs(vendor): note --vendor-fullsend-binary removal without alias
ifireball 0b50f96
fix(vendor): restore layer docs and normalize cleanup step messages
ifireball 1f678e7
fix(vendor): single-commit upload and address Bugbot findings
ifireball 1881e3b
fix(forge): include mode and type in DeleteFiles tree entries
ifireball 88ecef4
test(forge): assert DeleteFiles tree entry mode and type
ifireball 0013c75
Merge upstream/main into feat/distribution-mode-layered-standalone
ifireball 893d1af
fix(vendor): address post-review findings from fullsend-ai-review
ifireball 52dc9d2
Merge upstream/main into feat/distribution-mode-layered-standalone
ifireball b7b04f5
docs: address review feedback on ADR 0046 and testing guide
ifireball 7d71e38
chore: re-trigger fullsend-ai-review after doc fixes
ifireball d330766
fix(scaffold): include check-e2e-authorization in vendored infra paths
ifireball 99ddc9d
docs(forge): note base64 encoding in CommitFiles comment
ifireball fed552c
fix(install): combine vendor commit with scaffold and retry enrollmen…
ifireball 1d3da39
fix(install): wait for workflow registration and activate repo-mainte…
ifireball 73dea45
fix(forge): write text files as UTF-8 in CommitFiles, blob API for bi…
ifireball 602f75b
merge: integrate main into feat/distribution-mode-layered-standalone
ifireball d1baca8
fix(docs): renumber vendored-install ADR to 0047 after main merge
ifireball 47e61b6
fix: address review feedback on dispatch retry and vendor docs
ifireball 368890e
fix(test): wrap dispatch retry stub errors as APIError
ifireball 7ecf899
merge: integrate main into feat/distribution-mode-layered-standalone
ifireball 5e3d932
fix(vendor): harden vendoring and address PR review findings
ifireball ecf5175
test(vendor): cover appendVendorTreeFiles and VendorBinary helpers
ifireball 4c360c8
test(vendor): raise PR patch coverage above 80% threshold
ifireball ac64c91
test(cli): cover admin per-repo vendor dry-run path
ifireball 387968a
test(cli): cover runDryRun, runAnalyze, and per-org setup dry-run
ifireball a9bd135
test(cli): cover runInstall mint check and skip path
ifireball 2b93fff
test: raise patch coverage for install, vendor, and download paths
ifireball 3fb219c
Signed-off-by: Barak Korren <bkorren@redhat.com>
ifireball 22d710d
docs(adr): document trust boundary for vendored defaults gate
ifireball File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,116 @@ | ||
| --- | ||
| title: "47. Vendored installs with --vendor" | ||
| status: Accepted | ||
| relates_to: | ||
| - testing-agents | ||
| topics: | ||
| - vendor | ||
| - layered-content | ||
| - workflows | ||
| --- | ||
|
|
||
| # ADR 0047: Vendored installs with `--vendor` | ||
|
|
||
| ## Status | ||
|
|
||
| Accepted | ||
|
|
||
| ## Context | ||
|
|
||
| Layered installs (the default) fetch reusable workflows and agent content from | ||
| `fullsend-ai/fullsend@v0` at runtime via sparse checkout. That keeps config repos | ||
| small and picks up upstream fixes automatically. | ||
|
|
||
| Some workflows need to run unreleased fullsend changes (forks, local workflow | ||
| edits, pre-release CI) without publishing tags. A single install flag should | ||
| vendor binary + workflow/agent assets at install time; runtime should detect | ||
| vendored files without `config.yaml` distribution settings. | ||
|
ifireball marked this conversation as resolved.
Resolved
|
||
|
|
||
| ## Decision | ||
|
|
||
| ### Install-time: `--vendor` | ||
|
|
||
| `fullsend admin install`, `fullsend github setup`, and | ||
| `fullsend github sync-scaffold` accept: | ||
|
|
||
| | Flag | Purpose | | ||
| |------|---------| | ||
| | `--vendor` | Vendor linux/amd64 binary, reusable workflows, composite actions, and agent content | | ||
| | `--fullsend-source <dir>` | Explicit fullsend checkout for content walks and binary cross-compile | | ||
| | `--fullsend-binary <path>` | Explicit Linux ELF; skips cross-compile (requires `--vendor`) | | ||
|
|
||
| Source resolution (shared by binary and content) in `internal/binary`: | ||
|
|
||
| 1. `--fullsend-source` (validated checkout: `go.mod`, `cmd/fullsend/`) | ||
| 2. `ModuleRoot()` when CWD is inside a checkout | ||
| 3. GitHub source fetch at CLI version (released CLI only) | ||
|
|
||
| Without `--vendor`, install removes stale vendored binary and content paths and | ||
| renders thin callers with upstream `uses: fullsend-ai/fullsend/.../reusable-*.yml@v0`. | ||
|
|
||
| ### Vendor manifest | ||
|
|
||
| `--vendor` writes `vendor-manifest.yaml` listing every vendored path plus | ||
| `binary_path`: | ||
|
|
||
| | Install mode | Manifest path | | ||
| |--------------|---------------| | ||
| | Per-org (`.fullsend` config repo) | `vendor-manifest.yaml` | | ||
| | Per-repo | `.fullsend/vendor-manifest.yaml` | | ||
|
|
||
| The manifest is committed in the same batch as vendored content. Cleanup when | ||
| `--vendor` is off reads the manifest from the target repo (via forge API) and | ||
| deletes listed paths — no local fullsend checkout required. Legacy installs | ||
| without a manifest fall back to embed-derived path enumeration. | ||
|
|
||
| ### Analyze behavior | ||
|
|
||
| Scaffold and vendored assets are reported separately: | ||
|
|
||
| - **Workflows layer** — always checks embed-derived managed paths | ||
| (`ManagedPaths(false)`): thin callers, shim, `customized/` gitkeeps, and | ||
| `CODEOWNERS`. Vendored marker presence does not expand this list. | ||
| - **Vendor layer** — reports vendored binary/marker presence, manifest | ||
| alignment (missing paths, legacy installs without manifest), and optional | ||
| source alignment when `--fullsend-source` is passed to `fullsend admin analyze` | ||
| (or when the CLI version can resolve a source tree). | ||
|
|
||
| Vendored misalignment surfaces under the **vendor** layer, not workflows. | ||
|
|
||
| ### Runtime: file-presence detection | ||
|
|
||
| Reusable workflows detect vendored installs before sparse checkout: | ||
|
|
||
| - **All modes:** `.defaults/action.yml` in the checked-out repo (committed by `--vendor`, or populated by sparse checkout at runtime) | ||
|
|
||
| When present, upstream sparse checkout is skipped. Infra is referenced from | ||
| `.defaults/` (`uses: ./.defaults/.github/actions/...`, `uses: ./.defaults/`). | ||
| Layered agent content is copied from `.defaults/internal/scaffold/fullsend-repo/` | ||
| onto the workspace root at job start (inline prepare step). | ||
|
|
||
| Thin caller `uses:` paths are rendered at install/sync time (local `./...` when | ||
| `--vendor`, upstream `@v0` when layered). | ||
|
|
||
| ### What this PR removes | ||
|
|
||
| These existed on earlier iterations of the distribution-mode branch and are | ||
| dropped in favor of `--vendor` plus runtime marker detection: | ||
|
|
||
| - `distribution.mode` / `distribution.upstream.ref` in org and per-repo config | ||
|
ifireball marked this conversation as resolved.
Resolved
|
||
| - `--distribution-mode`, `--upstream-ref` CLI flags | ||
| - `distribution_mode` workflow input | ||
| - `upstreamembed.go` (content read from resolved source tree instead) | ||
|
|
||
| ## Consequences | ||
|
|
||
| - **Positive:** One flag, no config block, runtime auto-detect; dev/CI can test unreleased workflow changes. | ||
| - **Negative:** Deleting vendored files without re-install leaves broken local `uses:` paths until sync-scaffold or re-install. | ||
| - **Neutral:** Default layered behavior unchanged for installs without `--vendor`. | ||
|
|
||
| ## References | ||
|
|
||
| - [Installation guide](../reference/installation.md) | ||
| - [Testing workflows](../guides/dev/testing-workflows.md) | ||
| - ADR 0031 (reusable workflows for distribution) | ||
| - ADR 0033 (per-repo installation mode) | ||
| - ADR 0035 (layered content resolution) | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.