Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
139 changes: 118 additions & 21 deletions .github/scripts/select-eval-agents-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ setup_fixture() {
cat > "$tmpdir/harness/triage.yaml" << 'YAML'
agent: agents/triage.md
doc: docs/triage.md
policy: policies/triage.yaml
pre_script: scripts/pre-triage.sh
post_script: scripts/post-triage.sh
validation_loop:
Expand All @@ -40,12 +39,34 @@ validation_loop:
host_files:
- src: common/env/gcp-vertex.env
dest: /sandbox/workspace/.env.d/gcp-vertex.env
- src: env/triage.env
dest: /sandbox/workspace/.env.d/triage.env
- src: ${GOOGLE_APPLICATION_CREDENTIALS}
dest: /tmp/.gcp-credentials.json
skills:
- skills/issue-labels
- src: env/${AGENT_NAME}.env
dest: /sandbox/workspace/.env.d/agent.env
forge:
github:
policy: policies/github/triage.yaml
pre_script: scripts/forge-pre-triage.sh
post_script: scripts/forge-post-triage.sh
skills:
- skills/github-forge
- skills/issue-labels/github
host_files:
- src: env/github/triage.env
dest: /sandbox/workspace/.env.d/triage.env
providers:
- providers/github-ro.yaml
openshell:
profiles:
- profiles/github-code.yaml
gitlab:
policy: policies/gitlab/triage.yaml
skills:
- skills/gitlab-forge
- skills/issue-labels/gitlab
host_files:
- src: env/gitlab/triage.env
dest: /sandbox/workspace/.env.d/triage.env
YAML

cat > "$tmpdir/harness/review.yaml" << 'YAML'
Expand Down Expand Up @@ -113,7 +134,7 @@ cleanup_fixture "$FIXTURE"
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
RESULT=$(echo "env/triage.env" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
RESULT=$(echo "env/github/triage.env" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "env file change selects agent via harness reference"
else
Expand Down Expand Up @@ -179,7 +200,7 @@ cleanup_fixture "$FIXTURE"
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
RESULT=$(echo "skills/issue-labels/README.md" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
RESULT=$(echo "skills/issue-labels/github/README.md" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "skill subpath change selects agent"
else
Expand All @@ -205,7 +226,7 @@ cleanup_fixture "$FIXTURE"
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
RESULT=$(printf "env/triage.env\nagents/review.md\n" | "$SELECT_SCRIPT" --repo-root "$FIXTURE" | sort)
RESULT=$(printf "env/github/triage.env\nagents/review.md\n" | "$SELECT_SCRIPT" --repo-root "$FIXTURE" | sort)
EXPECTED=$(printf "review\ntriage")
if [[ "$RESULT" == "$EXPECTED" ]]; then
pass "multiple agents selected from mixed changes"
Expand Down Expand Up @@ -259,13 +280,6 @@ cleanup_fixture "$FIXTURE"
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
# Add forge scripts to the triage harness
cat >> "$FIXTURE/harness/triage.yaml" << 'YAML'
forge:
github:
pre_script: scripts/forge-pre-triage.sh
post_script: scripts/forge-post-triage.sh
YAML
RESULT=$(echo "scripts/forge-pre-triage.sh" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "forge script change selects agent"
Expand All @@ -274,6 +288,94 @@ else
fi
cleanup_fixture "$FIXTURE"

# ---------------------------------------------------------------------------
# Test: forge-level policy, skills, and host_files are tracked
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
RESULT=$(echo "skills/gitlab-forge/SKILL.md" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "forge skill subpath change selects agent"
else
fail "forge skill subpath change selects agent (got: '$RESULT')"
fi
cleanup_fixture "$FIXTURE"

run_test
FIXTURE="$(setup_fixture)"
RESULT=$(echo "policies/gitlab/triage.yaml" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "forge policy change selects agent"
else
fail "forge policy change selects agent (got: '$RESULT')"
fi
cleanup_fixture "$FIXTURE"

run_test
FIXTURE="$(setup_fixture)"
RESULT=$(echo "env/gitlab/triage.env" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "forge host_file change selects agent"
else
fail "forge host_file change selects agent (got: '$RESULT')"
fi
cleanup_fixture "$FIXTURE"

# ---------------------------------------------------------------------------
# Test: forge-level providers and openshell profiles are tracked
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
RESULT=$(echo "providers/github-ro.yaml" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "forge provider change selects agent"
else
fail "forge provider change selects agent (got: '$RESULT')"
fi
cleanup_fixture "$FIXTURE"

run_test
FIXTURE="$(setup_fixture)"
RESULT=$(echo "profiles/github-code.yaml" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "forge openshell profile change selects agent"
else
fail "forge openshell profile change selects agent (got: '$RESULT')"
fi
cleanup_fixture "$FIXTURE"

# ---------------------------------------------------------------------------
# Test: top-level providers and openshell profiles are tracked
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
cat >> "$FIXTURE/harness/triage.yaml" << 'YAML'
providers:
- providers/vertex-ai.yaml
YAML
RESULT=$(echo "providers/vertex-ai.yaml" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "top-level provider change selects agent"
else
fail "top-level provider change selects agent (got: '$RESULT')"
fi
cleanup_fixture "$FIXTURE"

run_test
FIXTURE="$(setup_fixture)"
cat >> "$FIXTURE/harness/triage.yaml" << 'YAML'
openshell:
profiles:
- profiles/code.yaml
YAML
RESULT=$(echo "profiles/code.yaml" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ "$RESULT" == "triage" ]]; then
pass "top-level openshell profile change selects agent"
else
fail "top-level openshell profile change selects agent (got: '$RESULT')"
fi
cleanup_fixture "$FIXTURE"

# ---------------------------------------------------------------------------
# Test: schema file change selects agent
# ---------------------------------------------------------------------------
Expand Down Expand Up @@ -305,11 +407,6 @@ cleanup_fixture "$FIXTURE"
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
# Add a host_file with an embedded variable
cat >> "$FIXTURE/harness/triage.yaml" << 'YAML'
- src: env/${AGENT_NAME}.env
dest: /sandbox/workspace/.env.d/agent.env
YAML
RESULT=$(echo 'env/${AGENT_NAME}.env' | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
if [[ -z "$RESULT" ]]; then
pass "embedded variable host_file paths are ignored"
Expand Down Expand Up @@ -387,7 +484,7 @@ cleanup_fixture "$FIXTURE"
# ---------------------------------------------------------------------------
run_test
FIXTURE="$(setup_fixture)"
RESULT=$(printf "env/triage.env\nenv/triage.env\nenv/triage.env\n" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
RESULT=$(printf "env/github/triage.env\nenv/github/triage.env\nenv/github/triage.env\n" | "$SELECT_SCRIPT" --repo-root "$FIXTURE")
LINES=$(echo "$RESULT" | grep -c "triage")
if [[ "$LINES" -eq 1 ]]; then
pass "duplicate file inputs produce single agent output"
Expand Down
6 changes: 4 additions & 2 deletions .github/scripts/select-eval-agents.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# whose functional tests should run.
#
# Usage:
# echo "env/triage.env" | ./select-eval-agents.sh [--repo-root <path>]
# echo "env/github/triage.env" | ./select-eval-agents.sh [--repo-root <path>]
#
# Logic:
# For each harness/*.yaml that has a corresponding eval/<agent>/eval.yaml,
Expand Down Expand Up @@ -39,7 +39,9 @@ extract_refs() {
(.host_files[]?.src),
(.skills[]?),
(.plugins[]?),
.forge.github.pre_script, .forge.github.post_script
(.providers[]?),
(.openshell?.profiles[]?),
(.forge[]? | (.pre_script, .post_script, .policy, (.skills[]?), (.host_files[]?.src), (.providers[]?), (.openshell?.profiles[]?)))
] | .[] | select(. != null)
' "$harness_file" | { grep -v '\$' || true; } | sort -u
}
Expand Down
8 changes: 5 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,16 @@ does not exist at platform level.

To override an upstream skill, create a custom harness with `base:`
composition pointing to the upstream harness and include the replacement
skill in the `skills:` array. For example, to override `issue-labels`
for the review agent:
skill in the `skills:` array. The override path's basename must match
the upstream skill's basename so `mergeSkills` dedupes by basename and
yours wins. For example, to override `issue-labels/github` for the
review agent:

```yaml
# .fullsend/review.yaml
base: https://raw.githubusercontent.com/fullsend-ai/agents/<SHA>/harness/review.yaml#sha256=<sha256sum>
skills:
- .agents/skills/issue-labels
- .agents/skills/issue-labels/github
```

See [Custom sandbox image — How to configure](docs/code.md#how-to-configure)
Expand Down
3 changes: 2 additions & 1 deletion FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ Ask yourself:
that logic lives.
- [ ] **Both:** Some features may require changes in both.
- [ ] **Generated scripts:** `scripts/pre-code.sh`, `scripts/post-code.sh`,
`scripts/post-fix.sh`, and `scripts/post-prioritize.sh` are generated
`scripts/post-fix.sh`, `scripts/post-prioritize.sh`,
`scripts/pre-triage.sh`, and `scripts/post-triage.sh` are generated
from the corresponding `scripts/<name>.src.sh` — edit the `.src.sh`
file and run
`make script-build` to regenerate the committed `.sh`. Run
Expand Down
1 change: 1 addition & 0 deletions LOCAL.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ Export the variables the agent needs:
```bash
export GITHUB_ISSUE_URL="https://github.com/your-org/test-repo/issues/25"
export GH_TOKEN="$(gh auth token)"
export FULLSEND_FORGE="github"

# GCP/Vertex AI credentials — required by most agents via
# common/env/gcp-vertex.env and the host_files GOOGLE_APPLICATION_CREDENTIALS
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.DEFAULT_GOAL := help
.PHONY: help script-build check-bundle script-test test

BUNDLE_SRCS := scripts/pre-code.src.sh scripts/post-code.src.sh scripts/post-fix.src.sh scripts/post-prioritize.src.sh
BUNDLE_SRCS := scripts/pre-code.src.sh scripts/post-code.src.sh scripts/post-fix.src.sh scripts/post-prioritize.src.sh scripts/pre-triage.src.sh scripts/post-triage.src.sh
BUNDLE_OUTS := $(BUNDLE_SRCS:.src.sh=.sh)
LIB_DEPS := $(wildcard scripts/lib/*.lib.sh)

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# fullsend agents

First-class agents for the [fullsend](https://github.com/fullsend-ai/fullsend) platform. These agents automate the software development lifecycle on GitHub — from issue triage through code implementation, review, fix, prioritization, and retrospective analysis.
First-class agents for the [fullsend](https://github.com/fullsend-ai/fullsend) platform. These agents automate the software development lifecycle on GitHub and GitLab — from issue triage through code implementation, review, fix, prioritization, and retrospective analysis.

## Agents

Expand All @@ -24,7 +24,7 @@ harness/ Harness configurations (sandbox image, timeout, scripts, plugins)
policies/ Sandbox security policies (filesystem, network, binary restrictions)
env/ Per-agent environment variables
schemas/ JSON Schema for validating agent structured output
scripts/ Pre-scripts (input validation) and post-scripts (GitHub mutations)
scripts/ Pre-scripts (input validation) and post-scripts (forge mutations)
skills/ Reusable skill definitions loaded by agents at runtime
plugins/ Sandbox plugins (e.g. gopls LSP for the code agent)
common/ Shared configuration (GCP Vertex AI auth)
Expand Down
Loading
Loading