diff --git a/.github/labelers/area.yml b/.github/labelers/area.yml new file mode 100644 index 0000000000..7082be6e51 --- /dev/null +++ b/.github/labelers/area.yml @@ -0,0 +1,45 @@ +# .github/labelers/area.yml +# Classifies issues by technical area/subsystem. + +instructions: | + This is the Strands Agents SDK repository (Python + TypeScript monorepo). + CI dependency bumps (dependabot, renovate) should be labeled area-community. + MCP tools should be labeled area-mcp, not area-tool. + Provider-specific async/streaming bugs belong to area-provider, not area-async. + Issues about hook lifecycle events belong to area-hooks even if they mention tools or agents. + +labels: + area-a2a: + description: "Agent-to-Agent protocol, A2AAgent, A2AClient, A2AServer, agent cards" + area-async: + description: "Asynchronous flows, multi-threading, asyncio, concurrent execution, event loops" + area-bidirectional-streaming: + description: "Bidirectional streaming, BidiAgent, real-time audio/video, WebRTC, WebSocket, Nova Sonic" + area-community: + description: "Community health, monorepo consolidation, contributor guides, governance, CI dependency bumps" + area-config: + description: "Config-based agents, agent config files, mcp-config, declarative definitions" + area-context: + description: "Conversation management, context windows, context reduction, sliding window, token management" + area-devx: + description: "Developer experience, better APIs, ergonomics, helper methods, error messages, usability" + area-hil: + description: "Human-in-the-loop, interrupt/resume, suspend/resume, approval workflows" + area-hooks: + description: "Hook events, hook registry, callbacks, lifecycle events, BeforeEvent/AfterEvent" + area-language: + description: "New language SDKs (Ruby, .NET, Rust, Go, etc.)" + area-mcp: + description: "Model Context Protocol, MCP servers/clients/transport/tools" + area-multiagent: + description: "Multi-agent patterns, swarm, graph, orchestrator, agent-as-tool, arena" + area-otel: + description: "OpenTelemetry, tracing, metrics, spans, observability, OTLP" + area-persistence: + description: "Session storage, checkpointing, S3SessionManager, DynamoDB sessions, state serialization" + area-provider: + description: "Model providers (Bedrock, OpenAI, Anthropic, Ollama, LiteLLM, SageMaker, vLLM, Mistral)" + area-structured-output: + description: "Structured output API, JSON schema enforcement, Pydantic output models" + area-tool: + description: "Tool behavior, tool definitions, tool execution, @tool decorator, tool results" diff --git a/.github/labelers/language.yml b/.github/labelers/language.yml new file mode 100644 index 0000000000..1f69ee7884 --- /dev/null +++ b/.github/labelers/language.yml @@ -0,0 +1,16 @@ +# .github/labelers/language.yml +# Identifies which SDK language the issue relates to. +# Use max_labels: 1 since most issues target one language. + +instructions: | + This is a monorepo with Python and TypeScript SDKs. + Look for language-specific keywords: Python paths (strands-py/, .py files, pip, pyproject.toml), + TypeScript paths (strands-ts/, .ts files, npm, package.json). + If the issue clearly targets both languages equally, prefer the language where the bug or feature originates. + If the issue is language-agnostic or unclear, do not assign a label. + +labels: + python: + description: "Issue relates to the Python SDK (strands-py/, .py files, pip, pyproject.toml)" + javascript: + description: "Issue relates to the TypeScript/JavaScript SDK (strands-ts/, .ts files, npm, package.json)" diff --git a/.github/labelers/type.yml b/.github/labelers/type.yml new file mode 100644 index 0000000000..afbe3745de --- /dev/null +++ b/.github/labelers/type.yml @@ -0,0 +1,18 @@ +# .github/labelers/type.yml +# Classifies issues by type (bug, feature, etc.) +# Use max_labels: 1 in the workflow since these are mutually exclusive. + +instructions: | + Choose exactly one type. If the title starts with [BUG] it is a bug. + If the title starts with [FEATURE] it is an enhancement. + CI/dependency PRs that open as issues are chores. + +labels: + bug: + description: "Something is broken or not working as documented" + enhancement: + description: "New feature request or improvement to existing functionality" + question: + description: "User asking for help, clarification, or how to do something" + chore: + description: "Maintenance tasks, dependency updates, CI changes, refactoring with no user-facing impact" diff --git a/.github/workflows/issue-labeler.yml b/.github/workflows/issue-labeler.yml new file mode 100644 index 0000000000..9ac7e5e627 --- /dev/null +++ b/.github/workflows/issue-labeler.yml @@ -0,0 +1,56 @@ +name: Issue Labeler + +on: + issues: + types: [opened] + +permissions: + issues: write + id-token: write + contents: read + +jobs: + label-area: + name: "Label: Area" + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: .github/labelers + sparse-checkout-cone-mode: false + # max_labels omitted: issues may span multiple areas + - uses: strands-agents/devtools/issue-labeler@main + with: + aws_role_arn: ${{ secrets.AWS_ROLE_ARN }} + config_path: '.github/labelers/area.yml' + + label-type: + name: "Label: Type" + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: .github/labelers + sparse-checkout-cone-mode: false + - uses: strands-agents/devtools/issue-labeler@main + with: + aws_role_arn: ${{ secrets.AWS_ROLE_ARN }} + config_path: '.github/labelers/type.yml' + max_labels: '1' + + label-language: + name: "Label: Language" + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - uses: actions/checkout@v4 + with: + sparse-checkout: .github/labelers + sparse-checkout-cone-mode: false + - uses: strands-agents/devtools/issue-labeler@main + with: + aws_role_arn: ${{ secrets.AWS_ROLE_ARN }} + config_path: '.github/labelers/language.yml' + max_labels: '1'