helixevo 0.2.1 → 0.2.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/dashboard/app/network/page.tsx +13 -4
- package/dashboard/app/page.tsx +2 -2
- package/dashboard/package-lock.json +5 -12
- package/dashboard/package.json +3 -5
- package/dist/cli.js +53 -11
- package/package.json +1 -1
|
@@ -3,6 +3,18 @@ import NetworkClient from './client'
|
|
|
3
3
|
|
|
4
4
|
export const dynamic = 'force-dynamic'
|
|
5
5
|
|
|
6
|
+
interface EvolutionEntry {
|
|
7
|
+
id: string
|
|
8
|
+
timestamp: string
|
|
9
|
+
action: string
|
|
10
|
+
description: string
|
|
11
|
+
outcome: string
|
|
12
|
+
outcomeReason: string
|
|
13
|
+
task: number
|
|
14
|
+
align: number
|
|
15
|
+
sideEffect: number
|
|
16
|
+
}
|
|
17
|
+
|
|
6
18
|
export default function SkillNetworkPage() {
|
|
7
19
|
const graph = loadGraph()
|
|
8
20
|
const history = loadHistory()
|
|
@@ -19,10 +31,7 @@ export default function SkillNetworkPage() {
|
|
|
19
31
|
)
|
|
20
32
|
|
|
21
33
|
// Build evolution history per skill
|
|
22
|
-
const evolutionBySkill: Record<string, {
|
|
23
|
-
id: string; timestamp: string; action: string; description: string
|
|
24
|
-
outcome: string; outcomeReason: string; task: number; align: number; sideEffect: number
|
|
25
|
-
}[]> = {}
|
|
34
|
+
const evolutionBySkill: Record<string, EvolutionEntry[]> = {}
|
|
26
35
|
for (const iter of history.iterations) {
|
|
27
36
|
for (const p of iter.proposals) {
|
|
28
37
|
if (!evolutionBySkill[p.targetSkill]) evolutionBySkill[p.targetSkill] = []
|
package/dashboard/app/page.tsx
CHANGED
|
@@ -84,8 +84,8 @@ export default function Overview() {
|
|
|
84
84
|
<div className="card">
|
|
85
85
|
<div className="card-body">
|
|
86
86
|
<div className="card-header-label">Recent Evolution</div>
|
|
87
|
-
{recent.map(iter => (
|
|
88
|
-
<div key={iter.id} style={{
|
|
87
|
+
{recent.map((iter, idx) => (
|
|
88
|
+
<div key={`${iter.id}-${idx}`} style={{
|
|
89
89
|
padding: '10px 0',
|
|
90
90
|
borderBottom: '1px solid var(--border-subtle)',
|
|
91
91
|
}}>
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
2
|
+
"name": "helix-dashboard",
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
|
-
"name": "
|
|
8
|
+
"name": "helix-dashboard",
|
|
9
9
|
"version": "0.1.0",
|
|
10
10
|
"dependencies": {
|
|
11
|
+
"@types/node": "^22.0.0",
|
|
12
|
+
"@types/react": "^19.0.0",
|
|
11
13
|
"@xyflow/react": "^12.10.1",
|
|
12
14
|
"next": "^15.3.0",
|
|
13
15
|
"react": "^19.0.0",
|
|
14
|
-
"react-dom": "^19.0.0"
|
|
15
|
-
},
|
|
16
|
-
"devDependencies": {
|
|
17
|
-
"@types/node": "^22.0.0",
|
|
18
|
-
"@types/react": "^19.0.0",
|
|
16
|
+
"react-dom": "^19.0.0",
|
|
19
17
|
"typescript": "^5.7.0"
|
|
20
18
|
}
|
|
21
19
|
},
|
|
@@ -691,7 +689,6 @@
|
|
|
691
689
|
"version": "22.19.15",
|
|
692
690
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.15.tgz",
|
|
693
691
|
"integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==",
|
|
694
|
-
"dev": true,
|
|
695
692
|
"license": "MIT",
|
|
696
693
|
"dependencies": {
|
|
697
694
|
"undici-types": "~6.21.0"
|
|
@@ -701,7 +698,6 @@
|
|
|
701
698
|
"version": "19.2.14",
|
|
702
699
|
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
|
|
703
700
|
"integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
|
|
704
|
-
"devOptional": true,
|
|
705
701
|
"license": "MIT",
|
|
706
702
|
"dependencies": {
|
|
707
703
|
"csstype": "^3.2.2"
|
|
@@ -775,7 +771,6 @@
|
|
|
775
771
|
"version": "3.2.3",
|
|
776
772
|
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
|
|
777
773
|
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
|
|
778
|
-
"devOptional": true,
|
|
779
774
|
"license": "MIT"
|
|
780
775
|
},
|
|
781
776
|
"node_modules/d3-color": {
|
|
@@ -1124,7 +1119,6 @@
|
|
|
1124
1119
|
"version": "5.9.3",
|
|
1125
1120
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
|
1126
1121
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
|
1127
|
-
"dev": true,
|
|
1128
1122
|
"license": "Apache-2.0",
|
|
1129
1123
|
"bin": {
|
|
1130
1124
|
"tsc": "bin/tsc",
|
|
@@ -1138,7 +1132,6 @@
|
|
|
1138
1132
|
"version": "6.21.0",
|
|
1139
1133
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
|
1140
1134
|
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
|
1141
|
-
"dev": true,
|
|
1142
1135
|
"license": "MIT"
|
|
1143
1136
|
},
|
|
1144
1137
|
"node_modules/use-sync-external-store": {
|
package/dashboard/package.json
CHANGED
|
@@ -8,14 +8,12 @@
|
|
|
8
8
|
"start": "next start --port 3847"
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
|
+
"@types/node": "^22.0.0",
|
|
12
|
+
"@types/react": "^19.0.0",
|
|
11
13
|
"@xyflow/react": "^12.10.1",
|
|
12
14
|
"next": "^15.3.0",
|
|
13
15
|
"react": "^19.0.0",
|
|
14
|
-
"react-dom": "^19.0.0"
|
|
15
|
-
},
|
|
16
|
-
"devDependencies": {
|
|
17
|
-
"@types/node": "^22.0.0",
|
|
18
|
-
"@types/react": "^19.0.0",
|
|
16
|
+
"react-dom": "^19.0.0",
|
|
19
17
|
"typescript": "^5.7.0"
|
|
20
18
|
}
|
|
21
19
|
}
|
package/dist/cli.js
CHANGED
|
@@ -2085,6 +2085,12 @@ function loadConfig() {
|
|
|
2085
2085
|
const raw = readFileSync(CONFIG_PATH, "utf-8");
|
|
2086
2086
|
config = { ...DEFAULT_CONFIG, ...JSON.parse(raw) };
|
|
2087
2087
|
}
|
|
2088
|
+
if (config.paths.data.includes(".skillgraph")) {
|
|
2089
|
+
config.paths.data = HELIX_DIR;
|
|
2090
|
+
}
|
|
2091
|
+
if (config.paths.generalSkills.includes(".skillgraph")) {
|
|
2092
|
+
config.paths.generalSkills = join(HELIX_DIR, "general");
|
|
2093
|
+
}
|
|
2088
2094
|
_configCache = config;
|
|
2089
2095
|
return config;
|
|
2090
2096
|
}
|
|
@@ -12306,28 +12312,31 @@ ${replay.slice(0, 800)}`
|
|
|
12306
12312
|
// src/commands/dashboard.ts
|
|
12307
12313
|
import { execSync as execSync2, spawn as spawn2 } from "node:child_process";
|
|
12308
12314
|
import { join as join14, dirname as dirname2 } from "node:path";
|
|
12309
|
-
import { existsSync as existsSync10 } from "node:fs";
|
|
12315
|
+
import { existsSync as existsSync10, cpSync as cpSync3, mkdirSync as mkdirSync4 } from "node:fs";
|
|
12310
12316
|
import { fileURLToPath } from "node:url";
|
|
12317
|
+
import { homedir as homedir3 } from "node:os";
|
|
12311
12318
|
var __filename = "/Users/tianchichen/Documents/GitHub/skillgraph/src/commands/dashboard.ts";
|
|
12319
|
+
var HELIX_DASHBOARD_DIR = join14(homedir3(), ".helix", "dashboard");
|
|
12312
12320
|
async function dashboardCommand() {
|
|
12313
|
-
const
|
|
12314
|
-
if (!
|
|
12321
|
+
const sourceDir = findDashboardSource();
|
|
12322
|
+
if (!sourceDir) {
|
|
12315
12323
|
console.error(` Dashboard not found.
|
|
12316
12324
|
`);
|
|
12317
|
-
console.error("
|
|
12318
|
-
console.error(" <npm-global>/helixevo/dashboard/");
|
|
12319
|
-
console.error("");
|
|
12320
|
-
console.error(" You can also clone and run it manually:");
|
|
12325
|
+
console.error(" You can install and run it manually:");
|
|
12321
12326
|
console.error(" git clone https://github.com/danielchen26/helixevo.git");
|
|
12322
12327
|
console.error(" cd helixevo/dashboard && npm install && npx next dev --port 3847");
|
|
12323
12328
|
process.exit(1);
|
|
12324
12329
|
}
|
|
12330
|
+
const dir = ensureWritableDashboard(sourceDir);
|
|
12325
12331
|
if (!existsSync10(join14(dir, "node_modules"))) {
|
|
12326
12332
|
console.log(" Installing dashboard dependencies...");
|
|
12327
12333
|
try {
|
|
12328
|
-
execSync2("npm ci --prefer-offline --no-audit --no-fund", { cwd: dir, stdio: "inherit" });
|
|
12329
|
-
} catch {
|
|
12330
12334
|
execSync2("npm install --no-audit --no-fund", { cwd: dir, stdio: "inherit" });
|
|
12335
|
+
} catch (err) {
|
|
12336
|
+
console.error(" Failed to install dashboard dependencies.");
|
|
12337
|
+
console.error(" Try running manually:");
|
|
12338
|
+
console.error(` cd ${dir} && npm install`);
|
|
12339
|
+
process.exit(1);
|
|
12331
12340
|
}
|
|
12332
12341
|
}
|
|
12333
12342
|
console.log(` \uD83C\uDF10 Starting Helix Dashboard at http://localhost:3847
|
|
@@ -12348,7 +12357,7 @@ async function dashboardCommand() {
|
|
|
12348
12357
|
process.exit(code ?? 0);
|
|
12349
12358
|
});
|
|
12350
12359
|
}
|
|
12351
|
-
function
|
|
12360
|
+
function findDashboardSource() {
|
|
12352
12361
|
const candidates = [];
|
|
12353
12362
|
try {
|
|
12354
12363
|
const thisFile = typeof __filename !== "undefined" ? __filename : fileURLToPath(import.meta.url);
|
|
@@ -12360,6 +12369,7 @@ function findDashboard() {
|
|
|
12360
12369
|
candidates.push(join14(globalPrefix, "lib", "node_modules", "helixevo", "dashboard"));
|
|
12361
12370
|
candidates.push(join14(globalPrefix, "node_modules", "helixevo", "dashboard"));
|
|
12362
12371
|
} catch {}
|
|
12372
|
+
candidates.push(HELIX_DASHBOARD_DIR);
|
|
12363
12373
|
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
12364
12374
|
candidates.push(join14(home, "Documents", "GitHub", "helixevo", "dashboard"));
|
|
12365
12375
|
candidates.push(join14(home, "Documents", "GitHub", "skillgraph", "dashboard"));
|
|
@@ -12371,6 +12381,38 @@ function findDashboard() {
|
|
|
12371
12381
|
}
|
|
12372
12382
|
return null;
|
|
12373
12383
|
}
|
|
12384
|
+
function ensureWritableDashboard(sourceDir) {
|
|
12385
|
+
try {
|
|
12386
|
+
const testFile = join14(sourceDir, ".write-test");
|
|
12387
|
+
__require("fs").writeFileSync(testFile, "");
|
|
12388
|
+
__require("fs").unlinkSync(testFile);
|
|
12389
|
+
return sourceDir;
|
|
12390
|
+
} catch {}
|
|
12391
|
+
const sourcePackage = join14(sourceDir, "package.json");
|
|
12392
|
+
const destPackage = join14(HELIX_DASHBOARD_DIR, "package.json");
|
|
12393
|
+
if (existsSync10(destPackage)) {
|
|
12394
|
+
const sourceMtime = __require("fs").statSync(sourcePackage).mtimeMs;
|
|
12395
|
+
const destMtime = __require("fs").statSync(destPackage).mtimeMs;
|
|
12396
|
+
if (sourceMtime <= destMtime) {
|
|
12397
|
+
return HELIX_DASHBOARD_DIR;
|
|
12398
|
+
}
|
|
12399
|
+
}
|
|
12400
|
+
console.log(" Setting up dashboard...");
|
|
12401
|
+
mkdirSync4(HELIX_DASHBOARD_DIR, { recursive: true });
|
|
12402
|
+
const items = __require("fs").readdirSync(sourceDir, { withFileTypes: true });
|
|
12403
|
+
for (const item of items) {
|
|
12404
|
+
if (item.name === "node_modules" || item.name === ".next")
|
|
12405
|
+
continue;
|
|
12406
|
+
const src = join14(sourceDir, item.name);
|
|
12407
|
+
const dest = join14(HELIX_DASHBOARD_DIR, item.name);
|
|
12408
|
+
cpSync3(src, dest, { recursive: true });
|
|
12409
|
+
}
|
|
12410
|
+
const oldModules = join14(HELIX_DASHBOARD_DIR, "node_modules");
|
|
12411
|
+
if (existsSync10(oldModules)) {
|
|
12412
|
+
__require("fs").rmSync(oldModules, { recursive: true });
|
|
12413
|
+
}
|
|
12414
|
+
return HELIX_DASHBOARD_DIR;
|
|
12415
|
+
}
|
|
12374
12416
|
|
|
12375
12417
|
// src/commands/watch.ts
|
|
12376
12418
|
import { join as join16 } from "node:path";
|
|
@@ -12865,7 +12907,7 @@ async function metricsCommand(options) {
|
|
|
12865
12907
|
|
|
12866
12908
|
// src/cli.ts
|
|
12867
12909
|
var program2 = new Command;
|
|
12868
|
-
program2.name("helixevo").description("Self-evolving skill ecosystem for AI agents").version("0.2.
|
|
12910
|
+
program2.name("helixevo").description("Self-evolving skill ecosystem for AI agents").version("0.2.2").addHelpText("after", `
|
|
12869
12911
|
Examples:
|
|
12870
12912
|
$ helixevo watch Always-on learning (auto-capture + auto-evolve)
|
|
12871
12913
|
$ helixevo watch --project myapp Watch with project context
|
package/package.json
CHANGED