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.
@@ -19,10 +19,7 @@ export default function SkillNetworkPage() {
19
19
  )
20
20
 
21
21
  // 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
- }[]> = {}
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: Record<string, string> = {}
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
@@ -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,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 sourceDir = findDashboardSource();
12316
- if (!sourceDir) {
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 findDashboardSource() {
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 ensureWritableDashboard(sourceDir) {
12379
- try {
12380
- const testFile = join14(sourceDir, ".write-test");
12381
- __require("fs").writeFileSync(testFile, "");
12382
- __require("fs").unlinkSync(testFile);
12383
- return sourceDir;
12384
- } catch {}
12385
- const sourcePackage = join14(sourceDir, "package.json");
12386
- const destPackage = join14(HELIX_DASHBOARD_DIR, "package.json");
12387
- if (existsSync10(destPackage)) {
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 = __require("fs").readdirSync(sourceDir, { withFileTypes: true });
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
- __require("fs").rmSync(oldModules, { recursive: true });
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 statSync2 } from "node:fs";
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) ? statSync2(eventsPath).size : 0;
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 = statSync2(eventsPath).size;
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.0").addHelpText("after", `
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helixevo",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
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": {