@onebrain-ai/cli 2.0.11 → 2.0.14

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.
Files changed (2) hide show
  1. package/dist/onebrain +65 -42
  2. package/package.json +1 -1
package/dist/onebrain CHANGED
@@ -9990,6 +9990,13 @@ function applyHooks(settings) {
9990
9990
  settings.hooks = {};
9991
9991
  const hooks = settings.hooks;
9992
9992
  const result = {};
9993
+ for (const [event, staleCmd] of Object.entries(STALE_HOOK_COMMANDS)) {
9994
+ if (!hooks[event])
9995
+ continue;
9996
+ hooks[event] = hooks[event].filter((group) => !group.hooks?.some((entry) => entry.command === staleCmd));
9997
+ if (hooks[event].length === 0)
9998
+ delete hooks[event];
9999
+ }
9993
10000
  for (const event of HOOK_EVENTS) {
9994
10001
  const cmd = HOOK_COMMANDS[event];
9995
10002
  if (!cmd)
@@ -10199,16 +10206,18 @@ async function registerHooksCommand(vaultDir, flags) {
10199
10206
  process.exit(1);
10200
10207
  }
10201
10208
  }
10202
- var HOOK_COMMANDS, HOOK_EVENTS, PERMISSIONS_TO_ADD, ONEBRAIN_MARKER = "# onebrain", PATH_EXPORT = 'export PATH="$HOME/.bun/bin:$HOME/.npm-global/bin:$PATH"', QMD_CMD = "onebrain qmd-reindex", QMD_MATCHER = "Write|Edit";
10209
+ var HOOK_COMMANDS, HOOK_EVENTS, STALE_HOOK_COMMANDS, PERMISSIONS_TO_ADD, ONEBRAIN_MARKER = "# onebrain", PATH_EXPORT = 'export PATH="$HOME/.bun/bin:$HOME/.npm-global/bin:$PATH"', QMD_CMD = "onebrain qmd-reindex", QMD_MATCHER = "Write|Edit";
10203
10210
  var init_register_hooks = __esm(() => {
10204
10211
  init_dist2();
10205
10212
  init_dist3();
10206
10213
  HOOK_COMMANDS = {
10207
10214
  Stop: "onebrain checkpoint stop",
10208
- PreCompact: "onebrain checkpoint precompact",
10209
10215
  PostCompact: "onebrain checkpoint postcompact"
10210
10216
  };
10211
- HOOK_EVENTS = ["Stop", "PreCompact", "PostCompact"];
10217
+ HOOK_EVENTS = ["Stop", "PostCompact"];
10218
+ STALE_HOOK_COMMANDS = {
10219
+ PreCompact: "onebrain checkpoint precompact"
10220
+ };
10212
10221
  PERMISSIONS_TO_ADD = [
10213
10222
  "Bash(onebrain *)",
10214
10223
  "Bash(bun install -g @onebrain-ai/cli*)",
@@ -10753,7 +10762,7 @@ init_dist3();
10753
10762
  import { mkdir as mkdir3, readFile as readFile3, rename as rename3, stat as stat3, writeFile as writeFile3 } from "node:fs/promises";
10754
10763
  import { homedir as homedir3 } from "node:os";
10755
10764
  import { dirname as dirname3, join as join5 } from "node:path";
10756
- var binaryVersion = "2.0.11";
10765
+ var binaryVersion = "2.0.14";
10757
10766
  var STANDARD_FOLDERS = [
10758
10767
  "00-inbox",
10759
10768
  "01-projects",
@@ -11173,24 +11182,16 @@ function handleStop(token, vaultRoot, now = Math.floor(Date.now() / 1000), tmpDi
11173
11182
  const maxNn = maxCheckpointNnSync(vaultRoot, date, token, logsFolder);
11174
11183
  const nextNn = String(maxNn + 1).padStart(2, "0");
11175
11184
  const since = maxNn === 0 ? " since start" : ` since checkpoint-${String(maxNn).padStart(2, "0")}`;
11176
- const filename = `${date}-${token}-checkpoint-${nextNn}.md`;
11177
- emitBlock(`${filename}${since}`);
11185
+ emitBlock(`${nextNn}${since}`);
11178
11186
  writeState(token, { count: 0, last_ts: now, last_stop_nn: nextNn }, tmpDir);
11179
11187
  }
11180
- function handlePrecompact(token, _vaultRoot, now = Math.floor(Date.now() / 1000), tmpDir = osTmpdir()) {
11181
- const state = readState(token, tmpDir);
11182
- if (state.last_ts > 0 && now - state.last_ts < PRECOMPACT_RECENCY) {
11183
- return;
11184
- }
11185
- writeState(token, { count: 0, last_ts: state.last_ts, last_stop_nn: state.last_stop_nn }, tmpDir);
11186
- }
11187
11188
  function handlePostcompact(token, _vaultRoot, now = Math.floor(Date.now() / 1000), tmpDir = osTmpdir()) {
11188
11189
  const state = readState(token, tmpDir);
11189
11190
  if (state.last_ts > 0 && now - state.last_ts < PRECOMPACT_RECENCY) {
11190
11191
  writeState(token, { count: 0, last_ts: state.last_ts, last_stop_nn: state.last_stop_nn }, tmpDir);
11191
11192
  return;
11192
11193
  }
11193
- emitBlock(`auto-wrapup: ${token}`);
11194
+ emitBlock("auto-wrapup");
11194
11195
  writeState(token, { count: 0, last_ts: now, last_stop_nn: state.last_stop_nn }, tmpDir);
11195
11196
  }
11196
11197
  function postcompactFallback(token, vaultRoot, now = Math.floor(Date.now() / 1000), tmpDir = osTmpdir()) {
@@ -11202,9 +11203,6 @@ async function checkpointCommand(mode, token, vaultRoot) {
11202
11203
  case "stop":
11203
11204
  handleStop(token, vaultRoot);
11204
11205
  break;
11205
- case "precompact":
11206
- handlePrecompact(token, vaultRoot);
11207
- break;
11208
11206
  case "postcompact":
11209
11207
  postcompactFallback(token, vaultRoot);
11210
11208
  break;
@@ -11319,9 +11317,9 @@ ${rest}`;
11319
11317
  }
11320
11318
  return { backfilled, skipped };
11321
11319
  }
11322
- async function migrateCommand(migrationName, cutoffDate) {
11320
+ async function migrateCommand(migrationName, cutoffDate, vaultDir) {
11323
11321
  try {
11324
- const vaultRoot = process.cwd();
11322
+ const vaultRoot = vaultDir ?? process.cwd();
11325
11323
  const config = await loadVaultConfig(vaultRoot);
11326
11324
  const logsFolder = join7(vaultRoot, config.folders.logs);
11327
11325
  if (migrationName === "backfill-recapped") {
@@ -11482,10 +11480,12 @@ import { homedir as homedir4 } from "node:os";
11482
11480
  import { dirname as dirname4, join as join9 } from "node:path";
11483
11481
  var HOOK_COMMANDS2 = {
11484
11482
  Stop: "onebrain checkpoint stop",
11485
- PreCompact: "onebrain checkpoint precompact",
11486
11483
  PostCompact: "onebrain checkpoint postcompact"
11487
11484
  };
11488
- var HOOK_EVENTS2 = ["Stop", "PreCompact", "PostCompact"];
11485
+ var HOOK_EVENTS2 = ["Stop", "PostCompact"];
11486
+ var STALE_HOOK_COMMANDS2 = {
11487
+ PreCompact: "onebrain checkpoint precompact"
11488
+ };
11489
11489
  var PERMISSIONS_TO_ADD2 = [
11490
11490
  "Bash(onebrain *)",
11491
11491
  "Bash(bun install -g @onebrain-ai/cli*)",
@@ -11527,6 +11527,13 @@ function applyHooks2(settings) {
11527
11527
  settings.hooks = {};
11528
11528
  const hooks = settings.hooks;
11529
11529
  const result = {};
11530
+ for (const [event, staleCmd] of Object.entries(STALE_HOOK_COMMANDS2)) {
11531
+ if (!hooks[event])
11532
+ continue;
11533
+ hooks[event] = hooks[event].filter((group) => !group.hooks?.some((entry) => entry.command === staleCmd));
11534
+ if (hooks[event].length === 0)
11535
+ delete hooks[event];
11536
+ }
11530
11537
  for (const event of HOOK_EVENTS2) {
11531
11538
  const cmd = HOOK_COMMANDS2[event];
11532
11539
  if (!cmd)
@@ -11774,9 +11781,38 @@ async function resolveSessionToken(tmpDir = osTmpdir2()) {
11774
11781
  if (stripped.length > 0)
11775
11782
  return stripped;
11776
11783
  }
11784
+ const tmuxPane = process.env["TMUX_PANE"];
11785
+ if (tmuxPane) {
11786
+ const stripped = tmuxPane.replace(/[^a-zA-Z0-9]/g, "").slice(0, 8);
11787
+ if (stripped.length > 0)
11788
+ return stripped;
11789
+ }
11790
+ const termSessionId = process.env["TERM_SESSION_ID"];
11791
+ if (termSessionId) {
11792
+ const stripped = termSessionId.replace(/[^a-zA-Z0-9]/g, "").slice(0, 8);
11793
+ if (stripped.length > 0)
11794
+ return stripped;
11795
+ }
11796
+ const today = new Date;
11797
+ const yyyymmdd = [
11798
+ today.getFullYear(),
11799
+ String(today.getMonth() + 1).padStart(2, "0"),
11800
+ String(today.getDate()).padStart(2, "0")
11801
+ ].join("");
11802
+ const cacheFile = join10(tmpDir, `onebrain-day-${yyyymmdd}.token`);
11803
+ const cacheExists = await Bun.file(cacheFile).exists();
11804
+ if (cacheExists) {
11805
+ const cached = (await Bun.file(cacheFile).text()).trim();
11806
+ const n = Number(cached);
11807
+ if (!Number.isNaN(n) && n > 1)
11808
+ return cached;
11809
+ }
11777
11810
  const ppid = process.ppid;
11778
- if (ppid !== undefined && ppid > 1)
11779
- return String(ppid);
11811
+ if (ppid !== undefined && ppid > 1) {
11812
+ const token2 = String(ppid);
11813
+ await Bun.write(cacheFile, token2);
11814
+ return token2;
11815
+ }
11780
11816
  try {
11781
11817
  const ps = Bun.spawn([
11782
11818
  "powershell.exe",
@@ -11800,27 +11836,14 @@ async function resolveSessionToken(tmpDir = osTmpdir2()) {
11800
11836
  clearTimeout(timerId);
11801
11837
  if (race !== "timeout") {
11802
11838
  const out = (await new Response(ps.stdout).text()).replace(/\D/g, "").trim();
11803
- if (out && Number(out) > 1)
11839
+ if (out && Number(out) > 1) {
11840
+ await Bun.write(cacheFile, out);
11804
11841
  return out;
11842
+ }
11805
11843
  } else {
11806
11844
  ps.kill();
11807
11845
  }
11808
11846
  } catch {}
11809
- const today = new Date;
11810
- const yyyymmdd = [
11811
- today.getFullYear(),
11812
- String(today.getMonth() + 1).padStart(2, "0"),
11813
- String(today.getDate()).padStart(2, "0")
11814
- ].join("");
11815
- const cacheFile = join10(tmpDir, `onebrain-day-${yyyymmdd}.token`);
11816
- const f2 = Bun.file(cacheFile);
11817
- const exists = await f2.exists();
11818
- if (exists) {
11819
- const cached = (await f2.text()).trim();
11820
- const n = Number(cached);
11821
- if (!Number.isNaN(n) && n > 1)
11822
- return cached;
11823
- }
11824
11847
  const token = String(Math.floor(Math.random() * 90000) + 1e4);
11825
11848
  await Bun.write(cacheFile, token);
11826
11849
  return token;
@@ -12635,8 +12658,8 @@ async function updateCommand(opts = {}) {
12635
12658
  }
12636
12659
 
12637
12660
  // src/index.ts
12638
- var VERSION = "2.0.11";
12639
- var RELEASE_DATE = "2026-04-26";
12661
+ var VERSION = "2.0.14";
12662
+ var RELEASE_DATE = "2026-04-27";
12640
12663
  process.stdout.setDefaultEncoding("utf8");
12641
12664
  process.stderr.setDefaultEncoding("utf8");
12642
12665
  var VERSION_STRING = `OneBrain v${VERSION} \u2014 released ${RELEASE_DATE}`;
@@ -12688,7 +12711,7 @@ program2.command("session-init", { hidden: true }).description("Emit session tok
12688
12711
  program2.command("orphan-scan", { hidden: true }).description("Scan for orphaned checkpoint files in logs folder").argument("<logs_folder>", "path to logs folder").argument("<session_token>", "current session token to exclude").action(async (logsFolder, sessionToken) => {
12689
12712
  await orphanScanCommand(logsFolder, sessionToken);
12690
12713
  });
12691
- program2.command("checkpoint", { hidden: true }).description("Handle checkpoint lifecycle (stop/precompact/postcompact/reset)").argument("<mode>", "stop | precompact | postcompact | reset").option("--vault-dir <path>", "vault root directory (default: auto-detect from cwd)").action(async (mode, opts) => {
12714
+ program2.command("checkpoint", { hidden: true }).description("Handle checkpoint lifecycle (stop/postcompact/reset)").argument("<mode>", "stop | postcompact | reset").option("--vault-dir <path>", "vault root directory (default: auto-detect from cwd)").action(async (mode, opts) => {
12692
12715
  const token = await resolveSessionToken();
12693
12716
  const vaultRoot = opts.vaultDir ?? findVaultRoot(process.cwd());
12694
12717
  await checkpointCommand(mode, token, vaultRoot);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onebrain-ai/cli",
3
- "version": "2.0.11",
3
+ "version": "2.0.14",
4
4
  "description": "CLI for OneBrain — personal AI OS for Obsidian with persistent memory, 24+ skills, and Claude Code integration",
5
5
  "keywords": [
6
6
  "onebrain",