WizardConnect/CLAUDE.md
Dagur Valberg Johannsson 45fd9f4cb5
Add 'react' package with QR code and modal dialog
Makes it easier for dapp developers to integrate WizardConnect and have
consistent user interface for it across dapps.
2026-03-18 16:34:41 +01:00

3.7 KiB

wizardconnect

Relay-based protocol library for connecting dapps to HD wallets over WebSocket (Nostr NIP-17 gift-wrapped messages).

Testing philosophy

Tests are more important than the code itself. A correct implementation that lacks tests is worse than a slightly imperfect implementation that is well-tested, because untested code will silently break and the breakage will only surface in production — often as subtle protocol bugs that are hard to reproduce.

This codebase communicates over a live relay with timing-sensitive handshakes and stateful reconnection logic. These bugs cannot be caught by reading the code. They only appear in integration tests that exercise the real relay.

Always write tests before or alongside any non-trivial change. If you add a feature, add a test. If you fix a bug, add a regression test that would have caught it.

Test types

Unit tests (npm test in a package):

  • Fast, no network, run on every change
  • Test individual functions and classes in isolation
  • Use vitest, mock external deps
  • Should cover all edge cases in pure logic (state managers, message builders, URI encoding, etc.)

Integration tests (npm run test:integration in a package):

  • Hit the real relay at wss://relay.cauldron.quest:443
  • Test the full protocol handshake end-to-end
  • Located in src/__tests__/*.integration.test.ts
  • Run with generous timeouts (60s per test) via vitest.integration.config.ts
  • Must pass before any release

Running tests

# All packages, unit tests only (fast):
npm run test

# Wallet package integration tests (requires network):
cd packages/wallet && npm run test:integration

# Custom relay:
TEST_RELAY_URL=wss://your-relay:443 npm run test:integration

Test CLI (manual/exploratory testing)

# Start a dapp session and watch the protocol:
npm run dapp

# Connect a test wallet to a dapp URI:
npm run wallet -- --uri wiz://...

# Test the approval flow:
npm run dapp -- --sign

The test CLI (packages/test-cli/) is not a substitute for automated tests — it is a debugging tool.

Documentation

Protocol and architecture documentation lives in docs/. Keep it up to date when making changes:

File Update when…
docs/protocol.md Protocol messages, handshake logic, or PathName/PathXpub/NextIndex types change
docs/connection-uri.md URI format, key exchange flow, or credential structure changes
docs/transport.md RelayClient, initiateRelay, reconnect logic, or encryption scheme changes
docs/wallet.md WalletAdapter, WalletConnectionManager, or connection lifecycle changes
docs/dapp.md DappConnectionManager API or session lifecycle changes
docs/react.md React components, hooks, or QR dialog API changes
docs/pubkey-derivation.md xpub delivery, DappPubkeyStateManager, or gap-fill logic changes
docs/xpub-sharing.md xpub sharing rationale, security model, or comparison with other protocols changes
docs/index.md New top-level docs files are added

Packages

  • @wizardconnect/core — transport + protocol primitives (relay client, key exchange, hdwalletv1 message types)
  • @wizardconnect/dapp — dapp-side helpers (DappConnectionManager, DappPubkeyStateManager)
  • @wizardconnect/wallet — wallet-side helpers (WalletConnectionManager, WalletAdapter, PubkeyStateManager)
  • @wizardconnect/react — React components and hooks (WizardConnectQRDialog, AlphanumericQRCode, useWizardConnect)
  • @wizardconnect/test-cli — manual test CLI (dapp and wallet modes)

Build

npm install
npm run build        # builds all packages in dependency order

Packages must be built before integration tests run (tests import from dist/).