strom-research 1.12.0 → 1.13.0-beta.1

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.
Files changed (51) hide show
  1. package/README.md +29 -0
  2. package/assets/lang/cs.json +105 -2
  3. package/assets/lang/de.json +105 -2
  4. package/assets/plugins/connectors/DISCOVERY.md +5 -0
  5. package/assets/plugins/connectors/README.md +7 -2
  6. package/dist/cli/backups.js +79 -0
  7. package/dist/cli/context.js +90 -4
  8. package/dist/cli/execute.js +14 -6
  9. package/dist/cli/format.js +32 -0
  10. package/dist/cli/help.js +1 -1
  11. package/dist/cli/main.js +67 -9
  12. package/dist/cli/menu-links.js +207 -43
  13. package/dist/cli/menu.js +26 -7
  14. package/dist/cli/move.js +116 -0
  15. package/dist/cli/registry.js +2 -2
  16. package/dist/cli/ui.js +105 -2
  17. package/dist/cli/wizard.js +63 -41
  18. package/dist/commands/connectors.js +7 -4
  19. package/dist/commands/guide.js +2 -1
  20. package/dist/commands/links.js +19 -8
  21. package/dist/commands/session.js +1 -0
  22. package/dist/commands/setup.js +229 -49
  23. package/dist/commands/start.js +61 -23
  24. package/dist/commands/sync.js +13 -8
  25. package/dist/commands/trees.js +29 -16
  26. package/dist/core/actions.js +2 -1
  27. package/dist/core/appbrowser.js +66 -0
  28. package/dist/core/backup.js +244 -0
  29. package/dist/core/chromium.js +116 -16
  30. package/dist/core/config.js +7 -0
  31. package/dist/core/connector.js +63 -9
  32. package/dist/core/deps.js +3 -2
  33. package/dist/core/errors.js +5 -0
  34. package/dist/core/import.js +19 -2
  35. package/dist/core/links.js +115 -41
  36. package/dist/core/live.js +94 -13
  37. package/dist/core/material.js +66 -0
  38. package/dist/core/migrate.js +5 -1
  39. package/dist/core/paths.js +45 -2
  40. package/dist/core/people.js +37 -7
  41. package/dist/core/relocate.js +9 -3
  42. package/dist/core/self.js +81 -2
  43. package/dist/core/stromapp.js +122 -25
  44. package/dist/core/sync.js +78 -13
  45. package/dist/core/transfer.js +172 -0
  46. package/dist/core/tree.js +27 -2
  47. package/dist/core/uninstall.js +160 -22
  48. package/dist/core/update.js +157 -36
  49. package/dist/gedcom/export.js +4 -1
  50. package/dist/gedcom/validate.js +2 -1
  51. package/package.json +5 -1
package/README.md CHANGED
@@ -152,6 +152,35 @@ npm run release # release/: strom-app.tar.gz, SHASUMS256.t
152
152
 
153
153
  Zero runtime dependencies: TypeScript on Node's built-ins, and git.
154
154
 
155
+ ## A second strom beside the first
156
+
157
+ For testers and developers: another version of strom, e.g. to try one, next to
158
+ the one you use — with its own command, program folder, settings and research
159
+ folder, so the two never share data.
160
+
161
+ ```bash
162
+ curl -fsSL https://raw.githubusercontent.com/ACiDekCZ/strom-research/main/install/install.sh | \
163
+ STROM_ISOLATED=1 STROM_INSTALL_DIR="$HOME/strom-try" STROM_CONFIG_DIR="$HOME/.config/strom-try" \
164
+ STROM_COMMAND=strom-try sh
165
+ ```
166
+
167
+ Windows (PowerShell):
168
+ `$env:STROM_ISOLATED='1'; $env:STROM_INSTALL_DIR="$env:LOCALAPPDATA\Programs\Strom-try"; $env:STROM_CONFIG_DIR="$env:APPDATA\strom-try"; $env:STROM_COMMAND='strom-try'; irm https://raw.githubusercontent.com/ACiDekCZ/strom-research/main/install/install.ps1 | iex`
169
+
170
+ - `STROM_ISOLATED=1` with `STROM_INSTALL_DIR` and `STROM_CONFIG_DIR`: the
171
+ program and its settings live in those folders only; it teaches no agent,
172
+ puts no shortcut on the desktop and leaves your `strom` alone.
173
+ - `STROM_COMMAND=strom-<letters and digits>` (optional): the command it starts
174
+ with, next to `strom` (macOS, Linux: `~/.local/bin`; Windows: a `bin` folder
175
+ of its own on your PATH). It never overwrites a command it did not write. Its
176
+ research folder is suggested as `Documents/Strom <name>` (`Strom try`), and
177
+ links from the Strom app can reach it as `strom-research-<name>://` (on your
178
+ yes, as with the first). Without a command it is started by its full path and
179
+ takes no links.
180
+ - To remove it: `strom-try uninstall` — its command, its links, its PATH entry
181
+ and its program folder go; its settings and research stay (delete them by
182
+ hand when not needed), and so does the first strom with everything of it.
183
+
155
184
  ## License
156
185
 
157
186
  Copyright © 2026 Milan Víšek.
@@ -62,10 +62,14 @@
62
62
  "ui.dialog.refused": "Nepovoleno – nic se nezměnilo.",
63
63
  "ui.link.isolated": "Tohle je izolovaná instalace (STROM_ISOLATED): odkazy strom-research:// nezapisuje – zůstávají běžné instalaci stromu.",
64
64
  "ui.doc.isolated": "izolovaná instalace v {folder}",
65
+ "ui.doc.second": "druhá instalace: příkaz {command}, ve složce {folder}, její odkazy {scheme}://",
66
+ "ui.doc.home.regular": "je to i složka běžného stromu: dvě instalace nad jedním výzkumem",
67
+ "ui.doc.home.program": "ve složce programu strom – aktualizace nebo odinstalace by ji mohla vzít; lépe přesunout jinam (strom setup v terminálu ji přesune i s výzkumem)",
65
68
  "ui.doc.knows.isolated": "izolovaná instalace: agenty mimo ni nic neučí",
66
69
  "ui.doc.links.isolated": "izolovaná instalace: odkazy nezapisuje",
67
70
  "ui.doc.app.isolated": "izolovaná instalace: úmyslně se nepoužívá",
68
71
  "ui.doc.shortcut.isolated": "izolovaná instalace: úmyslně žádný",
72
+ "ui.doc.shortcut.no": "nechtěný (strom setup se zeptá znovu)",
69
73
  "ui.dialog.waiting": "Otázka čeká v okně systému na obrazovce (může být za ostatními okny) – odpověď patří tam, čeká se nejvýš {minutes} min: {question}",
70
74
  "ui.consent.level.auto": "Nechat agenta pracovat samostatně? Ptát se bude jen u riskantních kroků.",
71
75
  "ui.consent.level.full": "Povolit agentovi dělat bez ptaní všechno kromě toho, co strom zakazuje?\n\nJen pro počítač, na kterém není nic jiného důležitého.",
@@ -73,6 +77,8 @@
73
77
  "ui.consent.connector.revoke": "Zastavit stahovač „{name}“?",
74
78
  "ui.consent.host": "Povolit automatické stahování z {host}?",
75
79
  "ui.consent.host.revoke": "Zastavit automatické stahování z {host}?",
80
+ "ui.consent.elsewhere.connector": "Spustit stahovač „{name}“? Žádá o to agent mimo složku výzkumu ({cwd}).",
81
+ "ui.consent.elsewhere.run": "Spustit samostatnou práci agenta na výzkumu „{tree}“? Žádá o to agent mimo složku výzkumu ({cwd}); práce stojí peníze.",
76
82
  "ui.consent.connectors.off": "Nechat stahovače běžet bez ptaní předem?",
77
83
  "ui.menu.title": "Strom výzkum {version}",
78
84
  "ui.menu.tree": "Rodokmen: {name} · osob: {persons}",
@@ -149,6 +155,7 @@
149
155
  "ui.consent.connector.hosts": "Připojí se jen k {hosts} – pomalu, přes omezovač stromu.",
150
156
  "ui.consent.connector.changed": "Jeho kód se od povolení změnil.",
151
157
  "ui.consent.connector.direct": "Pozor: jeho kód se připojuje k síti sám, mimo omezovač stromu.",
158
+ "ui.consent.connector.unfenced": "Pozor: spouští program, který strom neohraničí ({run}) – může číst a měnit všechny soubory tohoto uživatele, spouštět jiné programy a připojit se kamkoli. Po každé změně jeho kódu se dotaz zopakuje.",
152
159
  "ui.consent.connector.terms": "Podmínky užití archivu: {terms}",
153
160
  "ui.consent.host.unblock": "{host} nás odmítl. Povolit znovu – jen pokud archiv řekl, že je to v pořádku?",
154
161
  "ui.menu.otheragent": "Tentokrát mluvit s jiným agentem nebo jinde",
@@ -252,6 +259,8 @@
252
259
  "ui.doc.app": "aplikace Strom",
253
260
  "ui.doc.tree": "tento rodokmen",
254
261
  "ui.doc.innode": "strom {version} v Node {node}",
262
+ "ui.doc.fence": "stahovače v ohrádce",
263
+ "ui.doc.fence.net": "Node {node}: stahovače běží v ohrádce, ale síť jim zavře až Node 25 nebo novější",
255
264
  "ui.doc.oldnode": "Node {node} je příliš starý (potřeba 22.18 nebo novější)",
256
265
  "ui.doc.missing": "chybí",
257
266
  "ui.doc.notsetup": "zatím nenastaveno",
@@ -395,7 +404,9 @@
395
404
  "ui.uninstall.npm": "Samotný program (nainstalovaný přes npm): npm uninstall -g strom-research",
396
405
  "ui.uninstall.done": "strom je odinstalovaný. Děkujeme za bádání s ním.",
397
406
  "ui.uninstall.running": "strom z této instalace ještě běží v jiném okně ({list}): zavřít ho – menu, rozhovor, práci agenta – a spustit strom uninstall znovu. Nic se neodebralo.",
398
- "ui.uninstall.later": "zmizí, jakmile se toto okno zavře",
407
+ "ui.uninstall.folderKept": "Složka {folder} zůstává: je v ní, co do ní strom nedal ({what}).",
408
+ "ui.uninstall.later": "zmizí několik sekund po skončení tohoto příkazu",
409
+ "ui.uninstall.skipped": "{path} je v install.json uveden jako spouštěč programu strom, ale spouštěč to není (jiné jméno, nebo leží ve výzkumu) – zůstává.",
399
410
  "ui.menu.update.line": "Vyšla nová verze stromu: {version}.",
400
411
  "ui.menu.update": "Aktualizovat strom na {version}",
401
412
  "ui.doc.update": "nová verze",
@@ -403,7 +414,7 @@
403
414
  "ui.update.unknown": "Nepodařilo se zjistit nejnovější verzi stromu.",
404
415
  "ui.update.current": "strom {version} je nejnovější verze.",
405
416
  "ui.update.available": "Vyšla nová verze: {version} (tato je {current}) – nainstaluje ji strom update.",
406
- "ui.update.npm": "Vyšla nová verze: {version}. strom je tu nainstalovaný přes npm: npm install -g strom-research@latest",
417
+ "ui.update.npm": "Vyšla nová verze: {version}. strom je tu nainstalovaný přes npm: npm install -g strom-research@{tag}",
407
418
  "ui.update.sure": "Aktualizovat strom z {current} na {version}? Výzkumy zůstanou, jak jsou.",
408
419
  "ui.update.later": "Teď ne – kdykoli strom update.",
409
420
  "ui.update.downloading": "Stahuji strom {version}…",
@@ -415,6 +426,9 @@
415
426
  "ui.o.disk": "disk",
416
427
  "ui.o.disk.tidy": "vedle výzkumu si strom drží {strom}, z toho jde uvolnit {size} – řekni to jednou uživateli: strom tidy to s jeho souhlasem uvolní (výzkum zůstane)",
417
428
  "ui.app.drag": "Aplikace Strom se otevřela. Do jejího okna přetáhnout soubor {file}{shown} – poprvé z něj bude nový rodokmen, příště se tentýž rodokmen aktualizuje. S Chrome nebo Edge na tomto počítači ho strom předá sám.",
429
+ "ui.app.browser.gone": "Aplikace Strom se otevírala v {gone}, ten už na tomto počítači není; nově se otevírá v {now} (jiný: strom config set app.browser chrome|edge|brave|opera|firefox|chromium).",
430
+ "ui.app.browser.gone.none": "Aplikace Strom se otevírala v {gone}, ten už na tomto počítači není, a jiný prohlížeč, ze kterého se k výzkumu připojí (Chrome, Edge, Brave, Firefox), tu není. Po instalaci některého z nich ho strom app otevře v něm.",
431
+ "ui.app.moved": "Strom výzkumu se otevírá v {browser}: přenos stromu je tím dokončený, aplikace Strom pokračuje tam a s výzkumem je spojená. Fotky stromu ve výzkumu nejsou – zůstaly v {from} a v souboru {file}.",
418
432
  "ui.app.drag.shown": " (je ukázaný v okně se soubory)",
419
433
  "ui.app.nolive": "Průběžné sledování výzkumu potřebuje Chrome nebo Edge – Safari webové stránce nedovolí přístup k tomuto počítači.",
420
434
  "ui.app.images": "S obrázky: {n} zápisů vyříznutých ze skenů ({mb} MB).",
@@ -428,6 +442,19 @@
428
442
  "ui.update.node.sure": "Aktualizovat Node stromu z {from} na {to} (bezpečnostní opravy)?",
429
443
  "ui.update.node.done": "✓ Node je aktualizovaný: {from} → {to}.",
430
444
  "ui.update.bridges": "Živé sledování v aplikaci Strom pokračuje s novou verzí ({n}).",
445
+ "ui.update.npm.channel": "strom je tu nainstalovaný přes npm: npm install -g strom-research@{tag}",
446
+ "ui.update.channel.beta.sure": "Přepnout strom na beta verze: {current} → {version}?",
447
+ "ui.update.channel.stable.sure": "Vrátit strom k vydaným verzím: {current} → {version}?",
448
+ "ui.update.channel.beta.now": "Od teď strom bere beta verze.",
449
+ "ui.update.channel.stable.now": "Od teď strom bere vydané verze.",
450
+ "ui.update.older": "{version} je starší verze než {current}; výzkumy zůstanou, jak jsou.",
451
+ "ui.update.stays": "Výzkumy zůstanou, jak jsou.",
452
+ "ui.doc.beta": "beta verze",
453
+ "ui.doc.backup": "záloha",
454
+ "ui.backup.made": "Záloha před přechodem z {from} na {to}: {path} ({size}).",
455
+ "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).",
457
+ "ui.trees.locked": "zamčeno: zapsal strom {by}",
431
458
  "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?",
432
459
  "ui.setup.stromapp.install": "Ano – nainstalovat ji teď (otevře se v prohlížeči, strom řekne, kam kliknout)",
433
460
  "ui.setup.stromapp.later": "Ano, ale teď ne",
@@ -1042,14 +1069,54 @@
1042
1069
  "ui.link.new.wait": "Čekám, až aplikace Strom strom předá – potvrdit to v ní (nejvýš {min} min; Ctrl+C přeruší).",
1043
1070
  "ui.link.new.elsewhere": "Tahle kopie aplikace Strom ten strom nezná. Otevřít adresu výše v té, ve které to začalo (třeba v betě) – výzkum na ni počká.",
1044
1071
  "ui.link.new.none": "Aplikace Strom žádný strom nepředala. Výzkum „{name}“ tu je, zatím prázdný: začít znovu z aplikace, nebo do něj přidat v nabídce stromu.",
1072
+ "ui.link.new.none.trashed": "Aplikace Strom žádný strom nepředala, výzkum „{name}“ se tedy nezaložil (jeho prázdná složka je v koši). Začít znovu jde z aplikace.",
1045
1073
  "ui.link.new.waited": "Z aplikace Strom do {min} min žádný strom nepřišel. Výzkum „{name}“ tu je, zatím prázdný.",
1074
+ "ui.link.new.blocked": "Aplikace Strom se k výzkumu zatím nepřipojila. Možná příčina: prohlížeč jí zablokoval přístup k aplikacím na tomto zařízení (místní síť) – Chrome, Edge a Brave se na to ptají, Firefox podle svého nastavení. Povolit to jde ikonou vlevo od adresy → přístup k místní síti / k tomuto zařízení → Povolit, potom stránku načíst znovu.",
1075
+ "ui.link.new.blocked.chromium": "Aplikace Strom se k výzkumu zatím nepřipojila. Možná příčina: {browser} jí zablokoval přístup k aplikacím na tomto zařízení. Povolit to jde ikonou vlevo od adresy → Aplikace na zařízení (anglicky Apps on device; ve starších verzích Přístup k místní síti) → Povolit, potom stránku načíst znovu.",
1076
+ "ui.link.new.blocked.brave": "Aplikace Strom se k výzkumu zatím nepřipojila. Možná příčina: Brave jí zablokoval přístup k localhostu. Povolit to jde ikonou vlevo od adresy → Přístup k localhostu (anglicky Localhost access) → Povolit, potom stránku načíst znovu.",
1077
+ "ui.link.new.blocked.firefox": "Aplikace Strom se k výzkumu zatím nepřipojila. Možná příčina: Firefox jí zablokoval přístup k aplikacím a službám na tomto zařízení. Povolit to jde ikonou vlevo od adresy → přístup k aplikacím a službám na tomto zařízení → Povolit, potom stránku načíst znovu.",
1078
+ "ui.link.new.into.ask": "Výzkum „{name}“ (založený {when}) strom z aplikace Strom zatím nedostal. Přidat strom do něj?",
1079
+ "ui.link.new.into": "Do výzkumu „{name}“",
1080
+ "ui.link.new.into.new": "Založit nový výzkum",
1046
1081
  "ui.link.new.empty": "Strom, který aplikace Strom poslala, nemá žádné osoby – není co zkoumat. Výzkum „{name}“ tu je, zatím prázdný.",
1047
1082
  "ui.link.new.failed": "Aplikace Strom strom předat nemohla. Výzkum „{name}“ tu je, zatím prázdný: zkusit to z aplikace znovu.",
1048
1083
  "ui.link.new.taken": "✓ Rodokmen je ve výzkumu „{name}“: osob {persons}, rodin {families}, pramenů {sources} – jako vodítka; co doloží záznamy, najde agent.",
1049
1084
  "ui.link.new.taken.archive": "✓ Rodokmen je ve výzkumu „{name}“: osob {persons}, rodin {families}, pramenů {sources} – jako vodítka; co doloží záznamy, najde agent, až bude zapnutý.",
1085
+ "ui.link.new.taken.empty": "✓ Aplikace Strom předala strom, zatím prázdný: výzkum „{name}“ je s ní propojený. Osoby přidané v aplikaci přijdou do výzkumu, až se odešlou.",
1050
1086
  "ui.link.new.back": "Aplikace Strom teď strom ukazuje jako strom výzkumu.",
1051
1087
  "ui.link.new.chat": "Začít teď rozhovor s agentem?",
1052
1088
  "ui.link.new.say": "Předal(a) jsem náš rodokmen z aplikace Strom – podívej se, co v něm je, a navrhni, čím začít.",
1089
+ "ui.move.file": "Soubor stromu z aplikace Strom: {file}",
1090
+ "ui.move.file.ask": "Soubor stromu z aplikace Strom ({name}) se mezi staženými soubory nenašel. Cesta k němu – soubor lze přetáhnout do tohoto okna (0: zrušit)",
1091
+ "ui.move.file.other": "Tenhle soubor není strom, který aplikace Strom přenáší (jiný strom, nebo jiný druh souboru).",
1092
+ "ui.move.file.kept": "Soubor stromu zůstává na místě: {file}",
1093
+ "ui.move.file.trashed": "Strom je teď ve výzkumu i v prohlížeči; jeho soubor šel do koše: {file}",
1094
+ "ui.move.fresh": "{browser} se při prvním spuštění může ptát na přihlášení a výchozí prohlížeč. Až to bude zodpovězené a aplikace Strom se v něm neotevře, otevřít v {browser} adresu níže.",
1095
+ "ui.move.ask": "Strom „{tree}“ (osob: {persons}) se přenese do {browser} a dál se bude pracovat tam. Přenést?",
1096
+ "ui.move.which": "Do kterého prohlížeče se strom „{tree}“ (osob: {persons}) přenese?",
1097
+ "ui.move.yes": "Přenést",
1098
+ "ui.move.no": "Ne",
1099
+ "ui.move.none": "Nepřenášet",
1100
+ "ui.move.empty": "Aplikace Strom se otevře v {browser} a dál se bude pracovat tam. Pokračovat?",
1101
+ "ui.move.empty.which": "Ve kterém prohlížeči se aplikace Strom otevře?",
1102
+ "ui.move.go": "Pokračovat",
1103
+ "ui.move.stays": "Strom zůstává v {from}, nic se nezaložilo.",
1104
+ "ui.move.from.other": "původním prohlížeči",
1105
+ "ui.move.from.mobile": "telefonu nebo tabletu",
1106
+ "ui.move.then": "Co dál?",
1107
+ "ui.move.end": "Konec",
1108
+ "ui.move.cancel": "Zrušit",
1109
+ "ui.move.cancelled": "Nic se nezaložilo.",
1110
+ "ui.move.without": "Pokračovat bez prohlížeče: výzkum (nebo archiv) ze souboru",
1111
+ "ui.move.without.what": "Aplikace v {from} se k výzkumu nepřipojí: nic z aplikace nepůjde živě – ani výzkum, ani archiv. Změny z aplikace jdou do výzkumu souborem (v aplikaci Export → GEDCOM, ve výzkumu strom sync <soubor>), verze výzkumu se do aplikace vrací importem souboru a fotky touto cestou nejdou.",
1112
+ "ui.move.without.later.here": "Plné spojení je jen přes Chrome, Edge, Brave nebo Firefox a {browser} tu je: strom app (v menu Aplikace Strom) v něm kdykoli otevře výzkum a přenos se tím dokončí.",
1113
+ "ui.move.without.later.none": "Plné spojení je jen přes Chrome, Edge, Brave nebo Firefox: po instalaci některého z nich strom app (v menu Aplikace Strom) otevře výzkum v něm a přenos se tím dokončí.",
1114
+ "ui.move.nobrowser": "Na tomto počítači není prohlížeč, ze kterého se aplikace Strom k výzkumu připojí. Strom se může přenést do prohlížeče, který to umí – Google Chrome nebo Microsoft Edge, ke stažení zdarma.",
1115
+ "ui.move.get.chrome": "Otevřít stránku ke stažení Google Chrome (nic se neinstaluje samo)",
1116
+ "ui.move.get.edge": "Otevřít stránku ke stažení Microsoft Edge (nic se neinstaluje samo)",
1117
+ "ui.move.get.opened": "Stránka ke stažení je otevřená ve výchozím prohlížeči: {url}",
1118
+ "ui.move.get.wait": "Po instalaci prohlížeče (toto okno zatím nechat otevřené): Enter pokračuje – prohlížeč se hledá znovu a teprve potom výzkum čeká na strom",
1119
+ "ui.move.terminal": "Přenos stromu potřebuje odpověď člověka v terminálu, nic se nezaložilo.",
1053
1120
  "ui.more.sync.noapp": "Načíst změny z jiného rodokmenu (.ged, .json)",
1054
1121
  "ui.sync.path.noapp": "Přetáhnout sem soubor s rodokmenem (.ged nebo .json), nebo napsat cestu (Enter nebo 0 zpět)",
1055
1122
  "ui.sync.path": "Přetáhnout sem soubor vyexportovaný z aplikace Strom (.ged nebo .json), nebo napsat cestu (Enter nebo 0 zpět)",
@@ -1260,6 +1327,7 @@
1260
1327
  "ui.home.stays": "Výzkum zůstává ve složce {from}.",
1261
1328
  "ui.home.inside": "{to} je uvnitř složky výzkumu {from} (nebo naopak) – vybrat složku mimo ni.",
1262
1329
  "ui.home.notEmpty": "Ve složce {to} už něco je – výzkum se přesune jen do prázdné nebo nové složky.",
1330
+ "ui.home.program": "{to} leží ve složce programu strom – aktualizace nahrazuje, co tam je; je potřeba složka mimo ni.",
1263
1331
  "ui.home.busy": "V rodokmenu {trees} teď někdo pracuje (agent, samostatná práce nebo živé sledování v aplikaci Strom) – výzkum půjde přesunout, až skončí.",
1264
1332
  "ui.home.failed": "Přesunout se nepodařilo ({reason}) – nic se nezměnilo.",
1265
1333
  "ui.app.notinstalled": "Aplikace Strom na tomto počítači ještě není nainstalovaná. Nainstalovat ji teď jako aplikaci z prohlížeče (zdarma; strom ukáže, kam kliknout)?",
@@ -1423,6 +1491,23 @@
1423
1491
  "ui.error.arg.missing": "chybí <{arg}>",
1424
1492
  "ui.error.arg.missing.hint": "strom help {cmd}",
1425
1493
  "ui.error.prefix": "chyba",
1494
+ "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
+ "ui.error.backup.failed.hint": "Uvolnit místo na disku ({where}) a spustit strom znovu – nebo se vrátit: strom update --channel {back}",
1496
+ "ui.error.backup.failed.update": "Zálohu před přechodem z {from} na {to} se nepodařilo vytvořit: {detail}. Nic se nenainstalovalo.",
1497
+ "ui.error.backup.failed.update.hint": "Uvolnit místo na disku ({where}) a znovu strom update --channel {channel}",
1498
+ "ui.error.folder.in-program": "{folder} leží ve složce programu strom {program} – aktualizace ji nahrazuje a odinstalace odstraňuje, výzkum by šel s ní. Nic se nezměnilo.",
1499
+ "ui.error.folder.in-program.hint": "Zvolit složku mimo ni, například {suggested}",
1500
+ "ui.error.folder.in-program.default.hint": "Zadat složku mimo ni: strom setup --home \"{suggested}\" --yes",
1501
+ "ui.error.update.in-program": "{folder} leží uvnitř {entry}, kterou aktualizace nahrazuje – výzkum by šel s ní. Nic se nenainstalovalo.",
1502
+ "ui.error.update.in-program.hint": "Nejdřív přesunout výzkum ze složky programu strom: strom setup ve vlastním terminálu (otázka na složku ho přesune i s výzkumem), pak znovu strom update",
1503
+ "ui.error.tree.newer": "Tento rodokmen zapsal strom {by}, novější než tento strom {version}. Tento strom ho nechává beze změny.",
1504
+ "ui.error.tree.newer.hint": "Aktualizovat strom: strom update",
1505
+ "ui.error.tree.newer.backup": "Tento rodokmen zapsal strom {by}, novější než tento strom {version}. Tento strom ho nechává beze změny.",
1506
+ "ui.error.tree.newer.backup.hint": "Aktualizovat strom: strom update\nZáloha z doby před přechodem: {backup}",
1507
+ "ui.error.tree.newer.beta": "Tento rodokmen zapsal strom {by}, novější než tento strom {version}. Tento strom ho nechává beze změny.",
1508
+ "ui.error.tree.newer.beta.hint": "Vrátit se k betě: strom update --channel beta – nebo počkat na vydání {release}",
1509
+ "ui.error.tree.newer.beta.backup": "Tento rodokmen zapsal strom {by}, novější než tento strom {version}. Tento strom ho nechává beze změny.",
1510
+ "ui.error.tree.newer.beta.backup.hint": "Vrátit se k betě: strom update --channel beta – nebo počkat na vydání {release}\nZáloha z doby před přechodem: {backup}",
1426
1511
  "log.input.app": "Úpravy poslané z aplikace Strom",
1427
1512
  "log.input.app.undo": "Úpravy z aplikace Strom vráceny",
1428
1513
  "ui.init.created": "Rodokmen „{name}“ založen v {path}",
@@ -1430,6 +1515,22 @@
1430
1515
  "ui.init.lang.detected": "jazyk výzkumu: {lang} ({code}) – podle systému; jiný: strom lang <kód>",
1431
1516
  "ui.init.archive": "archiv: data přicházejí z aplikace Strom (výzkum se zapíná přes strom mode research)",
1432
1517
  "ui.init.next": "dál {command}",
1518
+ "ui.setup.summary": "Strom je nastavený.",
1519
+ "ui.setup.summary.home": "domov",
1520
+ "ui.setup.summary.trees": "rodokmeny",
1521
+ "ui.setup.summary.shared": "sdílená data",
1522
+ "ui.setup.summary.lang": "jazyk",
1523
+ "ui.setup.summary.detected": " – podle systému; jiný jazyk: strom config set lang <kód>",
1524
+ "ui.setup.summary.agent": "agent",
1525
+ "ui.setup.summary.missing": " – zatím není nainstalovaný",
1526
+ "ui.setup.summary.talk": "rozhovor",
1527
+ "ui.setup.summary.app": "v aplikaci {app}",
1528
+ "ui.setup.summary.terminal": "v terminálu (jeho CLI)",
1529
+ "ui.setup.summary.both": " – obojí je tu; rozhoduje uživatel: strom setup --where {where}",
1530
+ "ui.setup.summary.knows": "zná strom",
1531
+ "ui.setup.summary.anywhere": "{agent}, v každé složce",
1532
+ "ui.setup.summary.config": "nastavení",
1533
+ "ui.arg.family-tree-name": "název, např. příjmení rodu",
1433
1534
  "ui.arg.agent": "agent",
1434
1535
  "ui.arg.batch": "dávka",
1435
1536
  "ui.arg.book": "kniha",
@@ -1492,6 +1593,8 @@
1492
1593
  "ui.error.option.is-arg.hint": "{cmd} <{arg}>",
1493
1594
  "ui.error.option.unknown": "neznámá volba {opt} u {cmd}",
1494
1595
  "ui.error.option.unknown.hint": "volby: {options} · strom help {path}",
1596
+ "ui.error.option.unknown.none": "neznámá volba {opt} u {cmd}",
1597
+ "ui.error.option.unknown.none.hint": "{help}",
1495
1598
  "ui.error.option.no-value": "{opt} se píše bez hodnoty",
1496
1599
  "ui.error.option.needs-value": "{opt} potřebuje hodnotu {value}",
1497
1600
  "ui.error.option.needs-value.hint": "strom help {path}",
@@ -62,10 +62,14 @@
62
62
  "ui.dialog.refused": "Nicht erlaubt – nichts wurde geändert.",
63
63
  "ui.link.isolated": "Dies ist eine isolierte Installation (STROM_ISOLATED): sie registriert keine strom-research://-Links – diese bleiben beim eigenen strom.",
64
64
  "ui.doc.isolated": "isolierte Installation in {folder}",
65
+ "ui.doc.second": "zweite Installation: der Befehl {command}, in {folder}, ihre Links {scheme}://",
66
+ "ui.doc.home.regular": "auch der Ordner des regulären strom: zwei Installationen an einer Forschung",
67
+ "ui.doc.home.program": "im Programmordner von strom – ein Update oder die Deinstallation könnte sie mitnehmen; besser woandershin (strom setup im Terminal verschiebt sie mit)",
65
68
  "ui.doc.knows.isolated": "isolierte Installation: den Agenten wird außerhalb nichts beigebracht",
66
69
  "ui.doc.links.isolated": "isolierte Installation: registriert keine Links",
67
70
  "ui.doc.app.isolated": "isolierte Installation: absichtlich nicht verwendet",
68
71
  "ui.doc.shortcut.isolated": "isolierte Installation: absichtlich keine",
72
+ "ui.doc.shortcut.no": "nicht gewünscht (strom setup fragt erneut)",
69
73
  "ui.dialog.waiting": "Die Frage wartet in einem Systemfenster auf dem Bildschirm (es kann hinter anderen Fenstern liegen) – dort antworten, gewartet wird höchstens {minutes} Min.: {question}",
70
74
  "ui.consent.level.auto": "Den Agenten selbstständig arbeiten lassen? Er fragt nur bei riskanten Schritten nach.",
71
75
  "ui.consent.level.full": "Dem Agenten erlauben, ohne Nachfrage alles zu tun außer dem, was strom verbietet?\n\nNur auf einem Computer, auf dem sonst nichts Wichtiges liegt.",
@@ -73,6 +77,8 @@
73
77
  "ui.consent.connector.revoke": "Den Downloader „{name}“ stoppen?",
74
78
  "ui.consent.host": "Automatisches Herunterladen von {host} erlauben?",
75
79
  "ui.consent.host.revoke": "Automatisches Herunterladen von {host} stoppen?",
80
+ "ui.consent.elsewhere.connector": "Den Downloader „{name}“ starten? Ein Agent fragt danach von außerhalb des Forschungsordners ({cwd}).",
81
+ "ui.consent.elsewhere.run": "Den Agenten allein an der Forschung „{tree}“ arbeiten lassen? Ein Agent fragt danach von außerhalb des Forschungsordners ({cwd}); die Arbeit kostet Geld.",
76
82
  "ui.consent.connectors.off": "Downloader laufen lassen, ohne vorher zu fragen?",
77
83
  "ui.menu.title": "Strom Ahnenforschung {version}",
78
84
  "ui.menu.tree": "Stammbaum: {name} · Personen: {persons}",
@@ -149,6 +155,7 @@
149
155
  "ui.consent.connector.hosts": "Er verbindet sich nur mit {hosts} – langsam, über den Begrenzer von strom.",
150
156
  "ui.consent.connector.changed": "Sein Code hat sich seit der Erlaubnis geändert.",
151
157
  "ui.consent.connector.direct": "Achtung: sein Code greift selbst auf das Netz zu, am Begrenzer von strom vorbei.",
158
+ "ui.consent.connector.unfenced": "Achtung: er startet ein Programm, das strom nicht eingrenzt ({run}) – es kann alle Dateien dieses Benutzers lesen und ändern, andere Programme starten und jede Adresse erreichen. Nach jeder Änderung seines Codes wird erneut gefragt.",
152
159
  "ui.consent.connector.terms": "Nutzungsbedingungen des Archivs: {terms}",
153
160
  "ui.consent.host.unblock": "{host} hat uns abgewiesen. Wieder erlauben – nur wenn das Archiv gesagt hat, dass es in Ordnung ist?",
154
161
  "ui.menu.otheragent": "Diesmal mit einem anderen Agenten oder woanders sprechen",
@@ -252,6 +259,8 @@
252
259
  "ui.doc.app": "Strom-App",
253
260
  "ui.doc.tree": "dieser Stammbaum",
254
261
  "ui.doc.innode": "strom {version} in Node {node}",
262
+ "ui.doc.fence": "Downloader eingegrenzt",
263
+ "ui.doc.fence.net": "Node {node}: Downloader laufen eingegrenzt, aber erst Node 25 oder neuer hält sie auch vom Netz fern",
255
264
  "ui.doc.oldnode": "Node {node} ist zu alt (nötig: 22.18 oder neuer)",
256
265
  "ui.doc.missing": "fehlt",
257
266
  "ui.doc.notsetup": "noch nicht eingerichtet",
@@ -395,7 +404,9 @@
395
404
  "ui.uninstall.npm": "Das Programm selbst (mit npm installiert): npm uninstall -g strom-research",
396
405
  "ui.uninstall.done": "strom ist deinstalliert. Danke fürs Forschen mit strom.",
397
406
  "ui.uninstall.running": "strom läuft aus dieser Installation noch in einem anderen Fenster ({list}): es schließen – das Menü, ein Gespräch, eine Arbeit des Agenten – und strom uninstall erneut starten. Nichts wurde entfernt.",
398
- "ui.uninstall.later": "verschwindet, sobald dieses Fenster geschlossen ist",
407
+ "ui.uninstall.folderKept": "Der Ordner {folder} bleibt: darin liegt, was strom nicht hineingelegt hat ({what}).",
408
+ "ui.uninstall.later": "verschwindet wenige Sekunden nach dem Ende dieses Befehls",
409
+ "ui.uninstall.skipped": "{path} steht in install.json als Starter von strom, ist aber keiner (ein anderer Name, oder es liegt in der Forschung) – es bleibt.",
399
410
  "ui.menu.update.line": "Eine neue Version von strom ist da: {version}.",
400
411
  "ui.menu.update": "strom auf {version} aktualisieren",
401
412
  "ui.doc.update": "neue Version",
@@ -403,7 +414,7 @@
403
414
  "ui.update.unknown": "Die neueste Version von strom ließ sich nicht ermitteln.",
404
415
  "ui.update.current": "strom {version} ist die neueste Version.",
405
416
  "ui.update.available": "Eine neue Version ist da: {version} (diese ist {current}) – strom update installiert sie.",
406
- "ui.update.npm": "Eine neue Version ist da: {version}. strom ist hier mit npm installiert: npm install -g strom-research@latest",
417
+ "ui.update.npm": "Eine neue Version ist da: {version}. strom ist hier mit npm installiert: npm install -g strom-research@{tag}",
407
418
  "ui.update.sure": "strom von {current} auf {version} aktualisieren? Die Forschungen bleiben, wie sie sind.",
408
419
  "ui.update.later": "Nicht jetzt – jederzeit strom update.",
409
420
  "ui.update.downloading": "strom {version} wird heruntergeladen…",
@@ -415,6 +426,9 @@
415
426
  "ui.o.disk": "Speicher",
416
427
  "ui.o.disk.tidy": "neben der Forschung hält strom {strom}, davon lassen sich {size} freigeben – sag es dem Benutzer einmal: strom tidy gibt es mit seiner Zustimmung frei (die Forschung bleibt)",
417
428
  "ui.app.drag": "Die Strom-App ist geöffnet. Die Datei {file}{shown} in ihr Fenster ziehen – beim ersten Mal wird daraus ein neuer Stammbaum, danach wird derselbe Stammbaum aktualisiert. Mit Chrome oder Edge auf diesem Computer übergibt strom sie selbst.",
429
+ "ui.app.browser.gone": "Die Strom-App öffnete sich in {gone}, der nicht mehr auf diesem Computer ist; ab jetzt öffnet sie sich in {now} (ein anderer: strom config set app.browser chrome|edge|brave|opera|firefox|chromium).",
430
+ "ui.app.browser.gone.none": "Die Strom-App öffnete sich in {gone}, der nicht mehr auf diesem Computer ist, und kein anderer Browser hier erreicht die Forschung (Chrome, Edge, Brave, Firefox). Sobald einer installiert ist, öffnet strom app die Forschung dort.",
431
+ "ui.app.moved": "Der Stammbaum der Forschung öffnet sich in {browser}: die Übertragung des Stammbaums ist damit abgeschlossen, die Strom-App arbeitet dort weiter und ist mit der Forschung verbunden. Fotos des Stammbaums sind nicht in der Forschung – sie blieben in {from} und in der Datei {file}.",
418
432
  "ui.app.drag.shown": " (im Dateifenster angezeigt)",
419
433
  "ui.app.nolive": "Die Forschung laufend zu verfolgen braucht Chrome oder Edge – Safari lässt eine Webseite nicht auf diesen Computer zugreifen.",
420
434
  "ui.app.images": "Mit Bildern: {n} Einträge aus ihren Scans ausgeschnitten ({mb} MB).",
@@ -428,6 +442,19 @@
428
442
  "ui.update.node.sure": "strom's Node von {from} auf {to} aktualisieren (Sicherheitskorrekturen)?",
429
443
  "ui.update.node.done": "✓ Node ist aktualisiert: {from} → {to}.",
430
444
  "ui.update.bridges": "Die Live-Ansicht in der Strom-App läuft mit der neuen Version weiter ({n}).",
445
+ "ui.update.npm.channel": "strom ist hier mit npm installiert: npm install -g strom-research@{tag}",
446
+ "ui.update.channel.beta.sure": "strom auf die Beta-Versionen umstellen: {current} → {version}?",
447
+ "ui.update.channel.stable.sure": "strom zu den veröffentlichten Versionen zurückstellen: {current} → {version}?",
448
+ "ui.update.channel.beta.now": "Ab jetzt nimmt strom die Beta-Versionen.",
449
+ "ui.update.channel.stable.now": "Ab jetzt nimmt strom die veröffentlichten Versionen.",
450
+ "ui.update.older": "{version} ist eine ältere Version als {current}; die Forschungen bleiben, wie sie sind.",
451
+ "ui.update.stays": "Die Forschungen bleiben, wie sie sind.",
452
+ "ui.doc.beta": "Beta-Versionen",
453
+ "ui.doc.backup": "Sicherung",
454
+ "ui.backup.made": "Sicherung vor dem Wechsel von {from} auf {to}: {path} ({size}).",
455
+ "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).",
457
+ "ui.trees.locked": "gesperrt: geschrieben von strom {by}",
431
458
  "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?",
432
459
  "ui.setup.stromapp.install": "Ja – jetzt installieren (sie öffnet sich im Browser, strom zeigt, wo zu klicken ist)",
433
460
  "ui.setup.stromapp.later": "Ja, aber nicht jetzt",
@@ -1042,14 +1069,54 @@
1042
1069
  "ui.link.new.wait": "Ich warte, bis die Strom-App den Stammbaum übergibt – dort bestätigen (höchstens {min} Min.; Strg+C bricht ab).",
1043
1070
  "ui.link.new.elsewhere": "Diese Kopie der Strom-App kennt den Stammbaum nicht. Die Adresse oben in der Kopie öffnen, in der alles begann (etwa in der Beta) – die Forschung wartet darauf.",
1044
1071
  "ui.link.new.none": "Die Strom-App hat keinen Stammbaum übergeben. Die Forschung „{name}“ ist hier, noch leer: erneut aus der App beginnen, oder im Menü von strom etwas hinzufügen.",
1072
+ "ui.link.new.none.trashed": "Die Strom-App hat keinen Stammbaum übergeben, die Forschung „{name}“ wurde also nicht angelegt (ihr leerer Ordner ist im Papierkorb). Erneut aus der App beginnen.",
1045
1073
  "ui.link.new.waited": "Innerhalb von {min} Min. kam kein Stammbaum aus der Strom-App. Die Forschung „{name}“ ist hier, noch leer.",
1074
+ "ui.link.new.blocked": "Die Strom-App hat die Forschung noch nicht erreicht. Mögliche Ursache: der Browser hat ihr den Zugriff auf Apps auf diesem Gerät (das lokale Netzwerk) gesperrt – Chrome, Edge und Brave fragen danach, Firefox je nach Einstellung. Erlauben: Symbol links neben der Adresse → Zugriff auf das lokale Netzwerk / dieses Gerät → Erlauben, dann die Seite neu laden.",
1075
+ "ui.link.new.blocked.chromium": "Die Strom-App hat die Forschung noch nicht erreicht. Mögliche Ursache: {browser} hat ihr den Zugriff auf Apps auf diesem Gerät gesperrt. Erlauben: Symbol links neben der Adresse → Apps auf dem Gerät (englisch Apps on device; in älteren Versionen Zugriff auf das lokale Netzwerk) → Erlauben, dann die Seite neu laden.",
1076
+ "ui.link.new.blocked.brave": "Die Strom-App hat die Forschung noch nicht erreicht. Mögliche Ursache: Brave hat ihr den Zugriff auf localhost gesperrt. Erlauben: Symbol links neben der Adresse → Zugriff auf localhost (englisch Localhost access) → Erlauben, dann die Seite neu laden.",
1077
+ "ui.link.new.blocked.firefox": "Die Strom-App hat die Forschung noch nicht erreicht. Mögliche Ursache: Firefox hat ihr den Zugriff auf Apps und Dienste auf diesem Gerät gesperrt. Erlauben: Symbol links neben der Adresse → Zugriff auf Apps und Dienste auf diesem Gerät → Erlauben, dann die Seite neu laden.",
1078
+ "ui.link.new.into.ask": "Die Forschung „{name}“ (angelegt {when}) hat ihren Stammbaum aus der Strom-App noch nicht bekommen. Den Stammbaum dort hinzufügen?",
1079
+ "ui.link.new.into": "In die Forschung „{name}“",
1080
+ "ui.link.new.into.new": "Eine neue Forschung anlegen",
1046
1081
  "ui.link.new.empty": "Der Stammbaum, den die Strom-App geschickt hat, hat keine Personen – es gibt nichts zu erforschen. Die Forschung „{name}“ ist hier, noch leer.",
1047
1082
  "ui.link.new.failed": "Die Strom-App konnte den Stammbaum nicht übergeben. Die Forschung „{name}“ ist hier, noch leer: es erneut aus der App versuchen.",
1048
1083
  "ui.link.new.taken": "✓ Der Stammbaum ist in der Forschung „{name}“: {persons} Personen, {families} Familien, {sources} Quellen – als Hinweise; was Quellen belegen, findet der Agent.",
1049
1084
  "ui.link.new.taken.archive": "✓ Der Stammbaum ist in der Forschung „{name}“: {persons} Personen, {families} Familien, {sources} Quellen – als Hinweise; was Quellen belegen, findet ein Agent, sobald einer eingeschaltet ist.",
1085
+ "ui.link.new.taken.empty": "✓ Die Strom-App hat ihren Stammbaum übergeben, noch leer: die Forschung „{name}“ ist mit ihr verbunden. Die in der App hinzugefügten Personen kommen in die Forschung, sobald sie gesendet werden.",
1050
1086
  "ui.link.new.back": "Die Strom-App zeigt den Stammbaum jetzt als Stammbaum der Forschung.",
1051
1087
  "ui.link.new.chat": "Jetzt das Gespräch mit dem Agenten beginnen?",
1052
1088
  "ui.link.new.say": "Ich habe unseren Stammbaum aus der Strom-App übergeben – schau dir an, was darin ist, und schlag vor, womit wir beginnen.",
1089
+ "ui.move.file": "Datei des Stammbaums aus der Strom-App: {file}",
1090
+ "ui.move.file.ask": "Die Datei des Stammbaums aus der Strom-App ({name}) wurde bei den Downloads nicht gefunden. Pfad zur Datei – sie kann in dieses Fenster gezogen werden (0: abbrechen)",
1091
+ "ui.move.file.other": "Diese Datei ist nicht der Stammbaum, den die Strom-App überträgt (ein anderer Stammbaum oder eine andere Art von Datei).",
1092
+ "ui.move.file.kept": "Die Datei des Stammbaums bleibt, wo sie ist: {file}",
1093
+ "ui.move.file.trashed": "Der Stammbaum ist jetzt in der Forschung und im Browser; seine Datei kam in den Papierkorb: {file}",
1094
+ "ui.move.fresh": "{browser} fragt beim ersten Start womöglich nach Anmeldung und Standardbrowser. Ist das beantwortet und hat sich die Strom-App darin nicht geöffnet, die Adresse unten in {browser} öffnen.",
1095
+ "ui.move.ask": "Der Stammbaum „{tree}“ (Personen: {persons}) zieht in {browser} um, und dort wird weitergearbeitet. Übertragen?",
1096
+ "ui.move.which": "In welchen Browser zieht der Stammbaum „{tree}“ (Personen: {persons}) um?",
1097
+ "ui.move.yes": "Übertragen",
1098
+ "ui.move.no": "Nein",
1099
+ "ui.move.none": "Nicht übertragen",
1100
+ "ui.move.empty": "Die Strom-App öffnet sich in {browser}, und dort wird weitergearbeitet. Fortfahren?",
1101
+ "ui.move.empty.which": "In welchem Browser öffnet sich die Strom-App?",
1102
+ "ui.move.go": "Fortfahren",
1103
+ "ui.move.stays": "Der Stammbaum bleibt in {from}; nichts wurde angelegt.",
1104
+ "ui.move.from.other": "dem ursprünglichen Browser",
1105
+ "ui.move.from.mobile": "dem Telefon oder Tablet",
1106
+ "ui.move.then": "Wie weiter?",
1107
+ "ui.move.end": "Ende",
1108
+ "ui.move.cancel": "Abbrechen",
1109
+ "ui.move.cancelled": "Nichts wurde angelegt.",
1110
+ "ui.move.without": "Ohne Browser weiter: die Forschung (oder ein Archiv) aus der Datei",
1111
+ "ui.move.without.what": "Die App in {from} verbindet sich nicht mit der Forschung: nichts aus der App geht live – weder eine Forschung noch ein Archiv. Änderungen aus der App gehen als Datei in die Forschung (in der App Export → GEDCOM, in der Forschung strom sync <Datei>), die Version der Forschung kommt per Dateiimport zurück, und Fotos gehen diesen Weg nicht.",
1112
+ "ui.move.without.later.here": "Die volle Verbindung gibt es nur über Chrome, Edge, Brave oder Firefox, und {browser} ist hier: strom app (im Menü die Strom-App) öffnet die Forschung jederzeit darin, und die Übertragung ist abgeschlossen.",
1113
+ "ui.move.without.later.none": "Die volle Verbindung gibt es nur über Chrome, Edge, Brave oder Firefox: sobald einer installiert ist, öffnet strom app (im Menü die Strom-App) die Forschung dort, und die Übertragung ist abgeschlossen.",
1114
+ "ui.move.nobrowser": "Auf diesem Computer gibt es keinen Browser, aus dem sich die Strom-App mit der Forschung verbindet. Der Stammbaum kann in einen Browser umziehen, der es kann – Google Chrome oder Microsoft Edge, kostenlos herunterzuladen.",
1115
+ "ui.move.get.chrome": "Die Download-Seite von Google Chrome öffnen (nichts wird von selbst installiert)",
1116
+ "ui.move.get.edge": "Die Download-Seite von Microsoft Edge öffnen (nichts wird von selbst installiert)",
1117
+ "ui.move.get.opened": "Die Download-Seite ist im Standardbrowser geöffnet: {url}",
1118
+ "ui.move.get.wait": "Nach der Installation des Browsers (dieses Fenster bleibt so lange offen): Enter macht weiter – der Browser wird erneut gesucht, und erst dann wartet die Forschung auf den Stammbaum",
1119
+ "ui.move.terminal": "Das Übertragen des Stammbaums braucht die Antwort eines Menschen im Terminal; nichts wurde angelegt.",
1053
1120
  "ui.more.sync.noapp": "Änderungen aus einem anderen Stammbaum übernehmen (.ged, .json)",
1054
1121
  "ui.sync.path.noapp": "Die Stammbaum-Datei (.ged oder .json) hierher ziehen oder den Pfad eingeben (Enter oder 0 zurück)",
1055
1122
  "ui.sync.path": "Die aus der Strom-App exportierte Datei (.ged oder .json) hierher ziehen oder den Pfad eingeben (Enter oder 0 zurück)",
@@ -1260,6 +1327,7 @@
1260
1327
  "ui.home.stays": "Die Forschung bleibt in {from}.",
1261
1328
  "ui.home.inside": "{to} liegt im Ordner der Forschung {from} (oder umgekehrt) – einen Ordner daneben wählen.",
1262
1329
  "ui.home.notEmpty": "In {to} liegt schon etwas – die Forschung zieht nur in einen leeren oder neuen Ordner.",
1330
+ "ui.home.program": "{to} liegt im Programmordner von strom – ein Update ersetzt, was dort liegt; ein Ordner außerhalb ist nötig.",
1263
1331
  "ui.home.busy": "Im Stammbaum {trees} arbeitet gerade jemand (ein Agent, ein Lauf oder die Strom-App live) – die Forschung kann umziehen, wenn das fertig ist.",
1264
1332
  "ui.home.failed": "Das Verschieben ging nicht ({reason}) – nichts wurde geändert.",
1265
1333
  "ui.app.notinstalled": "Die Strom-App ist auf diesem Computer noch nicht installiert. Jetzt als App aus dem Browser installieren (kostenlos; strom zeigt, wo zu klicken ist)?",
@@ -1423,6 +1491,23 @@
1423
1491
  "ui.error.arg.missing": "<{arg}> fehlt",
1424
1492
  "ui.error.arg.missing.hint": "strom help {cmd}",
1425
1493
  "ui.error.prefix": "Fehler",
1494
+ "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
+ "ui.error.backup.failed.hint": "Platz auf dem Datenträger freimachen ({where}) und strom erneut starten – oder zurück: strom update --channel {back}",
1496
+ "ui.error.backup.failed.update": "Die Sicherung vor dem Wechsel von {from} auf {to} ließ sich nicht erstellen: {detail}. Es wurde nichts installiert.",
1497
+ "ui.error.backup.failed.update.hint": "Platz auf dem Datenträger freimachen ({where}), dann erneut strom update --channel {channel}",
1498
+ "ui.error.folder.in-program": "{folder} liegt im Programmordner von strom {program} – ein Update von strom ersetzt, was dort liegt, und die Deinstallation entfernt es, die Forschung mit. Nichts wurde geändert.",
1499
+ "ui.error.folder.in-program.hint": "Einen Ordner außerhalb wählen, zum Beispiel {suggested}",
1500
+ "ui.error.folder.in-program.default.hint": "Einen Ordner außerhalb angeben: strom setup --home \"{suggested}\" --yes",
1501
+ "ui.error.update.in-program": "{folder} liegt in {entry}, das das Update ersetzt – die Forschung ginge mit. Nichts wurde installiert.",
1502
+ "ui.error.update.in-program.hint": "Zuerst die Forschung aus dem Programmordner von strom verschieben: strom setup in einem eigenen Terminal (die Frage nach dem Ordner verschiebt sie mit), dann erneut strom update",
1503
+ "ui.error.tree.newer": "Diesen Stammbaum hat strom {by} geschrieben, neuer als dieses strom {version}. Dieses strom lässt ihn unverändert.",
1504
+ "ui.error.tree.newer.hint": "strom aktualisieren: strom update",
1505
+ "ui.error.tree.newer.backup": "Diesen Stammbaum hat strom {by} geschrieben, neuer als dieses strom {version}. Dieses strom lässt ihn unverändert.",
1506
+ "ui.error.tree.newer.backup.hint": "strom aktualisieren: strom update\nDie Sicherung vor dem Wechsel: {backup}",
1507
+ "ui.error.tree.newer.beta": "Diesen Stammbaum hat strom {by} geschrieben, neuer als dieses strom {version}. Dieses strom lässt ihn unverändert.",
1508
+ "ui.error.tree.newer.beta.hint": "Zurück zur Beta: strom update --channel beta – oder auf die Veröffentlichung von {release} warten",
1509
+ "ui.error.tree.newer.beta.backup": "Diesen Stammbaum hat strom {by} geschrieben, neuer als dieses strom {version}. Dieses strom lässt ihn unverändert.",
1510
+ "ui.error.tree.newer.beta.backup.hint": "Zurück zur Beta: strom update --channel beta – oder auf die Veröffentlichung von {release} warten\nDie Sicherung vor dem Wechsel: {backup}",
1426
1511
  "log.input.app": "Aus der Strom-App gesendete Änderungen",
1427
1512
  "log.input.app.undo": "Änderungen aus der Strom-App zurückgenommen",
1428
1513
  "ui.init.created": "Stammbaum „{name}“ angelegt in {path}",
@@ -1430,6 +1515,22 @@
1430
1515
  "ui.init.lang.detected": "Sprache der Forschung: {lang} ({code}) – vom System übernommen; eine andere: strom lang <Code>",
1431
1516
  "ui.init.archive": "ein Archiv: die Daten kommen aus der Strom-App (die Forschung wird mit strom mode research eingeschaltet)",
1432
1517
  "ui.init.next": "weiter {command}",
1518
+ "ui.setup.summary": "Strom ist eingerichtet.",
1519
+ "ui.setup.summary.home": "Zuhause",
1520
+ "ui.setup.summary.trees": "Stammbäume",
1521
+ "ui.setup.summary.shared": "gemeinsame Daten",
1522
+ "ui.setup.summary.lang": "Sprache",
1523
+ "ui.setup.summary.detected": " – vom System erkannt; eine andere Sprache: strom config set lang <Code>",
1524
+ "ui.setup.summary.agent": "Agent",
1525
+ "ui.setup.summary.missing": " – noch nicht installiert",
1526
+ "ui.setup.summary.talk": "Gespräch",
1527
+ "ui.setup.summary.app": "in der App {app}",
1528
+ "ui.setup.summary.terminal": "im Terminal (seine CLI)",
1529
+ "ui.setup.summary.both": " – beides ist hier; die Entscheidung liegt beim Benutzer: strom setup --where {where}",
1530
+ "ui.setup.summary.knows": "kennt strom",
1531
+ "ui.setup.summary.anywhere": "{agent}, in jedem Ordner",
1532
+ "ui.setup.summary.config": "Einstellungen",
1533
+ "ui.arg.family-tree-name": "Name, z. B. der Familienname",
1433
1534
  "ui.arg.agent": "Agent",
1434
1535
  "ui.arg.batch": "Stapel",
1435
1536
  "ui.arg.book": "Buch",
@@ -1492,6 +1593,8 @@
1492
1593
  "ui.error.option.is-arg.hint": "{cmd} <{arg}>",
1493
1594
  "ui.error.option.unknown": "unbekannte Option {opt} für {cmd}",
1494
1595
  "ui.error.option.unknown.hint": "Optionen: {options} · strom help {path}",
1596
+ "ui.error.option.unknown.none": "unbekannte Option {opt} für {cmd}",
1597
+ "ui.error.option.unknown.none.hint": "{help}",
1495
1598
  "ui.error.option.no-value": "{opt} hat keinen Wert",
1496
1599
  "ui.error.option.needs-value": "{opt} braucht einen Wert {value}",
1497
1600
  "ui.error.option.needs-value.hint": "strom help {path}",
@@ -148,6 +148,11 @@ as well: see step 2.
148
148
  - strom shows each image's size (width × height). It should be the right page
149
149
  and full size, not a thumbnail. Check that the number of images of a book
150
150
  matches the portal.
151
+ - Keep `run` in connector.json as `["node", "connector.ts"]`: then it runs
152
+ fenced in (Node's permission model) and you may change the code without
153
+ asking. Split it into more files of this folder if you like, imported from
154
+ connector.ts. Another program, or a switch of Node's in `run`, needs the
155
+ user's consent after every change.
151
156
  - If strom answers with exit code 4 (consent required), stop and tell the
152
157
  user: they give it in their own terminal after reading the warning
153
158
  (`strom allow connector __NAME__`). You never do that.
@@ -56,6 +56,10 @@ starts with `.` or `_` are ignored (`_old-version/`).
56
56
  - `title`: the archive or portal, as people call it.
57
57
  - `run`: the program and its arguments, started in the connector's folder.
58
58
  `"node"` is the Node that runs strom (it runs TypeScript as it is).
59
+ `"node"` followed only by files of the connector's folder (no switches, no
60
+ `..`, no absolute paths) runs in Node's permission model. Any other program,
61
+ or a switch of Node's, runs only with the user's consent to the code exactly
62
+ as it is, asked again after every change of it.
59
63
  - `hosts`: every host it contacts. `"example.org"` includes its subdomains.
60
64
  strom refuses requests anywhere else, and each host needs the user's consent.
61
65
  - `can`: what it does: any of `find`, `list`, `fetch`, `part`, `locate`.
@@ -384,8 +388,9 @@ with the text round it.
384
388
  A connector runs as soon as it is in the folder. Two things need the user's
385
389
  consent, given in their own terminal (`strom allow connector <name>`, or when
386
390
  they run a test or a fetch themselves, where strom asks right away):
387
- - code that reaches the network itself, past strom: always, and again after
388
- every change of it;
391
+ - a `run` other than `"node"` and files of its folder, or code that seems to
392
+ reach the network itself, past strom: always, and again after every change
393
+ of it;
389
394
  - every connector and each of its hosts, when the user asked to be asked first
390
395
  (`strom config set connectors.consent on`).
391
396
 
@@ -0,0 +1,79 @@
1
+ // The backup before another channel or an older version (core/backup.ts), as the CLI makes it: every research this
2
+ // computer knows and the settings, the README in the person's language, kept in the user config, said in a line.
3
+ import { EXIT, StromError } from "../core/errors.js";
4
+ import { backupOnce, backupsDir, BackupFailed, mb } from "../core/backup.js";
5
+ import { installation, replacedHolding } from "../core/self.js";
6
+ import { ui } from "./ui.js";
7
+ /** A local date and time for a sentence. */
8
+ function when(iso) {
9
+ const d = new Date(iso);
10
+ const p = (n) => String(n).padStart(2, "0");
11
+ return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`;
12
+ }
13
+ /** The versions as a sentence says them: their channels too where the version stays the same. */
14
+ function sides(t) {
15
+ const same = t.from === t.to;
16
+ return { from: `${t.from}${same && t.fromChannel ? ` (${t.fromChannel})` : ""}`, to: `${t.to}${same && t.toChannel ? ` (${t.toChannel})` : ""}` };
17
+ }
18
+ /**
19
+ * Make the backup of this change unless one was made for it already. Returns the one made now (undefined: made
20
+ * before, or nothing to back up — no home). Throws a StromError (exit 6) with the reason and what to do when it
21
+ * cannot: `update` — strom update stops before it installs; otherwise this strom opens no research for writing.
22
+ */
23
+ export function backupBefore(ctx, t, opts = {}) {
24
+ const home = ctx.settings.home()?.value;
25
+ if (!home)
26
+ return undefined;
27
+ const lang = ctx.uiLang();
28
+ const said = sides(t);
29
+ try {
30
+ // never inside what strom update replaces (app/, node/ of the installer's folder): the backup would go with it
31
+ const inst = installation();
32
+ const inside = inst.kind === "installed" && inst.root ? replacedHolding(inst.root, [backupsDir(home)])[0] : undefined;
33
+ if (inside)
34
+ throw new BackupFailed(`${backupsDir(home)} lies inside ${inside.entry}, which strom update replaces — the research belongs outside strom's program folder`);
35
+ return backupOnce({
36
+ home,
37
+ env: ctx.env,
38
+ trees: () => ctx.knownTrees().map((k) => k.root),
39
+ research: [ctx.settings.trees()?.value, ctx.settings.shared()?.value].filter((p) => !!p),
40
+ transition: t,
41
+ readme: ui(lang, "ui.backup.readme", { ...said, date: when(new Date().toISOString()) }),
42
+ record: (made, before) => {
43
+ ctx.settings.config.backups = [...before, made];
44
+ ctx.settings.save();
45
+ },
46
+ });
47
+ }
48
+ catch (e) {
49
+ const detail = e instanceof BackupFailed ? e.message : e.message;
50
+ const where = backupsDir(home);
51
+ const back = t.fromChannel ?? "stable";
52
+ const params = { ...said, detail, where, back, channel: opts.update?.channel ?? "" };
53
+ if (opts.update)
54
+ throw new StromError(`the backup before going from ${said.from} to ${said.to} could not be made: ${detail} — nothing was installed`, {
55
+ exitCode: EXIT.noBackup,
56
+ hint: `free room on the disk (${where}), then strom update --channel ${opts.update.channel} again`,
57
+ code: "backup.failed.update",
58
+ params,
59
+ details: { from: t.from, to: t.to, where, ...(e instanceof BackupFailed && e.room ? { room: e.room } : {}) },
60
+ });
61
+ throw new StromError(`the backup before going from ${said.from} to ${said.to} could not be made: ${detail} — nothing is switched: this strom opens no family tree for writing until it is made (tried again at each run)`, {
62
+ exitCode: EXIT.noBackup,
63
+ hint: `tell the user: free room on the disk (${where}), then run strom again — or go back: strom update --channel ${back}`,
64
+ code: "backup.failed",
65
+ params,
66
+ details: { from: t.from, to: t.to, where, ...(e instanceof BackupFailed && e.room ? { room: e.room } : {}) },
67
+ });
68
+ }
69
+ }
70
+ /** Where the backup is, in a line: the person's language, or JSON for an agent (--json). */
71
+ export function backupSaid(ctx, b) {
72
+ if (ctx.json)
73
+ return JSON.stringify({ backup: { path: b.path, bytes: b.bytes, from: b.from, to: b.to } });
74
+ return ui(ctx.uiLang(), "ui.backup.made", { ...sides(b), path: b.path, size: mb(b.bytes) });
75
+ }
76
+ /** The last backup in a line (the menu, strom doctor). */
77
+ export function lastBackupLine(lang, b) {
78
+ return ui(lang, "ui.backup.last", { ...sides(b), date: when(b.at), path: b.path });
79
+ }