with one click
a2a-jakarta-sut
// Work with the a2a-jakarta SUT (System Under Test). Use when the user wants to regenerate the Jakarta SUT from Gherkin scenarios, build it, run it, or test it with the TCK.
// Work with the a2a-jakarta SUT (System Under Test). Use when the user wants to regenerate the Jakarta SUT from Gherkin scenarios, build it, run it, or test it with the TCK.
Work with the a2a-java SUT (System Under Test). Use when the user wants to regenerate the Java SUT from Gherkin scenarios, build it, run it, or test it with the TCK.
Work with the a2a-python SUT (System Under Test). Use when the user wants to regenerate the Python SUT from Gherkin scenarios, build it, run it, or test it with the TCK.
Diagnose a TCK requirement failure and draft a GitHub issue with the requirement context, failure details, and a curl reproducer. Use when the user wants to report a failing requirement, understand why it failed, or create a bug report for an SUT implementor.
Help an SDK implementor run the A2A TCK against their System Under Test (SUT). Use when the user wants to validate their A2A agent implementation, debug TCK failures, or understand conformance results.
Interact with remote AI agents using the A2A (Agent-to-Agent) protocol as a client. Use this skill whenever the user wants to communicate with an A2A agent, send tasks to a remote agent, discover agent capabilities, check task status, or get results from an A2A-compatible service. Trigger on mentions of A2A, agent-to-agent, remote agents, agent cards, or when the user provides a URL to an A2A agent endpoint.
Learn about a specific TCK requirement. Use when the user asks about a requirement ID (e.g. CORE-SEND-001, GRPC-ERR-001), wants to understand what it tests, or needs to find the spec section, tests, and validators related to a requirement.
| name | a2a-jakarta-sut |
| description | Work with the a2a-jakarta SUT (System Under Test). Use when the user wants to regenerate the Jakarta SUT from Gherkin scenarios, build it, run it, or test it with the TCK. |
| compatibility | Requires Python 3.11+, uv, Java 17+, and Maven |
| allowed-tools | Bash(make:*) Bash(mvn:*) Bash(java:*) Bash(curl:*) Bash(kill:*) Bash(lsof:*) Bash(uv:*) Read Edit Write Glob Grep Agent |
The a2a-jakarta SUT is a WildFly application generated from Gherkin .feature files in scenarios/. It implements the A2A protocol using the Jakarta EE A2A SDK and serves as a conformance target for TCK tests.
scenarios/*.feature → codegen (parser + steps + jakarta_emitter) → sut/a2a-jakarta/
scenarios/*.feature) define SUT behavior via messageId prefix matchingcodegen/) parses .feature files and emits a WildFly projectcodegen/a2a-jakarta/*.j2) produce the Java sources, pom.xml, beans.xml, and JAX-RS Application classsut/a2a-jakarta/) is a complete Maven WAR project| File | Template | Purpose |
|---|---|---|
TckAgentExecutorProducer.java | TckAgentExecutorProducer.java.j2 | CDI producer for AgentExecutor; routes by messageId prefix |
TckAgentCardProducer.java | TckAgentCardProducer.java.j2 | CDI producer for AgentCard with all three transports |
TckApplication.java | TckApplication.java.j2 | JAX-RS @ApplicationPath("/") entry point |
beans.xml | beans.xml.j2 | CDI descriptor with gRPC exclusion |
pom.xml | pom.xml.j2 | Maven build with WildFly plugin and Jakarta SDK dependencies |
The generated AgentExecutor matches on the messageId prefix from incoming messages:
if (messageId.startsWith("tck-complete-task")) {
emitter.complete(A2A.toAgentMessage("Hello from TCK"));
return;
}
The TCK tests use tck_id("complete-task") which generates tck-complete-task-<session_hex>, matching the prefix.
The Jakarta SDK version is controlled by the A2A_JAKARTA_SDK_VERSION environment variable.
The default value is defined in codegen/jakarta_emitter.py (_DEFAULT_A2A_JAKARTA_SDK_VERSION).
Read the actual default version from codegen/jakarta_emitter.py (grep for _DEFAULT_A2A_JAKARTA_SDK_VERSION) and check the env var. Report to the user which version will be used and propose setting the env var if they want a different version:
# Use default version
make codegen-a2a-jakarta-sut
# Use a specific version
A2A_JAKARTA_SDK_VERSION=1.0.0.Alpha4 make codegen-a2a-jakarta-sut
The a2a-java SDK version (used for a2a-java-sdk-client and a2a-java-sdk-server-common dependencies) is controlled by A2A_JAVA_SDK_VERSION. Its default is defined in codegen/java_emitter.py (_DEFAULT_A2A_JAVA_SDK_VERSION).
The WildFly and gRPC feature pack versions can also be overridden:
WILDFLY_VERSION (default in codegen/jakarta_emitter.py)WILDFLY_GRPC_VERSION (default in codegen/jakarta_emitter.py)When Gherkin scenarios change, regenerate the Jakarta project:
make codegen-a2a-jakarta-sut
This runs uv run python -m codegen.generator --target a2a-jakarta --output sut/a2a-jakarta which:
scenarios/*.feature filescodegen/steps.pycodegen/a2a-jakarta/To add new behaviors:
.feature file in scenarios/codegen/steps.py, add a new entrycodegen/model.py and handle it in codegen/java_emitter.py (shared with jakarta_emitter.py)make codegen-a2a-jakarta-sutTemplates are in codegen/a2a-jakarta/:
TckAgentExecutorProducer.java.j2 — handler routing and action codeTckAgentCardProducer.java.j2 — agent card with capabilities and interfacesTckApplication.java.j2 — JAX-RS Application classbeans.xml.j2 — CDI beans descriptorpom.xml.j2 — Maven dependencies (WildFly plugin, Jakarta SDK, transport profiles)After modifying templates, regenerate with make codegen-a2a-jakarta-sut.
cd sut/a2a-jakarta && mvn package
The default Maven profile includes JSONRPC, gRPC, and HTTP+JSON transports.
~/.m2/repository/org/wildfly/a2a/).cd sut/a2a-jakarta && mvn wildfly:dev
The SUT listens on:
http://localhost:8080 (POST)localhost:9555 (separate port)http://localhost:8080 (REST routes)curl -s http://localhost:8080/.well-known/agent-card.json | python3 -m json.tool
The agent card should list all three supportedInterfaces (JSONRPC, GRPC, HTTP+JSON).
When sending manual requests to the SUT, use tck/requirements/base.py as the source of truth for method names and sample_input fields in requirement specs (e.g., tck/requirements/core_operations.py) for request payload format.
SendMessage (JSON-RPC):
curl -s -X POST http://localhost:8080/ \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":"1","method":"SendMessage","params":{"message":{"messageId":"tck-complete-task-1234","role":"ROLE_USER","parts":[{"text":"Hello from TCK"}]}}}'
If port 8080 is already in use:
lsof -ti:8080 | xargs kill -9
Use the run-tck skill to run the TCK against this SUT with the host being http://localhost:8080.
Read reports/compatibility.json for structured results. For detailed diagnosis, use the diagnose-failure skill.
/.well-known/agent-card.jsontck_id() usage in tests vs prefix in .feature fileThe typical development cycle is:
scenarios/*.featuremake codegen-a2a-jakarta-sutcd sut/a2a-jakarta && mvn packageuv run ./run_tck.py --sut-host http://localhost:8080 -- -k "test_name" -vThe codegen has its own unit tests:
make unit-test
This runs tests in tests/unit/codegen/ covering the parser, step resolution, Jakarta emitter, and generator CLI.