23f7624596
ADR-166 MCP Bridge Security Lock / Static-source security lock (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / Compose default binds loopback + Mongo has auth (push) Failing after 2s
CodeQL Advanced / Analyze (rust) (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / plugin-agent-federation bindHost default (push) Failing after 1s
ADR-166 MCP Bridge Security Lock / Runtime behavior — 401 + terminal gate + fail-closed (push) Failing after 4s
business-pods-smoke / smoke (push) Failing after 1s
all-plugins-smoke / smoke-all (push) Failing after 2s
CI/CD Pipeline / Security & Code Quality (push) Failing after 1s
CI/CD Pipeline / Test Suite (ubuntu-latest) (push) Failing after 1s
CI/CD Pipeline / Build & Package (macos-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (ubuntu-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (windows-latest) (push) Has been skipped
CI/CD Pipeline / Documentation & Examples (push) Failing after 1s
Clone Tracker (14-day rolling) / Snapshot clones for ruflo ecosystem (push) Failing after 1s
CodeQL Advanced / Analyze (actions) (push) Failing after 1s
CodeQL Advanced / Analyze (javascript-typescript) (push) Failing after 1s
federation-peer-rust / stable-noop (push) Failing after 1s
metaharness-ci / score (push) Failing after 1s
metaharness-ci / router-compat (push) Failing after 0s
metaharness-ci / similarity-tests (push) Failing after 0s
no-agentbbs-smoke / smoke-without-agentbbs (push) Failing after 1s
V3 CI/CD Pipeline / Build V3 (windows-latest) (push) Has been skipped
codex-integration-audit / Codex integration audit (push) Failing after 1s
helpers-manifest-guard / guard (push) Failing after 1s
🔗 Cross-Agent Integration Tests / 🤝 Agent Coordination Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🧠 Memory Sharing Integration (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🛡️ Fault Tolerance Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / ⚡ Performance Integration Tests (push) Has been skipped
metaharness-ci / mcp-scan (push) Failing after 1s
metaharness-ci / eject-dryrun (push) Failing after 1s
metaharness-ci / metaharness-real-data (push) Failing after 0s
no-cli-optdep-bloat-2561 / guard (push) Failing after 1s
no-metaharness-smoke / smoke-without-metaharness (push) Failing after 1s
no-phantom-agentic-flow-subpath / guard (push) Failing after 1s
🔄 Automated Rollback Manager / 🚨 Failure Detection (push) Failing after 1s
V3 CI/CD Pipeline / Plugin hooks smoke / ubuntu-latest / Node 22 (push) Failing after 1s
V3 CI/CD Pipeline / ruflo-graph-intelligence build + test smoke (#2044, ADR-123) (push) Failing after 1s
CVE Audit Gate / Audit root (critical-blocking) (push) Failing after 2s
cost-tracker-smoke / smoke (push) Failing after 3s
oia-audit-weekly / audit (push) Failing after 2s
ruflo-agent-smoke / ruflo-agent structural smoke (push) Failing after 1s
📊 Status Badges Update / 📊 Update Status Badges (push) Failing after 1s
V3 CI/CD Pipeline / Static regression guards (#2267 YAML + (push) Failing after 1s
V3 CI/CD Pipeline / Test V3 Packages (push) Failing after 0s
V3 CI/CD Pipeline / agent_execute provider routing smoke (#2042) (push) Failing after 0s
CVE Audit Gate / Audit v3 (critical-blocking) (push) Failing after 1s
federation-peer-rust / stable-native (push) Failing after 2s
🔗 Cross-Agent Integration Tests / 🚀 Integration Test Setup (push) Failing after 2s
neural-trader-smoke / runtime-smoke (push) Failing after 1s
V3 CI/CD Pipeline / Build V3 (macos-latest) (push) Has been skipped
V3 CI/CD Pipeline / Build V3 (ubuntu-latest) (push) Has been skipped
V3 CI/CD Pipeline / Type Check V3 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 24 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 22 (push) Failing after 2s
V3 CI/CD Pipeline / browser rvf create flag smoke (#2015) (push) Failing after 0s
V3 CI/CD Pipeline / Dependency review (#2046) (push) Has been skipped
V3 CI/CD Pipeline / Supply-chain audit (#2046) (push) Failing after 0s
V3 CI/CD Pipeline / witness marker drift smoke (#2021) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader portfolio CG smoke (#2068, ADR-126 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader backtest signing smoke (#2068, ADR-126 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / kg-extract type-import classification smoke (#2049) (push) Failing after 0s
V3 CI/CD Pipeline / witness verify precondition smoke (#1880) (push) Failing after 2s
V3 CI/CD Pipeline / neural-trader pipeline risk-gate smoke (#2068, ADR-126 Phase 5) (push) Failing after 0s
V3 CI/CD Pipeline / neural-trader feature attribution smoke (#2068, ADR-126 Phase 6) (push) Failing after 0s
V3 CI/CD Pipeline / plugin-registry signature verification smoke (#1922, CWE-347) (push) Failing after 4s
V3 CI/CD Pipeline / memory stats legacy-DB smoke (#2120) (push) Failing after 4s
V3 CI/CD Pipeline / github deprecated actions smoke (#2089, ADR-127 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / graph query + pathfinder smoke (ADR-130 P2+P5) (push) Has been skipped
V3 CI/CD Pipeline / graph trajectory hooks smoke (ADR-130 P3) (push) Has been skipped
V3 CI/CD Pipeline / graph plugin adapter smoke (ADR-130 P4) (push) Has been skipped
V3 CI/CD Pipeline / graph benchmark (ADR-130 P6) (push) Has been skipped
V3 CI/CD Pipeline / statusline generator delegation smoke (#2195) (push) Failing after 1s
V3 CI/CD Pipeline / wizard init regression guard (#2206 (push) Failing after 1s
V3 CI/CD Pipeline / memory no-stray-db smoke (ADR-125 P7) (push) Failing after 1s
V3 CI/CD Pipeline / github-safe injection smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github actions pin smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github attribution opt-in smoke (#2089, ADR-127 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / pre-bash hook safety smoke (#2017) (push) Failing after 1s
V3 CI/CD Pipeline / Memory import smoke / ubuntu-latest (push) Failing after 0s
V3 CI/CD Pipeline / MCP protocol smoke / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / ruvllm WASM auto-init smoke (#2086) (push) Failing after 4s
V3 CI/CD Pipeline / MCP paired-tool round-trip smoke (#1889) (push) Failing after 1s
V3 CI/CD Pipeline / Plugin package install-safety (#1902/#1903/#1904) (push) Failing after 1s
V3 CI/CD Pipeline / Tool description discoverability (ADR-112) (push) Failing after 3s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (22) (push) Failing after 1s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (24) (push) Failing after 1s
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Vector-index dimension audit (#1947) (push) Failing after 0s
V3 CI/CD Pipeline / Hook-command install safety (#1921) (push) Failing after 1s
V3 CI/CD Pipeline / ToolOutputGuardrail smoke (ADR-131, (push) Failing after 1s
V3 CI/CD Pipeline / init-bundle invariants smoke (#2095, ADR-128 Phase 5) (push) Failing after 1s
V3 CI/CD Pipeline / wasm provider bridge smoke (ADR-129 P1) (push) Failing after 2s
V3 CI/CD Pipeline / wasm gallery CRUD smoke (ADR-129 P3) (push) Failing after 1s
V3 CI/CD Pipeline / wasm plugin bridge smoke (ADR-129 P4) (push) Failing after 0s
V3 CI/CD Pipeline / wasm compose smoke (ADR-129 P2) (push) Failing after 4s
V3 CI/CD Pipeline / graph schema smoke (ADR-130 P1) (push) Failing after 0s
Validate Marketplace / validate (push) Failing after 1s
🔍 Verification Pipeline / 🚀 Setup Verification (push) Failing after 1s
🔍 Verification Pipeline / 🛡️ Security Verification (push) Has been skipped
🔍 Verification Pipeline / 📝 Code Quality (push) Has been skipped
🔍 Verification Pipeline / 🧪 Test Verification (${{ matrix.os }}, Node ${{ matrix.node }}) (push) Has been skipped
🔍 Verification Pipeline / 🏗️ Build Verification (push) Has been skipped
🔍 Verification Pipeline / 📚 Documentation Verification (push) Has been skipped
CVE Audit Gate / High-severity report (warn only) (push) Has been cancelled
🔄 Automated Rollback Manager / 🔄 Execute Rollback (push) Has been cancelled
🔄 Automated Rollback Manager / ✅ Post-Rollback Verification (push) Has been cancelled
🔄 Automated Rollback Manager / 📊 Rollback Monitoring (push) Has been cancelled
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / windows-latest (push) Has been cancelled
🔄 Automated Rollback Manager / ⏳ Manual Rollback Approval (push) Has been cancelled
V3 CI/CD Pipeline / MCP protocol smoke / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Memory import smoke / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / macos-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / ubuntu-latest (push) Has been cancelled
V3 CI/CD Pipeline / Witness verify (signed manifest) / windows-latest (push) Has been cancelled
V3 CI/CD Pipeline / Publish to npm (alpha) (push) Has been cancelled
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / macos-latest / Node 22 (push) Has been cancelled
V3 CI/CD Pipeline / Plugin hooks smoke / macos-latest / Node 22 (push) Has been cancelled
CI/CD Pipeline / Deploy & Release (push) Has been cancelled
CI/CD Pipeline / CI Status (push) Has been cancelled
🔗 Cross-Agent Integration Tests / 📊 Integration Test Report (push) Has been cancelled
🔄 Automated Rollback Manager / 🔍 Pre-Rollback Validation (push) Has been cancelled
🔍 Verification Pipeline / ⚡ Performance Verification (push) Has been cancelled
🔍 Verification Pipeline / 📊 Verification Report (push) Has been cancelled
211 lines
8.0 KiB
JavaScript
211 lines
8.0 KiB
JavaScript
// _darwin.mjs — shared invocation helper for the `@metaharness/darwin` CLI.
|
||
//
|
||
// Mirrors `_harness.mjs` for the umbrella `metaharness` / `harness` binaries,
|
||
// but targets the separate darwin binary (`metaharness-darwin`) which is
|
||
// published as its own npm package (`@metaharness/darwin@~0.8.0`).
|
||
//
|
||
// Shared plumbing (degraded classification, --json injection, trailing-JSON
|
||
// parse, degraded emitter) lives in `_invoke.mjs`. What stays here is the
|
||
// genuinely-darwin part: the ASYNC STREAMING variant (`runDarwinAsync`) that
|
||
// long `evolve` runs need for per-generation progress visibility.
|
||
//
|
||
// Three subcommands surfaced (matches darwin 0.8.x — same verbs as 0.3.x,
|
||
// with GEPA-engine evolve flags added upstream: --selection modes,
|
||
// --crossover, --epistasis, --curriculum, --mutator ruvllm, --sandbox):
|
||
// - `metaharness-darwin evolve <repo> [...]` — harness self-improvement
|
||
// - `metaharness-darwin bench <create|verify> ...` — bench-suite lifecycle
|
||
// - `metaharness-darwin security bench [...]` — Darwin Shield (upstream ADR-155)
|
||
//
|
||
// CONTRACT (identical to runMetaharness/runHarness):
|
||
// - returns `{ stdout, stderr, exitCode, json|null, durationMs, degraded, reason? }`
|
||
// - `--json` is appended automatically when `opts.json !== false`
|
||
// - subprocess hard timeout (default 60s, override with opts.timeoutMs)
|
||
// - on MODULE_NOT_FOUND / network failure / "not installed", returns
|
||
// `degraded: true, reason: 'metaharness-darwin-not-available'` — never throws
|
||
// (ADR-150 graceful-degradation rule #3; ADR-153 §"Architecture" constraint 3)
|
||
//
|
||
// IMPORTANT — evolve has long timeouts:
|
||
// `evolve` is the only long-running verb in the metaharness family. A real
|
||
// evolution with --generations 10 --children 5 --concurrency 2 takes
|
||
// minutes-to-hours, NOT seconds. Callers MUST pass an explicit `timeoutMs`
|
||
// matched to their --generations × --children × sandbox cost; the 60s
|
||
// default is for `bench verify` and `security bench --population 2 --cycles 1`
|
||
// smoke shapes only.
|
||
|
||
import { spawnSync, spawn } from 'node:child_process';
|
||
import {
|
||
classifyDegraded,
|
||
importOptionalLibrary,
|
||
injectJson,
|
||
makeDegradedEmitter,
|
||
parseTrailingJson,
|
||
} from './_invoke.mjs';
|
||
|
||
const DEFAULT_TIMEOUT_MS = 60_000;
|
||
|
||
// Pinned semver range. Bump in lock-step with optionalDependencies in
|
||
// @claude-flow/cli/package.json + ruflo/package.json. The `~` allows
|
||
// patch upgrades without re-pinning.
|
||
const DARWIN_PKG = '@metaharness/darwin';
|
||
const DARWIN_PIN_VERSION = '~0.8.0';
|
||
const DARWIN_PIN = `${DARWIN_PKG}@${DARWIN_PIN_VERSION}`;
|
||
|
||
const REASON_PREFIX = 'metaharness-darwin';
|
||
|
||
function buildArgv(args, wantJson) {
|
||
// `metaharness-darwin` historically does NOT take --json on every
|
||
// subcommand (some emit plain text reports — security bench in
|
||
// particular is markdown). We still append --json for callers that
|
||
// explicitly request it, but never silently inject it on subcommands
|
||
// that don't accept it. The shape that does support --json is the
|
||
// single-verb `evolve` and `bench verify`.
|
||
return injectJson(args, wantJson);
|
||
}
|
||
|
||
// darwin's evolve emits a final JSON object at end of stdout when --json
|
||
// is passed; everything before is human-readable progress. Grab the LAST
|
||
// {...} block, not the first — the first may be a per-generation log line.
|
||
// (This last-block parse is now the family-wide shared implementation.)
|
||
const maybeParseJson = parseTrailingJson;
|
||
|
||
/**
|
||
* Sync invocation. Use for short subcommands (`bench verify`, smoke shapes).
|
||
* Async variant below for long-running `evolve` calls.
|
||
*/
|
||
export function runDarwin(args, opts = {}) {
|
||
const start = Date.now();
|
||
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
||
const wantJson = opts.json !== false;
|
||
const argv = buildArgv(args, wantJson);
|
||
const r = spawnSync('npx', ['-y', '-p', DARWIN_PIN, 'metaharness-darwin', ...argv], {
|
||
stdio: ['ignore', 'pipe', 'pipe'],
|
||
encoding: 'utf-8',
|
||
timeout: timeoutMs,
|
||
cwd: opts.cwd,
|
||
env: { ...process.env, ...(opts.env || {}) },
|
||
shell: process.platform === 'win32',
|
||
});
|
||
const durationMs = Date.now() - start;
|
||
const stdout = r.stdout || '';
|
||
const stderr = r.stderr || '';
|
||
const classified = classifyDegraded(stderr, r.status, REASON_PREFIX);
|
||
if (classified.degraded) {
|
||
return {
|
||
stdout, stderr,
|
||
exitCode: r.status ?? 127,
|
||
json: null,
|
||
durationMs,
|
||
degraded: true,
|
||
reason: classified.reason,
|
||
};
|
||
}
|
||
return {
|
||
stdout, stderr,
|
||
exitCode: r.status ?? 0,
|
||
json: wantJson ? maybeParseJson(stdout) : null,
|
||
durationMs,
|
||
degraded: false,
|
||
};
|
||
}
|
||
|
||
/**
|
||
* Async invocation with streaming. Required for `evolve` because the run
|
||
* can take 10+ minutes and the caller wants progress visibility.
|
||
*
|
||
* If `opts.onProgress(line)` is provided, called once per stderr line.
|
||
* darwin writes per-generation progress to stderr, structured result to
|
||
* stdout. Cancellable via opts.signal (AbortSignal).
|
||
*/
|
||
export function runDarwinAsync(args, opts = {}) {
|
||
return new Promise((resolve) => {
|
||
const start = Date.now();
|
||
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
||
const wantJson = opts.json !== false;
|
||
const argv = buildArgv(args, wantJson);
|
||
const p = spawn('npx', ['-y', '-p', DARWIN_PIN, 'metaharness-darwin', ...argv], {
|
||
stdio: ['ignore', 'pipe', 'pipe'],
|
||
cwd: opts.cwd,
|
||
env: { ...process.env, ...(opts.env || {}) },
|
||
shell: process.platform === 'win32',
|
||
});
|
||
let stdout = '', stderr = '', stderrBuf = '';
|
||
p.stdout?.on('data', (d) => { stdout += d.toString(); });
|
||
p.stderr?.on('data', (d) => {
|
||
const s = d.toString();
|
||
stderr += s;
|
||
if (opts.onProgress) {
|
||
stderrBuf += s;
|
||
const lines = stderrBuf.split('\n');
|
||
stderrBuf = lines.pop() ?? '';
|
||
for (const line of lines) opts.onProgress(line);
|
||
}
|
||
});
|
||
let timedOut = false;
|
||
const timer = setTimeout(() => {
|
||
timedOut = true;
|
||
try { p.kill('SIGTERM'); } catch { /* ignore */ }
|
||
}, timeoutMs);
|
||
if (opts.signal) {
|
||
opts.signal.addEventListener('abort', () => {
|
||
try { p.kill('SIGTERM'); } catch { /* ignore */ }
|
||
}, { once: true });
|
||
}
|
||
p.on('error', (e) => {
|
||
clearTimeout(timer);
|
||
resolve({
|
||
stdout,
|
||
stderr: stderr + String(e?.message ?? e),
|
||
exitCode: 127, json: null, durationMs: Date.now() - start,
|
||
degraded: true, reason: `${REASON_PREFIX}-not-available`,
|
||
});
|
||
});
|
||
p.on('close', (code) => {
|
||
clearTimeout(timer);
|
||
const durationMs = Date.now() - start;
|
||
const classified = classifyDegraded(stderr, timedOut ? null : code, REASON_PREFIX);
|
||
if (classified.degraded) {
|
||
resolve({
|
||
stdout, stderr,
|
||
exitCode: code ?? 127, json: null, durationMs,
|
||
degraded: true, reason: classified.reason,
|
||
});
|
||
return;
|
||
}
|
||
resolve({
|
||
stdout, stderr,
|
||
exitCode: code ?? 0,
|
||
json: wantJson ? maybeParseJson(stdout) : null,
|
||
durationMs,
|
||
degraded: false,
|
||
});
|
||
});
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Match the existing `emitDegradedJsonAndExit` shape used by the
|
||
* metaharness-umbrella scripts so MCP tool consumers see one contract.
|
||
* Exit 0 — ADR-150 architectural constraint: ruflo continues to function
|
||
* when MetaHarness is absent. Same posture as the umbrella scripts.
|
||
*/
|
||
export const emitDarwinDegradedJsonAndExit = makeDegradedEmitter(DARWIN_PKG, DARWIN_PIN_VERSION);
|
||
|
||
export const DARWIN_VERSION_PIN = DARWIN_PIN;
|
||
|
||
/**
|
||
* Resolver for the darwin GEPA LIBRARY entry (`@metaharness/darwin/gepa`).
|
||
* Lives here (not in gepa.mjs) because gepa.mjs is a CLI script that runs
|
||
* main() on import — this module is the import-safe home for the darwin
|
||
* pin. Used by gepa.mjs (genome/validate/render/analyze ops) and by
|
||
* evolve.mjs --diagnose (failure-class analysis of run transcripts).
|
||
* Returns the module namespace or null. Never throws on absence.
|
||
*/
|
||
export function importGepa() {
|
||
return importOptionalLibrary({
|
||
specifier: '@metaharness/darwin/gepa',
|
||
pkg: DARWIN_PKG,
|
||
pinVersion: DARWIN_PIN_VERSION,
|
||
entryRelPath: 'dist/gepa/index.js',
|
||
});
|
||
}
|