strom-research 1.15.0 → 1.16.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.
package/CHANGELOG.cs.md CHANGED
@@ -5,6 +5,15 @@
5
5
  Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou na
6
6
  [GitHub Releases](https://github.com/ACiDekCZ/strom-research/releases) (anglicky).
7
7
 
8
+ ## 1.16.0
9
+
10
+ - **Každá osoba na kraji stromu s vlastními variantami.** Když se otevřená hypotéza napojuje na strom u více osob,
11
+ každá nese varianty, které ji jmenují, a rodinu mimo strom, ke které patří; aplikace Strom tak může ukázat všechny,
12
+ ne jen první.
13
+ - **Kraj stromu osobu po osobě.** `strom edge --json` vypíše každou osobu, na kterou hypotéza navazuje, s variantami
14
+ a rodinou každé z nich.
15
+ - **Linie výzkumu.** České texty všude říkají „linie výzkumu“, nikde už „směry“.
16
+
8
17
  ## 1.15.0
9
18
 
10
19
  *16. 10. 2026 · patří k aplikaci Strom 3.12.0.*
package/CHANGELOG.de.md CHANGED
@@ -5,6 +5,15 @@
5
5
  Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Installationszeilen stehen bei
6
6
  [GitHub Releases](https://github.com/ACiDekCZ/strom-research/releases) (auf Englisch).
7
7
 
8
+ ## 1.16.0
9
+
10
+ - **Jede Person am Rand des Stammbaums mit eigenen Varianten.** Wenn eine offene Hypothese den Stammbaum bei mehreren
11
+ Personen anschließt, trägt jede die Varianten, die sie nennen, und die Familie außerhalb des Stammbaums, zu der sie
12
+ gehört; so kann die Strom-App alle zeigen, nicht nur die erste.
13
+ - **Der Rand des Stammbaums, Person für Person.** `strom edge --json` nennt jede Person, an die eine Hypothese
14
+ anschließt, mit den Varianten und der Familie jeder einzelnen.
15
+ - **Forschungslinien auf Tschechisch.** Die tschechischen Texte sagen jetzt überall „linie výzkumu“ (Forschungslinien).
16
+
8
17
  ## 1.15.0
9
18
 
10
19
  *16.10.2026 · gehört zur Strom-App 3.12.0.*
package/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ English · [Čeština](CHANGELOG.cs.md) · [Deutsch](CHANGELOG.de.md)
5
5
  The changes of each version in short. The full notes and the install lines are on
6
6
  [GitHub Releases](https://github.com/ACiDekCZ/strom-research/releases).
7
7
 
8
+ ## 1.16.0
9
+
10
+ - **Each person where the tree ends, with its own variants.** When an open hypothesis joins the tree at several
11
+ people, each of them carries the variants that name it and the family off the tree it belongs to, so the Strom app
12
+ can show all of them, not only the first.
13
+ - **Where the tree ends, person by person.** `strom edge --json` lists each person a hypothesis joins, with the
14
+ variants and the family of each one.
15
+ - **Lines of research in Czech.** The Czech texts say „linie výzkumu“ (lines of research) everywhere now.
16
+
8
17
  ## 1.15.0
9
18
 
10
19
  *2026-10-16 · goes with the Strom app 3.12.0.*
@@ -1920,7 +1920,7 @@
1920
1920
  "ui.error.fs.no-permission": "chybí oprávnění{where}",
1921
1921
  "ui.error.fs.no-permission.hint": "vybrat složku, do které lze zapisovat",
1922
1922
  "ui.task.none": "Žádné úkoly.",
1923
- "ui.research.none": "Žádné směry výzkumu.",
1923
+ "ui.research.none": "Žádné linie výzkumu.",
1924
1924
  "ui.person.none": "Žádné osoby.",
1925
1925
  "ui.person.nomatch": "Žádná osoba neodpovídá.",
1926
1926
  "ui.person.leadsonly": "jen vodítka",
package/dist/core/edge.js CHANGED
@@ -289,12 +289,18 @@ export function treeEdges(tree, opts = {}) {
289
289
  const isle = joins.length && onTree ? isles.get(joins[0]) : undefined;
290
290
  // the variants that would make the join: those that name the people off the tree
291
291
  const variants = joins.length ? joiningVariants(tree, h, onTree ? joins : (isles.get(p.id)?.people ?? [p.id])) : [];
292
+ const each = joins.map((j) => {
293
+ const named = joiningVariants(tree, h, [j]);
294
+ const own = onTree ? isles.get(j) : undefined;
295
+ return { person: j, ...(named.length ? { variants: named } : {}), ...(own ? { island: { people: own.people.length, held: own.held } } : {}) };
296
+ });
292
297
  return {
293
298
  id: h.id,
294
299
  question: h.question,
295
300
  joins,
296
301
  ...(isle ? { island: { people: isle.people.length, held: isle.held } } : {}),
297
302
  ...(variants.length ? { variants } : {}),
303
+ ...(each.length ? { each } : {}),
298
304
  // a task about it, or one whose words name it ("the baptism … (H0007 B)")
299
305
  tests: tasks.filter((t) => LIVE.has(t.state) && (t.subject.includes(h.id) || namesId(t.what, h.id))).map((t) => t.id),
300
306
  };
package/dist/core/tree.js CHANGED
@@ -27,7 +27,7 @@ import { lastBackup } from "./backup.js";
27
27
  export const TREE_FILE = "strom.json";
28
28
  // between releases the candidate being made (a bridge run from the sources says what it is: the Strom app goes by it);
29
29
  // at a release the release's own (package.json)
30
- export const VERSION = "1.15.0";
30
+ export const VERSION = "1.16.0-beta.1";
31
31
  const GITIGNORE = `# Strom Research — local state and large files are not versioned
32
32
  .strom/
33
33
  /media/
@@ -725,8 +725,18 @@ export function exportGedcom(tree, opts = {}) {
725
725
  w.line(2, "_TRIED", id);
726
726
  for (const h of e.hypotheses) {
727
727
  w.line(2, "_HYPO", h.id);
728
- for (const j of h.joins)
729
- w.line(3, "_JOIN", j);
728
+ for (const j of h.each ?? []) {
729
+ w.line(3, "_JOIN", j.person);
730
+ // each join on its own: the variants that name the person, the family off the tree it belongs to (an older app
731
+ // passes level 4 by and takes the numbers of the hypothesis, those of the first join)
732
+ if (opts.hypothesisLinks)
733
+ for (const v of j.variants ?? [])
734
+ w.line(4, "_VAR", v);
735
+ if (j.island) {
736
+ w.line(4, "_ISLAND", String(j.island.people));
737
+ w.line(4, "_HELD", String(j.island.held));
738
+ }
739
+ }
730
740
  // which variant would make the join (an app that shows what a hypothesis would connect)
731
741
  if (opts.hypothesisLinks)
732
742
  for (const v of h.variants ?? [])
@@ -29,6 +29,8 @@ const CHILDREN = {
29
29
  "INDI._STROM_SEARCHED": ["TITL", "DATE", "RESN", "_AT"],
30
30
  "INDI._STROM_EDGE": ["_SCOPE", "_RESEARCH", "_GEN", "_END", "_NEXT", "_EST", "DATE", "_RECORDS", "_BOOK", "_COVERED", "_NORECORDS", "_TASK", "_TRIED", "_HYPO", "_CONFLICT", "_SEARCHES", "_SESSIONS", "_LAST"],
31
31
  "INDI._STROM_ISLAND": ["_HYPO", "_HELD"],
32
+ // one join of a hypothesis at the edge: the variants that name the person, the family off the tree it belongs to
33
+ "_STROM_EDGE._JOIN": ["_VAR", "_ISLAND", "_HELD"],
32
34
  // a value of a conflict the app decides by side: its side, a sex as M, F or U
33
35
  _STROM_VALUE: ["SOUR", "_STROM_SIDE", "_STROM_RAW"],
34
36
  "INDI.NAME": ["TYPE", "GIVN", "SURN", "NPFX", "NSFX", "NICK", "SPFX", "SOUR", "NOTE"],
@@ -90,6 +92,8 @@ function contextOf(anc) {
90
92
  return "_LINK";
91
93
  if (parent === "_INTREE" && anc[2] === "_VAR")
92
94
  return "_INTREE";
95
+ if (parent === "_JOIN" && anc[1] === "_STROM_EDGE" && anc[2] === "_HYPO")
96
+ return "_STROM_EDGE._JOIN";
93
97
  if (parent === "ADDR")
94
98
  return "ADDR";
95
99
  if (parent === "DATA" && anc[depth - 2] === "SOUR")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strom-research",
3
- "version": "1.15.0",
3
+ "version": "1.16.0-beta.1",
4
4
  "description": "Genealogical research toolkit for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -48,5 +48,8 @@
48
48
  "devDependencies": {
49
49
  "@types/node": "^22.20.4",
50
50
  "typescript": "^7.0.2"
51
+ },
52
+ "publishConfig": {
53
+ "tag": "beta"
51
54
  }
52
55
  }