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/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, 80);
94
- assert.strictEqual(data.progressiveSkillsCount, 60);
93
+ assert.strictEqual(data.totalComponents, 84);
94
+ assert.strictEqual(data.progressiveSkillsCount, 63);
95
95
  assert.strictEqual(data.scopedAgentsCount, 13);
96
- assert.strictEqual(data.lifecycleHooksCount, 7);
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: 60/);
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, 80);
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 80 components, 60 skills, and 13 subagents in benchmark --json', () => {
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, 80, 'Total components should be 80');
475
- assert.strictEqual(data.progressiveSkillsCount, 60, 'Progressive skills should be 60');
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, 7, 'Lifecycle hooks should be 7');
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 {