Commands and traps. Symptom-first table: .agents/skills/build/SKILL.md.
Test coverage by area: test-matrix.md (Current gaps first). Do not invent MSBuild flags.
Compile the csproj you changed. Deploy/repack -p:…=false only for projects
with UseRevit / UseAutoCad (or their own ILRepackable=true). Shared
DevTools.* does not import those targets — omit the props. Details:
.agents/skills/build/SKILL.md.
# Shared library
dotnet build <path/to/DevTools.*.csproj> -c Debug
# Host entrypoint (compile only)
dotnet build source/RevitDevTool/RevitDevTool.csproj -c Debug.Autodesk.2025 -p:DeployRevitAddin=false -p:DeployAutoCadBundle=false -p:ILRepackable=false| Project kind | Config |
|---|---|
UseRevit / UseAutoCad |
Debug.Autodesk.2025 (spot-check 2022 + 2027 if TFM-sensitive) |
Shared multi-TFM DevTools.* |
Debug |
build/ / install/ |
Release |
Host API matrix (all years): build-matrix.md.
| Situation | Command |
|---|---|
| File lock / deploy failed | scripts/kill-host.ps1 -HostApp Revit -Year <year> |
| Build + deploy one year | Stop only that year; scripts/build-host.ps1 -Year 2025 |
| .NET tests | dotnet run --project tests/<project>/<project>.csproj |
| Execution tests | dotnet run --project tests/DevTools.Execution.<Scope>.Tests/DevTools.Execution.<Scope>.Tests.csproj (CSharp, FSharp, Python, IronPython, Pytest, Mcp, Services). Coverage: -- --coverage --coverage-output-format cobertura --coverage-settings coverage.xml |
| MCP tests | dotnet run --project tests/DevTools.Mcp.<Module>.Tests/DevTools.Mcp.<Module>.Tests.csproj (Core, Catalog, Adapter, Client, Server) |
| Python parser (this repo) | scripts/test-python.ps1 |
| Installer / bundle | scripts/pack.ps1 |
| TestAdapter NuGet | scripts/pack-test-adapter.ps1 (writes output/nuget, deletes the extracted global-packages copy of that version) |
| TestAdapter consumer surface (net48 / net8 / net10 build + host-free discovery) | scripts/test-adapter-matrix.ps1 |
| Daemon publish | dotnet publish source/DevTools.Daemon -c Release |
Build sample toolsets before parser/spike tests — see test-matrix.md.
| Change type | Minimum proof |
|---|---|
| Refactor / local fix | Compile touched projects |
| Wire contract / parser | + focused test project (check gaps table first) |
| MCP daemon/host surface | + mcp-integration-test.md when host available |
Passing smoke tests ≠ live host proof. Name blockers with test name + missing path.
When investigating host or MCP failures, read the newest log for the process under test — do not guess paths.
| Process | Default folder | Newest file |
|---|---|---|
| Host startup crash (add-in failed to load) | %APPDATA%\RevitDevTool\{Year}\Logs\ |
Highest LastWriteTime matching crash_* |
| Host session (Revit / AutoCAD) | %APPDATA%\RevitDevTool\{Year}\Logs\ |
Highest LastWriteTime matching log_* (.log or .json) |
| Daemon | %APPDATA%\RevitDevTool\logs\ |
Highest LastWriteTime matching log_*.log |
{Year} is the host product year (e.g. 2025). Host folder may differ if the user
changed Settings → Logging; Daemon always uses logs\ (Logging:File). Match PID in the
filename when several sessions are open. AutoClean deletes log_* only — crash_*
stays until you delete it.
# Add-in failed during OnStartup / ApplicationInitialized
Get-ChildItem "$env:APPDATA\RevitDevTool\2025\Logs\crash_*" |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
# Host session logs (adjust year)
Get-ChildItem "$env:APPDATA\RevitDevTool\2025\Logs\log_*" |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
# Daemon
Get-ChildItem "$env:APPDATA\RevitDevTool\logs\log_*.log" |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
# Both trees — list 50 newest under %APPDATA%\RevitDevTool
scripts/collect-logs.ps1Reproduce the failure before collecting; cite log path + relevant lines in the report.
samples/PythonDemo/revit_dashboard_ui/: npm run quality