From 04492d2f79538002197429b12085b9d01893e4fe Mon Sep 17 00:00:00 2001 From: Luca Muscariello Date: Tue, 11 Nov 2025 22:59:52 +0100 Subject: [PATCH 1/4] feat(scripts): add version support to generate_types.sh - Add A2A_SPEC_VERSION environment variable (default: v0.3.0) - Support version specification via --version flag - Auto-detect version type (tag/branch/commit SHA) - Add URL validation before generating types - Improve error messages and usage documentation - Add input file existence validation Signed-off-by: Luca Muscariello --- scripts/generate_types.sh | 83 ++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 10 deletions(-) diff --git a/scripts/generate_types.sh b/scripts/generate_types.sh index b8d7dedf..cbc53f99 100755 --- a/scripts/generate_types.sh +++ b/scripts/generate_types.sh @@ -4,7 +4,32 @@ # Treat unset variables as an error. set -euo pipefail -REMOTE_URL="https://raw.githubusercontent.com/a2aproject/A2A/refs/heads/main/specification/json/a2a.json" +# A2A specification version to use +# Can be overridden via environment variable: A2A_SPEC_VERSION=v1.2.0 ./generate_types.sh +# Or via command-line flag: ./generate_types.sh --version v1.2.0 output.py +# Use a specific git tag, branch name, or commit SHA +# Examples: "v1.0.0", "v1.2.0", "main", "abc123def" +A2A_SPEC_VERSION="${A2A_SPEC_VERSION:-v0.3.0}" + +# Build URL based on version format +# Tags use /refs/tags/, branches use /refs/heads/, commits use direct ref +build_remote_url() { + local version="$1" + local base_url="https://raw.githubusercontent.com/a2aproject/A2A" + + if [[ "$version" =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]]; then + # Looks like a version tag (v1.0.0, v1.2.3) + echo "${base_url}/refs/tags/${version}/specification/json/a2a.json" + elif [[ "$version" =~ ^[0-9a-f]{7,40}$ ]]; then + # Looks like a commit SHA (7+ hex chars) + echo "${base_url}/${version}/specification/json/a2a.json" + else + # Assume it's a branch name (main, develop, etc.) + echo "${base_url}/refs/heads/${version}/specification/json/a2a.json" + fi +} + +REMOTE_URL=$(build_remote_url "$A2A_SPEC_VERSION") GENERATED_FILE="" INPUT_FILE="" @@ -12,20 +37,39 @@ INPUT_FILE="" # Parse command-line arguments while [[ $# -gt 0 ]]; do case "$1" in - --input-file) - INPUT_FILE="$2" - shift 2 - ;; - *) - GENERATED_FILE="$1" - shift 1 - ;; + --input-file) + INPUT_FILE="$2" + shift 2 + ;; + --version) + A2A_SPEC_VERSION="$2" + REMOTE_URL=$(build_remote_url "$A2A_SPEC_VERSION") + shift 2 + ;; + *) + GENERATED_FILE="$1" + shift 1 + ;; esac done if [ -z "$GENERATED_FILE" ]; then echo "Error: Output file path must be provided." >&2 - echo "Usage: $0 [--input-file ] " + echo "Usage: $0 [--input-file ] [--version ] " + echo "" + echo "Options:" + echo " --input-file Use a local JSON schema file instead of fetching from remote" + echo " --version Specify A2A spec version (default: v0.3.0)" + echo " Can be a git tag (v1.0.0), branch (main), or commit SHA" + echo "" + echo "Environment variables:" + echo " A2A_SPEC_VERSION Override default spec version" + echo "" + echo "Examples:" + echo " $0 src/a2a/types.py" + echo " $0 --version v1.2.0 src/a2a/types.py" + echo " $0 --input-file local/a2a.json src/a2a/types.py" + echo " A2A_SPEC_VERSION=main $0 src/a2a/types.py" exit 1 fi @@ -33,9 +77,28 @@ echo "Running datamodel-codegen..." declare -a source_args if [ -n "$INPUT_FILE" ]; then echo " - Source File: $INPUT_FILE" + if [ ! -f "$INPUT_FILE" ]; then + echo "Error: Input file does not exist: $INPUT_FILE" >&2 + exit 1 + fi source_args=("--input" "$INPUT_FILE") else + echo " - A2A Spec Version: $A2A_SPEC_VERSION" echo " - Source URL: $REMOTE_URL" + + # Validate that the remote URL is accessible + echo " - Validating remote URL..." + if ! curl --fail --silent --head "$REMOTE_URL" >/dev/null 2>&1; then + echo "" >&2 + echo "Error: Unable to access A2A specification at version '$A2A_SPEC_VERSION'" >&2 + echo "URL: $REMOTE_URL" >&2 + echo "" >&2 + echo "The version may not exist. Available versions can be found at:" >&2 + echo " https://github.com/a2aproject/A2A/tags" >&2 + echo "" >&2 + exit 1 + fi + source_args=("--url" "$REMOTE_URL") fi echo " - Output File: $GENERATED_FILE" From 1ff9d0abff8006092a8f14b5ac82c5bbcae94f30 Mon Sep 17 00:00:00 2001 From: Luca Muscariello Date: Tue, 11 Nov 2025 23:17:29 +0100 Subject: [PATCH 2/4] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- scripts/generate_types.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/generate_types.sh b/scripts/generate_types.sh index cbc53f99..591d0eea 100755 --- a/scripts/generate_types.sh +++ b/scripts/generate_types.sh @@ -16,17 +16,20 @@ A2A_SPEC_VERSION="${A2A_SPEC_VERSION:-v0.3.0}" build_remote_url() { local version="$1" local base_url="https://raw.githubusercontent.com/a2aproject/A2A" + local spec_path="specification/json/a2a.json" + local url_part - if [[ "$version" =~ ^v[0-9]+\.[0-9]+\.[0-9]+ ]]; then + if [[ "$version" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then # Looks like a version tag (v1.0.0, v1.2.3) - echo "${base_url}/refs/tags/${version}/specification/json/a2a.json" + url_part="refs/tags/${version}" elif [[ "$version" =~ ^[0-9a-f]{7,40}$ ]]; then # Looks like a commit SHA (7+ hex chars) - echo "${base_url}/${version}/specification/json/a2a.json" + url_part="${version}" else # Assume it's a branch name (main, develop, etc.) - echo "${base_url}/refs/heads/${version}/specification/json/a2a.json" + url_part="refs/heads/${version}" fi + echo "${base_url}/${url_part}/${spec_path}" } REMOTE_URL=$(build_remote_url "$A2A_SPEC_VERSION") From 773e443efa008f2c6fc1e866176ba011069f2492 Mon Sep 17 00:00:00 2001 From: Luca Muscariello Date: Tue, 11 Nov 2025 23:19:53 +0100 Subject: [PATCH 3/4] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- scripts/generate_types.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/scripts/generate_types.sh b/scripts/generate_types.sh index 591d0eea..030cd52a 100755 --- a/scripts/generate_types.sh +++ b/scripts/generate_types.sh @@ -92,13 +92,15 @@ else # Validate that the remote URL is accessible echo " - Validating remote URL..." if ! curl --fail --silent --head "$REMOTE_URL" >/dev/null 2>&1; then - echo "" >&2 - echo "Error: Unable to access A2A specification at version '$A2A_SPEC_VERSION'" >&2 - echo "URL: $REMOTE_URL" >&2 - echo "" >&2 - echo "The version may not exist. Available versions can be found at:" >&2 - echo " https://github.com/a2aproject/A2A/tags" >&2 - echo "" >&2 + cat >&2 < Date: Tue, 11 Nov 2025 23:25:50 +0100 Subject: [PATCH 4/4] chore(scripts): update output Signed-off-by: Luca Muscariello --- scripts/generate_types.sh | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/scripts/generate_types.sh b/scripts/generate_types.sh index 030cd52a..6c01cff5 100755 --- a/scripts/generate_types.sh +++ b/scripts/generate_types.sh @@ -57,22 +57,21 @@ while [[ $# -gt 0 ]]; do done if [ -z "$GENERATED_FILE" ]; then - echo "Error: Output file path must be provided." >&2 - echo "Usage: $0 [--input-file ] [--version ] " - echo "" - echo "Options:" - echo " --input-file Use a local JSON schema file instead of fetching from remote" - echo " --version Specify A2A spec version (default: v0.3.0)" - echo " Can be a git tag (v1.0.0), branch (main), or commit SHA" - echo "" - echo "Environment variables:" - echo " A2A_SPEC_VERSION Override default spec version" - echo "" - echo "Examples:" - echo " $0 src/a2a/types.py" - echo " $0 --version v1.2.0 src/a2a/types.py" - echo " $0 --input-file local/a2a.json src/a2a/types.py" - echo " A2A_SPEC_VERSION=main $0 src/a2a/types.py" + cat >&2 <] [--version ] +Options: + --input-file Use a local JSON schema file instead of fetching from remote + --version Specify A2A spec version (default: v0.3.0) + Can be a git tag (v1.0.0), branch (main), or commit SHA +Environment variables: + A2A_SPEC_VERSION Override default spec version +Examples: + $0 src/a2a/types.py + $0 --version v1.2.0 src/a2a/types.py + $0 --input-file local/a2a.json src/a2a/types.py + A2A_SPEC_VERSION=main $0 src/a2a/types.py +EOF exit 1 fi