fix: prevent agent from deleting user workspace when adding MCP support#999
fix: prevent agent from deleting user workspace when adding MCP support#999
Conversation
…e support - Add explicit NEW-project-only warning to templates/mcp.md with decision table - Add rule #8 to SKILL.md prohibiting deletion of user project directories - Strengthen global-rules.md No Exceptions to explicitly prohibit rm -rf on user projects and azd init on existing workspaces - Add NEW-project-only warnings to sql and blob-eventgrid recipe READMEs (same latent issue) Co-authored-by: paulyuk <1968137+paulyuk@users.noreply.github.com>
🔍 Token Analysis Report
📊 Token Change ReportComparing Summary
Changed Files
📊 Token Limit Check ReportChecked: 391 files
|
| File | Tokens | Limit | Over By |
|---|---|---|---|
.github/skills/file-test-bug/SKILL.md |
613 | 500 | +113 |
.github/skills/sensei/README.md |
3428 | 1000 | +2428 |
.github/skills/sensei/SKILL.md |
1958 | 500 | +1458 |
.github/skills/sensei/references/EXAMPLES.md |
3328 | 1000 | +2328 |
.github/skills/sensei/references/LOOP.md |
3441 | 1000 | +2441 |
.github/skills/sensei/references/SCORING.md |
1690 | 1000 | +690 |
.github/skills/sensei/references/TOKEN-INTEGRATION.md |
1094 | 1000 | +94 |
.github/skills/skill-authoring/SKILL.md |
732 | 500 | +232 |
plugin/skills/appinsights-instrumentation/SKILL.md |
952 | 500 | +452 |
plugin/skills/azure-ai/SKILL.md |
835 | 500 | +335 |
plugin/skills/azure-aigateway/SKILL.md |
6329 | 500 | +5829 |
plugin/skills/azure-compliance/SKILL.md |
1238 | 500 | +738 |
plugin/skills/azure-compliance/references/azqr-recommendations.md |
1447 | 1000 | +447 |
plugin/skills/azure-compliance/references/azqr-remediation-patterns.md |
1987 | 1000 | +987 |
plugin/skills/azure-compliance/references/azure-keyvault-expiration-audit.md |
1286 | 1000 | +286 |
plugin/skills/azure-compliance/references/azure-quick-review.md |
1268 | 1000 | +268 |
plugin/skills/azure-cost-optimization/SKILL.md |
3456 | 500 | +2956 |
plugin/skills/azure-deploy/SKILL.md |
961 | 500 | +461 |
plugin/skills/azure-deploy/references/pre-deploy-checklist.md |
1004 | 1000 | +4 |
plugin/skills/azure-deploy/references/troubleshooting.md |
1123 | 1000 | +123 |
plugin/skills/azure-diagnostics/SKILL.md |
876 | 500 | +376 |
plugin/skills/azure-kusto/SKILL.md |
2167 | 500 | +1667 |
plugin/skills/azure-messaging/SKILL.md |
857 | 500 | +357 |
plugin/skills/azure-messaging/references/service-troubleshooting.md |
1044 | 1000 | +44 |
plugin/skills/azure-observability/SKILL.md |
939 | 500 | +439 |
plugin/skills/azure-postgres/SKILL.md |
1519 | 500 | +1019 |
plugin/skills/azure-postgres/references/entra-rbac-overview.md |
1823 | 1000 | +823 |
plugin/skills/azure-postgres/references/group-sync.md |
1844 | 1000 | +844 |
plugin/skills/azure-postgres/references/permission-templates.md |
1647 | 1000 | +647 |
plugin/skills/azure-postgres/references/troubleshooting.md |
1959 | 1000 | +959 |
plugin/skills/azure-prepare/SKILL.md |
1600 | 500 | +1100 |
plugin/skills/azure-prepare/references/aspire.md |
2573 | 1000 | +1573 |
plugin/skills/azure-prepare/references/azure-context.md |
1019 | 1000 | +19 |
plugin/skills/azure-prepare/references/recipes/azd/aspire.md |
1289 | 1000 | +289 |
plugin/skills/azure-prepare/references/recipes/azd/azure-yaml.md |
1709 | 1000 | +709 |
plugin/skills/azure-prepare/references/recipes/azd/terraform.md |
2924 | 1000 | +1924 |
plugin/skills/azure-prepare/references/research.md |
1600 | 1000 | +600 |
plugin/skills/azure-prepare/references/runtimes/nodejs.md |
1508 | 1000 | +508 |
plugin/skills/azure-prepare/references/security.md |
1784 | 1000 | +784 |
plugin/skills/azure-prepare/references/services/functions/bicep.md |
1896 | 1000 | +896 |
plugin/skills/azure-prepare/references/services/functions/templates/SPEC-composable-templates.md |
6187 | 1000 | +5187 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/README.md |
1265 | 1000 | +265 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/common/uami-bindings.md |
1223 | 1000 | +223 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/composition.md |
3150 | 1000 | +2150 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/cosmosdb/README.md |
1467 | 1000 | +467 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/durable/README.md |
1149 | 1000 | +149 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/eventhubs/README.md |
1403 | 1000 | +403 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/source/java.md |
1312 | 1000 | +312 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/source/python.md |
1207 | 1000 | +207 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/mcp/source/typescript.md |
1075 | 1000 | +75 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/README.md |
1171 | 1000 | +171 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/servicebus/source/dotnet.md |
1227 | 1000 | +227 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/source/java.md |
1009 | 1000 | +9 |
plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/source/python.md |
1080 | 1000 | +80 |
plugin/skills/azure-prepare/references/services/functions/terraform.md |
2305 | 1000 | +1305 |
plugin/skills/azure-prepare/references/services/service-bus/patterns.md |
1010 | 1000 | +10 |
plugin/skills/azure-resource-lookup/SKILL.md |
1379 | 500 | +879 |
plugin/skills/azure-resource-lookup/references/azure-resource-graph.md |
1307 | 1000 | +307 |
plugin/skills/azure-resource-visualizer/SKILL.md |
2091 | 500 | +1591 |
plugin/skills/azure-storage/SKILL.md |
1092 | 500 | +592 |
plugin/skills/azure-storage/references/sdk-usage.md |
1096 | 1000 | +96 |
plugin/skills/azure-validate/SKILL.md |
734 | 500 | +234 |
plugin/skills/entra-app-registration/SKILL.md |
2055 | 500 | +1555 |
plugin/skills/entra-app-registration/references/api-permissions.md |
2545 | 1000 | +1545 |
plugin/skills/entra-app-registration/references/cli-commands.md |
2211 | 1000 | +1211 |
plugin/skills/entra-app-registration/references/console-app-example.md |
2752 | 1000 | +1752 |
plugin/skills/entra-app-registration/references/first-app-registration.md |
1846 | 1000 | +846 |
plugin/skills/entra-app-registration/references/oauth-flows.md |
2375 | 1000 | +1375 |
plugin/skills/entra-app-registration/references/troubleshooting.md |
1896 | 1000 | +896 |
plugin/skills/microsoft-foundry/SKILL.md |
1912 | 500 | +1412 |
plugin/skills/microsoft-foundry/foundry-agent/create/agent-framework/SKILL.md |
1671 | 500 | +1171 |
plugin/skills/microsoft-foundry/foundry-agent/create/agent-framework/references/debug-setup.md |
1689 | 1000 | +689 |
plugin/skills/microsoft-foundry/foundry-agent/deploy/deploy.md |
3295 | 1000 | +2295 |
plugin/skills/microsoft-foundry/foundry-agent/invoke/invoke.md |
1273 | 1000 | +273 |
plugin/skills/microsoft-foundry/foundry-agent/troubleshoot/troubleshoot.md |
1299 | 1000 | +299 |
plugin/skills/microsoft-foundry/models/deploy-model/SKILL.md |
1627 | 500 | +1127 |
plugin/skills/microsoft-foundry/models/deploy-model/capacity/SKILL.md |
1725 | 500 | +1225 |
plugin/skills/microsoft-foundry/models/deploy-model/customize/SKILL.md |
2220 | 500 | +1720 |
plugin/skills/microsoft-foundry/models/deploy-model/customize/references/customize-workflow.md |
1859 | 1000 | +859 |
plugin/skills/microsoft-foundry/models/deploy-model/preset/SKILL.md |
1212 | 500 | +712 |
plugin/skills/microsoft-foundry/models/deploy-model/preset/references/preset-workflow.md |
4252 | 1000 | +3252 |
plugin/skills/microsoft-foundry/models/deploy-model/preset/references/workflow.md |
1315 | 1000 | +315 |
plugin/skills/microsoft-foundry/project/create/create-foundry-project.md |
1218 | 1000 | +218 |
plugin/skills/microsoft-foundry/quota/references/ptu-guide.md |
1473 | 1000 | +473 |
plugin/skills/microsoft-foundry/quota/references/troubleshooting.md |
1807 | 1000 | +807 |
plugin/skills/microsoft-foundry/quota/references/workflows.md |
1614 | 1000 | +614 |
plugin/skills/microsoft-foundry/rbac/rbac.md |
1752 | 1000 | +752 |
plugin/skills/microsoft-foundry/references/sdk/foundry-sdk-py.md |
1888 | 1000 | +888 |
plugin/skills/microsoft-foundry/resource/create/create-foundry-resource.md |
1489 | 1000 | +489 |
plugin/skills/microsoft-foundry/resource/create/references/workflows.md |
1637 | 1000 | +637 |
.github/agents/SkillCreator.agent.md |
1044 | 1000 | +44 |
Consider moving content to
references/subdirectories.
Automated token analysis. See skill authoring guidelines for best practices.
There was a problem hiding this comment.
Pull request overview
This PR hardens the azure-prepare skill/reference documentation to prevent destructive “reinitialize from template” behavior (including workspace deletion) when a user asks to add MCP support to an existing Azure Functions project.
Changes:
- Adds prominent “NEW projects only” warnings and a templates-vs-recipes decision table for MCP Functions templates.
- Strengthens skill/global rules to prohibit deleting user project directories and to constrain template/
azd initusage. - Applies the same “NEW projects only” warning pattern to SQL and Blob/EventGrid recipe docs that previously recommended bare
azd init.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| plugin/skills/azure-prepare/references/services/functions/templates/recipes/sql/README.md | Marks AZD templates as new-project-only and adds a warning directing existing projects to composition steps. |
| plugin/skills/azure-prepare/references/services/functions/templates/recipes/blob-eventgrid/README.md | Same new-project-only warning pattern for EventGrid Blob recipe templates. |
| plugin/skills/azure-prepare/references/services/functions/templates/mcp.md | Adds explicit warning + decision table to route existing projects to recipes instead of templates. |
| plugin/skills/azure-prepare/references/global-rules.md | Extends “No Exceptions” with explicit prohibitions around deleting user directories and in-place azd init. |
| plugin/skills/azure-prepare/SKILL.md | Adds a new explicit rule forbidding deletion of user project directories and restricting templates/azd init to new projects. |
| > ⚠️ **Warning: Templates are for NEW projects only.** | ||
| > If the user has an existing Azure Functions project, do NOT use `azd init` — this will overwrite their workspace. | ||
| > For existing projects, use the **recipe approach** instead: [recipes/mcp/](recipes/mcp/README.md). | ||
| > ⛔ **NEVER run `rm -rf` or delete the user's project directory.** Destructive actions require `ask_user` confirmation — see [global-rules.md](../../../global-rules.md). |
There was a problem hiding this comment.
The warning mixes an absolute prohibition ("NEVER run rm -rf") with a more permissive statement ("Destructive actions require ask_user confirmation"), which can be read as implying deletion becomes OK after confirmation. Consider rephrasing to keep the policy unambiguous: deleting user workspace directories is prohibited, and refer to global-rules.md only for other destructive actions that may require ask_user.
| > ⛔ **NEVER run `rm -rf` or delete the user's project directory.** Destructive actions require `ask_user` confirmation — see [global-rules.md](../../../global-rules.md). | |
| > ⛔ **NEVER run `rm -rf` or delete the user's project/workspace directory under any circumstances.** For all other destructive actions (excluding deletion of user workspaces), follow `ask_user` confirmation rules as described in [global-rules.md](../../../global-rules.md). |
| - Do NOT proceed based on "the user asked to deploy" (deploy ≠ delete old) | ||
| - Do NOT batch destructive actions without individual confirmation | ||
| - ⛔ Do NOT delete user project directories (`rm -rf <project>`) even when adding features, converting, or migrating — use MODIFY mode to edit existing files instead | ||
| - ⛔ `azd init` and template commands are for NEW projects only — NEVER run on an existing workspace without explicit user confirmation |
There was a problem hiding this comment.
This bullet is internally inconsistent: it says "template commands are for NEW projects only" but then suggests they can be run on an existing workspace with confirmation. To avoid agents treating this as a sanctioned in-place reinit, make the rule explicit (e.g., only run templates in an empty/new directory; if the user explicitly wants a re-init, do it in a separate directory after confirmation).
| - ⛔ `azd init` and template commands are for NEW projects only — NEVER run on an existing workspace without explicit user confirmation | |
| - ⛔ `azd init` and template commands are for NEW projects only — run them **only** in an empty/new directory. If the user explicitly requests re-initialization of an existing project, create a separate new directory, run the template there, and then migrate changes into the existing project with user-confirmed edits. Never run these commands directly in a non-empty existing workspace. |
| 5. **Validate before deploy** — Invoke azure-validate before azure-deploy | ||
| 6. **Confirm Azure context** — Use `ask_user` for subscription and location per [Azure Context](references/azure-context.md) | ||
| 7. ⛔ **Destructive actions require `ask_user`** — [Global Rules](references/global-rules.md) | ||
| 8. ⛔ **NEVER delete user project directories** — When adding features to an existing project, MODIFY existing files. Templates and `azd init` are for NEW projects only. NEVER run `rm -rf` on user workspace directories. |
There was a problem hiding this comment.
Rule #8 states templates/azd init are for new projects only, while global-rules.md currently allows azd init on existing workspaces with explicit confirmation. Align the wording across these documents so the agent doesn’t get conflicting guidance about whether in-place initialization is ever acceptable.
| 8. ⛔ **NEVER delete user project directories** — When adding features to an existing project, MODIFY existing files. Templates and `azd init` are for NEW projects only. NEVER run `rm -rf` on user workspace directories. | |
| 8. ⛔ **NEVER delete user project directories** — When adding features to an existing project, MODIFY existing files. Templates and `azd init` are primarily for NEW projects; in existing workspaces, only run `azd init` after explicit user confirmation and in compliance with [Global Rules](references/global-rules.md). NEVER run `rm -rf` on user workspace directories. |
| - Do NOT proceed based on "the user asked to deploy" (deploy ≠ delete old) | ||
| - Do NOT batch destructive actions without individual confirmation | ||
| - ⛔ Do NOT delete user project directories (`rm -rf <project>`) even when adding features, converting, or migrating — use MODIFY mode to edit existing files instead | ||
| - ⛔ `azd init` and template commands are for NEW projects only — NEVER run on an existing workspace without explicit user confirmation |
There was a problem hiding this comment.
Did you mean to say azd init commands with a template in the arguments? You can azd init without a template in an existing workspace.
| 5. **Validate before deploy** — Invoke azure-validate before azure-deploy | ||
| 6. **Confirm Azure context** — Use `ask_user` for subscription and location per [Azure Context](references/azure-context.md) | ||
| 7. ⛔ **Destructive actions require `ask_user`** — [Global Rules](references/global-rules.md) | ||
| 8. ⛔ **NEVER delete user project directories** — When adding features to an existing project, MODIFY existing files. Templates and `azd init` are for NEW projects only. NEVER run `rm -rf` on user workspace directories. |
There was a problem hiding this comment.
If an agent follows this instruction exactly it will lose the ability to delete directories for other valid reasons.
JasonYeMSFT
left a comment
There was a problem hiding this comment.
Please refine the instructions to resolve the two issues I commented on:
- Make it clear that only azd init commands with template arguments cannot be used with an existing workspace.
- Clarify when the agent cannot use
rmcommand to prevent blocking the agent from deleting files for valid reasons.
Agent was destroying existing Azure Functions projects when asked to add MCP support —
templates/mcp.mdlistedazd init -t remote-mcp-functions-*without any indication these commands initialize a blank project, causing the agent to treat "add MCP" as "start fresh."Changes
templates/mcp.md— Added prominent⚠️ Warningblock clarifying templates are for new projects only. Added a "Templates vs. Recipes" decision table so the agent routes existing projects torecipes/mcp/instead ofazd init.SKILL.md— Added Rule {"name":"TypeError","message":"Right-hand side of 'instanceof' is not an object"} when asking for logs over time frame for website #8 explicitly prohibiting deletion of user project directories and restrictingazd initto new projects.global-rules.md— Extended "No Exceptions" with two explicit bullets: norm -rfon user directories even when converting/migrating, and noazd initon existing workspaces without explicit confirmation.Latent same-pattern issues fixed
recipes/sql/README.mdandrecipes/blob-eventgrid/README.md— Both had## AZD Templates (Recommended)sections with bareazd initcommands and no new-project-only qualifier, the identical pattern that caused this incident. Added warnings and renamed sections to "(NEW projects only)."Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.