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.
- package/README.md +20 -4
- package/bin/clew.cjs +2 -2
- package/dist/main.js +2015 -2015
- package/package.json +5 -2
- package/scripts/auto-close-duplicates.ts +277 -0
- package/scripts/backfill-duplicate-comments.ts +213 -0
- package/scripts/codegraph.ts +221 -0
- package/scripts/comment-on-duplicates.sh +95 -0
- package/scripts/edit-issue-labels.sh +84 -0
- package/scripts/final-peer-rename.mjs +46 -0
- package/scripts/fix-encoding.mjs +83 -0
- package/scripts/fix-inconsistencies.mjs +67 -0
- package/scripts/generate-docs.ts +307 -0
- package/scripts/gh.sh +96 -0
- package/scripts/install.ps1 +40 -0
- package/scripts/install.sh +65 -0
- package/scripts/issue-lifecycle.ts +38 -0
- package/scripts/lifecycle-comment.ts +53 -0
- package/scripts/normalize-html.mjs +37 -0
- package/scripts/preload.ts +159 -0
- package/scripts/rename-content-peer-to-swarm.mjs +67 -0
- package/scripts/rename-hooks-mesh.mjs +6 -0
- package/scripts/rename-peer-to-swarm.mjs +62 -0
- package/scripts/run_devcontainer_claude_code.ps1 +152 -0
- package/scripts/scrape.py +82 -0
- package/scripts/session.ts +195 -0
- package/scripts/sweep.ts +168 -0
- package/scripts/write-discovery-test.cjs +93 -0
- package/scripts/write-discovery-test2.cjs +65 -0
- package/scripts/write-server-final.cjs +108 -0
- package/scripts/write-server-test.cjs +69 -0
- package/scripts/write-server-test2.cjs +99 -0
- package/scripts/write-server-test3.cjs +59 -0
- package/scripts/write-server-test4.cjs +108 -0
- package/scripts/write-server-v2.cjs +142 -0
- package/scripts/write-server-v2b.cjs +129 -0
- package/scripts/write-server-v2c.cjs +136 -0
- package/scripts/write-store-test.cjs +12 -0
- 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');
|