helixevo 0.2.36 → 0.2.37

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/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  All notable changes to HelixEvo are documented here.
4
4
 
5
+ ## [0.2.37] - 2026-03-23
6
+
7
+ ### Added
8
+ - `helixevo dashboard --background` — run dashboard detached from terminal
9
+ - `helixevo dashboard --stop` — stop a background dashboard
10
+ - PID file tracking at `~/.helix/dashboard.pid`
11
+ - Log file at `~/.helix/dashboard.log`
12
+
13
+ ### Fixed
14
+ - Silence Next.js "multiple lockfiles" warning via `outputFileTracingRoot`
15
+ - Cleaner terminal output during dashboard startup
16
+
5
17
  ## [0.2.36] - 2026-03-23
6
18
 
7
19
  ### Added — Enhanced Project Setup
@@ -49,6 +49,8 @@ const nextConfig = {
49
49
  env: {
50
50
  HELIXEVO_VERSION: getVersion(),
51
51
  },
52
+ // Silence "multiple lockfiles" warning
53
+ outputFileTracingRoot: __dirname,
52
54
  }
53
55
 
54
56
  export default nextConfig
package/dist/cli.js CHANGED
@@ -12451,7 +12451,7 @@ init_skills();
12451
12451
  init_data();
12452
12452
  var __filename = "/Users/tianchichen/Documents/GitHub/helixevo/src/commands/dashboard.ts";
12453
12453
  var HELIX_DASHBOARD_DIR = join15(homedir3(), ".helix", "dashboard");
12454
- async function dashboardCommand() {
12454
+ async function dashboardCommand(options) {
12455
12455
  const dir = prepareDashboard();
12456
12456
  if (!dir) {
12457
12457
  console.error(` Dashboard not found.
@@ -12473,6 +12473,36 @@ async function dashboardCommand() {
12473
12473
  }
12474
12474
  }
12475
12475
  ensureSkillGraph();
12476
+ if (options.background) {
12477
+ const logFile = join15(homedir3(), ".helix", "dashboard.log");
12478
+ const out = __require("fs").openSync(logFile, "a");
12479
+ const err = __require("fs").openSync(logFile, "a");
12480
+ let currentVersion = VERSION;
12481
+ try {
12482
+ currentVersion = execSync2("helixevo --version 2>/dev/null", { encoding: "utf-8" }).trim() || VERSION;
12483
+ } catch {}
12484
+ const child = spawn2("npx", ["next", "dev", "--port", "3847"], {
12485
+ cwd: dir,
12486
+ stdio: ["ignore", out, err],
12487
+ env: { ...process.env, HELIXEVO_VERSION: currentVersion },
12488
+ detached: true
12489
+ });
12490
+ child.unref();
12491
+ writeFileSync9(join15(homedir3(), ".helix", "dashboard.pid"), String(child.pid));
12492
+ console.log(` \uD83C\uDF10 HelixEvo Dashboard v${VERSION} running in background`);
12493
+ console.log(` http://localhost:3847`);
12494
+ console.log(` Logs: ${logFile}`);
12495
+ console.log(` Stop: helixevo dashboard --stop
12496
+ `);
12497
+ setTimeout(() => {
12498
+ try {
12499
+ const platform = process.platform;
12500
+ const cmd = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
12501
+ execSync2(`${cmd} http://localhost:3847`, { stdio: "ignore" });
12502
+ } catch {}
12503
+ }, 2000);
12504
+ process.exit(0);
12505
+ }
12476
12506
  console.log(` \uD83C\uDF10 Starting HelixEvo Dashboard v${VERSION} at http://localhost:3847
12477
12507
  `);
12478
12508
  launchDashboard(dir, true);
@@ -13485,6 +13515,9 @@ function printUpdateBanner(latestVersion) {
13485
13515
  }
13486
13516
 
13487
13517
  // src/cli.ts
13518
+ import { join as join20 } from "node:path";
13519
+ import { homedir as homedir5 } from "node:os";
13520
+ import { existsSync as existsSync16, readFileSync as readFileSync13, rmSync as rmSync3 } from "node:fs";
13488
13521
  var program2 = new Command;
13489
13522
  program2.name("helixevo").description("Self-evolving skill ecosystem for AI agents").version(VERSION).addHelpText("after", `
13490
13523
  Examples:
@@ -13512,7 +13545,23 @@ program2.command("generalize").description("Promote cross-skill patterns to high
13512
13545
  program2.command("specialize").description("Create project-specific skills ↓ --project <name> [--dry-run] [--verbose]").requiredOption("--project <name>", "Project name").option("--dry-run", "Show candidates without applying").option("--verbose", "Show detailed analysis").action(specializeCommand);
13513
13546
  program2.command("graph").description("Skill network [--mermaid] [--obsidian <path>] [--rebuild] [--optimize]").option("--mermaid", "Render as Mermaid diagram in browser").option("--rebuild", "Force rebuild (re-infer relationships via LLM)").option("--obsidian <path>", "Sync to Obsidian vault at path").option("--optimize", "Run network optimization (merge/split/conflict detection)").option("--verbose", "Show detailed analysis").action(graphCommand);
13514
13547
  program2.command("research").description("Proactive research via web [--project <path>] [--dry-run] [--verbose]").option("--project <path>", "Project path for goal extraction").option("--dry-run", "Show discoveries without creating skills").option("--verbose", "Show detailed research steps").option("--max-hypotheses <n>", "Max hypotheses to test", "3").action(researchCommand);
13515
- program2.command("dashboard").description("Open web dashboard at http://localhost:3847").action(dashboardCommand);
13548
+ program2.command("dashboard").description("Open web dashboard at http://localhost:3847").option("--background", "Run in background (detach from terminal)").option("--stop", "Stop a background dashboard").action(async (options) => {
13549
+ if (options.stop) {
13550
+ const pidFile = join20(homedir5(), ".helix", "dashboard.pid");
13551
+ if (existsSync16(pidFile)) {
13552
+ const pid = parseInt(readFileSync13(pidFile, "utf-8").trim());
13553
+ try {
13554
+ process.kill(pid, "SIGTERM");
13555
+ } catch {}
13556
+ rmSync3(pidFile);
13557
+ console.log(" Dashboard stopped.");
13558
+ } else {
13559
+ console.log(" No background dashboard running.");
13560
+ }
13561
+ return;
13562
+ }
13563
+ dashboardCommand(options);
13564
+ });
13516
13565
  program2.command("status").description("Show frontier, skills, failures, and network health").action(statusCommand);
13517
13566
  program2.command("report").description("Evolution report [--days <n>] [--output <path>]").option("--days <n>", "Report period in days", "1").option("--output <path>", "Output path for report").action(reportCommand);
13518
13567
  program2.command("watch").description("Always-on learning: auto-capture corrections + auto-evolve").option("--project <name>", "Project name for captured failures").option("--events <path>", "Path to events.jsonl (default: ./events.jsonl)").option("--verbose", "Show detailed capture and metrics").option("--no-evolve", "Disable auto-evolution (capture only)").action(watchCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helixevo",
3
- "version": "0.2.36",
3
+ "version": "0.2.37",
4
4
  "description": "Self-evolving skill ecosystem for AI agents. Skills and projects co-evolve through multi-judge evaluation and a Pareto frontier.",
5
5
  "type": "module",
6
6
  "bin": {