strom-research 1.13.0-beta.1 → 1.13.0-beta.4
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/assets/lang/cs.json +24 -11
- package/assets/lang/de.json +24 -11
- package/assets/method/recording.md +5 -1
- package/dist/cli/format.js +3 -2
- package/dist/cli/help.js +8 -7
- package/dist/cli/main.js +6 -4
- package/dist/cli/menu-links.js +8 -2
- package/dist/cli/menu.js +3 -3
- package/dist/cli/registry.js +20 -3
- package/dist/cli/ui.js +24 -11
- package/dist/cli/wizard.js +12 -6
- package/dist/commands/analysis.js +4 -1
- package/dist/commands/browse.js +1 -1
- package/dist/commands/meta.js +7 -6
- package/dist/commands/output.js +3 -2
- package/dist/commands/people.js +22 -7
- package/dist/commands/setup.js +28 -8
- package/dist/commands/start.js +23 -5
- package/dist/commands/sync.js +19 -14
- package/dist/core/actions.js +55 -13
- package/dist/core/appbrowser.js +2 -2
- package/dist/core/config.js +34 -17
- package/dist/core/git.js +50 -18
- package/dist/core/import.js +57 -16
- package/dist/core/live.js +12 -8
- package/dist/core/overview.js +2 -1
- package/dist/core/people.js +78 -0
- package/dist/core/phrases.js +11 -2
- package/dist/core/stromapp.js +126 -15
- package/dist/core/sync.js +197 -11
- package/dist/core/tree.js +1 -1
- package/dist/core/validate.js +3 -0
- package/dist/gedcom/export.js +24 -2
- package/package.json +1 -1
package/assets/lang/cs.json
CHANGED
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
"ui.menu.trees": "Jiný rodokmen · poslat nebo přijmout",
|
|
95
95
|
"ui.menu.newtree": "Založit rodokmen · poslat nebo přijmout",
|
|
96
96
|
"ui.menu.quit": "Konec",
|
|
97
|
-
"ui.menu.bye": "Na shledanou. Příště stačí spustit: strom",
|
|
97
|
+
"ui.menu.bye": "Na shledanou. Příště stačí spustit: {strom}",
|
|
98
98
|
"ui.run.how": "Kolik úkolů? (skončí dřív, když už nebude co dělat; 0 vrátí zpět)",
|
|
99
99
|
"ui.run.start": "Agent teď pracuje sám. Zastaví ho klávesy Ctrl-C – nic se neztratí.",
|
|
100
100
|
"ui.waiting.none": "Nic nečeká.",
|
|
@@ -118,14 +118,14 @@
|
|
|
118
118
|
"ui.setup.git.ok": "✓ Git (historie výzkumu): {version}",
|
|
119
119
|
"ui.setup.git.missing": "Chybí Git – strom v něm uchovává historii výzkumu, aby se nic neztratilo.",
|
|
120
120
|
"ui.setup.git.wait": "Dokončit instalaci v okně, které se otevřelo, a pak Enter.",
|
|
121
|
-
"ui.setup.git.manual": "Nainstalovat ho příkazem: {command} – a pak znovu spustit strom.",
|
|
121
|
+
"ui.setup.git.manual": "Nainstalovat ho příkazem: {command} – a pak znovu spustit {strom}.",
|
|
122
122
|
"ui.setup.agent.ok": "✓ AI agent: {name}",
|
|
123
123
|
"ui.setup.agent.none": "Nenašel jsem žádného AI agenta – strom ho potřebuje: výzkum se dělá s ním.",
|
|
124
124
|
"ui.setup.agent.install": "Nainstalovat Claude Code hned (doporučeno; je potřeba předplatné Claude)",
|
|
125
125
|
"ui.setup.agent.guide": "Ukázat, jací agenti jsou (otevře stránku v prohlížeči)",
|
|
126
126
|
"ui.setup.agent.later": "Později",
|
|
127
127
|
"ui.setup.agent.login": "Při prvním spuštění agenta přijde přihlášení – otevře se okno prohlížeče.",
|
|
128
|
-
"ui.setup.agent.manual": "Nainstalovat AI agenta (jak: {url}) a pak znovu spustit strom.",
|
|
128
|
+
"ui.setup.agent.manual": "Nainstalovat AI agenta (jak: {url}) a pak znovu spustit {strom}.",
|
|
129
129
|
"ui.setup.model": "Který model má výzkum dělat?",
|
|
130
130
|
"ui.setup.model.opus": "Opus – nejlépe čte staré rukopisy (doporučeno)",
|
|
131
131
|
"ui.setup.model.sonnet": "Sonnet – rychlejší; tištěné dokumenty a běžná práce",
|
|
@@ -275,6 +275,9 @@
|
|
|
275
275
|
"ui.doc.app.seen": "nalezena v počítači",
|
|
276
276
|
"ui.doc.app.no": "není chtěná",
|
|
277
277
|
"ui.doc.app.unknown": "nenalezena",
|
|
278
|
+
"ui.doc.appurl": "adresa aplikace Strom",
|
|
279
|
+
"ui.doc.appurl.config": "nastavení strom.app.url „{value}“ není adresa aplikace Strom – strom app nic neotevře, dokud se neopraví nebo neodebere",
|
|
280
|
+
"ui.doc.appurl.env": "proměnná STROM_APP_URL „{value}“ není adresa aplikace Strom – strom app nic neotevře, dokud se neopraví nebo neodebere",
|
|
278
281
|
"ui.doc.tree.ok": "{name}: data v pořádku a zapečetěná",
|
|
279
282
|
"ui.doc.tree.bad": "{name}: problémů {n}",
|
|
280
283
|
"ui.doc.allok": "Všechno potřebné je na místě.",
|
|
@@ -307,7 +310,7 @@
|
|
|
307
310
|
"ui.o.results.offer": "{file} – pro aplikaci Strom, tady zatím nenainstalovanou: nabídni uživateli instalaci z {url} (strom app install ji tam otevře)",
|
|
308
311
|
"ui.o.results.plain": "{file} – pro jakýkoli program na rodokmeny",
|
|
309
312
|
"ui.chat.handover": "Výzkum pokračuje ve vlastním rozhovoru: otevřelo se nové okno s agentem {agent} ve složce rodokmenu. Dál se pokračuje tam – tento rozhovor jde zavřít.",
|
|
310
|
-
"ui.chat.handover.failed": "Nové okno se tady otevřít nepodařilo. Výzkum jde spustit ručně: v terminálu příkazem strom (nebo zástupcem Strom výzkum na ploše).",
|
|
313
|
+
"ui.chat.handover.failed": "Nové okno se tady otevřít nepodařilo. Výzkum jde spustit ručně: v terminálu příkazem {strom} (nebo zástupcem Strom výzkum na ploše).",
|
|
311
314
|
"ui.chat.handover.end": "Dál se pokračuje tam – tento rozhovor jde zavřít.",
|
|
312
315
|
"ui.why.handover": "výzkum patří do vlastního rozhovoru ve složce rodokmenu (jeho pravidla, bez ptaní u každého kroku): tohle ho otevře – řekni uživateli, ať pokračuje tam; tady pokračuj, jen když chce",
|
|
313
316
|
"ui.app.research": "Otevírám výzkum {name} v aplikaci Strom ({where}): poprvé jako nový rodokmen, příště se tentýž rodokmen aktualizuje.",
|
|
@@ -453,7 +456,7 @@
|
|
|
453
456
|
"ui.doc.backup": "záloha",
|
|
454
457
|
"ui.backup.made": "Záloha před přechodem z {from} na {to}: {path} ({size}).",
|
|
455
458
|
"ui.backup.last": "Poslední záloha (před přechodem z {from} na {to}, {date}): {path}",
|
|
456
|
-
"ui.backup.readme": "Strom výzkum – záloha\n\nVytvořena {date}, před přechodem ze stromu {from} na {to}.\n\nUvnitř:\n- trees: všechny rodokmeny tohoto počítače, každý celou svou složkou i s historií (.git);\n- settings: nastavení stromu s klíči pečetí a přihlášeními, jak byly na tomto počítači.\n\nNení uvnitř: sdílené obrázky (složka shared/media). Každý je tam uložen podle svého obsahu a strom žádný nemaže; každá verze stromu čte tytéž. Vynecháno je i to, co strom vytvoří znovu sám (náhledy skenů, výřezy).\n\nVrácení rodokmenu: zkopírovat jeho složku z trees zpět tam, kde rodokmeny jsou (místo té, která tam je, nebo vedle ní pod jiným jménem), a spustit strom: strom ho zkontroluje (strom check).",
|
|
459
|
+
"ui.backup.readme": "Strom výzkum – záloha\n\nVytvořena {date}, před přechodem ze stromu {from} na {to}.\n\nUvnitř:\n- trees: všechny rodokmeny tohoto počítače, každý celou svou složkou i s historií (.git);\n- settings: nastavení stromu s klíči pečetí a přihlášeními, jak byly na tomto počítači.\n\nNení uvnitř: sdílené obrázky (složka shared/media). Každý je tam uložen podle svého obsahu a strom žádný nemaže; každá verze stromu čte tytéž. Vynecháno je i to, co strom vytvoří znovu sám (náhledy skenů, výřezy).\n\nVrácení rodokmenu: zkopírovat jeho složku z trees zpět tam, kde rodokmeny jsou (místo té, která tam je, nebo vedle ní pod jiným jménem), a spustit {strom}: strom ho zkontroluje ({strom} check).",
|
|
457
460
|
"ui.trees.locked": "zamčeno: zapsal strom {by}",
|
|
458
461
|
"ui.setup.stromapp": "Aplikace Strom (zdarma, v prohlížeči) ukáže výzkum jako rodokmen – u každého zápisu jeho obrázek vyříznutý ze skenu, příběhy předků – a když agent pracuje, sleduje výzkum živě. Používat ji?",
|
|
459
462
|
"ui.setup.stromapp.install": "Ano – nainstalovat ji teď (otevře se v prohlížeči, strom řekne, kam kliknout)",
|
|
@@ -654,7 +657,7 @@
|
|
|
654
657
|
"ui.help.archive.stats": "Archiv v kostce: osoby, jak jisté jsou údaje, předkové v každé generaci",
|
|
655
658
|
"ui.help.archive.pack": "Zabalit archiv do jednoho souboru ZIP, aby v něm mohl pokračovat někdo jiný",
|
|
656
659
|
"ui.help.archive.intake": "Přidat podklady od rodiny: dokumenty, fotky, rodokmen, co je známo",
|
|
657
|
-
"ui.help.title": "strom <příkaz> – co člověk se stromem dělá (nebo jen strom: menu)",
|
|
660
|
+
"ui.help.title": "{strom} <příkaz> – co člověk se stromem dělá (nebo jen {strom}: menu)",
|
|
658
661
|
"ui.help.more": "Nápověda k jednomu příkazu: strom help <příkaz> --human · všechny příkazy anglicky (co čte agent): strom help",
|
|
659
662
|
"ui.help.more.archive": "Nápověda k jednomu příkazu: strom help <příkaz> --human",
|
|
660
663
|
"ui.help.examples": "Příklady:",
|
|
@@ -755,6 +758,9 @@
|
|
|
755
758
|
"ui.sync.name.new": "{n}. {who}: další jméno — {text}",
|
|
756
759
|
"ui.sync.name.changed": "{n}. {who}: změněné jméno — {old} → {new}",
|
|
757
760
|
"ui.sync.do.name.user": "platí úprava z aplikace: osoba se ukazuje pod novým jménem, jméno ze záznamu zůstane vedle něj",
|
|
761
|
+
"ui.sync.name.title": "{n}. {who}: {title} — {old} → {new}",
|
|
762
|
+
"ui.sync.do.title": "doplní se ke jménu s odkazem na strom z aplikace",
|
|
763
|
+
"ui.sync.do.title.user": "platí úprava z aplikace (verze výzkumu zůstane v historii)",
|
|
758
764
|
"ui.sync.sex.changed": "{n}. {who}: pohlaví {text}",
|
|
759
765
|
"ui.sync.note.new": "{n}. {who}: poznámka — „{text}“",
|
|
760
766
|
"ui.sync.source.new": "{n}. pramen: „{text}“",
|
|
@@ -1004,8 +1010,8 @@
|
|
|
1004
1010
|
"ui.link.off.done": "Odkazy z aplikace Strom už do výzkumu na tomto počítači nevedou.",
|
|
1005
1011
|
"ui.link.off.failed": "Odkazy z aplikace Strom se z tohoto počítače nepodařilo odebrat.",
|
|
1006
1012
|
"ui.link.which.one": "Tento výzkum je tu vícekrát. Který?",
|
|
1007
|
-
"ui.link.noterminal.any": "strom nemohl otevřít okno terminálu. Spustit strom (výzkum {name}) a pokračovat z jeho nabídky.",
|
|
1008
|
-
"ui.link.noterminal.new": "strom nemohl otevřít okno terminálu. Spustit strom a pak to zkusit z aplikace Strom znovu.",
|
|
1013
|
+
"ui.link.noterminal.any": "strom nemohl otevřít okno terminálu. Spustit {strom} (výzkum {name}) a pokračovat z jeho nabídky.",
|
|
1014
|
+
"ui.link.noterminal.new": "strom nemohl otevřít okno terminálu. Spustit {strom} a pak to zkusit z aplikace Strom znovu.",
|
|
1009
1015
|
"ui.link.asks": "Aplikace Strom žádá: {what}\nVýzkum: {name}",
|
|
1010
1016
|
"ui.link.go": "Pokračovat?",
|
|
1011
1017
|
"ui.link.cost": "Agent pracuje na předplatné nebo kredit AI.",
|
|
@@ -1399,7 +1405,7 @@
|
|
|
1399
1405
|
"ui.unpack.kept": " konektor {name} tu už byl – zůstává ten dosavadní",
|
|
1400
1406
|
"ui.unpack.left": " prohledané stránky, které v něm nejsou: {n} – až budou potřeba, strom je stáhne z archivu",
|
|
1401
1407
|
"ui.unpack.adopted": " převzato na tento počítač",
|
|
1402
|
-
"ui.unpack.next": "Dál: strom (nabídka) nebo strom chat.",
|
|
1408
|
+
"ui.unpack.next": "Dál: {strom} (nabídka) nebo strom chat.",
|
|
1403
1409
|
"ui.unpack.same": "tento výzkum už tu je: {root}",
|
|
1404
1410
|
"ui.unpack.person": "výzkum rozbaluje jen člověk u počítače (přidává konektory)",
|
|
1405
1411
|
"ui.pack.launch.extract": "Nejdřív rozbalit celý soubor ZIP – ve Windows pravým tlačítkem: Extrahovat vše – a spustit tohle znovu z rozbalené složky.",
|
|
@@ -1457,7 +1463,7 @@
|
|
|
1457
1463
|
"ui.error.command.unknown": "neznámý příkaz „strom {cmd}“",
|
|
1458
1464
|
"ui.error.command.unknown.hint": "strom help (všechny příkazy)",
|
|
1459
1465
|
"ui.error.command.unknown.person": "neznámý příkaz „strom {cmd}“",
|
|
1460
|
-
"ui.error.command.unknown.person.hint": "strom help --human – nebo jen strom: menu",
|
|
1466
|
+
"ui.error.command.unknown.person.hint": "strom help --human – nebo jen {strom}: menu",
|
|
1461
1467
|
"ui.error.option.near": "neznámá volba {opt} u {cmd}",
|
|
1462
1468
|
"ui.error.option.near.hint": "podobná volba: {near}",
|
|
1463
1469
|
"ui.conflict.none": "žádné otevřené rozpory",
|
|
@@ -1465,6 +1471,8 @@
|
|
|
1465
1471
|
"ui.conflict.sex": "pohlaví",
|
|
1466
1472
|
"ui.conflict.sex.U": "neznámé",
|
|
1467
1473
|
"ui.conflict.name": "jméno",
|
|
1474
|
+
"ui.conflict.titleBefore": "titul před jménem",
|
|
1475
|
+
"ui.conflict.titleAfter": "titul za jménem",
|
|
1468
1476
|
"ui.conflict.parents": "rodiče",
|
|
1469
1477
|
"ui.sync.family.union": "{n}. {who}: svazek – {union}",
|
|
1470
1478
|
"ui.sync.do.family.union": "převezme se (žádný záznam ho nedokládá)",
|
|
@@ -1491,6 +1499,10 @@
|
|
|
1491
1499
|
"ui.error.arg.missing": "chybí <{arg}>",
|
|
1492
1500
|
"ui.error.arg.missing.hint": "strom help {cmd}",
|
|
1493
1501
|
"ui.error.prefix": "chyba",
|
|
1502
|
+
"ui.error.config.app-url": "neplatné strom.app.url „{value}“: není to adresa aplikace Strom",
|
|
1503
|
+
"ui.error.config.app-url.hint": "aplikace Strom: {web}, nebo její kopie na tomto počítači http://127.0.0.1:<port>/",
|
|
1504
|
+
"ui.error.config.app-url.config.hint": "aplikace Strom: {web}, nebo její kopie na tomto počítači http://127.0.0.1:<port>/\nopravit: strom config set strom.app.url <adresa> – nebo odebrat: strom config unset strom.app.url",
|
|
1505
|
+
"ui.error.config.app-url.env.hint": "aplikace Strom: {web}, nebo její kopie na tomto počítači http://127.0.0.1:<port>/\nproměnnou STROM_APP_URL opravit, nebo odebrat",
|
|
1494
1506
|
"ui.error.backup.failed": "Zálohu před přechodem z {from} na {to} se nepodařilo vytvořit: {detail}. Nic se nepřepíná: tento strom neotevře žádný rodokmen k zápisu, dokud záloha nebude hotová.",
|
|
1495
1507
|
"ui.error.backup.failed.hint": "Uvolnit místo na disku ({where}) a spustit strom znovu – nebo se vrátit: strom update --channel {back}",
|
|
1496
1508
|
"ui.error.backup.failed.update": "Zálohu před přechodem z {from} na {to} se nepodařilo vytvořit: {detail}. Nic se nenainstalovalo.",
|
|
@@ -1582,6 +1594,7 @@
|
|
|
1582
1594
|
"ui.arg.tree-name": "název",
|
|
1583
1595
|
"ui.arg.url": "adresa",
|
|
1584
1596
|
"ui.arg.value": "hodnota",
|
|
1597
|
+
"ui.arg.address": "adresa",
|
|
1585
1598
|
"ui.arg.what": "co",
|
|
1586
1599
|
"ui.arg.where": "kde",
|
|
1587
1600
|
"ui.arg.who": "kdo",
|
|
@@ -1609,7 +1622,7 @@
|
|
|
1609
1622
|
"ui.error.event.needs-reason.hint": "např. --reason \"záznam S0012 uvádí 1811, ne 1813\"",
|
|
1610
1623
|
"ui.error.family.needs-reason": "změna toho, kdo do rodiny patří nebo jak, potřebuje --reason",
|
|
1611
1624
|
"ui.error.family.needs-reason.hint": "např. --reason \"křest uvádí Jana jako otčíma\"",
|
|
1612
|
-
"ui.error.person.needs-reason": "změna jména nebo známého pohlaví potřebuje --reason",
|
|
1625
|
+
"ui.error.person.needs-reason": "změna jména, jeho titulu nebo známého pohlaví potřebuje --reason",
|
|
1613
1626
|
"ui.error.person.needs-reason.hint": "např. --reason \"špatně přečteno: matrika má Novák, ne Nowak\"",
|
|
1614
1627
|
"ui.error.retract.needs-reason": "stažení potřebuje --reason",
|
|
1615
1628
|
"ui.error.retract.needs-reason.hint": "např. --reason \"špatně přečteno: zápis uvádí Annu, ne Antona\"",
|
package/assets/lang/de.json
CHANGED
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
"ui.menu.trees": "Anderer Stammbaum · einen schicken oder empfangen",
|
|
95
95
|
"ui.menu.newtree": "Stammbaum anlegen · einen schicken oder empfangen",
|
|
96
96
|
"ui.menu.quit": "Beenden",
|
|
97
|
-
"ui.menu.bye": "Auf Wiedersehen. Nächstes Mal genügt: strom",
|
|
97
|
+
"ui.menu.bye": "Auf Wiedersehen. Nächstes Mal genügt: {strom}",
|
|
98
98
|
"ui.run.how": "Wie viele Aufgaben? (er hört früher auf, wenn es nichts mehr zu tun gibt; 0 geht zurück)",
|
|
99
99
|
"ui.run.start": "Der Agent arbeitet jetzt allein. Strg-C hält ihn an – nichts geht verloren.",
|
|
100
100
|
"ui.waiting.none": "Nichts wartet.",
|
|
@@ -118,14 +118,14 @@
|
|
|
118
118
|
"ui.setup.git.ok": "✓ Git (Verlauf der Forschung): {version}",
|
|
119
119
|
"ui.setup.git.missing": "Git fehlt – strom bewahrt darin den Verlauf der Forschung auf, damit nichts verloren geht.",
|
|
120
120
|
"ui.setup.git.wait": "Die Installation im geöffneten Fenster abschließen, dann Enter drücken.",
|
|
121
|
-
"ui.setup.git.manual": "Installation mit: {command} – dann strom erneut starten.",
|
|
121
|
+
"ui.setup.git.manual": "Installation mit: {command} – dann {strom} erneut starten.",
|
|
122
122
|
"ui.setup.agent.ok": "✓ KI-Agent: {name}",
|
|
123
123
|
"ui.setup.agent.none": "Kein KI-Agent gefunden – strom braucht einen: der Agent führt die Forschung im Gespräch.",
|
|
124
124
|
"ui.setup.agent.install": "Claude Code jetzt installieren (empfohlen; nötig ist ein Claude-Abonnement)",
|
|
125
125
|
"ui.setup.agent.guide": "Zeigen, welche Agenten es gibt (öffnet eine Seite im Browser)",
|
|
126
126
|
"ui.setup.agent.later": "Später",
|
|
127
127
|
"ui.setup.agent.login": "Beim ersten Start des Agenten ist eine Anmeldung nötig – ein Browserfenster öffnet sich.",
|
|
128
|
-
"ui.setup.agent.manual": "Einen KI-Agenten installieren (wie: {url}), dann strom erneut starten.",
|
|
128
|
+
"ui.setup.agent.manual": "Einen KI-Agenten installieren (wie: {url}), dann {strom} erneut starten.",
|
|
129
129
|
"ui.setup.model": "Welches Modell soll die Forschung machen?",
|
|
130
130
|
"ui.setup.model.opus": "Opus – liest alte Handschriften am besten (empfohlen)",
|
|
131
131
|
"ui.setup.model.sonnet": "Sonnet – schneller; gedruckte Dokumente und alltägliche Arbeit",
|
|
@@ -275,6 +275,9 @@
|
|
|
275
275
|
"ui.doc.app.seen": "auf dem Computer gefunden",
|
|
276
276
|
"ui.doc.app.no": "nicht gewünscht",
|
|
277
277
|
"ui.doc.app.unknown": "nicht gefunden",
|
|
278
|
+
"ui.doc.appurl": "Adresse der Strom-App",
|
|
279
|
+
"ui.doc.appurl.config": "die Einstellung strom.app.url „{value}“ ist keine Adresse der Strom-App – strom app öffnet nichts, bis sie berichtigt oder entfernt ist",
|
|
280
|
+
"ui.doc.appurl.env": "die Variable STROM_APP_URL „{value}“ ist keine Adresse der Strom-App – strom app öffnet nichts, bis sie berichtigt oder entfernt ist",
|
|
278
281
|
"ui.doc.tree.ok": "{name}: Daten in Ordnung und versiegelt",
|
|
279
282
|
"ui.doc.tree.bad": "{name}: Probleme: {n}",
|
|
280
283
|
"ui.doc.allok": "Alles Nötige ist vorhanden.",
|
|
@@ -307,7 +310,7 @@
|
|
|
307
310
|
"ui.o.results.offer": "{file} – für die Strom-App, hier noch nicht installiert: biete dem Benutzer die Installation von {url} an (strom app install öffnet sie dort)",
|
|
308
311
|
"ui.o.results.plain": "{file} – für jedes Stammbaumprogramm",
|
|
309
312
|
"ui.chat.handover": "Die Forschung geht in einem eigenen Gespräch weiter: Ein neues Fenster mit {agent} im Ordner des Stammbaums hat sich geöffnet. Dort geht es weiter – dieses Gespräch kann enden.",
|
|
310
|
-
"ui.chat.handover.failed": "Ein neues Fenster ließ sich hier nicht öffnen. Die Forschung von Hand starten: strom im Terminal (oder die Verknüpfung Strom Ahnenforschung auf dem Desktop).",
|
|
313
|
+
"ui.chat.handover.failed": "Ein neues Fenster ließ sich hier nicht öffnen. Die Forschung von Hand starten: {strom} im Terminal (oder die Verknüpfung Strom Ahnenforschung auf dem Desktop).",
|
|
311
314
|
"ui.chat.handover.end": "Dort geht es weiter – dieses Gespräch kann enden.",
|
|
312
315
|
"ui.why.handover": "die Forschung gehört in ein eigenes Gespräch im Ordner des Stammbaums (seine Regeln, keine Nachfrage bei jedem Schritt): dies öffnet es – sag dem Benutzer, dort weiterzumachen; hier nur, wenn er will",
|
|
313
316
|
"ui.app.research": "Die Forschung {name} wird in der Strom-App geöffnet ({where}): beim ersten Mal als neuer Stammbaum, danach wird derselbe Stammbaum aktualisiert.",
|
|
@@ -453,7 +456,7 @@
|
|
|
453
456
|
"ui.doc.backup": "Sicherung",
|
|
454
457
|
"ui.backup.made": "Sicherung vor dem Wechsel von {from} auf {to}: {path} ({size}).",
|
|
455
458
|
"ui.backup.last": "Letzte Sicherung (vor dem Wechsel von {from} auf {to}, {date}): {path}",
|
|
456
|
-
"ui.backup.readme": "Strom-Forschung – eine Sicherung\n\nErstellt {date}, vor dem Wechsel von strom {from} auf {to}.\n\nDarin:\n- trees: alle Stammbäume dieses Computers, jeder mit seinem ganzen Ordner samt Verlauf (.git);\n- settings: die Einstellungen von strom mit den Siegelschlüsseln und den Anmeldungen, wie sie auf diesem Computer waren.\n\nNicht darin: die gemeinsamen Bilder (der Ordner shared/media). Jedes liegt dort nach seinem Inhalt, und strom löscht keines; jede Version von strom liest dieselben. Ebenfalls weggelassen: was strom selbst wieder erstellt (Ansichten von Scans, Ausschnitte).\n\nEinen Stammbaum zurückholen: seinen Ordner aus trees dorthin zurückkopieren, wo die Stammbäume liegen (anstelle des vorhandenen oder daneben unter anderem Namen), dann strom starten: strom prüft ihn (strom check).",
|
|
459
|
+
"ui.backup.readme": "Strom-Forschung – eine Sicherung\n\nErstellt {date}, vor dem Wechsel von strom {from} auf {to}.\n\nDarin:\n- trees: alle Stammbäume dieses Computers, jeder mit seinem ganzen Ordner samt Verlauf (.git);\n- settings: die Einstellungen von strom mit den Siegelschlüsseln und den Anmeldungen, wie sie auf diesem Computer waren.\n\nNicht darin: die gemeinsamen Bilder (der Ordner shared/media). Jedes liegt dort nach seinem Inhalt, und strom löscht keines; jede Version von strom liest dieselben. Ebenfalls weggelassen: was strom selbst wieder erstellt (Ansichten von Scans, Ausschnitte).\n\nEinen Stammbaum zurückholen: seinen Ordner aus trees dorthin zurückkopieren, wo die Stammbäume liegen (anstelle des vorhandenen oder daneben unter anderem Namen), dann {strom} starten: strom prüft ihn ({strom} check).",
|
|
457
460
|
"ui.trees.locked": "gesperrt: geschrieben von strom {by}",
|
|
458
461
|
"ui.setup.stromapp": "Die Strom-App (kostenlos, im Browser) zeigt die Forschung als Stammbaum – jeden Eintrag mit seinem Bild aus dem Scan, die Geschichten der Vorfahren – und verfolgt sie live, während der Agent arbeitet. Soll sie verwendet werden?",
|
|
459
462
|
"ui.setup.stromapp.install": "Ja – jetzt installieren (sie öffnet sich im Browser, strom zeigt, wo zu klicken ist)",
|
|
@@ -654,7 +657,7 @@
|
|
|
654
657
|
"ui.help.archive.stats": "Das Archiv auf einen Blick: Personen, wie sicher die Angaben sind, Vorfahren je Generation",
|
|
655
658
|
"ui.help.archive.pack": "Das Archiv in eine ZIP-Datei packen, damit jemand anderes weitermachen kann",
|
|
656
659
|
"ui.help.archive.intake": "Material der Familie hinzufügen: Dokumente, Fotos, einen Stammbaum, eigenes Wissen",
|
|
657
|
-
"ui.help.title": "strom <Befehl> – was ein Mensch mit strom tut (oder nur strom: das Menü)",
|
|
660
|
+
"ui.help.title": "{strom} <Befehl> – was ein Mensch mit strom tut (oder nur {strom}: das Menü)",
|
|
658
661
|
"ui.help.more": "Hilfe zu einem Befehl: strom help <Befehl> --human · alle Befehle auf Englisch (was ein Agent liest): strom help",
|
|
659
662
|
"ui.help.more.archive": "Hilfe zu einem Befehl: strom help <Befehl> --human",
|
|
660
663
|
"ui.help.examples": "Beispiele:",
|
|
@@ -755,6 +758,9 @@
|
|
|
755
758
|
"ui.sync.name.new": "{n}. {who}: ein weiterer Name — {text}",
|
|
756
759
|
"ui.sync.name.changed": "{n}. {who}: Name geändert — {old} → {new}",
|
|
757
760
|
"ui.sync.do.name.user": "Die eigene Änderung gilt: die Person erscheint unter dem neuen Namen, der Name aus dem Eintrag bleibt daneben",
|
|
761
|
+
"ui.sync.name.title": "{n}. {who}: {title} — {old} → {new}",
|
|
762
|
+
"ui.sync.do.title": "wird dem Namen hinzugefügt, mit Verweis auf den eigenen Stammbaum",
|
|
763
|
+
"ui.sync.do.title.user": "Die eigene Änderung gilt (die der Forschung bleibt in ihrer Geschichte)",
|
|
758
764
|
"ui.sync.sex.changed": "{n}. {who}: Geschlecht {text}",
|
|
759
765
|
"ui.sync.note.new": "{n}. {who}: eine Notiz — „{text}“",
|
|
760
766
|
"ui.sync.source.new": "{n}. eine Quelle: „{text}“",
|
|
@@ -1004,8 +1010,8 @@
|
|
|
1004
1010
|
"ui.link.off.done": "Links aus der Strom-App führen hier nicht mehr zur Forschung.",
|
|
1005
1011
|
"ui.link.off.failed": "Die Links aus der Strom-App ließen sich von diesem Computer nicht entfernen.",
|
|
1006
1012
|
"ui.link.which.one": "Diese Forschung ist hier mehrmals vorhanden. Welche?",
|
|
1007
|
-
"ui.link.noterminal.any": "strom konnte kein Terminalfenster öffnen. strom starten (die Forschung {name}) und in seinem Menü weitermachen.",
|
|
1008
|
-
"ui.link.noterminal.new": "strom konnte kein Terminalfenster öffnen. strom starten und es dann erneut aus der Strom-App versuchen.",
|
|
1013
|
+
"ui.link.noterminal.any": "strom konnte kein Terminalfenster öffnen. {strom} starten (die Forschung {name}) und in seinem Menü weitermachen.",
|
|
1014
|
+
"ui.link.noterminal.new": "strom konnte kein Terminalfenster öffnen. {strom} starten und es dann erneut aus der Strom-App versuchen.",
|
|
1009
1015
|
"ui.link.asks": "Die Strom-App bittet um: {what}\nForschung: {name}",
|
|
1010
1016
|
"ui.link.go": "Fortfahren?",
|
|
1011
1017
|
"ui.link.cost": "Der Agent arbeitet auf das eigene Abonnement oder KI-Guthaben.",
|
|
@@ -1399,7 +1405,7 @@
|
|
|
1399
1405
|
"ui.unpack.kept": " Konnektor {name} war schon da – der vorhandene bleibt",
|
|
1400
1406
|
"ui.unpack.left": " {n} durchgesehene Seiten sind nicht darin: strom lädt sie aus dem Archiv, wenn sie gebraucht werden",
|
|
1401
1407
|
"ui.unpack.adopted": " auf diesem Computer übernommen",
|
|
1402
|
-
"ui.unpack.next": "Weiter: strom (das Menü) oder strom chat.",
|
|
1408
|
+
"ui.unpack.next": "Weiter: {strom} (das Menü) oder strom chat.",
|
|
1403
1409
|
"ui.unpack.same": "diese Forschung ist schon da: {root}",
|
|
1404
1410
|
"ui.unpack.person": "eine Forschung packt nur die Person am Computer aus (sie fügt Konnektoren hinzu)",
|
|
1405
1411
|
"ui.pack.launch.extract": "Zuerst die ganze ZIP-Datei auspacken – unter Windows mit Rechtsklick: Alle extrahieren – und dies dann im ausgepackten Ordner neu starten.",
|
|
@@ -1457,7 +1463,7 @@
|
|
|
1457
1463
|
"ui.error.command.unknown": "unbekannter Befehl „strom {cmd}“",
|
|
1458
1464
|
"ui.error.command.unknown.hint": "strom help (alle Befehle)",
|
|
1459
1465
|
"ui.error.command.unknown.person": "unbekannter Befehl „strom {cmd}“",
|
|
1460
|
-
"ui.error.command.unknown.person.hint": "strom help --human – oder nur strom: das Menü",
|
|
1466
|
+
"ui.error.command.unknown.person.hint": "strom help --human – oder nur {strom}: das Menü",
|
|
1461
1467
|
"ui.error.option.near": "unbekannte Option {opt} für {cmd}",
|
|
1462
1468
|
"ui.error.option.near.hint": "ähnliche Option: {near}",
|
|
1463
1469
|
"ui.conflict.none": "keine offenen Widersprüche",
|
|
@@ -1465,6 +1471,8 @@
|
|
|
1465
1471
|
"ui.conflict.sex": "Geschlecht",
|
|
1466
1472
|
"ui.conflict.sex.U": "unbekannt",
|
|
1467
1473
|
"ui.conflict.name": "Name",
|
|
1474
|
+
"ui.conflict.titleBefore": "Titel vor dem Namen",
|
|
1475
|
+
"ui.conflict.titleAfter": "Titel nach dem Namen",
|
|
1468
1476
|
"ui.conflict.parents": "Eltern",
|
|
1469
1477
|
"ui.sync.family.union": "{n}. {who}: Verbindung – {union}",
|
|
1470
1478
|
"ui.sync.do.family.union": "übernommen (kein Eintrag belegt es)",
|
|
@@ -1491,6 +1499,10 @@
|
|
|
1491
1499
|
"ui.error.arg.missing": "<{arg}> fehlt",
|
|
1492
1500
|
"ui.error.arg.missing.hint": "strom help {cmd}",
|
|
1493
1501
|
"ui.error.prefix": "Fehler",
|
|
1502
|
+
"ui.error.config.app-url": "ungültige strom.app.url „{value}“: keine Adresse der Strom-App",
|
|
1503
|
+
"ui.error.config.app-url.hint": "die Strom-App: {web}, oder eine Kopie auf diesem Computer http://127.0.0.1:<port>/",
|
|
1504
|
+
"ui.error.config.app-url.config.hint": "die Strom-App: {web}, oder eine Kopie auf diesem Computer http://127.0.0.1:<port>/\nberichtigen: strom config set strom.app.url <Adresse> – oder entfernen: strom config unset strom.app.url",
|
|
1505
|
+
"ui.error.config.app-url.env.hint": "die Strom-App: {web}, oder eine Kopie auf diesem Computer http://127.0.0.1:<port>/\ndie Variable STROM_APP_URL berichtigen oder entfernen",
|
|
1494
1506
|
"ui.error.backup.failed": "Die Sicherung vor dem Wechsel von {from} auf {to} ließ sich nicht erstellen: {detail}. Es wird nichts umgestellt: dieses strom öffnet keinen Stammbaum zum Schreiben, bis die Sicherung erstellt ist.",
|
|
1495
1507
|
"ui.error.backup.failed.hint": "Platz auf dem Datenträger freimachen ({where}) und strom erneut starten – oder zurück: strom update --channel {back}",
|
|
1496
1508
|
"ui.error.backup.failed.update": "Die Sicherung vor dem Wechsel von {from} auf {to} ließ sich nicht erstellen: {detail}. Es wurde nichts installiert.",
|
|
@@ -1582,6 +1594,7 @@
|
|
|
1582
1594
|
"ui.arg.tree-name": "Name",
|
|
1583
1595
|
"ui.arg.url": "Adresse",
|
|
1584
1596
|
"ui.arg.value": "Wert",
|
|
1597
|
+
"ui.arg.address": "Adresse",
|
|
1585
1598
|
"ui.arg.what": "was",
|
|
1586
1599
|
"ui.arg.where": "wo",
|
|
1587
1600
|
"ui.arg.who": "wer",
|
|
@@ -1609,7 +1622,7 @@
|
|
|
1609
1622
|
"ui.error.event.needs-reason.hint": "z. B. --reason \"Eintrag S0012 nennt 1811, nicht 1813\"",
|
|
1610
1623
|
"ui.error.family.needs-reason": "wer zur Familie gehört oder wie, ändert sich nur mit --reason",
|
|
1611
1624
|
"ui.error.family.needs-reason.hint": "z. B. --reason \"die Taufe nennt Jan als Stiefvater\"",
|
|
1612
|
-
"ui.error.person.needs-reason": "ein Name oder ein bekanntes Geschlecht ändert sich nur mit --reason",
|
|
1625
|
+
"ui.error.person.needs-reason": "ein Name, sein Titel oder ein bekanntes Geschlecht ändert sich nur mit --reason",
|
|
1613
1626
|
"ui.error.person.needs-reason.hint": "z. B. --reason \"falsch gelesen: im Register steht Novák, nicht Nowak\"",
|
|
1614
1627
|
"ui.error.retract.needs-reason": "Zurückziehen braucht --reason",
|
|
1615
1628
|
"ui.error.retract.needs-reason.hint": "z. B. --reason \"falsch gelesen: der Eintrag nennt Anna, nicht Anton\"",
|
|
@@ -25,7 +25,11 @@ without --dry-run. `#name` labels what a line creates, `@name` uses it later.
|
|
|
25
25
|
and what the record adds to it: `event edit E… --age husband:27 --age wife:17
|
|
26
26
|
--house 21 --with "witness:…" --with "officiant:…"` (filling in needs no reason).
|
|
27
27
|
- The names a record gives go on the person: `name add` (a maiden name completes
|
|
28
|
-
"Marie" to "Marie /Svobodová/"; a married name is `--kind married`).
|
|
28
|
+
"Marie" to "Marie /Svobodová/"; a married name is `--kind married`). A title
|
|
29
|
+
written with the name ("Ing.", "MUDr.", "ml.", "jun.") is the name's `--prefix`
|
|
30
|
+
or `--suffix` (`person add`, `name add`, `person edit`), never part of the
|
|
31
|
+
given name or the surname; a rank or office the record states is a fact
|
|
32
|
+
(`TITL`, `OCCU`).
|
|
29
33
|
- A record that names someone's parents (a grandchild's baptism naming the
|
|
30
34
|
grandparents) cites the family itself (`family add … --cite`, `cite F…`) and
|
|
31
35
|
the new people's names (`person add … --cite`) — with `--information
|
package/dist/cli/format.js
CHANGED
|
@@ -53,14 +53,15 @@ export function shellArg(arg) {
|
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
55
|
* The commands a text names, as a second installation is started (strom-beta doctor, not strom doctor): `strom`
|
|
56
|
-
* before one of strom's own commands (`words`) — never the word in a sentence ("Tento strom ho…"), never a path
|
|
56
|
+
* before one of strom's own commands (`words`) — never the word in a sentence ("Tento strom ho…"), never a path or a
|
|
57
|
+
* file (strom doctor.txt); at the end of a sentence too (strom chat.).
|
|
57
58
|
*/
|
|
58
59
|
export function asCommand(text, name, words) {
|
|
59
60
|
if (!words.length)
|
|
60
61
|
return text;
|
|
61
62
|
const alt = [...new Set(words)].map((w) => w.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|");
|
|
62
63
|
// (after an opening quote of any language too: „strom person xyz“, «strom …»)
|
|
63
|
-
return text.replace(new RegExp(`(^|[\\s"'\`(\\[→:=„“«»‚‘])strom(?= (?:${alt})(?![\\p{L}\\p{M}\\p{N}_
|
|
64
|
+
return text.replace(new RegExp(`(^|[\\s"'\`(\\[→:=„“«»‚‘])strom(?= (?:${alt})(?![\\p{L}\\p{M}\\p{N}_/\\\\-]|\\.[\\p{L}\\p{M}\\p{N}_]))`, "gu"), `$1${name}`);
|
|
64
65
|
}
|
|
65
66
|
/** asCommand over a JSON answer: the command lines in it (a value that is one: "strom …") and the hints. */
|
|
66
67
|
export function asCommandJson(json, name, words) {
|
package/dist/cli/help.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Help text generated from the registry. Short by design: examples first,
|
|
2
2
|
// then arguments and options.
|
|
3
|
-
import { GROUPS, GLOBAL_OPTIONS, WRITE_OPTIONS, commands, match, subcommandsOf, usageLine } from "./registry.js";
|
|
3
|
+
import { GROUPS, GLOBAL_OPTIONS, WRITE_OPTIONS, commands, descriptionOf, match, subcommandsOf, usageLine } from "./registry.js";
|
|
4
4
|
import { table } from "./format.js";
|
|
5
5
|
import { suggest } from "./execute.js";
|
|
6
6
|
import { UI, ui } from "./ui.js";
|
|
@@ -43,13 +43,14 @@ function inArchive(def) {
|
|
|
43
43
|
return own;
|
|
44
44
|
return AI_WORDS.test(def.summary) ? undefined : def.summary;
|
|
45
45
|
}
|
|
46
|
-
export function commandHelp(def, archive
|
|
46
|
+
export function commandHelp(def, archive, appUrl) {
|
|
47
47
|
const summary = archive ? inArchive(def) : def.summary;
|
|
48
48
|
if (summary === undefined)
|
|
49
49
|
return `strom ${def.path.join(" ")}: not in an archive (research is switched on by the user: strom mode research)`;
|
|
50
50
|
const out = [usageLine(def), "", summary];
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
const description = descriptionOf(def, appUrl);
|
|
52
|
+
if (description && !(archive && AI_WORDS.test(description)))
|
|
53
|
+
out.push("", description);
|
|
53
54
|
const examples = (def.examples ?? []).filter((e) => !(archive && AI_WORDS.test(e)));
|
|
54
55
|
if (examples.length)
|
|
55
56
|
out.push("", "Examples:", ...examples.map((e) => ` ${e}`));
|
|
@@ -111,14 +112,14 @@ export function overview(archive = false) {
|
|
|
111
112
|
out.push("", "One command — usage, examples, options: strom help <command>", archive ? "Each command with what it does: strom commands <group>" : "Each command with what it does: strom commands [<group>] · with options and examples: strom commands <group> --json");
|
|
112
113
|
return out.join("\n");
|
|
113
114
|
}
|
|
114
|
-
export function helpFor(input, archive
|
|
115
|
+
export function helpFor(input, archive, appUrl) {
|
|
115
116
|
// "strom help 'research new'" — one quoted argument with several words.
|
|
116
117
|
const words = input.flatMap((w) => w.trim().split(/\s+/)).filter(Boolean);
|
|
117
118
|
if (words.length === 0)
|
|
118
119
|
return overview(archive);
|
|
119
120
|
const found = match(words);
|
|
120
121
|
if (found && found.used === words.length)
|
|
121
|
-
return commandHelp(found.def, archive);
|
|
122
|
+
return commandHelp(found.def, archive, appUrl);
|
|
122
123
|
if (subcommandsOf(words).length > 0)
|
|
123
124
|
return groupHelp(words, archive);
|
|
124
125
|
const all = commands().filter((c) => c.path.length > 0).map((c) => c.path.join(" "));
|
|
@@ -185,7 +186,7 @@ function pointer(words, as) {
|
|
|
185
186
|
export function helpAs(input, as) {
|
|
186
187
|
const words = input.flatMap((w) => w.trim().split(/\s+/)).filter(Boolean);
|
|
187
188
|
if (!as.human)
|
|
188
|
-
return helpFor(words, as.archive) + pointer(words, as);
|
|
189
|
+
return helpFor(words, as.archive, as.appUrl) + pointer(words, as);
|
|
189
190
|
if (words.length === 0)
|
|
190
191
|
return humanOverview(as);
|
|
191
192
|
const found = match(words);
|
package/dist/cli/main.js
CHANGED
|
@@ -16,7 +16,7 @@ import { fireHooks, HOOK_INTERFACE } from "../core/hooks.js";
|
|
|
16
16
|
import { prependPath } from "../runners/runner.js";
|
|
17
17
|
import { shimDir } from "../commands/session.js";
|
|
18
18
|
import { isAgent } from "../core/which.js";
|
|
19
|
-
import { noticeStromApp } from "../core/stromapp.js";
|
|
19
|
+
import { appUrlShown, noticeStromApp } from "../core/stromapp.js";
|
|
20
20
|
import { lastChannelOf, pendingTransition, updateChannel } from "../core/update.js";
|
|
21
21
|
import { backupBefore, backupSaid } from "./backups.js";
|
|
22
22
|
import { installation } from "../core/self.js";
|
|
@@ -26,7 +26,7 @@ import { clockLine, FINISH_LINE, finishAsked } from "../core/clock.js";
|
|
|
26
26
|
import { currentSession } from "../core/session.js";
|
|
27
27
|
import { checkArgs, GroupOnly, parseOptions, resolveCommand, firstWord, splitPassthrough } from "./execute.js";
|
|
28
28
|
import { placeholders, UI, ui } from "./ui.js";
|
|
29
|
-
import { catalog, localized } from "../core/phrases.js";
|
|
29
|
+
import { catalog, localized, sayCommandAs } from "../core/phrases.js";
|
|
30
30
|
import "../commands/index.js";
|
|
31
31
|
export { splitCommand } from "./execute.js";
|
|
32
32
|
/**
|
|
@@ -130,6 +130,8 @@ export async function main(argv, io, env, cwd) {
|
|
|
130
130
|
const own = ownCommand(env);
|
|
131
131
|
if (own)
|
|
132
132
|
io = asOwnCommand(io, own, json, argv);
|
|
133
|
+
// {strom} in a text: also in a window of the system or a file, which the output above does not pass
|
|
134
|
+
sayCommandAs(own ?? "strom");
|
|
133
135
|
const debug = argv.includes("--debug");
|
|
134
136
|
resetCache(undefined, "command");
|
|
135
137
|
// the app's install line in its one variable (STROM_FROM): read as the five of an older line
|
|
@@ -155,7 +157,7 @@ export async function main(argv, io, env, cwd) {
|
|
|
155
157
|
catch (err) {
|
|
156
158
|
if (err instanceof GroupOnly) {
|
|
157
159
|
const c = Context.fromOptions({ env, cwd, io, json, values: {} });
|
|
158
|
-
io.stdout(groupHelpAs(err.group, { archive: c.archiveHere(), human: false, lang: c.uiLang(), pointer: io.tty && !isAgent(env) }) + "\n");
|
|
160
|
+
io.stdout(groupHelpAs(err.group, { archive: c.archiveHere(), human: false, lang: c.uiLang(), appUrl: appUrlShown(c.settings), pointer: io.tty && !isAgent(env) }) + "\n");
|
|
159
161
|
return EXIT.ok;
|
|
160
162
|
}
|
|
161
163
|
throw err;
|
|
@@ -168,7 +170,7 @@ export async function main(argv, io, env, cwd) {
|
|
|
168
170
|
// the agent's help, whoever asks (Milan, 2026-10-04: "výchozí je pro agenta"); a person at a terminal is told in a
|
|
169
171
|
// line of their language how to get theirs (strom help <command> --human)
|
|
170
172
|
const c = Context.fromOptions({ env, cwd, io, json, values: v });
|
|
171
|
-
io.stdout(helpAs(def.path, { archive: c.archiveHere(), human: false, lang: c.uiLang(), pointer: io.tty && !isAgent(env) }) + "\n");
|
|
173
|
+
io.stdout(helpAs(def.path, { archive: c.archiveHere(), human: false, lang: c.uiLang(), appUrl: appUrlShown(c.settings), pointer: io.tty && !isAgent(env) }) + "\n");
|
|
172
174
|
return EXIT.ok;
|
|
173
175
|
}
|
|
174
176
|
if (v.version) {
|
package/dist/cli/menu-links.js
CHANGED
|
@@ -20,7 +20,7 @@ import { appWindow } from "../core/appbrowser.js";
|
|
|
20
20
|
import { moveTree } from "./move.js";
|
|
21
21
|
import { changeLines } from "../core/changelog.js";
|
|
22
22
|
import { startLive } from "../core/live.js";
|
|
23
|
-
import { adoptAppUrl, appTreeNameFromInstall } from "../core/stromapp.js";
|
|
23
|
+
import { adoptAppUrl, appTreeNameFromInstall, defaultAppUrl, stromAppUrl } from "../core/stromapp.js";
|
|
24
24
|
import { stromReadsTags } from "../gedcom/export.js";
|
|
25
25
|
import { appMarkFromInstall } from "../core/links.js";
|
|
26
26
|
import { settleFromApp } from "./wizard.js";
|
|
@@ -282,9 +282,15 @@ export async function newFromApp(ctx, runIn, token, openAt, forward, opts = {})
|
|
|
282
282
|
// characters) — kept as the line's STROM_APP_URL is
|
|
283
283
|
if (move?.mark.app && !ctx.env.STROM_APP_URL?.trim()) {
|
|
284
284
|
ctx.settings.reload();
|
|
285
|
-
|
|
285
|
+
if (move.mark.app === defaultAppUrl(ctx.env))
|
|
286
|
+
delete ctx.settings.config.stromAppUrl;
|
|
287
|
+
else
|
|
288
|
+
ctx.settings.config.stromAppUrl = move.mark.app;
|
|
286
289
|
ctx.settings.save();
|
|
287
290
|
}
|
|
291
|
+
// a strom.app.url that is no address of the app: refused before anything is asked or made — the tree's way back
|
|
292
|
+
// would be an address built on it with the bridge's secret (B1-c)
|
|
293
|
+
stromAppUrl(ctx.settings);
|
|
288
294
|
let lang = ctx.uiLang();
|
|
289
295
|
let t = translator(lang);
|
|
290
296
|
out(ctx, t("ui.link.new.title"));
|
package/dist/cli/menu.js
CHANGED
|
@@ -24,7 +24,7 @@ import { lacksImages } from "../core/queue.js";
|
|
|
24
24
|
import { othersAtWork } from "../core/session.js";
|
|
25
25
|
import { DEFAULT_RUN_MINUTES } from "../core/config.js";
|
|
26
26
|
import { truncate } from "./format.js";
|
|
27
|
-
import { installedStromApp, noticeStromApp, stromAppState
|
|
27
|
+
import { appUrlSetting, installedStromApp, noticeStromApp, stromAppState } from "../core/stromapp.js";
|
|
28
28
|
import { appBrowsers } from "../core/chromium.js";
|
|
29
29
|
import { liveWorkers, runsAtWork } from "../core/workers.js";
|
|
30
30
|
import { askStromApp, settleInstall, shortcutName } from "./wizard.js";
|
|
@@ -344,7 +344,7 @@ export async function runMenu(ctx, run) {
|
|
|
344
344
|
const app = stromAppState(ctx.settings);
|
|
345
345
|
if (app !== "no") {
|
|
346
346
|
const atWork = liveWorkers(root).length > 0 || runsAtWork(root).length > 0;
|
|
347
|
-
const hasApp = app !== "unknown" || Boolean(installedStromApp(ctx.env, process.platform,
|
|
347
|
+
const hasApp = app !== "unknown" || Boolean(installedStromApp(ctx.env, process.platform, appUrlSetting(ctx.settings).url));
|
|
348
348
|
appItem = {
|
|
349
349
|
key: "7",
|
|
350
350
|
label: t(!hasApp ? "ui.menu.app.new" : atWork ? "ui.menu.app.watch" : "ui.menu.app"),
|
|
@@ -500,7 +500,7 @@ async function openStromApp(ctx, run, lang, said) {
|
|
|
500
500
|
await run(["app"]);
|
|
501
501
|
return;
|
|
502
502
|
}
|
|
503
|
-
if (!installedStromApp(ctx.env, process.platform,
|
|
503
|
+
if (!installedStromApp(ctx.env, process.platform, appUrlSetting(ctx.settings).url) && (await ctx.confirm(t("ui.app.notinstalled"), true))) {
|
|
504
504
|
await run(["app", "install"]);
|
|
505
505
|
return;
|
|
506
506
|
}
|
package/dist/cli/registry.js
CHANGED
|
@@ -73,11 +73,28 @@ export function usageLine(def) {
|
|
|
73
73
|
});
|
|
74
74
|
return ["strom", ...def.path, ...args, (def.options?.some((o) => !o.hidden) || def.writes) ? "[options]" : ""].filter(Boolean).join(" ");
|
|
75
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* A command's description as it is said here: {appUrl} the copy of the Strom app `strom app` opens (stromAppUrl — the
|
|
78
|
+
* beta for a strom of the beta channel, strom.app.url where it says another; found: help app named stromapp.info on the
|
|
79
|
+
* beta).
|
|
80
|
+
*/
|
|
81
|
+
export function descriptionOf(def, appUrl) {
|
|
82
|
+
const said = def.description?.replace(/\{appUrl\}/g, appUrl.url);
|
|
83
|
+
// an address of no Strom app in the setting: the help names the default and says so (B1-b)
|
|
84
|
+
return said && appUrl.invalid && def.description.includes("{appUrl}") ? `${said}\n${APP_URL_INVALID}` : said;
|
|
85
|
+
}
|
|
86
|
+
/** What a help says under the address of the Strom app when strom.app.url says no address of it (B1-b). */
|
|
87
|
+
export const APP_URL_INVALID = "Note: the setting strom.app.url (or STROM_APP_URL) is no address of the Strom app, so the address above is the default.\n" +
|
|
88
|
+
"Set it right (strom config set strom.app.url <address>) or remove it (strom config unset strom.app.url).";
|
|
89
|
+
/** What strom config where / config get say under a strom.app.url that is no address of the Strom app (B1-e). */
|
|
90
|
+
export const APP_URL_INVALID_SETTING = "Note: the setting strom.app.url (or STROM_APP_URL) is no address of the Strom app: strom app refuses it, and where only an address is named, the default is.\n" +
|
|
91
|
+
"Set it right (strom config set strom.app.url <address>) or remove it (strom config unset strom.app.url).";
|
|
76
92
|
/** Catalog entry for `strom commands --json`: only what is there (empty fields are left out). */
|
|
77
|
-
export function describe(def) {
|
|
93
|
+
export function describe(def, appUrl) {
|
|
78
94
|
const out = { command: def.path.join(" "), usage: usageLine(def), summary: def.summary, group: def.group };
|
|
79
|
-
|
|
80
|
-
|
|
95
|
+
const description = descriptionOf(def, appUrl);
|
|
96
|
+
if (description)
|
|
97
|
+
out.description = description;
|
|
81
98
|
if (def.writes)
|
|
82
99
|
out.writes = true;
|
|
83
100
|
if (def.tree)
|