vexp-cli 2.5.1 → 2.5.3

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/dist/cli.js CHANGED
@@ -434,6 +434,26 @@ program
434
434
  args.push("--export");
435
435
  runBinary(binaryPath, args);
436
436
  });
437
+ program
438
+ .command("search <query>")
439
+ .description("Exhaustive index search: every matching node (code and docs), no top-K. Built for rename sweeps and zero-reference audits")
440
+ .option("--substring", "Substring match (LIKE) instead of token search — partial identifiers, punctuation")
441
+ .option("--files-only", "Print only the distinct file paths")
442
+ .option("--json", "Machine-readable JSON with a stable shape")
443
+ .option("--limit <n>", "Cap the number of matches (0 = exhaustive)", "0")
444
+ .action(async (query, opts) => {
445
+ const binaryPath = ensureBinary();
446
+ const args = ["search", query];
447
+ if (opts.substring)
448
+ args.push("--substring");
449
+ if (opts.filesOnly)
450
+ args.push("--files-only");
451
+ if (opts.json)
452
+ args.push("--json");
453
+ if (opts.limit && opts.limit !== "0")
454
+ args.push("--limit", opts.limit);
455
+ runBinary(binaryPath, args);
456
+ });
437
457
  program
438
458
  .command("verify")
439
459
  .description("Mechanical completion check of the working tree: parse errors, broken imports, dependents of changed files not yet touched (advice, never a block)")
@@ -451,6 +471,17 @@ program
451
471
  args.push("--gate");
452
472
  runBinary(binaryPath, args);
453
473
  });
474
+ program
475
+ .command("daemons")
476
+ .description("List every vexp daemon on this machine: which workspace holds each concurrent-workspace slot, version, index size, uptime")
477
+ .option("--json", "Emit machine-readable JSON")
478
+ .action(async (opts) => {
479
+ const binaryPath = ensureBinary();
480
+ const args = ["daemons"];
481
+ if (opts.json)
482
+ args.push("--json");
483
+ runBinary(binaryPath, args);
484
+ });
454
485
  program
455
486
  .command("stop [workspace]")
456
487
  .description("Stop the vexp daemon of a workspace (default: current directory). Accepts any path shown by the concurrent-workspace cap message")
package/dist/license.js CHANGED
@@ -5,6 +5,16 @@ import * as os from "os";
5
5
  import { CLI_VERSION } from "./version.js";
6
6
  // Ed25519 PUBLIC key (DER, base64) — same key as vexp-vscode/src/license.ts.
7
7
  // Only the server (vexp.dev) holds the matching private key.
8
+ /** Resolve the vexp home dir like the Rust core does: VEXP_HOME (absolute)
9
+ * wins, else the OS home. Without this, sandboxed/container setups that set
10
+ * VEXP_HOME read and roll license tokens in a directory the daemon never
11
+ * looks at. */
12
+ function vexpHomeDir() {
13
+ const env = process.env.VEXP_HOME;
14
+ if (env && path.isAbsolute(env))
15
+ return env;
16
+ return os.homedir();
17
+ }
8
18
  const VEXP_LICENSE_PUBLIC_KEY = "MCowBQYDK2VwAyEApwiWYGCyhCaGHAHWn/RTBSGo/1MNmGyZUgSNBQ5YE4g=";
9
19
  const VEXP_WEB_ORIGIN = process.env.VEXP_WEB_ORIGIN || "https://vexp.dev";
10
20
  // 14-day grace window after the last successful online refresh before we
@@ -15,16 +25,16 @@ const REFRESH_BACKOFF_MS = 24 * 60 * 60 * 1000;
15
25
  // 3 second timeout on validate calls — any slower falls back silently.
16
26
  const VALIDATE_TIMEOUT_MS = 3000;
17
27
  function getLicensePath() {
18
- return path.join(os.homedir(), ".vexp", "license.jwt");
28
+ return path.join(vexpHomeDir(), ".vexp", "license.jwt");
19
29
  }
20
30
  function getFreshTokenPath() {
21
- return path.join(os.homedir(), ".vexp", "fresh.jwt");
31
+ return path.join(vexpHomeDir(), ".vexp", "fresh.jwt");
22
32
  }
23
33
  function getLastCheckPath() {
24
- return path.join(os.homedir(), ".vexp", "last_online_check");
34
+ return path.join(vexpHomeDir(), ".vexp", "last_online_check");
25
35
  }
26
36
  function getDeviceIdPath() {
27
- return path.join(os.homedir(), ".vexp", "device.id");
37
+ return path.join(vexpHomeDir(), ".vexp", "device.id");
28
38
  }
29
39
  /**
30
40
  * Stable anonymous device identifier. First call creates and persists it.
@@ -99,7 +109,7 @@ function removeFreshToken() {
99
109
  }
100
110
  }
101
111
  function getDeviceBlockedPath() {
102
- return path.join(os.homedir(), ".vexp", "device_blocked.json");
112
+ return path.join(vexpHomeDir(), ".vexp", "device_blocked.json");
103
113
  }
104
114
  /** Returns the active device-blocked marker, if any. */
105
115
  export function readDeviceBlocked() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vexp-cli",
3
- "version": "2.5.1",
3
+ "version": "2.5.3",
4
4
  "description": "Local-first context engine for AI coding agents. Pre-indexes your codebase into a dependency graph and feeds any MCP agent only the code that matters — 87% fewer tokens per call. New in 2.5: mechanical work verification and a PII/secret scanner. Works with Claude Code, Cursor, Codex, Copilot, Windsurf, Cline, Aider and 14 agents. Your code never leaves your machine.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -105,10 +105,10 @@
105
105
  },
106
106
  "homepage": "https://vexp.dev",
107
107
  "optionalDependencies": {
108
- "@vexp/core-linux-x64": "2.5.1",
109
- "@vexp/core-linux-arm64": "2.5.1",
110
- "@vexp/core-darwin-x64": "2.5.1",
111
- "@vexp/core-darwin-arm64": "2.5.1",
112
- "@vexp/core-win32-x64": "2.5.1"
108
+ "@vexp/core-linux-x64": "2.5.3",
109
+ "@vexp/core-linux-arm64": "2.5.3",
110
+ "@vexp/core-darwin-x64": "2.5.3",
111
+ "@vexp/core-darwin-arm64": "2.5.3",
112
+ "@vexp/core-win32-x64": "2.5.3"
113
113
  }
114
114
  }