strom-research 1.25.0-beta.1 → 1.25.0-beta.2
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/CHANGELOG.cs.md +12 -1
- package/CHANGELOG.de.md +14 -1
- package/CHANGELOG.md +13 -1
- package/assets/archives.json +35 -0
- package/assets/lang/cs.json +40 -0
- package/assets/lang/de.json +40 -0
- package/assets/terms/streets.json +3 -2
- package/dist/cli/help.js +2 -2
- package/dist/cli/menu-links.js +22 -0
- package/dist/cli/menu.js +11 -1
- package/dist/cli/ui.js +38 -0
- package/dist/commands/checks.js +94 -10
- package/dist/commands/fixchecks.js +25 -2
- package/dist/commands/fixes.js +100 -26
- package/dist/commands/guide.js +6 -1
- package/dist/commands/links.js +8 -0
- package/dist/core/changelog.js +17 -1
- package/dist/core/links.js +14 -2
- package/dist/core/live.js +18 -4
- package/dist/core/phone-finds.js +3 -3
- package/dist/core/phone-watch.js +6 -0
- package/dist/core/phrases.js +2 -0
- package/dist/core/streetfix.js +54 -12
- package/dist/core/streets.js +107 -4
- package/dist/core/timetravel.js +210 -0
- package/dist/core/tree.js +1 -1
- package/dist/core/uninstall.js +52 -7
- package/dist/core/widget.js +29 -8
- package/package.json +1 -1
package/CHANGELOG.cs.md
CHANGED
|
@@ -7,12 +7,23 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
|
|
|
7
7
|
|
|
8
8
|
## 1.25.0
|
|
9
9
|
|
|
10
|
-
*Připravuje se: bety do 1.25.0-beta.
|
|
10
|
+
*Připravuje se: bety do 1.25.0-beta.2. Oddíl bude úplný s vydáním.*
|
|
11
11
|
|
|
12
12
|
- **Data pro widget Strom i na Windows.** Výzkum teď zapisuje to, co z něj ukazuje widget Strom (na čem se pracuje,
|
|
13
13
|
nálezy za posledních 24 hodin, co čeká), i na Windows, do `%USERPROFILE%\.config\strom\widget`, se značkou verze
|
|
14
14
|
strom, která je zapsala. Widget, který zrovna čte svůj soubor, most nikdy nezdrží. `strom uninstall` odebere i soubory
|
|
15
15
|
widgetu, také na Macu; výzkum a nastavení zůstávají.
|
|
16
|
+
- **Widget otevře osobu.** Řádek nebo nález widgetu Strom o jedné osobě otevře v aplikaci Strom právě tu osobu (její
|
|
17
|
+
stránku, strom kolem ní), to, co čeká, otevře oddíl Čeká výzkumu (aplikace, která je ještě otevřít neumí,
|
|
18
|
+
otevře strom jako dosud).
|
|
19
|
+
- **Čísla domů za jménem obce.** Místa zapsaná jako jméno se samotným číslem (`Lhota 16`) teď jde opravit také
|
|
20
|
+
(`strom fixes run street-places`): místem bude obec a číslo jejím domem – jen když člověk za každou obec zvlášť
|
|
21
|
+
potvrdí, že její čísla jsou domy, a předtím vidí, kterých údajů se to týká. Části města s číslem (`Praha 5`) se
|
|
22
|
+
nikdy nenabízejí. Odpověď se pamatuje ve výzkumu a `strom fixes undo street-places` vše vrátí.
|
|
23
|
+
- **Návrat v čase.** `strom history back <změna>` vrátí výzkum do stavu po dřívější změně: nejdřív ukáže, co se vrátí
|
|
24
|
+
a co se vyřadí, a pak jen na „ano“ člověka v terminálu. Nic se nemaže: záznamy přidané od té doby se vyřadí a i sám
|
|
25
|
+
návrat jde stejně vrátit. Odkaz `strom-research://back` ho otevře k jedné změně;
|
|
26
|
+
přehled mostu návrat odliší.
|
|
16
27
|
|
|
17
28
|
## 1.24.0
|
|
18
29
|
|
package/CHANGELOG.de.md
CHANGED
|
@@ -7,13 +7,26 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
|
|
|
7
7
|
|
|
8
8
|
## 1.25.0
|
|
9
9
|
|
|
10
|
-
*In Vorbereitung: die Betas bis 1.25.0-beta.
|
|
10
|
+
*In Vorbereitung: die Betas bis 1.25.0-beta.2. Der Abschnitt ist mit dem Release vollständig.*
|
|
11
11
|
|
|
12
12
|
- **Daten für das Strom-Widget auch unter Windows.** Eine Forschung schreibt jetzt, was das Strom-Widget von ihr zeigt
|
|
13
13
|
(woran gearbeitet wird, die Funde der letzten 24 Stunden, was wartet), auch unter Windows, nach
|
|
14
14
|
`%USERPROFILE%\.config\strom\widget`, mit einer Marke des strom, der es geschrieben hat. Ein Widget, das gerade seine
|
|
15
15
|
Datei liest, hält die Brücke nie auf. `strom uninstall` entfernt auch die Dateien des Widgets, auch auf dem Mac; die
|
|
16
16
|
Forschung und die Einstellungen bleiben.
|
|
17
|
+
- **Das Widget öffnet die Person.** Eine Zeile oder ein Fund des Strom-Widgets zu einer Person öffnet in der Strom-App
|
|
18
|
+
genau diese Person (ihre Seite, den Stammbaum um sie), was wartet, den Abschnitt „Wartet“ der Forschung (eine App,
|
|
19
|
+
die sie noch nicht öffnen kann, öffnet den Stammbaum wie bisher).
|
|
20
|
+
- **Eine Nummer allein nach dem Namen einer Gemeinde.** Orte, geschrieben als Name mit einer Nummer allein (`Lhota 16`),
|
|
21
|
+
lassen sich jetzt auch richtigstellen (`strom fixes run street-places`): der Ort wird die Gemeinde, die Nummer ihr
|
|
22
|
+
Haus – erst wenn eine Person für jede Gemeinde einzeln sagt, dass ihre Nummern Häuser sind, nachdem die betroffenen
|
|
23
|
+
Angaben gezeigt wurden. Teile einer Stadt mit Nummer (`Praha 5`) werden nie angeboten. Die Antwort bleibt in der
|
|
24
|
+
Forschung, und `strom fixes undo street-places` stellt alles wieder her.
|
|
25
|
+
- **Zurück in der Zeit.** `strom history back <Änderung>` bringt die Forschung auf ihren Stand nach einer früheren
|
|
26
|
+
Änderung zurück: zuerst, was zurückkommt und was beiseitegelegt wird, dann nur auf das Ja einer Person im Terminal.
|
|
27
|
+
Nichts wird gelöscht: seither hinzugefügte Einträge werden beiseitegelegt, und die Rückkehr selbst lässt sich ebenso
|
|
28
|
+
zurücknehmen. Der Link `strom-research://back` öffnet sie zu einer Änderung; das
|
|
29
|
+
Protokoll der Brücke weist eine Rückkehr eigens aus.
|
|
17
30
|
|
|
18
31
|
## 1.24.0
|
|
19
32
|
|
package/CHANGELOG.md
CHANGED
|
@@ -7,12 +7,24 @@ The changes of each version in short. The full notes and the install lines are o
|
|
|
7
7
|
|
|
8
8
|
## 1.25.0
|
|
9
9
|
|
|
10
|
-
*In preparation: the betas up to 1.25.0-beta.
|
|
10
|
+
*In preparation: the betas up to 1.25.0-beta.2. The section is complete with the release.*
|
|
11
11
|
|
|
12
12
|
- **Data for the Strom widget on Windows too.** A research now writes what the Strom widget shows of it (what it works
|
|
13
13
|
on, the finds of the last 24 hours, what waits) also on Windows, into `%USERPROFILE%\.config\strom\widget`, with a
|
|
14
14
|
mark of the strom that wrote it. A widget reading its file never holds up the bridge. `strom uninstall` takes the
|
|
15
15
|
widget's files too, on a Mac as well; the research and the settings stay.
|
|
16
|
+
- **The widget opens the person.** A line or a find of the Strom widget about one person opens that person in the
|
|
17
|
+
Strom app (its page, the tree around it), what waits opens the research's "Waiting" (an app that cannot open them
|
|
18
|
+
yet opens the tree as before).
|
|
19
|
+
- **House numbers after the name of a village.** Places written as the name with a number alone (`Lhota 16`) can
|
|
20
|
+
now be set right too (`strom fixes run street-places`): the place becomes the municipality, the number its house —
|
|
21
|
+
only once the person says, for each municipality on its own, that its numbers are houses, with the facts it changes
|
|
22
|
+
shown first. Parts of a town with a number (`Praha 5`) are never offered. The answer is kept with the research and
|
|
23
|
+
`strom fixes undo street-places` puts everything back.
|
|
24
|
+
- **Back in time.** `strom history back <change>` returns the research to its state after an earlier change: first
|
|
25
|
+
what would come back and what would be put aside, then only on the person's yes in the terminal. Nothing is deleted:
|
|
26
|
+
records added since are put aside, and the return itself can be taken back the same way. The link
|
|
27
|
+
`strom-research://back` opens it for one change; the bridge's log says a return apart.
|
|
16
28
|
|
|
17
29
|
## 1.24.0
|
|
18
30
|
|
package/assets/archives.json
CHANGED
|
@@ -285,6 +285,41 @@
|
|
|
285
285
|
"robots": "Disallow: /ark:/61903/1: · Disallow: /ark:/61903/2: · Disallow: /Search/ · Disallow: /tree/person …",
|
|
286
286
|
"scope": "no automated request at all: links and a task for the person",
|
|
287
287
|
"checked": "2026-10-11"
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"host": "ags.cuzk.gov.cz",
|
|
291
|
+
"name": "ČÚZK – mapové služby (RÚIAN; Archiv ÚAZK)",
|
|
292
|
+
"level": "allowed",
|
|
293
|
+
"terms": "https://cuzk.gov.cz/Predpisy/Podminky-poskytovani-prostor-dat-a-sitovych-sluzeb/Podminky-poskytovani-sitovych-sluzeb-CUZK.aspx",
|
|
294
|
+
"quote": "Služby jsou poskytovány jako otevřené a lze je užívat bez omezení komerčně i nekomerčně, pokud rozsah užití není na újmu poskytovatele",
|
|
295
|
+
"license": "https://creativecommons.org/licenses/by/4.0/legalcode.cs",
|
|
296
|
+
"robots": "none (404)",
|
|
297
|
+
"disallow": ["/archiv/", "/arcgis4/rest/services/Archiv/"],
|
|
298
|
+
"scope": "the RÚIAN map service only (/arcgis/rest/services/RUIAN/MapServer: a house's address point, building, cadastral area, municipality — one query at a time, credited \"ČÚZK – on-line\"); never the Archiv application or its map images of the archive (old cadastral maps are no open data: \"s výjimkou leteckých měřických snímků a archiválií\", copies sold) — a person looks at them in the browser",
|
|
299
|
+
"checked": "2026-11-01"
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"host": "services.cuzk.gov.cz",
|
|
303
|
+
"name": "ČÚZK – síťové služby WMS/WFS (INSPIRE)",
|
|
304
|
+
"level": "allowed",
|
|
305
|
+
"terms": "https://cuzk.gov.cz/Predpisy/Podminky-poskytovani-prostor-dat-a-sitovych-sluzeb/Podminky-poskytovani-sitovych-sluzeb-CUZK.aspx",
|
|
306
|
+
"quote": "Služby jsou poskytovány jako otevřené a lze je užívat bez omezení komerčně i nekomerčně, pokud rozsah užití není na újmu poskytovatele",
|
|
307
|
+
"license": "https://creativecommons.org/licenses/by/4.0/legalcode.cs",
|
|
308
|
+
"robots": "User-agent: * · Disallow: /*.asp · Disallow: /cgi-bin/ · Disallow: /css/ · Disallow: /cuzk/ · Disallow: /html/ · Disallow: /images/ · Disallow: /ini/ · Disallow: /scripts/ · Disallow: /test/",
|
|
309
|
+
"disallow": ["/*.asp", "/cgi-bin/", "/css/", "/cuzk/", "/html/", "/images/", "/ini/", "/scripts/", "/test/"],
|
|
310
|
+
"scope": "open by its terms, but its robots.txt disallows /*.asp — every WMS/WFS address (e.g. /wfs/inspire-ad-wfs.asp): no automated request; the RÚIAN map service on ags.cuzk.gov.cz serves the same",
|
|
311
|
+
"checked": "2026-11-01"
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
"host": "vdp.cuzk.gov.cz",
|
|
315
|
+
"name": "RÚIAN – Veřejný dálkový přístup (VDP)",
|
|
316
|
+
"level": "allowed",
|
|
317
|
+
"terms": "https://cuzk.gov.cz/ruian/Poskytovani-udaju-ISUI-RUIAN-VDP/Vymenny-format-RUIAN-(VFR)/FAQ-casto-kladene-otazky-k-VFR/4-Je-mozne-ziskat-data-RUIAN-i-pro-komercni-ucely.aspx",
|
|
318
|
+
"quote": "ČÚZK je poskytuje od 1. 1. 2020 bezúplatně na základě licence Creative Commons CC-BY 4.0.",
|
|
319
|
+
"license": "https://creativecommons.org/licenses/by/4.0/legalcode.cs",
|
|
320
|
+
"robots": "not read (the connection reset, 2026-11-01): strom reads it before the first request",
|
|
321
|
+
"scope": "RÚIAN open data (credited \"ČÚZK, [rok]\", with its metadata); its exchange files cover a whole municipality — for one house the RÚIAN map service on ags.cuzk.gov.cz is lighter",
|
|
322
|
+
"checked": "2026-11-01"
|
|
288
323
|
}
|
|
289
324
|
]
|
|
290
325
|
}
|
package/assets/lang/cs.json
CHANGED
|
@@ -770,6 +770,8 @@
|
|
|
770
770
|
"log.appshape.unfix": "Období a věky z aplikace Strom vráceny, jak je nechaly synchronizace: {n}",
|
|
771
771
|
"log.streetplace.fix": "Ulice a čísla domů přesunuty z míst údajů do jejich domů: {n}",
|
|
772
772
|
"log.streetplace.unfix": "Místa a domy údajů vráceny, jak byly: {n}",
|
|
773
|
+
"log.tree.return": "Návrat ke stavu z {when}",
|
|
774
|
+
"log.streetplace.towns": "Posouzena čísla za jménem obce (domy, nebo ne): {n}",
|
|
773
775
|
"afterdeath.what": "{name}: prověřit událost datovanou po smrti ({year})",
|
|
774
776
|
"afterdeath.wedding.what": "{name}: prověřit sňatek datovaný po smrti ({year})",
|
|
775
777
|
"afterdeath.why": "Smrt: {death}. Datováno po ní: {event}. Jedno z dat je špatně přečtené, nebo jde o záznamy dvou lidí.",
|
|
@@ -993,6 +995,9 @@
|
|
|
993
995
|
"ui.browse.card": "Osoba: její život, rodina a záznamy",
|
|
994
996
|
"ui.browse.pedigree": "Vývod předků jedné osoby",
|
|
995
997
|
"ui.browse.files": "Soubory s výsledky (GEDCOM)",
|
|
998
|
+
"ui.browse.time": "Návrat v čase (stav po dřívější změně)",
|
|
999
|
+
"ui.back.pick": "Ke stavu po které změně?",
|
|
1000
|
+
"ui.back.none": "Zatím není změna, ke které se vrátit.",
|
|
996
1001
|
"ui.browse.back": "Zpět",
|
|
997
1002
|
"ui.browse.whose": "Čí předky? (jméno nebo ID jako P0012; 0 vrátí zpět)",
|
|
998
1003
|
"ui.date.about": "asi {date}",
|
|
@@ -1152,6 +1157,7 @@
|
|
|
1152
1157
|
"ui.help.cmd.recent": "Co nového přibylo",
|
|
1153
1158
|
"ui.help.cmd.plan": "Co agent udělá dál",
|
|
1154
1159
|
"ui.help.cmd.history": "Co se změnilo, řádek po řádku",
|
|
1160
|
+
"ui.help.cmd.history.back": "Návrat ke stavu po dřívější změně (nejdřív náhled, nic se nemaže)",
|
|
1155
1161
|
"ui.help.cmd.person.card": "Život jedné osoby s jejími záznamy",
|
|
1156
1162
|
"ui.help.cmd.person.list": "Osoby v rodokmenu",
|
|
1157
1163
|
"ui.help.cmd.pedigree": "Předkové osoby jako strom",
|
|
@@ -1253,6 +1259,24 @@
|
|
|
1253
1259
|
"ui.recent.more": "… a další: {n}",
|
|
1254
1260
|
"ui.recent.morechanges": "(a další změny: {n})",
|
|
1255
1261
|
"ui.history.none": "historie je zatím prázdná",
|
|
1262
|
+
"ui.history.back.hint": "Návrat ke stavu po některé z těchto změn: strom history back <změna>",
|
|
1263
|
+
"ui.back.title": "Návrat ke stavu po změně z {when} ({change}):",
|
|
1264
|
+
"ui.back.g.people": "Osoby",
|
|
1265
|
+
"ui.back.g.families": "Rodiny",
|
|
1266
|
+
"ui.back.g.sources": "Prameny a obrázky",
|
|
1267
|
+
"ui.back.g.other": "Místa, hledání, rozpory, hypotézy, materiál",
|
|
1268
|
+
"ui.back.asthen": "{n} jako tehdy",
|
|
1269
|
+
"ui.back.out": "{n} vyřazeno (přidáno později)",
|
|
1270
|
+
"ui.back.facts": "Údaje, které se liší: {n}",
|
|
1271
|
+
"ui.back.quality": "Rozhodnutí o kvalitě stromu: {n}",
|
|
1272
|
+
"ui.back.kept": "Nic se nemaže: návrat je nová změna v historii a jde vrátit stejnou cestou. Úkoly, sezení, nastavení a obrázky zůstávají, jak jsou.",
|
|
1273
|
+
"ui.back.kept.archive": "Nic se nemaže: návrat je nová změna v historii a jde vrátit stejnou cestou. Nastavení a obrázky zůstávají, jak jsou.",
|
|
1274
|
+
"ui.back.inbox": "Stromy poslané z aplikace Strom čekají na rozhodnutí ({n}): návrat je nechá čekat; rozhodnuté po něm se zapíšou nad vrácený stav (strom sync --inbox).",
|
|
1275
|
+
"ui.back.nothing": "Výzkum je takový, jaký byl tehdy: není co vracet.",
|
|
1276
|
+
"ui.back.now": "Změna z {when} ({change}) je dnešní stav: není co vracet.",
|
|
1277
|
+
"ui.back.ask": "Vrátit výzkum do tohoto stavu?",
|
|
1278
|
+
"ui.back.person": "O návratu v čase rozhoduje jen člověk ve vlastním terminálu – {command}",
|
|
1279
|
+
"ui.back.done": "Výzkum je znovu ve stavu z {when}. Vrácení tohoto návratu: {undo}",
|
|
1256
1280
|
"ui.history.past.hidden": "Skryto: {event} – {where}",
|
|
1257
1281
|
"ui.history.past.shown": "Znovu zobrazeno: {event} – {where}",
|
|
1258
1282
|
"ui.history.past.same": "Beze změny: {event} – {where}",
|
|
@@ -3106,6 +3130,12 @@
|
|
|
3106
3130
|
"ui.fixes.street-places.undone": "Vráceno, jak bylo: {n, plural, one {# údaj} few {# údaje} other {# údajů}}{left}",
|
|
3107
3131
|
"ui.fixes.street-places.left": " · {n, plural, one {# se mezitím změnil, ponechán} few {# se mezitím změnily, ponechány} other {# se mezitím změnilo, ponecháno}}",
|
|
3108
3132
|
"ui.fixes.street-places.nothing": "Není co vracet: místa se neopravovala, nebo už jsou zpět, jak byla.",
|
|
3133
|
+
"ui.fixes.street-places.bare": "Samotné číslo za jménem obce, kterou výzkum píše („Lhota 16“), může být její dům, nebo její část („Praha 5“): opraví se jen na slovo člověka za celou obec. Nikdy se nenabízí, kde číslo značí část: obec číslovaná po částech, záznam místa se jménem i číslem, ulice v něm.",
|
|
3134
|
+
"ui.fixes.street-places.town": " {town}: {n, plural, one {# údaj} few {# údaje} other {# údajů}} se samotným číslem za jménem ({places})",
|
|
3135
|
+
"ui.fixes.street-places.town.ask": "{town}: jsou čísla za jménem obce čísla domů?",
|
|
3136
|
+
"ui.fixes.street-places.town.yes": "Ano: čísla v obci {town} jsou domy – opravit {n, plural, one {# údaj} few {# údaje} other {# údajů}}",
|
|
3137
|
+
"ui.fixes.street-places.town.no": "Ne: {town} s číslem je část obce nebo samostatné místo (dotaz se už neopakuje)",
|
|
3138
|
+
"ui.fixes.street-places.town.kept": "Ponecháno jako samostatná místa: {towns}. Zeptat se znovu: strom fixes reopen {id}",
|
|
3109
3139
|
"ui.fixes.state.pending.facts": "{count, plural, one {# údaj čeká} few {# údaje čekají} other {# údajů čeká}} na rozhodnutí",
|
|
3110
3140
|
"ui.doc.fixes.pending.facts": "{name}: {count, plural, one {# údaj čeká} few {# údaje čekají} other {# údajů čeká}} na rozhodnutí",
|
|
3111
3141
|
"fix.reread.what": "Porovnat dvě čtení {media}: dřívější {old} a nové {now} z ostřejší kopie",
|
|
@@ -3142,6 +3172,16 @@
|
|
|
3142
3172
|
"ui.repair.still": "{n, plural, one {zbývá # problém} few {zbývají # problémy} other {zbývá # problémů}} → strom verify",
|
|
3143
3173
|
"ui.error.seal.repair-in-terminal": "výzkum „{name}“ obsahuje práci zapečetěnou klíčem stromu z terminálu, který strom spuštěný z aplikace nevidí: nic se neopravilo",
|
|
3144
3174
|
"ui.error.seal.repair-in-terminal.hint": "ve vlastním terminálu: strom repair, pak strom seal adopt – ten vidí oba klíče a vrátí jen to, co se udělalo mimo strom",
|
|
3175
|
+
"ui.error.back.busy": "na výzkumu se právě pracuje: návrat až po skončení práce",
|
|
3176
|
+
"ui.error.back.busy.hint": "strom session finish, pak {command}",
|
|
3177
|
+
"ui.error.back.noday": "do {day} včetně není žádná změna",
|
|
3178
|
+
"ui.error.back.noday.hint": "strom history (změny i s jejich dny)",
|
|
3179
|
+
"ui.error.back.unknown": "změna {change} v historii tohoto výzkumu není",
|
|
3180
|
+
"ui.error.back.unknown.hint": "strom history",
|
|
3181
|
+
"ui.error.back.unsaved": "výzkum má neuložené změny: návrat jen z uloženého stavu",
|
|
3182
|
+
"ui.error.back.unsaved.hint": "strom check",
|
|
3183
|
+
"ui.error.back.moved": "výzkum se od náhledu změnil: nic se nevrátilo",
|
|
3184
|
+
"ui.error.back.moved.hint": "strom history back <změna> (znovu náhled)",
|
|
3145
3185
|
"ui.menu.seal": "Zapečetěno na jiném počítači: zapisovat tu jde až po převzetí (strom seal adopt).",
|
|
3146
3186
|
"ui.seal.bridge": "výzkum „{name}“ je zapečetěný na jiném počítači: nic se nezapsalo – po převzetí na tomto počítači (terminál: strom seal adopt, nebo nabídka strom) poslat znovu",
|
|
3147
3187
|
"ui.seal.bridge.twokeys": "výzkum „{name}“ je na tomto počítači zapečetěný dvěma klíči stromu (strom z aplikace a z terminálu): nic se nezapsalo – po sjednocení (terminál: strom seal adopt, nebo nabídka strom) poslat znovu",
|
package/assets/lang/de.json
CHANGED
|
@@ -770,6 +770,8 @@
|
|
|
770
770
|
"log.appshape.unfix": "Zeiträume und Alter der Strom-App wiederhergestellt, wie die Synchronisationen sie ließen: {n}",
|
|
771
771
|
"log.streetplace.fix": "Straße und Nummer aus den Orten von Angaben in ihre Häuser übernommen: {n}",
|
|
772
772
|
"log.streetplace.unfix": "Orte und Häuser von Angaben wiederhergestellt, wie sie waren: {n}",
|
|
773
|
+
"log.tree.return": "Rückkehr zum Stand vom {when}",
|
|
774
|
+
"log.streetplace.towns": "Nummern nach dem Namen einer Gemeinde beurteilt (Häuser oder nicht): {n}",
|
|
773
775
|
"afterdeath.what": "{name} prüfen: ein Ereignis nach dem Tod datiert ({year})",
|
|
774
776
|
"afterdeath.wedding.what": "{name} prüfen: eine Heirat nach dem Tod datiert ({year})",
|
|
775
777
|
"afterdeath.why": "Der Tod: {death}. Danach datiert: {event}. Eines der Daten ist falsch gelesen, oder die Einträge betreffen zwei Personen.",
|
|
@@ -993,6 +995,9 @@
|
|
|
993
995
|
"ui.browse.card": "Eine Person: Leben, Familie und Einträge",
|
|
994
996
|
"ui.browse.pedigree": "Die Vorfahren einer Person",
|
|
995
997
|
"ui.browse.files": "Die Ergebnisdateien (GEDCOM)",
|
|
998
|
+
"ui.browse.time": "Zurück in der Zeit (Stand nach einer früheren Änderung)",
|
|
999
|
+
"ui.back.pick": "Zum Stand nach welcher Änderung?",
|
|
1000
|
+
"ui.back.none": "Noch keine Änderung, zu der es zurückgeht.",
|
|
996
1001
|
"ui.browse.back": "Zurück",
|
|
997
1002
|
"ui.browse.whose": "Wessen Vorfahren? (ein Name oder eine ID wie P0012; 0 geht zurück)",
|
|
998
1003
|
"ui.date.about": "etwa {date}",
|
|
@@ -1152,6 +1157,7 @@
|
|
|
1152
1157
|
"ui.help.cmd.recent": "Was zuletzt hinzukam",
|
|
1153
1158
|
"ui.help.cmd.plan": "Was der Agent als Nächstes tut",
|
|
1154
1159
|
"ui.help.cmd.history": "Was sich änderte, eine Zeile je Änderung",
|
|
1160
|
+
"ui.help.cmd.history.back": "Zurück zum Stand nach einer früheren Änderung (erst eine Vorschau, nichts wird gelöscht)",
|
|
1155
1161
|
"ui.help.cmd.person.card": "Das Leben einer Person mit ihren Einträgen",
|
|
1156
1162
|
"ui.help.cmd.person.list": "Die Personen des Stammbaums",
|
|
1157
1163
|
"ui.help.cmd.pedigree": "Die Vorfahren einer Person als Baum",
|
|
@@ -1253,6 +1259,24 @@
|
|
|
1253
1259
|
"ui.recent.more": "… und {n} weitere",
|
|
1254
1260
|
"ui.recent.morechanges": "(und weitere Änderungen: {n})",
|
|
1255
1261
|
"ui.history.none": "der Verlauf ist noch leer",
|
|
1262
|
+
"ui.history.back.hint": "Zurück zum Stand nach einer dieser Änderungen: strom history back <Änderung>",
|
|
1263
|
+
"ui.back.title": "Rückkehr zum Stand nach der Änderung vom {when} ({change}):",
|
|
1264
|
+
"ui.back.g.people": "Personen",
|
|
1265
|
+
"ui.back.g.families": "Familien",
|
|
1266
|
+
"ui.back.g.sources": "Quellen und Bilder",
|
|
1267
|
+
"ui.back.g.other": "Orte, Suchen, Widersprüche, Hypothesen, Material",
|
|
1268
|
+
"ui.back.asthen": "{n} wie damals",
|
|
1269
|
+
"ui.back.out": "{n} herausgenommen (später hinzugefügt)",
|
|
1270
|
+
"ui.back.facts": "Abweichende Angaben: {n}",
|
|
1271
|
+
"ui.back.quality": "Entscheidungen zur Qualität des Stammbaums: {n}",
|
|
1272
|
+
"ui.back.kept": "Nichts wird gelöscht: Die Rückkehr ist eine neue Änderung im Verlauf und lässt sich auf demselben Weg zurücknehmen. Aufgaben, Sitzungen, Einstellungen und Bilder bleiben, wie sie sind.",
|
|
1273
|
+
"ui.back.kept.archive": "Nichts wird gelöscht: Die Rückkehr ist eine neue Änderung im Verlauf und lässt sich auf demselben Weg zurücknehmen. Einstellungen und Bilder bleiben, wie sie sind.",
|
|
1274
|
+
"ui.back.inbox": "Aus der Strom-App gesendete Bäume warten auf eine Entscheidung ({n}): Die Rückkehr lässt sie warten; danach entschieden, kommen sie über den zurückgeholten Stand (strom sync --inbox).",
|
|
1275
|
+
"ui.back.nothing": "Die Forschung ist so, wie sie damals war: nichts zurückzunehmen.",
|
|
1276
|
+
"ui.back.now": "Die Änderung vom {when} ({change}) ist der heutige Stand: nichts zurückzunehmen.",
|
|
1277
|
+
"ui.back.ask": "Die Forschung auf diesen Stand zurücksetzen?",
|
|
1278
|
+
"ui.back.person": "Über eine Rückkehr in der Zeit entscheidet nur ein Mensch im eigenen Terminal – {command}",
|
|
1279
|
+
"ui.back.done": "Die Forschung ist wieder auf dem Stand vom {when}. Rückkehr zurücknehmen: {undo}",
|
|
1256
1280
|
"ui.history.past.hidden": "Ausgeblendet: {event} – {where}",
|
|
1257
1281
|
"ui.history.past.shown": "Wieder angezeigt: {event} – {where}",
|
|
1258
1282
|
"ui.history.past.same": "Unverändert: {event} – {where}",
|
|
@@ -3106,6 +3130,12 @@
|
|
|
3106
3130
|
"ui.fixes.street-places.undone": "Wiederhergestellt, wie sie waren: {n, plural, one {# Angabe} other {# Angaben}}{left}",
|
|
3107
3131
|
"ui.fixes.street-places.left": " · {n, plural, one {# seitdem geändert, belassen} other {# seitdem geändert, belassen}}",
|
|
3108
3132
|
"ui.fixes.street-places.nothing": "Nichts wiederherzustellen: die Orte wurden nicht korrigiert, oder sie sind schon wieder, wie sie waren.",
|
|
3133
|
+
"ui.fixes.street-places.bare": "Eine Nummer allein nach dem Namen einer Gemeinde, die die Forschung schreibt („Lhota 16“), kann ihr Haus oder ein Teil von ihr sein („Praha 5“): richtiggestellt nur auf das Wort einer Person für die ganze Gemeinde. Nie angeboten, wo die Nummer einen Teil nennt: eine nach Teilen nummerierte Gemeinde, ein Ortseintrag des Namens mit Nummer, eine Straße darin.",
|
|
3134
|
+
"ui.fixes.street-places.town": " {town}: {n, plural, one {# Angabe} other {# Angaben}} mit einer Nummer allein nach dem Namen ({places})",
|
|
3135
|
+
"ui.fixes.street-places.town.ask": "{town}: sind die Nummern nach dem Gemeindenamen Hausnummern?",
|
|
3136
|
+
"ui.fixes.street-places.town.yes": "Ja: die Nummern in {town} sind Häuser – {n, plural, one {# Angabe} other {# Angaben}} korrigieren",
|
|
3137
|
+
"ui.fixes.street-places.town.no": "Nein: {town} mit Nummer ist ein Teil der Gemeinde oder ein eigener Ort (keine weitere Frage)",
|
|
3138
|
+
"ui.fixes.street-places.town.kept": "Als eigene Orte belassen: {towns}. Erneut fragen: strom fixes reopen {id}",
|
|
3109
3139
|
"ui.fixes.state.pending.facts": "{count, plural, one {# Angabe wartet} other {# Angaben warten}} auf eine Entscheidung",
|
|
3110
3140
|
"ui.doc.fixes.pending.facts": "{name}: {count, plural, one {# Angabe wartet} other {# Angaben warten}} auf eine Entscheidung",
|
|
3111
3141
|
"fix.reread.what": "Die zwei Lesungen von {media} vergleichen: die frühere {old} und die neue {now} aus einer schärferen Kopie",
|
|
@@ -3142,6 +3172,16 @@
|
|
|
3142
3172
|
"ui.repair.still": "noch {n, plural, one {# Problem} other {# Probleme}} → strom verify",
|
|
3143
3173
|
"ui.error.seal.repair-in-terminal": "die Forschung „{name}“ enthält Arbeit, versiegelt mit dem Schlüssel des strom aus dem Terminal, den ein aus einer App gestartetes strom nicht sieht: nichts wurde repariert",
|
|
3144
3174
|
"ui.error.seal.repair-in-terminal.hint": "in einem eigenen Terminal: strom repair, dann strom seal adopt – es sieht beide Schlüssel und macht nur rückgängig, was außerhalb von strom geschah",
|
|
3175
|
+
"ui.error.back.busy": "an dieser Forschung wird gerade gearbeitet: eine Rückkehr erst, wenn die Arbeit beendet ist",
|
|
3176
|
+
"ui.error.back.busy.hint": "strom session finish, dann {command}",
|
|
3177
|
+
"ui.error.back.noday": "keine Änderung bis einschließlich {day}",
|
|
3178
|
+
"ui.error.back.noday.hint": "strom history (die Änderungen mit ihren Tagen)",
|
|
3179
|
+
"ui.error.back.unknown": "keine Änderung {change} im Verlauf dieser Forschung",
|
|
3180
|
+
"ui.error.back.unknown.hint": "strom history",
|
|
3181
|
+
"ui.error.back.unsaved": "die Forschung hat noch nicht gespeicherte Änderungen: eine Rückkehr nur von einem gespeicherten Stand",
|
|
3182
|
+
"ui.error.back.unsaved.hint": "strom check",
|
|
3183
|
+
"ui.error.back.moved": "die Forschung hat sich seit der Vorschau geändert: nichts zurückgenommen",
|
|
3184
|
+
"ui.error.back.moved.hint": "strom history back <Änderung> (die Vorschau erneut)",
|
|
3145
3185
|
"ui.menu.seal": "Auf einem anderen Computer versiegelt: schreiben hier erst nach der Übernahme (strom seal adopt).",
|
|
3146
3186
|
"ui.seal.bridge": "die Forschung „{name}“ ist auf einem anderen Computer versiegelt: nichts wurde geschrieben – nach der Übernahme auf diesem Computer (Terminal: strom seal adopt, oder das Menü von strom) erneut senden",
|
|
3147
3187
|
"ui.seal.bridge.twokeys": "die Forschung „{name}“ ist auf diesem Computer mit zwei Schlüsseln von strom versiegelt (strom einer App und eines Terminals): nichts wurde geschrieben – nach dem Vereinen (Terminal: strom seal adopt, oder das Menü von strom) erneut senden",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"about": "Words that tell a street or a house number in the place of a fact (\"Lhota, Dlouhá ulice 12\"): the place is the municipality, the street and the number its house. Compared folded (no accents, lower case), word by word, in any script. words: a word of a street anywhere in a part; suffixes: a word ending so (German Hauptstraße, Dutch Kerkstraat); last: only as the last word of a part (\"Main St.\" — \"St. Martin\" is a saint); house: what stands before a house number (\"č. p. 12\", \"Nr. 3\") — counted only with a number after it.",
|
|
2
|
+
"about": "Words that tell a street or a house number in the place of a fact (\"Lhota, Dlouhá ulice 12\"): the place is the municipality, the street and the number its house. Compared folded (no accents, lower case), word by word, in any script. words: a word of a street anywhere in a part; suffixes: a word ending so (German Hauptstraße, Dutch Kerkstraat); last: only as the last word of a part (\"Main St.\" — \"St. Martin\" is a saint); house: what stands before a house number (\"č. p. 12\", \"Nr. 3\") — counted only with a number after it; numbered: municipalities whose number after the name is a part of them (\"Praha 5\"), never a house — a number alone after any other municipality (\"Lhota 16\") is a house only when a person says so for the whole municipality.",
|
|
3
3
|
"words": {
|
|
4
4
|
"cs": ["ulice", "ul.", "náměstí", "nám.", "třída", "tř.", "nábřeží", "nábř.", "alej"],
|
|
5
5
|
"sk": ["ulica", "námestie", "nábrežie", "trieda"],
|
|
@@ -19,5 +19,6 @@
|
|
|
19
19
|
},
|
|
20
20
|
"suffixes": ["straße", "strasse", "str.", "gasse", "platz", "weg", "allee", "straat", "plein", "gracht", "gatan", "gade", "vej", "vägen"],
|
|
21
21
|
"last": ["st.", "st"],
|
|
22
|
-
"house": ["č. p.", "č.p.", "čp.", "č.", "čís.", "č. d.", "nr.", "nr", "no.", "nro.", "num.", "hnr.", "hausnr.", "haus", "house", "№", "д.", "дом"]
|
|
22
|
+
"house": ["č. p.", "č.p.", "čp.", "č.", "čís.", "č. d.", "nr.", "nr", "no.", "nro.", "num.", "hnr.", "hausnr.", "haus", "house", "№", "д.", "дом"],
|
|
23
|
+
"numbered": ["Praha", "Prag", "Brno", "Brünn", "Plzeň", "Pilsen", "Wien", "Budapest", "Paris", "Lyon", "Marseille"]
|
|
23
24
|
}
|
package/dist/cli/help.js
CHANGED
|
@@ -28,7 +28,7 @@ const ARCHIVE_COMMANDS = new Set([
|
|
|
28
28
|
"init", "trees", "trees use", "trees remove", "mode", "lang", "pack", "unpack", "backup", "sync", "sync undo", "sync discard",
|
|
29
29
|
"intake", "input list", "input show", "conflict list", "conflict show", "conflict resolve",
|
|
30
30
|
"person list", "person show", "person card", "family show", "source list", "source show", "media list", "media show",
|
|
31
|
-
"find", "stats", "pedigree", "recent", "history",
|
|
31
|
+
"find", "stats", "pedigree", "recent", "history", "history back",
|
|
32
32
|
"export gedcom", "gedcom validate", "app", "app install", "live", "live start", "live stop",
|
|
33
33
|
"check", "verify", "repair", "seal adopt",
|
|
34
34
|
"phone", "phone status", "phone on", "phone qr", "phone off", "phone list", "phone remove",
|
|
@@ -211,7 +211,7 @@ export const HUMAN_COMMANDS = [
|
|
|
211
211
|
"init", "trees", "trees use", "trees remove", "lang", "mode",
|
|
212
212
|
"chat", "run", "session finish", "research new", "research pause", "research resume", "research done", "review",
|
|
213
213
|
"intake", "sync", "sync undo", "sync discard", "conflict list", "conflict resolve", "task list", "task wake", "story approve", "story discard",
|
|
214
|
-
"stats", "recent", "plan", "history", "person card", "person list", "pedigree", "find",
|
|
214
|
+
"stats", "recent", "plan", "history", "history back", "person card", "person list", "pedigree", "find",
|
|
215
215
|
"app", "app install", "live", "live start", "live stop", "phone", "phone on", "phone qr", "phone off", "export gedcom", "pack", "unpack", "backup", "tidy", "check", "media calibrate",
|
|
216
216
|
"config get", "config set", "login", "connector use", "link on", "link off", "hook on", "hook off",
|
|
217
217
|
];
|
package/dist/cli/menu-links.js
CHANGED
|
@@ -46,6 +46,7 @@ import { openForUser } from "../core/open.js";
|
|
|
46
46
|
import { fileRefused } from "../core/taskfiles.js";
|
|
47
47
|
import { placesPinned } from "../core/pastevents.js";
|
|
48
48
|
import { fixCheck, fixEnv, pendingFixes } from "../commands/fixchecks.js";
|
|
49
|
+
import { historyRows } from "../commands/checks.js";
|
|
49
50
|
import { placeEstimate, placeLabel, placeRecord, placesWithCoords, placeTask } from "../core/placehistory.js";
|
|
50
51
|
/** What the Strom app asks, said before anything is done; true when the person goes on. */
|
|
51
52
|
export async function asks(ctx, lang, root, what, note, suggested = true) {
|
|
@@ -336,6 +337,27 @@ export async function fixesDo(ctx, run, lang, root, id, what) {
|
|
|
336
337
|
const waits = (pendingFixes(tree, fixEnv(ctx, tree)) ?? []).some((p) => p.check.id === check.id);
|
|
337
338
|
return (await run(waits ? ["fixes", "run", check.id] : ["fixes", "show", check.id])) === 0;
|
|
338
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* The research back in time from a link (strom-research://back): the change the app names by its hash, else the earlier
|
|
342
|
+
* changes to pick from as the menu's look through the family tree offers them — then strom history back itself: the
|
|
343
|
+
* preview and the person's yes here (never the link's own answer). A change that is no return (the state now, one not of
|
|
344
|
+
* this research) is said by it. Its exit code; undefined when nothing was run (none to pick, or 0 for back).
|
|
345
|
+
*/
|
|
346
|
+
export async function backDo(ctx, run, lang, root, change) {
|
|
347
|
+
if (change)
|
|
348
|
+
return run(["history", "back", change]);
|
|
349
|
+
const t = translator(lang);
|
|
350
|
+
// the newest change is the state now: the earlier ones offered
|
|
351
|
+
const rows = historyRows(Tree.open(root, ctx.env), 10).filter((r) => !r.now).slice(0, 9);
|
|
352
|
+
if (!rows.length) {
|
|
353
|
+
out(ctx, t("ui.back.none"));
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
const i = await ctx.choose(t("ui.back.pick"), rows.map((r) => ({ label: `${r.when} — ${r.text}` })), 0, { back: t("ui.browse.back") });
|
|
357
|
+
if (i === undefined)
|
|
358
|
+
return undefined;
|
|
359
|
+
return run(["history", "back", rows[i].change]);
|
|
360
|
+
}
|
|
339
361
|
/** A direction of the research paused, ended (each with the person's reason, if they give one) or taken up again. */
|
|
340
362
|
export async function directionDo(ctx, run, lang, root, id, what) {
|
|
341
363
|
const t = translator(lang);
|
package/dist/cli/menu.js
CHANGED
|
@@ -640,7 +640,17 @@ async function browse(ctx, run, lang, root) {
|
|
|
640
640
|
}
|
|
641
641
|
},
|
|
642
642
|
},
|
|
643
|
-
|
|
643
|
+
// back in time: to the state after an earlier change (strom history back — the preview, then the person's yes)
|
|
644
|
+
{
|
|
645
|
+
key: "6",
|
|
646
|
+
label: t("ui.browse.time"),
|
|
647
|
+
act: async () => {
|
|
648
|
+
const { backDo } = await import("./menu-links.js");
|
|
649
|
+
if ((await backDo(ctx, run, lang, root)) !== undefined)
|
|
650
|
+
await partsPause(ctx, lang);
|
|
651
|
+
},
|
|
652
|
+
},
|
|
653
|
+
...(stromAppState(ctx.settings) === "no" ? [] : [{ key: "7", label: t("ui.menu.app"), act: async () => openStromApp(ctx, run, lang, stromAppState(ctx.settings) !== "unknown") }]),
|
|
644
654
|
];
|
|
645
655
|
return { items };
|
|
646
656
|
});
|
package/dist/cli/ui.js
CHANGED
|
@@ -807,6 +807,9 @@ export const UI = {
|
|
|
807
807
|
"ui.browse.card": "One person: their life, family and records",
|
|
808
808
|
"ui.browse.pedigree": "The ancestors of one person",
|
|
809
809
|
"ui.browse.files": "The result files (GEDCOM)",
|
|
810
|
+
"ui.browse.time": "Back in time (the state after an earlier change)",
|
|
811
|
+
"ui.back.pick": "To the state after which change?",
|
|
812
|
+
"ui.back.none": "No change to return to yet.",
|
|
810
813
|
"ui.browse.back": "Back",
|
|
811
814
|
"ui.browse.whose": "Whose ancestors? (a name or an ID such as P0012; 0 goes back)",
|
|
812
815
|
"ui.date.about": "about {date}",
|
|
@@ -966,6 +969,7 @@ export const UI = {
|
|
|
966
969
|
"ui.help.cmd.recent": "What came in lately",
|
|
967
970
|
"ui.help.cmd.plan": "What the agent does next",
|
|
968
971
|
"ui.help.cmd.history": "What changed, one line per change",
|
|
972
|
+
"ui.help.cmd.history.back": "Back to the state after an earlier change (a preview first, nothing deleted)",
|
|
969
973
|
"ui.help.cmd.person.card": "One person's life with its records",
|
|
970
974
|
"ui.help.cmd.person.list": "The people of the family tree",
|
|
971
975
|
"ui.help.cmd.pedigree": "The ancestors of a person as a tree",
|
|
@@ -1177,6 +1181,12 @@ export const UI = {
|
|
|
1177
1181
|
"ui.fixes.street-places.undone": "Put back as they were: {n, plural, one {# fact} other {# facts}}{left}",
|
|
1178
1182
|
"ui.fixes.street-places.left": " · {n, plural, one {# changed since, left as it is} other {# changed since, left as they are}}",
|
|
1179
1183
|
"ui.fixes.street-places.nothing": "Nothing to put back: the places were not set right, or are back as they were already.",
|
|
1184
|
+
"ui.fixes.street-places.bare": "A number alone after the name of a municipality the research writes (\"Lhota 16\") may be its house or a part of it (\"Praha 5\"): set right only on a person's word for the whole municipality. Never offered where the number names a part: a municipality numbered by its parts, a place record of the name with its number, a street there.",
|
|
1185
|
+
"ui.fixes.street-places.town": " {town}: {n, plural, one {# fact} other {# facts}} with a number alone after the name ({places})",
|
|
1186
|
+
"ui.fixes.street-places.town.ask": "{town}: are the numbers after the municipality's name house numbers?",
|
|
1187
|
+
"ui.fixes.street-places.town.yes": "Yes: the numbers in {town} are houses — set {n, plural, one {# fact} other {# facts}} right",
|
|
1188
|
+
"ui.fixes.street-places.town.no": "No: {town} with a number is a part of the municipality or a place of its own (not asked again)",
|
|
1189
|
+
"ui.fixes.street-places.town.kept": "Left as places of their own: {towns}. Asked again: strom fixes reopen {id}",
|
|
1180
1190
|
"ui.fixes.state.pending.facts": "{count, plural, one {# fact waits} other {# facts wait}} for a decision",
|
|
1181
1191
|
"ui.doc.fixes.pending.facts": "{name}: {count, plural, one {# fact waits} other {# facts wait}} for a decision",
|
|
1182
1192
|
"ui.error.consent": "this needs a yes — {question}",
|
|
@@ -1207,6 +1217,24 @@ export const UI = {
|
|
|
1207
1217
|
"ui.recent.more": "… and {n} more",
|
|
1208
1218
|
"ui.recent.morechanges": "(and {n, plural, one {# more change} other {# more changes}})",
|
|
1209
1219
|
"ui.history.none": "nothing in the history yet",
|
|
1220
|
+
"ui.history.back.hint": "Back to the state after one of these changes: strom history back <change>",
|
|
1221
|
+
"ui.back.title": "Return to the state after the change of {when} ({change}):",
|
|
1222
|
+
"ui.back.g.people": "People",
|
|
1223
|
+
"ui.back.g.families": "Families",
|
|
1224
|
+
"ui.back.g.sources": "Sources and images",
|
|
1225
|
+
"ui.back.g.other": "Places, searches, conflicts, hypotheses, material",
|
|
1226
|
+
"ui.back.asthen": "{n} as then",
|
|
1227
|
+
"ui.back.out": "{n} taken out (added later)",
|
|
1228
|
+
"ui.back.facts": "Facts that differ: {n}",
|
|
1229
|
+
"ui.back.quality": "Decisions on the tree's quality: {n}",
|
|
1230
|
+
"ui.back.kept": "Nothing is deleted: the return is a new change in the history and can be taken back the same way. Tasks, sessions, settings and images stay as they are.",
|
|
1231
|
+
"ui.back.kept.archive": "Nothing is deleted: the return is a new change in the history and can be taken back the same way. Settings and images stay as they are.",
|
|
1232
|
+
"ui.back.inbox": "Trees the Strom app sent wait for a decision ({n}): the return leaves them waiting; decided after it, they come on top of the state returned to (strom sync --inbox).",
|
|
1233
|
+
"ui.back.nothing": "The research is as it was then: nothing to return.",
|
|
1234
|
+
"ui.back.now": "The change of {when} ({change}) is the state now: nothing to return.",
|
|
1235
|
+
"ui.back.ask": "Return the research to this state?",
|
|
1236
|
+
"ui.back.person": "Returning in time is a person's own decision, at their own terminal — {command}",
|
|
1237
|
+
"ui.back.done": "The research is in its state of {when} again. Taking the return back: {undo}",
|
|
1210
1238
|
"ui.history.past.hidden": "Hidden: {event} at {where}",
|
|
1211
1239
|
"ui.history.past.shown": "Shown again: {event} at {where}",
|
|
1212
1240
|
"ui.history.past.same": "Nothing changed: {event} at {where}",
|
|
@@ -2824,6 +2852,16 @@ export const UI = {
|
|
|
2824
2852
|
"ui.repair.still": "still {n, plural, one {# problem} other {# problems}} → strom verify",
|
|
2825
2853
|
"ui.error.seal.repair-in-terminal": "\"{name}\" holds work sealed with the key of the terminal's strom, which a strom started by an app cannot see: nothing repaired",
|
|
2826
2854
|
"ui.error.seal.repair-in-terminal.hint": "in a terminal of its own: strom repair, then strom seal adopt — it sees both keys and undoes only what was done outside strom",
|
|
2855
|
+
"ui.error.back.busy": "somebody is at work on this research: a return only once the work is finished",
|
|
2856
|
+
"ui.error.back.busy.hint": "strom session finish, then {command}",
|
|
2857
|
+
"ui.error.back.noday": "no change on or before {day}",
|
|
2858
|
+
"ui.error.back.noday.hint": "strom history (the changes, with their days)",
|
|
2859
|
+
"ui.error.back.unknown": "no change {change} in this research's history",
|
|
2860
|
+
"ui.error.back.unknown.hint": "strom history",
|
|
2861
|
+
"ui.error.back.unsaved": "the research has changes not saved yet: a return only from a saved state",
|
|
2862
|
+
"ui.error.back.unsaved.hint": "strom check",
|
|
2863
|
+
"ui.error.back.moved": "the research changed since the preview: nothing returned",
|
|
2864
|
+
"ui.error.back.moved.hint": "strom history back <change> (the preview again)",
|
|
2827
2865
|
"ui.menu.seal": "Sealed on another computer: writing here only once taken over (strom seal adopt).",
|
|
2828
2866
|
"ui.seal.bridge": "\"{name}\" was sealed on another computer: nothing was written — once it is taken over on this one (a terminal: strom seal adopt, or strom's menu), send again",
|
|
2829
2867
|
"ui.seal.bridge.twokeys": "\"{name}\" was sealed with two keys of strom on this computer (strom of an app and of a terminal): nothing was written — once they are united (a terminal: strom seal adopt, or strom's menu), send again",
|
package/dist/commands/checks.js
CHANGED
|
@@ -11,13 +11,16 @@ import { unprovenPeople } from "../core/review.js";
|
|
|
11
11
|
import { AFTER_REPAIR_HINT, NOT_DOWNLOADED, OTHER_KEY, REPAIR_IN_TERMINAL_HINT, SEALED_PATHS, lastSealed, notDownloaded, notDownloadedError, otherKeyError, verifyFast, verifyFull } from "../core/integrity.js";
|
|
12
12
|
import { otherKeys } from "../core/seal.js";
|
|
13
13
|
import { adoptSeal, keysToUnite } from "../cli/seal.js";
|
|
14
|
-
import { NeedsConsentError, StromError } from "../core/errors.js";
|
|
14
|
+
import { NeedsConsentError, StromError, UsageError } from "../core/errors.js";
|
|
15
15
|
import * as git from "../core/git.js";
|
|
16
16
|
import { ui } from "../cli/ui.js";
|
|
17
17
|
import { history } from "../core/live.js";
|
|
18
18
|
import { humanWhen } from "../cli/human.js";
|
|
19
19
|
import { isAgent } from "../core/which.js";
|
|
20
20
|
import { writeProblems } from "../core/writable.js";
|
|
21
|
+
import { applyReturn, planReturn, resolveTarget } from "../core/timetravel.js";
|
|
22
|
+
import { liveWorkers, runsAtWork } from "../core/workers.js";
|
|
23
|
+
import { receivedPending } from "../core/sync.js";
|
|
21
24
|
/**
|
|
22
25
|
* A finding a person may meet with nothing gone wrong, said in their language (found on Windows: "counter P is behind
|
|
23
26
|
* existing IDs" in a Czech research, after a write a held file stopped); the rest stay strom's own words.
|
|
@@ -275,14 +278,95 @@ register({
|
|
|
275
278
|
// show a person (the agents' files, the tree made) left out of the lines, never out of --json (found 2026-10-04:
|
|
276
279
|
// "strom sync undo: 5 changes" in a German research)
|
|
277
280
|
const lang = tree.lang;
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
281
|
+
const rows = historyRows(tree, ctx.limit).map((r) => [r.change, r.when, r.text]);
|
|
282
|
+
// the way back to one of them, for a person reading it (the command is theirs alone)
|
|
283
|
+
return { text: rows.length ? lines(table(rows), "", ui(lang, "ui.history.back.hint")) : ui(lang, "ui.history.none"), data: { commits } };
|
|
284
|
+
},
|
|
285
|
+
}, {
|
|
286
|
+
path: ["history", "back"],
|
|
287
|
+
summary: "Return the research to its state after an earlier change (a new change: nothing deleted; the person's own)",
|
|
288
|
+
group: "history",
|
|
289
|
+
tree: true,
|
|
290
|
+
writes: true,
|
|
291
|
+
description: "The people, families, sources, places and the rest of the tree's evidence as they were right after the change named\n" +
|
|
292
|
+
"(its hash from strom history, or a day YYYY-MM-DD: the state at its end), the person's decisions on the tree's\n" +
|
|
293
|
+
"quality with them. Written as one new change: records added later are retracted, never deleted, and the whole\n" +
|
|
294
|
+
"history stays — a return is taken back the same way (the command it prints). What stays as it is: the tasks,\n" +
|
|
295
|
+
"sessions, directions and lessons, the settings, the history of the places, the images in the shared folder.\n" +
|
|
296
|
+
"--preview says what would return (read only, anyone may). The return itself is the person's own decision, at their\n" +
|
|
297
|
+
"own terminal — an agent tells the user the command, never runs it; never while somebody works on the research.",
|
|
298
|
+
args: [{ name: "change", description: "the change from strom history (e.g. 1a2b3c4d), or a day YYYY-MM-DD", required: true }],
|
|
299
|
+
options: [{ name: "preview", type: "boolean", description: "only say what would return; nothing written" }],
|
|
300
|
+
examples: ["strom history back 1a2b3c4d --preview", "strom history back 2026-01-15"],
|
|
301
|
+
async run(ctx, { args, opts }) {
|
|
302
|
+
const tree = ctx.tree();
|
|
303
|
+
const lang = tree.lang;
|
|
304
|
+
const target = resolveTarget(tree, args[0]);
|
|
305
|
+
const change = target.hash.slice(0, 8);
|
|
306
|
+
const when = humanWhen(target.at, lang);
|
|
307
|
+
const head = git.runGit(tree.root, ["rev-parse", "HEAD"]).stdout.trim();
|
|
308
|
+
if (target.hash === head)
|
|
309
|
+
return { text: ui(lang, "ui.back.now", { when, change }), data: { change: target.hash, at: target.at, same: true, returned: false } };
|
|
310
|
+
const plan = planReturn(tree, target);
|
|
311
|
+
const set = `strom history back ${change}`;
|
|
312
|
+
const said = backPreview(tree, plan, lang);
|
|
313
|
+
const inbox = receivedPending(tree.root).length;
|
|
314
|
+
const data = { change: target.hash, at: target.at, counts: plan.counts, facts: plan.facts, quality: plan.quality, same: plan.same, ...(inbox ? { inbox } : {}) };
|
|
315
|
+
if (plan.same)
|
|
316
|
+
return { text: lines(said, ui(lang, "ui.back.nothing")), data: { ...data, returned: false } };
|
|
317
|
+
if (opts.preview)
|
|
318
|
+
return { text: lines(said, "", ui(lang, "ui.back.person", { command: set })), data: { ...data, returned: false, run: set } };
|
|
319
|
+
// nobody's work is cut short: what an agent writes now would be returned over
|
|
320
|
+
if (liveWorkers(tree.root).length > 0 || runsAtWork(tree.root).length > 0)
|
|
321
|
+
throw new UsageError("somebody is at work on this research: a return only once they finished", { hint: "strom session finish, then " + set, code: "back.busy", params: { command: set } });
|
|
322
|
+
if (ctx.yes)
|
|
323
|
+
throw new UsageError("--yes never returns the research: a person chooses at their terminal", { hint: set });
|
|
324
|
+
ctx.requireHuman(`Return the research to its state after the change of ${target.at} (${change})?`, set, "history.back", ui(lang, "ui.back.person", { command: set }), { window: false });
|
|
325
|
+
ctx.io.stdout(said + "\n");
|
|
326
|
+
if (!(await ctx.confirm(ui(lang, "ui.back.ask"), false)))
|
|
327
|
+
return { text: ui(lang, "ui.cancelled"), data: { ...data, returned: false } };
|
|
328
|
+
tree.withTreeLock(() => applyReturn(tree, plan));
|
|
329
|
+
const undo = `strom history back ${plan.head.slice(0, 8)}`;
|
|
330
|
+
return { text: ui(lang, "ui.back.done", { when, undo }), data: { ...data, returned: true, undo } };
|
|
287
331
|
},
|
|
288
332
|
});
|
|
333
|
+
/**
|
|
334
|
+
* The changes of the history as a person reads them (the newest first): its short hash, its day and what it was, in the
|
|
335
|
+
* research's language — a change with nothing to show a person (only its English subject) left out.
|
|
336
|
+
*/
|
|
337
|
+
export function historyRows(tree, limit) {
|
|
338
|
+
const lang = tree.lang;
|
|
339
|
+
const said = new Map(history(tree.root, tree, [`-n${Math.max(1, limit)}`]).map((e) => [e.head, e.text]));
|
|
340
|
+
return git.log(tree.root, limit).flatMap((c, i) => {
|
|
341
|
+
const text = (said.get(c.hash) ?? []).filter((t) => t !== c.subject);
|
|
342
|
+
if (!text.length)
|
|
343
|
+
return [];
|
|
344
|
+
return [{ change: c.hash.slice(0, 8), now: i === 0, at: c.at, when: humanWhen(c.at, lang), text: text.length > 1 ? `${text[0]} ${ui(lang, "ui.recent.morechanges", { n: text.length - 1 })}` : text[0] }];
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
/** What a return changes, as a person reads it: the change returned to, then a line for each kind of record. */
|
|
348
|
+
function backPreview(tree, plan, lang) {
|
|
349
|
+
const waiting = receivedPending(tree.root).length;
|
|
350
|
+
const what = history(tree.root, tree, ["-n1", plan.target.hash])[0]?.text.find((t) => t !== plan.target.subject);
|
|
351
|
+
const groups = [
|
|
352
|
+
["ui.back.g.people", ["person"]],
|
|
353
|
+
["ui.back.g.families", ["family"]],
|
|
354
|
+
["ui.back.g.sources", ["source", "recordset", "repository", "media"]],
|
|
355
|
+
["ui.back.g.other", ["place", "search", "conflict", "hypothesis", "input"]],
|
|
356
|
+
];
|
|
357
|
+
const rows = groups.flatMap(([key, types]) => {
|
|
358
|
+
const back = types.reduce((n, t) => n + (plan.counts[t]?.back ?? 0), 0);
|
|
359
|
+
const out = types.reduce((n, t) => n + (plan.counts[t]?.out ?? 0), 0);
|
|
360
|
+
if (!back && !out)
|
|
361
|
+
return [];
|
|
362
|
+
const parts = [back ? ui(lang, "ui.back.asthen", { n: back }) : "", out ? ui(lang, "ui.back.out", { n: out }) : ""].filter(Boolean).join(", ");
|
|
363
|
+
return [` ${ui(lang, key)}: ${parts}`];
|
|
364
|
+
});
|
|
365
|
+
if (plan.facts)
|
|
366
|
+
rows.push(` ${ui(lang, "ui.back.facts", { n: plan.facts })}`);
|
|
367
|
+
if (plan.quality)
|
|
368
|
+
rows.push(` ${ui(lang, "ui.back.quality", { n: plan.quality })}`);
|
|
369
|
+
return lines(ui(lang, "ui.back.title", { when: humanWhen(plan.target.at, lang), change: plan.target.hash.slice(0, 8) }), what ? ` ${what}` : undefined, ...(plan.same ? [] : ["", ...rows, "", ui(lang, actsAsArchive(tree) ? "ui.back.kept.archive" : "ui.back.kept")]),
|
|
370
|
+
// trees the app sent that wait in the inbox (sync.review on): the return leaves them, decided after it they come on top
|
|
371
|
+
...(plan.same || !waiting ? [] : [ui(lang, "ui.back.inbox", { n: waiting })]));
|
|
372
|
+
}
|