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.
|
@paulyuk Please resolve merge conflicts and resolve the remaining comments. Explain what changes you made or why you chose not to make any changes for each comment. |
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.