paytaca-cli 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +23 -5
  2. package/dist/commands/chat.d.ts +3 -0
  3. package/dist/commands/chat.d.ts.map +1 -0
  4. package/dist/commands/chat.js +592 -0
  5. package/dist/commands/chat.js.map +1 -0
  6. package/dist/index.js +2 -4
  7. package/dist/index.js.map +1 -1
  8. package/dist/nostr/chat.d.ts +42 -0
  9. package/dist/nostr/chat.d.ts.map +1 -0
  10. package/dist/nostr/chat.js +72 -0
  11. package/dist/nostr/chat.js.map +1 -0
  12. package/dist/nostr/chat.test.d.ts +2 -0
  13. package/dist/nostr/chat.test.d.ts.map +1 -0
  14. package/dist/nostr/chat.test.js +121 -0
  15. package/dist/nostr/chat.test.js.map +1 -0
  16. package/dist/nostr/keys.d.ts +8 -0
  17. package/dist/nostr/keys.d.ts.map +1 -0
  18. package/dist/nostr/keys.js +22 -0
  19. package/dist/nostr/keys.js.map +1 -0
  20. package/dist/nostr/relay.d.ts +47 -0
  21. package/dist/nostr/relay.d.ts.map +1 -0
  22. package/dist/nostr/relay.js +370 -0
  23. package/dist/nostr/relay.js.map +1 -0
  24. package/dist/nostr/store.d.ts +75 -0
  25. package/dist/nostr/store.d.ts.map +1 -0
  26. package/dist/nostr/store.js +410 -0
  27. package/dist/nostr/store.js.map +1 -0
  28. package/dist/nostr/store.test.d.ts +2 -0
  29. package/dist/nostr/store.test.d.ts.map +1 -0
  30. package/dist/nostr/store.test.js +448 -0
  31. package/dist/nostr/store.test.js.map +1 -0
  32. package/package.json +2 -1
  33. package/skills/README.md +68 -0
  34. package/skills/paytaca-send/SKILL.md +159 -0
  35. package/skills/paytaca-wallet/SKILL.md +155 -0
  36. package/dist/commands/claude.d.ts +0 -9
  37. package/dist/commands/claude.d.ts.map +0 -1
  38. package/dist/commands/claude.js +0 -20
  39. package/dist/commands/claude.js.map +0 -1
  40. package/dist/commands/opencode.d.ts +0 -9
  41. package/dist/commands/opencode.d.ts.map +0 -1
  42. package/dist/commands/opencode.js +0 -20
  43. package/dist/commands/opencode.js.map +0 -1
  44. package/dist/utils/skill.d.ts +0 -17
  45. package/dist/utils/skill.d.ts.map +0 -1
  46. package/dist/utils/skill.js +0 -100
  47. package/dist/utils/skill.js.map +0 -1
  48. /package/skills/{paytaca → paytaca-x402}/SKILL.md +0 -0
@@ -0,0 +1,448 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ const memFs = new Map();
3
+ vi.mock('fs', () => ({
4
+ existsSync: vi.fn((p) => memFs.has(p)),
5
+ mkdirSync: vi.fn(),
6
+ readFileSync: vi.fn((p) => memFs.get(p)),
7
+ writeFileSync: vi.fn((p, data) => { memFs.set(p, data); }),
8
+ }));
9
+ vi.mock('os', () => ({
10
+ homedir: vi.fn(() => '/Users/joemartaganna'),
11
+ }));
12
+ import * as fs from 'fs';
13
+ const mockPubKey = 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2';
14
+ const mockPrivKey = '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f';
15
+ const mockKeys = {
16
+ privKeyHex: mockPrivKey,
17
+ pubKeyHex: mockPubKey,
18
+ npub: 'npub1test',
19
+ nsec: 'nsec1test',
20
+ };
21
+ vi.mock('./keys.js', () => ({
22
+ deriveNostrKeys: vi.fn(() => mockKeys),
23
+ }));
24
+ const mockPublish = vi.fn();
25
+ const mockFetchHistoricalGiftWraps = vi.fn();
26
+ const mockSubscribeGiftWraps = vi.fn();
27
+ const mockFetchDisplayName = vi.fn();
28
+ const mockFetchBchAddress = vi.fn();
29
+ const mockFetchKind10050 = vi.fn();
30
+ const mockSetAuthKey = vi.fn();
31
+ const mockIsSubscribed = vi.fn(() => false);
32
+ const mockDisconnect = vi.fn();
33
+ const mockCleanup = vi.fn();
34
+ vi.mock('./relay.js', () => ({
35
+ relayService: {
36
+ publish: mockPublish,
37
+ fetchHistoricalGiftWraps: mockFetchHistoricalGiftWraps,
38
+ subscribeGiftWraps: mockSubscribeGiftWraps,
39
+ fetchDisplayName: mockFetchDisplayName,
40
+ fetchBchAddress: mockFetchBchAddress,
41
+ fetchKind10050: mockFetchKind10050,
42
+ setAuthKey: mockSetAuthKey,
43
+ isSubscribed: mockIsSubscribed,
44
+ disconnect: mockDisconnect,
45
+ cleanup: mockCleanup,
46
+ },
47
+ }));
48
+ vi.mock('./chat.js', async (importOriginal) => {
49
+ const actual = await importOriginal();
50
+ return {
51
+ ...actual,
52
+ createNip17GiftWraps: vi.fn(),
53
+ };
54
+ });
55
+ const { ChatStore } = await import('./store.js');
56
+ const chatModule = await import('./chat.js');
57
+ const bobPub = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';
58
+ const alicePub = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
59
+ describe('ChatStore', () => {
60
+ let store;
61
+ beforeEach(() => {
62
+ memFs.clear();
63
+ vi.clearAllMocks();
64
+ store = new ChatStore();
65
+ });
66
+ describe('constructor / loadPersistedData', () => {
67
+ it('should start with empty state when no persisted file exists', () => {
68
+ expect(store.contacts).toEqual([]);
69
+ expect(store.rooms).toEqual([]);
70
+ expect(store.messages).toEqual({});
71
+ expect(store.sentMessages).toEqual({});
72
+ expect(store.readMessageIds).toEqual({});
73
+ expect(store.displayNameCache).toEqual({});
74
+ expect(store.bchAddressCache).toEqual({});
75
+ });
76
+ it('should load persisted state from file', () => {
77
+ memFs.set('/Users/joemartaganna/.paytaca', '');
78
+ memFs.set('/Users/joemartaganna/.paytaca/chat-state.json', JSON.stringify({
79
+ contacts: [{ name: 'Alice', npub: 'npub1alice', pubKeyHex: bobPub, addedAt: 100 }],
80
+ displayNameCache: { bb: 'Bob' },
81
+ bchAddressCache: { cc: 'bitcoincash:abc' },
82
+ readMessageIds: { room1: { msg1: true } },
83
+ sentMessages: { room1: [{ id: 'm1', content: 'hi', sender: 'me', created_at: 200 }] },
84
+ }));
85
+ const s = new ChatStore();
86
+ expect(s.contacts).toHaveLength(1);
87
+ expect(s.contacts[0].name).toBe('Alice');
88
+ expect(s.displayNameCache).toEqual({ bb: 'Bob' });
89
+ expect(s.bchAddressCache).toEqual({ cc: 'bitcoincash:abc' });
90
+ expect(s.readMessageIds).toEqual({ room1: { msg1: true } });
91
+ });
92
+ it('should merge sent messages into messages in-memory', () => {
93
+ memFs.set('/Users/joemartaganna/.paytaca', '');
94
+ memFs.set('/Users/joemartaganna/.paytaca/chat-state.json', JSON.stringify({
95
+ contacts: [],
96
+ displayNameCache: {},
97
+ bchAddressCache: {},
98
+ readMessageIds: {},
99
+ sentMessages: {
100
+ room1: [{ id: 'm1', content: 'hello', sender: 'me', created_at: 100 }],
101
+ },
102
+ }));
103
+ const s = new ChatStore();
104
+ expect(s.messages.room1).toHaveLength(1);
105
+ expect(s.messages.room1[0].content).toBe('hello');
106
+ });
107
+ });
108
+ describe('saveState', () => {
109
+ it('should persist current state to file', () => {
110
+ store.contacts.push({ name: 'Test', npub: 'npub1test', pubKeyHex: bobPub, addedAt: 1 });
111
+ store.saveState();
112
+ expect(fs.writeFileSync).toHaveBeenCalled();
113
+ const written = fs.writeFileSync.mock.calls[0][1];
114
+ const parsed = JSON.parse(written);
115
+ expect(parsed.contacts).toHaveLength(1);
116
+ expect(parsed.contacts[0].name).toBe('Test');
117
+ });
118
+ });
119
+ describe('initialize', () => {
120
+ it('should derive keys, set auth key, publish kind10050, fetch historical', async () => {
121
+ mockPublish.mockResolvedValue({ accepted: [], errors: [] });
122
+ mockFetchHistoricalGiftWraps.mockResolvedValue(undefined);
123
+ await store.initialize('test mnemonic');
124
+ expect(store.keys).toBe(mockKeys);
125
+ expect(mockSetAuthKey).toHaveBeenCalledWith(mockKeys.privKeyHex);
126
+ expect(mockPublish).toHaveBeenCalled();
127
+ expect(mockFetchHistoricalGiftWraps).toHaveBeenCalledWith(['wss://relay.paytaca.com'], mockKeys.pubKeyHex, expect.any(Object));
128
+ expect(store.initialized).toBe(true);
129
+ });
130
+ it('should handle errors gracefully', async () => {
131
+ mockPublish.mockRejectedValue(new Error('publish fail'));
132
+ mockFetchHistoricalGiftWraps.mockRejectedValue(new Error('fetch fail'));
133
+ await store.initialize('test mnemonic');
134
+ expect(store.initialized).toBe(true);
135
+ });
136
+ });
137
+ describe('receiveMessage', () => {
138
+ beforeEach(async () => {
139
+ await store.initialize('test mnemonic');
140
+ vi.clearAllMocks();
141
+ });
142
+ it('should create a new room for a kind 14 rumor', () => {
143
+ store.receiveMessage({
144
+ kind: 14,
145
+ pubkey: bobPub,
146
+ created_at: 1000,
147
+ content: 'hello',
148
+ tags: [['p', bobPub]],
149
+ id: 'msg1',
150
+ });
151
+ expect(store.rooms).toHaveLength(1);
152
+ expect(store.rooms[0].type).toBe('private');
153
+ });
154
+ it('should add message to existing room', () => {
155
+ store.receiveMessage({
156
+ kind: 14,
157
+ pubkey: bobPub,
158
+ created_at: 1000,
159
+ content: 'first',
160
+ tags: [['p', bobPub]],
161
+ id: 'm1',
162
+ });
163
+ store.receiveMessage({
164
+ kind: 14,
165
+ pubkey: bobPub,
166
+ created_at: 2000,
167
+ content: 'second',
168
+ tags: [['p', bobPub]],
169
+ id: 'm2',
170
+ });
171
+ const roomId = store.rooms[0].id;
172
+ expect(store.messages[roomId]).toHaveLength(2);
173
+ expect(store.messages[roomId][0].content).toBe('first');
174
+ expect(store.messages[roomId][1].content).toBe('second');
175
+ });
176
+ it('should handle editOf by updating target message content', () => {
177
+ store.receiveMessage({
178
+ kind: 14,
179
+ pubkey: bobPub,
180
+ created_at: 1000,
181
+ content: 'original',
182
+ tags: [['p', bobPub]],
183
+ id: 'orig',
184
+ });
185
+ const roomId = store.rooms[0].id;
186
+ store.receiveMessage({
187
+ kind: 14,
188
+ pubkey: bobPub,
189
+ created_at: 2000,
190
+ content: 'edited',
191
+ tags: [['p', bobPub], ['edit', 'orig']],
192
+ id: 'edit1',
193
+ });
194
+ const msg = store.messages[roomId][0];
195
+ expect(msg.content).toBe('edited');
196
+ expect(msg.editOf).toBe('edit1');
197
+ });
198
+ it('should buffer edits when target message not yet received', () => {
199
+ store.receiveMessage({
200
+ kind: 14,
201
+ pubkey: bobPub,
202
+ created_at: 2000,
203
+ content: 'edited',
204
+ tags: [['p', bobPub], ['edit', 'not-here-yet']],
205
+ id: 'edit1',
206
+ });
207
+ expect(Object.keys(store.messages)).toHaveLength(0);
208
+ store.receiveMessage({
209
+ kind: 14,
210
+ pubkey: bobPub,
211
+ created_at: 1000,
212
+ content: 'original',
213
+ tags: [['p', bobPub]],
214
+ id: 'not-here-yet',
215
+ });
216
+ const roomId = store.rooms[0].id;
217
+ const msg = store.messages[roomId].find(m => m.id === 'not-here-yet');
218
+ expect(msg?.content).toBe('edited');
219
+ });
220
+ it('should ignore non-14 kind rumors', () => {
221
+ store.receiveMessage({
222
+ kind: 1,
223
+ pubkey: bobPub,
224
+ created_at: 1000,
225
+ content: 'hello',
226
+ tags: [],
227
+ id: 'note1',
228
+ });
229
+ expect(store.rooms).toHaveLength(0);
230
+ });
231
+ it('should ignore duplicate messages', () => {
232
+ store.receiveMessage({
233
+ kind: 14,
234
+ pubkey: bobPub,
235
+ created_at: 1000,
236
+ content: 'hello',
237
+ tags: [['p', bobPub]],
238
+ id: 'msg1',
239
+ });
240
+ store.receiveMessage({
241
+ kind: 14,
242
+ pubkey: bobPub,
243
+ created_at: 1000,
244
+ content: 'hello',
245
+ tags: [['p', bobPub]],
246
+ id: 'msg1',
247
+ });
248
+ const roomId = store.rooms[0].id;
249
+ expect(store.messages[roomId]).toHaveLength(1);
250
+ });
251
+ it('should skip self-wrapped gift wraps via subscribe filter', () => {
252
+ const selfTaggedEvent = {
253
+ id: 'gw1',
254
+ pubkey: 'alice',
255
+ created_at: 1000,
256
+ kind: 1059,
257
+ tags: [['self']],
258
+ content: 'encrypted',
259
+ sig: 'sig',
260
+ };
261
+ store.subscribe((event) => { });
262
+ expect(mockSubscribeGiftWraps).toHaveBeenCalled();
263
+ });
264
+ });
265
+ describe('sendMessage', () => {
266
+ beforeEach(async () => {
267
+ await store.initialize('test mnemonic');
268
+ vi.clearAllMocks();
269
+ vi.mocked(chatModule.createNip17GiftWraps).mockResolvedValue([]);
270
+ });
271
+ it('should throw when not initialized', async () => {
272
+ const emptyStore = new ChatStore();
273
+ await expect(emptyStore.sendMessage('room1', 'hi')).rejects.toThrow('Not initialized');
274
+ });
275
+ it('should throw when room not found', async () => {
276
+ await expect(store.sendMessage('nonexistent', 'hi')).rejects.toThrow('Room not found');
277
+ });
278
+ it('should create message and save to sentMessages', async () => {
279
+ store.rooms.push({ id: 'room1', type: 'private', name: 'Test', members: [mockPubKey, bobPub], subject: null, createdAt: 1, updatedAt: 1 });
280
+ const result = await store.sendMessage('room1', 'hello world');
281
+ expect(result.message.content).toBe('hello world');
282
+ expect(result.message.sender).toBe(mockPubKey);
283
+ expect(store.sentMessages.room1).toHaveLength(1);
284
+ expect(store.sentMessages.room1[0].id).toBe(result.message.id);
285
+ });
286
+ });
287
+ describe('publishGiftWraps', () => {
288
+ beforeEach(async () => {
289
+ await store.initialize('test mnemonic');
290
+ vi.clearAllMocks();
291
+ });
292
+ it('should collect recipient relays and publish', async () => {
293
+ mockFetchKind10050.mockResolvedValue({
294
+ kind: 10050,
295
+ tags: [['relay', 'wss://user-relay.com']],
296
+ content: '',
297
+ created_at: 1000,
298
+ pubkey: bobPub,
299
+ id: '10050id',
300
+ sig: 'sig',
301
+ });
302
+ mockPublish.mockResolvedValue({ accepted: ['wss://relay.paytaca.com'], errors: [] });
303
+ const giftWraps = [{
304
+ id: 'gw1',
305
+ pubkey: 'alice',
306
+ created_at: 1000,
307
+ kind: 1059,
308
+ tags: [['p', bobPub]],
309
+ content: 'encrypted',
310
+ sig: 'sig',
311
+ }];
312
+ const result = await store.publishGiftWraps(giftWraps);
313
+ expect(mockFetchKind10050).toHaveBeenCalled();
314
+ expect(mockPublish).toHaveBeenCalled();
315
+ expect(result.accepted).toContain('wss://relay.paytaca.com');
316
+ });
317
+ });
318
+ describe('getRooms', () => {
319
+ it('should return rooms sorted by updatedAt descending', () => {
320
+ store.keys = mockKeys;
321
+ store.rooms.push({ id: 'r1', type: 'private', name: 'A', members: [mockPubKey, 'a'], subject: null, createdAt: 1, updatedAt: 3 });
322
+ store.rooms.push({ id: 'r2', type: 'private', name: 'B', members: [mockPubKey, 'b'], subject: null, createdAt: 2, updatedAt: 5 });
323
+ const rooms = store.getRooms();
324
+ expect(rooms).toHaveLength(2);
325
+ expect(rooms[0].id).toBe('r2');
326
+ expect(rooms[1].id).toBe('r1');
327
+ });
328
+ it('should return empty array when not initialized', () => {
329
+ expect(new ChatStore().getRooms()).toEqual([]);
330
+ });
331
+ });
332
+ describe('getRoom', () => {
333
+ beforeEach(async () => {
334
+ await store.initialize('test mnemonic');
335
+ });
336
+ it('should find room by exact ID', () => {
337
+ store.rooms.push({ id: 'abc123', type: 'private', name: 'Test', members: [], subject: null, createdAt: 1, updatedAt: 1 });
338
+ expect(store.getRoom('abc123')?.name).toBe('Test');
339
+ });
340
+ it('should find room by prefix', () => {
341
+ store.rooms.push({ id: 'abcdef', type: 'private', name: 'Prefix', members: [], subject: null, createdAt: 1, updatedAt: 1 });
342
+ expect(store.getRoom('abc')?.name).toBe('Prefix');
343
+ });
344
+ it('should return undefined for unknown room', () => {
345
+ expect(store.getRoom('nonexistent')).toBeUndefined();
346
+ });
347
+ });
348
+ describe('addContact / removeContact', () => {
349
+ it('should add a new contact', () => {
350
+ const contact = store.addContact('npub1j9hjjlhcsdu0nlmh6lpek6dahqxe6wlvh8lc2g7lm2vf3dq7tjksz9haa4', 'Alice');
351
+ expect(contact.name).toBe('Alice');
352
+ expect(store.contacts).toHaveLength(1);
353
+ });
354
+ it('should return existing contact without duplicate', () => {
355
+ store.addContact('npub1j9hjjlhcsdu0nlmh6lpek6dahqxe6wlvh8lc2g7lm2vf3dq7tjksz9haa4', 'Alice');
356
+ const contact = store.addContact('npub1j9hjjlhcsdu0nlmh6lpek6dahqxe6wlvh8lc2g7lm2vf3dq7tjksz9haa4', 'Alice');
357
+ expect(store.contacts).toHaveLength(1);
358
+ expect(contact.name).toBe('Alice');
359
+ });
360
+ it('should throw for invalid npub', () => {
361
+ expect(() => store.addContact('invalid')).toThrow();
362
+ });
363
+ it('should remove a contact', () => {
364
+ store.addContact('npub1j9hjjlhcsdu0nlmh6lpek6dahqxe6wlvh8lc2g7lm2vf3dq7tjksz9haa4', 'Alice');
365
+ store.removeContact('npub1j9hjjlhcsdu0nlmh6lpek6dahqxe6wlvh8lc2g7lm2vf3dq7tjksz9haa4');
366
+ expect(store.contacts).toHaveLength(0);
367
+ });
368
+ });
369
+ describe('startConversation', () => {
370
+ beforeEach(async () => {
371
+ await store.initialize('test mnemonic');
372
+ });
373
+ it('should throw if contact not found', () => {
374
+ expect(() => store.startConversation('npub1alice')).toThrow('Contact not found');
375
+ });
376
+ it('should create a new room for the contact', () => {
377
+ store.addContact('npub1j9hjjlhcsdu0nlmh6lpek6dahqxe6wlvh8lc2g7lm2vf3dq7tjksz9haa4', 'Alice');
378
+ const room = store.startConversation('npub1j9hjjlhcsdu0nlmh6lpek6dahqxe6wlvh8lc2g7lm2vf3dq7tjksz9haa4');
379
+ expect(room.type).toBe('private');
380
+ expect(room.members).toContain(mockPubKey);
381
+ expect(room.members).toContain(store.contacts[0].pubKeyHex);
382
+ });
383
+ });
384
+ describe('resolveDisplayName', () => {
385
+ beforeEach(async () => {
386
+ await store.initialize('test mnemonic');
387
+ });
388
+ it('should return contact name if available', async () => {
389
+ store.contacts.push({ name: 'Alice', npub: 'npub1alice', pubKeyHex: bobPub, addedAt: 1 });
390
+ const name = await store.resolveDisplayName(bobPub);
391
+ expect(name).toBe('Alice');
392
+ });
393
+ it('should fetch from relay if not cached', async () => {
394
+ mockFetchDisplayName.mockResolvedValue('RelayName');
395
+ const name = await store.resolveDisplayName(bobPub);
396
+ expect(name).toBe('RelayName');
397
+ expect(store.displayNameCache[bobPub]).toBe('RelayName');
398
+ });
399
+ });
400
+ describe('resolveBchAddress', () => {
401
+ beforeEach(async () => {
402
+ await store.initialize('test mnemonic');
403
+ });
404
+ it('should return cached address', async () => {
405
+ store.bchAddressCache[bobPub] = 'bitcoincash:abc';
406
+ const addr = await store.resolveBchAddress(bobPub);
407
+ expect(addr).toBe('bitcoincash:abc');
408
+ });
409
+ it('should fetch from relay if not cached', async () => {
410
+ mockFetchBchAddress.mockResolvedValue('bitcoincash:xyz');
411
+ const addr = await store.resolveBchAddress(bobPub);
412
+ expect(addr).toBe('bitcoincash:xyz');
413
+ expect(store.bchAddressCache[bobPub]).toBe('bitcoincash:xyz');
414
+ });
415
+ });
416
+ describe('subscribe / unsubscribe / cleanup', () => {
417
+ beforeEach(async () => {
418
+ await store.initialize('test mnemonic');
419
+ });
420
+ it('should subscribe to gift wraps', () => {
421
+ store.subscribe();
422
+ expect(mockSubscribeGiftWraps).toHaveBeenCalled();
423
+ });
424
+ it('should disconnect on unsubscribe', () => {
425
+ store.unsubscribe();
426
+ expect(mockDisconnect).toHaveBeenCalled();
427
+ expect(store.isSubscribed).toBe(false);
428
+ });
429
+ it('should cleanup', () => {
430
+ store.cleanup();
431
+ expect(mockCleanup).toHaveBeenCalled();
432
+ expect(store.isSubscribed).toBe(false);
433
+ });
434
+ });
435
+ describe('getOtherMember', () => {
436
+ beforeEach(async () => {
437
+ await store.initialize('test mnemonic');
438
+ });
439
+ it('should return the other member in a room', () => {
440
+ const other = store.getOtherMember({ id: 'r1', type: 'private', name: 'Test', members: [mockPubKey, bobPub], subject: null, createdAt: 1, updatedAt: 1 });
441
+ expect(other).toBe(bobPub);
442
+ });
443
+ it('should return null when not initialized', () => {
444
+ expect(new ChatStore().getOtherMember({ id: 'r1', type: 'private', name: 'Test', members: [], subject: null, createdAt: 1, updatedAt: 1 })).toBeNull();
445
+ });
446
+ });
447
+ });
448
+ //# sourceMappingURL=store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../src/nostr/store.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paytaca-cli",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "Command-line interface for the Paytaca Bitcoin Cash wallet",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -45,6 +45,7 @@
45
45
  "bip39": "^3.1.0",
46
46
  "chalk": "^5.4.1",
47
47
  "commander": "^12.1.0",
48
+ "nostr-tools": "^2.23.3",
48
49
  "js-sha256": "^0.9.0",
49
50
  "qrcode-terminal": "^0.12.0",
50
51
  "watchtower-cash-js": "^0.2.4"
@@ -0,0 +1,68 @@
1
+ # Paytaca CLI Skills
2
+
3
+ This directory contains AI agent skills for the Paytaca CLI.
4
+
5
+ ## Available Skills
6
+
7
+ ### paytaca-x402
8
+
9
+ Handles x402 HTTP payment requests using Paytaca BCH wallet. Use when encountering HTTP 402 responses or when calling APIs that may require payment via the x402 protocol.
10
+
11
+ ```bash
12
+ npx skills add paytaca/paytaca-cli --skill paytaca-x402 -a <agent> -g
13
+ ```
14
+
15
+ ### paytaca-wallet
16
+
17
+ Query wallet information including BCH balance, CashToken holdings, addresses, and transaction history. Use for read-only wallet operations.
18
+
19
+ ```bash
20
+ npx skills add paytaca/paytaca-cli --skill paytaca-wallet -a <agent> -g
21
+ ```
22
+
23
+ ### paytaca-send
24
+
25
+ Send BCH and CashTokens from the wallet. **Requires user approval** before any sending operation.
26
+
27
+ ```bash
28
+ npx skills add paytaca/paytaca-cli --skill paytaca-send -a <agent> -g
29
+ ```
30
+
31
+ ## Installation
32
+
33
+ Install specific skill:
34
+ ```bash
35
+ npx skills add paytaca/paytaca-cli --skill <skill-name> -a <agent> -g
36
+ ```
37
+
38
+ Install all skills:
39
+ ```bash
40
+ npx skills add paytaca/paytaca-cli --all
41
+ ```
42
+
43
+ List available skills:
44
+ ```bash
45
+ npx skills add paytaca/paytaca-cli --list
46
+ ```
47
+
48
+ ## Skill Overview
49
+
50
+ | Skill | Purpose | Approval Needed |
51
+ |-------|---------|-----------------|
52
+ | paytaca-x402 | HTTP 402 payment handling | Yes (before payment) |
53
+ | paytaca-wallet | Balance, addresses, history, token info | No (read-only) |
54
+ | paytaca-send | Send BCH and tokens | Yes (before sending) |
55
+
56
+ ## Adding New Skills
57
+
58
+ To add a new skill:
59
+
60
+ 1. Create a new directory: `skills/<skill-name>/`
61
+ 2. Add a `SKILL.md` file with YAML frontmatter:
62
+ ```yaml
63
+ ---
64
+ name: <skill-name>
65
+ description: What this skill does and when to use it
66
+ ---
67
+ ```
68
+ 3. Write the skill instructions below the frontmatter