Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
f7839ab
test: Phase 3d — mobile handler unit tests (8 handlers, 22 tests)
sharpninja Feb 18, 2026
95c9313
docs: mark FR-12.12 Done, update test count to 240, mark all todos co…
sharpninja Feb 19, 2026
6a7a370
docs: add session handoff 2026-02-19T00-04-44
sharpninja Feb 19, 2026
0fdb33c
docs: add DocFX API+testing reference; add XML docs to all test classes
sharpninja Feb 19, 2026
6045eb6
docs: rebuild README; fix broken doc links
sharpninja Feb 19, 2026
5451a85
docs: fix all 505 broken DocFX breadcrumb links
sharpninja Feb 19, 2026
c9d16c4
Fix obsolete MAUI Page method calls in MauiPlatformServices
sharpninja Feb 19, 2026
fee4f52
Merge branch 'main' into develop
sharpninja Feb 19, 2026
6c36350
[WIP] Add direct FR/TR annotations for test methods (#16)
Copilot Feb 19, 2026
8897a32
fix: MSIX versioning, single-file self-contained packaging, and versi…
sharpninja Feb 19, 2026
31d3d7c
fix: read GitVersion.yml before git describe in version fallback
sharpninja Feb 19, 2026
cef353b
fix: add version source diagnostic logging to package-msix.ps1
sharpninja Feb 19, 2026
0fdc454
fix: print calculated version at end of package-msix.ps1
sharpninja Feb 19, 2026
98d3d86
fix: pause after manifest write to show version provenance and manife…
sharpninja Feb 19, 2026
880d87e
fix: auto-detect unsigned MSIX and pass -AllowUnsigned in install script
sharpninja Feb 19, 2026
b130917
fix: auto-sign unsigned MSIX with dev cert instead of using -AllowUns…
sharpninja Feb 19, 2026
383cfdc
feat: add -Clean flag to package-msix.ps1
sharpninja Feb 19, 2026
9bf403e
fix: navigate to Sessions view after successful connection
sharpninja Feb 19, 2026
62d625b
fix: stop service before MSIX update to avoid locked-file deployment …
sharpninja Feb 19, 2026
7ece071
fix: close desktop app before MSIX update to resolve 0x80073D02
sharpninja Feb 19, 2026
a1a131e
fix: remove --configfile from dotnet clean (unsupported flag)
sharpninja Feb 19, 2026
dc131c6
fix: restore packages after dotnet clean before publish
sharpninja Feb 19, 2026
c7316a1
fix: replace dotnet clean with direct bin/obj deletion in -Clean
sharpninja Feb 19, 2026
c4219a5
feat: add -Install flag to package-msix.ps1
sharpninja Feb 19, 2026
5834173
fix: use Directory.Delete for robust bin/obj removal in -Clean
sharpninja Feb 19, 2026
bca1fab
feat: add -BumpMajor/-BumpMinor/-BumpPatch flags to package-msix.ps1
sharpninja Feb 19, 2026
3d71056
feat: MsixTools PowerShell module with YAML-driven config
sharpninja Feb 19, 2026
131c689
fix: resolve OutDir to absolute path before icon generation
sharpninja Feb 19, 2026
f3145ed
fix: resolve WorkspaceRoot to absolute path at function entry
sharpninja Feb 19, 2026
f1a3187
fix: use Convert-Path to establish absolute WorkspaceRoot
sharpninja Feb 19, 2026
7821b41
feat: add -NoBuild flag; make -Clean and -NoBuild mutually exclusive
sharpninja Feb 19, 2026
a8a912f
chore: remove inline MsixTools (replaced by submodule)
sharpninja Feb 19, 2026
a749871
chore: add MsixTools as git submodule
sharpninja Feb 19, 2026
3b67902
refactor: wrapper scripts are now zero-logic param forwarders
sharpninja Feb 19, 2026
5d45758
chore: update MsixTools submodule to include bump params
sharpninja Feb 19, 2026
4473082
chore: update MsixTools submodule (add MCP server)
sharpninja Feb 19, 2026
70682bd
Use Segoe MDL2 Assets for icons and Segoe UI as base font on Windows
sharpninja Feb 19, 2026
acfef9a
Refactor copy-status-log to follow CQRS pattern with tests
sharpninja Feb 19, 2026
c49dee8
Add directive: UI buttons require CQRS handler + complete tests
sharpninja Feb 19, 2026
cb47ae1
Add Open Logs Folder button to App Log section (CQRS + tests)
sharpninja Feb 19, 2026
6df3aa2
Extract navigation panels to UserControls with IsVisible bindings
sharpninja Feb 19, 2026
658195b
Fix Windows port: bind to 5243 (not 5244) on Windows
sharpninja Feb 19, 2026
f67685b
Fix Windows port binding: use ConfigureKestrel instead of UseUrls
sharpninja Feb 19, 2026
026f1a2
Add Open Logs Folder button to status log viewer; icon-only buttons
sharpninja Feb 19, 2026
94a07f9
Fix Build MSIX: upgrade gittools/actions to v3 for GitVersion 6.x
sharpninja Feb 19, 2026
1247a7e
Add .deb build job and GitHub Release to pipeline
sharpninja Feb 19, 2026
b26b3a8
chore: commit working tree changes before PR
sharpninja Feb 19, 2026
5ff90ad
feat: expose DbPath on ILocalStorage; log connection details on open
sharpninja Feb 19, 2026
23f5d82
feat: add Windows Event Log as ILogger provider
sharpninja Feb 19, 2026
19f301e
feat: versioned Windows service display name
sharpninja Feb 19, 2026
7f6bf06
Merge branch 'main' into develop
sharpninja Feb 19, 2026
d5eb6ad
docs: session handoff 2026-02-19T18-35-50-0600
sharpninja Feb 19, 2026
915fc55
fix: checkout submodules in build-msix CI job
sharpninja Feb 19, 2026
e297d8b
fix: use Http2 (h2c) for cleartext gRPC endpoint
sharpninja Feb 19, 2026
69a8f70
feat: replace port Entry with Picker on mobile; default to 5244
sharpninja Feb 19, 2026
c4752ee
feat: centralize service port in ServiceDefaults; enforce port picker…
sharpninja Feb 19, 2026
a143ffd
fix: use Http1AndHttp2 + h2c switch to allow gRPC and REST on same port
sharpninja Feb 19, 2026
ea30a88
fix: set Kestrel EndpointDefaults to Http1AndHttp2 in appsettings.json
sharpninja Feb 19, 2026
8cd2862
feat: migrate 13 management REST endpoints to gRPC; revert to Http2-only
sharpninja Feb 19, 2026
85374ab
feat: use shared app logo in desktop window and MSIX
sharpninja Feb 19, 2026
94a65e9
feat: end server session when closing a tab
sharpninja Feb 19, 2026
ea42807
fix: wire MessageReceived/ConnectionStateChanged before connecting se…
sharpninja Feb 19, 2026
fe2a68b
docs: session handoff 2026-02-19T21-06-54-0600
sharpninja Feb 19, 2026
2ad92ae
chore: bump next-version to 0.1.12
sharpninja Feb 19, 2026
85e91d5
refactor: serialise Connect writes via Channel<ServerMessage>; remove…
sharpninja Feb 19, 2026
1a3a2e7
feat: add camera QR scan pairing flow with ZXing.Net.Maui and Android…
sharpninja Feb 19, 2026
3767edb
fix: replace obsolete Frame with Border in QrScannerPage; fix nullabl…
sharpninja Feb 19, 2026
0e5e9bf
Fix MSIX CI: exit 0 to prevent LASTEXITCODE leak from native commands
sharpninja Feb 19, 2026
bd06f38
Merge Build MSIX workflow into Build and Deploy pipeline
sharpninja Feb 19, 2026
b0d82d5
feat: serve /pair web UI on dedicated HTTP/1+2 port (1+gRPC port)
sharpninja Feb 19, 2026
f37e28e
feat: SetPairingUsers — PS script + Desktop toolbar + gRPC RPC
sharpninja Feb 20, 2026
db645e3
Fix: use IOptionsMonitor so /pair reloads after SetPairingUsers write…
sharpninja Feb 20, 2026
2c30fd5
Feat: generate and return API key when saving pairing user
sharpninja Feb 20, 2026
ddaa2f1
Fix: forward ApiKey to server info and capacity checks in ConnectMobi…
sharpninja Feb 20, 2026
25a470e
Fix: use Shell.Current.Navigation + MainThread for QR scanner modal push
sharpninja Feb 20, 2026
0b491de
UX: SelectableTextBlock everywhere in Avalonia; simplify mobile login…
sharpninja Feb 20, 2026
324f229
Style: global 4px margin on all interactive/display controls in Avalo…
sharpninja Feb 20, 2026
0a3e7e7
Fix: generate QR code server-side (embedded PNG) instead of CDN JS
sharpninja Feb 20, 2026
1dfe673
Replace QR camera scanner with server login webview for pairing
sharpninja Feb 20, 2026
a7add4c
docs: update session handoff 2026-02-20
sharpninja Feb 20, 2026
5b4f109
docs: add FR-17/18 and TR-19/20 for device pairing, API key managemen…
sharpninja Feb 20, 2026
9ef7799
Hardcode server connection mode on Android, remove mode selector dialog
sharpninja Feb 20, 2026
a6e698c
Migrate GetSessionCapacityAsync to gRPC, remove dead HTTP helpers
sharpninja Feb 20, 2026
b3d01ac
Hide navigation until connection and session are established
sharpninja Feb 20, 2026
22da942
Hide connection card in chat view when already connected
sharpninja Feb 20, 2026
2d2b678
Add server profiles: save connection details per host:port
sharpninja Feb 20, 2026
41796c9
Make Enter key send message on Android
sharpninja Feb 20, 2026
6384ba0
Add FR-19/20, TR-21/22: server profiles and mobile chat UX requirements
sharpninja Feb 20, 2026
5ceb870
Fix Android Enter-to-send, icon-only Send button, compact button padding
sharpninja Feb 20, 2026
bfdc4da
CQRS server profile handlers + clear API key feature
sharpninja Feb 20, 2026
032e786
Replace .NET splash screen logo with app icon
sharpninja Feb 20, 2026
588fcd7
Fix Android soft keyboard Enter: show Send action instead of newline
sharpninja Feb 20, 2026
d74983d
docs: update session handoff 2026-02-20T05:22, remove stale handoff
sharpninja Feb 20, 2026
6a85aaa
Add file transfer, agents panel, connection settings, toolbar TextBlo…
sharpninja Feb 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,17 @@

## Code Quality Standards

### UI Buttons — CQRS Required

**Every button added to the Desktop UI must be backed by a CQRS request/handler pair with complete tests.**

- Create `*Request` in `src/RemoteAgent.Desktop/Requests/` and `*Handler` in `src/RemoteAgent.Desktop/Handlers/`
- Register the handler as a transient in `App.axaml.cs` `ConfigureServices`
- The ViewModel command **must dispatch via `IRequestDispatcher`** — no handler logic in the ViewModel
- Add `*HandlerTests.cs` in `tests/RemoteAgent.Desktop.UiTests/Handlers/` covering success, failure, and edge cases
- Add a `Null*` stub for any new infrastructure interface to `SharedHandlerTestStubs.cs`
- See `docs/REPOSITORY_RULES.md` for full details and the `CopyStatusLogHandler` as a reference implementation

### Warnings as Errors

- All warnings are treated as errors (see `Directory.Build.props`)
Expand Down Expand Up @@ -101,3 +112,4 @@ Before completing any task:
✅ **Sign commits**
✅ **Run tests before completing tasks**
✅ **Use bash only in workflows (no Python)**
✅ **Every UI button → CQRS request/handler + complete tests**
93 changes: 91 additions & 2 deletions .github/workflows/build-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,79 @@ jobs:
dotnet restore RemoteAgent.Desktop.csproj --configfile ../../NuGet.Config -v minimal -p:TargetFramework=net9.0 -p:TargetFrameworks=net9.0
dotnet build RemoteAgent.Desktop.csproj -c Release --no-restore -v minimal -p:TargetFramework=net9.0 -p:TargetFrameworks=net9.0

build-msix:
name: Build MSIX (Windows)
runs-on: windows-latest
needs: [detect, build]
if: needs.detect.outputs.code == 'true'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive

- name: Setup .NET 10
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Setup .NET 9 (desktop)
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'

- name: Build MSIX package
shell: pwsh
env:
VERSION: ${{ needs.build.outputs.semver }}
run: |
.\scripts\package-msix.ps1 -Version $env:VERSION -Force

- name: Upload MSIX artifact
uses: actions/upload-artifact@v4
with:
name: msix-${{ needs.build.outputs.major_minor_patch }}
path: |
artifacts/*.msix
artifacts/*.cer
if-no-files-found: error
retention-days: 30

build-deb:
name: Build .deb (Linux)
runs-on: ubuntu-latest
needs: [detect, build]
if: needs.detect.outputs.code == 'true'
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup .NET 10
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Setup .NET 9 (desktop)
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'

- name: Build .deb packages
env:
VERSION: ${{ needs.build.outputs.semver }}
run: |
chmod +x scripts/package-deb.sh
./scripts/package-deb.sh --version "$VERSION"

- name: Upload .deb artifacts
uses: actions/upload-artifact@v4
with:
name: deb-${{ needs.build.outputs.major_minor_patch }}
path: artifacts/*.deb
if-no-files-found: error
retention-days: 30

android:
name: Build Android APK
runs-on: ubuntu-latest
Expand Down Expand Up @@ -273,7 +346,7 @@ jobs:
release-beta:
name: Create beta release
runs-on: ubuntu-latest
needs: [build, desktop-build, android, docker]
needs: [build, desktop-build, android, docker, build-msix, build-deb]
permissions:
contents: write
steps:
Expand Down Expand Up @@ -313,14 +386,30 @@ jobs:
with:
name: android-apk

- name: Download MSIX artifacts
uses: actions/download-artifact@v4
with:
name: msix-${{ needs.build.outputs.major_minor_patch }}
path: release-assets/msix

- name: Download .deb artifacts
uses: actions/download-artifact@v4
with:
name: deb-${{ needs.build.outputs.major_minor_patch }}
path: release-assets/deb

- name: Create beta release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ steps.version.outputs.version }}-beta.${{ github.run_number }}
name: Beta v${{ steps.version.outputs.version }} (build ${{ github.run_number }})
prerelease: true
body_path: release-notes.md
files: com.companyname.remoteagent.app-Signed.apk
files: |
com.companyname.remoteagent.app-Signed.apk
release-assets/msix/*.msix
release-assets/msix/*.cer
release-assets/deb/*.deb

docker:
name: Build and push Docker image
Expand Down
117 changes: 0 additions & 117 deletions .github/workflows/build-msix.yml

This file was deleted.

3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "scripts/MsixTools"]
path = scripts/MsixTools
url = https://github.com/sharpninja/MsixTools.git
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
"path": "pwsh.exe",
"args": ["-NoProfile"]
}
}
},
"fusion-360-helper.enabled": false
}
28 changes: 28 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,34 @@ All warnings are treated as errors. See [REPOSITORY_RULES.md](docs/REPOSITORY_RU
- Ensure all tests pass before submitting a PR.
- Integration tests should go in `RemoteAgent.Service.IntegrationTests`.

### Requirements Traceability

All test classes and methods should be annotated with the functional (FR) and technical (TR) requirements they cover:

```csharp
/// <summary>Tests for authentication. FR-13.5; TR-18.1, TR-18.2.</summary>
[Trait("Category", "Requirements")]
[Trait("Requirement", "FR-13.5")]
[Trait("Requirement", "TR-18.1")]
[Trait("Requirement", "TR-18.2")]
public class AuthUserServiceTests
{
[Fact]
public void UpsertListDelete_ShouldPersistUser()
{
// Test implementation
}
}
```

After adding or updating requirement annotations, regenerate the traceability matrix:

```bash
./scripts/generate-requirements-matrix.sh
```

This updates `docs/requirements-test-coverage.md`, which maps all requirements to their test coverage.

## Building and Testing

### Prerequisites
Expand Down
24 changes: 23 additions & 1 deletion GitVersion.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,26 @@
# See https://gitversion.net/docs/reference/configuration
workflow: GitHubFlow/v1
# Start at 1.0.0 when no version tag exists yet
next-version: 1.0.0
next-version: 0.1.23






















29 changes: 0 additions & 29 deletions RECOVERED_INPUT.md

This file was deleted.

Loading