Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
195 commits
Select commit Hold shift + click to select a range
92e2d17
docs(problems): add static analysis layer to testing-agents
Benkapner Jun 7, 2026
436a7f8
feat(install): add --vendor for self-contained workflow and agent assets
ifireball Jun 10, 2026
0a0561b
feat(vendor): add manifest-driven cleanup and split analyze reporting
ifireball Jun 10, 2026
f19f1e3
fix: address remaining PR review nits for vendor work
ifireball Jun 10, 2026
32aaf9d
fix(binary): restore download tests dropped in prior commit
ifireball Jun 10, 2026
b5baa69
fix(vendor): batch stale cleanup and address review nits
ifireball Jun 10, 2026
8a9681e
docs(vendor): note --vendor-fullsend-binary removal without alias
ifireball Jun 10, 2026
0b50f96
fix(vendor): restore layer docs and normalize cleanup step messages
ifireball Jun 11, 2026
1f678e7
fix(vendor): single-commit upload and address Bugbot findings
ifireball Jun 11, 2026
1881e3b
fix(forge): include mode and type in DeleteFiles tree entries
ifireball Jun 11, 2026
88ecef4
test(forge): assert DeleteFiles tree entry mode and type
ifireball Jun 11, 2026
0013c75
Merge upstream/main into feat/distribution-mode-layered-standalone
ifireball Jun 11, 2026
893d1af
fix(vendor): address post-review findings from fullsend-ai-review
ifireball Jun 11, 2026
52dc9d2
Merge upstream/main into feat/distribution-mode-layered-standalone
ifireball Jun 11, 2026
b7b04f5
docs: address review feedback on ADR 0046 and testing guide
ifireball Jun 11, 2026
7d71e38
chore: re-trigger fullsend-ai-review after doc fixes
ifireball Jun 11, 2026
d330766
fix(scaffold): include check-e2e-authorization in vendored infra paths
ifireball Jun 11, 2026
99ddc9d
docs(forge): note base64 encoding in CommitFiles comment
ifireball Jun 11, 2026
fed552c
fix(install): combine vendor commit with scaffold and retry enrollmen…
ifireball Jun 11, 2026
1d3da39
fix(install): wait for workflow registration and activate repo-mainte…
ifireball Jun 11, 2026
73dea45
fix(forge): write text files as UTF-8 in CommitFiles, blob API for bi…
ifireball Jun 11, 2026
63c27e4
docs: add design spec for triage prerequisites action (#401)
ralphbean Jun 11, 2026
ba99ae3
docs: add implementation plan for triage prerequisites action (#401)
ralphbean Jun 11, 2026
9a35c91
feat(config): add create_issues allowlist config (#401)
ralphbean Jun 11, 2026
d4a394e
refactor: update NewOrgConfig/NewPerRepoConfig callers for create_iss…
ralphbean Jun 11, 2026
e492ac7
feat(schema): replace blocked with prerequisites action (#401)
ralphbean Jun 11, 2026
b2055cb
feat(triage): replace blocked action with prerequisites in agent prom…
ralphbean Jun 11, 2026
c48a832
docs: document prerequisites action and create_issues config (#401)
ralphbean Jun 11, 2026
3a44b0c
feat(triage): handle prerequisites action in post-script (#401)
ralphbean Jun 11, 2026
6f79d87
fix(triage): correct label name in agent prompt and remove dead code …
ralphbean Jun 11, 2026
080368c
fix(triage): update post-triage tests for prerequisites action (#401)
ralphbean Jun 11, 2026
11bae49
fix(triage): update schema validation tests for prerequisites action …
ralphbean Jun 12, 2026
e57f10a
fix(triage): address review feedback on prerequisites action (#401)
ralphbean Jun 12, 2026
602f75b
merge: integrate main into feat/distribution-mode-layered-standalone
ifireball Jun 14, 2026
d1baca8
fix(docs): renumber vendored-install ADR to 0047 after main merge
ifireball Jun 14, 2026
47e61b6
fix: address review feedback on dispatch retry and vendor docs
ifireball Jun 14, 2026
368890e
fix(test): wrap dispatch retry stub errors as APIError
ifireball Jun 14, 2026
2e040b5
chore(skills): add e2e-health skill
ralphbean Jun 15, 2026
7c40a70
fix(skills): escape example link in e2e-health SKILL.md
ralphbean Jun 15, 2026
162dce2
fix(skills): address review feedback on e2e-health skill
ralphbean Jun 15, 2026
80a414d
fix: widen CSMA jitter after rate-limit reset to prevent thundering herd
ralphbean Jun 15, 2026
d2d2428
fix(#2305): treat 401/403 comment-posting errors as non-fatal in post…
fullsend-ai-coder[bot] Jun 15, 2026
22c6e28
fix(#2014): remove protected-path block from post-fix.sh
jhutar Jun 15, 2026
f126581
feat(#1665): add Containerfile/Dockerfile/images to protected paths
jhutar Jun 15, 2026
bbbb0b5
fix(#2014): update fix agent definition to reflect review-layer enfor…
jhutar Jun 16, 2026
5fe6487
fix(#2318): verify PR metadata claims against API data
fullsend-ai-coder[bot] Jun 16, 2026
22be06d
feat(harness): add remote harness agent discovery via forge API (ADR-…
ggallen Jun 16, 2026
7ecf899
merge: integrate main into feat/distribution-mode-layered-standalone
ifireball Jun 16, 2026
61f467d
test: add Phase 2 integration tests for ADR-0045 forge-portable harne…
ggallen Jun 16, 2026
5e3d932
fix(vendor): harden vendoring and address PR review findings
ifireball Jun 16, 2026
ecf5175
test(vendor): cover appendVendorTreeFiles and VendorBinary helpers
ifireball Jun 16, 2026
3305c1a
feat(harness): add Lint() diagnostic method for non-fatal harness war…
ggallen Jun 16, 2026
4c360c8
test(vendor): raise PR patch coverage above 80% threshold
ifireball Jun 16, 2026
ac64c91
test(cli): cover admin per-repo vendor dry-run path
ifireball Jun 16, 2026
ded059b
fix(#2130): mint fresh tokens for status comments on demand
ggallen Jun 16, 2026
78302ba
fix(forge): retry 5xx server errors at the HTTP client level
ralphbean Jun 16, 2026
3c9f0db
Merge pull request #2304 from fullsend-ai/fix/csma-jitter-window
ralphbean Jun 16, 2026
7249b34
fix(skills): remove markdown link syntax from e2e-health example table
ralphbean Jun 16, 2026
df020f5
Merge pull request #2301 from fullsend-ai/add-e2e-health-skill
ralphbean Jun 16, 2026
3ae6f72
fix(#2343): add post-reset spread to _github_csma_sleep_after_rate_limit
fullsend-ai-coder[bot] Jun 16, 2026
966abbf
Merge pull request #2344 from fullsend-ai/agent/2343-csma-spread-rate…
ralphbean Jun 16, 2026
65b155c
feat(mint): share ROLE_APP_IDS per role across orgs
ifireball Jun 16, 2026
d988d32
merge: resolve conflict with main in admin.go
ralphbean Jun 16, 2026
e66f2d9
fix(#2348): stop swallowing gh pr create stderr in post-code.sh
fullsend-ai-coder[bot] Jun 16, 2026
a24ffd1
style: gofmt config.go after merge
ralphbean Jun 16, 2026
d6988a9
Merge pull request #2299 from ggallen/worktree-fix-2130-status-token
ggallen Jun 16, 2026
515e49b
Merge pull request #2321 from ggallen/worktree-phase2-pr6
ggallen Jun 16, 2026
387968a
test(cli): cover runDryRun, runAnalyze, and per-org setup dry-run
ifireball Jun 16, 2026
133ed6e
Merge pull request #2197 from fullsend-ai/rbean/401-triage-decompose-…
ralphbean Jun 16, 2026
6832b14
Merge pull request #2327 from fullsend-ai/worktree-adr-0045-phase3-pr2
ggallen Jun 16, 2026
32f73a4
Merge pull request #2322 from ggallen/worktree-investigate-adr-0045
ggallen Jun 16, 2026
b4d1c97
fix(mint): fail /health when ROLE_APP_IDS needs migration
ifireball Jun 16, 2026
a9bd135
test(cli): cover runInstall mint check and skip path
ifireball Jun 16, 2026
2b93fff
test: raise patch coverage for install, vendor, and download paths
ifireball Jun 16, 2026
3fb219c
Signed-off-by: Barak Korren <bkorren@redhat.com>
ifireball Jun 16, 2026
9241475
Merge pull request #2349 from fullsend-ai/agent/2348-fix-pr-create-st…
ralphbean Jun 16, 2026
22d710d
docs(adr): document trust boundary for vendored defaults gate
ifireball Jun 16, 2026
25a286f
refactor(cli): migrate uninstall flows to harness-first agent discovery
ggallen Jun 16, 2026
7905dfc
Merge pull request #1954 from ifireball/feat/distribution-mode-layere…
ifireball Jun 16, 2026
6f7ddf6
refactor: remove deprecated status-token fallback paths
ggallen Jun 16, 2026
f322448
Merge pull request #2295 from jhutar/2-protected
ralphbean Jun 16, 2026
560ace4
Merge pull request #2331 from ifireball/feat/role-only-app-ids
ifireball Jun 16, 2026
7aef782
Merge pull request #2364 from ggallen/worktree-adr-0045-phase3-pr5
ggallen Jun 17, 2026
f902ef8
refactor(harness): migrate loadKnownSlugs to harness-first discovery
ggallen Jun 17, 2026
f4e19d5
feat(harness): wire Lint() diagnostics into fullsend run and lock
ggallen Jun 17, 2026
f71504f
Merge pull request #2361 from ggallen/worktree-adr-0045-phase3-pr4
ggallen Jun 17, 2026
b04ecb3
Merge pull request #2362 from ggallen/worktree-adr-0045-phase3-pr3
ggallen Jun 17, 2026
ed8c416
Merge pull request #2365 from ggallen/worktree-cleanup-status-token-d…
ggallen Jun 17, 2026
b405b36
feat(mint): add add-role and remove-role CLI commands
ifireball Jun 17, 2026
7993274
fix(mint): address review feedback on add-role/remove-role
ifireball Jun 17, 2026
854d2e0
chore(ci): bump OpenShell to 0.0.63, extract install scripts, add Ren…
rh-hemartin Jun 16, 2026
5c5e14d
fix(scaffold): add openshell scripts to vendoredDefaultsInfraPaths
rh-hemartin Jun 17, 2026
c7ad026
Merge pull request #2315 from fullsend-ai/feat/openshell-update-and-o…
rh-hemartin Jun 17, 2026
6ac8e8f
test(mint): improve add-role/remove-role coverage
ifireball Jun 17, 2026
d8c20b3
test(mint): cover add-role/remove-role error paths
ifireball Jun 17, 2026
543d3ce
test(mint): reach patch coverage for add-role/remove-role
ifireball Jun 17, 2026
37ffc36
fix(mint): address review feedback on remove-role ordering
ifireball Jun 17, 2026
a4d5818
fix(mint): improve remove-role failure handling and traffic fallback
ifireball Jun 17, 2026
58c0e94
fix(#2294): make EnsureProvider idempotent via update on AlreadyExists
rh-hemartin Jun 17, 2026
1077242
refactor(config): make OrgConfig.Agents optional and add Phase 4 plan…
ggallen Jun 17, 2026
8dc0b93
docs(updates): add ADR discussing automatic versioning
rh-hemartin Jun 9, 2026
33084f7
Merge pull request #2079 from fullsend-ai/feat/adr-versioning
rh-hemartin Jun 17, 2026
70ed5c1
fix(sandbox): put /sandbox/go/bin last in code image PATH
ifireball Jun 17, 2026
2aaead0
ci(sandbox): smoke-test code image PATH ordering after build
ifireball Jun 17, 2026
2181382
fix(ci): clear entrypoint for code image PATH smoke test
ifireball Jun 17, 2026
3d54bc9
ci(sandbox): use command -v in PATH smoke test
ifireball Jun 17, 2026
71601af
fix(#2386): replace hardcoded /tmp/repo with t.TempDir() in runAgent …
fullsend-ai-coder[bot] Jun 17, 2026
24fd33f
fix: replace remaining hardcoded /tmp/repo with t.TempDir() in runAge…
fullsend-ai-coder[bot] Jun 17, 2026
9806973
fix(mint): address human review feedback on add-role/remove-role
ifireball Jun 17, 2026
18846a2
Merge pull request #2391 from fullsend-ai/agent/2386-fix-hardcoded-tm…
ggallen Jun 17, 2026
25d4659
Merge pull request #2375 from ifireball/fix/2169-code-image-path-orde…
ifireball Jun 17, 2026
12b47a9
fix(#2393): add diagnostic stderr output to post-script failure paths
fullsend-ai-coder[bot] Jun 17, 2026
f01e246
fix: address review feedback on PR #2395
fullsend-ai-coder[bot] Jun 17, 2026
e972b2c
fix: use ::error:: prefix and mktemp for PR #2395
fullsend-ai-coder[bot] Jun 17, 2026
fe94a21
ci(e2e): always report status on PRs, short-circuit for irrelevant paths
ralphbean Jun 17, 2026
6f20434
fix: address review feedback on e2e path-relevance check
ralphbean Jun 17, 2026
adba556
feat(merge-queue): add await-and-enqueue script
ralphbean Jun 17, 2026
1dabdc6
fix(merge-queue): rewrite await-and-enqueue to use jq instead of bash…
ralphbean Jun 17, 2026
14d5335
Merge pull request #2370 from ifireball/cursor/247314de
ralphbean Jun 17, 2026
8b62249
Merge pull request #2398 from fullsend-ai/fix/e2e-required-check-paths
ralphbean Jun 17, 2026
fcd4101
Merge pull request #2323 from fullsend-ai/agent/2294-sandbox-scoped-p…
rh-hemartin Jun 18, 2026
ad57f0b
docs: document Codecov coverage thresholds for contributors
ifireball Jun 17, 2026
a39963f
Merge pull request #2374 from ifireball/cursor/a9803b1b
ifireball Jun 18, 2026
a84bddf
fix: address review feedback on post-retro.sh (#2306)
fullsend-ai-coder[bot] Jun 18, 2026
773df28
fix: sanitize COMMENT_OUTPUT in fatal error branch and add lowercase …
fullsend-ai-coder[bot] Jun 18, 2026
874e0bb
Merge pull request #2306 from fullsend-ai/agent/2305-retro-403-non-fatal
rh-hemartin Jun 18, 2026
2c94eab
Merge pull request #2319 from fullsend-ai/agent/2318-verify-pr-metada…
rh-hemartin Jun 18, 2026
241c5da
fix(#2411): post medium+ findings as file-level comments when line is…
fullsend-ai-coder[bot] Jun 18, 2026
b73e233
docs: document fix agent context model, URL behavior, and limitations
ascerra Jun 16, 2026
72f1848
fix(#1312): gate code agent steps on pre-code skip output
jhutar Jun 17, 2026
095039e
fix(#1321): add existing-PR gate to triage agent definition
jhutar Jun 17, 2026
9ea24e8
fix(#1320): skip code dispatch when open PRs mention the issue
jhutar Jun 17, 2026
57e807c
test(#1312): cover no-GH_TOKEN path in GITHUB_OUTPUT skip tests
jhutar Jun 17, 2026
de9e17a
refactor: rename skip output to skipped for consistency
jhutar Jun 17, 2026
cf544d0
fix(#1320): exclude bot-authored PRs from dispatch-level pr-check
jhutar Jun 17, 2026
c8ea622
ci(#2403): remove dead RETRO_SANDBOX_TOKEN env var
rh-hemartin Jun 18, 2026
24f969e
Merge pull request #2373 from jhutar/3-no-code-on-skip
ralphbean Jun 18, 2026
bb406a3
Merge pull request #2412 from fullsend-ai/fix/2403-remove-dead-retro-…
rh-hemartin Jun 18, 2026
1b69b0f
Merge pull request #2339 from ascerra/docs/fix-agent-context-model
ascerra Jun 18, 2026
b4f6454
fix(deps): update transitive deps for critical and high CVEs
waynesun09 Jun 18, 2026
81848a5
docs(adr): ADR 0047 — agent configuration env var convention
ralphbean Jun 16, 2026
5ce3e65
docs(adr): clarify env var delivery paths and update touchpoint count
ralphbean Jun 16, 2026
dce83dd
docs(adr-0047): address review feedback
ralphbean Jun 17, 2026
f77a94b
fix: replace {ROLE} with {AGENT} in ADR 0047 and architecture.md
ralphbean Jun 17, 2026
6cf0bb0
fix: renumber ADR 0047 → 0049 to avoid collision
ralphbean Jun 17, 2026
c5c248d
Merge pull request #2334 from fullsend-ai/docs/adr-0047-agent-config-…
ralphbean Jun 18, 2026
62926fc
fix: remove severity-based discrimination from file-level comment fal…
fullsend-ai-coder[bot] Jun 18, 2026
6ce108d
Merge pull request #2422 from fullsend-ai/fullsend-fix-dependabot-cri…
waynesun09 Jun 18, 2026
ac47bf5
fix(review): move SubjectType out of forge struct, include line in fi…
fullsend-ai-coder[bot] Jun 18, 2026
6371614
Merge pull request #2415 from fullsend-ai/agent/2411-medium-plus-inli…
ralphbean Jun 18, 2026
270ab1d
docs: add design spec for review agent contextual labels (#1706)
ralphbean Jun 11, 2026
758c27d
docs: add implementation plan for review agent contextual labels (#1706)
ralphbean Jun 11, 2026
3ed6080
feat(skill): generalize issue-labels for issues and PRs (#1706)
ralphbean Jun 11, 2026
c78c7d1
feat(schema): add optional label_actions to review result (#1706)
ralphbean Jun 11, 2026
c30a531
feat(post-review): process label_actions from review result (#1706)
ralphbean Jun 11, 2026
e7f68c3
feat(review): wire issue-labels skill into review agent (#1706)
ralphbean Jun 11, 2026
fee13a5
docs: document review agent contextual labels (#1706)
ralphbean Jun 11, 2026
7077be2
fix(review): address review feedback for label_actions (#1706)
ralphbean Jun 11, 2026
d2856eb
fix(post-review): suppress shellcheck SC2030/SC2031 in test subshells
ralphbean Jun 11, 2026
b906210
fix: sanitize label values and compose trap handlers in post-review
ralphbean Jun 12, 2026
71dc194
Merge branch 'main' into feat/merge-queue-await-and-enqueue
ralphbean Jun 18, 2026
8e9ba31
Merge branch 'main' into fix/retry-5xx-in-do
ralphbean Jun 18, 2026
5ee4955
Merge pull request #2196 from fullsend-ai/feat/1706-review-agent-labels
ralphbean Jun 18, 2026
36186df
Merge branch 'main' into agent/2393-post-script-diagnostic-errors
ralphbean Jun 18, 2026
a4a5008
Merge pull request #2395 from fullsend-ai/agent/2393-post-script-diag…
ralphbean Jun 18, 2026
8271187
Merge pull request #2400 from fullsend-ai/feat/merge-queue-await-and-…
ralphbean Jun 18, 2026
1e985c9
fix: rename remaining retryOnTransient calls to retryOnRepoRace
ralphbean Jun 18, 2026
47c8fdc
fix(#2432): retry enrollment PR merge on 409 with branch update
fullsend-ai-coder[bot] Jun 18, 2026
4d83c42
Merge pull request #2342 from fullsend-ai/fix/retry-5xx-in-do
ralphbean Jun 18, 2026
f112cad
Merge branch 'main' into doc-testing-agent
ralphbean Jun 18, 2026
6dbd59a
Merge pull request #1826 from Benkapner/doc-testing-agent
ralphbean Jun 18, 2026
650261c
Merge pull request #2435 from fullsend-ai/agent/2432-retry-merge-409
ralphbean Jun 18, 2026
67376d4
docs(#2440): fix ADR 0047 heading to match convention
fullsend-ai-coder[bot] Jun 18, 2026
725329c
Merge pull request #2369 from ggallen/worktree-adr-0045-review
ggallen Jun 18, 2026
a777a5d
docs: ADR 0048 — distributed tracing instrumentation with OpenTelemetry
ascerra Jun 16, 2026
559eb92
Merge pull request #1489 from ascerra/docs/adr-0040-tracing
ralphbean Jun 18, 2026
59159d0
Merge pull request #2442 from fullsend-ai/agent/2440-fix-adr-heading-…
waynesun09 Jun 18, 2026
6deedbe
fix(#1230): run OutputPipeline on post-review before posting to forge
fullsend-ai-coder[bot] Jun 18, 2026
015e200
Add QualityFlow output for GH-1230 [skip ci]
Jun 21, 2026
25917dd
Add STP output for GH-1230 [skip ci]
Jun 21, 2026
62e237e
Add QualityFlow STP review output for GH-1230 [skip ci]
Jun 21, 2026
5546875
Add QualityFlow output for GH-1230 [skip ci]
Jun 21, 2026
be1c39f
Add QualityFlow output for GH-1230 [skip ci]
Jun 21, 2026
1369d37
Add QualityFlow STD review for GH-1230 [skip ci]
Jun 21, 2026
1df75ec
Add test output for GH-1230 [skip ci]
Jun 21, 2026
b352c38
Add QualityFlow tests for GH-1230
guyoron1 Jun 21, 2026
51db1d3
Add QualityFlow output for GH-69 [skip ci]
Jun 22, 2026
421ff46
Add STP output for GH-69 [skip ci]
Jun 22, 2026
0c0f85f
Add QualityFlow output for GH-69 [skip ci]
Jun 22, 2026
d195361
Add QualityFlow output for GH-69 [skip ci]
Jun 22, 2026
8606227
Add QualityFlow output for GH-69 [skip ci]
Jun 22, 2026
599b4b4
Add QualityFlow STD review for GH-69 [skip ci]
Jun 22, 2026
eeda454
Add QualityFlow tests for GH-69 [skip ci]
Jun 22, 2026
d247738
Clean QualityFlow artifacts for GH-69
guyoron1 Jun 22, 2026
89c566e
chore: remove old qf-tests/ artifacts
guyoron1 Jun 22, 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
6 changes: 0 additions & 6 deletions .github/dependabot.yml

This file was deleted.

18 changes: 18 additions & 0 deletions .github/scripts/install-openshell.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Install the pinned OpenShell version via upstream install.sh.
#
# Sources openshell-version.sh for the version and commit SHA, then
# runs the upstream installer. Requires sudo for RPM installation.
#
# Usage:
# .github/scripts/install-openshell.sh
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
source "${SCRIPT_DIR}/openshell-version.sh"

echo "Installing OpenShell ${OPENSHELL_VERSION} (${OPENSHELL_SHA})"
curl -LsSf "https://raw.githubusercontent.com/NVIDIA/OpenShell/${OPENSHELL_SHA}/install.sh" \

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

[low] supply-chain

curl | sh pattern for installing OpenShell. While the URL is pinned to a specific commit SHA, the downloaded content's integrity is not verified. This matches the existing pattern in action.yml but represents a defense-in-depth gap.

| OPENSHELL_VERSION="v${OPENSHELL_VERSION}" sh

openshell --version
20 changes: 20 additions & 0 deletions .github/scripts/openshell-version.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Single source of truth for the pinned OpenShell version.
#
# Source this script to set OPENSHELL_VERSION and OPENSHELL_SHA in the
# current shell. In GitHub Actions it also exports them to GITHUB_ENV
# for downstream steps.
#
# Usage:
# source .github/scripts/openshell-version.sh

# renovate: datasource=github-tags depName=NVIDIA/OpenShell
OPENSHELL_VERSION=0.0.63
OPENSHELL_SHA=ec197a43ef349e36c3fff04e9aaea9599fb83b31

export OPENSHELL_VERSION OPENSHELL_SHA

if [[ -n "${GITHUB_ENV:-}" ]]; then
echo "OPENSHELL_VERSION=${OPENSHELL_VERSION}" >> "${GITHUB_ENV}"
echo "OPENSHELL_SHA=${OPENSHELL_SHA}" >> "${GITHUB_ENV}"
fi
47 changes: 30 additions & 17 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ permissions: {}
on:
push:
branches: [main]
# SYNC-WITH: grep regex in "Check for e2e-relevant changes" step in the e2e job
paths:
- '**/*.go'
- 'go.mod'
Expand All @@ -24,19 +25,6 @@ on:
- 'scripts/check-e2e-authorization.sh'
pull_request_target:
types: [opened, synchronize, reopened, labeled]
paths:
- '**/*.go'
- 'go.mod'
- 'go.sum'
- 'e2e/**'
- 'internal/scaffold/fullsend-repo/**'
- 'internal/security/hooks/**'
- 'internal/dispatch/gcf/mintsrc/**'
- 'internal/sentencetoken/english.json'
- 'Makefile'
- '.github/workflows/e2e.yml'
- '.github/actions/check-e2e-authorization/**'
- 'scripts/check-e2e-authorization.sh'
merge_group:
workflow_dispatch:

Expand Down Expand Up @@ -93,19 +81,44 @@ jobs:
contents: read
id-token: write
steps:
- name: Check for e2e-relevant changes
id: changes
if: github.event_name == 'pull_request_target'
env:
GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
# SYNC-WITH: push.paths filter above
run: |
FILES=$(gh api "repos/${REPO}/pulls/${PR_NUMBER}/files" --paginate --jq '.[].filename') || {
echo "::warning::Failed to fetch PR files — running e2e tests as a precaution"
echo "relevant=true" >> "$GITHUB_OUTPUT"
exit 0
}
if echo "$FILES" | grep -qE '\.go$|^go\.(mod|sum)$|^e2e/|^internal/scaffold/fullsend-repo/|^internal/security/hooks/|^internal/dispatch/gcf/mintsrc/|^internal/sentencetoken/english\.json$|^Makefile$|^\.github/workflows/e2e\.yml$|^\.github/actions/check-e2e-authorization/|^scripts/check-e2e-authorization\.sh$'; then
echo "relevant=true" >> "$GITHUB_OUTPUT"
else
echo "::notice::No e2e-relevant files changed — skipping tests"
echo "relevant=false" >> "$GITHUB_OUTPUT"
fi

- uses: actions/checkout@v4
if: steps.changes.outputs.relevant != 'false'
with:
ref: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.head.sha || github.sha }}
persist-credentials: false

- uses: actions/setup-go@v5
if: steps.changes.outputs.relevant != 'false'
with:
go-version-file: go.mod

- name: Install Playwright system dependencies
if: steps.changes.outputs.relevant != 'false'
run: npx playwright install-deps chromium

- name: Check for secrets
if: steps.changes.outputs.relevant != 'false'
id: secrets-check
run: |
if [ -z "$E2E_GITHUB_SESSION_B64" ]; then
Expand All @@ -118,7 +131,7 @@ jobs:
E2E_GITHUB_SESSION_B64: ${{ secrets.E2E_GITHUB_SESSION }}

- name: Decode session
if: steps.secrets-check.outputs.available == 'true'
if: steps.changes.outputs.relevant != 'false' && steps.secrets-check.outputs.available == 'true'
run: |
SESSION_FILE="${RUNNER_TEMP}/github-session.json"
printf '%s' "$E2E_GITHUB_SESSION_B64" | base64 -d > "$SESSION_FILE"
Expand All @@ -127,14 +140,14 @@ jobs:
E2E_GITHUB_SESSION_B64: ${{ secrets.E2E_GITHUB_SESSION }}

- name: Authenticate to GCP
if: steps.secrets-check.outputs.available == 'true'
if: steps.changes.outputs.relevant != 'false' && steps.secrets-check.outputs.available == 'true'
uses: google-github-actions/auth@v2
with:
workload_identity_provider: ${{ secrets.E2E_GCP_WIF_PROVIDER }}
service_account: ${{ secrets.E2E_GCP_SERVICE_ACCOUNT }}

- name: Run e2e tests
if: steps.secrets-check.outputs.available == 'true'
if: steps.changes.outputs.relevant != 'false' && steps.secrets-check.outputs.available == 'true'
run: make e2e-test
env:
E2E_SCREENSHOT_DIR: ${{ runner.temp }}/e2e-screenshots
Expand All @@ -144,7 +157,7 @@ jobs:
E2E_GCP_PROJECT_ID: ${{ secrets.E2E_GCP_PROJECT_ID }}

- name: Upload debug screenshots
if: always() && steps.secrets-check.outputs.available == 'true'
if: always() && steps.changes.outputs.relevant != 'false' && steps.secrets-check.outputs.available == 'true'
uses: actions/upload-artifact@v4
with:
name: e2e-screenshots-${{ github.event_name == 'pull_request_target' && github.event.pull_request.number || github.run_id }}
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/reusable-code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
# Keep in sync with --vendor marker paths (see internal/scaffold/vendorcontent.go VendoredMarkerPath).
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -102,6 +104,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh


- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand All @@ -127,6 +130,7 @@ jobs:
persist-credentials: false

- name: Validate inputs
id: validate
env:
ISSUE_NUMBER: ${{ fromJSON(inputs.event_payload).issue.number }}
REPO_FULL_NAME: ${{ inputs.source_repo }}
Expand All @@ -135,12 +139,14 @@ jobs:
run: bash scripts/pre-code.sh

- name: Setup GCP and prepare credentials
if: steps.validate.outputs.skipped != 'true'
uses: ./.defaults/.github/actions/setup-gcp
with:
gcp_wif_provider: ${{ secrets.FULLSEND_GCP_WIF_PROVIDER }}
gcp_project_id: ${{ secrets.FULLSEND_GCP_PROJECT_ID }}

- name: Resolve bot identity
if: steps.validate.outputs.skipped != 'true'
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}
run: |
Expand All @@ -154,6 +160,7 @@ jobs:
echo "GIT_BOT_EMAIL=${GIT_BOT_EMAIL}" >> "${GITHUB_ENV}"

- name: Setup agent environment
if: steps.validate.outputs.skipped != 'true'
env:
AGENT_PREFIX: CODE_
CODE_GH_TOKEN: ${{ steps.app-token.outputs.token }}
Expand All @@ -164,6 +171,7 @@ jobs:
run: bash .github/scripts/setup-agent-env.sh

- name: Run code agent
if: steps.validate.outputs.skipped != 'true'
uses: ./.defaults/
env:
GITHUB_ISSUE_URL: ${{ fromJSON(inputs.event_payload).issue.html_url }}
Expand All @@ -178,4 +186,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ fromJSON(inputs.event_payload).issue.number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
23 changes: 22 additions & 1 deletion .github/workflows/reusable-dispatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ jobs:
contents: read
pull-requests: read
outputs:
stage: ${{ steps.role-check.outputs.skipped != 'true' && steps.route.outputs.stage || '' }}
stage: ${{ steps.role-check.outputs.skipped != 'true' && steps.pr-check.outputs.skipped != 'true' && steps.route.outputs.stage || '' }}
trigger_source: ${{ steps.route.outputs.trigger_source }}
event_payload: ${{ steps.payload.outputs.event_payload }}
steps:
Expand Down Expand Up @@ -234,6 +234,27 @@ jobs:
echo "stage=${STAGE}" >> "${GITHUB_OUTPUT}"
echo "trigger_source=${TRIGGER_SOURCE}" >> "${GITHUB_OUTPUT}"

- name: Check for existing PRs
id: pr-check
if: steps.route.outputs.stage == 'code'
env:
GH_TOKEN: ${{ github.token }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
SOURCE_REPO: ${{ github.repository }}
run: |
set -euo pipefail
BOT_LOGIN="fullsend-ai[bot]"
CODER_BOT_LOGIN="fullsend-ai-coder[bot]"
MENTIONING_PRS="$(gh pr list --repo "${SOURCE_REPO}" --state open \
--search "${ISSUE_NUMBER} in:title,body" \
--json number,author \
--jq "[.[] | select(.author.login != \"${BOT_LOGIN}\" and .author.login != \"${CODER_BOT_LOGIN}\")] | .[].number" \
2>/dev/null || true)"
if [[ -n "${MENTIONING_PRS}" ]]; then
echo "::notice::Open PR(s) mentioning issue #${ISSUE_NUMBER} found — skipping code dispatch"
echo "skipped=true" >> "${GITHUB_OUTPUT}"
fi

- name: Validate routed stage
if: steps.route.outputs.stage != ''
env:
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/reusable-fix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -114,6 +115,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh


- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down Expand Up @@ -380,4 +382,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ steps.context.outputs.pr_number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
2 changes: 2 additions & 0 deletions .github/workflows/reusable-prioritize.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -104,6 +105,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh
- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/reusable-retro.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -100,6 +101,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh


- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down Expand Up @@ -145,12 +147,10 @@ jobs:
ORIGINATING_URL: ${{ fromJSON(inputs.event_payload).pull_request.html_url || fromJSON(inputs.event_payload).issue.html_url }}
RETRO_COMMENT: ${{ fromJSON(inputs.event_payload).comment.body || '' }}
REPO_FULL_NAME: ${{ inputs.source_repo }}
RETRO_SANDBOX_TOKEN: ${{ steps.app-token.outputs.token }}
GH_TOKEN: ${{ steps.app-token.outputs.token }}
with:
agent: retro
version: ${{ inputs.fullsend_version }}
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ fromJSON(inputs.event_payload).pull_request.number || fromJSON(inputs.event_payload).issue.number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
3 changes: 2 additions & 1 deletion .github/workflows/reusable-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -169,4 +170,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ fromJSON(inputs.event_payload).pull_request.number || fromJSON(inputs.event_payload).issue.number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
4 changes: 3 additions & 1 deletion .github/workflows/reusable-triage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ jobs:
uses: actions/checkout@v6

- name: Checkout upstream defaults
if: hashFiles('.defaults/action.yml', '.fullsend/.defaults/action.yml') == ''
uses: actions/checkout@v6
with:
repository: fullsend-ai/fullsend
Expand Down Expand Up @@ -100,6 +101,7 @@ jobs:
mkdir -p .github/scripts
cp "${SRC}/.github/scripts/setup-agent-env.sh" .github/scripts/setup-agent-env.sh


- name: Validate enrollment and extract repo metadata
id: repo-parts
uses: ./.defaults/.github/actions/validate-enrollment
Expand Down Expand Up @@ -149,4 +151,4 @@ jobs:
run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
status-repo: ${{ inputs.source_repo }}
status-number: ${{ fromJSON(inputs.event_payload).issue.number }}
status-token: ${{ steps.app-token.outputs.token }}
mint-url: ${{ inputs.mint_url }}
23 changes: 23 additions & 0 deletions .github/workflows/sandbox-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,26 @@ jobs:
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=code
cache-to: type=gha,mode=max,scope=code

# Load a single-platform image locally so we can smoke-test PATH ordering.
# Multi-arch builds cannot --load, so this reuses the GHA cache from above.
- name: Build code image for smoke test
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
with:
context: images/code
file: images/code/Containerfile
platforms: linux/amd64
load: true
tags: fullsend-code:ci-smoke
build-args: |
BASE_IMAGE=${{ needs.build-base.outputs.image-ref }}
cache-from: type=gha,scope=code

- name: Validate PATH security
run: |
docker run --rm --entrypoint '' fullsend-code:ci-smoke sh -c '
LAST=$(echo "$PATH" | tr ":" "\n" | tail -1)
[ "$LAST" = "/sandbox/go/bin" ] || { echo "FAIL: /sandbox/go/bin not last (got $LAST)"; exit 1; }
[ "$(command -v git)" = "/usr/bin/git" ] || { echo "FAIL: git shadowed ($(command -v git))"; exit 1; }
[ "$(command -v scan-secrets)" = "/usr/local/bin/scan-secrets" ] || { echo "FAIL: scan-secrets shadowed ($(command -v scan-secrets))"; exit 1; }
'
2 changes: 2 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ repos:
- property "workflow_repository" is not defined
- -ignore
- SC2016
- -ignore
- '__REUSABLE_(WORKFLOW|DISPATCH)__'

- repo: local
hooks:
Expand Down
Loading
Loading