Repository navigation
Add scrum-master scenario: Scrum Master autopilot using Node.js SDK #334
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
keshav Keshari (keshavk-msft)
wants to merge
37
commits into
microsoft:main
Choose a base branch
from
keshavk-msft:scenario/scrum-master
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+22,117
−103
Open
Changes from all commits
Commits
Show all changes
37 commits
Select commit
Hold shift + click to select a range
d33aecc
Add scrum-master scenario: Scrum Master autopilot using Node.js SDK
keshavk-msft feb98d9
Add Jira sample-data seed script + SharePoint schema doc
keshavk-msft 1c5a4af
Rewrite README: intro-features-prereqs-setup structure
keshavk-msft 251de83
Add observability + docs polish (safe additions only)
keshavk-msft ca578fa
Address Copilot review feedback on PR #334
keshavk-msft aa27069
Add m365-visitor-stats tracking pixel to README
keshavk-msft ff11662
Harden calendar tool: detect garbage LLM output shape
keshavk-msft 2335201
Wire A365 observability + address open review comments
keshavk-msft 5e8a957
Complete observability instrumentation + fix Task-N label mapping
keshavk-msft 0c5b4a7
Resolve remaining Copilot review comments
keshavk-msft 812c25d
Fix scrum-master build scope and document fresh setup troubleshooting
keshavk-msft 94afea8
Fix scrum-master PR review feedback
keshavk-msft 69bc367
Upgrade scrum-master to patched Zod and compatible OpenAI SDKs
keshavk-msft a371dc1
Address latest Scrum Master review feedback
keshavk-msft 08a7d3d
Merge current upstream main into Scrum Master PR
keshavk-msft 38160d3
Fix Linux scenario tests and vulnerable hosting MSAL
keshavk-msft f0d35a6
Patch OpenTelemetry and make Node 22 compatibility tests independent
keshavk-msft e9d68a5
Patch Jaeger propagator and verify safe header handling
keshavk-msft 98cbda7
Document conversation isolation and project-scoped Jira reads
keshavk-msft 247229a
Use verified upstream redirect security release
keshavk-msft 7bfb010
Fix standup lifecycle review feedback and patch protobuf runtime
keshavk-msft 9034de4
Align protobuf lockfile placement with Node 22 npm
keshavk-msft f472fd7
Use patched Zod across hosting and activity validation
keshavk-msft 621135e
Complete verified standup and report review requirements
keshavk-msft 946e39e
Make older-review regression loader portable on Linux
keshavk-msft 8321308
Address five Scrum Master PR review comments
keshavk-msft 9d34b05
Fix sprint epic filtering and preserve failed early standup cutoff
keshavk-msft a8dad50
Enforce authorization for standup and Scrum Master actions
keshavk-msft 1554ba1
Include issue binding in blocker dismissal cards
keshavk-msft 2558f2e
Fix Teams group authorization and make standup submissions idempotent
keshavk-msft 05201a4
Fix standup follow-up retries, invoke acknowledgements and report gro…
Copilot 7bc77d8
Merge upstream main and retain both scenario CI jobs
Copilot b6e7cce
Label keyword-based sprint metrics as completed task categories
Copilot 55b9397
Include grounded report metrics in the prepared upstream merge
Copilot 1a48d1e
Preserve calendar availability and defer standup entry network work
Copilot b7c76c1
Harden ceremony contracts and address remaining review feedback
Copilot e88d769
Align startup, recovery and Jira writes with runtime contracts
Copilot File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| # Copyright (c) Microsoft Corporation. | ||
| # Licensed under the MIT License. | ||
|
|
||
| name: CI - Scrum Master Scenario | ||
|
|
||
| on: | ||
| workflow_call: | ||
| workflow_dispatch: | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| scrum-master: | ||
| name: Scrum Master (Node 22) | ||
| runs-on: ubuntu-latest | ||
| defaults: | ||
| run: | ||
| working-directory: ./scenarios/scrum-master | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 | ||
| - name: Set up Node.js 22 | ||
| uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 | ||
| with: | ||
| node-version: '22' | ||
| cache: npm | ||
| cache-dependency-path: | | ||
| scenarios/scrum-master/package-lock.json | ||
| scenarios/scrum-master/azure-functions/package-lock.json | ||
| - name: Install dependencies | ||
| run: npm ci | ||
| - name: Build | ||
| run: npm run build | ||
| - name: Test | ||
| run: npm test | ||
| - name: Install timer dependencies | ||
| run: npm ci | ||
| working-directory: ./scenarios/scrum-master/azure-functions | ||
| - name: Build timers | ||
| run: npm run build | ||
| working-directory: ./scenarios/scrum-master/azure-functions |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,103 +1,101 @@ | ||
| # Copyright (c) Microsoft Corporation. | ||
| # Licensed under the MIT License. | ||
|
|
||
| name: CI Orchestrator | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main, master] | ||
| pull_request: | ||
| branches: [main, master] | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| # .NET Jobs - Call existing workflows | ||
| dotnet-agentframework: | ||
| name: .NET Agent Framework | ||
| uses: ./.github/workflows/ci-dotnet-agentframework-sampleagent.yml | ||
|
|
||
| dotnet-semantickernel: | ||
| name: .NET Semantic Kernel | ||
| uses: ./.github/workflows/ci-dotnet-semantickernel-sampleagent.yml | ||
|
|
||
| # Node.js Jobs - Call existing workflows | ||
| nodejs-claude: | ||
| name: Node.js Claude | ||
| uses: ./.github/workflows/ci-nodejs-claude-sampleagent.yml | ||
|
|
||
| nodejs-langchain: | ||
| name: Node.js LangChain | ||
| uses: ./.github/workflows/ci-nodejs-langchain-sampleagent.yml | ||
|
|
||
| nodejs-openai: | ||
| name: Node.js OpenAI | ||
| uses: ./.github/workflows/ci-nodejs-openai-sampleagent.yml | ||
|
|
||
| nodejs-vercelsdk: | ||
| name: Node.js Vercel SDK | ||
| uses: ./.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml | ||
|
|
||
| # Python Jobs - Call existing workflows | ||
| python-agentframework: | ||
| name: Python Agent Framework | ||
| uses: ./.github/workflows/ci-python-agentframework-sampleagent.yml | ||
|
|
||
| python-googleadk: | ||
| name: Python Google ADK | ||
| uses: ./.github/workflows/ci-python-googleadk-sampleagent.yml | ||
|
|
||
| python-openai: | ||
| name: Python OpenAI | ||
| uses: ./.github/workflows/ci-python-openai-sampleagent.yml | ||
|
|
||
| python-claude: | ||
| name: Python Claude | ||
| uses: ./.github/workflows/python-claude-sample.yml | ||
|
|
||
| observability: | ||
| name: Observability Offline Tests | ||
| uses: ./.github/workflows/ci-observability.yml | ||
|
|
||
| # Scenario Jobs | ||
| scenario-chief-of-staff: | ||
| name: Chief of Staff Scenario | ||
| uses: ./.github/workflows/ci-scenario-chief-of-staff.yml | ||
|
|
||
| # Final status check - ALWAYS runs and reports success | ||
| # This is the ONLY check you need to mark as "Required" in branch protection | ||
| ci-status: | ||
| name: CI Status | ||
| runs-on: ubuntu-latest | ||
| needs: | ||
| - dotnet-agentframework | ||
| - dotnet-semantickernel | ||
| - nodejs-claude | ||
| - nodejs-langchain | ||
| - nodejs-openai | ||
| - nodejs-vercelsdk | ||
| - python-agentframework | ||
| - python-googleadk | ||
| - python-openai | ||
| - python-claude | ||
| - observability | ||
| - scenario-chief-of-staff | ||
| if: always() | ||
| steps: | ||
| - name: Check CI Status | ||
| run: | | ||
| echo "Checking CI job results..." | ||
|
|
||
| # Get all job results (skipped jobs are fine, failed jobs are not) | ||
| results="${{ needs.dotnet-agentframework.result }} ${{ needs.dotnet-semantickernel.result }} ${{ needs.nodejs-claude.result }} ${{ needs.nodejs-langchain.result }} ${{ needs.nodejs-openai.result }} ${{ needs.nodejs-vercelsdk.result }} ${{ needs.python-agentframework.result }} ${{ needs.python-googleadk.result }} ${{ needs.python-openai.result }} ${{ needs.python-claude.result }} ${{ needs.observability.result }} ${{ needs.scenario-chief-of-staff.result }}" | ||
|
|
||
| echo "Job results: $results" | ||
|
|
||
| # Check if any job failed or was cancelled | ||
| if echo "$results" | grep -qE "failure|cancelled"; then | ||
| echo "❌ One or more CI jobs failed or were cancelled" | ||
| exit 1 | ||
| fi | ||
|
|
||
| echo "✅ All CI jobs passed" | ||
| # Copyright (c) Microsoft Corporation. | ||
| # Licensed under the MIT License. | ||
|
|
||
| name: CI Orchestrator | ||
|
|
||
| on: | ||
| push: | ||
| branches: [main, master] | ||
| pull_request: | ||
| branches: [main, master] | ||
|
|
||
| permissions: | ||
| contents: read | ||
|
|
||
| jobs: | ||
| # .NET Jobs - Call existing workflows | ||
| dotnet-agentframework: | ||
| name: .NET Agent Framework | ||
| uses: ./.github/workflows/ci-dotnet-agentframework-sampleagent.yml | ||
|
|
||
| dotnet-semantickernel: | ||
| name: .NET Semantic Kernel | ||
| uses: ./.github/workflows/ci-dotnet-semantickernel-sampleagent.yml | ||
|
|
||
| # Node.js Jobs - Call existing workflows | ||
| nodejs-claude: | ||
| name: Node.js Claude | ||
| uses: ./.github/workflows/ci-nodejs-claude-sampleagent.yml | ||
|
|
||
| nodejs-langchain: | ||
| name: Node.js LangChain | ||
| uses: ./.github/workflows/ci-nodejs-langchain-sampleagent.yml | ||
|
|
||
| nodejs-openai: | ||
| name: Node.js OpenAI | ||
| uses: ./.github/workflows/ci-nodejs-openai-sampleagent.yml | ||
|
|
||
| nodejs-vercelsdk: | ||
| name: Node.js Vercel SDK | ||
| uses: ./.github/workflows/ci-nodejs-vercelsdk-sampleagent.yml | ||
|
|
||
| nodejs-scrum-master: | ||
| name: Node.js Scrum Master | ||
| uses: ./.github/workflows/ci-nodejs-scrum-master.yml | ||
|
|
||
| # Python Jobs - Call existing workflows | ||
| python-agentframework: | ||
| name: Python Agent Framework | ||
| uses: ./.github/workflows/ci-python-agentframework-sampleagent.yml | ||
|
|
||
| python-googleadk: | ||
| name: Python Google ADK | ||
| uses: ./.github/workflows/ci-python-googleadk-sampleagent.yml | ||
|
|
||
| python-openai: | ||
| name: Python OpenAI | ||
| uses: ./.github/workflows/ci-python-openai-sampleagent.yml | ||
|
|
||
| python-claude: | ||
| name: Python Claude | ||
| uses: ./.github/workflows/python-claude-sample.yml | ||
|
|
||
| observability: | ||
| name: Observability Offline Tests | ||
| uses: ./.github/workflows/ci-observability.yml | ||
|
|
||
| # Scenario Jobs | ||
| scenario-chief-of-staff: | ||
| name: Chief of Staff Scenario | ||
| uses: ./.github/workflows/ci-scenario-chief-of-staff.yml | ||
|
|
||
| # This aggregate check is required in branch protection. | ||
| ci-status: | ||
| name: CI Status | ||
| runs-on: ubuntu-latest | ||
| needs: | ||
| - dotnet-agentframework | ||
| - dotnet-semantickernel | ||
| - nodejs-claude | ||
| - nodejs-langchain | ||
| - nodejs-openai | ||
| - nodejs-vercelsdk | ||
| - nodejs-scrum-master | ||
| - python-agentframework | ||
| - python-googleadk | ||
| - python-openai | ||
| - python-claude | ||
| - observability | ||
| - scenario-chief-of-staff | ||
| if: always() | ||
| steps: | ||
| - name: Check CI Status | ||
| run: | | ||
| echo "Checking CI job results..." | ||
| results="${{ needs.dotnet-agentframework.result }} ${{ needs.dotnet-semantickernel.result }} ${{ needs.nodejs-claude.result }} ${{ needs.nodejs-langchain.result }} ${{ needs.nodejs-openai.result }} ${{ needs.nodejs-vercelsdk.result }} ${{ needs.nodejs-scrum-master.result }} ${{ needs.python-agentframework.result }} ${{ needs.python-googleadk.result }} ${{ needs.python-openai.result }} ${{ needs.python-claude.result }} ${{ needs.observability.result }} ${{ needs.scenario-chief-of-staff.result }}" | ||
| echo "Job results: $results" | ||
| if echo "$results" | grep -qE "failure|cancelled"; then | ||
| echo "❌ One or more CI jobs failed or were cancelled" | ||
| exit 1 | ||
| fi | ||
| echo "✅ All CI jobs passed" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,114 @@ | ||
| # OpenAI Configuration | ||
| # Use EITHER standard OpenAI OR Azure OpenAI (not both) | ||
|
|
||
| # Option 1: Standard OpenAI API | ||
| OPENAI_API_KEY= | ||
| OPENAI_MODEL=gpt-4o | ||
|
|
||
| # Option 2: Azure OpenAI (takes precedence if AZURE_OPENAI_API_KEY is set) | ||
| AZURE_OPENAI_API_KEY= | ||
| AZURE_OPENAI_ENDPOINT= | ||
| AZURE_OPENAI_DEPLOYMENT= | ||
| AZURE_OPENAI_API_VERSION=2024-10-21 | ||
|
|
||
| # MCP Tooling Configuration | ||
| BEARER_TOKEN= | ||
|
|
||
| # Enable to use observability exporter, default is false which means using console exporter. | ||
| # MUST be true in any deployed/dev-tunnel environment or MAC Activity stays empty. | ||
| ENABLE_A365_OBSERVABILITY_EXPORTER=false | ||
| # Use by the sample to demo using custom token resolver and token cache when it is true, otherwise use the built-in AgenticTokenCache | ||
| Use_Custom_Resolver=true | ||
| # optional - set to enable observability logs, value can be 'info', 'warn', or 'error', default to 'none' if not set | ||
| A365_OBSERVABILITY_LOG_LEVEL= | ||
| # Uncomment together with A365_OBSERVABILITY_LOG_LEVEL to debug export failures. | ||
| # OTEL_LOG_LEVEL=INFO | ||
|
|
||
| # --- A365 observability identity --- | ||
| # Runtime agent identity (the AGENTIC INSTANCE, not the blueprint). Normally | ||
| # populated automatically from activity.recipient.agenticAppId. Set explicitly | ||
| # only if you invoke the observability helpers outside the standard A365 | ||
| # hosting flow (e.g. a stand-alone script). See src/observability.ts. | ||
| agent365Observability__agentInstanceId= | ||
|
|
||
| # Environment Settings | ||
| NODE_ENV=development # Retrieve mcp servers from ToolingManifest | ||
| HOST=127.0.0.1 # Agents Playground connects to 127.0.0.1; set this so the server binds to the same address | ||
|
|
||
| # Telemetry and Tracing Configuration | ||
| DEBUG=agents:* | ||
|
|
||
| # --- Scenario-level logging (this sample only) ------------------------------- | ||
| # Level-based logger in src/util/logger.ts. | ||
| # LOG_LEVEL: error | warn | info | debug | trace (default=info) | ||
| # LOG_HTTP: when 'true', traces instrumented axios requests (including Jira) | ||
| # with status + latency. Not Graph/fetch or MCP transport tracing. | ||
| # Credentials are redacted. Keep false in production. | ||
| LOG_LEVEL=info | ||
| LOG_HTTP=false | ||
|
|
||
| # Use Agentic Authentication rather than OBO | ||
| USE_AGENTIC_AUTH=false | ||
|
|
||
| # Service Connection Settings | ||
| connections__service_connection__settings__clientId= | ||
| connections__service_connection__settings__clientSecret= | ||
| connections__service_connection__settings__tenantId= | ||
|
|
||
| # Set service connection as default | ||
| connectionsMap__0__serviceUrl=* | ||
| connectionsMap__0__connection=service_connection | ||
|
|
||
| # AgenticAuthentication Options | ||
| agentic_type=agentic | ||
| agentic_altBlueprintConnectionName=service_connection | ||
| agentic_scopes=ea9ffc3e-8a23-4a7d-836d-234d7c7565c1/.default # Prod Agentic scope | ||
|
|
||
| # ============================================================================= | ||
| # Scrum Master Assistant POC configuration (added on top of the base sample) | ||
| # ============================================================================= | ||
|
|
||
| # --- Jira (Atlassian Cloud) --- | ||
| # Set JIRA_MODE=mock to run against the built-in mock sprint (no Atlassian creds needed). | ||
| JIRA_MODE=mock # live | mock | ||
| JIRA_BASE_URL=https://your-org.atlassian.net | ||
| JIRA_EMAIL= | ||
| JIRA_API_TOKEN= | ||
| JIRA_PROJECT_KEY=SCRUM # mock board key; replace for live Jira | ||
| JIRA_BOARD_ID=1 | ||
|
|
||
| # --- SharePoint (Microsoft Graph, delegated) --- | ||
| # Site URL of the site that will host the SMA_* lists + SprintReports library. | ||
| SHAREPOINT_SITE_URL= | ||
| SHAREPOINT_LISTS_PREFIX=SMA_ | ||
| # App registration used by scripts/setup-sharepoint.ts (device-code) and runtime Graph calls. | ||
| GRAPH_TENANT_ID=common | ||
| # Blank uses Microsoft Graph Command Line Tools public client | ||
| # (14d82eec-204b-4c2f-b7e8-296a70dab67e). Tenant policy/admin consent still applies. | ||
| # For production, register your own public client and set its app id here. | ||
| GRAPH_CLIENT_ID= | ||
|
|
||
| # --- Reporting destination authorization --- | ||
| # Required before /config channel; only roster members with Role=SM may configure it. | ||
| # Set the team's AAD group GUID (channelData.team.aadGroupId), not its 19:... connector ID. | ||
| SMA_ALLOWED_TEAM_ID= | ||
|
|
||
| # --- Scrum ceremony scheduling --- | ||
| STANDUP_CRON=0 30 3 * * 1-5 # UTC = 09:00 Asia/Kolkata on weekdays | ||
| NIGHTLY_CRON=0 0 19 * * * # UTC = 00:30 Asia/Kolkata daily | ||
|
keshavk-msft marked this conversation as resolved.
Resolved
keshavk-msft marked this conversation as resolved.
Resolved
|
||
| STANDUP_CUTOFF_HOURS=4 | ||
| TIMEZONE=Asia/Kolkata | ||
| # Both schedulers evaluate the expressions in UTC. TIMEZONE controls local | ||
| # date-based gates, card labels and meeting-slot searches, not cron evaluation. | ||
| # Leave WEBSITE_TIME_ZONE unset on the Functions app. | ||
|
|
||
| # --- Warn thresholds (Sprint risk detection) --- | ||
| WARN_TODO_PCT=0.40 # >40% of committed points still in To Do | ||
| WARN_SPRINT_PROGRESS_PCT=0.50 # ... once >=50% of sprint duration has elapsed | ||
|
|
||
| # --- Runtime toggles --- | ||
| LOCAL_CRON=true # run the in-process scheduler in dev; false in prod | ||
| AGENT_CALLBACK_URL= # Functions app setting: reachable agent base URL (no /api/messages suffix) | ||
| INTERNAL_TRIGGER_TOKEN= # required nonempty unless NODE_ENV is exactly development | ||
| # Cloud agent overrides: NODE_ENV=production, HOST=0.0.0.0, LOCAL_CRON=false | ||
| # when Functions timers are deployed. Do not copy the development values above. | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.