helixevo 0.2.5 → 0.2.7
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/README.md +4 -4
- package/dashboard/app/guide/page.tsx +55 -31
- package/dashboard/app/layout.tsx +3 -3
- package/dashboard/package.json +1 -1
- package/dist/cli.js +18 -18
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# HelixEvo
|
|
2
2
|
|
|
3
3
|
Self-evolving skill ecosystem for AI agents. Captures failures, evolves skills through multi-judge evaluation, and maintains a Pareto frontier of optimal skill configurations.
|
|
4
4
|
|
|
5
5
|
## How it works
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
HelixEvo builds on ideas from [EvoSkill](https://arxiv.org/abs/2603.02766) and [AutoResearch](https://github.com/karpathy/autoResearch) to create a three-directional evolution system:
|
|
8
8
|
|
|
9
9
|
- **Generalize ↑** — Detect cross-project patterns and promote them to abstract skills
|
|
10
10
|
- **Specialize ↓** — Create project-specific skills from domain skills + project failures
|
|
@@ -21,7 +21,7 @@ Every proposed change goes through:
|
|
|
21
21
|
- **[Bun](https://bun.sh)** — used for building (`curl -fsSL https://bun.sh/install | bash`)
|
|
22
22
|
- **[Claude CLI](https://docs.anthropic.com/en/docs/claude-code)** — installed and authenticated
|
|
23
23
|
- Requires a **Claude Max plan** subscription
|
|
24
|
-
-
|
|
24
|
+
- HelixEvo uses `claude --print` for all LLM operations (no API key needed)
|
|
25
25
|
|
|
26
26
|
Verify prerequisites:
|
|
27
27
|
```bash
|
|
@@ -160,7 +160,7 @@ cd dashboard && npm install
|
|
|
160
160
|
|
|
161
161
|
## Craft Agent Integration
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
HelixEvo includes a Craft Agent skill at `integrations/craft-agent/`:
|
|
164
164
|
|
|
165
165
|
```bash
|
|
166
166
|
# Copy to your skills directory
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import { useState } from 'react'
|
|
3
|
+
import { useState, useEffect, useRef } from 'react'
|
|
4
4
|
|
|
5
5
|
// ─── Table of Contents ──────────────────────────────────────────
|
|
6
6
|
const TOC = [
|
|
@@ -195,6 +195,30 @@ function HierarchyDiagram() {
|
|
|
195
195
|
// ─── Main Guide Page ────────────────────────────────────────────
|
|
196
196
|
export default function GuidePage() {
|
|
197
197
|
const [activeSection, setActiveSection] = useState('overview')
|
|
198
|
+
const contentRef = useRef<HTMLDivElement>(null)
|
|
199
|
+
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
const sectionIds = TOC.map(t => t.id)
|
|
202
|
+
const observer = new IntersectionObserver(
|
|
203
|
+
(entries) => {
|
|
204
|
+
// Find the most visible section
|
|
205
|
+
const visible = entries
|
|
206
|
+
.filter(e => e.isIntersecting)
|
|
207
|
+
.sort((a, b) => b.intersectionRatio - a.intersectionRatio)
|
|
208
|
+
if (visible.length > 0) {
|
|
209
|
+
setActiveSection(visible[0].target.id)
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
{ rootMargin: '-80px 0px -60% 0px', threshold: [0, 0.25, 0.5] }
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
for (const id of sectionIds) {
|
|
216
|
+
const el = document.getElementById(id)
|
|
217
|
+
if (el) observer.observe(el)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return () => observer.disconnect()
|
|
221
|
+
}, [])
|
|
198
222
|
|
|
199
223
|
return (
|
|
200
224
|
<div className="guide-layout">
|
|
@@ -202,7 +226,7 @@ export default function GuidePage() {
|
|
|
202
226
|
<nav className="guide-toc">
|
|
203
227
|
<div className="guide-toc-header">
|
|
204
228
|
<div className="guide-toc-title">Documentation</div>
|
|
205
|
-
<div className="guide-toc-version">v0.2.
|
|
229
|
+
<div className="guide-toc-version">v0.2.6</div>
|
|
206
230
|
</div>
|
|
207
231
|
{TOC.map(item => (
|
|
208
232
|
<a
|
|
@@ -222,7 +246,7 @@ export default function GuidePage() {
|
|
|
222
246
|
{/* Hero */}
|
|
223
247
|
<div className="guide-hero">
|
|
224
248
|
<div className="guide-hero-badge">Documentation</div>
|
|
225
|
-
<h1 className="guide-hero-title">
|
|
249
|
+
<h1 className="guide-hero-title">HelixEvo Guide</h1>
|
|
226
250
|
<p className="guide-hero-desc">
|
|
227
251
|
A comprehensive guide to the self-evolving skill ecosystem for AI agents.
|
|
228
252
|
Capture failures, evolve skills through multi-judge evaluation, and maintain
|
|
@@ -237,15 +261,15 @@ export default function GuidePage() {
|
|
|
237
261
|
</div>
|
|
238
262
|
|
|
239
263
|
{/* ─── Overview ─── */}
|
|
240
|
-
<Section id="overview" title="Overview" subtitle="What
|
|
264
|
+
<Section id="overview" title="Overview" subtitle="What HelixEvo does and why it exists.">
|
|
241
265
|
<p className="guide-text">
|
|
242
|
-
|
|
243
|
-
and gets corrected,
|
|
266
|
+
HelixEvo is a self-improving system that manages SKILL.md files for AI agents. When an agent makes a mistake
|
|
267
|
+
and gets corrected, HelixEvo captures that failure, clusters similar failures together, and proposes skill
|
|
244
268
|
improvements. Every proposed change goes through rigorous multi-judge evaluation and regression testing before
|
|
245
269
|
being deployed with a 3-day canary period.
|
|
246
270
|
</p>
|
|
247
271
|
<p className="guide-text">
|
|
248
|
-
Built on ideas from <strong>EvoSkill</strong> and <strong>AutoResearch</strong>,
|
|
272
|
+
Built on ideas from <strong>EvoSkill</strong> and <strong>AutoResearch</strong>, HelixEvo implements a
|
|
249
273
|
three-directional evolution model:
|
|
250
274
|
</p>
|
|
251
275
|
<div className="guide-directions">
|
|
@@ -280,9 +304,9 @@ export default function GuidePage() {
|
|
|
280
304
|
and <a href="https://docs.anthropic.com/en/docs/claude-code">Claude CLI</a> with a Claude Max plan.
|
|
281
305
|
</Callout>
|
|
282
306
|
|
|
283
|
-
<Step n={1} title="Install
|
|
307
|
+
<Step n={1} title="Install HelixEvo">
|
|
284
308
|
<Code title="Terminal">{`# From npm (recommended)
|
|
285
|
-
npm install -g
|
|
309
|
+
npm install -g helixevo
|
|
286
310
|
|
|
287
311
|
# Or from source
|
|
288
312
|
git clone https://github.com/danielchen26/helixevo.git
|
|
@@ -292,7 +316,7 @@ cd helixevo && npm install && npm run build && npm link`}</Code>
|
|
|
292
316
|
<Step n={2} title="Initialize your skill ecosystem">
|
|
293
317
|
<Code title="Terminal">{`helixevo init`}</Code>
|
|
294
318
|
<p className="guide-text-sm">
|
|
295
|
-
This scans your existing SKILL.md files (from <code>~/.agents/skills/</code>), imports them into
|
|
319
|
+
This scans your existing SKILL.md files (from <code>~/.agents/skills/</code>), imports them into HelixEvo,
|
|
296
320
|
and generates golden test cases for each skill. It also creates the data directory at <code>~/.helix/</code>.
|
|
297
321
|
</p>
|
|
298
322
|
</Step>
|
|
@@ -326,7 +350,7 @@ helixevo status`}</Code>
|
|
|
326
350
|
</Section>
|
|
327
351
|
|
|
328
352
|
{/* ─── Commands ─── */}
|
|
329
|
-
<Section id="commands" title="Commands" subtitle="Complete CLI reference for every
|
|
353
|
+
<Section id="commands" title="Commands" subtitle="Complete CLI reference for every HelixEvo command.">
|
|
330
354
|
<div className="guide-command-grid">
|
|
331
355
|
{[
|
|
332
356
|
{
|
|
@@ -336,7 +360,7 @@ helixevo status`}</Code>
|
|
|
336
360
|
},
|
|
337
361
|
{
|
|
338
362
|
cmd: 'helixevo metrics',
|
|
339
|
-
desc: 'Show correction rates per skill, trends over time, and whether each evolution actually reduced corrections. The proof that
|
|
363
|
+
desc: 'Show correction rates per skill, trends over time, and whether each evolution actually reduced corrections. The proof that HelixEvo works.',
|
|
340
364
|
flags: ['--verbose'],
|
|
341
365
|
},
|
|
342
366
|
{
|
|
@@ -346,7 +370,7 @@ helixevo status`}</Code>
|
|
|
346
370
|
},
|
|
347
371
|
{
|
|
348
372
|
cmd: 'helixevo init',
|
|
349
|
-
desc: 'Import existing skills and generate golden test cases. Scans ~/.agents/skills/ and creates the
|
|
373
|
+
desc: 'Import existing skills and generate golden test cases. Scans ~/.agents/skills/ and creates the HelixEvo data directory.',
|
|
350
374
|
flags: ['--verbose'],
|
|
351
375
|
},
|
|
352
376
|
{
|
|
@@ -431,7 +455,7 @@ helixevo status`}</Code>
|
|
|
431
455
|
</Section>
|
|
432
456
|
|
|
433
457
|
{/* ─── Always-On Learning ─── */}
|
|
434
|
-
<Section id="watch" title="Always-On Learning" subtitle="
|
|
458
|
+
<Section id="watch" title="Always-On Learning" subtitle="HelixEvo watches your work, captures corrections automatically, and evolves without manual intervention.">
|
|
435
459
|
<p className="guide-text">
|
|
436
460
|
Instead of manually running <code>helixevo capture</code> after each session, <code>helixevo watch</code> runs
|
|
437
461
|
continuously in the background. It monitors your conversation events in real-time, detects when you
|
|
@@ -477,7 +501,7 @@ helixevo watch --events path/to/events.jsonl --verbose`}</Code>
|
|
|
477
501
|
{/* ─── Network Health ─── */}
|
|
478
502
|
<Section id="networkhealth" title="Network Health" subtitle="The skill network is a co-evolving organism — its health determines project success.">
|
|
479
503
|
<p className="guide-text">
|
|
480
|
-
Individual skill evolution is only part of the picture.
|
|
504
|
+
Individual skill evolution is only part of the picture. HelixEvo now treats the <strong>entire skill network</strong> as
|
|
481
505
|
a first-class entity that co-evolves with your projects. Network health is assessed across 4 dimensions after
|
|
482
506
|
every evolution cycle.
|
|
483
507
|
</p>
|
|
@@ -509,9 +533,9 @@ helixevo watch --events path/to/events.jsonl --verbose`}</Code>
|
|
|
509
533
|
</Section>
|
|
510
534
|
|
|
511
535
|
{/* ─── Auto-Generalization ─── */}
|
|
512
|
-
<Section id="autogen" title="Auto-Generalization" subtitle="When patterns recur across projects,
|
|
536
|
+
<Section id="autogen" title="Auto-Generalization" subtitle="When patterns recur across projects, HelixEvo automatically creates abstract domain-level skills.">
|
|
513
537
|
<p className="guide-text">
|
|
514
|
-
Instead of waiting for you to run <code>helixevo generalize</code>,
|
|
538
|
+
Instead of waiting for you to run <code>helixevo generalize</code>, HelixEvo now detects cross-project patterns
|
|
515
539
|
automatically during every evolution cycle. When the same type of correction appears in 2+ projects, it
|
|
516
540
|
creates an abstract domain-level skill and sets up parent/child inheritance.
|
|
517
541
|
</p>
|
|
@@ -530,9 +554,9 @@ Project B: "Use FlashList not FlatList" (React Native perf)
|
|
|
530
554
|
</Section>
|
|
531
555
|
|
|
532
556
|
{/* ─── Closed-Loop Metrics ─── */}
|
|
533
|
-
<Section id="metrics" title="Closed-Loop Metrics" subtitle="Proving that
|
|
557
|
+
<Section id="metrics" title="Closed-Loop Metrics" subtitle="Proving that HelixEvo actually makes the agent better — with data, not just LLM scores.">
|
|
534
558
|
<p className="guide-text">
|
|
535
|
-
The <code>helixevo metrics</code> command answers the most important question: <strong>“Is
|
|
559
|
+
The <code>helixevo metrics</code> command answers the most important question: <strong>“Is HelixEvo actually
|
|
536
560
|
reducing corrections?”</strong> It tracks correction rates per skill over time and measures the real
|
|
537
561
|
impact of each evolution.
|
|
538
562
|
</p>
|
|
@@ -685,7 +709,7 @@ Project B: "Use FlashList not FlatList" (React Native perf)
|
|
|
685
709
|
|
|
686
710
|
<h3 className="guide-h3">Cross-Skill Regression</h3>
|
|
687
711
|
<p className="guide-text">
|
|
688
|
-
When skill A is modified,
|
|
712
|
+
When skill A is modified, HelixEvo also tests golden cases from co-evolved, dependent, and enhancing
|
|
689
713
|
partner skills. This catches silent incompatibilities where changing one skill breaks a related skill's behavior.
|
|
690
714
|
</p>
|
|
691
715
|
<Code title="How it works">{`Skill A evolves
|
|
@@ -888,9 +912,9 @@ generation: 3
|
|
|
888
912
|
</Section>
|
|
889
913
|
|
|
890
914
|
{/* ─── Craft Agent Integration ─── */}
|
|
891
|
-
<Section id="craft" title="Craft Agent Integration" subtitle="Use
|
|
915
|
+
<Section id="craft" title="Craft Agent Integration" subtitle="Use HelixEvo from within Craft Agent.">
|
|
892
916
|
<p className="guide-text">
|
|
893
|
-
|
|
917
|
+
HelixEvo ships with a Craft Agent skill at <code>integrations/craft-agent/</code>.
|
|
894
918
|
Install it to trigger evolution directly from your Craft Agent sessions.
|
|
895
919
|
</p>
|
|
896
920
|
<Step n={1} title="Copy the skill">
|
|
@@ -911,26 +935,26 @@ generation: 3
|
|
|
911
935
|
By default, 5 unresolved failures are required (<code>minFailuresForEvolution</code>).
|
|
912
936
|
This ensures enough signal for meaningful pattern detection.
|
|
913
937
|
</FAQItem>
|
|
914
|
-
<FAQItem q="What LLM model does
|
|
915
|
-
|
|
938
|
+
<FAQItem q="What LLM model does HelixEvo use?">
|
|
939
|
+
HelixEvo uses <code>claude --print</code> with configurable models (default: <code>sonnet</code>).
|
|
916
940
|
No API key is needed — it requires a Claude Max plan subscription. Judges and proposals can use different models.
|
|
917
941
|
</FAQItem>
|
|
918
|
-
<FAQItem q="Can I use
|
|
919
|
-
Yes.
|
|
920
|
-
files can benefit from
|
|
942
|
+
<FAQItem q="Can I use HelixEvo with other AI agents?">
|
|
943
|
+
Yes. HelixEvo manages standard SKILL.md files with YAML frontmatter. Any agent that reads SKILL.md
|
|
944
|
+
files can benefit from HelixEvo's evolution pipeline.
|
|
921
945
|
</FAQItem>
|
|
922
946
|
<FAQItem q="What happens during canary rollback?">
|
|
923
947
|
If the failure rate for a canary skill exceeds <code>autoRollbackThreshold</code> (default: 1.5x),
|
|
924
948
|
the skill is automatically reverted from the backup. The failed evolution is recorded in history.
|
|
925
949
|
</FAQItem>
|
|
926
950
|
<FAQItem q="How does cross-skill regression work?">
|
|
927
|
-
When Skill A evolves,
|
|
951
|
+
When Skill A evolves, HelixEvo checks the skill graph for co-evolved, dependent, and enhancing
|
|
928
952
|
partners. It tests their golden cases against Skill A's changes. If partner pass rate drops below 95%,
|
|
929
953
|
the proposal is rejected.
|
|
930
954
|
</FAQItem>
|
|
931
955
|
<FAQItem q="How does the knowledge buffer work?">
|
|
932
956
|
All research discoveries are saved, even if the resulting hypothesis fails. Failed experiments above
|
|
933
|
-
a minimum score are saved as drafts. When the same hypothesis appears again,
|
|
957
|
+
a minimum score are saved as drafts. When the same hypothesis appears again, HelixEvo iterates on
|
|
934
958
|
the draft rather than starting from scratch.
|
|
935
959
|
</FAQItem>
|
|
936
960
|
<FAQItem q="How does helixevo watch detect corrections?">
|
|
@@ -938,7 +962,7 @@ generation: 3
|
|
|
938
962
|
(e.g., "wrong", "not like that", "不对", "改成"). (2) If a signal is detected, an LLM analyzes
|
|
939
963
|
the recent conversation window to extract structured failure records with confidence scores (>0.7 required).
|
|
940
964
|
</FAQItem>
|
|
941
|
-
<FAQItem q="How do I prove
|
|
965
|
+
<FAQItem q="How do I prove HelixEvo is working?">
|
|
942
966
|
Run <code>helixevo metrics</code>. It tracks correction rates per skill over 7-day rolling windows
|
|
943
967
|
and compares before/after rates for each evolution. The verdict shows how many evolutions actually
|
|
944
968
|
reduced corrections. This is closed-loop measurement — not LLM scores judging LLM output.
|
|
@@ -958,7 +982,7 @@ generation: 3
|
|
|
958
982
|
{/* Footer */}
|
|
959
983
|
<div className="guide-footer">
|
|
960
984
|
<div className="guide-footer-content">
|
|
961
|
-
<div style={{ fontSize: 13, fontWeight: 600 }}>
|
|
985
|
+
<div style={{ fontSize: 13, fontWeight: 600 }}>HelixEvo v0.2.6</div>
|
|
962
986
|
<div style={{ fontSize: 12, color: 'var(--text-dim)', marginTop: 4 }}>
|
|
963
987
|
Self-evolving skill ecosystem for AI agents · MIT License
|
|
964
988
|
</div>
|
package/dashboard/app/layout.tsx
CHANGED
|
@@ -3,8 +3,8 @@ import type { Metadata } from 'next'
|
|
|
3
3
|
import Link from 'next/link'
|
|
4
4
|
|
|
5
5
|
export const metadata: Metadata = {
|
|
6
|
-
title: '
|
|
7
|
-
description: 'Self-evolving skill ecosystem for AI agents',
|
|
6
|
+
title: 'HelixEvo',
|
|
7
|
+
description: 'HelixEvo — Self-evolving skill ecosystem for AI agents',
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
const NAV = [
|
|
@@ -40,7 +40,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
|
|
40
40
|
</svg>
|
|
41
41
|
</div>
|
|
42
42
|
<div>
|
|
43
|
-
<div style={{ fontSize: 14, fontWeight: 700, color: 'var(--text)', letterSpacing: -0.3 }}>
|
|
43
|
+
<div style={{ fontSize: 14, fontWeight: 700, color: 'var(--text)', letterSpacing: -0.3 }}>HelixEvo</div>
|
|
44
44
|
<div style={{ fontSize: 10, color: 'var(--text-muted)', letterSpacing: 0.2 }}>Co-evolving AI Skills</div>
|
|
45
45
|
</div>
|
|
46
46
|
</div>
|
package/dashboard/package.json
CHANGED
package/dist/cli.js
CHANGED
|
@@ -9604,7 +9604,7 @@ Return JSON:
|
|
|
9604
9604
|
|
|
9605
9605
|
// src/commands/init.ts
|
|
9606
9606
|
async function initCommand(options) {
|
|
9607
|
-
console.log(`\uD83E\uDDEC Initializing
|
|
9607
|
+
console.log(`\uD83E\uDDEC Initializing HelixEvo...
|
|
9608
9608
|
`);
|
|
9609
9609
|
const sgDir = getHelixDir();
|
|
9610
9610
|
const generalDir = getGeneralSkillsPath();
|
|
@@ -9680,7 +9680,7 @@ async function initCommand(options) {
|
|
|
9680
9680
|
}
|
|
9681
9681
|
}
|
|
9682
9682
|
console.log(`
|
|
9683
|
-
✓
|
|
9683
|
+
✓ HelixEvo initialized!`);
|
|
9684
9684
|
console.log(` Data: ${sgDir}`);
|
|
9685
9685
|
console.log(` Skills: ${generalDir}`);
|
|
9686
9686
|
console.log(`
|
|
@@ -10350,7 +10350,7 @@ async function evolveCommand(options) {
|
|
|
10350
10350
|
const dryRun = options.dryRun ?? false;
|
|
10351
10351
|
const verbose = options.verbose ?? false;
|
|
10352
10352
|
const maxProposals = parseInt(options.maxProposals ?? String(config.evolution.maxProposalsPerRun));
|
|
10353
|
-
console.log(`\uD83E\uDDEC
|
|
10353
|
+
console.log(`\uD83E\uDDEC HelixEvo Evolution Cycle
|
|
10354
10354
|
`);
|
|
10355
10355
|
const allFailures = loadFailures();
|
|
10356
10356
|
const failures = allFailures.filter((f) => !f.resolved);
|
|
@@ -10706,7 +10706,7 @@ async function statusCommand() {
|
|
|
10706
10706
|
const goldenCases = loadGoldenCases();
|
|
10707
10707
|
const stagnation = getStagnationCount();
|
|
10708
10708
|
const recentIter = getRecentIterations(7);
|
|
10709
|
-
console.log(`\uD83E\uDDEC
|
|
10709
|
+
console.log(`\uD83E\uDDEC HelixEvo Status
|
|
10710
10710
|
`);
|
|
10711
10711
|
console.log(` Skills: ${skills.length}`);
|
|
10712
10712
|
for (const s of skills) {
|
|
@@ -10767,7 +10767,7 @@ async function reportCommand(options) {
|
|
|
10767
10767
|
const accepted = allProposals.filter((p) => p.outcome === "accepted");
|
|
10768
10768
|
const rejected = allProposals.filter((p) => p.outcome === "rejected");
|
|
10769
10769
|
const date = new Date().toISOString().slice(0, 10);
|
|
10770
|
-
let report = `#
|
|
10770
|
+
let report = `# HelixEvo Report — ${date}
|
|
10771
10771
|
|
|
10772
10772
|
`;
|
|
10773
10773
|
report += `## Overview
|
|
@@ -10851,7 +10851,7 @@ async function generalizeCommand(options) {
|
|
|
10851
10851
|
const verbose = options.verbose ?? false;
|
|
10852
10852
|
const dryRun = options.dryRun ?? false;
|
|
10853
10853
|
const skills = loadAllGeneralSkills();
|
|
10854
|
-
console.log(`\uD83D\uDD2C
|
|
10854
|
+
console.log(`\uD83D\uDD2C HelixEvo Generalization Analysis
|
|
10855
10855
|
`);
|
|
10856
10856
|
if (skills.length < 2) {
|
|
10857
10857
|
console.log(" Need at least 2 skills to detect generalization candidates.");
|
|
@@ -11026,7 +11026,7 @@ async function specializeCommand(options) {
|
|
|
11026
11026
|
console.error(" Error: --project <name> is required");
|
|
11027
11027
|
process.exit(1);
|
|
11028
11028
|
}
|
|
11029
|
-
console.log(`\uD83C\uDFAF
|
|
11029
|
+
console.log(`\uD83C\uDFAF HelixEvo Specialization for project "${projectName}"
|
|
11030
11030
|
`);
|
|
11031
11031
|
const failures = loadFailures().filter((f) => f.project === projectName && !f.resolved);
|
|
11032
11032
|
const skills = loadAllGeneralSkills();
|
|
@@ -11556,7 +11556,7 @@ function syncToObsidian(vaultPath, verbose = false) {
|
|
|
11556
11556
|
console.log(` ✓ ${node.id}.md`);
|
|
11557
11557
|
}
|
|
11558
11558
|
const indexNote = generateIndexNote(graph);
|
|
11559
|
-
writeFileSync7(join11(vaultPath, "
|
|
11559
|
+
writeFileSync7(join11(vaultPath, "HelixEvo Index.md"), indexNote);
|
|
11560
11560
|
const recent = getRecentIterations(7);
|
|
11561
11561
|
if (recent.length > 0) {
|
|
11562
11562
|
const report = generateEvolutionReport(recent);
|
|
@@ -11633,7 +11633,7 @@ ${skill.content.slice(0, 3000)}
|
|
|
11633
11633
|
return note;
|
|
11634
11634
|
}
|
|
11635
11635
|
function generateIndexNote(graph) {
|
|
11636
|
-
let note = `#
|
|
11636
|
+
let note = `# HelixEvo Index
|
|
11637
11637
|
|
|
11638
11638
|
`;
|
|
11639
11639
|
note += `*Updated: ${graph.updated}*
|
|
@@ -11744,7 +11744,7 @@ function openMermaidInBrowser(graph) {
|
|
|
11744
11744
|
const html = `<!DOCTYPE html>
|
|
11745
11745
|
<html><head>
|
|
11746
11746
|
<meta charset="utf-8">
|
|
11747
|
-
<title>
|
|
11747
|
+
<title>HelixEvo Network</title>
|
|
11748
11748
|
<style>
|
|
11749
11749
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
11750
11750
|
body {
|
|
@@ -11850,7 +11850,7 @@ function openMermaidInBrowser(graph) {
|
|
|
11850
11850
|
</head><body>
|
|
11851
11851
|
|
|
11852
11852
|
<div class="header">
|
|
11853
|
-
<h1>
|
|
11853
|
+
<h1>HelixEvo Network</h1>
|
|
11854
11854
|
<div class="stats">${graph.nodes.length} skills · ${graph.edges.length} relationships · ${graph.clusters.length} clusters</div>
|
|
11855
11855
|
</div>
|
|
11856
11856
|
|
|
@@ -11928,7 +11928,7 @@ ${mermaidCode}
|
|
|
11928
11928
|
function renderTerminalGraph(graph) {
|
|
11929
11929
|
const w = Math.min(process.stdout.columns || 80, 100);
|
|
11930
11930
|
console.log();
|
|
11931
|
-
console.log(`${C.bold} \uD83D\uDD78️
|
|
11931
|
+
console.log(`${C.bold} \uD83D\uDD78️ HelixEvo Network${C.reset}`);
|
|
11932
11932
|
console.log(` ${C.dim}${graph.nodes.length} skills · ${graph.edges.length} relationships · ${graph.clusters.length} clusters${C.reset}`);
|
|
11933
11933
|
console.log();
|
|
11934
11934
|
const layers = [
|
|
@@ -11991,7 +11991,7 @@ async function researchCommand(options) {
|
|
|
11991
11991
|
const verbose = options.verbose ?? false;
|
|
11992
11992
|
const dryRun = options.dryRun ?? false;
|
|
11993
11993
|
const maxHypotheses = parseInt(options.maxHypotheses ?? "3");
|
|
11994
|
-
console.log(`\uD83D\uDD2C
|
|
11994
|
+
console.log(`\uD83D\uDD2C HelixEvo Proactive Research
|
|
11995
11995
|
`);
|
|
11996
11996
|
const skills = loadAllGeneralSkills();
|
|
11997
11997
|
console.log(" Step 1: Understanding project goals...");
|
|
@@ -12338,7 +12338,7 @@ async function dashboardCommand() {
|
|
|
12338
12338
|
process.exit(1);
|
|
12339
12339
|
}
|
|
12340
12340
|
}
|
|
12341
|
-
console.log(` \uD83C\uDF10 Starting
|
|
12341
|
+
console.log(` \uD83C\uDF10 Starting HelixEvo Dashboard at http://localhost:3847
|
|
12342
12342
|
`);
|
|
12343
12343
|
const child = spawn2("npx", ["next", "dev", "--port", "3847"], {
|
|
12344
12344
|
cwd: dir,
|
|
@@ -12769,7 +12769,7 @@ async function watchCommand(options) {
|
|
|
12769
12769
|
const autoEvolve = options.evolve !== false;
|
|
12770
12770
|
const project = options.project ?? null;
|
|
12771
12771
|
const eventsPath = options.events ?? join16(process.cwd(), "events.jsonl");
|
|
12772
|
-
console.log(`\uD83E\uDDEC
|
|
12772
|
+
console.log(`\uD83E\uDDEC HelixEvo Watch Mode — Always-On Learning
|
|
12773
12773
|
`);
|
|
12774
12774
|
console.log(` Events: ${eventsPath}`);
|
|
12775
12775
|
console.log(` Project: ${project ?? "(auto-detect)"}`);
|
|
@@ -12870,7 +12870,7 @@ async function watchCommand(options) {
|
|
|
12870
12870
|
async function metricsCommand(options) {
|
|
12871
12871
|
const verbose = options.verbose ?? false;
|
|
12872
12872
|
const summary = getMetricsSummary();
|
|
12873
|
-
console.log(`\uD83D\uDCCA
|
|
12873
|
+
console.log(`\uD83D\uDCCA HelixEvo Metrics
|
|
12874
12874
|
`);
|
|
12875
12875
|
console.log(" ── Correction Rate ──");
|
|
12876
12876
|
console.log(` Total failures: ${summary.totalFailures}`);
|
|
@@ -12914,7 +12914,7 @@ async function metricsCommand(options) {
|
|
|
12914
12914
|
console.log(` ${effective}/${total} evolutions reduced corrections`);
|
|
12915
12915
|
console.log(` ${regressed}/${total} evolutions increased corrections`);
|
|
12916
12916
|
if (effective > regressed) {
|
|
12917
|
-
console.log(" ✓
|
|
12917
|
+
console.log(" ✓ HelixEvo is making the agent better");
|
|
12918
12918
|
} else if (effective === 0 && total > 0) {
|
|
12919
12919
|
console.log(" ⚠ Not enough data yet — keep working");
|
|
12920
12920
|
}
|
|
@@ -12924,7 +12924,7 @@ async function metricsCommand(options) {
|
|
|
12924
12924
|
|
|
12925
12925
|
// src/cli.ts
|
|
12926
12926
|
var program2 = new Command;
|
|
12927
|
-
program2.name("helixevo").description("Self-evolving skill ecosystem for AI agents").version("0.2.
|
|
12927
|
+
program2.name("helixevo").description("Self-evolving skill ecosystem for AI agents").version("0.2.7").addHelpText("after", `
|
|
12928
12928
|
Examples:
|
|
12929
12929
|
$ helixevo watch Always-on learning (auto-capture + auto-evolve)
|
|
12930
12930
|
$ 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.
|
|
3
|
+
"version": "0.2.7",
|
|
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": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"claude",
|
|
41
41
|
"claude-code",
|
|
42
42
|
"helixevo",
|
|
43
|
-
"
|
|
43
|
+
"helixevo",
|
|
44
44
|
"co-evolution",
|
|
45
45
|
"pareto-frontier",
|
|
46
46
|
"llm"
|