{
	"skills": [
		{
			"name": "cryptopeer-stack",
			"group": "Start here",
			"description": "Use first in any project that builds on the cryptopeer stack (UDX, dart_libp2p and its packages, Ricochet, go-p2p-forge) to pick the right packages for a P2P task, see how Dart, Go and TypeScript peers connect, and find the detailed skill for each package.",
			"triggers": [
				"cryptopeer",
				"dart_libp2p",
				"dart_udx",
				"go-udx",
				"js-udx",
				"ricochet",
				"go-p2p-forge",
				"udx transport"
			],
			"page": "https://cryptopeer.net/skills/cryptopeer-stack/",
			"skill": "https://cryptopeer.net/skills/cryptopeer-stack/SKILL.md",
			"flat": "https://cryptopeer.net/skills/cryptopeer-stack.md"
		},
		{
			"name": "udx-dart",
			"group": "UDX transport",
			"description": "Use when writing or debugging Dart code on dart_udx (import package:dart_udx/dart_udx.dart): UDXMultiplexer, UDPSocket and UDXStream over a RawDatagramSocket, stream back-pressure, half-close, hole punching, testing with FakeClock, or interop with go-udx and js-udx over UDX wire v3.",
			"triggers": [
				"dart_udx",
				"dart-udx",
				"UDXMultiplexer",
				"UDPSocket",
				"UDXStream",
				"createOutgoing",
				"flushStreamBuffer",
				"handshakeComplete",
				"closeWrite",
				"UdxLogging",
				"FakeClock"
			],
			"page": "https://cryptopeer.net/skills/udx-dart/",
			"skill": "https://cryptopeer.net/skills/udx-dart/SKILL.md",
			"flat": "https://cryptopeer.net/skills/udx-dart.md"
		},
		{
			"name": "udx-go",
			"group": "UDX transport",
			"description": "Use when writing or debugging Go code on go-udx (import github.com/stephanfeb/go-udx, package udx): Listen, Dial, Multiplexer, Connection and Stream over UDP, stream flow control, half-close, deadlines, idle timeouts, MockClock tests, or interop with dart_udx and js-udx over UDX wire v3.",
			"triggers": [
				"go-udx",
				"github.com/stephanfeb/go-udx",
				"udx.Listen",
				"udx.Dial",
				"udx.Multiplexer",
				"NewMultiplexer",
				"AcceptStream",
				"OpenStream",
				"ErrStreamReset",
				"MaxDatagram",
				"MockClock"
			],
			"page": "https://cryptopeer.net/skills/udx-go/",
			"skill": "https://cryptopeer.net/skills/udx-go/SKILL.md",
			"flat": "https://cryptopeer.net/skills/udx-go.md"
		},
		{
			"name": "udx-js",
			"group": "UDX transport",
			"description": "Use when writing TypeScript/Node.js code on js-udx: @go-ricochet/udx (listen, dial, UdxMultiplexer, UdxConnection, UdxStream) or the js-libp2p transport @go-ricochet/libp2p-udx (udx(), /udp/<port>/udx addresses, the ./multiaddr browser entry), including back-pressure, closing, MemoryNetwork tests and interop with go-udx and dart_udx.",
			"triggers": [
				"js-udx",
				"@go-ricochet/udx",
				"@go-ricochet/libp2p-udx",
				"@stephanfeb/udx",
				"UdxMultiplexer",
				"UdxConnection",
				"UdxStream",
				"MemoryNetwork",
				"ManualClock",
				"registerUdxProtocol",
				"parseUdxMultiaddr",
				"Protocol 768 was unknown"
			],
			"page": "https://cryptopeer.net/skills/udx-js/",
			"skill": "https://cryptopeer.net/skills/udx-js/SKILL.md",
			"flat": "https://cryptopeer.net/skills/udx-js.md"
		},
		{
			"name": "go-libp2p-udx",
			"group": "UDX transport",
			"description": "Use when adding UDX to a go-libp2p host with github.com/stephanfeb/go-libp2p-udx-transport (package udxtransport): libp2p.Transport(udxtransport.NewTransport), /ip4/<ip>/udp/<port>/udx listen and dial addresses, Noise and Yamux over UDX, hole punching, and interop with dart-libp2p and js-libp2p nodes.",
			"triggers": [
				"go-libp2p-udx-transport",
				"udxtransport",
				"udxtransport.NewTransport",
				"P_UDX",
				"/udp/0/udx",
				"libp2p.Transport(NewTransport)",
				"go-libp2p udx"
			],
			"page": "https://cryptopeer.net/skills/go-libp2p-udx/",
			"skill": "https://cryptopeer.net/skills/go-libp2p-udx/SKILL.md",
			"flat": "https://cryptopeer.net/skills/go-libp2p-udx.md"
		},
		{
			"name": "dart-libp2p-host",
			"group": "dart-libp2p",
			"description": "Use when creating or configuring a dart_libp2p host in Dart (package:dart_libp2p, Libp2p.new_, Config): identity keys, UDX/TCP transports, Noise, Yamux, listen addresses, connect, peerstore, identify, ping, event bus, resource limits, shutdown, tests and go-libp2p interop.",
			"triggers": [
				"dart_libp2p",
				"Libp2p.new_",
				"BasicHost",
				"UDXTransport",
				"TCPTransport",
				"NoiseSecurity",
				"YamuxSession",
				"MultiplexerConfig",
				"ConnectionManager",
				"generateEd25519KeyPair",
				"AddrInfo",
				"PingService",
				"EvtPeerConnectednessChanged",
				"ConfigurableLimiter",
				"libp2p host"
			],
			"page": "https://cryptopeer.net/skills/dart-libp2p-host/",
			"skill": "https://cryptopeer.net/skills/dart-libp2p-host/SKILL.md",
			"flat": "https://cryptopeer.net/skills/dart-libp2p-host.md"
		},
		{
			"name": "dart-libp2p-custom-protocol",
			"group": "dart-libp2p",
			"description": "Use when writing your own libp2p protocol in Dart on a dart_libp2p host: protocol IDs, setStreamHandler, newStream, varint length-prefixed framing, P2PStream read/write, deadlines and timeouts, closeWrite vs close vs reset, versioning, request/response and long-lived streams, go-libp2p interop.",
			"triggers": [
				"setStreamHandler",
				"newStream",
				"P2PStream",
				"StreamHandler",
				"ProtocolID",
				"setStreamHandlerMatch",
				"closeWrite",
				"encodeVarint",
				"BufferedP2PStreamReader",
				"YamuxStreamTimeoutException",
				"dart_libp2p protocol"
			],
			"page": "https://cryptopeer.net/skills/dart-libp2p-custom-protocol/",
			"skill": "https://cryptopeer.net/skills/dart-libp2p-custom-protocol/SKILL.md",
			"flat": "https://cryptopeer.net/skills/dart-libp2p-custom-protocol.md"
		},
		{
			"name": "dart-libp2p-nat-relay",
			"group": "dart-libp2p",
			"description": "Use when making dart_libp2p peers reachable across NATs in Dart: running a Circuit Relay v2 relay, AutoRelay reservations, dialing via /p2p-circuit, AutoNAT v2 reachability, DCUtR hole punching over UDX, mDNS local discovery (MdnsDiscovery), Happy Eyeballs dialing, go-libp2p relay interop.",
			"triggers": [
				"p2p-circuit",
				"Circuit Relay v2",
				"Libp2p.relay",
				"Libp2p.autoRelay",
				"relayServers",
				"forceReachability",
				"AutoRelay",
				"EvtAutoRelayAddrsUpdated",
				"AmbientAutoNATv2",
				"EvtLocalReachabilityChanged",
				"HolePunchService",
				"DCUtR",
				"dcutr",
				"MdnsDiscovery",
				"MdnsNotifee",
				"hole punching"
			],
			"page": "https://cryptopeer.net/skills/dart-libp2p-nat-relay/",
			"skill": "https://cryptopeer.net/skills/dart-libp2p-nat-relay/SKILL.md",
			"flat": "https://cryptopeer.net/skills/dart-libp2p-nat-relay.md"
		},
		{
			"name": "dart-libp2p-webrtc",
			"group": "Transports for browsers and nearby devices",
			"description": "Use when a Dart or Flutter dart_libp2p host must connect directly to js-libp2p browser apps or other Dart hosts over WebRTC (/p2p-circuit/webrtc) with package:dart_libp2p_webrtc: WebRtcTransport, relay signalling, upgrade(), STUN/TURN via RtcConfig, raw data channels, the native libdatachannel build.",
			"triggers": [
				"dart_libp2p_webrtc",
				"WebRtcTransport",
				"RtcConfig",
				"RtcPeerConnection",
				"RtcDataChannel",
				"WebRtcConn",
				"webrtc-signaling",
				"/p2p-circuit/webrtc",
				"libdatachannel",
				"js-libp2p webrtc"
			],
			"page": "https://cryptopeer.net/skills/dart-libp2p-webrtc/",
			"skill": "https://cryptopeer.net/skills/dart-libp2p-webrtc/SKILL.md",
			"flat": "https://cryptopeer.net/skills/dart-libp2p-webrtc.md"
		},
		{
			"name": "dart-libp2p-ble",
			"group": "Transports for browsers and nearby devices",
			"description": "Use when a Flutter app must connect dart_libp2p hosts over Bluetooth LE without a network with package:dart_libp2p_ble: BleTransport, /ble/<token> addresses, BleDiscovery mesh and link budget, gossipsub over GATT, Android/iOS/macOS permissions, and FakeBleNetwork tests without Bluetooth.",
			"triggers": [
				"dart_libp2p_ble",
				"BleTransport",
				"BleDiscovery",
				"BluetoothLowEnergyRadio",
				"FakeBleNetwork",
				"FakeBleRadio",
				"BleConn",
				"/ble/",
				"bluetooth_low_energy",
				"libp2p bluetooth"
			],
			"page": "https://cryptopeer.net/skills/dart-libp2p-ble/",
			"skill": "https://cryptopeer.net/skills/dart-libp2p-ble/SKILL.md",
			"flat": "https://cryptopeer.net/skills/dart-libp2p-ble.md"
		},
		{
			"name": "dart-libp2p-gossipsub",
			"group": "Protocols and data",
			"description": "Use when writing Dart code that publishes or subscribes over libp2p pubsub with package dart_libp2p_pubsub (PubSub, GossipSubRouter, FloodSubRouter, RandomSubRouter): topics, message validation, peer scoring, GossipSubParams tuning, topic discovery, tracing, testing, go-libp2p-pubsub interop.",
			"triggers": [
				"dart_libp2p_pubsub",
				"GossipSubRouter",
				"GossipSubParams",
				"FloodSubRouter",
				"RandomSubRouter",
				"PubSubMessage",
				"registerTopicValidator",
				"PeerScoreParams",
				"PeerScoreThresholds",
				"meshsub",
				"gossipsub"
			],
			"page": "https://cryptopeer.net/skills/dart-libp2p-gossipsub/",
			"skill": "https://cryptopeer.net/skills/dart-libp2p-gossipsub/SKILL.md",
			"flat": "https://cryptopeer.net/skills/dart-libp2p-gossipsub.md"
		},
		{
			"name": "dart-libp2p-kad-dht",
			"group": "Protocols and data",
			"description": "Use when a dart_libp2p app needs the Kademlia DHT (package:dart_libp2p_kad_dht, IpfsDHTv2): bootstrapping, findPeer, provide / findProvidersAsync content routing, putValue / getValue signed records with namespace validators, advertise / findPeers rendezvous, client / server / auto modes, go-libp2p interop.",
			"triggers": [
				"dart_libp2p_kad_dht",
				"IpfsDHTv2",
				"IpfsDHT",
				"DHTOptions",
				"DHTMode",
				"MemoryProviderStore",
				"findProvidersAsync",
				"NamespacedValidator",
				"namespaceToCid",
				"/ipfs/kad/1.0.0",
				"kademlia dht"
			],
			"page": "https://cryptopeer.net/skills/dart-libp2p-kad-dht/",
			"skill": "https://cryptopeer.net/skills/dart-libp2p-kad-dht/SKILL.md",
			"flat": "https://cryptopeer.net/skills/dart-libp2p-kad-dht.md"
		},
		{
			"name": "dart-libp2p-bitswap",
			"group": "Protocols and data",
			"description": "Use when fetching or serving content-addressed blocks between dart_libp2p peers with package dart_libp2p_bitswap (Bitswap 1.2.0): implementing a BlockStore, getBlock / wantBlocks / cancelWants, notifyNewBlock, BitswapOptions tuning, CIDs via dcid, and testing Bitswap code.",
			"triggers": [
				"dart_libp2p_bitswap",
				"bitswap",
				"Bitswap 1.2.0",
				"/ipfs/bitswap/1.2.0",
				"BlockStore",
				"SizedBlockStore",
				"BitswapOptions",
				"getBlock",
				"wantBlocks",
				"notifyNewBlock",
				"WANT_HAVE",
				"DONT_HAVE",
				"dcid"
			],
			"page": "https://cryptopeer.net/skills/dart-libp2p-bitswap/",
			"skill": "https://cryptopeer.net/skills/dart-libp2p-bitswap/SKILL.md",
			"flat": "https://cryptopeer.net/skills/dart-libp2p-bitswap.md"
		},
		{
			"name": "merkle-crdt",
			"group": "Protocols and data",
			"description": "Use when writing Dart code against the merkledag package (import 'package:merkledag/merkledag.dart'): building a MerkleCRDT or MerkleClock, writing a CRDTPayload or using GSet, implementing DAGSyncer or Broadcaster, encoding or verifying MerkleNode bytes, or testing replicas locally. For libp2p replication use merkle-crdt-sync.",
			"triggers": [
				"merkledag",
				"MerkleCRDT",
				"MerkleClock",
				"MerkleNode",
				"CRDTPayload",
				"GSet",
				"DAGSyncer",
				"Broadcaster",
				"InvalidNodeException",
				"Merkle-CRDT",
				"merkle clock"
			],
			"page": "https://cryptopeer.net/skills/merkle-crdt/",
			"skill": "https://cryptopeer.net/skills/merkle-crdt/SKILL.md",
			"flat": "https://cryptopeer.net/skills/merkle-crdt.md"
		},
		{
			"name": "merkle-crdt-sync",
			"group": "Protocols and data",
			"description": "Use when replicating merkledag Merkle-CRDTs between dart_libp2p peers with the dart_libp2p_merkle_crdt package (import package:dart_libp2p_merkle_crdt/dart_libp2p_merkle_crdt.dart): MerkleCrdtGossipManager, GossipSubAnnouncer, P2PStreamDagFetcher, WriterAuthorizer, BlockStore, DocumentCRDT, optional DHT block lookup.",
			"triggers": [
				"dart_libp2p_merkle_crdt",
				"MerkleCrdtGossipManager",
				"GossipSubAnnouncer",
				"P2PStreamDagFetcher",
				"WriterAuthorizer",
				"InMemoryBlockStore",
				"DocumentCRDT",
				"defaultFetchProtocolId",
				"merkle-crdt/heads",
				"/merkle-crdt/fetch"
			],
			"page": "https://cryptopeer.net/skills/merkle-crdt-sync/",
			"skill": "https://cryptopeer.net/skills/merkle-crdt-sync/SKILL.md",
			"flat": "https://cryptopeer.net/skills/merkle-crdt-sync.md"
		},
		{
			"name": "ricochet-server",
			"group": "Ricochet",
			"description": "Use when building, configuring, deploying or operating the go-ricochet store-and-forward server (module github.com/stephanfeb/go-ricochet, cmd/ricochet): config.yaml keys, presets, PostgreSQL schema, transports, relay/NAT, the .deb and supervisor package, the ops HTTP surface, moderation, and its protocol IDs.",
			"triggers": [
				"go-ricochet",
				"ricochet server",
				"cmd/ricochet",
				"ricochet-server",
				"config.example.yaml",
				"RICOCHET_PG_PASSWORD",
				"RICOCHET_SEED_HEX",
				"/sf-network/submit",
				"/ricochet/store/doc",
				"ricochet-bench",
				"max_messages_per_mailbox",
				"enable_relay_service"
			],
			"page": "https://cryptopeer.net/skills/ricochet-server/",
			"skill": "https://cryptopeer.net/skills/ricochet-server/SKILL.md",
			"flat": "https://cryptopeer.net/skills/ricochet-server.md"
		},
		{
			"name": "ricochet-dart-client",
			"group": "Ricochet",
			"description": "Use when writing Dart or Flutter code against package:ricochet (ricochet-dart-client) to talk to a Ricochet server: SFClient setup on an existing dart_libp2p host, sendMessage/retrieveMessages, flags and deletes, push notifications, NaCl box encryption with PayloadEncryptor, mailboxes and ACLs, documents, feeds, collections, claim mailboxes.",
			"triggers": [
				"package:ricochet",
				"ricochet-dart-client",
				"SFClient",
				"SFClientConfig",
				"SFServerPreference",
				"PayloadEncryptor",
				"MailboxManager",
				"MailboxNotification",
				"RetrieveRefusedException",
				"claimMessage",
				"retrieveMessages"
			],
			"page": "https://cryptopeer.net/skills/ricochet-dart-client/",
			"skill": "https://cryptopeer.net/skills/ricochet-dart-client/SKILL.md",
			"flat": "https://cryptopeer.net/skills/ricochet-dart-client.md"
		},
		{
			"name": "ricochet-mailbox",
			"group": "Ricochet",
			"description": "Use when building a store-and-forward mailbox app on Ricochet (offline delivery, E2E encrypted messages, push notifications) or writing Go code against github.com/stephanfeb/go-ricochet/pkg/client and pkg/wire; based on go-ricochet/examples/mailbox. Covers server preferences and failover, acknowledging and draining, notifications, mailbox types and ACLs.",
			"triggers": [
				"examples/mailbox",
				"go-ricochet/pkg/client",
				"client.New",
				"client.ServerPreference",
				"SendMessage",
				"RetrieveMessages",
				"RetrievePage",
				"MarkDelivered",
				"RegisterNotificationHandler",
				"WithEncryption",
				"ErrMailboxFull",
				"store-and-forward mailbox"
			],
			"page": "https://cryptopeer.net/skills/ricochet-mailbox/",
			"skill": "https://cryptopeer.net/skills/ricochet-mailbox/SKILL.md",
			"flat": "https://cryptopeer.net/skills/ricochet-mailbox.md"
		},
		{
			"name": "go-p2p-forge",
			"group": "Ricochet",
			"description": "Use when building a Go libp2p service with go-p2p-forge (module github.com/stephanfeb/go-p2p-forge): forge.NewServer, middleware Pipeline and StreamContext, framed JSON codecs and buffer pools, OperationRouter, rate limiters, lifecycle services and health checks, the host and node packages, and testing handlers with forgetest.",
			"triggers": [
				"go-p2p-forge",
				"forge.NewServer",
				"forge.NewPipeline",
				"StreamContext",
				"FrameDecodeMiddleware",
				"JSONResponseWriter",
				"JSONDeserialize",
				"OperationRouter",
				"forgetest",
				"NewMockStreamWithFrame",
				"TickerService",
				"NewSingleBucket"
			],
			"page": "https://cryptopeer.net/skills/go-p2p-forge/",
			"skill": "https://cryptopeer.net/skills/go-p2p-forge/SKILL.md",
			"flat": "https://cryptopeer.net/skills/go-p2p-forge.md"
		},
		{
			"name": "cryptopeer-interop-testing",
			"group": "Across the stack",
			"description": "Use when writing or running tests that span languages or processes in the cryptopeer stack: Dart, Go and JS interop for UDX and libp2p, loopback and in-memory test hosts, Docker NAT and netem setups, browser and TURN tests, timeouts and flaky network tests, and the dart test, go test and vitest commands and CI presets of each repo.",
			"triggers": [
				"interop test",
				"interop_test.go",
				"go_interop",
				"GoProcessManager",
				"go-peer",
				"dart_test.yaml",
				"vitest",
				"UDX_BULK_PEER",
				"GO_PEER_DIR",
				"netem",
				"holepunch_network",
				"FakeBleNetwork",
				"forgetest",
				"real_net_stack"
			],
			"page": "https://cryptopeer.net/skills/cryptopeer-interop-testing/",
			"skill": "https://cryptopeer.net/skills/cryptopeer-interop-testing/SKILL.md",
			"flat": "https://cryptopeer.net/skills/cryptopeer-interop-testing.md"
		},
		{
			"name": "cryptopeer-connectivity-debugging",
			"group": "Across the stack",
			"description": "Use when cryptopeer peers do not connect or streams stall: dart_libp2p, go-libp2p with the UDX transport, js-libp2p, UDX, relays and hole punching. A decision procedure from multiaddrs through UDX version, Noise, Yamux, multistream, relay limits, NAT and the resource manager, with the loggers, env vars and tools to enable in Dart, Go and JS.",
			"triggers": [
				"peers don't connect",
				"dial timeout",
				"stream stalls",
				"PeerIdMismatchException",
				"ProtocolNotSupportedException",
				"ResourceLimitExceededException",
				"LimitedConnException",
				"GOLOG_LOG_LEVEL",
				"UdxLogging",
				"hierarchicalLoggingEnabled",
				"p2p-holepunch",
				"DCUtR fails",
				"relay reservation",
				"/udx multiaddr"
			],
			"page": "https://cryptopeer.net/skills/cryptopeer-connectivity-debugging/",
			"skill": "https://cryptopeer.net/skills/cryptopeer-connectivity-debugging/SKILL.md",
			"flat": "https://cryptopeer.net/skills/cryptopeer-connectivity-debugging.md"
		}
	]
}
