helixevo 0.2.36 → 0.2.38
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 +12 -0
- package/dashboard/app/projects/client.tsx +11 -3
- package/dashboard/next.config.mjs +2 -0
- package/dist/cli.js +51 -2
- package/package.json +1 -1
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
|
|
@@ -34,7 +34,7 @@ export default function ProjectsClient({ profiles, skillCount }: { profiles: Pro
|
|
|
34
34
|
const [inputMode, setInputMode] = useState<InputMode>('local')
|
|
35
35
|
const [projectPath, setProjectPath] = useState('')
|
|
36
36
|
const [githubUrl, setGithubUrl] = useState('')
|
|
37
|
-
const [cloneDir, setCloneDir] = useState('~/
|
|
37
|
+
const [cloneDir, setCloneDir] = useState('~/HelixEvo')
|
|
38
38
|
const [setupState, setSetupState] = useState<SetupState>('idle')
|
|
39
39
|
const [output, setOutput] = useState('')
|
|
40
40
|
const outputRef = useRef<HTMLPreElement | null>(null)
|
|
@@ -222,8 +222,16 @@ export default function ProjectsClient({ profiles, skillCount }: { profiles: Pro
|
|
|
222
222
|
background: 'var(--bg-input)', color: 'var(--text)',
|
|
223
223
|
}}
|
|
224
224
|
/>
|
|
225
|
-
<div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop:
|
|
226
|
-
|
|
225
|
+
<div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 6, display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>
|
|
226
|
+
<span>Quick select:</span>
|
|
227
|
+
{['.', '~/Documents/GitHub', '~/Desktop', '~/HelixEvo', ...profiles.map(p => p.path).filter(p => !['.', '~/Documents/GitHub', '~/Desktop', '~/HelixEvo'].includes(p))].map(p => (
|
|
228
|
+
<button key={p} onClick={() => setProjectPath(p)} style={{
|
|
229
|
+
padding: '1px 8px', fontSize: 10, background: projectPath === p ? 'var(--green-light)' : 'var(--bg-section)',
|
|
230
|
+
border: `1px solid ${projectPath === p ? 'var(--green-border)' : 'var(--border-subtle)'}`,
|
|
231
|
+
borderRadius: 4, cursor: 'pointer', color: projectPath === p ? 'var(--green)' : 'var(--text-dim)',
|
|
232
|
+
fontFamily: 'var(--font-mono)',
|
|
233
|
+
}}>{p}</button>
|
|
234
|
+
))}
|
|
227
235
|
</div>
|
|
228
236
|
</div>
|
|
229
237
|
{setupState !== 'analyzing' ? (
|
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(
|
|
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