forked from mergeos-bounties/Loru
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcreate-bounties.mjs
More file actions
409 lines (327 loc) · 13.4 KB
/
Copy pathcreate-bounties.mjs
File metadata and controls
409 lines (327 loc) · 13.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
import { execSync } from 'node:child_process';
import { mkdtempSync, writeFileSync, rmSync } from 'node:fs';
import { join } from 'node:path';
import { tmpdir } from 'node:os';
const REPO = 'mergeos-bounties/Loru';
function sh(cmd) {
return execSync(cmd, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim();
}
function ensureLabel(name, color, description) {
try {
sh(
`gh label create ${JSON.stringify(name)} --repo ${REPO} --color ${color} --description ${JSON.stringify(description)}`,
);
} catch {
try {
sh(
`gh label edit ${JSON.stringify(name)} --repo ${REPO} --color ${color} --description ${JSON.stringify(description)}`,
);
} catch {
// ignore
}
}
}
function createIssue(title, body, labels) {
const dir = mkdtempSync(join(tmpdir(), 'loru-issue-'));
const file = join(dir, 'body.md');
try {
writeFileSync(file, body, 'utf8');
const labelFlags = labels.map((l) => `--label ${JSON.stringify(l)}`).join(' ');
const out = sh(
`gh issue create --repo ${REPO} --title ${JSON.stringify(title)} --body-file ${JSON.stringify(file)} ${labelFlags}`,
);
console.log(out);
return out;
} finally {
rmSync(dir, { recursive: true, force: true });
}
}
const labels = [
['bounty', '5319E7', 'Eligible for MergeOS MRG bounty'],
['bounty: feature', 'A2EEEF', 'Feature bounty'],
['bounty: bug', 'D73A4A', 'Bug bounty'],
['ml', 'B60205', 'Models / training / evaluation'],
['data', 'C5DEF5', 'Datasets / loaders / annotation'],
['voice', 'D4C5F9', 'TTS / sign-to-voice'],
['api', '1D76DB', 'HTTP / websocket API'],
['accessibility', '0E8A16', 'A11y / sign-language UX'],
['reward:25-mrg', 'FEF2C0', 'Target 25 MRG'],
['reward:50-mrg', 'FEF2C0', 'Target 50 MRG'],
['reward:100-mrg', 'FEF2C0', 'Target 100 MRG'],
['reward:200-mrg', 'FEF2C0', 'Target 200 MRG'],
['good first issue', '7057FF', 'Good for newcomers'],
['documentation', '0075CA', 'Documentation improvements'],
];
for (const [name, color, description] of labels) {
ensureLabel(name, color, description);
}
const footer = `
## Claim (MergeOS MRG)
1. Follow https://github.com/mergeos-bounties
2. Star https://github.com/mergeos-bounties/mergeos
3. Star https://github.com/mergeos-bounties/mergeos-contracts
4. Comment on **this issue**: \`I claim this bounty\`
5. Comment on MergeOS [Claim Token #1](https://github.com/mergeos-bounties/mergeos/issues/1) with a link to this issue
6. Open a PR to **Loru** with \`Fixes #<this-issue>\`
Policy: [docs/BOUNTY.md](../blob/master/docs/BOUNTY.md)
## Payout
Maintainer reviews PR → merge on Loru → **MRG credit** on MergeOS ledger to \`github:<author>\` (25/50/100/200 scale).
`;
const issues = [
{
title: '[25 MRG] Docs: DATASETS.md catalog of public sign corpora + licenses',
labels: ['bounty', 'bounty: feature', 'documentation', 'data', 'reward:25-mrg', 'good first issue'],
body: `## Bounty: 25 MRG
Create \`docs/DATASETS.md\` listing public sign-language datasets (WLASL, MS-ASL, How2Sign, Phoenix-2014T, etc.) with:
- License summary
- Language / size
- Whether video or landmarks
- Link + citation
- Safe-to-use notes for open-source training
Do **not** redistributing copyrighted media; document only.
## Acceptance
- [ ] \`docs/DATASETS.md\` merged with ≥8 corpora rows
- [ ] Each row has license + link
- [ ] Ethics note matches README
${footer}`,
},
{
title: '[25 MRG] CLI: loru eval toy — accuracy table over data/samples',
labels: ['bounty', 'bounty: feature', 'ml', 'reward:25-mrg', 'good first issue'],
body: `## Bounty: 25 MRG
Add \`loru eval toy\` that loads the demo classifier, runs every sample, prints a rich table (gloss / pred / conf / ok), and exit code 0 when accuracy ≥ 0.8.
## Acceptance
- [ ] Command registered in \`cli.py\`
- [ ] Unit test with samples
- [ ] README documents the command
${footer}`,
},
{
title: '[25 MRG] Gloss vocab: load from YAML/JSON + expand DEFAULT_GLOSS',
labels: ['bounty', 'bounty: feature', 'ml', 'data', 'reward:25-mrg', 'good first issue'],
body: `## Bounty: 25 MRG
Make gloss vocabulary configurable via \`data/vocab.json\` (or YAML) with fallback to \`DEFAULT_GLOSS\`. Support add/list CLI helpers.
## Acceptance
- [ ] \`loru vocab list\` works
- [ ] Custom vocab file loaded when present
- [ ] Tests cover missing + present files
${footer}`,
},
{
title: '[25 MRG] Sequence schema validation with pydantic',
labels: ['bounty', 'bounty: feature', 'data', 'reward:25-mrg', 'good first issue'],
body: `## Bounty: 25 MRG
Define a pydantic model for sample JSON (\`gloss\`, \`frames\`, optional \`fps\`, \`language\`) and validate in the loader. Clear errors for bad shapes.
## Acceptance
- [ ] Invalid sample raises helpful error
- [ ] Existing samples validate
- [ ] Tests for good/bad payloads
${footer}`,
},
{
title: '[50 MRG] MediaPipe Holistic landmark extractor adapter',
labels: ['bounty', 'bounty: feature', 'ml', 'data', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Add \`src/loru/data/mediapipe_extract.py\` (optional dep) that turns a video path into Loru sample JSON (hands + pose landmarks). Document install extras.
## Acceptance
- [ ] CLI: \`loru data extract --video <path> --out data/samples/custom.json\`
- [ ] Graceful error if mediapipe not installed
- [ ] Unit test with a tiny synthetic/mock path OR skip-marked integration test
- [ ] No large videos committed
${footer}`,
},
{
title: '[50 MRG] Dataset adapter: WLASL-style index → Loru sequences',
labels: ['bounty', 'bounty: feature', 'data', 'ml', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Implement a loader that reads a WLASL (or similar) **index JSON** and maps entries into Loru-compatible manifests. Download is out of scope unless offline fixture provided.
## Acceptance
- [ ] Adapter module + CLI or script
- [ ] Fixture index under \`tests/fixtures/\`
- [ ] License notes in PR body
${footer}`,
},
{
title: '[50 MRG] Sign→text: sequence model baseline (CTC or tiny transformer stub)',
labels: ['bounty', 'bounty: feature', 'ml', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Replace pure prototype matching with a real sequence baseline under optional \`torch\` extra. Keep toy model as fallback.
## Acceptance
- [ ] Train script + checkpoint save/load API
- [ ] Infer path can load checkpoint when present
- [ ] Tests run without GPU; CPU or skip if torch missing
- [ ] Document in README
${footer}`,
},
{
title: '[50 MRG] Metrics: top-k accuracy, confusion matrix, report JSON',
labels: ['bounty', 'bounty: feature', 'ml', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Add evaluation metrics module + CLI export for confusion matrix and top-k accuracy over samples or a held-out split.
## Acceptance
- [ ] \`loru eval report --out data/runs/metrics.json\`
- [ ] Tests for top-1 / top-k helpers
- [ ] Matrix printable via rich
${footer}`,
},
{
title: '[50 MRG] Sign→voice: pyttsx3 or edge-tts real backend',
labels: ['bounty', 'bounty: feature', 'voice', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Implement a real TTS backend behind \`TextToSpeech\` (pyttsx3 and/or edge-tts). Keep offline stub as default when deps missing.
## Acceptance
- [ ] \`get_default_tts()\` selects real engine when available
- [ ] WAV or MP3 written with audible speech when engine works
- [ ] CI still green without optional voice deps (stub path)
- [ ] README documents extras
${footer}`,
},
{
title: '[50 MRG] FastAPI: POST /infer/text and /infer/voice',
labels: ['bounty', 'bounty: feature', 'api', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Ship optional FastAPI app under \`src/loru/api/\` with:
- \`POST /infer/text\` (JSON sequence body)
- \`POST /infer/voice\` (returns path or audio bytes)
- \`GET /health\`
## Acceptance
- [ ] \`loru serve\` or uvicorn entry documented
- [ ] Tests with TestClient (api extra)
- [ ] OpenAPI tags clean
${footer}`,
},
{
title: '[50 MRG] Gloss→sentence: template pack + simple NLG for multi-gloss',
labels: ['bounty', 'bounty: feature', 'ml', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Expand \`gloss_to_sentence\` to multi-gloss sequences (e.g. HELLO + NAME) with templates or a tiny rule-based NLG. Support EN + optional VI stubs.
## Acceptance
- [ ] Multi-gloss API + tests
- [ ] At least EN full coverage for DEFAULT_GLOSS
- [ ] Document extension format
${footer}`,
},
{
title: '[50 MRG] Webcam demo: OpenCV capture loop → live gloss print',
labels: ['bounty', 'bounty: feature', 'ml', 'accessibility', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
CLI \`loru infer webcam\` that opens a camera (when available), extracts landmarks (or mock), and prints predicted gloss at ~FPS. Headless CI must skip gracefully.
## Acceptance
- [ ] Command exists + documented
- [ ] No crash when no camera (clear message)
- [ ] Optional: save last N frames as sample JSON
${footer}`,
},
{
title: '[100 MRG] Continuous signing: sliding window + gloss stream',
labels: ['bounty', 'bounty: feature', 'ml', 'reward:100-mrg'],
body: `## Bounty: 100 MRG
Move beyond isolated signs: implement a sliding-window recognizer that emits a stream of glosses with confidence + debounce (no spam).
## Acceptance
- [ ] Stream API or CLI mode
- [ ] Debounce / hysteresis documented
- [ ] Tests with synthetic multi-sign sequences
${footer}`,
},
{
title: '[100 MRG] Vietnamese Sign Language (VSL) pilot pack',
labels: ['bounty', 'bounty: feature', 'data', 'accessibility', 'reward:100-mrg'],
body: `## Bounty: 100 MRG
Add a **VSL pilot**: vocab list, sample sequences (synthetic or consented), VI templates for sign→text, and docs on VSL resources.
## Acceptance
- [ ] \`data/samples/vsl/\` or language tag on samples
- [ ] Vocab + templates for ≥15 glosses
- [ ] Ethics + data provenance in docs
- [ ] Tests cover VSL path
${footer}`,
},
{
title: '[100 MRG] Browser webcam UI for sign→text demo',
labels: ['bounty', 'bounty: feature', 'api', 'accessibility', 'reward:100-mrg'],
body: `## Bounty: 100 MRG
Static or light frontend (Vite/vanilla) that streams webcam landmarks (MediaPipe JS or server path) and shows live text. Ship under \`web/\` or \`frontend/\`.
## Acceptance
- [ ] Local dev README
- [ ] Screenshot evidence in PR
- [ ] No secrets; works with local Loru API when available
${footer}`,
},
{
title: '[100 MRG] Training pipeline: config YAML + seed + checkpoint resume',
labels: ['bounty', 'bounty: feature', 'ml', 'reward:100-mrg'],
body: `## Bounty: 100 MRG
Production-shaped training loop: hydra-like or plain YAML configs, seed control, early stopping stub, checkpoint resume, tensorboard optional.
## Acceptance
- [ ] \`configs/toy.yaml\` example
- [ ] CLI train with config path
- [ ] Resume from checkpoint tested
- [ ] Docs for contributors
${footer}`,
},
{
title: '[200 MRG] End-to-end product path: video → text → voice with demo video',
labels: ['bounty', 'bounty: feature', 'ml', 'voice', 'accessibility', 'reward:200-mrg'],
body: `## Bounty: 200 MRG
Ship a polished E2E demo: sample video (consented/short) → landmarks → text → TTS audio, one command, documented quality bar.
## Acceptance
- [ ] Single CLI or notebook path
- [ ] Short demo assets under license-safe terms
- [ ] Accuracy notes + known limitations
- [ ] Evidence: command log + audio sample + optional screen capture
${footer}`,
},
{
title: '[25 MRG] CI polish: coverage badge + ruff format check',
labels: ['bounty', 'bounty: feature', 'documentation', 'reward:25-mrg', 'good first issue'],
body: `## Bounty: 25 MRG
Improve \`.github/workflows/ci.yml\`: pytest-cov threshold (reasonable), \`ruff format --check\`, cache pip.
## Acceptance
- [ ] CI green on PR
- [ ] README badge optional
${footer}`,
},
{
title: '[25 MRG] CONTRIBUTING.md + good-first-issue path for Loru',
labels: ['bounty', 'bounty: feature', 'documentation', 'reward:25-mrg', 'good first issue'],
body: `## Bounty: 25 MRG
Write \`CONTRIBUTING.md\` with setup, test commands, PR checklist, and link to MergeOS claim flow.
## Acceptance
- [ ] File merged + linked from README
${footer}`,
},
{
title: '[50 MRG] Landmark augmentation: noise, time warp, drop frames',
labels: ['bounty', 'bounty: feature', 'ml', 'data', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Augmentation helpers for landmark sequences to toughen toy/real training. CLI flag or train-time hook.
## Acceptance
- [ ] Module + unit tests proving shape preservation
- [ ] Optional use in \`train toy\`
${footer}`,
},
{
title: '[50 MRG] Export ONNX (or torchscript) for toy/sequence model',
labels: ['bounty', 'bounty: feature', 'ml', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Export path for inference outside Python training env. Prefer ONNX if torch available.
## Acceptance
- [ ] Export CLI
- [ ] Load + predict parity test (or skip if no torch)
- [ ] Docs
${footer}`,
},
{
title: '[50 MRG] Accessibility docs: how deaf/hard-of-hearing users benefit + safety',
labels: ['bounty', 'bounty: feature', 'documentation', 'accessibility', 'reward:50-mrg'],
body: `## Bounty: 50 MRG
Write \`docs/ACCESSIBILITY.md\`: intended users, limitations of automated SLR, consent, when human interpreters are required.
## Acceptance
- [ ] Doc merged + README link
- [ ] Clear non-claims / safety language
${footer}`,
},
];
for (const issue of issues) {
createIssue(issue.title, issue.body, issue.labels);
}
console.log(`Created ${issues.length} issues on ${REPO}`);