Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
171 commits
Select commit Hold shift + click to select a range
98adf81
feat(fido2): add FIDO2 application implementation
DennisDyallo Jan 27, 2026
61139b9
feat(piv): add PIV application implementation
DennisDyallo Jan 27, 2026
0b740e1
feat(piv-example): add PivTool CLI example application
DennisDyallo Jan 27, 2026
9666705
fix(piv-example): fix 5 e2e bugs found during autonomous API coverage…
DennisDyallo Apr 1, 2026
4ed7c2a
fix(piv-example): add missing newlines at end of files
DennisDyallo Apr 1, 2026
2e8d3b4
feat(piv): add session-layer DecryptAsync modelled after Python yubik…
DennisDyallo Apr 1, 2026
66e33a9
test(piv): add integration tests for DecryptAsync session-layer unpad…
DennisDyallo Apr 1, 2026
9002deb
Merge remote-tracking branch 'origin/yubikit-fido' into yubikit-fido2…
DennisDyallo Apr 1, 2026
e318c6c
feat(oath): add OATH applet implementation
DennisDyallo Apr 1, 2026
1a30c18
feat(yubiotp): add YubiOTP applet implementation
DennisDyallo Apr 1, 2026
16d71ac
feat(hsmauth): add YubiHSM Auth applet implementation
DennisDyallo Apr 1, 2026
c39cce0
feat(openpgp): add OpenPGP applet implementation
DennisDyallo Apr 1, 2026
bb5ecf7
feat(fido2): add FidoTool CLI example application
DennisDyallo Apr 1, 2026
f3ae48e
Merge branch 'yubikit-yubiotp' into yubikit-applets
DennisDyallo Apr 1, 2026
ef57ce8
Merge branch 'yubikit-hsmauth' into yubikit-applets
DennisDyallo Apr 1, 2026
58161bc
Merge branch 'yubikit-openpgp' into yubikit-applets
DennisDyallo Apr 1, 2026
1d46c2f
Merge branch 'yubikit-fido2-cli' into yubikit-applets
DennisDyallo Apr 1, 2026
0ce2a34
fix: exclude FIDO2 integration tests from solution
DennisDyallo Apr 1, 2026
b6c1a5f
fix(oath): address coding standard violations
DennisDyallo Apr 1, 2026
0513512
fix(openpgp): address coding standard violations
DennisDyallo Apr 1, 2026
c53719d
fix(hsmauth): address security and coding standard violations
DennisDyallo Apr 1, 2026
677d21f
fix(fido2): rewrite integration tests to use standard WithYubiKey inf…
DennisDyallo Apr 1, 2026
c89208d
fix(yubiotp): address coding standard violations
DennisDyallo Apr 1, 2026
bbd7fc0
refactor(oath): rewrite CLI to match ykman command structure
DennisDyallo Apr 1, 2026
ee645c9
refactor(fido2): rewrite CLI to match ykman command structure
DennisDyallo Apr 1, 2026
03df1b9
refactor(oath): rewrite CLI to match ykman command structure
DennisDyallo Apr 1, 2026
236ce99
refactor(yubiotp): rewrite CLI to match ykman command structure
DennisDyallo Apr 1, 2026
aca6ad8
refactor(openpgp): rewrite CLI to match ykman command structure
DennisDyallo Apr 1, 2026
ff1b32b
refactor(hsmauth): rewrite CLI to match ykman command structure
DennisDyallo Apr 1, 2026
bc23cc6
fix(yubiotp): fix multi-transport device selection in OtpTool
DennisDyallo Apr 1, 2026
f831b14
fix(fido2): auto-select HID FIDO transport in non-interactive CLI mode
DennisDyallo Apr 2, 2026
38fcb75
fix(core): treat firmware major version 0 as sentinel for alpha/beta …
DennisDyallo Apr 2, 2026
251b746
fix(oath): fix credential ID parsing in CalculateAllAsync
DennisDyallo Apr 2, 2026
856fd84
refactor(oath,hsmauth): normalize DeviceSelector to canonical non-int…
DennisDyallo Apr 2, 2026
66726aa
refactor(yubiotp,openpgp): normalize DeviceSelector to canonical non-…
DennisDyallo Apr 2, 2026
e76811f
fix(oath): fix static CancellationTokenSource causing inter-test canc…
DennisDyallo Apr 2, 2026
9ebc34f
fix(hsmauth): fix integration test failures and wire protocol bugs
DennisDyallo Apr 2, 2026
7dc0991
fix(core,openpgp): fix APDU configuration and test transport filter f…
DennisDyallo Apr 2, 2026
11de30e
docs: add implementation plans and GOAL.md files for agate orchestration
DennisDyallo Apr 2, 2026
8fa0707
docs: add future work items to plan
DennisDyallo Apr 2, 2026
4112711
fix(openpgp): fix 6 bugs found during integration testing
DennisDyallo Apr 2, 2026
78fd8e3
docs: document OpenPGP AttestKey alpha firmware gap in future work
DennisDyallo Apr 2, 2026
43b7328
docs: add final state document for yubikit-applets branch
DennisDyallo Apr 2, 2026
40553ae
docs: add FIDO2 user-presence validation instructions
DennisDyallo Apr 2, 2026
e8b4a73
feat(fido2): add set-pin CLI command for fresh device PIN enrollment
DennisDyallo Apr 2, 2026
4418333
docs: add FIDO2 validation results to final state
DennisDyallo Apr 2, 2026
5b599f5
fix(yubiotp): fix 3 bugs found during integration testing on alpha fi…
DennisDyallo Apr 2, 2026
9931a0a
fix(tests): add AllowUnknownSerials and pin YubiOTP tests to SmartCard
DennisDyallo Apr 2, 2026
364c8ae
docs: update final state — YubiOTP tests done, AllowUnknownSerials do…
DennisDyallo Apr 2, 2026
b80e09e
docs: add CLI shared infrastructure extraction plan (#12)
DennisDyallo Apr 2, 2026
32733e3
feat(cli): extract shared CLI infrastructure into Yubico.YubiKit.Cli.…
DennisDyallo Apr 2, 2026
e854036
docs: update plans and add handoff document
DennisDyallo Apr 2, 2026
c304038
merge: integrate yubikit-piv branch into yubikit-applets
DennisDyallo Apr 2, 2026
60d2111
fix(tests): auto-tag WithYubiKey tests and make build.cs unit-only by…
DennisDyallo Apr 2, 2026
24f1c4b
refactor(build): DRY helpers, fix GetArgument and FilterBullseyeArgs …
DennisDyallo Apr 2, 2026
904712b
refactor: restructure project folders under src/ with stripped prefixes
DennisDyallo Apr 2, 2026
eac64db
fix(tests): correct 8 pre-existing unit test failures across Core, Fi…
DennisDyallo Apr 2, 2026
bbcd2dd
feat(cli): extract InteractiveMenuBuilder and SessionHelper into Cli.…
DennisDyallo Apr 2, 2026
8801c83
fix(tests): use invalid key length in PinUvAuthProtocolV2 test
DennisDyallo Apr 2, 2026
ce945ad
docs: update handoff document for session end
DennisDyallo Apr 2, 2026
f648e03
fix(cli): use firmware-dependent touch timing in FidoTool reset
DennisDyallo Apr 2, 2026
b6f5ed0
chore(build): remove clean from restore dependency chain
DennisDyallo Apr 2, 2026
3106fff
fix(otp,oath): align flag values and defaults with ykman canonical
DennisDyallo Apr 2, 2026
bd97961
fix(build): use incremental builds and add xUnit v3 MTP filter transl…
DennisDyallo Apr 2, 2026
c303277
docs: update handoff document for session end
DennisDyallo Apr 2, 2026
358ed29
docs: update handoff document with ykman fixes and build.cs changes
DennisDyallo Apr 2, 2026
e022e78
style: codebase consistency pass — null checks, regions, timing fixes
DennisDyallo Apr 2, 2026
fbf335d
feat(build): add --smoke flag, DRY helpers, and integration test docs
DennisDyallo Apr 2, 2026
37c251e
style: modernize collection initialization to collection expressions
DennisDyallo Apr 2, 2026
2971a75
fix: remove dead CtapException stub from Core
DennisDyallo Apr 2, 2026
f47adbd
fix(openpgp): correct inverted P2 mapping in VerifyPinAsync
DennisDyallo Apr 2, 2026
99186fb
perf: remove unnecessary .ToArray() allocations on net10
DennisDyallo Apr 2, 2026
e817d3c
fix(openpgp): fix AttestKey response handling and certificate slot index
DennisDyallo Apr 2, 2026
f31cc7d
Merge branch 'style/codebase-consistency-pass' into yubikit-applets
DennisDyallo Apr 2, 2026
66b9a75
fix: use IsSupported() for firmware feature checks on alpha devices
DennisDyallo Apr 2, 2026
addf582
fix(otp): use HidOtp for HMAC-SHA1 challenge-response test
DennisDyallo Apr 2, 2026
23d610d
fix(piv): bypass .NET TripleDES weak key rejection for PIV management…
DennisDyallo Apr 2, 2026
82f8451
fix(core,openpgp,hsmauth): fix TLV parsing, algorithm info fallback, …
DennisDyallo Apr 2, 2026
1017309
ci: install pcscd and fix NuGet cache key for Linux CI
DennisDyallo Apr 2, 2026
738123a
ci,fix,chore: fix Linux CI pcscd setup, SDK graceful degradation, Nat…
DennisDyallo Apr 2, 2026
dd6ba87
docs: update handoff document for session end
DennisDyallo Apr 2, 2026
cab0c29
ci: tighten pcscd socket wait and use chmod 666 (Opus expert review)
DennisDyallo Apr 2, 2026
8dd1043
ci,fix: install libudev-dev and handle missing udev on Linux for HID …
DennisDyallo Apr 2, 2026
e58b611
security(core,fido2,piv): fix sensitive data handling across SCP, PIN…
DennisDyallo Apr 3, 2026
20d31cc
fix(fido2,openpgp,hsmauth,otp,core): fix SDK bugs discovered during i…
DennisDyallo Apr 8, 2026
f32ef63
test: add 30 integration tests covering 60 of 75 identified SDK gaps
DennisDyallo Apr 8, 2026
8bee286
fix(fido2/tests): replace reset hook with known-PIN normalization
DennisDyallo Apr 8, 2026
3c11350
fix(fido2/tests): align FidoTestData.Pin with KnownTestPinString
DennisDyallo Apr 8, 2026
966d701
fix(fido2/tests): mark ForceChangePin as RequiresUserPresence, clean …
DennisDyallo Apr 8, 2026
5511c10
docs: update handoff — FIDO2 fully verified, all 8 modules green
DennisDyallo Apr 8, 2026
c74570e
fix(cli): fix 4 bugs across PivTool, FidoTool, HsmAuthTool, Managemen…
DennisDyallo Apr 8, 2026
64b0311
feat(cli): add unified yk CLI with all 7 YubiKey applets
DennisDyallo Apr 8, 2026
47b0136
fix(cli): wire --force flag on management reset, stage all yk CLI files
DennisDyallo Apr 8, 2026
a9eaa04
docs: update progress file with E2E results and refresh handoff
DennisDyallo Apr 8, 2026
d175b78
fix(cli): map CTAP bio errors to structured exit codes
DennisDyallo Apr 8, 2026
6af5033
docs: update handoff and progress — CTAP exit codes resolved
DennisDyallo Apr 9, 2026
37e9568
Update src/Core/src/SmartCard/Scp/ScpState.cs
DennisDyallo Apr 9, 2026
f749f2a
Update src/Core/src/SmartCard/Scp/ScpState.Scp03.cs
DennisDyallo Apr 9, 2026
15396c8
security(core,fido2,piv): zero sensitive buffers and fix data leak pa…
DennisDyallo Apr 9, 2026
24a0470
security(core,oath,piv,fido2): fix buffer lifecycle and disposal patt…
DennisDyallo Apr 9, 2026
75353fd
security(fido2,openpgp,oath): replace string PIN/password APIs with R…
DennisDyallo Apr 9, 2026
3131dc7
security(cli): migrate CLI tools to ConsoleCredentialReader for PIN/p…
DennisDyallo Apr 9, 2026
b810749
refactor(credentials): move module-specific CredentialReaderOptions t…
DennisDyallo Apr 9, 2026
2d6f2b4
security: address Copilot review findings from PR #447
DennisDyallo Apr 9, 2026
efe0753
security(piv): remove .Memory.Span.ToArray() PIN/key copies in PivToo…
DennisDyallo Apr 9, 2026
b623178
security(openpgp): add IDisposable to Kdf to zero salt/hash material
DennisDyallo Apr 9, 2026
c244013
security: add grep-based security taxonomy audit script
DennisDyallo Apr 9, 2026
d04a49e
chore(skills): add workflow-security-audit skill
DennisDyallo Apr 9, 2026
41e013b
security: expand taxonomy to T12 with T10/T11/T12 from Copilot round-3
DennisDyallo Apr 9, 2026
8de98b4
security(scp): dispose ScpProcessor on auth failure, zero encrypted c…
DennisDyallo Apr 9, 2026
d121b71
security(fido2): fix T12 ownership violation in CredentialManagement.…
DennisDyallo Apr 9, 2026
e0b74f0
security: fix preparedData zeroing, add ownership docs, acknowledge b…
DennisDyallo Apr 9, 2026
e1316c7
chore: update handoff for session close — all security fixes complete
DennisDyallo Apr 9, 2026
c0429bb
security(core): convert ApduCommand from readonly record struct to se…
DennisDyallo Apr 9, 2026
51c7de8
security(core,piv): fix 7 issues from Copilot review round 3
DennisDyallo Apr 9, 2026
4f400f4
chore: update handoff — round 3 Copilot fixes complete, awaiting re-r…
DennisDyallo Apr 9, 2026
0b6938a
security(openpgp): fix Kdf buffer ownership — always clone on init
DennisDyallo Apr 10, 2026
248e7a5
tests: add cancellation token support
DennisDyallo Apr 10, 2026
331e048
misc: add ConfigureAwait(false) to async calls
DennisDyallo Apr 10, 2026
3a4f921
refactor(core): ApduCommand → readonly record struct with passthrough…
DennisDyallo Apr 10, 2026
d9901d5
docs: update CLAUDE.md for ApduCommand readonly record struct refactor
DennisDyallo Apr 10, 2026
59b629e
merge: integrate security remediation into yubikit-applets
DennisDyallo Apr 10, 2026
956bf19
docs: refresh handoff — post-merge state, security remediation complete
DennisDyallo Apr 10, 2026
7166b33
refactor(cli): migrate commands to Cli.Commands shared library
DennisDyallo Apr 10, 2026
4f73fc7
refactor(cli): remove migrated files from YkTool
DennisDyallo Apr 10, 2026
de8437d
fix(management-tests): restrict SCP and performance tests to SmartCar…
DennisDyallo Apr 10, 2026
244943d
fix(yubiopt): increase HID OTP timeout and fix test transport constra…
DennisDyallo Apr 10, 2026
b4e5f7c
fix(piv): TLV encoding bug, buffer zeroing, connection leak, dead code
DennisDyallo Apr 15, 2026
3c38d28
fix(fido2): SHA256 API, auth tag zeroing, DisposeAsync, dead code
DennisDyallo Apr 15, 2026
9ddb021
fix(oath): zero APDU secret buffer, GeneratedRegex, culture-safe parsing
DennisDyallo Apr 15, 2026
70bdf5b
fix(yubiotp): connection leak, NDEF truncation validation, cleanup
DennisDyallo Apr 15, 2026
39a04ec
fix(openpgp): DER P-521 encoding, key zeroing, pin truncation guard
DennisDyallo Apr 15, 2026
cc5303c
fix(secdomain): swapped checksum args, key zeroing, resource leaks, d…
DennisDyallo Apr 15, 2026
bca1819
fix(yubihsm): PublicKeyLength off-by-one, wrong error handler, mutabl…
DennisDyallo Apr 15, 2026
adae46d
refactor(piv): extract EnsureProtocol guard, merge crypto/parser methods
DennisDyallo Apr 15, 2026
a3fd770
refactor(fido2): fix ExtensionOutput.Decode, extract CoseKeyWriter, d…
DennisDyallo Apr 15, 2026
ae0b269
refactor(oath): immutable Credential.Id, TLV concat helper, ArrayBuff…
DennisDyallo Apr 15, 2026
f2c0781
refactor(yubiotp): extract HMAC key processing, constructor validatio…
DennisDyallo Apr 15, 2026
8a5f0fe
refactor(openpgp): fix X25519 slot bug, consolidate KeyRef switches, …
DennisDyallo Apr 15, 2026
ce2ce5b
refactor(secdomain): expand interface, extract PutEcKey helper, Membe…
DennisDyallo Apr 15, 2026
9c84190
refactor(yubihsm): extract retry handler, transmit pattern, immutable…
DennisDyallo Apr 15, 2026
25ad4b8
feat(core): add BerLength utility, ExtractRetryCount, EnsureReady
DennisDyallo Apr 15, 2026
d5a3db4
fix: connection leak in 6 modules' CreateSessionAsync methods
DennisDyallo Apr 15, 2026
ade7d8a
refactor: use Core BerLength and ExtractRetryCount utilities
DennisDyallo Apr 15, 2026
f8a0339
fix(core): remove unused EnsureReady from ApplicationSession
DennisDyallo Apr 15, 2026
81ea261
fix(piv): DES zeroing, BER lengths, retry extraction, ArrayBufferWriter
DennisDyallo Apr 15, 2026
892a2d5
fix(fido2): LargeBlob CBOR parse bug, extract Encapsulate ECDH helper
DennisDyallo Apr 15, 2026
c0acfeb
fix(oath): CredentialData IDisposable, ValidateAsync/SetKeyAsync API …
DennisDyallo Apr 15, 2026
380bef0
fix(yubiotp): strict access code validation, cancellation exception f…
DennisDyallo Apr 15, 2026
3b5f280
fix(openpgp): hash zeroing, Kdf disposal chain, BerLength for ASN.1 I…
DennisDyallo Apr 15, 2026
b996c6e
fix(secdomain): Tlv disposal, bounds check, remove caller key mutatio…
DennisDyallo Apr 15, 2026
a2edc0c
feat(core): add TlvHelper.EncodeAndDisposeList for safe Tlv lifecycle
DennisDyallo Apr 15, 2026
b74c0dc
fix(yubihsm): dispose Tlv objects via EncodeAndDisposeList (10 sites)
DennisDyallo Apr 15, 2026
d6113c8
fix(piv): dispose Tlv objects in parse methods (5 sites)
DennisDyallo Apr 15, 2026
1af1581
Merge branch 'yubikey-codeaudit' of github.com:Yubico/Yubico.NET.SDK …
DennisDyallo Apr 15, 2026
52d9450
refactor(piv): split CryptoBlock into EncryptBlock/DecryptBlock with …
DennisDyallo Apr 15, 2026
fb216d3
docs: add TODO backlog work plan, stage 4 plan, update handoff
DennisDyallo Apr 15, 2026
9421ddb
Merge branch 'yubikey-codeaudit' of github.com:Yubico/Yubico.NET.SDK …
DennisDyallo Apr 15, 2026
24db19c
fix(piv): clone ModPow result before zeroing BigInteger allocation
DennisDyallo Apr 15, 2026
01e4b99
test(fido2): standardize RequiresUserPresence trait to TestCategories…
DennisDyallo Apr 15, 2026
c4c591b
fix(core,fido2): HID DeviceId collision and CTAP2.0 PIN token fallback
DennisDyallo Apr 15, 2026
16c0c27
fix(fido2): ChangePin test uses KnownTestPin instead of hardcoded PIN
DennisDyallo Apr 16, 2026
34171ea
test(fido2): fix AuthenticatorConfig tests for idempotent, self-heali…
DennisDyallo Apr 16, 2026
3b76ca2
refactor(oath): replace ConcatTlvs with collection spread and add Zer…
DennisDyallo Apr 16, 2026
150133d
Merge pull request #455 from Yubico/yubikey-codeaudit
DennisDyallo Apr 18, 2026
3fcf5a4
test(fido2): fix unit tests broken by production code updates
DennisDyallo Apr 20, 2026
8325527
ci: publish 2.0 preview packages to GitHub Packages on push
DennisDyallo Apr 20, 2026
2aa9c06
ci: upgrade GitHub Actions to v5 (Node.js 24)
DennisDyallo Apr 20, 2026
e48dbd6
test(core): fix xUnit1031 and xUnit2031 analyzer warnings
DennisDyallo Apr 20, 2026
594dd84
chore: rename build.cs → toolchain.cs and add publish-remote target
DennisDyallo Apr 20, 2026
b76b614
refactor(toolchain): fix all CodeAudit findings and harden secret han…
DennisDyallo Apr 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
24 changes: 12 additions & 12 deletions .claude/agents/ralph-loop.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ Execute complex, multi-step engineering tasks autonomously by:

```bash
# ✅ CORRECT - Always use build script
dotnet build.cs build # Build entire solution
dotnet build.cs build --project Piv # Build specific project (partial match)
dotnet build.cs build --clean # Clean rebuild
dotnet toolchain.cs build # Build entire solution
dotnet toolchain.cs build --project Piv # Build specific project (partial match)
dotnet toolchain.cs build --clean # Clean rebuild

# ❌ WRONG - Never use directly
dotnet build # FORBIDDEN
Expand All @@ -56,12 +56,12 @@ dotnet restore # FORBIDDEN

```bash
# ✅ CORRECT - Handles xUnit v2/v3 automatically
dotnet build.cs test # All tests
dotnet build.cs test --project Fido2 # Module tests (partial match)
dotnet build.cs test --filter "FullyQualifiedName~MyTest" # Filter by full name
dotnet build.cs test --filter "Name=ExactMethodName" # Exact method match
dotnet build.cs test --filter "ClassName~Integration" # Filter by class name
dotnet build.cs test --project Piv --filter "Method~Sign" # Combine project + filter
dotnet toolchain.cs test # All tests
dotnet toolchain.cs test --project Fido2 # Module tests (partial match)
dotnet toolchain.cs test --filter "FullyQualifiedName~MyTest" # Filter by full name
dotnet toolchain.cs test --filter "Name=ExactMethodName" # Exact method match
dotnet toolchain.cs test --filter "ClassName~Integration" # Filter by class name
dotnet toolchain.cs test --project Piv --filter "Method~Sign" # Combine project + filter

# ❌ WRONG - Fails on xUnit v3 projects
dotnet test # FORBIDDEN
Expand Down Expand Up @@ -182,12 +182,12 @@ Load skills when encountering specific situations:

### Build Failures
```bash
dotnet build.cs build --clean
dotnet toolchain.cs build --clean
```

### Test Failures
```bash
dotnet build.cs test --filter "FullyQualifiedName~FailingTest"
dotnet toolchain.cs test --filter "FullyQualifiedName~FailingTest"
```

### Stuck
Expand All @@ -199,7 +199,7 @@ dotnet build.cs test --filter "FullyQualifiedName~FailingTest"

## Completion Protocol

1. Run `dotnet build.cs build && dotnet build.cs test`
1. Run `dotnet toolchain.cs build && dotnet toolchain.cs test`
2. Verify all tasks `[x]`
3. Output `<promise>DONE</promise>`

Expand Down
8 changes: 4 additions & 4 deletions .claude/skills/agent-dispatch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ Good agent prompts are:
BEFORE STARTING: Read CLAUDE.md and review available skills in .claude/skills/

MANDATORY SKILLS (use these - NEVER use direct commands):
- build-project: Use `dotnet build.cs build` - NEVER `dotnet build`
- test-project: Use `dotnet build.cs test` - NEVER `dotnet test`
- build-project: Use `dotnet toolchain.cs build` - NEVER `dotnet build`
- test-project: Use `dotnet toolchain.cs test` - NEVER `dotnet test`
- commit: Follow commit guidelines - NEVER use `git add .`
```

Expand All @@ -89,8 +89,8 @@ MANDATORY SKILLS (use these - NEVER use direct commands):
BEFORE STARTING: Read CLAUDE.md and review available skills in .claude/skills/

MANDATORY SKILLS:
- build-project: Use `dotnet build.cs build` - NEVER `dotnet build`
- test-project: Use `dotnet build.cs test` - NEVER `dotnet test`
- build-project: Use `dotnet toolchain.cs build` - NEVER `dotnet build`
- test-project: Use `dotnet toolchain.cs test` - NEVER `dotnet test`

Fix the 3 failing tests in src/agents/agent-tool-abort.test.ts:

Expand Down
12 changes: 6 additions & 6 deletions .claude/skills/agent-ralph-loop/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,11 @@ When the engine detects a progress file, it injects these instructions automatic

```
1. RED: Write failing test asserting the task's behavior
Run: `dotnet build.cs test --filter "FullyQualifiedName~{TestClass}"`
Run: `dotnet toolchain.cs test --filter "FullyQualifiedName~{TestClass}"`
Expect: FAILURE

2. GREEN: Write minimal code to pass
Run: `dotnet build.cs test --filter "FullyQualifiedName~{TestClass}"`
Run: `dotnet toolchain.cs test --filter "FullyQualifiedName~{TestClass}"`
Expect: SUCCESS

3. REFACTOR: Clean up, check security, add docs
Expand All @@ -145,9 +145,9 @@ When the engine detects a progress file, it injects these instructions automatic

| Action | Command |
|--------|---------|
| Build | `dotnet build.cs build` |
| Test | `dotnet build.cs test` |
| Test filtered | `dotnet build.cs test --filter "..."` |
| Build | `dotnet toolchain.cs build` |
| Test | `dotnet toolchain.cs test` |
| Test filtered | `dotnet toolchain.cs test --filter "..."` |

**NEVER use `dotnet build` or `dotnet test` directly** - they fail on mixed xUnit v2/v3.

Expand Down Expand Up @@ -246,7 +246,7 @@ bun .claude/skills/agent-ralph-loop/ralph-loop.ts \

```bash
bun .claude/skills/agent-ralph-loop/ralph-loop.ts \
"Run 'dotnet build.cs test'. Analyze failures. Fix code. Repeat until passing." \
"Run 'dotnet toolchain.cs test'. Analyze failures. Fix code. Repeat until passing." \
--completion-promise "TESTS_PASSED" \
--max-iterations 12 \
--model claude-sonnet-4.5
Expand Down
6 changes: 3 additions & 3 deletions .claude/skills/agent-ralph-loop/ralph-loop-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,8 +177,8 @@ export function formatProgressContext(state: ProgressFileState): string {
All tasks complete! Verify everything passes, then output the completion promise.

Final verification:
1. Run: \`dotnet build.cs build\` - must exit 0
2. Run: \`dotnet build.cs test\` - all tests must pass
1. Run: \`dotnet toolchain.cs build\` - must exit 0
2. Run: \`dotnet toolchain.cs test\` - all tests must pass
3. Check: No regressions in existing tests
`;
}
Expand Down Expand Up @@ -255,7 +255,7 @@ SKILL RULES:
- BEFORE any build/test/commit action, check if a skill covers it
- Use \`skill invoke <name>\` or follow skill instructions
- Mandatory skills MUST be used - direct commands (dotnet build, dotnet test, git add .) are FORBIDDEN
- This repo has mixed xUnit v2/v3 - ONLY use \`dotnet build.cs test\`, never \`dotnet test\`
- This repo has mixed xUnit v2/v3 - ONLY use \`dotnet toolchain.cs test\`, never \`dotnet test\`
`;
}

Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/agent-ralph-loop/ralph-loop.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ feature: Test
const result = formatProgressContext(state);

expect(result).toContain("All tasks complete!");
expect(result).toContain("dotnet build.cs build");
expect(result).toContain("dotnet toolchain.cs build");
});

test("shows remaining tasks in phase", () => {
Expand Down
10 changes: 5 additions & 5 deletions .claude/skills/agent-ralph-loop/ralph-loop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,11 +143,11 @@ You are executing a task from a progress file. Follow this protocol for EVERY ta

## TDD Loop
1. **RED:** Write a failing test that asserts the task's expected behavior
- Run: \`dotnet build.cs test --filter "FullyQualifiedName~{TestClass}"\`
- Run: \`dotnet toolchain.cs test --filter "FullyQualifiedName~{TestClass}"\`
- Expect: FAILURE (test must fail first to prove it tests something)

2. **GREEN:** Write minimal code to make the test pass
- Run: \`dotnet build.cs test --filter "FullyQualifiedName~{TestClass}"\`
- Run: \`dotnet toolchain.cs test --filter "FullyQualifiedName~{TestClass}"\`
- Expect: SUCCESS

3. **REFACTOR:** Clean up code, verify security, add XML docs if public API
Expand All @@ -166,9 +166,9 @@ You are executing a task from a progress file. Follow this protocol for EVERY ta
- [ ] Input validation for lengths and ranges

## Build Commands (MANDATORY - never use raw dotnet commands)
- Build: \`dotnet build.cs build\`
- Test: \`dotnet build.cs test\`
- Test filtered: \`dotnet build.cs test --filter "..."\`
- Build: \`dotnet toolchain.cs build\`
- Test: \`dotnet toolchain.cs test\`
- Test filtered: \`dotnet toolchain.cs test --filter "..."\`

**CRITICAL - xUnit v2/v3 MIXED CODEBASE:**
This repo uses BOTH xUnit v2 and v3 test projects with different CLI requirements:
Expand Down
42 changes: 21 additions & 21 deletions .claude/skills/agent-ralph-prompt/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ The prompt may contain completion promises as instructions (e.g., "output `<prom
- Example (good):
```markdown
## Verification Requirements (MUST PASS BEFORE COMPLETION)
1. Build: `dotnet build.cs build` (must exit 0)
2. Test: `dotnet build.cs test` (all tests must pass)
1. Build: `dotnet toolchain.cs build` (must exit 0)
2. Test: `dotnet toolchain.cs test` (all tests must pass)
3. No regressions: existing tests pass, new code covered
Only after ALL pass, output <promise>DONE</promise>.
If any fail, fix and re-verify.
Expand Down Expand Up @@ -108,9 +108,9 @@ git commit -m "refactor(piv): replace manual TLV parsing with Tlv/TlvHelper
- Example:
| Action | Command |
|--------|---------|
| Build | `dotnet build.cs build` |
| Test | `dotnet build.cs test` |
| Coverage | `dotnet build.cs coverage` |
| Build | `dotnet toolchain.cs build` |
| Test | `dotnet toolchain.cs test` |
| Coverage | `dotnet toolchain.cs coverage` |

### 3a. Using Directives First (Before Refactoring)

Expand Down Expand Up @@ -227,19 +227,19 @@ If a test requires:
```markdown
## Phase 1: Create interfaces
Files: IFoo.cs, IBar.cs
Verify: `dotnet build.cs build`
Verify: `dotnet toolchain.cs build`
Commit: "feat(core): add IFoo and IBar interfaces"
→ Output <promise>PHASE_1_DONE</promise>

## Phase 2: Implement classes
Files: Foo.cs, Bar.cs
Verify: `dotnet build.cs build`
Verify: `dotnet toolchain.cs build`
Commit: "feat(core): implement Foo and Bar"
→ Output <promise>PHASE_2_DONE</promise>

## Phase 3: Add tests
Files: FooTests.cs, BarTests.cs
Verify: `dotnet build.cs test`
Verify: `dotnet toolchain.cs test`
Commit: "test(core): add Foo and Bar tests"
→ Output <promise>ALL_DONE</promise>
```
Expand Down Expand Up @@ -267,14 +267,14 @@ If a test requires:
- Include complete test code (no placeholders)

**Step 2: Run test to confirm failure**
Run: `dotnet build.cs test --filter "FullyQualifiedName~TestName"`
Run: `dotnet toolchain.cs test --filter "FullyQualifiedName~TestName"`
Expected: FAIL (describe expected failure)

**Step 3: Minimal implementation**
- Include complete implementation code

**Step 4: Re-run test to confirm pass**
Run: `dotnet build.cs test --filter "FullyQualifiedName~TestName"`
Run: `dotnet toolchain.cs test --filter "FullyQualifiedName~TestName"`
Expected: PASS

**Step 5: Commit**
Expand All @@ -287,8 +287,8 @@ git commit -m "feat: <message>"

## Verification Requirements (MUST PASS BEFORE COMPLETION)

1. Build: `dotnet build.cs build` (must exit 0)
2. Test: `dotnet build.cs test` (all tests must pass)
1. Build: `dotnet toolchain.cs build` (must exit 0)
2. Test: `dotnet toolchain.cs test` (all tests must pass)
3. No regressions: existing tests pass, new code covered

Only after ALL pass, output <promise>{COMPLETION_PROMISE}</promise>.
Expand Down Expand Up @@ -463,7 +463,7 @@ The final phase must include explicit verification steps:
Before delivering completion promise:

1. **Build Verification**
Run: `dotnet build.cs build`
Run: `dotnet toolchain.cs build`
Must: Exit 0 with no errors

2. **Coverage Check** (for documentation tasks)
Expand All @@ -490,12 +490,12 @@ Before starting work, capture baseline build errors to distinguish pre-existing

Run BEFORE making any changes:
```bash
dotnet build.cs build 2>&1 | grep -E "error (CS|MSB)" | sort > /tmp/baseline-errors.txt || true
dotnet toolchain.cs build 2>&1 | grep -E "error (CS|MSB)" | sort > /tmp/baseline-errors.txt || true
```

After each phase, compare:
```bash
dotnet build.cs build 2>&1 | grep -E "error (CS|MSB)" | sort > /tmp/current-errors.txt || true
dotnet toolchain.cs build 2>&1 | grep -E "error (CS|MSB)" | sort > /tmp/current-errors.txt || true
NEW_ERRORS=$(comm -13 /tmp/baseline-errors.txt /tmp/current-errors.txt)
if [ -n "$NEW_ERRORS" ]; then
echo "⚠️ NEW BUILD ERRORS (fix before proceeding):"
Expand Down Expand Up @@ -657,7 +657,7 @@ For each API signature change:

3. **Build after each batch:**
```bash
dotnet build.cs build
dotnet toolchain.cs build
```

4. **Verify no remaining references:**
Expand Down Expand Up @@ -747,10 +747,10 @@ Each phase MUST end with explicit verification commands—not just "verify build
Run these commands and verify expected results:
```bash
# Build must succeed
dotnet build.cs build # Must exit 0
dotnet toolchain.cs build # Must exit 0

# Run unit tests (hardware tests may fail - document expected failures)
dotnet build.cs test -- --filter "Category!=Integration" # Unit tests must pass
dotnet toolchain.cs test -- --filter "Category!=Integration" # Unit tests must pass

# Verify expected file changes
grep -rn "NewClass" src/ # Should find 3 files
Expand Down Expand Up @@ -799,13 +799,13 @@ For complex refactors (3+ phases), use this proven structure:

- [ ] N.X-2: **Build verification**
```bash
dotnet build.cs build
dotnet toolchain.cs build
```
Must exit 0.

- [ ] N.X-1: **Test verification**
```bash
dotnet build.cs test --filter "FullyQualifiedName~Module"
dotnet toolchain.cs test --filter "FullyQualifiedName~Module"
```
All tests must pass.

Expand All @@ -824,7 +824,7 @@ For complex refactors (3+ phases), use this proven structure:
## Anti-Patterns to Avoid
- Vague completion criteria ("when finished")
- Missing test requirement ("when code compiles")
- Wrong commands (`dotnet test` instead of `dotnet build.cs test`)
- Wrong commands (`dotnet test` instead of `dotnet toolchain.cs test`)
- No failure guidance
- Using `git add .` or `git add -A` blindly
- **Cramming multiple phases into one iteration** (causes context rot)
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/agent-ralph-prompt/WORKFLOW.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@
│ write-ralph-prompt│ │ build-project │ │ test-project │
│ │ │ │ │ │
│ Guidance for │ │ MANDATORY │ │ MANDATORY │
│ ad-hoc prompts │ │ dotnet build.cs │ │ dotnet build.cs │
│ ad-hoc prompts │ │ dotnet toolchain.cs │ │ dotnet toolchain.cs │
│ (when no progress │ │ build │ │ test │
│ file needed) │ │ │ │ │
└───────────────────┘ └───────────────────┘ └───────────────────┘
Expand Down
8 changes: 4 additions & 4 deletions .claude/skills/agent-subagent/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ Execute plan by dispatching fresh subagent per task, with two-stage review after
BEFORE STARTING: Read CLAUDE.md and review .claude/skills/

MANDATORY SKILLS (use these - NEVER use direct commands):
- build-project: `dotnet build.cs build` - NEVER `dotnet build`
- test-project: `dotnet build.cs test` - NEVER `dotnet test`
- build-project: `dotnet toolchain.cs build` - NEVER `dotnet build`
- test-project: `dotnet toolchain.cs test` - NEVER `dotnet test`
- commit: Follow guidelines - NEVER `git add .`
```

Expand All @@ -61,8 +61,8 @@ Use Task tool with agent_type: "general-purpose":
BEFORE STARTING: Read CLAUDE.md and review .claude/skills/

MANDATORY SKILLS:
- build-project: `dotnet build.cs build` - NEVER `dotnet build`
- test-project: `dotnet build.cs test` - NEVER `dotnet test`
- build-project: `dotnet toolchain.cs build` - NEVER `dotnet build`
- test-project: `dotnet toolchain.cs test` - NEVER `dotnet test`
- commit: Follow guidelines - NEVER `git add .`

You are implementing Task N: [task name]
Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/docs-write-skill/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ The `description` field in frontmatter is **critical** - it's what triggers skil
| ❌ Weak | ✅ Strong |
|---------|-----------|
| `Helps with testing` | `Use when implementing features - write failing test first, then minimal code to pass` |
| `Build tool` | `Use when compiling, testing, or packaging .NET code - runs build.cs targets (NEVER use dotnet test directly)` |
| `Build tool` | `Use when compiling, testing, or packaging .NET code - runs toolchain.cs targets (NEVER use dotnet test directly)` |
| `For debugging` | `Use when encountering bugs, test failures, or unexpected behavior - systematic root cause analysis before fixes` |

**Rules:**
Expand Down Expand Up @@ -168,7 +168,7 @@ Use numbered steps for sequential processes, subsections for parallel concerns.
## Core Build Command

```bash
dotnet build.cs [target] [options]
dotnet toolchain.cs [target] [options]
```

## Available Targets
Expand Down
Loading
Loading