everything-gemini 2.0.0 → 2.1.0
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/CHANGELOG.md +24 -0
- package/README.md +21 -4
- package/bin/everything-gemini +565 -9
- package/docs/LAUNCH_KIT_v2.1.0.md +118 -0
- package/docs/index.html +14 -8
- package/examples/python-sdk/README.md +4 -0
- package/examples/python-sdk/harness2_recursive_loop.py +240 -0
- package/hooks/budget-guard/hooks.json +16 -0
- package/hooks/budget-guard/scripts/budget-gate.sh +57 -0
- package/package.json +1 -1
- package/scripts/harness_rollback.sh +26 -0
- package/scripts/harness_snapshot.sh +30 -0
- package/scripts/validate.sh +1 -1
- package/skills/dataproc-spark-analytics/SKILL.md +120 -0
- package/skills/google-flow-orchestrator/SKILL.md +174 -0
- package/skills/harness2-recursive-optimization/SKILL.md +240 -0
- package/tests/cli.test.js +115 -9
package/tests/cli.test.js
CHANGED
|
@@ -90,10 +90,10 @@ it('should benchmark ecosystem components and output valid JSON with --json', ()
|
|
|
90
90
|
const res = runCli('benchmark --json');
|
|
91
91
|
assert.strictEqual(res.status, 0);
|
|
92
92
|
const data = JSON.parse(res.stdout);
|
|
93
|
-
assert.strictEqual(data.totalComponents,
|
|
94
|
-
assert.strictEqual(data.progressiveSkillsCount,
|
|
93
|
+
assert.strictEqual(data.totalComponents, 84);
|
|
94
|
+
assert.strictEqual(data.progressiveSkillsCount, 63);
|
|
95
95
|
assert.strictEqual(data.scopedAgentsCount, 13);
|
|
96
|
-
assert.strictEqual(data.lifecycleHooksCount,
|
|
96
|
+
assert.strictEqual(data.lifecycleHooksCount, 8);
|
|
97
97
|
assert(data.totalRunbookTokens > 15000, 'Expected >15,000 runbook tokens');
|
|
98
98
|
assert(data.estimatedTokensSavedPerTurn > 8000, 'Expected significant token savings');
|
|
99
99
|
});
|
|
@@ -316,7 +316,7 @@ try {
|
|
|
316
316
|
const dryRes = runCli(`bundle --output "${bundleTarget}" --dry-run`);
|
|
317
317
|
assert.strictEqual(dryRes.status, 0);
|
|
318
318
|
assert.match(dryRes.stdout, /DRY RUN MODE ACTIVATED/);
|
|
319
|
-
assert.match(dryRes.stdout, /Skills to bundle:
|
|
319
|
+
assert.match(dryRes.stdout, /Skills to bundle: 63/);
|
|
320
320
|
assert.strictEqual(fs.existsSync(bundleTarget), false, 'Dry run should not create destination directory');
|
|
321
321
|
|
|
322
322
|
// JSON Dry-run mode
|
|
@@ -324,7 +324,7 @@ try {
|
|
|
324
324
|
assert.strictEqual(jsonRes.status, 0);
|
|
325
325
|
const dryData = JSON.parse(jsonRes.stdout);
|
|
326
326
|
assert.strictEqual(dryData.dryRun, true);
|
|
327
|
-
assert.strictEqual(dryData.manifest.components.totalCount,
|
|
327
|
+
assert.strictEqual(dryData.manifest.components.totalCount, 84);
|
|
328
328
|
|
|
329
329
|
// Live mode
|
|
330
330
|
const liveRes = runCli(`bundle --output "${bundleTarget}"`);
|
|
@@ -446,6 +446,63 @@ try {
|
|
|
446
446
|
assert.match(resTriton.stdout, /Triton/);
|
|
447
447
|
});
|
|
448
448
|
|
|
449
|
+
// Info for v2.1.0 Google Research Harness2 & Google Family skills
|
|
450
|
+
it('should display info for v2.1.0 Harness2, Google Flow, and Dataproc Spark skills', () => {
|
|
451
|
+
const resH2 = runCli('info harness2-recursive-optimization');
|
|
452
|
+
assert.strictEqual(resH2.status, 0);
|
|
453
|
+
assert.match(resH2.stdout, /Harness² Recursive Optimization/);
|
|
454
|
+
|
|
455
|
+
const resFlow = runCli('info google-flow-orchestrator');
|
|
456
|
+
assert.strictEqual(resFlow.status, 0);
|
|
457
|
+
assert.match(resFlow.stdout, /Google Flow Orchestrator/);
|
|
458
|
+
|
|
459
|
+
const resSpark = runCli('info dataproc-spark-analytics');
|
|
460
|
+
assert.strictEqual(resSpark.status, 0);
|
|
461
|
+
assert.match(resSpark.stdout, /Dataproc Spark Analytics/);
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
// Harness2 command and export format verification
|
|
465
|
+
it('should synthesize Google Research Harness2 workspace in dry-run, live, and JSON export modes', () => {
|
|
466
|
+
const h2Target = path.join(tempWorkspace, 'harness2-test-ws');
|
|
467
|
+
|
|
468
|
+
// Dry-run mode
|
|
469
|
+
const dryRes = runCli(`harness2 "${h2Target}" --dry-run`);
|
|
470
|
+
assert.strictEqual(dryRes.status, 0);
|
|
471
|
+
assert.match(dryRes.stdout, /DRY RUN MODE ACTIVATED/);
|
|
472
|
+
assert.match(dryRes.stdout, /Previewing Google Research Harness² Surfaces/);
|
|
473
|
+
assert.strictEqual(fs.existsSync(h2Target), false, 'Dry run should not create destination directory');
|
|
474
|
+
|
|
475
|
+
// JSON Dry-run mode
|
|
476
|
+
const jsonRes = runCli(`harness2 "${h2Target}" --dry-run --json`);
|
|
477
|
+
assert.strictEqual(jsonRes.status, 0);
|
|
478
|
+
const dryData = JSON.parse(jsonRes.stdout);
|
|
479
|
+
assert.strictEqual(dryData.dryRun, true);
|
|
480
|
+
assert.strictEqual(dryData.manifest.metrics.total_skills, 63);
|
|
481
|
+
assert.strictEqual(dryData.manifest.metrics.total_subagents, 13);
|
|
482
|
+
assert.strictEqual(dryData.manifest.metrics.total_hooks, 8);
|
|
483
|
+
|
|
484
|
+
// Live mode
|
|
485
|
+
const liveRes = runCli(`harness2 "${h2Target}"`);
|
|
486
|
+
assert.strictEqual(liveRes.status, 0);
|
|
487
|
+
assert.match(liveRes.stdout, /Google Research Harness² Workspace Synthesized Successfully/);
|
|
488
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'harness.yaml')), true);
|
|
489
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'harness.json')), true);
|
|
490
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'prompts', 'GEMINI.md')), true);
|
|
491
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'memory', 'memory_spec.json')), true);
|
|
492
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'guidance', 'tool_selection_rules.md')), true);
|
|
493
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'subagents', 'planner.md')), true);
|
|
494
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'skills', 'harness2-recursive-optimization', 'SKILL.md')), true);
|
|
495
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'scripts', 'harness_probe.sh')), true);
|
|
496
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'scripts', 'harness_snapshot.sh')), true);
|
|
497
|
+
assert.strictEqual(fs.existsSync(path.join(h2Target, 'scripts', 'harness_rollback.sh')), true);
|
|
498
|
+
|
|
499
|
+
// Export with --format harness2
|
|
500
|
+
const h2ExportTarget = path.join(tempWorkspace, 'harness2-export-ws');
|
|
501
|
+
const exportRes = runCli(`export --format harness2 --output "${h2ExportTarget}"`);
|
|
502
|
+
assert.strictEqual(exportRes.status, 0);
|
|
503
|
+
assert.strictEqual(fs.existsSync(path.join(h2ExportTarget, 'harness.yaml')), true);
|
|
504
|
+
});
|
|
505
|
+
|
|
449
506
|
// Graph command verification
|
|
450
507
|
it('should render interaction graph in terminal, mermaid, and JSON formats', () => {
|
|
451
508
|
const resTerm = runCli('graph');
|
|
@@ -467,14 +524,63 @@ try {
|
|
|
467
524
|
});
|
|
468
525
|
|
|
469
526
|
// Benchmark Components Verification
|
|
470
|
-
it('should report
|
|
527
|
+
it('should report 84 components, 63 skills, and 13 subagents in benchmark --json', () => {
|
|
471
528
|
const res = runCli('benchmark --json');
|
|
472
529
|
assert.strictEqual(res.status, 0);
|
|
473
530
|
const data = JSON.parse(res.stdout);
|
|
474
|
-
assert.strictEqual(data.totalComponents,
|
|
475
|
-
assert.strictEqual(data.progressiveSkillsCount,
|
|
531
|
+
assert.strictEqual(data.totalComponents, 84, 'Total components should be 84');
|
|
532
|
+
assert.strictEqual(data.progressiveSkillsCount, 63, 'Progressive skills should be 63');
|
|
476
533
|
assert.strictEqual(data.scopedAgentsCount, 13, 'Scoped agents should be 13');
|
|
477
|
-
assert.strictEqual(data.lifecycleHooksCount,
|
|
534
|
+
assert.strictEqual(data.lifecycleHooksCount, 8, 'Lifecycle hooks should be 8');
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
// Harness² Run & Ingest-Trace tests
|
|
538
|
+
it('should support harness2 run with local benchmark, hard spend limits, and dry-run/json modes', () => {
|
|
539
|
+
const testTasksDir = path.join(tempWorkspace, 'harness2-tasks');
|
|
540
|
+
// Dry-run mode
|
|
541
|
+
const dryRes = runCli(`harness2 run --dir "${testTasksDir}" --bench local --max-usd 15 --dry-run`);
|
|
542
|
+
assert.strictEqual(dryRes.status, 0);
|
|
543
|
+
assert.match(dryRes.stdout, /DRY RUN MODE ACTIVATED/);
|
|
544
|
+
assert.match(dryRes.stdout, /Spend Ceiling: \$15\.00 USD/);
|
|
545
|
+
|
|
546
|
+
// JSON export mode
|
|
547
|
+
const jsonRes = runCli(`harness2 run --dir "${testTasksDir}" --bench local --max-usd 25 --json`);
|
|
548
|
+
assert.strictEqual(jsonRes.status, 0);
|
|
549
|
+
const runData = JSON.parse(jsonRes.stdout);
|
|
550
|
+
assert.strictEqual(runData.engine, 'everything-gemini-harness2-runner');
|
|
551
|
+
assert.strictEqual(runData.benchmark, 'local');
|
|
552
|
+
assert.strictEqual(runData.spendGuardrail.maxSpendUsd, 25);
|
|
553
|
+
assert.strictEqual(runData.result.status, 'PASSED');
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
it('should support harness2 ingest-trace to generate automated regression probes', () => {
|
|
557
|
+
const sampleTracePath = path.join(tempWorkspace, 'production-failure.json');
|
|
558
|
+
fs.writeFileSync(sampleTracePath, JSON.stringify({
|
|
559
|
+
id: 'trace-spark-oom',
|
|
560
|
+
error: 'OutOfMemoryError: Container killed due to 16GB memory ceiling',
|
|
561
|
+
tool: 'dataproc-spark-analytics',
|
|
562
|
+
timestamp: '2026-10-19T18:00:00Z',
|
|
563
|
+
stack: 'Fatal: JVM worker heap exhausted at SparkExecutor.scala:42'
|
|
564
|
+
}, null, 2), 'utf8');
|
|
565
|
+
|
|
566
|
+
const traceOutDir = path.join(tempWorkspace, 'regression-tasks');
|
|
567
|
+
const ingestRes = runCli(`harness2 ingest-trace "${sampleTracePath}" --dir "${traceOutDir}"`);
|
|
568
|
+
assert.strictEqual(ingestRes.status, 0);
|
|
569
|
+
assert.match(ingestRes.stdout, /Production Trace Ingested into Harness² Regression Test/);
|
|
570
|
+
|
|
571
|
+
const generatedTask = path.join(traceOutDir, 'regression-trace-spark-oom.json');
|
|
572
|
+
assert.strictEqual(fs.existsSync(generatedTask), true);
|
|
573
|
+
const taskContent = JSON.parse(fs.readFileSync(generatedTask, 'utf8'));
|
|
574
|
+
assert.strictEqual(taskContent.id, 'regression-trace-spark-oom');
|
|
575
|
+
assert.strictEqual(taskContent.sourceTrace, 'production-failure.json');
|
|
576
|
+
assert.match(taskContent.errorCategory, /OutOfMemoryError/);
|
|
577
|
+
});
|
|
578
|
+
|
|
579
|
+
it('should display info for budget-guard lifecycle hook', () => {
|
|
580
|
+
const res = runCli('info budget-guard');
|
|
581
|
+
assert.strictEqual(res.status, 0);
|
|
582
|
+
assert.match(res.stdout, /budget-guard/);
|
|
583
|
+
assert.match(res.stdout, /PreToolUse/);
|
|
478
584
|
});
|
|
479
585
|
|
|
480
586
|
} finally {
|