@deeplake/hivemind 0.7.33 → 0.7.35

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.
@@ -1301,7 +1301,7 @@ function createSymlinkAtomic(target, link) {
1301
1301
 
1302
1302
  // dist/src/hooks/cursor/capture.js
1303
1303
  import { fileURLToPath as fileURLToPath3 } from "node:url";
1304
- import { dirname as dirname6, join as join19 } from "node:path";
1304
+ import { dirname as dirname7, join as join20 } from "node:path";
1305
1305
 
1306
1306
  // dist/src/hooks/summary-state.js
1307
1307
  import { readFileSync as readFileSync7, writeFileSync as writeFileSync5, writeSync as writeSync2, mkdirSync as mkdirSync6, renameSync as renameSync4, existsSync as existsSync6, unlinkSync as unlinkSync4, openSync as openSync3, closeSync as closeSync3 } from "node:fs";
@@ -1732,25 +1732,34 @@ function spawnSkillifyWorker(opts) {
1732
1732
  }
1733
1733
 
1734
1734
  // dist/src/skillify/state.js
1735
- import { readFileSync as readFileSync9, writeFileSync as writeFileSync8, writeSync as writeSync3, mkdirSync as mkdirSync10, renameSync as renameSync6, existsSync as existsSync9, unlinkSync as unlinkSync5, openSync as openSync4, closeSync as closeSync4 } from "node:fs";
1735
+ import { readFileSync as readFileSync9, writeFileSync as writeFileSync8, writeSync as writeSync3, mkdirSync as mkdirSync10, renameSync as renameSync6, rmdirSync, existsSync as existsSync9, lstatSync as lstatSync2, unlinkSync as unlinkSync5, openSync as openSync4, closeSync as closeSync4 } from "node:fs";
1736
1736
  import { execSync as execSync2 } from "node:child_process";
1737
- import { homedir as homedir14 } from "node:os";
1738
1737
  import { createHash } from "node:crypto";
1739
- import { join as join17, basename as basename2 } from "node:path";
1738
+ import { join as join18, basename as basename2 } from "node:path";
1740
1739
 
1741
1740
  // dist/src/skillify/legacy-migration.js
1742
1741
  import { existsSync as existsSync8, renameSync as renameSync5 } from "node:fs";
1742
+ import { dirname as dirname6, join as join17 } from "node:path";
1743
+
1744
+ // dist/src/skillify/state-dir.js
1743
1745
  import { homedir as homedir13 } from "node:os";
1744
1746
  import { join as join16 } from "node:path";
1747
+ function getStateDir() {
1748
+ const override = process.env.HIVEMIND_STATE_DIR?.trim();
1749
+ return override && override.length > 0 ? override : join16(homedir13(), ".deeplake", "state", "skillify");
1750
+ }
1751
+
1752
+ // dist/src/skillify/legacy-migration.js
1745
1753
  var dlog2 = (msg) => log("skillify-migrate", msg);
1746
1754
  var attempted = false;
1747
1755
  function migrateLegacyStateDir() {
1756
+ if (process.env.HIVEMIND_STATE_DIR?.trim())
1757
+ return;
1748
1758
  if (attempted)
1749
1759
  return;
1750
1760
  attempted = true;
1751
- const root = join16(homedir13(), ".deeplake", "state");
1752
- const legacy = join16(root, "skilify");
1753
- const current = join16(root, "skillify");
1761
+ const current = getStateDir();
1762
+ const legacy = join17(dirname6(current), "skilify");
1754
1763
  if (!existsSync8(legacy))
1755
1764
  return;
1756
1765
  if (existsSync8(current))
@@ -1760,8 +1769,8 @@ function migrateLegacyStateDir() {
1760
1769
  dlog2(`migrated ${legacy} -> ${current}`);
1761
1770
  } catch (err) {
1762
1771
  const code = err.code;
1763
- if (code === "EXDEV" || code === "EPERM") {
1764
- dlog2(`migration failed (${code}); leaving legacy dir in place`);
1772
+ if (code === "EXDEV" || code === "EPERM" || code === "ENOENT" || code === "EEXIST" || code === "ENOTEMPTY") {
1773
+ dlog2(`migration skipped (${code}); legacy dir left as-is or another process handled it`);
1765
1774
  return;
1766
1775
  }
1767
1776
  throw err;
@@ -1770,17 +1779,16 @@ function migrateLegacyStateDir() {
1770
1779
 
1771
1780
  // dist/src/skillify/state.js
1772
1781
  var dlog3 = (msg) => log("skillify-state", msg);
1773
- var STATE_DIR2 = join17(homedir14(), ".deeplake", "state", "skillify");
1774
1782
  var YIELD_BUF2 = new Int32Array(new SharedArrayBuffer(4));
1775
1783
  var TRIGGER_THRESHOLD = (() => {
1776
1784
  const n = Number(process.env.HIVEMIND_SKILLIFY_EVERY_N_TURNS ?? "");
1777
1785
  return Number.isInteger(n) && n > 0 ? n : 20;
1778
1786
  })();
1779
1787
  function statePath2(projectKey) {
1780
- return join17(STATE_DIR2, `${projectKey}.json`);
1788
+ return join18(getStateDir(), `${projectKey}.json`);
1781
1789
  }
1782
1790
  function lockPath3(projectKey) {
1783
- return join17(STATE_DIR2, `${projectKey}.lock`);
1791
+ return join18(getStateDir(), `${projectKey}.lock`);
1784
1792
  }
1785
1793
  var DEFAULT_PORTS = {
1786
1794
  http: "80",
@@ -1836,7 +1844,7 @@ function readState2(projectKey) {
1836
1844
  }
1837
1845
  function writeState2(projectKey, state) {
1838
1846
  migrateLegacyStateDir();
1839
- mkdirSync10(STATE_DIR2, { recursive: true });
1847
+ mkdirSync10(getStateDir(), { recursive: true });
1840
1848
  const p = statePath2(projectKey);
1841
1849
  const tmp = `${p}.${process.pid}.${Date.now()}.tmp`;
1842
1850
  writeFileSync8(tmp, JSON.stringify(state, null, 2));
@@ -1844,7 +1852,7 @@ function writeState2(projectKey, state) {
1844
1852
  }
1845
1853
  function withRmwLock2(projectKey, fn) {
1846
1854
  migrateLegacyStateDir();
1847
- mkdirSync10(STATE_DIR2, { recursive: true });
1855
+ mkdirSync10(getStateDir(), { recursive: true });
1848
1856
  const rmw = lockPath3(projectKey) + ".rmw";
1849
1857
  const deadline = Date.now() + 2e3;
1850
1858
  let fd = null;
@@ -1904,7 +1912,7 @@ function resetCounter(projectKey) {
1904
1912
  }
1905
1913
  function tryAcquireWorkerLock(projectKey, maxAgeMs = 10 * 60 * 1e3) {
1906
1914
  migrateLegacyStateDir();
1907
- mkdirSync10(STATE_DIR2, { recursive: true });
1915
+ mkdirSync10(getStateDir(), { recursive: true });
1908
1916
  const p = lockPath3(projectKey);
1909
1917
  if (existsSync9(p)) {
1910
1918
  try {
@@ -1917,8 +1925,22 @@ function tryAcquireWorkerLock(projectKey, maxAgeMs = 10 * 60 * 1e3) {
1917
1925
  try {
1918
1926
  unlinkSync5(p);
1919
1927
  } catch (unlinkErr) {
1920
- dlog3(`could not unlink stale worker lock for ${projectKey}: ${unlinkErr.message}`);
1921
- return false;
1928
+ if (unlinkErr?.code !== "EISDIR" && unlinkErr?.code !== "EPERM" && unlinkErr?.code !== "ENOENT") {
1929
+ dlog3(`could not unlink stale worker lock for ${projectKey}: ${unlinkErr.message}`);
1930
+ return false;
1931
+ }
1932
+ let isDir = false;
1933
+ try {
1934
+ isDir = lstatSync2(p).isDirectory();
1935
+ } catch {
1936
+ }
1937
+ if (isDir) {
1938
+ try {
1939
+ rmdirSync(p);
1940
+ } catch (rmErr) {
1941
+ dlog3(`rmdir stale lock skipped for ${projectKey}: ${rmErr.message}`);
1942
+ }
1943
+ }
1922
1944
  }
1923
1945
  }
1924
1946
  try {
@@ -1943,13 +1965,14 @@ function releaseWorkerLock(projectKey) {
1943
1965
 
1944
1966
  // dist/src/skillify/scope-config.js
1945
1967
  import { existsSync as existsSync10, mkdirSync as mkdirSync11, readFileSync as readFileSync10, writeFileSync as writeFileSync9 } from "node:fs";
1946
- import { homedir as homedir15 } from "node:os";
1947
- import { join as join18 } from "node:path";
1948
- var STATE_DIR3 = join18(homedir15(), ".deeplake", "state", "skillify");
1949
- var CONFIG_PATH = join18(STATE_DIR3, "config.json");
1968
+ import { join as join19 } from "node:path";
1969
+ function configPath() {
1970
+ return join19(getStateDir(), "config.json");
1971
+ }
1950
1972
  var DEFAULT = { scope: "me", team: [], install: "project" };
1951
1973
  function loadScopeConfig() {
1952
1974
  migrateLegacyStateDir();
1975
+ const CONFIG_PATH = configPath();
1953
1976
  if (!existsSync10(CONFIG_PATH))
1954
1977
  return DEFAULT;
1955
1978
  try {
@@ -2006,9 +2029,9 @@ function tryStopCounterTrigger(opts) {
2006
2029
  // dist/src/hooks/cursor/capture.js
2007
2030
  var log5 = (msg) => log("cursor-capture", msg);
2008
2031
  function resolveEmbedDaemonPath() {
2009
- return join19(dirname6(fileURLToPath3(import.meta.url)), "embeddings", "embed-daemon.js");
2032
+ return join20(dirname7(fileURLToPath3(import.meta.url)), "embeddings", "embed-daemon.js");
2010
2033
  }
2011
- var __bundleDir = dirname6(fileURLToPath3(import.meta.url));
2034
+ var __bundleDir = dirname7(fileURLToPath3(import.meta.url));
2012
2035
  var PLUGIN_VERSION = getInstalledVersion(__bundleDir, ".claude-plugin") ?? "";
2013
2036
  if (!embeddingsDisabled()) {
2014
2037
  try {
@@ -406,25 +406,34 @@ function spawnSkillifyWorker(opts) {
406
406
  }
407
407
 
408
408
  // dist/src/skillify/state.js
409
- import { readFileSync as readFileSync4, writeFileSync as writeFileSync4, writeSync as writeSync2, mkdirSync as mkdirSync5, renameSync as renameSync3, existsSync as existsSync5, unlinkSync as unlinkSync2, openSync as openSync2, closeSync as closeSync2 } from "node:fs";
409
+ import { readFileSync as readFileSync4, writeFileSync as writeFileSync4, writeSync as writeSync2, mkdirSync as mkdirSync5, renameSync as renameSync3, rmdirSync, existsSync as existsSync5, lstatSync, unlinkSync as unlinkSync2, openSync as openSync2, closeSync as closeSync2 } from "node:fs";
410
410
  import { execSync as execSync2 } from "node:child_process";
411
- import { homedir as homedir8 } from "node:os";
412
411
  import { createHash } from "node:crypto";
413
- import { join as join10, basename } from "node:path";
412
+ import { join as join11, basename } from "node:path";
414
413
 
415
414
  // dist/src/skillify/legacy-migration.js
416
415
  import { existsSync as existsSync4, renameSync as renameSync2 } from "node:fs";
416
+ import { dirname as dirname4, join as join10 } from "node:path";
417
+
418
+ // dist/src/skillify/state-dir.js
417
419
  import { homedir as homedir7 } from "node:os";
418
420
  import { join as join9 } from "node:path";
421
+ function getStateDir() {
422
+ const override = process.env.HIVEMIND_STATE_DIR?.trim();
423
+ return override && override.length > 0 ? override : join9(homedir7(), ".deeplake", "state", "skillify");
424
+ }
425
+
426
+ // dist/src/skillify/legacy-migration.js
419
427
  var dlog2 = (msg) => log("skillify-migrate", msg);
420
428
  var attempted = false;
421
429
  function migrateLegacyStateDir() {
430
+ if (process.env.HIVEMIND_STATE_DIR?.trim())
431
+ return;
422
432
  if (attempted)
423
433
  return;
424
434
  attempted = true;
425
- const root = join9(homedir7(), ".deeplake", "state");
426
- const legacy = join9(root, "skilify");
427
- const current = join9(root, "skillify");
435
+ const current = getStateDir();
436
+ const legacy = join10(dirname4(current), "skilify");
428
437
  if (!existsSync4(legacy))
429
438
  return;
430
439
  if (existsSync4(current))
@@ -434,8 +443,8 @@ function migrateLegacyStateDir() {
434
443
  dlog2(`migrated ${legacy} -> ${current}`);
435
444
  } catch (err) {
436
445
  const code = err.code;
437
- if (code === "EXDEV" || code === "EPERM") {
438
- dlog2(`migration failed (${code}); leaving legacy dir in place`);
446
+ if (code === "EXDEV" || code === "EPERM" || code === "ENOENT" || code === "EEXIST" || code === "ENOTEMPTY") {
447
+ dlog2(`migration skipped (${code}); legacy dir left as-is or another process handled it`);
439
448
  return;
440
449
  }
441
450
  throw err;
@@ -444,17 +453,16 @@ function migrateLegacyStateDir() {
444
453
 
445
454
  // dist/src/skillify/state.js
446
455
  var dlog3 = (msg) => log("skillify-state", msg);
447
- var STATE_DIR2 = join10(homedir8(), ".deeplake", "state", "skillify");
448
456
  var YIELD_BUF2 = new Int32Array(new SharedArrayBuffer(4));
449
457
  var TRIGGER_THRESHOLD = (() => {
450
458
  const n = Number(process.env.HIVEMIND_SKILLIFY_EVERY_N_TURNS ?? "");
451
459
  return Number.isInteger(n) && n > 0 ? n : 20;
452
460
  })();
453
461
  function statePath(projectKey) {
454
- return join10(STATE_DIR2, `${projectKey}.json`);
462
+ return join11(getStateDir(), `${projectKey}.json`);
455
463
  }
456
464
  function lockPath2(projectKey) {
457
- return join10(STATE_DIR2, `${projectKey}.lock`);
465
+ return join11(getStateDir(), `${projectKey}.lock`);
458
466
  }
459
467
  var DEFAULT_PORTS = {
460
468
  http: "80",
@@ -510,7 +518,7 @@ function readState(projectKey) {
510
518
  }
511
519
  function writeState(projectKey, state) {
512
520
  migrateLegacyStateDir();
513
- mkdirSync5(STATE_DIR2, { recursive: true });
521
+ mkdirSync5(getStateDir(), { recursive: true });
514
522
  const p = statePath(projectKey);
515
523
  const tmp = `${p}.${process.pid}.${Date.now()}.tmp`;
516
524
  writeFileSync4(tmp, JSON.stringify(state, null, 2));
@@ -518,7 +526,7 @@ function writeState(projectKey, state) {
518
526
  }
519
527
  function withRmwLock(projectKey, fn) {
520
528
  migrateLegacyStateDir();
521
- mkdirSync5(STATE_DIR2, { recursive: true });
529
+ mkdirSync5(getStateDir(), { recursive: true });
522
530
  const rmw = lockPath2(projectKey) + ".rmw";
523
531
  const deadline = Date.now() + 2e3;
524
532
  let fd = null;
@@ -561,7 +569,7 @@ function resetCounter(projectKey) {
561
569
  }
562
570
  function tryAcquireWorkerLock(projectKey, maxAgeMs = 10 * 60 * 1e3) {
563
571
  migrateLegacyStateDir();
564
- mkdirSync5(STATE_DIR2, { recursive: true });
572
+ mkdirSync5(getStateDir(), { recursive: true });
565
573
  const p = lockPath2(projectKey);
566
574
  if (existsSync5(p)) {
567
575
  try {
@@ -574,8 +582,22 @@ function tryAcquireWorkerLock(projectKey, maxAgeMs = 10 * 60 * 1e3) {
574
582
  try {
575
583
  unlinkSync2(p);
576
584
  } catch (unlinkErr) {
577
- dlog3(`could not unlink stale worker lock for ${projectKey}: ${unlinkErr.message}`);
578
- return false;
585
+ if (unlinkErr?.code !== "EISDIR" && unlinkErr?.code !== "EPERM" && unlinkErr?.code !== "ENOENT") {
586
+ dlog3(`could not unlink stale worker lock for ${projectKey}: ${unlinkErr.message}`);
587
+ return false;
588
+ }
589
+ let isDir = false;
590
+ try {
591
+ isDir = lstatSync(p).isDirectory();
592
+ } catch {
593
+ }
594
+ if (isDir) {
595
+ try {
596
+ rmdirSync(p);
597
+ } catch (rmErr) {
598
+ dlog3(`rmdir stale lock skipped for ${projectKey}: ${rmErr.message}`);
599
+ }
600
+ }
579
601
  }
580
602
  }
581
603
  try {
@@ -600,13 +622,14 @@ function releaseWorkerLock(projectKey) {
600
622
 
601
623
  // dist/src/skillify/scope-config.js
602
624
  import { existsSync as existsSync6, mkdirSync as mkdirSync6, readFileSync as readFileSync5, writeFileSync as writeFileSync5 } from "node:fs";
603
- import { homedir as homedir9 } from "node:os";
604
- import { join as join11 } from "node:path";
605
- var STATE_DIR3 = join11(homedir9(), ".deeplake", "state", "skillify");
606
- var CONFIG_PATH = join11(STATE_DIR3, "config.json");
625
+ import { join as join12 } from "node:path";
626
+ function configPath() {
627
+ return join12(getStateDir(), "config.json");
628
+ }
607
629
  var DEFAULT = { scope: "me", team: [], install: "project" };
608
630
  function loadScopeConfig() {
609
631
  migrateLegacyStateDir();
632
+ const CONFIG_PATH = configPath();
610
633
  if (!existsSync6(CONFIG_PATH))
611
634
  return DEFAULT;
612
635
  try {
@@ -54,7 +54,7 @@ var init_index_marker_store = __esm({
54
54
 
55
55
  // dist/src/hooks/cursor/session-start.js
56
56
  import { fileURLToPath as fileURLToPath2 } from "node:url";
57
- import { dirname as dirname6 } from "node:path";
57
+ import { dirname as dirname7 } from "node:path";
58
58
 
59
59
  // dist/src/commands/auth.js
60
60
  import { execSync } from "node:child_process";
@@ -969,8 +969,8 @@ async function autoUpdate(creds, opts) {
969
969
 
970
970
  // dist/src/skillify/pull.js
971
971
  import { existsSync as existsSync10, readFileSync as readFileSync9, writeFileSync as writeFileSync7, mkdirSync as mkdirSync8, renameSync as renameSync4, lstatSync as lstatSync2, readlinkSync, symlinkSync, unlinkSync as unlinkSync5 } from "node:fs";
972
- import { homedir as homedir11 } from "node:os";
973
- import { dirname as dirname5, join as join14 } from "node:path";
972
+ import { homedir as homedir10 } from "node:os";
973
+ import { dirname as dirname6, join as join15 } from "node:path";
974
974
 
975
975
  // dist/src/skillify/skill-writer.js
976
976
  import { existsSync as existsSync6, mkdirSync as mkdirSync6, readFileSync as readFileSync7, readdirSync as readdirSync2, statSync as statSync3, writeFileSync as writeFileSync5 } from "node:fs";
@@ -1042,22 +1042,31 @@ function parseFrontmatter(text) {
1042
1042
 
1043
1043
  // dist/src/skillify/manifest.js
1044
1044
  import { existsSync as existsSync8, lstatSync, mkdirSync as mkdirSync7, readFileSync as readFileSync8, renameSync as renameSync3, unlinkSync as unlinkSync4, writeFileSync as writeFileSync6 } from "node:fs";
1045
- import { homedir as homedir9 } from "node:os";
1046
- import { dirname as dirname4, join as join12 } from "node:path";
1045
+ import { dirname as dirname5, join as join13 } from "node:path";
1047
1046
 
1048
1047
  // dist/src/skillify/legacy-migration.js
1049
1048
  import { existsSync as existsSync7, renameSync as renameSync2 } from "node:fs";
1049
+ import { dirname as dirname4, join as join12 } from "node:path";
1050
+
1051
+ // dist/src/skillify/state-dir.js
1050
1052
  import { homedir as homedir8 } from "node:os";
1051
1053
  import { join as join11 } from "node:path";
1054
+ function getStateDir() {
1055
+ const override = process.env.HIVEMIND_STATE_DIR?.trim();
1056
+ return override && override.length > 0 ? override : join11(homedir8(), ".deeplake", "state", "skillify");
1057
+ }
1058
+
1059
+ // dist/src/skillify/legacy-migration.js
1052
1060
  var dlog = (msg) => log("skillify-migrate", msg);
1053
1061
  var attempted = false;
1054
1062
  function migrateLegacyStateDir() {
1063
+ if (process.env.HIVEMIND_STATE_DIR?.trim())
1064
+ return;
1055
1065
  if (attempted)
1056
1066
  return;
1057
1067
  attempted = true;
1058
- const root = join11(homedir8(), ".deeplake", "state");
1059
- const legacy = join11(root, "skilify");
1060
- const current = join11(root, "skillify");
1068
+ const current = getStateDir();
1069
+ const legacy = join12(dirname4(current), "skilify");
1061
1070
  if (!existsSync7(legacy))
1062
1071
  return;
1063
1072
  if (existsSync7(current))
@@ -1067,8 +1076,8 @@ function migrateLegacyStateDir() {
1067
1076
  dlog(`migrated ${legacy} -> ${current}`);
1068
1077
  } catch (err) {
1069
1078
  const code = err.code;
1070
- if (code === "EXDEV" || code === "EPERM") {
1071
- dlog(`migration failed (${code}); leaving legacy dir in place`);
1079
+ if (code === "EXDEV" || code === "EPERM" || code === "ENOENT" || code === "EEXIST" || code === "ENOTEMPTY") {
1080
+ dlog(`migration skipped (${code}); legacy dir left as-is or another process handled it`);
1072
1081
  return;
1073
1082
  }
1074
1083
  throw err;
@@ -1080,7 +1089,7 @@ function emptyManifest() {
1080
1089
  return { version: 1, entries: [] };
1081
1090
  }
1082
1091
  function manifestPath() {
1083
- return join12(homedir9(), ".deeplake", "state", "skillify", "pulled.json");
1092
+ return join13(getStateDir(), "pulled.json");
1084
1093
  }
1085
1094
  function loadManifest(path = manifestPath()) {
1086
1095
  migrateLegacyStateDir();
@@ -1135,7 +1144,7 @@ function loadManifest(path = manifestPath()) {
1135
1144
  }
1136
1145
  function saveManifest(m, path = manifestPath()) {
1137
1146
  migrateLegacyStateDir();
1138
- mkdirSync7(dirname4(path), { recursive: true });
1147
+ mkdirSync7(dirname5(path), { recursive: true });
1139
1148
  const tmp = `${path}.tmp`;
1140
1149
  writeFileSync6(tmp, JSON.stringify(m, null, 2) + "\n", { mode: 384 });
1141
1150
  renameSync3(tmp, path);
@@ -1173,7 +1182,7 @@ function pruneOrphanedEntries(path = manifestPath()) {
1173
1182
  const live = [];
1174
1183
  let pruned = 0;
1175
1184
  for (const e of m.entries) {
1176
- if (existsSync8(join12(e.installRoot, e.dirName))) {
1185
+ if (existsSync8(join13(e.installRoot, e.dirName))) {
1177
1186
  live.push(e);
1178
1187
  continue;
1179
1188
  }
@@ -1187,25 +1196,25 @@ function pruneOrphanedEntries(path = manifestPath()) {
1187
1196
 
1188
1197
  // dist/src/skillify/agent-roots.js
1189
1198
  import { existsSync as existsSync9 } from "node:fs";
1190
- import { homedir as homedir10 } from "node:os";
1191
- import { join as join13 } from "node:path";
1199
+ import { homedir as homedir9 } from "node:os";
1200
+ import { join as join14 } from "node:path";
1192
1201
  function resolveDetected(home) {
1193
1202
  const out = [];
1194
- const codexInstalled = existsSync9(join13(home, ".codex"));
1195
- const piInstalled = existsSync9(join13(home, ".pi", "agent"));
1196
- const hermesInstalled = existsSync9(join13(home, ".hermes"));
1203
+ const codexInstalled = existsSync9(join14(home, ".codex"));
1204
+ const piInstalled = existsSync9(join14(home, ".pi", "agent"));
1205
+ const hermesInstalled = existsSync9(join14(home, ".hermes"));
1197
1206
  if (codexInstalled || piInstalled) {
1198
- out.push(join13(home, ".agents", "skills"));
1207
+ out.push(join14(home, ".agents", "skills"));
1199
1208
  }
1200
1209
  if (hermesInstalled) {
1201
- out.push(join13(home, ".hermes", "skills"));
1210
+ out.push(join14(home, ".hermes", "skills"));
1202
1211
  }
1203
1212
  if (piInstalled) {
1204
- out.push(join13(home, ".pi", "agent", "skills"));
1213
+ out.push(join14(home, ".pi", "agent", "skills"));
1205
1214
  }
1206
1215
  return out;
1207
1216
  }
1208
- function detectAgentSkillsRoots(canonicalRoot, home = homedir10()) {
1217
+ function detectAgentSkillsRoots(canonicalRoot, home = homedir9()) {
1209
1218
  return resolveDetected(home).filter((p) => p !== canonicalRoot);
1210
1219
  }
1211
1220
 
@@ -1249,15 +1258,15 @@ function isMissingTableError(message) {
1249
1258
  }
1250
1259
  function resolvePullDestination(install, cwd) {
1251
1260
  if (install === "global")
1252
- return join14(homedir11(), ".claude", "skills");
1261
+ return join15(homedir10(), ".claude", "skills");
1253
1262
  if (!cwd)
1254
1263
  throw new Error("install=project requires a cwd");
1255
- return join14(cwd, ".claude", "skills");
1264
+ return join15(cwd, ".claude", "skills");
1256
1265
  }
1257
1266
  function fanOutSymlinks(canonicalDir, dirName, agentRoots) {
1258
1267
  const out = [];
1259
1268
  for (const root of agentRoots) {
1260
- const link = join14(root, dirName);
1269
+ const link = join15(root, dirName);
1261
1270
  let existing;
1262
1271
  try {
1263
1272
  existing = lstatSync2(link);
@@ -1285,7 +1294,7 @@ function fanOutSymlinks(canonicalDir, dirName, agentRoots) {
1285
1294
  }
1286
1295
  }
1287
1296
  try {
1288
- mkdirSync8(dirname5(link), { recursive: true });
1297
+ mkdirSync8(dirname6(link), { recursive: true });
1289
1298
  symlinkSync(canonicalDir, link, "dir");
1290
1299
  out.push(link);
1291
1300
  } catch {
@@ -1300,7 +1309,7 @@ function backfillSymlinks(installRoot) {
1300
1309
  return;
1301
1310
  const detected = detectAgentSkillsRoots(installRoot);
1302
1311
  for (const entry of entries) {
1303
- const canonical = join14(entry.installRoot, entry.dirName);
1312
+ const canonical = join15(entry.installRoot, entry.dirName);
1304
1313
  if (!existsSync10(canonical))
1305
1314
  continue;
1306
1315
  const fresh = fanOutSymlinks(canonical, entry.dirName, detected);
@@ -1509,8 +1518,8 @@ async function runPull(opts) {
1509
1518
  summary.skipped++;
1510
1519
  continue;
1511
1520
  }
1512
- const skillDir = join14(root, dirName);
1513
- const skillFile = join14(skillDir, "SKILL.md");
1521
+ const skillDir = join15(root, dirName);
1522
+ const skillFile = join15(skillDir, "SKILL.md");
1514
1523
  const remoteVersion = Number(row.version ?? 1);
1515
1524
  const localVersion = readLocalVersion(skillFile);
1516
1525
  const action = decideAction({
@@ -1624,7 +1633,7 @@ async function autoPullSkills(deps = {}) {
1624
1633
 
1625
1634
  // dist/src/hooks/cursor/session-start.js
1626
1635
  var log6 = (msg) => log("cursor-session-start", msg);
1627
- var __bundleDir = dirname6(fileURLToPath2(import.meta.url));
1636
+ var __bundleDir = dirname7(fileURLToPath2(import.meta.url));
1628
1637
  var context = `DEEPLAKE MEMORY: Persistent memory at ~/.deeplake/memory/ shared across sessions, users, and agents.
1629
1638
 
1630
1639
  Structure: index.md (start here) \u2192 summaries/*.md \u2192 sessions/*.jsonl (last resort). Do NOT jump straight to JSONL.
@@ -2,7 +2,7 @@
2
2
 
3
3
  // dist/src/skillify/skillify-worker.js
4
4
  import { readFileSync as readFileSync3, writeFileSync as writeFileSync3, existsSync as existsSync5, appendFileSync as appendFileSync2, rmSync } from "node:fs";
5
- import { join as join6 } from "node:path";
5
+ import { join as join7 } from "node:path";
6
6
 
7
7
  // dist/src/utils/debug.js
8
8
  import { appendFileSync } from "node:fs";
@@ -561,25 +561,34 @@ function resolveRecordScope(args) {
561
561
  }
562
562
 
563
563
  // dist/src/skillify/state.js
564
- import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, writeSync, mkdirSync as mkdirSync2, renameSync as renameSync2, existsSync as existsSync4, unlinkSync, openSync, closeSync } from "node:fs";
564
+ import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, writeSync, mkdirSync as mkdirSync2, renameSync as renameSync2, rmdirSync, existsSync as existsSync4, lstatSync, unlinkSync, openSync, closeSync } from "node:fs";
565
565
  import { execSync } from "node:child_process";
566
- import { homedir as homedir5 } from "node:os";
567
566
  import { createHash } from "node:crypto";
568
- import { join as join5, basename } from "node:path";
567
+ import { join as join6, basename } from "node:path";
569
568
 
570
569
  // dist/src/skillify/legacy-migration.js
571
570
  import { existsSync as existsSync3, renameSync } from "node:fs";
571
+ import { dirname, join as join5 } from "node:path";
572
+
573
+ // dist/src/skillify/state-dir.js
572
574
  import { homedir as homedir4 } from "node:os";
573
575
  import { join as join4 } from "node:path";
576
+ function getStateDir() {
577
+ const override = process.env.HIVEMIND_STATE_DIR?.trim();
578
+ return override && override.length > 0 ? override : join4(homedir4(), ".deeplake", "state", "skillify");
579
+ }
580
+
581
+ // dist/src/skillify/legacy-migration.js
574
582
  var dlog = (msg) => log("skillify-migrate", msg);
575
583
  var attempted = false;
576
584
  function migrateLegacyStateDir() {
585
+ if (process.env.HIVEMIND_STATE_DIR?.trim())
586
+ return;
577
587
  if (attempted)
578
588
  return;
579
589
  attempted = true;
580
- const root = join4(homedir4(), ".deeplake", "state");
581
- const legacy = join4(root, "skilify");
582
- const current = join4(root, "skillify");
590
+ const current = getStateDir();
591
+ const legacy = join5(dirname(current), "skilify");
583
592
  if (!existsSync3(legacy))
584
593
  return;
585
594
  if (existsSync3(current))
@@ -589,8 +598,8 @@ function migrateLegacyStateDir() {
589
598
  dlog(`migrated ${legacy} -> ${current}`);
590
599
  } catch (err) {
591
600
  const code = err.code;
592
- if (code === "EXDEV" || code === "EPERM") {
593
- dlog(`migration failed (${code}); leaving legacy dir in place`);
601
+ if (code === "EXDEV" || code === "EPERM" || code === "ENOENT" || code === "EEXIST" || code === "ENOTEMPTY") {
602
+ dlog(`migration skipped (${code}); legacy dir left as-is or another process handled it`);
594
603
  return;
595
604
  }
596
605
  throw err;
@@ -599,17 +608,16 @@ function migrateLegacyStateDir() {
599
608
 
600
609
  // dist/src/skillify/state.js
601
610
  var dlog2 = (msg) => log("skillify-state", msg);
602
- var STATE_DIR = join5(homedir5(), ".deeplake", "state", "skillify");
603
611
  var YIELD_BUF = new Int32Array(new SharedArrayBuffer(4));
604
612
  var TRIGGER_THRESHOLD = (() => {
605
613
  const n = Number(process.env.HIVEMIND_SKILLIFY_EVERY_N_TURNS ?? "");
606
614
  return Number.isInteger(n) && n > 0 ? n : 20;
607
615
  })();
608
616
  function statePath(projectKey) {
609
- return join5(STATE_DIR, `${projectKey}.json`);
617
+ return join6(getStateDir(), `${projectKey}.json`);
610
618
  }
611
619
  function lockPath(projectKey) {
612
- return join5(STATE_DIR, `${projectKey}.lock`);
620
+ return join6(getStateDir(), `${projectKey}.lock`);
613
621
  }
614
622
  function readState(projectKey) {
615
623
  migrateLegacyStateDir();
@@ -624,7 +632,7 @@ function readState(projectKey) {
624
632
  }
625
633
  function writeState(projectKey, state) {
626
634
  migrateLegacyStateDir();
627
- mkdirSync2(STATE_DIR, { recursive: true });
635
+ mkdirSync2(getStateDir(), { recursive: true });
628
636
  const p = statePath(projectKey);
629
637
  const tmp = `${p}.${process.pid}.${Date.now()}.tmp`;
630
638
  writeFileSync2(tmp, JSON.stringify(state, null, 2));
@@ -632,7 +640,7 @@ function writeState(projectKey, state) {
632
640
  }
633
641
  function withRmwLock(projectKey, fn) {
634
642
  migrateLegacyStateDir();
635
- mkdirSync2(STATE_DIR, { recursive: true });
643
+ mkdirSync2(getStateDir(), { recursive: true });
636
644
  const rmw = lockPath(projectKey) + ".rmw";
637
645
  const deadline = Date.now() + 2e3;
638
646
  let fd = null;
@@ -705,8 +713,8 @@ function releaseWorkerLock(projectKey) {
705
713
  var cfg = JSON.parse(readFileSync3(process.argv[2], "utf-8"));
706
714
  globalThis.__hivemind_tuning__ = cfg.tuning ?? {};
707
715
  var tmpDir = cfg.tmpDir;
708
- var verdictPath = join6(tmpDir, "verdict.json");
709
- var promptPath = join6(tmpDir, "prompt.txt");
716
+ var verdictPath = join7(tmpDir, "verdict.json");
717
+ var promptPath = join7(tmpDir, "prompt.txt");
710
718
  var SESSIONS_TO_MINE = 10;
711
719
  var PAIR_CHAR_CAP = 2e3;
712
720
  var TOTAL_PAIRS_CHAR_CAP = 4e4;
@@ -953,9 +961,9 @@ async function main() {
953
961
  timeoutMs: 12e4
954
962
  });
955
963
  try {
956
- writeFileSync3(join6(tmpDir, "gate-stdout.txt"), gate.stdout);
964
+ writeFileSync3(join7(tmpDir, "gate-stdout.txt"), gate.stdout);
957
965
  if (gate.stderr)
958
- writeFileSync3(join6(tmpDir, "gate-stderr.txt"), gate.stderr);
966
+ writeFileSync3(join7(tmpDir, "gate-stderr.txt"), gate.stderr);
959
967
  } catch {
960
968
  }
961
969
  if (gate.errored) {