helixevo 0.2.2 → 0.2.4
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 +2 -5
- 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 -32
- package/package.json +1 -1
|
@@ -19,10 +19,7 @@ export default function SkillNetworkPage() {
|
|
|
19
19
|
)
|
|
20
20
|
|
|
21
21
|
// Build evolution history per skill
|
|
22
|
-
const evolutionBySkill
|
|
23
|
-
id: string; timestamp: string; action: string; description: string
|
|
24
|
-
outcome: string; outcomeReason: string; task: number; align: number; sideEffect: number
|
|
25
|
-
}[]> = {}
|
|
22
|
+
const evolutionBySkill = {}
|
|
26
23
|
for (const iter of history.iterations) {
|
|
27
24
|
for (const p of iter.proposals) {
|
|
28
25
|
if (!evolutionBySkill[p.targetSkill]) evolutionBySkill[p.targetSkill] = []
|
|
@@ -36,7 +33,7 @@ export default function SkillNetworkPage() {
|
|
|
36
33
|
}
|
|
37
34
|
|
|
38
35
|
// Load skill contents
|
|
39
|
-
const skillContents
|
|
36
|
+
const skillContents = {}
|
|
40
37
|
for (const n of graph.nodes) {
|
|
41
38
|
const raw = loadSkillContent(n.id)
|
|
42
39
|
if (raw) skillContents[n.id] = raw.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/)?.[1]?.trim() ?? raw
|
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,14 +12312,14 @@ ${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, cpSync as cpSync3, mkdirSync as mkdirSync4 } from "node:fs";
|
|
12315
|
+
import { existsSync as existsSync10, cpSync as cpSync3, mkdirSync as mkdirSync4, readdirSync as readdirSync2, statSync as statSync2, rmSync as rmSync2 } from "node:fs";
|
|
12310
12316
|
import { fileURLToPath } from "node:url";
|
|
12311
12317
|
import { homedir as homedir3 } from "node:os";
|
|
12312
12318
|
var __filename = "/Users/tianchichen/Documents/GitHub/skillgraph/src/commands/dashboard.ts";
|
|
12313
12319
|
var HELIX_DASHBOARD_DIR = join14(homedir3(), ".helix", "dashboard");
|
|
12314
12320
|
async function dashboardCommand() {
|
|
12315
|
-
const
|
|
12316
|
-
if (!
|
|
12321
|
+
const dir = prepareDashboard();
|
|
12322
|
+
if (!dir) {
|
|
12317
12323
|
console.error(` Dashboard not found.
|
|
12318
12324
|
`);
|
|
12319
12325
|
console.error(" You can install and run it manually:");
|
|
@@ -12321,7 +12327,6 @@ async function dashboardCommand() {
|
|
|
12321
12327
|
console.error(" cd helixevo/dashboard && npm install && npx next dev --port 3847");
|
|
12322
12328
|
process.exit(1);
|
|
12323
12329
|
}
|
|
12324
|
-
const dir = ensureWritableDashboard(sourceDir);
|
|
12325
12330
|
if (!existsSync10(join14(dir, "node_modules"))) {
|
|
12326
12331
|
console.log(" Installing dashboard dependencies...");
|
|
12327
12332
|
try {
|
|
@@ -12351,7 +12356,33 @@ async function dashboardCommand() {
|
|
|
12351
12356
|
process.exit(code ?? 0);
|
|
12352
12357
|
});
|
|
12353
12358
|
}
|
|
12354
|
-
function
|
|
12359
|
+
function prepareDashboard() {
|
|
12360
|
+
const devDir = findDevDashboard();
|
|
12361
|
+
if (devDir)
|
|
12362
|
+
return devDir;
|
|
12363
|
+
const npmSource = findNpmDashboard();
|
|
12364
|
+
if (npmSource)
|
|
12365
|
+
return copyToHelix(npmSource);
|
|
12366
|
+
if (existsSync10(join14(HELIX_DASHBOARD_DIR, "package.json"))) {
|
|
12367
|
+
return HELIX_DASHBOARD_DIR;
|
|
12368
|
+
}
|
|
12369
|
+
return null;
|
|
12370
|
+
}
|
|
12371
|
+
function findDevDashboard() {
|
|
12372
|
+
const candidates = [
|
|
12373
|
+
join14(process.cwd(), "dashboard")
|
|
12374
|
+
];
|
|
12375
|
+
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
12376
|
+
candidates.push(join14(home, "Documents", "GitHub", "helixevo", "dashboard"));
|
|
12377
|
+
candidates.push(join14(home, "Documents", "GitHub", "skillgraph", "dashboard"));
|
|
12378
|
+
for (const dir of candidates) {
|
|
12379
|
+
if (existsSync10(join14(dir, "package.json")) && !dir.includes("node_modules")) {
|
|
12380
|
+
return dir;
|
|
12381
|
+
}
|
|
12382
|
+
}
|
|
12383
|
+
return null;
|
|
12384
|
+
}
|
|
12385
|
+
function findNpmDashboard() {
|
|
12355
12386
|
const candidates = [];
|
|
12356
12387
|
try {
|
|
12357
12388
|
const thisFile = typeof __filename !== "undefined" ? __filename : fileURLToPath(import.meta.url);
|
|
@@ -12363,11 +12394,6 @@ function findDashboardSource() {
|
|
|
12363
12394
|
candidates.push(join14(globalPrefix, "lib", "node_modules", "helixevo", "dashboard"));
|
|
12364
12395
|
candidates.push(join14(globalPrefix, "node_modules", "helixevo", "dashboard"));
|
|
12365
12396
|
} catch {}
|
|
12366
|
-
candidates.push(HELIX_DASHBOARD_DIR);
|
|
12367
|
-
const home = process.env.HOME ?? process.env.USERPROFILE ?? "";
|
|
12368
|
-
candidates.push(join14(home, "Documents", "GitHub", "helixevo", "dashboard"));
|
|
12369
|
-
candidates.push(join14(home, "Documents", "GitHub", "skillgraph", "dashboard"));
|
|
12370
|
-
candidates.push(join14(process.cwd(), "dashboard"));
|
|
12371
12397
|
for (const dir of candidates) {
|
|
12372
12398
|
if (existsSync10(join14(dir, "package.json"))) {
|
|
12373
12399
|
return dir;
|
|
@@ -12375,25 +12401,20 @@ function findDashboardSource() {
|
|
|
12375
12401
|
}
|
|
12376
12402
|
return null;
|
|
12377
12403
|
}
|
|
12378
|
-
function
|
|
12379
|
-
|
|
12380
|
-
|
|
12381
|
-
|
|
12382
|
-
|
|
12383
|
-
|
|
12384
|
-
|
|
12385
|
-
|
|
12386
|
-
|
|
12387
|
-
|
|
12388
|
-
const sourceMtime = __require("fs").statSync(sourcePackage).mtimeMs;
|
|
12389
|
-
const destMtime = __require("fs").statSync(destPackage).mtimeMs;
|
|
12390
|
-
if (sourceMtime <= destMtime) {
|
|
12391
|
-
return HELIX_DASHBOARD_DIR;
|
|
12392
|
-
}
|
|
12404
|
+
function copyToHelix(sourceDir) {
|
|
12405
|
+
const destPkg = join14(HELIX_DASHBOARD_DIR, "package.json");
|
|
12406
|
+
if (existsSync10(destPkg)) {
|
|
12407
|
+
try {
|
|
12408
|
+
const srcTime = statSync2(join14(sourceDir, "package.json")).mtimeMs;
|
|
12409
|
+
const dstTime = statSync2(destPkg).mtimeMs;
|
|
12410
|
+
if (srcTime <= dstTime) {
|
|
12411
|
+
return HELIX_DASHBOARD_DIR;
|
|
12412
|
+
}
|
|
12413
|
+
} catch {}
|
|
12393
12414
|
}
|
|
12394
|
-
console.log(" Setting up dashboard...");
|
|
12415
|
+
console.log(" Setting up dashboard at ~/.helix/dashboard...");
|
|
12395
12416
|
mkdirSync4(HELIX_DASHBOARD_DIR, { recursive: true });
|
|
12396
|
-
const items =
|
|
12417
|
+
const items = readdirSync2(sourceDir, { withFileTypes: true });
|
|
12397
12418
|
for (const item of items) {
|
|
12398
12419
|
if (item.name === "node_modules" || item.name === ".next")
|
|
12399
12420
|
continue;
|
|
@@ -12403,7 +12424,7 @@ function ensureWritableDashboard(sourceDir) {
|
|
|
12403
12424
|
}
|
|
12404
12425
|
const oldModules = join14(HELIX_DASHBOARD_DIR, "node_modules");
|
|
12405
12426
|
if (existsSync10(oldModules)) {
|
|
12406
|
-
|
|
12427
|
+
rmSync2(oldModules, { recursive: true });
|
|
12407
12428
|
}
|
|
12408
12429
|
return HELIX_DASHBOARD_DIR;
|
|
12409
12430
|
}
|
|
@@ -12415,7 +12436,7 @@ import { existsSync as existsSync13 } from "node:fs";
|
|
|
12415
12436
|
// src/core/auto-capture.ts
|
|
12416
12437
|
init_data();
|
|
12417
12438
|
init_llm();
|
|
12418
|
-
import { readFileSync as readFileSync8, existsSync as existsSync11, statSync as
|
|
12439
|
+
import { readFileSync as readFileSync8, existsSync as existsSync11, statSync as statSync3 } from "node:fs";
|
|
12419
12440
|
var CORRECTION_SIGNALS = [
|
|
12420
12441
|
/\bno[, ]+(?:that's|thats|that is)\s+(?:wrong|incorrect|not right)/i,
|
|
12421
12442
|
/\bdon'?t\s+do\s+(?:that|it\s+like\s+that)/i,
|
|
@@ -12503,14 +12524,14 @@ If no corrections found, return: { "corrections": [] }`
|
|
|
12503
12524
|
}
|
|
12504
12525
|
function watchEvents(options) {
|
|
12505
12526
|
const { eventsPath, project, onCapture, onError, pollIntervalMs = 5000 } = options;
|
|
12506
|
-
let lastSize = existsSync11(eventsPath) ?
|
|
12527
|
+
let lastSize = existsSync11(eventsPath) ? statSync3(eventsPath).size : 0;
|
|
12507
12528
|
let messageBuffer = [];
|
|
12508
12529
|
let pendingExtraction = false;
|
|
12509
12530
|
const interval = setInterval(async () => {
|
|
12510
12531
|
try {
|
|
12511
12532
|
if (!existsSync11(eventsPath))
|
|
12512
12533
|
return;
|
|
12513
|
-
const currentSize =
|
|
12534
|
+
const currentSize = statSync3(eventsPath).size;
|
|
12514
12535
|
if (currentSize <= lastSize)
|
|
12515
12536
|
return;
|
|
12516
12537
|
const content = readFileSync8(eventsPath, "utf-8");
|
|
@@ -12901,7 +12922,7 @@ async function metricsCommand(options) {
|
|
|
12901
12922
|
|
|
12902
12923
|
// src/cli.ts
|
|
12903
12924
|
var program2 = new Command;
|
|
12904
|
-
program2.name("helixevo").description("Self-evolving skill ecosystem for AI agents").version("0.2.
|
|
12925
|
+
program2.name("helixevo").description("Self-evolving skill ecosystem for AI agents").version("0.2.2").addHelpText("after", `
|
|
12905
12926
|
Examples:
|
|
12906
12927
|
$ helixevo watch Always-on learning (auto-capture + auto-evolve)
|
|
12907
12928
|
$ helixevo watch --project myapp Watch with project context
|
package/package.json
CHANGED