Files
james.maesandClaude Opus 5.5 839fb72bec chore: adopt the KofTwentyTwo standards (#2)
## What

Brings AppKit into conformance with
[KofTwentyTwo/standards](https://github.com/KofTwentyTwo/standards).
Reviewable commit by commit:

| Commit | Change |
| --- | --- |
| build | Quality gate from `configs/dotnet` (analyzers incl. Meziantou,
warnings as errors), `packages.lock.json` per project, locked-mode
restore |
| style | Kingsrook layout and LF line endings, produced mechanically by
`dotnet format` (formatting only) |
| docs | SPDX license header on every C# file |
| refactor | Real code changes: analyzer findings fixed (one type per
file, regex timeouts, async void, …) and header comments on every type
and member |
| ci | Old workflows replaced by callers of the shared standards
workflows (PR gates, security, CodeQL, .NET CI, NuGet release with SBOM
+ attestation + trusted publishing), Scorecard |
| docs | README, CONTRIBUTING (GitHub Flow, DCO, signing), SECURITY,
CODEOWNERS, templates, Dependabot, threat model, ADRs, RELEASING |

Also includes `dev`'s CI fix, so it supersedes #1; the `dev` branch goes
away under GitHub Flow.

## Why

AppKit is the first Product repository to adopt the standards. Static
conformance before: 16 FAIL; after: 0 FAIL, 0 WARN (the remaining
UNKNOWN rows are GitHub settings and rulesets, applied separately).

## How tested

Locally with `CI=true` (lock files enforced): locked restore x64 and
ARM64; zero-warning x64 build; 115 unit tests with 100% line coverage of
`KofTwentyTwo.AppKit` and `KofTwentyTwo.AppKit.Updates`; 12 FlaUI UI
tests (WinUI + WPF samples); `dotnet format --verify-no-changes
--severity warn` clean; pack produces 4 packages + symbols; actionlint,
zizmor (pedantic), gitleaks clean.

The UI tests caught a regression introduced while fixing MA0147 (the WPF
splash stopped dismissing because no UI context existed yet); fixed by
starting the countdown through the dispatcher in both packages.

## Notes

- `ci.yml` and `release.yml` are pinned to KofTwentyTwo/standards#3's
head commit; they are repinned after that PR merges.
- This pull request's new check names become required checks once the
repository's rulesets are updated.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: James Maes <james@kof22.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:43:17 -05:00

2.1 KiB

AppKit

Shared foundation packages for KofTwentyTwo Windows apps (WinUI 3 and WPF, .NET 10). Every KofTwentyTwo app depends on this, so treat the public API as a contract. The repo follows the KofTwentyTwo standards (github.com/KofTwentyTwo/standards; local clone ../standards).

Commands

dotnet restore AppKit.slnx -p:Platform=x64 --locked-mode
dotnet build AppKit.slnx -p:Platform=x64 -warnaserror
dotnet test tests/KofTwentyTwo.AppKit.Tests --settings coverage.runsettings --collect:"XPlat Code Coverage" --results-directory TestResults
./build/Assert-Coverage.ps1 -ResultsDirectory TestResults -Packages KofTwentyTwo.AppKit,KofTwentyTwo.AppKit.Updates
dotnet test tests/KofTwentyTwo.AppKit.UiTests        # launches both sample apps on the desktop
dotnet format AppKit.slnx --verify-no-changes --severity warn --no-restore
pwsh ../standards/tools/Test-RepoConformance.ps1 -LocalPath . -StaticOnly

Rules

  • GitHub Flow: topic branch <type>/<desc> → PR to main → squash merge. No dev branch. Conventional Commit titles, git commit -s (DCO), signed commits. Agents never merge, tag, release, or change repository settings.
  • Zero warnings; 100% line coverage for KofTwentyTwo.AppKit and KofTwentyTwo.AppKit.Updates.
  • Testable logic lives in those two packages; WinUI/WPF packages hold views and adapters only.
  • UI packages are code-built (no XAML) so they work unpackaged; keep WinUI and WPF in step, with a UI test for both samples.
  • Kingsrook style (.editorconfig): 3-space indent, Allman braces, if(, LF line endings, three blank lines between members, a /// header comment on every type and method, flower-box comments inside bodies, SPDX header on every file, one type per file.
  • Package versions live only in Directory.Packages.props; every project commits its packages.lock.json, and CI restores in locked mode.
  • samples/Shared/*.cs are linked into both sample projects: run dotnet format on the solution only after checking it did not write merge-conflict markers into them.
  • Attack-surface changes update docs/security/threat-model.md; expensive-to-reverse decisions get an ADR in docs/adr/.