[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FMBDW5K3PR55VPWAP0JKN4":3,"skill-same:01M6FMBDW5K3PR55VPWAP0JKN4":96},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":74,"commitSha":75,"skillDirectory":76,"forksCount":77,"repositoryHtmlUrl":78,"repositoryHomepageUrl":6,"ownerHtmlUrl":79,"ownerBlogUrl":80,"ownerDescription":81,"updatedAt":82,"install":83,"resources":95},"01M6FMBDW5K3PR55VPWAP0JKN4","test-local",null,"Runs an Agent 365 AI Teammate agent locally and opens AgentsPlayground for interactive local testing. Works with any AI Teammate stack — .NET (AgentFramework, Semantic Kernel), Node.js (LangChain, OpenAI, Claude SDK, Semantic Kernel, Google ADK), or Python (AgentFramework, LangChain, OpenAI, Claude, Semantic Kernel, Google ADK). Checks prerequisites (agentsplayground CLI, build tools), builds the agent, starts it in the background, and launches the playground UI pointed at the local endpoint. AgentsPlayground connects to \u002Fapi\u002Fmessages over HTTP — the LLM framework does not matter.","microsoft\u002Fagent365-skills","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M6FM91VWNSWFWWYXD7SK7C7G",52,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fagent365\u002Fskills\u002Ftest-local\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"test local","test","local","llm framework","port","false","project","default","hooks","ok","haiku","testing","stack","Bash","api","messages","code","copilot","dotnet","adk","2026-11-10 10:12:30",false,"---\nname: test-local\ndescription: >\n  Runs an Agent 365 AI Teammate agent locally and opens AgentsPlayground for interactive\n  local testing. Works with any AI Teammate stack — .NET (AgentFramework, Semantic Kernel),\n  Node.js (LangChain, OpenAI, Claude SDK, Semantic Kernel, Google ADK), or\n  Python (AgentFramework, LangChain, OpenAI, Claude, Semantic Kernel, Google ADK).\n  Checks prerequisites (agentsplayground CLI, build tools), builds the agent, starts it in\n  the background, and launches the playground UI pointed at the local endpoint.\n  AgentsPlayground connects to \u002Fapi\u002Fmessages over HTTP — the LLM framework does not matter.\ncompatibility:\n  - claude-code\n  - vscode-copilot\n  - github-copilot-cli\nuser-invocable: true\nargument-hint: \"Optional: port number (default: 3978 for Node.js\u002FPython, 5000 for .NET)\"\nallowed-tools: Read, Glob, Grep, Bash, AskUserQuestion, TaskCreate, TaskUpdate, TaskList\nmodel: haiku\nhooks:\n  preToolUse:\n    - type: command\n      command: node ${CLAUDE_PLUGIN_ROOT}\u002Fhooks\u002FpreToolUse\u002Fpath-guard.js\n      timeout: 5000\n  stop:\n    - type: command\n      command: node ${CLAUDE_PLUGIN_ROOT}\u002Fhooks\u002Fstop\u002Fvalidate-test-local.js\n      timeout: 15000\n    - type: prompt\n      prompt: |\n        Before ending, verify ALL of the following:\n        1. Agent type was detected (.NET, Node.js, or Python — any AI Teammate stack).\n        2. agentsplayground CLI was verified as installed (or installed if missing).\n        3. Agent project built successfully (dotnet build, npm install, or pip install).\n        4. User was shown the launch commands for agent + AgentsPlayground.\n        If any item is incomplete, return {\"ok\": false, \"reason\": \"\u003Cspecific item>\"}.\n        If all items are complete, or the user declined to launch, return {\"ok\": true}.\n      timeout: 30000\n---\n\n# Test Agent Locally (AgentsPlayground)\n\n> **Trigger phrases** — any of these will activate this skill automatically:\n> - \"test this agent locally\"\n> - \"run my agent locally\"\n> - \"open agentsplayground\"\n> - \"launch agentsplayground\"\n> - \"start a local test session\"\n> - \"debug this agent locally\"\n> - \"test my agent without deploying to teams\"\n> - \"spin up a local test\"\n\n---\n\n## Overview\n\nThis skill starts your agent on localhost and opens **AgentsPlayground** — a local web UI that\nsimulates a Teams-like chat interface without requiring a deployment or Bot Framework auth.\n\n**What it does:**\n1. Detects agent language and framework (.NET, Node.js, or Python)\n2. Checks agentsplayground is installed — installs if missing\n3. Builds the agent to confirm there are no compile errors\n4. Starts the agent in the background\n5. Launches AgentsPlayground pointed at the local endpoint\n6. Guides a local test and confirms observability logs are flowing (if instrumented)\n\n**Why AgentsPlayground works for all AI Teammate stacks:**\n- Web UI that matches the Teams message format\n- Connects to `\u002Fapi\u002Fmessages` over HTTP — the LLM framework on the server side does not matter\n- The `-c emulator` flag bypasses Bot Framework auth — no extra config needed for any stack\n- `requireAuth: false` in `MapAgentApplicationEndpoints` is the only .NET-specific prerequisite\n\nAll actions are **read-only against your codebase** — no code is modified.\n\n---\n\n## Phase 0 — Create and Display Task List\n\n> **Show the user this checklist BEFORE Phase 1.** Exactly one task in_progress at a time; complete before moving on. Use whichever mechanism the runtime supports:\n> - **Claude Code:** call `TaskCreate` for each item below (already in `allowed-tools`); the list renders natively. Use `TaskUpdate` to flip statuses.\n> - **VS Code Copilot Chat \u002F GitHub Copilot CLI:** `allowed-tools` is ignored — emit a markdown checklist directly in chat (`- [ ] Detect agent type…`) and edit items to `- [x]` as each phase completes.\n\n```\nTaskCreate: \"Detect agent type and verify build tools\"\nTaskCreate: \"Install agentsplayground\"\nTaskCreate: \"Build agent\"\nTaskCreate: \"Launch agent and AgentsPlayground\"\nTaskCreate: \"Guide local test\"\n```\n\n---\n\n## Phase 1 — Detect Agent Type\n\n**Mark task in progress: \"Detect agent type and verify build tools\"**\n\n1. **Read** `${CLAUDE_PLUGIN_ROOT}\u002Fshared\u002Fagent-detection.md` for detection heuristics.\n\n2. **Check for detection cache.** Read `.a365-workspace-detection.local.json` if it exists. If `detectedAt` is within the last 60 minutes, load `agentStack` and `programmingLanguage` — skip the globs below and go to step 3.\n\n   If cache is missing or stale, run detection globs **in parallel**:\n   - **Glob** `**\u002F*.csproj` → .NET\n   - **Glob** `**\u002Fpackage.json` + `.ts`\u002F`.js` source files present → Node.js\n   - **Glob** `**\u002F*.py` or `requirements.txt` \u002F `pyproject.toml` → Python\n\n3. Determine default port:\n   - **.NET**: `5000` (HTTP, `dotnet run` default)\n   - **Node.js**: `3978` (standard Bot Framework port)\n   - **Python**: `3978` (aiohttp default in AI Teammate hosting layer)\n   - If the user provided a port as the skill argument, use that instead.\n\n4. Determine start command:\n   - **.NET**: `dotnet run`\n   - **Node.js**: `npm start` (fall back to `npm run dev` if `start` script absent)\n   - **Python**: detect entry point — check for `host_agent_server.py`, `app.py`, or `main.py`. Detect the Python command: `python3 --version 2>\u002Fdev\u002Fnull && echo python3 || echo python`. Use `python3` if available (macOS\u002FLinux default), otherwise `python` (Windows). Run with `\u003Cpython-cmd> \u003Centry>` (or `uvicorn app:app --port 3978` if an ASGI app is detected).\n\n5. If agent type cannot be determined, stop and ask:\n\n```\nAskUserQuestion:\n  question: \"I couldn't detect the agent type. What are you working with?\"\n  options:\n    - .NET (AgentFramework or Semantic Kernel)\n    - Node.js (LangChain, OpenAI, Claude SDK, Semantic Kernel, or Google ADK)\n    - Python (AgentFramework, LangChain, OpenAI, Claude, Semantic Kernel, or Google ADK)\n```\n\n### 1.3 — Check language build tool\n\nAfter detection, immediately verify the required build tool is installed:\n\n**For .NET** — check `dotnet --version`. If missing or below 8.0:\n```\nAskUserQuestion:\n  question: \"dotnet SDK 8.0+ is required but not found. Install it now?\"\n  options:\n    - \"Yes — install it for me\"\n    - \"No — I'll install manually and re-run\"\n```\nIf yes, show the appropriate command for the detected OS and ask the user to run it:\n```\nWindows:      winget install Microsoft.DotNet.SDK.8\nmacOS:        brew install --cask dotnet-sdk\nLinux:        sudo apt-get update && sudo apt-get install -y dotnet-sdk-8.0\n              (or: https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Finstall\u002Flinux)\nAll:          https:\u002F\u002Fdotnet.microsoft.com\u002Fdownload\n```\nAfter install, restart the terminal then run `dotnet --version` to confirm.\n\n**For Node.js** — check `node --version`. If missing or below 18:\n```\nAskUserQuestion:\n  question: \"Node.js 18+ is required but not found. Install it now?\"\n  options:\n    - \"Yes — install it for me\"\n    - \"No — I'll install manually and re-run\"\n```\nIf yes, show the appropriate command:\n```\nWindows:      winget install OpenJS.NodeJS.LTS\nmacOS:        brew install node\nLinux:        sudo apt-get update && sudo apt-get install -y nodejs npm\n              (or via nvm: curl -o- https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.0\u002Finstall.sh | bash && nvm install --lts)\nAll:          https:\u002F\u002Fnodejs.org (LTS)\n```\nAfter install, run `node --version` to confirm.\n\n**For Python** — check `python3 --version 2>\u002Fdev\u002Fnull || python --version`. If missing or below 3.11:\n```\nAskUserQuestion:\n  question: \"Python 3.11+ is required but not found. Install it now?\"\n  options:\n    - \"Yes — install it for me\"\n    - \"No — I'll install manually and re-run\"\n```\nIf yes, show the appropriate command:\n```\nWindows:      winget install Python.Python.3.11\nmacOS:        brew install python@3.11\nLinux:        sudo apt-get install -y python3.11 python3.11-venv python3-pip\nAll:          https:\u002F\u002Fpython.org\n```\nAfter install, confirm with `python3 --version 2>\u002Fdev\u002Fnull || python --version`.\n\n**Mark task complete: \"Detect agent type and verify build tools\"**\n\n---\n\n## Phase 2 — Install agentsplayground\n\n**Mark task in progress: \"Install agentsplayground\"**\n\nCheck if installed:\n\n```bash\nagentsplayground --version\n```\n\nIf found, report the version and continue.\n\n**If not found**, ask the user:\n\n> \"AgentsPlayground CLI is not installed. Install it now with `npm install -g @microsoft\u002Fagentsplayground`?\"\n> Options: **Yes, install it** \u002F **No, I'll install it manually**\n\nIf the user chooses **Yes**:\n\n```bash\nnpm install -g @microsoft\u002Fagentsplayground\n```\n\nVerify the install succeeded:\n\n```bash\nagentsplayground --version\n```\n\nIf installation fails or the user chooses **No**, stop and tell the user:\n> \"Install agentsplayground manually with: `npm install -g @microsoft\u002Fagentsplayground`\n> then re-run this skill.\"\n\nDo NOT continue if agentsplayground cannot be confirmed installed.\n\n**Mark task complete: \"Install agentsplayground\"**\n\n---\n\n## Phase 3 — Build Agent\n\n**Mark task in progress: \"Build agent\"**\n\n### For .NET\n\n```bash\ndotnet build\n```\n\n### For Node.js\n\n```bash\nnpm install\nnpm run build || npm run compile || echo \"No build script — skipping compile check\"\n```\n\n### For Python\n\n```bash\n# Use pip3 on macOS\u002FLinux, pip on Windows — try pip3 first\npip3 install -r requirements.txt 2>\u002Fdev\u002Fnull || pip install -r requirements.txt || pip install .\n# Verify the active Python version (use python3 on macOS\u002FLinux, python on Windows)\npython3 --version 2>\u002Fdev\u002Fnull || python --version\n```\n\nIf build fails, show the error output and stop:\n> \"Fix the build errors above and re-run this skill to continue.\"\n\nDo NOT attempt to launch a broken build.\n\n**Mark task complete: \"Build agent\"**\n\n---\n\n## Phase 4 — Launch Agent and AgentsPlayground\n\n**Mark task in progress: \"Launch agent and AgentsPlayground\"**\n\n### 4.1 — Ask user before launching\n\n```\nAskUserQuestion:\n  question: \"Ready to start the agent and open AgentsPlayground for a local test?\"\n  options:\n    - \"Yes — start agent and open playground\"\n    - \"No — show me the commands and I'll run them manually\"\n```\n\n### 4.2 — If yes: launch\n\nInform the user:\n> Two terminals are needed. Starting both now.\n\n**Start the agent** (terminal 1) — command varies by language:\n- **.NET**: `dotnet run`\n- **Node.js**: `npm start` (fall back to `npm run dev`)\n- **Python**: `python3 \u003Centry-point>` on macOS\u002FLinux (e.g. `python3 host_agent_server.py`); `python \u003Centry-point>` on Windows\n\n> **Note for .NET:** The `-c \"emulator\"` flag bypasses Bot Framework auth.\n> This works because `MapAgentApplicationEndpoints` with `requireAuth: false` skips\n> token validation for local traffic. No config changes are needed for Node.js or Python.\n\nPoll until the agent responds (max ~20 s), then launch AgentsPlayground — **same command for all stacks**:\n\n```bash\n# Poll until agent responds (works on Windows\u002FmacOS\u002FLinux — no seq dependency)\nfor i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do\n  curl -s --max-time 1 \"http:\u002F\u002Flocalhost:\u003Cport>\u002Fapi\u002Fmessages\" > \u002Fdev\u002Fnull 2>&1 && break\n  sleep 1\ndone\nagentsplayground -e \"http:\u002F\u002Flocalhost:\u003Cport>\u002Fapi\u002Fmessages\" -c \"emulator\"\n```\n\n### 4.3 — If no: show commands\n\nPresent the commands for the user to run in two terminals:\n\n```\nTerminal 1 — start your agent:\n  .NET:                  dotnet run\n  Node.js:               npm start\n  Python (macOS\u002FLinux):  python3 host_agent_server.py   (or python3 app.py \u002F python3 main.py)\n  Python (Windows):      python host_agent_server.py    (or python app.py \u002F python main.py)\n\nTerminal 2 — open AgentsPlayground (same for all stacks and platforms):\n  agentsplayground -e \"http:\u002F\u002Flocalhost:\u003Cport>\u002Fapi\u002Fmessages\" -c \"emulator\"\n```\n\n**Mark task complete: \"Launch agent and AgentsPlayground\"**\n\n---\n\n## Phase 5 — Guide Local Test\n\n**Mark task in progress: \"Guide local test\"**\n\nTell the user:\n\n> **AgentsPlayground is open.** Send a message in the chat window to test your agent.\n>\n> **What to watch for:**\n>\n> - **Agent responds** — confirms the messaging stack is wired correctly.\n> - **Terminal logs** — if observability is instrumented, look for these signals in this order:\n>   ```\n>   Agent365Exporter: Exporting batch of N spans.\n>   [Agent365Exporter] M non-genAI spans filtered out\n>   [Agent365Exporter] Partitioned into K identity groups (X spans skipped)\n>   Agent365ExporterCore: Obtained token for agent \u003CagentId> tenant \u003CtenantId>.\n>   Agent365ExporterCore: Sending chunk 1 of 1 (J spans, B bytes)\n>       to https:\u002F\u002Fagent365.svc.cloud.microsoft\u002FobservabilityService\u002Ftenants\u002F\u003Ctenant>\u002Fotlp\u002Fagents\u002F\u003Cagent>\u002Ftraces?api-version=1.\n>   Agent365ExporterCore: HTTP 200 exporting spans. 'x-ms-correlation-id': '\u003Cguid>'.\n>   ```\n>   The `HTTP 200 exporting spans` line is the definitive confirmation that traces reached the A365 backend.\n>   The URL must contain `\u002FobservabilityService\u002F` (the S2S route every auth mode uses). `\u002Fobservability\u002F` means the S2S route flag is missing (`useS2SEndpoint: true` \u002F `a365_use_s2s_endpoint=True` \u002F `o.Agent365.UseS2SEndpoint = true`). A 403 `insufficient_scope` from the S2S route with an app-only token means the service could not authorize the agent by registration and it has no `OtelWrite` application role. For blueprint agents, run `a365 setup all --agent-registration-only`. For AI Teammates, a Global Administrator grants the `OtelWrite` application role on the Blueprint (see `instrument-observability`).\n>   `Partitioned into K identity groups` should show `K >= 1` for at least one batch after a Teams turn — if it's always `0`, the agent\u002Ftenant ID is missing from baggage (likely the `Guid.Empty` fallback bug — verify `instrument-observability` was followed correctly).\n>   To see these logs you need `Microsoft.Agents.A365.Observability: Debug` (or lower) in `appsettings.json`'s `Logging:LogLevel`.\n>\n> **To export traces to the A365 service** (not just console):\n> - .NET: set `EnableAgent365Exporter: true` in `appsettings.json` (SDK defaults to `false` when key is absent)\n> - Node.js \u002F Python: set `ENABLE_A365_OBSERVABILITY_EXPORTER=true` in `.env`\n>\n> **Stopping the agent:** Press `Ctrl+C` in Terminal 1.\n\nIf the user reports the agent is not responding, suggest:\n- Confirm the port matches (check the startup log for the listening URL)\n- .NET: check `MapAgentApplicationEndpoints` is called with `requireAuth: false`\n- Node.js: check the express listener port in `index.ts`\n- Python: check the aiohttp port in `host_agent_server.py` or `app.py`\n\n**Mark task complete: \"Guide local test\"**\n\n---\n\n## Phase 6 — Final Summary\n\n1. **TaskList** — Show all completed tasks.\n\n2. Present summary:\n\n```\n✅ Local test session ready!\n\nAgent:              [language + framework, e.g. Python · AgentFramework]\nAgent endpoint:     http:\u002F\u002Flocalhost:\u003Cport>\u002Fapi\u002Fmessages\nAgentsPlayground:   running (emulator mode — no auth required)\n\nObservability check:\n  If instrumented — watch terminal for:\n    \"Agent365ExporterCore: HTTP 200 exporting spans. 'x-ms-correlation-id': ...\"\n    (and \"Partitioned into K identity groups\" with K >= 1)\n  Requires Microsoft.Agents.A365.Observability: Debug in Logging:LogLevel.\n  To export to A365 service:\n    .NET:           set EnableAgent365Exporter: true in appsettings.json\n    Node.js\u002FPython: set ENABLE_A365_OBSERVABILITY_EXPORTER=true in .env\n\nTo stop: Ctrl+C in the agent terminal.\n```\n\n---\n\n## Error Handling\n\n| Situation | Action |\n|-----------|--------|\n| agentsplayground install fails | Report error; show manual install command; stop |\n| Build fails | Show error; do not launch; stop |\n| Agent port already in use | Suggest `--port \u003Cother>` or kill the existing process |\n| Playground cannot connect | Check agent is listening; verify port matches |\n| Node.js `npm start` not found | Try `npm run dev`; if neither, ask user for start command |\n| Python entry point unclear | Check for `host_agent_server.py`, `app.py`, or `main.py`; ask user if ambiguous |\n| Python port mismatch | Check aiohttp port in entry point; default is 3978 for AI Teammate hosting |\n\n---\n\n## Prerequisites\n\n| Tool | Required | Install |\n|------|----------|---------|\n| `agentsplayground` | Yes (all stacks) | `npm install -g @microsoft\u002Fagentsplayground` |\n| `dotnet` (8.0+) | .NET only | Windows: `winget install Microsoft.DotNet.SDK.8` · macOS: `brew install --cask dotnet-sdk` · Linux: see https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Finstall\u002Flinux |\n| `node` \u002F `npm` (18+) | All stacks (agentsplayground requires npm) | Windows: `winget install OpenJS.NodeJS.LTS` · macOS: `brew install node` · Linux: `apt install nodejs npm` · https:\u002F\u002Fnodejs.org |\n| `python3` or `python` (3.11+) | Python only | Windows: `winget install Python.Python.3.11` · macOS: `brew install python@3.11` · Linux: `apt install python3.11` · https:\u002F\u002Fpython.org |\n\n---\n\n## References\n\n- **Agent Detection:** `${CLAUDE_PLUGIN_ROOT}\u002Fshared\u002Fagent-detection.md`\n","# Test Agent Locally (AgentsPlayground)\n\n> **Trigger phrases** — any of these will activate this skill automatically:\n> - \"test this agent locally\"\n> - \"run my agent locally\"\n> - \"open agentsplayground\"\n> - \"launch agentsplayground\"\n> - \"start a local test session\"\n> - \"debug this agent locally\"\n> - \"test my agent without deploying to teams\"\n> - \"spin up a local test\"\n\n---\n\n## Overview\n\nThis skill starts your agent on localhost and opens **AgentsPlayground** — a local web UI that\nsimulates a Teams-like chat interface without requiring a deployment or Bot Framework auth.\n\n**What it does:**\n1. Detects agent language and framework (.NET, Node.js, or Python)\n2. Checks agentsplayground is installed — installs if missing\n3. Builds the agent to confirm there are no compile errors\n4. Starts the agent in the background\n5. Launches AgentsPlayground pointed at the local endpoint\n6. Guides a local test and confirms observability logs are flowing (if instrumented)\n\n**Why AgentsPlayground works for all AI Teammate stacks:**\n- Web UI that matches the Teams message format\n- Connects to `\u002Fapi\u002Fmessages` over HTTP — the LLM framework on the server side does not matter\n- The `-c emulator` flag bypasses Bot Framework auth — no extra config needed for any stack\n- `requireAuth: false` in `MapAgentApplicationEndpoints` is the only .NET-specific prerequisite\n\nAll actions are **read-only against your codebase** — no code is modified.\n\n---\n\n## Phase 0 — Create and Display Task List\n\n> **Show the user this checklist BEFORE Phase 1.** Exactly one task in_progress at a time; complete before moving on. Use whichever mechanism the runtime supports:\n> - **Claude Code:** call `TaskCreate` for each item below (already in `allowed-tools`); the list renders natively. Use `TaskUpdate` to flip statuses.\n> - **VS Code Copilot Chat \u002F GitHub Copilot CLI:** `allowed-tools` is ignored — emit a markdown checklist directly in chat (`- [ ] Detect agent type…`) and edit items to `- [x]` as each phase completes.\n\n```\nTaskCreate: \"Detect agent type and verify build tools\"\nTaskCreate: \"Install agentsplayground\"\nTaskCreate: \"Build agent\"\nTaskCreate: \"Launch agent and AgentsPlayground\"\nTaskCreate: \"Guide local test\"\n```\n\n---\n\n## Phase 1 — Detect Agent Type\n\n**Mark task in progress: \"Detect agent type and verify build tools\"**\n\n1. **Read** `${CLAUDE_PLUGIN_ROOT}\u002Fshared\u002Fagent-detection.md` for detection heuristics.\n\n2. **Check for detection cache.** Read `.a365-workspace-detection.local.json` if it exists. If `detectedAt` is within the last 60 minutes, load `agentStack` and `programmingLanguage` — skip the globs below and go to step 3.\n\n   If cache is missing or stale, run detection globs **in parallel**:\n   - **Glob** `**\u002F*.csproj` → .NET\n   - **Glob** `**\u002Fpackage.json` + `.ts`\u002F`.js` source files present → Node.js\n   - **Glob** `**\u002F*.py` or `requirements.txt` \u002F `pyproject.toml` → Python\n\n3. Determine default port:\n   - **.NET**: `5000` (HTTP, `dotnet run` default)\n   - **Node.js**: `3978` (standard Bot Framework port)\n   - **Python**: `3978` (aiohttp default in AI Teammate hosting layer)\n   - If the user provided a port as the skill argument, use that instead.\n\n4. Determine start command:\n   - **.NET**: `dotnet run`\n   - **Node.js**: `npm start` (fall back to `npm run dev` if `start` script absent)\n   - **Python**: detect entry point — check for `host_agent_server.py`, `app.py`, or `main.py`. Detect the Python command: `python3 --version 2>\u002Fdev\u002Fnull && echo python3 || echo python`. Use `python3` if available (macOS\u002FLinux default), otherwise `python` (Windows). Run with `\u003Cpython-cmd> \u003Centry>` (or `uvicorn app:app --port 3978` if an ASGI app is detected).\n\n5. If agent type cannot be determined, stop and ask:\n\n```\nAskUserQuestion:\n  question: \"I couldn't detect the agent type. What are you working with?\"\n  options:\n    - .NET (AgentFramework or Semantic Kernel)\n    - Node.js (LangChain, OpenAI, Claude SDK, Semantic Kernel, or Google ADK)\n    - Python (AgentFramework, LangChain, OpenAI, Claude, Semantic Kernel, or Google ADK)\n```\n\n### 1.3 — Check language build tool\n\nAfter detection, immediately verify the required build tool is installed:\n\n**For .NET** — check `dotnet --version`. If missing or below 8.0:\n```\nAskUserQuestion:\n  question: \"dotnet SDK 8.0+ is required but not found. Install it now?\"\n  options:\n    - \"Yes — install it for me\"\n    - \"No — I'll install manually and re-run\"\n```\nIf yes, show the appropriate command for the detected OS and ask the user to run it:\n```\nWindows:      winget install Microsoft.DotNet.SDK.8\nmacOS:        brew install --cask dotnet-sdk\nLinux:        sudo apt-get update && sudo apt-get install -y dotnet-sdk-8.0\n              (or: https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Finstall\u002Flinux)\nAll:          https:\u002F\u002Fdotnet.microsoft.com\u002Fdownload\n```\nAfter install, restart the terminal then run `dotnet --version` to confirm.\n\n**For Node.js** — check `node --version`. If missing or below 18:\n```\nAskUserQuestion:\n  question: \"Node.js 18+ is required but not found. Install it now?\"\n  options:\n    - \"Yes — install it for me\"\n    - \"No — I'll install manually and re-run\"\n```\nIf yes, show the appropriate command:\n```\nWindows:      winget install OpenJS.NodeJS.LTS\nmacOS:        brew install node\nLinux:        sudo apt-get update && sudo apt-get install -y nodejs npm\n              (or via nvm: curl -o- https:\u002F\u002Fraw.githubusercontent.com\u002Fnvm-sh\u002Fnvm\u002Fv0.39.0\u002Finstall.sh | bash && nvm install --lts)\nAll:          https:\u002F\u002Fnodejs.org (LTS)\n```\nAfter install, run `node --version` to confirm.\n\n**For Python** — check `python3 --version 2>\u002Fdev\u002Fnull || python --version`. If missing or below 3.11:\n```\nAskUserQuestion:\n  question: \"Python 3.11+ is required but not found. Install it now?\"\n  options:\n    - \"Yes — install it for me\"\n    - \"No — I'll install manually and re-run\"\n```\nIf yes, show the appropriate command:\n```\nWindows:      winget install Python.Python.3.11\nmacOS:        brew install python@3.11\nLinux:        sudo apt-get install -y python3.11 python3.11-venv python3-pip\nAll:          https:\u002F\u002Fpython.org\n```\nAfter install, confirm with `python3 --version 2>\u002Fdev\u002Fnull || python --version`.\n\n**Mark task complete: \"Detect agent type and verify build tools\"**\n\n---\n\n## Phase 2 — Install agentsplayground\n\n**Mark task in progress: \"Install agentsplayground\"**\n\nCheck if installed:\n\n```bash\nagentsplayground --version\n```\n\nIf found, report the version and continue.\n\n**If not found**, ask the user:\n\n> \"AgentsPlayground CLI is not installed. Install it now with `npm install -g @microsoft\u002Fagentsplayground`?\"\n> Options: **Yes, install it** \u002F **No, I'll install it manually**\n\nIf the user chooses **Yes**:\n\n```bash\nnpm install -g @microsoft\u002Fagentsplayground\n```\n\nVerify the install succeeded:\n\n```bash\nagentsplayground --version\n```\n\nIf installation fails or the user chooses **No**, stop and tell the user:\n> \"Install agentsplayground manually with: `npm install -g @microsoft\u002Fagentsplayground`\n> then re-run this skill.\"\n\nDo NOT continue if agentsplayground cannot be confirmed installed.\n\n**Mark task complete: \"Install agentsplayground\"**\n\n---\n\n## Phase 3 — Build Agent\n\n**Mark task in progress: \"Build agent\"**\n\n### For .NET\n\n```bash\ndotnet build\n```\n\n### For Node.js\n\n```bash\nnpm install\nnpm run build || npm run compile || echo \"No build script — skipping compile check\"\n```\n\n### For Python\n\n```bash\n# Use pip3 on macOS\u002FLinux, pip on Windows — try pip3 first\npip3 install -r requirements.txt 2>\u002Fdev\u002Fnull || pip install -r requirements.txt || pip install .\n# Verify the active Python version (use python3 on macOS\u002FLinux, python on Windows)\npython3 --version 2>\u002Fdev\u002Fnull || python --version\n```\n\nIf build fails, show the error output and stop:\n> \"Fix the build errors above and re-run this skill to continue.\"\n\nDo NOT attempt to launch a broken build.\n\n**Mark task complete: \"Build agent\"**\n\n---\n\n## Phase 4 — Launch Agent and AgentsPlayground\n\n**Mark task in progress: \"Launch agent and AgentsPlayground\"**\n\n### 4.1 — Ask user before launching\n\n```\nAskUserQuestion:\n  question: \"Ready to start the agent and open AgentsPlayground for a local test?\"\n  options:\n    - \"Yes — start agent and open playground\"\n    - \"No — show me the commands and I'll run them manually\"\n```\n\n### 4.2 — If yes: launch\n\nInform the user:\n> Two terminals are needed. Starting both now.\n\n**Start the agent** (terminal 1) — command varies by language:\n- **.NET**: `dotnet run`\n- **Node.js**: `npm start` (fall back to `npm run dev`)\n- **Python**: `python3 \u003Centry-point>` on macOS\u002FLinux (e.g. `python3 host_agent_server.py`); `python \u003Centry-point>` on Windows\n\n> **Note for .NET:** The `-c \"emulator\"` flag bypasses Bot Framework auth.\n> This works because `MapAgentApplicationEndpoints` with `requireAuth: false` skips\n> token validation for local traffic. No config changes are needed for Node.js or Python.\n\nPoll until the agent responds (max ~20 s), then launch AgentsPlayground — **same command for all stacks**:\n\n```bash\n# Poll until agent responds (works on Windows\u002FmacOS\u002FLinux — no seq dependency)\nfor i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do\n  curl -s --max-time 1 \"http:\u002F\u002Flocalhost:\u003Cport>\u002Fapi\u002Fmessages\" > \u002Fdev\u002Fnull 2>&1 && break\n  sleep 1\ndone\nagentsplayground -e \"http:\u002F\u002Flocalhost:\u003Cport>\u002Fapi\u002Fmessages\" -c \"emulator\"\n```\n\n### 4.3 — If no: show commands\n\nPresent the commands for the user to run in two terminals:\n\n```\nTerminal 1 — start your agent:\n  .NET:                  dotnet run\n  Node.js:               npm start\n  Python (macOS\u002FLinux):  python3 host_agent_server.py   (or python3 app.py \u002F python3 main.py)\n  Python (Windows):      python host_agent_server.py    (or python app.py \u002F python main.py)\n\nTerminal 2 — open AgentsPlayground (same for all stacks and platforms):\n  agentsplayground -e \"http:\u002F\u002Flocalhost:\u003Cport>\u002Fapi\u002Fmessages\" -c \"emulator\"\n```\n\n**Mark task complete: \"Launch agent and AgentsPlayground\"**\n\n---\n\n## Phase 5 — Guide Local Test\n\n**Mark task in progress: \"Guide local test\"**\n\nTell the user:\n\n> **AgentsPlayground is open.** Send a message in the chat window to test your agent.\n>\n> **What to watch for:**\n>\n> - **Agent responds** — confirms the messaging stack is wired correctly.\n> - **Terminal logs** — if observability is instrumented, look for these signals in this order:\n>   ```\n>   Agent365Exporter: Exporting batch of N spans.\n>   [Agent365Exporter] M non-genAI spans filtered out\n>   [Agent365Exporter] Partitioned into K identity groups (X spans skipped)\n>   Agent365ExporterCore: Obtained token for agent \u003CagentId> tenant \u003CtenantId>.\n>   Agent365ExporterCore: Sending chunk 1 of 1 (J spans, B bytes)\n>       to https:\u002F\u002Fagent365.svc.cloud.microsoft\u002FobservabilityService\u002Ftenants\u002F\u003Ctenant>\u002Fotlp\u002Fagents\u002F\u003Cagent>\u002Ftraces?api-version=1.\n>   Agent365ExporterCore: HTTP 200 exporting spans. 'x-ms-correlation-id': '\u003Cguid>'.\n>   ```\n>   The `HTTP 200 exporting spans` line is the definitive confirmation that traces reached the A365 backend.\n>   The URL must contain `\u002FobservabilityService\u002F` (the S2S route every auth mode uses). `\u002Fobservability\u002F` means the S2S route flag is missing (`useS2SEndpoint: true` \u002F `a365_use_s2s_endpoint=True` \u002F `o.Agent365.UseS2SEndpoint = true`). A 403 `insufficient_scope` from the S2S route with an app-only token means the service could not authorize the agent by registration and it has no `OtelWrite` application role. For blueprint agents, run `a365 setup all --agent-registration-only`. For AI Teammates, a Global Administrator grants the `OtelWrite` application role on the Blueprint (see `instrument-observability`).\n>   `Partitioned into K identity groups` should show `K >= 1` for at least one batch after a Teams turn — if it's always `0`, the agent\u002Ftenant ID is missing from baggage (likely the `Guid.Empty` fallback bug — verify `instrument-observability` was followed correctly).\n>   To see these logs you need `Microsoft.Agents.A365.Observability: Debug` (or lower) in `appsettings.json`'s `Logging:LogLevel`.\n>\n> **To export traces to the A365 service** (not just console):\n> - .NET: set `EnableAgent365Exporter: true` in `appsettings.json` (SDK defaults to `false` when key is absent)\n> - Node.js \u002F Python: set `ENABLE_A365_OBSERVABILITY_EXPORTER=true` in `.env`\n>\n> **Stopping the agent:** Press `Ctrl+C` in Terminal 1.\n\nIf the user reports the agent is not responding, suggest:\n- Confirm the port matches (check the startup log for the listening URL)\n- .NET: check `MapAgentApplicationEndpoints` is called with `requireAuth: false`\n- Node.js: check the express listener port in `index.ts`\n- Python: check the aiohttp port in `host_agent_server.py` or `app.py`\n\n**Mark task complete: \"Guide local test\"**\n\n---\n\n## Phase 6 — Final Summary\n\n1. **TaskList** — Show all completed tasks.\n\n2. Present summary:\n\n```\n✅ Local test session ready!\n\nAgent:              [language + framework, e.g. Python · AgentFramework]\nAgent endpoint:     http:\u002F\u002Flocalhost:\u003Cport>\u002Fapi\u002Fmessages\nAgentsPlayground:   running (emulator mode — no auth required)\n\nObservability check:\n  If instrumented — watch terminal for:\n    \"Agent365ExporterCore: HTTP 200 exporting spans. 'x-ms-correlation-id': ...\"\n    (and \"Partitioned into K identity groups\" with K >= 1)\n  Requires Microsoft.Agents.A365.Observability: Debug in Logging:LogLevel.\n  To export to A365 service:\n    .NET:           set EnableAgent365Exporter: true in appsettings.json\n    Node.js\u002FPython: set ENABLE_A365_OBSERVABILITY_EXPORTER=true in .env\n\nTo stop: Ctrl+C in the agent terminal.\n```\n\n---\n\n## Error Handling\n\n| Situation | Action |\n|-----------|--------|\n| agentsplayground install fails | Report error; show manual install command; stop |\n| Build fails | Show error; do not launch; stop |\n| Agent port already in use | Suggest `--port \u003Cother>` or kill the existing process |\n| Playground cannot connect | Check agent is listening; verify port matches |\n| Node.js `npm start` not found | Try `npm run dev`; if neither, ask user for start command |\n| Python entry point unclear | Check for `host_agent_server.py`, `app.py`, or `main.py`; ask user if ambiguous |\n| Python port mismatch | Check aiohttp port in entry point; default is 3978 for AI Teammate hosting |\n\n---\n\n## Prerequisites\n\n| Tool | Required | Install |\n|------|----------|---------|\n| `agentsplayground` | Yes (all stacks) | `npm install -g @microsoft\u002Fagentsplayground` |\n| `dotnet` (8.0+) | .NET only | Windows: `winget install Microsoft.DotNet.SDK.8` · macOS: `brew install --cask dotnet-sdk` · Linux: see https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fdotnet\u002Fcore\u002Finstall\u002Flinux |\n| `node` \u002F `npm` (18+) | All stacks (agentsplayground requires npm) | Windows: `winget install OpenJS.NodeJS.LTS` · macOS: `brew install node` · Linux: `apt install nodejs npm` · https:\u002F\u002Fnodejs.org |\n| `python3` or `python` (3.11+) | Python only | Windows: `winget install Python.Python.3.11` · macOS: `brew install python@3.11` · Linux: `apt install python3.11` · https:\u002F\u002Fpython.org |\n\n---\n\n## References\n\n- **Agent Detection:** `${CLAUDE_PLUGIN_ROOT}\u002Fshared\u002Fagent-detection.md`\n",{"name":5,"hooks":52,"model":37,"description":66,"allowed-tools":67,"argument-hint":68,"compatibility":69,"user-invocable":73},{"stop":53,"preToolUse":62},[54,58],{"type":55,"command":56,"timeout":57},"command","node ${CLAUDE_PLUGIN_ROOT}\u002Fhooks\u002Fstop\u002Fvalidate-test-local.js",15000,{"type":59,"prompt":60,"timeout":61},"prompt","Before ending, verify ALL of the following:\n1. Agent type was detected (.NET, Node.js, or Python — any AI Teammate stack).\n2. agentsplayground CLI was verified as installed (or installed if missing).\n3. Agent project built successfully (dotnet build, npm install, or pip install).\n4. User was shown the launch commands for agent + AgentsPlayground.\nIf any item is incomplete, return {\"ok\": false, \"reason\": \"\u003Cspecific item>\"}.\nIf all items are complete, or the user declined to launch, return {\"ok\": true}.\n",30000,[63],{"type":55,"command":64,"timeout":65},"node ${CLAUDE_PLUGIN_ROOT}\u002Fhooks\u002FpreToolUse\u002Fpath-guard.js",5000,"Runs an Agent 365 AI Teammate agent locally and opens AgentsPlayground for interactive local testing. Works with any AI Teammate stack — .NET (AgentFramework, Semantic Kernel), Node.js (LangChain, OpenAI, Claude SDK, Semantic Kernel, Google ADK), or Python (AgentFramework, LangChain, OpenAI, Claude, Semantic Kernel, Google ADK). Checks prerequisites (agentsplayground CLI, build tools), builds the agent, starts it in the background, and launches the playground UI pointed at the local endpoint. AgentsPlayground connects to \u002Fapi\u002Fmessages over HTTP — the LLM framework does not matter.\n","Read, Glob, Grep, Bash, AskUserQuestion, TaskCreate, TaskUpdate, TaskList","Optional: port number (default: 3978 for Node.js\u002FPython, 5000 for .NET)",[70,71,72],"claude-code","vscode-copilot","github-copilot-cli",true,"main","87766cdd043e271b5bd7e7e3c383a04df65886ca","plugins\u002Fagent365\u002Fskills\u002Ftest-local",12,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-10-22 01:03:10",{"source":8,"skillName":5,"commands":84,"prompt":94,"zipAvailable":73},[85,88,91],{"tool":86,"command":87},"npx","npx skills add microsoft\u002Fagent365-skills --skill test-local",{"tool":89,"command":90},"bunx","bunx skills add microsoft\u002Fagent365-skills --skill test-local",{"tool":92,"command":93},"pnpm","pnpm dlx skills add microsoft\u002Fagent365-skills --skill test-local","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fagent365\u002Fskills\u002Ftest-local\u002FSKILL.md",[],[97,129,156,173,192,211],{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":109,"publishedAt":47},"01M6FMB2PGZ55SYZA06B36HXMK","purview-dlp-integration","Integrate Microsoft Purview DLP (data loss prevention) + audit into an existing Microsoft Agent 365 (A365 SDK) agent, so sensitive prompts are blocked before the LLM and responses can be audited. Use when a user wants to add Purview DLP to an AI agent, block sensitive data (credit cards, SSNs, PII) in agent turns, enforce data protection\u002Fcompliance on an A365 AgentApplication, call the Graph processContent API, or wire a DLP gate into agent code. Bundles drop-in guards for Node.js\u002FTypeScript, Python, and .NET, minimal wiring for each, a PowerShell script to create the AI-apps DLP policy, a Purview portal\u002Ftenant enablement guide, and verification + troubleshooting. Works with A365 agents in Node.js (@microsoft\u002Fagents-hosting), Python (microsoft-agents-hosting-*), and .NET (Microsoft.Agents.*).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fagent365\u002Fskills\u002Fpurview-dlp-integration\u002FSKILL.md",[103,104],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[110,111,112,113,114,115,116,117,118,119,55,120,121,122,123,124,125,126,127,128],"purview","integration","dlp","purview dlp integration","typescript","create","a365","agent 365","powershell","pii","read","write","edit","integrate","app","host","apps","input","data loss prevention",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":140,"publishedAt":47},"01M6FMAM9AR95778V7S5J1DMT5","make-ai-teammate","Transforms a non-M365 agent into a Microsoft Agent 365 AI Teammate. Supports all major frameworks across .NET (AgentFramework, Semantic Kernel), Node.js (LangChain, OpenAI Agents SDK, Claude SDK, Semantic Kernel, Google ADK), and Python (AgentFramework, LangChain, OpenAI, Claude, Semantic Kernel, Google ADK). Adds the hosting layer (Express\u002FCloudAdapter for Node.js, ASP.NET Core for .NET, aiohttp for Python), AgentApplication class with message routing and typing indicators, email notifications, and all required packages and env vars. Wraps existing LLM code — does not replace it. Requires a365-setup to have been run first.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fagent365\u002Fskills\u002Fmake-ai-teammate\u002FSKILL.md",[135,138,139],{"categoryNo":136,"categoryName":137,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},[141,142,46,143,45,144,145,146,147,148,55,149,150,151,29,152,124,153,154,155],"make","make ai teammate","valid","run","update","notifications","m365","disk","auto","ready","show","express","typing","URL","re",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":163,"publishedAt":47},"01M6FMACXYDM9F5GNSQ05BBQCM","make-a365-agent","Provisions a non-AI Teammate agent with Agent 365 — use this skill for Register and Observability paths. Runs a365 setup all to create the Blueprint and Entra ID permissions. After setup, always offers instrument-observability (optional) and add-workiq-tools (optional, skipped automatically when authMode = s2s) as add-ons. Supports .NET AgentFramework, Node.js, and Python agents. Normally delegated to from a365-setup after CLI and Azure prerequisites are confirmed. Can also be invoked directly when those steps are already done.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fagent365\u002Fskills\u002Fmake-a365-agent\u002FSKILL.md",[162],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[116,141,164,143,44,165,166,115,43,167,40,168,36,35,169,170,171,33,32,172],"make a365 agent","entra id","workiq","permissions","generated","Blueprint","either","done","errors",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":180,"publishedAt":47},"01M6FM9YZ5WEWXFQXR0Q57ZK5Q","instrument-observability","Instruments Microsoft Agent 365 observability into existing .NET AgentFramework, Node.js, or Python agents. Adds OTel-based tracing, context propagation, A365 exporter, manual instrumentation scopes (InvokeAgentScope, InferenceScope, ExecuteToolScope — required for store publishing), and updates configuration files. Asks a two-stage question — agent kind (AI Teammate or Agent (Non AI Teammate)) and auth mode — to determine how the telemetry token is sourced. Every agent exports over the S2S route with an app-only token for the exporting agent identity: `obo` \u002F `agentic-user` agents get an app-only token resolver that reuses the agent's hosting connection (blueprint credential), and `s2s` agents get a scaffold token-service file that acquires and refreshes the Observability API token via the FMI chain (.NET, Node.js, and Python). No OBS permission or admin consent is needed for registered blueprint agent instances. Non-destructive and idempotent.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fagent365\u002Fskills\u002Finstrument-observability\u002FSKILL.md",[179],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[181,182,183,45,184,144,116,185,186,187,188,189,55,120,121,122,190,191,33,124],"observability","instrument","instrument observability","config","tracing","start","OpenTelemetry","how","question","files","instances",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":200,"publishedAt":47},"01M6FM9N9AGS0YBB4Q2HAP0J6M","add-workiq-tools","Adds WorkIQ MCP tool servers to an existing .NET AgentFramework, Node.js, or Python agent using the A365 CLI. Runs a365 develop list-available to show the catalog, adds selected servers via a365 develop add-mcp-servers (which writes ToolingManifest.json), wires McpToolRegistrationService in the agent code, and guides the user through the permissions handoff. Non-destructive and idempotent.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fagent365\u002Fskills\u002Fadd-workiq-tools\u002FSKILL.md",[198,199],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},[201,166,202,203,204,205,45,144,167,206,188,55,120,121,122,207,151,208,209,210],"add workiq","Tools","add","add workiq tools","MCP","server","list","selection","run build","guides",{"skillNo":212,"name":213,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":215,"categories":216,"keywords":218,"publishedAt":47},"01M6FM9C3WNCR9NNJPVV9RM5SA","a365-setup","Entry point for general Agent 365 (A365) registration and CLI setup — use this skill whenever the user wants to \"set up A365\", \"register agent\", \"create blueprint\", or general A365 onboarding for non-AI-Teammate agents (Register, Observability paths). Verifies and installs the CLI, validates Azure prerequisites, then delegates to make-a365-agent or make-ai-teammate at Step 3. Does NOT run a365 setup all inline — setup is run by the delegated skill. Supports .NET AgentFramework, Node.js LangChain, and Python agents.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Fblob\u002Fmain\u002Fplugins\u002Fagent365\u002Fskills\u002Fa365-setup\u002FSKILL.md",[217],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[219,116,220,115,144,221,117,222,118,147,223,55,120,121,122,224,151,29,33,225],"setup","a365 setup","git","capabilities","langchain","uv","paths"]