strom-research 1.26.0-beta.5 → 1.26.0-beta.6

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
@@ -7,7 +7,7 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
7
7
 
8
8
  ## 1.26.0
9
9
 
10
- *Připravuje se: bety do 1.26.0-beta.5. Oddíl bude úplný s vydáním.*
10
+ *Připravuje se: bety do 1.26.0-beta.6. Oddíl bude úplný s vydáním.*
11
11
 
12
12
  - **Linie výzkumu z aplikace Strom: založit, upravit, pozastavit, seřadit.** Linii jde v aplikaci založit nebo upravit
13
13
  (osoba, směr, otázka, meze), pozastavit, ukončit nebo znovu spustit; pořadí linií je pořadí práce a stránka telefonu
@@ -25,6 +25,9 @@ Změny každé verze ve zkratce. Úplné poznámky a instalační řádky jsou n
25
25
  text nejmenuje, i pramen, který text jmenuje jen kódem; aplikace Strom je dostane s vyprávěním. Údaj z vodítka v textu
26
26
  říká, odkud je.
27
27
 
28
+ - Velký rodokmen převzatý ve Windows (zhruba 1 500 osob a víc) už neskončí chybou gitu o příliš dlouhém příkazu
29
+ (ENAMETOOLONG) bez jediného zapsaného údaje: vše převzaté se zapíše.
30
+
28
31
  ## 1.25.2
29
32
 
30
33
  *3. 11. 2026 · patří k aplikaci Strom 3.21.2.*
package/CHANGELOG.de.md CHANGED
@@ -7,7 +7,7 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
7
7
 
8
8
  ## 1.26.0
9
9
 
10
- *In Vorbereitung: die Betas bis 1.26.0-beta.5. Der Abschnitt ist mit dem Release vollständig.*
10
+ *In Vorbereitung: die Betas bis 1.26.0-beta.6. Der Abschnitt ist mit dem Release vollständig.*
11
11
 
12
12
  - **Die Linien der Forschung aus der Strom-App: anlegen, ändern, pausieren, ordnen.** Eine Linie lässt sich in der App
13
13
  anlegen oder ändern (Person, Richtung, Frage, Grenzen), pausieren, beenden oder wieder aufnehmen; die Reihenfolge der
@@ -28,6 +28,9 @@ Die Änderungen jeder Version in Kürze. Die vollständigen Hinweise und die Ins
28
28
  auch eine Quelle, die der Text nur mit ihrem Kürzel nennt; die Strom-App erhält sie mit der Erzählung. Eine Angabe aus
29
29
  einem Hinweis nennt im Text ihre Herkunft.
30
30
 
31
+ - Ein großer Stammbaum, unter Windows übernommen (etwa 1 500 Personen und mehr), scheitert nicht mehr in git an einer zu
32
+ langen Befehlszeile (ENAMETOOLONG), ohne dass etwas davon bleibt: alles Übernommene wird geschrieben.
33
+
31
34
  ## 1.25.2
32
35
 
33
36
  *3.11.2026 · gehört zur Strom-App 3.21.2.*
package/CHANGELOG.md CHANGED
@@ -7,7 +7,7 @@ The changes of each version in short. The full notes and the install lines are o
7
7
 
8
8
  ## 1.26.0
9
9
 
10
- *In preparation: the betas up to 1.26.0-beta.5. The section is complete with the release.*
10
+ *In preparation: the betas up to 1.26.0-beta.6. The section is complete with the release.*
11
11
 
12
12
  - **The lines of the research from the Strom app: created, changed, paused, put in order.** A line is created or changed
13
13
  in the app (its person, direction, question, limits), paused, ended or taken up again; the order of the lines is the
@@ -26,6 +26,9 @@ The changes of each version in short. The full notes and the install lines are o
26
26
  where the text does not name them, and a source the text names only by its code among them; the Strom app receives
27
27
  them with the story. A fact told from a lead names in the text where it comes from.
28
28
 
29
+ - A big family tree taken in on Windows (some 1 500 people and more) no longer fails in git over a command line too long
30
+ (ENAMETOOLONG) with nothing of it kept: everything taken in is written.
31
+
29
32
  ## 1.25.2
30
33
 
31
34
  *2026-11-03 · goes with the Strom app 3.21.2.*
package/CHANGELOG.pl.md CHANGED
@@ -7,7 +7,7 @@ Zmiany każdej wersji w skrócie. Pełne informacje o wydaniach i polecenia inst
7
7
 
8
8
  ## 1.26.0
9
9
 
10
- *W przygotowaniu: bety do 1.26.0-beta.5. Sekcja będzie kompletna z wydaniem.*
10
+ *W przygotowaniu: bety do 1.26.0-beta.6. Sekcja będzie kompletna z wydaniem.*
11
11
 
12
12
  - **Linie badania z aplikacji Strom: założyć, zmienić, wstrzymać, uporządkować.** Linię można w aplikacji założyć lub
13
13
  zmienić (osoba, kierunek, pytanie, granice), wstrzymać, zakończyć lub wznowić; kolejność linii to kolejność pracy, a
@@ -26,6 +26,9 @@ Zmiany każdej wersji w skrócie. Pełne informacje o wydaniach i polecenia inst
26
26
  adres pod każdą daną, także gdy tekst ich nie wymienia, również źródło, które tekst wymienia tylko kodem; aplikacja
27
27
  Strom dostaje je z opowieścią. Dana z poszlaki mówi w tekście, skąd pochodzi.
28
28
 
29
+ - Duże drzewo przejęte w systemie Windows (około 1500 osób i więcej) nie kończy się już błędem gita o zbyt długim
30
+ poleceniu (ENAMETOOLONG) bez żadnej zapisanej danej: wszystko, co przejęte, zostaje zapisane.
31
+
29
32
  ## 1.25.2
30
33
 
31
34
  *3.11.2026 · współpracuje z aplikacją Strom 3.21.2.*
package/dist/core/git.js CHANGED
@@ -43,6 +43,32 @@ function withStdin(input, run) {
43
43
  fs.rmSync(dir, { recursive: true, force: true });
44
44
  }
45
45
  }
46
+ /**
47
+ * How many characters the paths of one git command line may take. Windows starts a program with a command line of at
48
+ * most 32 767 characters (spawnSync: ENAMETOOLONG — found: a family tree of 1 450 people taken in on Windows, its
49
+ * commit's `git add` naming every file, nothing of it kept); a longer list reaches git in parts, well within that.
50
+ * Not `--pathspec-from-file`: a git before 2.25 (older macOS command line tools, older Linux) knows none.
51
+ */
52
+ const ARGS_ROOM = 8000;
53
+ /** The paths in parts, in their order, each part within `room` characters on a command line (a path, quotes, a space). */
54
+ export function pathParts(paths, room = ARGS_ROOM) {
55
+ const parts = [];
56
+ let part = [];
57
+ let used = 0;
58
+ for (const p of paths) {
59
+ const size = p.length + 3;
60
+ if (part.length && used + size > room) {
61
+ parts.push(part);
62
+ part = [];
63
+ used = 0;
64
+ }
65
+ part.push(p);
66
+ used += size;
67
+ }
68
+ if (part.length)
69
+ parts.push(part);
70
+ return parts;
71
+ }
46
72
  /** A git that did not finish in time: stopped (SIGKILL by spawnSync), said. */
47
73
  function gitTimedOut(args, error) {
48
74
  if (error?.code !== "ETIMEDOUT")
@@ -257,7 +283,7 @@ export function ignoredOf(dir, paths) {
257
283
  }
258
284
  /** Which of these paths (files or folders) git knows — one process for all of them. */
259
285
  function trackedOf(dir, paths) {
260
- const files = runGit(dir, ["ls-files", "-z", "--", ...paths]).stdout.split("\0").filter(Boolean);
286
+ const files = pathParts(paths).flatMap((part) => runGit(dir, ["ls-files", "-z", "--", ...part]).stdout.split("\0").filter(Boolean));
261
287
  return new Set(paths.filter((p) => {
262
288
  const rel = p.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/$/, "");
263
289
  return files.some((f) => f === rel || f.startsWith(`${rel}/`));
@@ -290,8 +316,9 @@ export function commitAll(dir, message, pathspec = ["."], seal, always = false)
290
316
  const missing = pathspec.filter((p) => p !== "." && !fs.existsSync(path.join(dir, p)));
291
317
  const known = missing.length ? trackedOf(dir, missing) : new Set();
292
318
  const specs = pathspec.filter((p) => !missing.includes(p) || known.has(p));
293
- if (specs.length)
294
- git(dir, ["add", "-A", "--", ...specs]);
319
+ // in parts: a commit of a big family tree names thousands of files (pathParts)
320
+ for (const part of pathParts(specs))
321
+ git(dir, ["add", "-A", "--", ...part]);
295
322
  const tree = git(dir, ["write-tree"]).trim();
296
323
  const parent = headInfo(dir);
297
324
  if (parent && parent.tree === tree && !always)
@@ -362,15 +389,20 @@ export function showFiles(dir, rev, files) {
362
389
  }
363
390
  /** Uncommitted changes with their status codes. */
364
391
  export function changes(dir, pathspec = []) {
365
- const out = git(dir, ["status", "--porcelain=v1", "-z", "--untracked-files=all", "--", ...pathspec]);
366
- const items = out.split("\0").filter(Boolean);
367
392
  const list = [];
368
- for (let i = 0; i < items.length; i++) {
369
- const item = items[i];
370
- const code = item.slice(0, 2);
371
- list.push({ path: item.slice(3), code });
372
- if (code.startsWith("R") || code.startsWith("C"))
373
- i++;
393
+ const seen = new Set();
394
+ for (const part of pathspec.length ? pathParts(pathspec) : [[]]) {
395
+ const items = git(dir, ["status", "--porcelain=v1", "-z", "--untracked-files=all", "--", ...part]).split("\0").filter(Boolean);
396
+ for (let i = 0; i < items.length; i++) {
397
+ const item = items[i];
398
+ const code = item.slice(0, 2);
399
+ // a path two parts name (a folder and a file in it) once
400
+ if (!seen.has(item.slice(3)))
401
+ list.push({ path: item.slice(3), code });
402
+ seen.add(item.slice(3));
403
+ if (code.startsWith("R") || code.startsWith("C"))
404
+ i++;
405
+ }
374
406
  }
375
407
  return list;
376
408
  }
package/dist/core/tree.js CHANGED
@@ -31,7 +31,7 @@ export const TREE_FILE = "strom.json";
31
31
  export const SEAL_FOREIGN = "seal.foreign";
32
32
  // between releases the candidate being made (a bridge run from the sources says what it is: the Strom app goes by it);
33
33
  // at a release the release's own (package.json)
34
- export const VERSION = "1.26.0-beta.5";
34
+ export const VERSION = "1.26.0-beta.6";
35
35
  const GITIGNORE = `# Strom Research — local state and large files are not versioned
36
36
  .strom/
37
37
  /media/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strom-research",
3
- "version": "1.26.0-beta.5",
3
+ "version": "1.26.0-beta.6",
4
4
  "description": "Genealogical research toolkit for AI coding agents",
5
5
  "type": "module",
6
6
  "stromLayout": 2,