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/README.md +20 -8
- package/package.json +1 -1
- package/src/ShiloClient.js +144 -13
- package/src/commands/pull.js +19 -3
- package/src/commands/push.js +617 -388
- package/src/remote.js +15 -3
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 (_) {
|