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.
@@ -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] = []
@@ -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": "skillgraph-dashboard",
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": "skillgraph-dashboard",
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": {
@@ -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 dir = findDashboard();
12314
- if (!dir) {
12321
+ const sourceDir = findDashboardSource();
12322
+ if (!sourceDir) {
12315
12323
  console.error(` Dashboard not found.
12316
12324
  `);
12317
- console.error(" If installed via npm, the dashboard should be at:");
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 findDashboard() {
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.0").addHelpText("after", `
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helixevo",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
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": {