vscode skill
This commit is contained in:
@@ -0,0 +1,95 @@
|
|||||||
|
---
|
||||||
|
name: vscode-configuration
|
||||||
|
description: 'Create and troubleshoot VS Code workspace configuration for Python projects, with focused patterns for launch.json debugpy/FastAPI debugging and tasks.json task automation.'
|
||||||
|
argument-hint: 'What do you need: debug setup, FastAPI debug run profile, tasks.json automation, or all of them?'
|
||||||
|
---
|
||||||
|
|
||||||
|
# VS Code Configuration
|
||||||
|
|
||||||
|
Use this skill to design or repair repeatable VS Code workspace configuration for local development workflows.
|
||||||
|
|
||||||
|
## When to Use
|
||||||
|
|
||||||
|
- You need to create or fix `.vscode/launch.json` debug profiles.
|
||||||
|
- You need robust Python debugging with `debugpy`.
|
||||||
|
- You need FastAPI-specific launch profiles (app module, host/port, reload options, env files).
|
||||||
|
- You need `.vscode/tasks.json` build/test/run tasks and optional debug pre-launch integration.
|
||||||
|
- You need consistent workspace onboarding where users can run and debug from VS Code with minimal manual setup.
|
||||||
|
|
||||||
|
## Progressive References
|
||||||
|
|
||||||
|
Load only the page that matches the current request:
|
||||||
|
|
||||||
|
- Launch profile mechanics and debugpy patterns: [debug launch configurations](./references/debug-launch-configurations.md)
|
||||||
|
- FastAPI-focused debug profiles using debugpy: [FastAPI + debugpy launch patterns](./references/fastapi-debugpy-launch.md)
|
||||||
|
- Task runner setup in VS Code: [tasks.json project tasks](./references/tasks-json-configuration.md)
|
||||||
|
|
||||||
|
## Procedure
|
||||||
|
|
||||||
|
### Step 1: Capture the Runtime Shape
|
||||||
|
|
||||||
|
Collect the minimum context before writing files:
|
||||||
|
|
||||||
|
1. Python entry shape: module path vs script path.
|
||||||
|
2. Framework runtime: plain script, FastAPI with uvicorn, or mixed services.
|
||||||
|
3. Required environment: env file, env vars, cwd, and PYTHONPATH needs.
|
||||||
|
4. Task expectations: run app, run tests, lint/format, one-off setup.
|
||||||
|
|
||||||
|
Completion check: you can state exactly what command should run for debug and for task execution.
|
||||||
|
|
||||||
|
### Step 2: Create launch.json Profiles
|
||||||
|
|
||||||
|
1. Add at least one stable baseline profile before specialized variants.
|
||||||
|
2. Prefer module-based launches where packaging/import paths matter.
|
||||||
|
3. Keep debugger options explicit (`justMyCode`, `console`, `cwd`, `envFile`).
|
||||||
|
4. Add purpose-built profiles instead of one overloaded profile.
|
||||||
|
|
||||||
|
For concrete patterns, open [debug launch configurations](./references/debug-launch-configurations.md).
|
||||||
|
|
||||||
|
Completion check: selecting each profile starts the intended process without manual edits.
|
||||||
|
|
||||||
|
### Step 3: Add FastAPI Profiles When Needed
|
||||||
|
|
||||||
|
1. Use a dedicated FastAPI profile that launches `uvicorn` via module mode.
|
||||||
|
2. Keep host/port/reload/log-level as explicit args.
|
||||||
|
3. Include `jinja` debugging only if templates are in scope.
|
||||||
|
4. Add an attach profile when launching via external `debugpy` listener.
|
||||||
|
|
||||||
|
For complete examples, open [FastAPI + debugpy launch patterns](./references/fastapi-debugpy-launch.md).
|
||||||
|
|
||||||
|
Completion check: breakpoints hit in app code and startup path, and profile behavior matches dev vs non-dev expectations.
|
||||||
|
|
||||||
|
### Step 4: Add tasks.json for Repeated Commands
|
||||||
|
|
||||||
|
1. Create named tasks for run, test, lint, and docs/build steps as needed.
|
||||||
|
2. For Python projects, keep commands consistent with the repo package manager.
|
||||||
|
3. Use `problemMatcher` where parsers exist and background flags for long-running tasks.
|
||||||
|
4. Link debug profiles to tasks with `preLaunchTask` only when startup sequencing is required.
|
||||||
|
|
||||||
|
For task schema and examples, open [tasks.json project tasks](./references/tasks-json-configuration.md).
|
||||||
|
|
||||||
|
Completion check: tasks run from Command Palette and can be reused by debug profiles.
|
||||||
|
|
||||||
|
### Step 5: Validate End-to-End
|
||||||
|
|
||||||
|
1. Run each launch profile once.
|
||||||
|
2. Run each task once.
|
||||||
|
3. Verify paths, env files, and interpreter assumptions on a clean workspace reload.
|
||||||
|
4. Record any project-specific defaults in comments or docs if non-obvious.
|
||||||
|
|
||||||
|
Completion check: a teammate can clone the repo, open VS Code, and run/debug with only documented prerequisites.
|
||||||
|
|
||||||
|
## Decision Points
|
||||||
|
|
||||||
|
- If the app is imported as a package, prefer module launches over direct script paths.
|
||||||
|
- If runtime is started outside VS Code, add attach profile instead of forcing launch mode.
|
||||||
|
- If there are long-running dev servers, pair with background tasks.
|
||||||
|
- If test command differs by repo convention, mirror that command in tasks exactly.
|
||||||
|
|
||||||
|
## Output Contract
|
||||||
|
|
||||||
|
Return:
|
||||||
|
|
||||||
|
1. Created or updated VS Code config files and profile/task names.
|
||||||
|
2. Any assumptions (module path, env file, command runner).
|
||||||
|
3. Validation results and any unresolved decisions.
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
# Debug Launch Configurations in VS Code
|
||||||
|
|
||||||
|
This reference focuses on Python debugging through `debugpy` using `.vscode/launch.json`.
|
||||||
|
|
||||||
|
## Core Structure
|
||||||
|
|
||||||
|
A minimal launch file:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Useful fields for Python configs:
|
||||||
|
|
||||||
|
- `type`: Use `debugpy`.
|
||||||
|
- `request`: Usually `launch`, sometimes `attach`.
|
||||||
|
- `name`: Friendly profile name shown in the Run and Debug panel.
|
||||||
|
- `program`: Script path for script-based entry.
|
||||||
|
- `module`: Module name for `python -m ...` style launches.
|
||||||
|
- `args`: CLI arguments.
|
||||||
|
- `cwd`: Working directory.
|
||||||
|
- `env` / `envFile`: Environment variables.
|
||||||
|
- `console`: `integratedTerminal` is usually most practical.
|
||||||
|
- `justMyCode`: `true` by default; set `false` when stepping into dependencies.
|
||||||
|
|
||||||
|
## Launch vs Attach
|
||||||
|
|
||||||
|
Use `launch` when VS Code should start the process.
|
||||||
|
Use `attach` when the process already runs with debugpy listening.
|
||||||
|
|
||||||
|
Attach profile example:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "Python: Attach (debugpy :5678)",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "attach",
|
||||||
|
"connect": {
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 5678
|
||||||
|
},
|
||||||
|
"justMyCode": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Remote process side command example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m debugpy --listen 5678 -m your_package.main
|
||||||
|
```
|
||||||
|
|
||||||
|
## Script and Module Patterns
|
||||||
|
|
||||||
|
Script pattern:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "Python: Script",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/src/app.py",
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"justMyCode": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Module pattern:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "Python: Module",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"module": "your_package.main",
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"justMyCode": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Prefer module mode when imports depend on package layout.
|
||||||
|
|
||||||
|
## Environment and Interpreter Notes
|
||||||
|
|
||||||
|
- Use `envFile` for shared local variables, commonly `${workspaceFolder}/.env`.
|
||||||
|
- Keep secrets out of committed launch configs.
|
||||||
|
- Ensure the selected VS Code interpreter matches project tooling.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
If breakpoints do not hit:
|
||||||
|
|
||||||
|
1. Confirm the right profile is selected.
|
||||||
|
2. Confirm the file path/module path is correct.
|
||||||
|
3. Disable `justMyCode` temporarily to inspect call flow.
|
||||||
|
4. Confirm no stale background process is occupying the expected port.
|
||||||
|
5. Confirm workspace root and `cwd` align with imports.
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
# FastAPI Debug Launch with debugpy
|
||||||
|
|
||||||
|
This reference provides practical `.vscode/launch.json` patterns for FastAPI applications started with uvicorn.
|
||||||
|
|
||||||
|
## Launch FastAPI via Module
|
||||||
|
|
||||||
|
Preferred profile:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "FastAPI: Uvicorn (debug)",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"module": "uvicorn",
|
||||||
|
"args": [
|
||||||
|
"your_package.main:app",
|
||||||
|
"--host",
|
||||||
|
"127.0.0.1",
|
||||||
|
"--port",
|
||||||
|
"8000",
|
||||||
|
"--reload",
|
||||||
|
"--log-level",
|
||||||
|
"debug"
|
||||||
|
],
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"envFile": "${workspaceFolder}/.env",
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"justMyCode": true,
|
||||||
|
"jinja": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Why module mode: it matches `python -m uvicorn ...` behavior and avoids path ambiguity.
|
||||||
|
|
||||||
|
## Launch with Factory Pattern
|
||||||
|
|
||||||
|
If app is created via factory function:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "FastAPI: Uvicorn factory (debug)",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "launch",
|
||||||
|
"module": "uvicorn",
|
||||||
|
"args": [
|
||||||
|
"your_package.main:create_app",
|
||||||
|
"--factory",
|
||||||
|
"--host",
|
||||||
|
"127.0.0.1",
|
||||||
|
"--port",
|
||||||
|
"8000",
|
||||||
|
"--reload"
|
||||||
|
],
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"justMyCode": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Attach to an Existing FastAPI Process
|
||||||
|
|
||||||
|
If the app is launched externally, start with debugpy:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m debugpy --listen 5678 -m uvicorn your_package.main:app --host 127.0.0.1 --port 8000 --reload
|
||||||
|
```
|
||||||
|
|
||||||
|
Attach profile:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "FastAPI: Attach (5678)",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "attach",
|
||||||
|
"connect": {
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 5678
|
||||||
|
},
|
||||||
|
"justMyCode": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Common FastAPI Debug Pitfalls
|
||||||
|
|
||||||
|
1. Wrong import target in `your_package.main:app` or factory symbol.
|
||||||
|
2. `cwd` does not match source layout.
|
||||||
|
3. Auto-reload creating confusion about active process when breakpoints are set in startup code.
|
||||||
|
4. Port collisions from old uvicorn processes.
|
||||||
|
5. Environment variables not loaded because `envFile` path is wrong.
|
||||||
|
|
||||||
|
## Practical Quality Gate
|
||||||
|
|
||||||
|
A profile is considered valid when:
|
||||||
|
|
||||||
|
1. Server starts from VS Code Run and Debug.
|
||||||
|
2. A breakpoint inside an endpoint is hit on request.
|
||||||
|
3. A breakpoint in startup/lifespan logic is hit at app boot.
|
||||||
|
4. Terminal output appears in integrated terminal with expected log level.
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
# Configure Project Tasks in tasks.json
|
||||||
|
|
||||||
|
Use `.vscode/tasks.json` to define repeatable project commands and optional hooks for debugging.
|
||||||
|
|
||||||
|
## Minimal File
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Task Fields You Will Use Most
|
||||||
|
|
||||||
|
- `label`: Task name shown in VS Code.
|
||||||
|
- `type`: Usually `shell`.
|
||||||
|
- `command`: Executable to run.
|
||||||
|
- `args`: Command arguments.
|
||||||
|
- `options.cwd`: Working directory.
|
||||||
|
- `group`: Mark default build or test tasks.
|
||||||
|
- `problemMatcher`: Parse errors into the Problems panel.
|
||||||
|
- `isBackground`: `true` for long-running tasks (for example dev server watch).
|
||||||
|
|
||||||
|
## Python Project Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "App: Run",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "uv",
|
||||||
|
"args": ["run", "uvicorn", "personal_mcp.main:app", "--host", "127.0.0.1", "--port", "8000", "--reload"],
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
"isBackground": true,
|
||||||
|
"problemMatcher": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Tests: Pytest",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "uv",
|
||||||
|
"args": ["run", "pytest"],
|
||||||
|
"options": {
|
||||||
|
"cwd": "${workspaceFolder}"
|
||||||
|
},
|
||||||
|
"group": "test",
|
||||||
|
"problemMatcher": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Connect Tasks to Debug Profiles
|
||||||
|
|
||||||
|
In `launch.json`, you can run a task first:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"name": "FastAPI: Attach",
|
||||||
|
"type": "debugpy",
|
||||||
|
"request": "attach",
|
||||||
|
"connect": {
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 5678
|
||||||
|
},
|
||||||
|
"preLaunchTask": "App: Run"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Use this only when startup sequencing is needed.
|
||||||
|
|
||||||
|
## Task Design Guidelines
|
||||||
|
|
||||||
|
1. Keep labels stable and descriptive.
|
||||||
|
2. Prefer one task per intent instead of monolithic shell commands.
|
||||||
|
3. Keep shell portability in mind if teammates use multiple OSes.
|
||||||
|
4. Avoid embedding secrets directly in task definitions.
|
||||||
|
5. Mark long-running tasks with `isBackground` and keep matchers explicit.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
If a task fails unexpectedly:
|
||||||
|
|
||||||
|
1. Run the underlying command directly in terminal.
|
||||||
|
2. Confirm `options.cwd` points to expected workspace root.
|
||||||
|
3. Confirm tool availability in environment path.
|
||||||
|
4. Confirm quoting and argument boundaries in `args`.
|
||||||
|
5. Confirm the task is not blocked by an outdated background process.
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
from fastmcp import FastMCP
|
from fastmcp import FastMCP
|
||||||
|
|
||||||
from personal_mcp.catalog.server import catalog_server
|
from personal_mcp.catalog.server import catalog_server
|
||||||
from personal_mcp.skills.copilot_customization.server import copilot_customization_server
|
from personal_mcp.skills.copilot_customization.server import (
|
||||||
|
copilot_customization_server,
|
||||||
|
)
|
||||||
from personal_mcp.skills.fastapi_async_sqlalchemy_modernization.server import (
|
from personal_mcp.skills.fastapi_async_sqlalchemy_modernization.server import (
|
||||||
fastapi_async_sqlalchemy_modernization_server,
|
fastapi_async_sqlalchemy_modernization_server,
|
||||||
)
|
)
|
||||||
@@ -15,6 +17,7 @@ from personal_mcp.skills.pytest_scaffolding.server import pytest_scaffolding_ser
|
|||||||
from personal_mcp.skills.python_logging_dictconfig.server import (
|
from personal_mcp.skills.python_logging_dictconfig.server import (
|
||||||
python_logging_dictconfig_server,
|
python_logging_dictconfig_server,
|
||||||
)
|
)
|
||||||
|
from personal_mcp.skills.vscode_configuration.server import vscode_configuration_server
|
||||||
from personal_mcp.skills.zensical_docs.server import zensical_docs_server
|
from personal_mcp.skills.zensical_docs.server import zensical_docs_server
|
||||||
|
|
||||||
mcp = FastMCP("personal-mcp")
|
mcp = FastMCP("personal-mcp")
|
||||||
@@ -30,5 +33,6 @@ mcp.mount(nicegui_server, namespace="nicegui")
|
|||||||
mcp.mount(nicegui_ui_customization_server, namespace="nicegui_ui_customization")
|
mcp.mount(nicegui_ui_customization_server, namespace="nicegui_ui_customization")
|
||||||
mcp.mount(pytest_scaffolding_server, namespace="pytest_scaffolding")
|
mcp.mount(pytest_scaffolding_server, namespace="pytest_scaffolding")
|
||||||
mcp.mount(python_logging_dictconfig_server, namespace="python_logging_dictconfig")
|
mcp.mount(python_logging_dictconfig_server, namespace="python_logging_dictconfig")
|
||||||
|
mcp.mount(vscode_configuration_server, namespace="vscode_configuration")
|
||||||
mcp.mount(fastapi_uv_docker_server, namespace="fastapi_uv_docker")
|
mcp.mount(fastapi_uv_docker_server, namespace="fastapi_uv_docker")
|
||||||
mcp.mount(zensical_docs_server, namespace="zensical_docs")
|
mcp.mount(zensical_docs_server, namespace="zensical_docs")
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
"""VS Code configuration skill package."""
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
id: vscode-configuration
|
||||||
|
name: VS Code Configuration
|
||||||
|
version: 1.0.0
|
||||||
|
description: Create and troubleshoot VS Code launch and task configuration for Python and FastAPI projects.
|
||||||
|
tags:
|
||||||
|
- vscode
|
||||||
|
- launch-json
|
||||||
|
- tasks-json
|
||||||
|
- debugpy
|
||||||
|
- fastapi
|
||||||
|
- python
|
||||||
|
- skills
|
||||||
|
capabilities:
|
||||||
|
- resource://skills/vscode-configuration/document
|
||||||
|
depends_on: []
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
from fastmcp import FastMCP
|
||||||
|
|
||||||
|
from personal_mcp.skills.document_loader import load_skill_document_from_metadata
|
||||||
|
|
||||||
|
vscode_configuration_server = FastMCP("vscode-configuration")
|
||||||
|
_METADATA_PATH = Path(__file__).with_name("metadata.yaml")
|
||||||
|
_METADATA = yaml.safe_load(_METADATA_PATH.read_text(encoding="utf-8")) or {}
|
||||||
|
|
||||||
|
|
||||||
|
@vscode_configuration_server.resource("resource://skills/vscode-configuration/document")
|
||||||
|
def skill_document() -> dict[str, str]:
|
||||||
|
"""Return the canonical Markdown document for this skill."""
|
||||||
|
return load_skill_document_from_metadata(
|
||||||
|
skill_id="vscode-configuration",
|
||||||
|
namespace="vscode_configuration",
|
||||||
|
metadata=_METADATA,
|
||||||
|
)
|
||||||
@@ -51,6 +51,7 @@ nav = [
|
|||||||
{ "MCP" = "mcp_layout.md" },
|
{ "MCP" = "mcp_layout.md" },
|
||||||
{ "Copilot" = "copilot.md" },
|
{ "Copilot" = "copilot.md" },
|
||||||
{ "Usage" = "usage.md" },
|
{ "Usage" = "usage.md" },
|
||||||
|
{ "Future Work" = "future_work.md" },
|
||||||
{ "New Skill" = "new_skill.md" },
|
{ "New Skill" = "new_skill.md" },
|
||||||
{ "Security" = "securing.md" },
|
{ "Security" = "securing.md" },
|
||||||
] },
|
] },
|
||||||
@@ -59,6 +60,12 @@ nav = [
|
|||||||
{ "Overview" = "skills/copilot-customization/SKILL.md" },
|
{ "Overview" = "skills/copilot-customization/SKILL.md" },
|
||||||
{ "VS Code" = "skills/copilot-customization/references/vscode-customization.md" },
|
{ "VS Code" = "skills/copilot-customization/references/vscode-customization.md" },
|
||||||
] },
|
] },
|
||||||
|
{ "VS Code Config" = [
|
||||||
|
{ "Overview" = "skills/vscode-configuration/SKILL.md" },
|
||||||
|
{ "Debug Launch" = "skills/vscode-configuration/references/debug-launch-configurations.md" },
|
||||||
|
{ "FastAPI Debug" = "skills/vscode-configuration/references/fastapi-debugpy-launch.md" },
|
||||||
|
{ "Tasks" = "skills/vscode-configuration/references/tasks-json-configuration.md" },
|
||||||
|
] },
|
||||||
{ "FastAPI UV" = [
|
{ "FastAPI UV" = [
|
||||||
{ "Overview" = "skills/fastapi-uv-docker/SKILL.md" },
|
{ "Overview" = "skills/fastapi-uv-docker/SKILL.md" },
|
||||||
{ "Best" = "skills/fastapi-uv-docker/references/fastapi-best-practices.md" },
|
{ "Best" = "skills/fastapi-uv-docker/references/fastapi-best-practices.md" },
|
||||||
|
|||||||
Reference in New Issue
Block a user