Orchestra is a mature, composable WPF shell and framework built on top of Catel. It provides a robust yet flexible Line of Business (LoB) shell, designed with best practices in mind, to jump-start the development of desktop applications.
Orchestra consists of the following projects:
- Orchestra.Core — Core shell library with services, commands, and shared WPF functionality.
- Orchestra.Shell.Ribbon.Fluent — Fluent Ribbon shell implementation.
- Orchestra.Shell.TaskRunner — Task Runner shell implementation.
These rules are non-negotiable. Violating them causes broken builds, crashes, or downstream breakage.
Files matching *.generated.cs, *.generated.xaml are auto-generated.
- NEVER manually edit these files
This project maintains stable ABI / API. Breaking changes break downstream apps.
| Allowed | Never |
|---|---|
| Add new overloads | Modify existing signatures |
| Add new methods | Remove public APIs |
| Add new classes | Change return types |
Building alone is NOT sufficient. Run tests before claiming completion (see Commands).
Direct commits to protected branches are a policy violation.
| Repository | Protected Branches |
|---|---|
| Orchestra | master |
| Orchestra | develop |
Required workflow:
- Create a feature branch FIRST — Use naming convention:
feature/issue-NNNN-description - Make all commits on the feature branch — Never commit directly to protected branches
- Submit a Pull Request — Changes must be reviewed by a human before merging
# CORRECT — Always create a feature branch first
git checkout -b feature/issue-1234-fix-description
# NEVER DO THIS — Policy violation
git checkout develop && git commit # FORBIDDEN
# NEVER DO THIS — Policy violation
git checkout master && git commit # FORBIDDENThe repository has protected branches that must be respected.
Single source of truth for all commands:
| Task | Command |
|---|---|
| Build | dotnet cake --target=build |
| Test | dotnet cake --target=test |
| Build and test | dotnet cake --target=buildandtest |
Orchestra.Core => Core shell services and WPF utilities (cross-shell)
Orchestra.Shell.Ribbon.Fluent => Fluent Ribbon shell
Orchestra.Shell.TaskRunner => Task Runner shell
Orchestra.Shell.Shared => Shared shell code
Orchestra.Tests => Automated test suite
| Directory / Pattern | Editable? | Notes |
|---|---|---|
*.generated.cs |
No | Leave as-is — auto-generated |
*.generated.xaml |
No | Leave as-is — auto-generated |
deployment/ |
No | Deployment / build scripts |
doc/ |
Yes | Documentation and images |
src/Orchestra.Core/ |
Yes | Core shell source |
src/Orchestra.Shell.Ribbon.Fluent/ |
Yes | Fluent Ribbon shell source |
src/Orchestra.Shell.TaskRunner/ |
Yes | Task Runner shell source |
src/Orchestra.Tests/ |
Yes | Automated tests |
| Anti-Pattern | Why |
|---|---|
| Modifying method signatures | ABI breaking |
Manual edits to *.generated.cs, *.generated.xaml |
Overwritten on regenerate |
| Using default parameters in public APIs | ABI breaking |
| Reformatting unrelated code | Makes diffs harder to review |
| Skipping failing tests | Unacceptable — tests must pass |
dotnet cake --target=testNON-NEGOTIABLE: Tests must PASS before claiming completion.
- Do NOT skip failing tests
- Do NOT claim completion if tests fail
- Do NOT use
SkipExceptionto work around failures
- Use NUnit to write tests
- Create a Facts class for a feature
- Combine Pascal / Snake case for test methods (e.g.
Feature_Does_Work)
[Test]
public void Feature_Does_Work()
{
var result = 47 - 5;
Assert.That(result, Is.EqualTo(42));
}Philosophy: Tests FAIL when wrong, never skip (except missing hardware).
- Establish baseline — What's the known-good state?
- One change at a time — Verify each change before proceeding
- Track changes in a table — Log what you changed and the result
- Platform differences are signals — If X works and Y fails, the difference IS the answer
- Revert if worse — Don't pile fixes on top of failures
| Topic | Document |
|---|---|
| Contributing guidelines | CONTRIBUTING.md |
| Documentation portal | https://opensource.wildgums.com |
| Catel (underlying framework) | https://github.com/Catel/Catel |