feat(notes): notes de commandes, une commande copiee ou tapee a la fois

Modele "commands" : "# titre" ouvre un groupe, chaque ligne est une
commande. Le corps reste du texte (aucune colonne, sync et APK inchanges).
Panneau : liste avec Copier. Recherche rapide : la note s'ouvre sur sa
liste filtrable ; Entree tape la commande sans Entree et sans vider le
champ, Ctrl+Entree copie, Esc revient. Decoupage teste.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-10-10 18:24:49 +01:00
parent 63e532d5bb
commit bbd4e2ef06
7 changed files with 253 additions and 7 deletions
+31
View File
@@ -0,0 +1,31 @@
// Decoupe d'une note de commandes (js/app.js parseCommandNote).
const test = require('node:test');
const assert = require('node:assert/strict');
const { loadApp } = require('./harness.js');
const T = loadApp().__test;
const plain = (x) => JSON.parse(JSON.stringify(x));
test('groupes "# titre", une commande par ligne, lignes vides ignorees', () => {
const r = T.parseCommandNote('# Prod\r\nssh a@1\n\n ssh a@2 \n# Base\npsql -h x\n');
assert.deepEqual(plain(r), [
{ group: 'Prod', cmd: 'ssh a@1' },
{ group: 'Prod', cmd: 'ssh a@2' },
{ group: 'Base', cmd: 'psql -h x' },
]);
});
test('commandes avant tout titre : groupe vide', () => {
assert.equal(T.parseCommandNote('ls -la\n# G\npwd')[0].group, '');
});
test('"## titre" et "#" seul', () => {
const r = T.parseCommandNote('## Deux\na\n#\nb');
assert.equal(r[0].group, 'Deux');
assert.equal(r[1].group, '');
});
test('texte vide ou absent', () => {
assert.equal(T.parseCommandNote('').length, 0);
assert.equal(T.parseCommandNote(null).length, 0);
});