shilo-cli 0.6.0 → 0.7.0

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/src/remote.js CHANGED
@@ -11,13 +11,22 @@
11
11
  * {
12
12
  * "projectId": "<uuid>",
13
13
  * "baseURL": "https://www.shilo.city",
14
- * "lastSync": "2026-07-27T12:00:00.000Z"
14
+ * "lastSync": "2026-07-27T12:00:00.000Z",
15
+ * "base": "<oid de la versión actual que esta carpeta vio por última vez>"
15
16
  * }
16
17
  *
17
18
  * `lastSync` es la marca de la última vez que esta carpeta quedó alineada con
18
19
  * el remoto (fin de un push o pull exitoso). `status` la usa para distinguir
19
20
  * "el remoto cambió desde que sincronicé" de "esto lo subí yo".
20
21
  *
22
+ * `base` es lo mismo pero exacto: el punto de guardado del que parte esta
23
+ * carpeta. `push` lo manda con cada propuesta para que el servidor sepa contra
24
+ * qué comparar — un archivo que otra persona cambió después de esa base y que
25
+ * acá también se cambió es un conflicto, no una sobreescritura. Va acá y no en
26
+ * `.shilo/index.json` porque el índice es una optimización descartable
27
+ * (`--no-index` lo ignora) y la base es un dato: perderla no rompe nada, pero
28
+ * vuelve el push siguiente ciego a lo que cambiaron los demás.
29
+ *
21
30
  * NO contiene credenciales (esas están en ~/.shilo/config.json, cifradas), así
22
31
  * que es seguro commitearlo al repo si el usuario quiere.
23
32
  */
@@ -49,17 +58,19 @@ function read(dir) {
49
58
  projectId: raw.projectId || null,
50
59
  baseURL: raw.baseURL || null,
51
60
  lastSync: raw.lastSync || null,
61
+ base: typeof raw.base === 'string' && /^[0-9a-f]{64}$/.test(raw.base) ? raw.base : null,
52
62
  };
53
63
  }
54
64
 
55
65
  /**
56
66
  * Escribe `.shilo.json` en `dir`. Devuelve la ruta escrita.
57
67
  */
58
- function write(dir, { projectId, baseURL, lastSync }) {
68
+ function write(dir, { projectId, baseURL, lastSync, base }) {
59
69
  const p = remotePath(dir);
60
70
  const onDisk = { projectId };
61
71
  if (baseURL) onDisk.baseURL = baseURL;
62
72
  if (lastSync) onDisk.lastSync = lastSync;
73
+ if (base) onDisk.base = base;
63
74
  fs.writeFileSync(p, JSON.stringify(onDisk, null, 2) + '\n', 'utf8');
64
75
  return p;
65
76
  }
@@ -69,13 +80,14 @@ function write(dir, { projectId, baseURL, lastSync }) {
69
80
  * remote. No es fatal si falla (la carpeta puede ser de sólo lectura): devuelve
70
81
  * `false` y el caller decide si avisar.
71
82
  */
72
- function touchSync(dir, { projectId, baseURL } = {}) {
83
+ function touchSync(dir, { projectId, baseURL, base } = {}) {
73
84
  try {
74
85
  const current = read(dir) || {};
75
86
  write(dir, {
76
87
  projectId: projectId || current.projectId,
77
88
  baseURL: baseURL || current.baseURL,
78
89
  lastSync: new Date().toISOString(),
90
+ base: base || current.base || null,
79
91
  });
80
92
  return true;
81
93
  } catch (_) {