clew-code 0.2.29 → 0.2.31

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 (39) hide show
  1. package/README.md +20 -4
  2. package/bin/clew.cjs +2 -2
  3. package/dist/main.js +2015 -2015
  4. package/package.json +5 -2
  5. package/scripts/auto-close-duplicates.ts +277 -0
  6. package/scripts/backfill-duplicate-comments.ts +213 -0
  7. package/scripts/codegraph.ts +221 -0
  8. package/scripts/comment-on-duplicates.sh +95 -0
  9. package/scripts/edit-issue-labels.sh +84 -0
  10. package/scripts/final-peer-rename.mjs +46 -0
  11. package/scripts/fix-encoding.mjs +83 -0
  12. package/scripts/fix-inconsistencies.mjs +67 -0
  13. package/scripts/generate-docs.ts +307 -0
  14. package/scripts/gh.sh +96 -0
  15. package/scripts/install.ps1 +40 -0
  16. package/scripts/install.sh +65 -0
  17. package/scripts/issue-lifecycle.ts +38 -0
  18. package/scripts/lifecycle-comment.ts +53 -0
  19. package/scripts/normalize-html.mjs +37 -0
  20. package/scripts/preload.ts +159 -0
  21. package/scripts/rename-content-peer-to-swarm.mjs +67 -0
  22. package/scripts/rename-hooks-mesh.mjs +6 -0
  23. package/scripts/rename-peer-to-swarm.mjs +62 -0
  24. package/scripts/run_devcontainer_claude_code.ps1 +152 -0
  25. package/scripts/scrape.py +82 -0
  26. package/scripts/session.ts +195 -0
  27. package/scripts/sweep.ts +168 -0
  28. package/scripts/write-discovery-test.cjs +93 -0
  29. package/scripts/write-discovery-test2.cjs +65 -0
  30. package/scripts/write-server-final.cjs +108 -0
  31. package/scripts/write-server-test.cjs +69 -0
  32. package/scripts/write-server-test2.cjs +99 -0
  33. package/scripts/write-server-test3.cjs +59 -0
  34. package/scripts/write-server-test4.cjs +108 -0
  35. package/scripts/write-server-v2.cjs +142 -0
  36. package/scripts/write-server-v2b.cjs +129 -0
  37. package/scripts/write-server-v2c.cjs +136 -0
  38. package/scripts/write-store-test.cjs +12 -0
  39. package/scripts/write-store-test2.cjs +163 -0
@@ -0,0 +1,12 @@
1
+ const fs = require('fs');
2
+ const p = 'D:/Projects/Github/clew-code/src/mesh/MeshStore.test.ts';
3
+ const code = `
4
+ import { describe, expect, test, beforeEach, afterEach } from 'bun:test';
5
+ import { MeshStore } from './MeshStore.js';
6
+
7
+ function mp(o) { return { id:'peer-1', hostname:'w', ip:'127.0.0.1', port:4200, cwd:'/r', version:'t', lastSeen:Date.now(), status:'online', ...o }; }
8
+ function mm(o) { return { id:'msg-1', from:'peer-1', fromName:'w', text:'hello', color:'cyan', timestamp:Date.now(), ...o }; }
9
+ function mt(o) { return { id:'todo-1', from:'peer-1', fromName:'w', message:'do', createdAt:Date.now(), status:'pending', ...o }; }
10
+ `;
11
+ fs.writeFileSync(p, code.trimStart(), 'utf8');
12
+ console.log('MeshStore.test.ts part 1 written');
@@ -0,0 +1,163 @@
1
+ const fs = require('fs');
2
+ const p = 'D:/Projects/Github/clew-code/src/mesh/MeshStore.test.ts';
3
+ const code = `
4
+ describe('MeshStore', () => {
5
+ let store;
6
+ beforeEach(() => { store = new MeshStore(); });
7
+ afterEach(() => { store.destroy(); });
8
+
9
+ test('addPeer/getPeers', () => {
10
+ store.addPeer(mp());
11
+ expect(store.getPeers()).toHaveLength(1);
12
+ });
13
+
14
+ test('addPeer updates existing', () => {
15
+ store.addPeer(mp()); store.addPeer(mp({ cwd:'/x' }));
16
+ expect(store.getPeers()[0].cwd).toBe('/x');
17
+ });
18
+
19
+ test('getPeer', () => {
20
+ store.addPeer(mp());
21
+ expect(store.getPeer('peer-1')).toBeDefined();
22
+ expect(store.getPeer('nope')).toBeUndefined();
23
+ });
24
+
25
+ test('findPeer by id/hostname/displayName', () => {
26
+ store.addPeer(mp({ id:'abc', hostname:'alpha' }));
27
+ store.setPeerName('abc','Builder');
28
+ expect(store.findPeer('abc')?.id).toBe('abc');
29
+ expect(store.findPeer('alpha')?.id).toBe('abc');
30
+ expect(store.findPeer('Builder')?.id).toBe('abc');
31
+ });
32
+
33
+ test('addMesh alias', () => {
34
+ store.addMesh(mp({ id:'x' }));
35
+ expect(store.getPeer('x')).toBeDefined();
36
+ });
37
+
38
+ test('removePeer fires callback', () => {
39
+ let rid=''; const s=new MeshStore({onPeerRemoved:i=>{rid=i}});
40
+ s.addPeer(mp()); s.removePeer('peer-1');
41
+ expect(rid).toBe('peer-1'); s.destroy();
42
+ });
43
+
44
+ test('addConnection', () => {
45
+ store.addConnection(mp({ id:'c' }));
46
+ expect(store.getConnections()).toHaveLength(1);
47
+ });
48
+
49
+ test('addMessage/getMessages/clear/createMessage', () => {
50
+ store.addMessage(mm()); expect(store.getMessages()).toHaveLength(1);
51
+ store.clearMessages(); expect(store.getMessages()).toHaveLength(0);
52
+ const m=store.createMessage('tp','T','hi');
53
+ expect(m.from).toBe('tp'); expect(m.text).toBe('hi');
54
+ });
55
+
56
+ test('getMessagesAfter', () => {
57
+ store.addMessage(mm({id:'m1',timestamp:100}));
58
+ store.addMessage(mm({id:'m2',timestamp:200}));
59
+ expect(store.getMessagesAfter(150)).toHaveLength(1);
60
+ });
61
+
62
+ test('getReassembledMessages', () => {
63
+ store.addMessage(mm({id:'c1',text:'A',chunkGroup:'g',chunkIndex:0,chunkTotal:2}));
64
+ store.addMessage(mm({id:'c2',text:'B',chunkGroup:'g',chunkIndex:1,chunkTotal:2}));
65
+ const r=store.getReassembledMessages();
66
+ expect(r).toHaveLength(1); expect(r[0].text).toBe('AB');
67
+ });
68
+
69
+ test('getChunkGroupStatus', () => {
70
+ expect(store.getChunkGroupStatus('n')).toBeNull();
71
+ store.addMessage(mm({chunkGroup:'g',chunkIndex:0,chunkTotal:3}));
72
+ store.addMessage(mm({chunkGroup:'g',chunkIndex:2,chunkTotal:3}));
73
+ expect(store.getChunkGroupStatus('g').received).toBe(2);
74
+ });
75
+
76
+ test('waitForNewMessage', async () => {
77
+ const a=Date.now(); const p=store.waitForNewMessage(a,500);
78
+ store.addMessage(mm({timestamp:Date.now()+5}));
79
+ expect((await p)).toHaveLength(1);
80
+ });
81
+
82
+ test('waitForNewMessage timeout', async () => {
83
+ const msgs=await store.waitForNewMessage(Date.now(),50);
84
+ expect(msgs).toHaveLength(0);
85
+ },2000);
86
+
87
+ test('waitForMessageFrom', async () => {
88
+ const a=Date.now();
89
+ const p=store.waitForMessageFrom(a,500,'exp');
90
+ store.addMessage(mm({id:'w',from:'wrong',timestamp:Date.now()+5}));
91
+ await new Promise(r=>setTimeout(r,50));
92
+ store.addMessage(mm({id:'r',from:'exp',timestamp:Date.now()+20}));
93
+ expect((await p)).toHaveLength(1);
94
+ });
95
+
96
+ test('addTodo/updateTodoStatus', () => {
97
+ store.addTodo(mt()); expect(store.getTodos()).toHaveLength(1);
98
+ expect(store.updateTodoStatus('todo-1','done')).toBeTrue();
99
+ expect(store.getTodos()[0].status).toBe('done');
100
+ expect(store.updateTodoStatus('n','done')).toBeFalse();
101
+ });
102
+
103
+ test('peer tags and resolve', () => {
104
+ store.setPeerName('p1','N'); store.setPeerRole('p1','R');
105
+ expect(store.getPeerTags('p1')?.displayName).toBe('N');
106
+ expect(store.getPeerTags('p1')?.role).toBe('R');
107
+ const p=mp({id:'p1',hostname:'h'});
108
+ expect(store.resolveName(p)).toBe('N');
109
+ expect(store.resolveRole(p)).toBe('R');
110
+ });
111
+
112
+ test('mesh alias methods', () => {
113
+ store.setMeshName('x','A'); store.setMeshRole('x','B');
114
+ expect(store.getMeshTags('x')?.displayName).toBe('A');
115
+ expect(store.getAllMeshTags()).toHaveLength(1);
116
+ });
117
+
118
+ test('callbacks', () => {
119
+ let a=false,r=false,u=false;
120
+ const s=new MeshStore({onPeerAdded:()=>{a=true},onPeerUpdated:()=>{u=true},onPeerRemoved:()=>{r=true}});
121
+ s.addPeer(mp()); s.addPeer(mp({status:'off'})); s.removePeer('peer-1');
122
+ expect(a).toBeTrue(); expect(u).toBeTrue(); expect(r).toBeTrue();
123
+ s.destroy();
124
+ });
125
+
126
+ test('setCallbacks merges', () => {
127
+ let a=false,m=false;
128
+ const s=new MeshStore({onPeerAdded:()=>{a=true}});
129
+ s.setCallbacks({onMessageReceived:()=>{m=true}});
130
+ s.addPeer(mp()); s.addMessage(mm());
131
+ expect(a).toBeTrue(); expect(m).toBeTrue();
132
+ s.destroy();
133
+ });
134
+
135
+ test('alias getters', () => {
136
+ store.addPeer(mp({port:7777}));
137
+ expect(store.getMeshs()).toHaveLength(1);
138
+ expect(store.getMeshByPort(7777)).toBeDefined();
139
+ expect(store.findMesh('w')?.id).toBe('peer-1');
140
+ });
141
+
142
+ test('size', () => {
143
+ expect(store.size).toBe(0);
144
+ store.addPeer(mp({id:'p1'}));
145
+ expect(store.size).toBe(1);
146
+ });
147
+
148
+ test('destroy', () => {
149
+ store.addPeer(mp()); store.addMessage(mm()); store.addTodo(mt());
150
+ store.destroy();
151
+ expect(store.getPeers()).toHaveLength(0);
152
+ expect(store.getMessages()).toHaveLength(0);
153
+ expect(store.getTodos()).toHaveLength(0);
154
+ });
155
+
156
+ test('singleton', async () => {
157
+ const {getGlobalMeshStore}=await import('./MeshStore.js');
158
+ expect(getGlobalMeshStore()).toBe(getGlobalMeshStore());
159
+ });
160
+ });
161
+ `;
162
+ fs.appendFileSync(p, code, 'utf8');
163
+ console.log('MeshStore.test.ts completed');