UmbrelApps: community app store whatsnext

Electrum Gate, Evolu Relay en Atreides Assets, met de image-recepten in tools/ en de tests in tests/. Begonnen zonder voorgeschiedenis op 09-10-2026.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HarmenandClaude Opus 5.5 committed 2026-10-09 10:40:25 +02:00
commit 85d85a1295
63 files changed
+13987

No files matched your search

+101
View File
@@ -0,0 +1,101 @@
// ═══════════════════════════════════════════════════════════════════════════════
// De opdrachtregel lezen. Meer niet.
//
// Apart van cli.js omdat dit het enige deel van de opdrachtregel is dat te
// toetsen valt zonder iets te starten. Dezelfde scheiding als policy.js aan de
// relay-kant: pure functies aan de ene kant, alles wat schijf of netwerk raakt
// aan de andere.
// ═══════════════════════════════════════════════════════════════════════════════
export const OPDRACHTEN = {
nieuw: { argumenten: ['naam'], uitleg: 'Maakt een nieuwe eigenaar met verse sleutels' },
lijst: { argumenten: [], uitleg: 'Toont de eigenaars in het register' },
schrijf: { argumenten: ['naam', 'label'], uitleg: 'Schrijft een blob weg voor deze eigenaar' },
lees: { argumenten: ['naam'], uitleg: 'Toont de blobs van deze eigenaar' },
test: { argumenten: ['naam'], uitleg: 'Test of de relay deze eigenaar toelaat, zonder te verbinden' },
spiegel: { argumenten: ['naam'], uitleg: 'Haalt deze eigenaar op in een lege database, via de relay' },
sync: { argumenten: ['naam'], uitleg: 'Verbindt en blijft draaien tot Ctrl-C' },
vergeet: { argumenten: ['naam'], uitleg: 'Haalt een eigenaar uit het register' },
ui: { argumenten: [], uitleg: 'Start het bedieningsvlak in de browser' },
};
/**
* Leest `process.argv.slice(2)`.
*
* Geeft `{fout}` in plaats van te gooien: de aanroeper drukt dat af met de
* gebruiksaanwijzing eronder, en dat leest beter dan een stack trace.
*
* Vlaggen zijn `--naam waarde` of `--naam=waarde`. Een losse `--naam` is `true`.
*/
export const leesArgumenten = (argv) => {
const losse = [];
const vlaggen = {};
for (let i = 0; i < argv.length; i += 1) {
const stuk = argv[i];
if (!stuk.startsWith('--')) {
losse.push(stuk);
continue;
}
const kaal = stuk.slice(2);
const isGelijk = kaal.indexOf('=');
if (isGelijk > 0) {
vlaggen[kaal.slice(0, isGelijk)] = kaal.slice(isGelijk + 1);
continue;
}
const volgende = argv[i + 1];
if (volgende !== undefined && !volgende.startsWith('--')) {
vlaggen[kaal] = volgende;
i += 1;
} else {
vlaggen[kaal] = true;
}
}
const [opdracht, ...rest] = losse;
if (opdracht === undefined) return { fout: null, opdracht: null, waarden: {}, vlaggen };
const vorm = OPDRACHTEN[opdracht];
if (!vorm) return { fout: `Onbekende opdracht "${opdracht}".`, opdracht: null, waarden: {}, vlaggen };
if (rest.length < vorm.argumenten.length) {
const ontbreekt = vorm.argumenten.slice(rest.length).join(', ');
return { fout: `"${opdracht}" mist: ${ontbreekt}.`, opdracht, waarden: {}, vlaggen };
}
if (rest.length > vorm.argumenten.length) {
// Streng, en met opzet. `schrijf piet mijn label` ziet er goed uit en zou
// anders stil "mijn" als label nemen; dan sta je te kijken naar een blob die
// anders heet dan je typte.
return {
fout: `"${opdracht}" verwacht ${vorm.argumenten.length} argument(en), niet ${rest.length}. Gebruik aanhalingstekens om een label met spaties.`,
opdracht,
waarden: {},
vlaggen,
};
}
const waarden = {};
vorm.argumenten.forEach((naam, plek) => {
waarden[naam] = rest[plek];
});
return { fout: null, opdracht, waarden, vlaggen };
};
export const gebruiksaanwijzing = () => {
const regels = ['Gebruik: node src/cli.js <opdracht> [argumenten]', ''];
for (const [naam, vorm] of Object.entries(OPDRACHTEN)) {
const argumenten = vorm.argumenten.map((a) => `<${a}>`).join(' ');
regels.push(` ${`${naam} ${argumenten}`.trim().padEnd(24)}${vorm.uitleg}`);
}
regels.push('');
regels.push('Vlaggen:');
regels.push(' --bytes <n> Omvang van de blob bij `schrijf` (standaard 64)');
regels.push(' --lokaal Schrijven zonder de relay, bij `schrijf`');
regels.push(' --wacht <n> Seconden wachten op de relay, bij `spiegel` (standaard 15)');
regels.push(' --poort <n> Poort van het bedieningsvlak bij `ui`');
regels.push('');
regels.push('Het adres van de relay komt uit .env; zie .env.sample.');
return regels.join('\n');
};